ようへいの日々精進XP

よかろうもん

CodeBuild で PHPUnit を実行したかったので PHP のコンテナイメージを作って公開した

諸般の事情で

CodeBuild 用の PHP イメージを作って公開してみた。このコンテナイメージを利用して PHPUnit を実行する予定。

作ったもの

github.com

デモ

ビルド

build.sh を修正

ECR のリポジトリを指定する。

#!/usr/bin/env bash

DOCKER_CONTENT_TRUST=1

eval $(aws ecr get-login --no-include-email --region ap-northeast-1)

docker build -t codebuild-php .
docker tag codebuild-php:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/codebuild-php:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/codebuild-php:latest

ビルド

./build.sh

実行すると ECR にコンテナイメージがプッシュされる。

とりあえず手元の環境で

docker run

cd sample
docker run -t -i -v $(pwd):/opt/codebuild codebuild-php /bin/bash

PHPUnit 実行

root@2d2e13594b64:/# cd /opt/codebuild
root@2d2e13594b64:/opt/codebuild# ./run_test.sh
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 1.92 seconds, Memory: 12.00MB

OK (3 tests, 3 assertions)

ちなみに run_test.sh の中身は以下の通り。

#!/usr/bin/env bash

php phpunit.phar --bootstrap src/Email.php tests/EmailTest --log-junit post_build/result.xml

テストコードはこちらより拝借。

CodeBuild では…

イメージの指定

下図のように指定することで、ECR に push したコンテナイメージを利用することが出来る。

f:id:inokara:20170917191039p:plain

実行結果

f:id:inokara:20170917190156p:plain

buildspec.yml とかは sample 以下のファイルを確認されたし。

以上

メモでした。

だいぶん、色々と端折ってごめんくさい。

俺の郷 〜 尾崎亜美、鈴木亜美、時東ぁみもみんな一緒に EC2 AMI を作成、削除するツールを作ってリリースした 〜

オリビアを聴きながら

リリースした。

github.com

AMI を管理する時の個人的な課題

  • AMI に紐付いた Snapshot を忘れてしまう(特に AMI を削除する場合)
  • マネジメントコンソールからの作成が面倒でしかも CLI がサクッと出てこない

ということで amiCtrl を作ってみた

Be Together(導入)

wget とかでバイナリを取得する。

wget https://github.com/inokappa/amiCtrl/releases/download/v0.0.1/amiCtrl_darwin_amd64 \
  -O ${HOME}/bin/amiCtrl
chmod 755 ${HOME}/bin/amiCtrl

ヘルプ

$ ${HOME}/bin/amiCtrl -h
Usage of /path/to/bin/amiCtrl:
  -ami string
        AMI ID を指定.
  -create
        タグをインスタンスに付与.
  -delete
        タグをインスタンスから削除.
  -describe
        タグを詳細を確認.
  -endpoint string
        AWS API のエンドポイントを指定.
  -instance string
        Instance ID を指定.
  -name string
        AMI Name を指定.
  -noreboot
        No Reboot オプションを指定. (default true)
  -profile string
        Profile 名を指定.
  -region string
        Region 名を指定. (default "ap-northeast-1")

AMI 作成

./amiCtrl -instance=i-xxxxxxxxxxxxxxxxx -name=suzuki-ami-desu -create

以下のように出力される。

+-----------------+--------------+--------------------------------+
|    AMI NAME     |    AMI ID    |          SNAPSHOT ID           |
+-----------------+--------------+--------------------------------+
| suzuki-ami-desu | ami-1234567x | snap-123456789a1234567         |
|                 |              | snap-123456789b1234567         |
+-----------------+--------------+--------------------------------+

AMI を確認

./amiCtrl -instance=i-xxxxxxxxxxxxxxxxx -ami=ami-12345678

以下のように出力されるので、悩みどころだった AMI と Snapshot の関連付けについてもいい感じで確認出来る(個人的に)。

+-----------------+--------------+--------------------------------+
|    AMI NAME     |    AMI ID    |          SNAPSHOT ID           |
+-----------------+--------------+--------------------------------+
| suzuki-ami-desu | ami-1234567x | snap-123456789a1234567         |
|                 |              | snap-123456789b1234567         |
+-----------------+--------------+--------------------------------+

