サーバの実行環境はDockerコンテナで管理するが当たり前になった昨今ですが、数年前にサービスインして保守フェーズの案件ではEC2インスタンスで直接サービスを動かす構成は、まだまだ、現役です。
今回は、オートスケーリンググループで起動させるEC2インスタンスを起動テンプレートで管理しており、起動テンプレートのバージョンを上げて、対象のAMIを新しいものに変更する作業を AWS CLIで行います。
使用する環境変数名
今回は AMI と EBSのスナップショットIDを新しくします。
環境変数名 | 値の意味 |
---|---|
TEMPLATE_NAME | 更新したいテンプレート名 |
TEMPLATE_ID | TEMPLATE_NAME の launch-template-id |
PREV_TEMPLATE_VER | 作業時点でのデフォルトバージョン |
TEMPLATE_DESC | 起動テンプレートの新しいバージョンの説明 |
AMI_ID | 起動テンプレートの新しいバージョンが利用する AMI の ID |
EBS_SNAPSHOT_ID | 起動テンプレートの新しいバージョンが利用する EBSのスナップショットID |
作業コマンド
# 起動テンプレートのIDを取得
$ export TEMPLATE_NAME="my_template"
$ export TEMPLATE_ID=$( aws ec2 describe-launch-templates--launch-template-names ${TEMPLATE_NAME} | \
jq -r '.LaunchTemplates[].LaunchTemplateId' \
)
$ echo $TEMPLATE_ID
lt-1234567890abcdef
# 起動テンプレートのデフォルトバージョンを取得
$ export PREV_TEMPLATE_VER=$( aws ec2 describe-launch-templates --launch-template-names ${TEMPLATE_NAME} | \
jq -r '.LaunchTemplates[].DefaultVersionNumber' \
)
$ echo $PREV_TEMPLATE_VER
7
# 今の起動テンプレートをファイルに保存しておく
$ aws ec2 describe-launch-template-versions \
--launch-template-id ${TEMPLATE_ID} \
--versions ${PREV_TEMPLATE_VER} \
> launch-template-befor.json
# AMIを指定して起動テンプレートの新しいバージョンを作成する
export NEW_TEMPLATE_JSON=$(aws ec2 create-launch-template-version \
--launch-template-id ${TEMPLATE_ID} \
--version-description "${TEMPLATE_DESC}" \
--source-version ${PREV_TEMPLATE_VER} \
--launch-template-data '{"BlockDeviceMappings":[{"DeviceName": "/dev/xvda","Ebs":{"DeleteOnTermination": true,"SnapshotId":"'${EBS_SNAPSHOT_ID}'","VolumeSize": 30,"VolumeType": "gp2"}}],"ImageId":"'${AMI_ID}'"}')
# 新しいバージョン番号を取得
export NEW_TEMPLATE_VER=$(echo ${NEW_TEMPLATE_JSON} | jq -r '.LaunchTemplateVersion.VersionNumber')
# 新しいバージョンをファイルに保存しておく
$ aws ec2 describe-launch-template-versions --launch-template-id ${TEMPLATE_ID} --versions ${NEW_TEMPLATE_VER} > launch-template-after.json
aws ec2 create-launch-template-version
の引数 --launch-template-data
の値は 公式ドキュメント を参照してください。
差分確認
作業前後で aws ec2 describe-launch-template-versions
の結果を比較して、想定した変更差分であることを確認します。
$ diff launch-template-befor.json launch-template-after.json
6,8c6,8
< "VersionNumber": 7,
< "VersionDescription": "change instance to t2.medium",
< "CreateTime": "2018-12-14T04:19:43.000Z",
---
> "VersionNumber": 10,
> "VersionDescription": "update app. ver 1.2.3",
> "CreateTime": "2019-12-19T06:23:15.000Z",
10c10
< "DefaultVersion": true,
---
> "DefaultVersion": false,
21c21
< "SnapshotId": "snap-01234567890123456",
---
> "SnapshotId": "snap-abcdefabcdefabcde",
40c40
< "ImageId": "ami-01234567890123456",
---
> "ImageId": "ami-abcdefabcdefabcde",