ようへいの日々精進XP

よかろうもん

俺の郷 〜 尾崎亜美、鈴木亜美、時東ぁみもみんな一緒に 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

おお、お手軽過ぎる。

以上

メモでした。

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