AMI に関連した SNAPSHOT ID まで確認することが出来る。

AMI を削除

./amiCtrl -instance=i-xxxxxxxxxxxxxxxxx -ami=ami-12345678 -delete

以下のように出力される。

+-----------------+--------------+--------------------------------+
|    AMI NAME     |    AMI ID    |          SNAPSHOT ID           |
+-----------------+--------------+--------------------------------+
| suzuki-ami-desu | ami-1234567x | snap-123456789a1234567         |
|                 |              | snap-123456789b1234567         |
+-----------------+--------------+--------------------------------+
上記の AMI を削除しますか?(y/n): y
AMI を削除します...
AMI を削除しました.

終わり

Describe Image して Snapshot の ID が取れることを知らなかったので…

今まで全く知らなかったこと。(知ったかぶりしていたこと。)

Describe Image の内容に Snapshot ID が含まれていたこと。

{
    "Images": [
        {
...
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-1234567890abcdef0",
                        "VolumeSize": 8,
                        "VolumeType": "standard"
                    }
                }
            ],
...
        }
    ]
}

知らなかったので、AMI と Snapshot の関連付けを確認する為に、以下のように Describe Snapshot の Description に含まれる AMI ID を利用していた。

{
    "Snapshots": [
        {
            "Description": "Created by CreateImage(i-xxxxxxxxxxxxxxxxx) for ami-1234567x from vol-xxxxxxxxxxxxxxxxx",
...
        }
    ]
}

docs.aws.amazon.com

API ドキュメントを見ると、以下のようにレスポンスに Snapshot ID が含まれているので

<DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
  <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId> 
  <imagesSet>
    <item>
...
      <blockDeviceMapping>
        <item>
          <deviceName>/dev/sda1</deviceName>
          <ebs>
            <snapshotId>snap-1234567890abcdef0</snapshotId>
            <volumeSize>15</volumeSize>
            <deleteOnTermination>false</deleteOnTermination>
            <volumeType>standard</volumeType>
          </ebs>
        </item>
      </blockDeviceMapping>
...
  </imagesSet>
</DescribeImagesResponse>

ずっと昔から Describe Image だけで Snapshot ID を確認することが出来ていたのかもしれない。

gox を初めて使った

github.com

以下のように実行するだけでクロスコンパイルがサクッと出来てしまって泣いた。

gox -output "pkg/amiCtrl_{{.OS}}_{{.Arch}}"

-output を指定しない場合にはカレントディレクトリにバイナリが出力される。

$ gox -output "pkg/amiCtrl_{{.OS}}_{{.Arch}}"
Number of parallel builds: 3

-->      netbsd/arm: amiCtrl
-->      darwin/386: amiCtrl
-->       linux/arm: amiCtrl
...
-->       linux/386: amiCtrl
-->    darwin/amd64: amiCtrl
-->     linux/amd64: amiCtrl

ghr も初めて使った

github.com

バイナリを Github Release ページにアップロードしてみたかったので ghr を初めて利用した。

事前に GitHub Token を払い出して環境変数に定義するか、コマンドラインオプション(-t)に設定する必要があるが、以下のように簡単に Release ページの作成からバイナリのアップロードを完了することが出来た。

ghr -u inokappa -r amiCtrl v0.0.1 ./pkg/

以下のように出力される。

$ ghr -u inokappa -r amiCtrl v0.0.1 ./pkg/
==> Create a new release
--> Uploading: amiCtrl_darwin_amd64
--> Uploading: amiCtrl_windows_amd64.exe
--> Uploading: amiCtrl_freebsd_amd64
--> Uploading: amiCtrl_darwin_386
...

以下のように Release ページ作成されている。

f:id:inokara:20170916234940p:plain

おお、お手軽過ぎる。

以上

メモでした。

時東ぁみ」の代表的な楽曲は知らないので本文中には出てきていないが悪しからず。

2017 年 09 月 15 日(金)

ジョギングと日課

  • 昨晩が遅かったこともありお休み
  • 右足のふともも股関節から痛みが続く
  • 日課も休み

何してたんだか

わからない位あっという間に過ぎた一日だった。

ホント何やってたんだろう。

