AMIの世代管理としてamirotateを導入する
AWSでAMIを世代管理して欲しいとお客様から要望があった際に活躍するのが、この「amirotate」です。世代数やAMI取得間隔を自由に設定できるため、柔軟なAMI取得が可能になります。
amirotateは、以下のGithubに上がっていて、ここから自身の端末にDLして使っていきます。端末での設定の仕方やデプロイ方法まできちんと以下に記載していますが、詳細な手順や実際に使っているコードを貼り付けていこうと思います。
AWSリソース
- EC2: AMIを取得したいEC2
- Lambda: amirotate-dev-create、amirotate-dev-delete
(名前は任意。新しくAMIをcreate処理するLambdaと古いAMIをdelete処理するLambdaを作成。)
作業手順
1. ローカル環境の準備
amirotateを処理したい場所で以下を実行し、スクリプトをクローンしyarnを実行。
$ git clone https://github.com/y13i/amirotate.git
$ cd amirotate
$ yarn
デフォルトでは create は 0:00 UTC 、 delete は 1:00 UTC に毎日実行されるようにスケジューリングされますが、変更したい場合は、serverless.yml の cron(0 0 ? * * *) の部分を変更すること。
2. 対象EC2インスタンスのタグ作成
対象インスタンスのタグのKeyとValueを以下のようにセットする。Countの数が世代数、Keyの文字列はserverless.ymlに合わせること。ここでは10分毎にAMIを取得し、2世代保管する例を記載。
Key: amirotate:10min Value: {"NoReboot": true, "Retention": {"Count": 2}}
3. serverless.yml の編集
serverless.ymlファイルを以下の内容に編集する。tagKeyの部分にEC2のタグのKey値を合わせれば、複数のLambda実行のスケジューリング(CloudwatchEvent)が可能。この際、create処理とdelete処理の時間をずらして記載すること。同じだと世代が1世代多くなってしまう。以下のコードでは、amirotate:10minのKey値を設定したEC2のAMIを10分毎取得したいので、create処理をcron(0,10,20,30,40,50 * * * ? )とし、delete処理cron(5,15,25,35,45,55 * * * ? )として実行している。
service: amirotate provider: name: aws runtime: nodejs8.10 region: ${env:AWS_REGION} timeout: 300 memorySize: 256 environment: tagKey: amirotate sleepBeforeEach: 100 iamRoleStatements: - Effect: Allow Action: - ec2:CreateImage - ec2:CreateTags - ec2:DeleteSnapshot - ec2:DeregisterImage - ec2:DescribeImages - ec2:DescribeInstances - ec2:DescribeSnapshots - ec2:DescribeTags Resource: "*" plugins: - serverless-webpack functions: create: handler: create.default events: - schedule: rate: cron(0 20 ? * * *) input: tagKey: amirotate:default - schedule: rate: cron(0,10,20,30,40,50 * * * ? *) input: tagKey: amirotate:10min delete: handler: delete.default events: - schedule: rate: cron(0 21 ? * * *) input: tagKey: amirotate:default - schedule: rate: cron(5,15,25,35,45,55 * * * ? *) input: tagKey: amirotate:10min environment: sleepBeforeDeleteSnapshots: 500
4. 設定の反映
以下コマンドにて、設定を反映させる
$ yarn run deploy
5. 実行確認
AMIが設定したタイミングで取得および削除され2世代管理されていることを確認する