ECS最適化AMIの更新を検知する運用ノウハウ
目次
こんにちは、L小川です。
最近は休日にいろいろなジャムを作っています。ミルクジンジャージャムがお気に入りです。
本日はECS on EC2で利用する「ECS最適化AMI」の更新を検知する方法について紹介します。
ECS最適化AMIにはECSコンテナエージェント・Dockerエージェント・起動スクリプトのecs-initが含まれており、最新のAMIではバグフィックスや機能拡張が提供されています。AWSでも最新のAMIを使うことを推奨しているので、定期的にAMIを更新したいところです。
アトラスでは、以下の順序でECSのEC2インスタンスを新しいAMIに更新しています。
- AMIの更新をSlackに通知(←本記事の内容)
- 各プロダクトの検証環境で動作確認
- リリースなどのタイミングでインスタンスを差し替え
通知フロー
通知フローは以下のとおりです。
EventBridge
月〜金でLambdaを日次実行します。業務時間外の通知だと、うっかり見過ごしてしまう可能性があるので業務時間内に通知しています。
Lambda (Python)
SSM の GetParameter API を使って最新AMI IDを取得し、Lambdaのタグに登録します。次回起動時に、「タグに登録されている値」と「取得した最新のAMI ID」を比較して、一致しなければ新しいAMI IDをタグを上書きし、Slackへ通知します。
ソースコード(例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
TAG_AMI_ID = 'LatestAmiId' SSM_PARAMETER_NAME = '/aws/service/ecs/optimized-ami/amazon-linux-2/recommended' lambda_cli = boto3.client('lambda') ssm_cli = boto3.client('ssm') lambda_arn = context.invoked_function_arn tags = lambda_cli.list_tags(Resource=lambda_arn)['Tags'] ami_id = '' # 登録済みAMI IDの取得 if TAG_AMI_ID in tags: ami_id = tags[TAG_AMI_ID] # 最新AMI IDの取得 res_ssm = ssm_cli.get_parameter( Name=SSM_PARAMETER_NAME ) ssm_json = res_ssm['Parameter']['Value'] parameter_values = json.loads(ssm_json) latest_ami_id = parameter_values['image_id'] if ami_id != latest_ami_id: res_tag = lambda_cli.tag_resource( Resource=lambda_arn , Tags={ TAG_AMI_ID: latest_ami_id } ) # 以下略(この後にSlack通知内容作成処理を記述) |
Slack
Slackに通知された内容を管理表に転記し、プロダクトごとに更新状況を管理しています。
おわりに
今回は、日常的に行っている運用作業のひとつを紹介しました。
シンプルな仕組みですが、AMIの更新通知が他のメンバーにも見えることで、計画的なインフラ更新・ノウハウの共有ができるようになり、健全なプロダクト運用につながります。
小粒ですがピリッと効く運用かと思いますので、機会がありましたらお試しください。