AWS CloudFormation スタックの更新ごとに、Amazon Elastic Compute Cloud (Amazon EC2) の Auto Scaling グループでローリングアップデートを行いたいと思っています。起動テンプレートを毎回変更することは、避けたいです。
解決策
Auto Scaling グループのローリングアップデートを開始するには、UpdatePolicy 属性を使用します。
CloudFormation テンプレートの起動設定では、AWS::EC2::LaunchTemplate リソースタイプの UserData プロパティにある Toggle パラメータを参照するのがベストプラクティスです。たとえば、スタックの更新中に Toggle 値を true から false に設定すると、UserData プロパティを変更したことになります。このアクションにより、CloudFormation は新しい起動テンプレートバージョンを作成するよう求められます。
以下の解決策は、Auto Scaling グループで AutoScalingRollingUpdate ポリシーを設定済みであり、Auto Scaling グループが AWS::EC2::LaunchTemplate を参照するよう設定していることを前提としています。
重要: Toggle パラメータをテンプレートに追加するときに、UserData プロパティの他の要素を乱さないようにしてください。
ローリングアップデートを設定するには、次の手順を実行します。
-
CloudFormation テンプレートで、Toggle をパラメータとして定義します。
JSON ファイルの場合は、次のコードを入力します。
"Parameters": {
"Toggle": {
"Type": "String",
"AllowedValues": [
"true",
"false"
],
"Default": "true",
"Description": "Toggle parameter to force ASG update"
}
}
YAML ファイルの場合は、次のコードを入力します。
Parameters:
Toggle:
Type: String
AllowedValues:
- 'true'
- 'false'
Default: 'true'
Description: 'Toggle parameter to force ASG update'
-
テンプレートの起動設定で、UserData プロパティの Toggle パラメータを参照します。
JSON の例:
"LaunchTemplate": {
"Type": "AWS::EC2::LaunchTemplate",
"Properties": {
"LaunchTemplateData": {
"ImageId": { "Ref": "ImageId" },
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"echo \"Toggle parameter is set to ",
{
"Ref": "Toggle"
},
"\"\n"
...
...
]
]
}
},
"InstanceType": { "Ref": "InstanceType" }
}
}
YAML の例:
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
ImageId: !Ref ImageId
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
echo "Toggle parameter is set to ${Toggle}"
...
...
InstanceType: !Ref InstanceType
-
スタックを作成します。
-
ローリングアップデートを開始するために、現在の設定に応じて、Toggle パラメータの値を true から false に、またはfalse から true に変更します。
注: 更新に置換を必要とするプロパティに対しても (LaunchTemplateName など)、上記の解決策を使用できます。