AWS CloudFormationからSystems ManagerパラメータストアのAMIを参照するときにそのAMIをアップデートする方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
少し前にCloudFormationからSystems Managerのパブリックパラメータストアを参照して最新AMIを引っ張って来れるようになりました。以下の記事やドキュメントで示している方法です。

非常に便利な仕組みなのですが、初回作成のあと時間が経ち新しいAMIがリリースされたときにどうやってその最新AMIにアップデートするのかがわからなかったので、試してみた様子をご紹介します。

何も変更せずにCloudFormationスタックを更新すればOK

結論から言うと、テンプレートやパラメータなど何も変更せずにCloudFormationスタックを更新すればOKです。パラメータのAMI IDを参照するリソースが、リソースの要件に応じてその時点で最新のAMI IDにて更新されます。例えばAutoScalingの起動設定であれば最新AMI IDの起動設定が新規作成され、既存の起動設定と置き換えられます。では試してみます。

CloudFormationテンプレートでは、以下のようにECS最適化インスタンスのAMI IDをパラメータで参照し、起動設定のImageIdプロパティにセットしています。

Parameters:  
  FluentdAmiId:
    Description: ECS Optimized AMI ID
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux/recommended/image_id
    :
Resources:
  FluentdInstanceLc:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId: !Ref FluentdAmiId

スタックを作成し、現時点の起動設定ではAMIがami-0041c416aa23033a2(amzn-ami-2018.03.e-amazon-ecs-optimized )になっています。

では、作成したスタックを更新します。スタックを選択、[アクション] - [スタックの更新]をクリックします。

更新ウィザードでは以下を選択し、テンプレート/パラメータともに変更しないようにします。

  • テンプレートの選択 : 「現在のテンプレートの使用」のまま
  • 詳細の指定 : AMIを指定するパラメータ/aws/service/ecs/optimized-ami/amazon-linux/recommended/image_idのまま
  • オプション : 変更なし

通常の更新では変更点が特にないので、変更のプレビューでは"変更なし"となり、更新がエラーになるのですが...

AMI IDを参照する起動設定FluentdInstanceLcの置換列がTrue(更新によって置き換えられるリソースを指す)になりました!起動設定を参照するAutoScalingグループもConditional(一部変更)になっていますね。更新を実行すると...

最新のAMI(amzn-ami-2018.03.f-amazon-ecs-optimized:ami-0d5f884dada5562c6)がセットされた起動設定が追加されました。このあとAutoScalingグループの更新と続き、更新が完了すると古い起動設定が削除され、スタックの更新は完了です。

まとめ

CloudFormationからSystems ManagerのパブリックパラメータストアのAMI IDを参照するときは、テンプレートやパラメータをいじらずにスタックを更新すれば最新AMIに更新することができます。CloudFormationの運用に役立てていただければ幸いです。