share facebook facebook twitter menu hatena pocket slack

2017.10.02 MON

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

川原 洋平

WRITTEN BY 川原 洋平

オリビアを聴きながら

リリースした。

inokappa/amiCtrl
Contribute to amiCtrl development by creating an account on GitHub.

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",
...
        }
    ]
}

DescribeImages - Amazon Elastic Compute Cloud
Describes one or more of the images (AMIs, AKIs, and ARIs) available to you. Images available to you include public images, private images that you own, and private images owned by other AWS accounts but for which you have explicit launch permissi...

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 を初めて使った

mitchellh/gox
gox - A dead simple, no frills Go cross compile tool

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 も初めて使った

tcnksm/ghr
ghr - Upload multiple artifacts to GitHub Release in parallel

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 ページ作成されている。

おお、お手軽過ぎる。

以上

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

元記事はこちら

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