2017 年 09 月 14 日(木)

ジョギング

  • 香椎浜 x 2 周
  • 右足の付け根あたりから太腿にかけて強い張りがある
  • 明日は走るのを止めておこう

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

夕飯

  • 「ふきや」でお好み焼き
  • お客さんはそこそこ入っているのに、おばちゃんが一人でお好み焼きを焼いているのはなんで
  • おじちゃんは厨房の裏で何やってるんだろうという話しで奥さんと盛り上がって
  • お好み焼きは美味しいけど

2017 年 09 月 13 日(水)

ジョギング

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

faultline

ギョームのとある PHP プロジェクトに faultline を導入してみた。

github.com

簡単デプロイで数ステップでいい感じに Slack へのエラーを通知出来たので、アプリケーションのエラートラッキングはもうこれでいいんぢゃないかと思ったりした。

詳しくは別の記事で書こうと思う。

Golang をギョームに

Golang で作った幾つかのツールをギョームのとあるプロジェクトに突っ込んだ。途中、Bash の甘い誘惑に気持ちが動きそうになりながらも、5 個くらい頑張って書いたので少しは Golang 力が上がったと思うけど、相変わらず「テスト」することを前提に書けなかった。

Non Interactive に MySQL 5.7.x をインストールする手順メモ(Debian 又は Ubuntu 環境版)

経緯

  • CodeDeploy で利用するコンテナ内で MySQL 5.7.x を動かしたかった
  • buildspec.yml の install フェーズあたりに指定するといい感じ
  • たまたま選んだコンテナのベースイメージが Debian Jessie だった

メモ

以下のような感じで MySQL が起動するところまでは確認した。

apt-get update
apt-get install -y gnupg procps
export DEBIAN_FRONTEND=noninteractive
apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 5072E1F5
echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.7" | tee -a /etc/apt/sources.list.d/mysql.list
apt-get update
MYSQL_PASSWORD="your_password"
echo "mysql-community-server mysql-community-server/root-pass password ${MYSQL_PASSWORD}" | debconf-set-selections
echo "mysql-community-server mysql-community-server/re-root-pass password ${MYSQL_PASSWORD}" | debconf-set-selections
apt-get install -y mysql-community-server
service mysql start

buildspec.yml に落とし込むと以下のような感じになると思う。(ちゃんと試せてないけど)

version: 0.2
env:
  variables:
    MYSQL_PASSEORD: "your_password"
phases:
  install:
    commands:
      - apt-get update
      - apt-get install -y gnupg procps
      - export DEBIAN_FRONTEND=noninteractive
      - apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 5072E1F5
      - echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.7" | tee -a /etc/apt/sources.list.d/mysql.list
      - apt-get update
      - echo "mysql-community-server mysql-community-server/root-pass password ${MYSQL_PASSWORD}" | debconf-set-selections
      - echo "mysql-community-server mysql-community-server/re-root-pass password ${MYSQL_PASSWORD}" | debconf-set-selections
      - apt-get install -y mysql-community-server
      - service mysql start
  build:
    commands:
      - your_commnd...
artifacts:
  files:
    - your_file

以上

メモでした。時代は Non Interactive だと思う。

2017 年 09 月 11 日(月)

911

  • アメリカの同時多発テロから 16 年になるのか
  • 年数的にも節目っぽく無いからなのか、某国のことでそれどころぢゃないのか分からないけど、メディアでは殆ど扱っていなかったような…

ジョギング

  • 香椎浜 x 2 周
  • 左足の踵付近の痛みはちょっと和らいだ感

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

イライラ

どうしたもんだか。

2017 年 09 月 10 日(日)

ジョギング

  • 香椎浜 x 2 周
  • 引き続き、左足の踵付近、それを構っているのか右足に違和感

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

うなぎ

  • 奥さんのリクエストに応えてうなぎ
  • おいしゅうございました

奥さんイメチェン

  • サラサラヘアにしてきたらしい

香椎の花火大会

  • 意外な穴場で奥さんが作ってくれた弁当広げて夏の終わりを堪能した
  • 途中で同じマンションに住んでいるこやまさんも合流したけど、こやまさんがあんまり元気無くて心配になった