JAWS-UG 島根支部 第0回勉強会に参加してCloudFormationのTipsとしてTemplateは分割してチェーン実行すると良いというのを知ったので試してみた。
今までどーんと1つのTemplate作ってしまってたけど、これだと実用的に利用出来そう。
呼び出すTemplate
- 以下のTemplate作成してs3-ap-northeast-1のhogemoge-publicバケットにs3_bucket_policy.templateの名前で配置しアクセスできるようにしておく
- Parametersで指定されたS3バケットに適当なバケットポリシーを設定してポリシー名を出力する簡単なTemplate
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "test",
"Parameters" : {
"BucketName" : {
"Type" : "String",
"Default" : "",
"Description" : ""
}
},
"Resources" : {
"S3BucketPolicy" : {
"Type" : "AWS::S3::BucketPolicy",
"Properties" : {
"PolicyDocument" : {
"Statement": [{
"Effect": "Allow",
"Principal": { "AWS": "*" },
"Action": "s3:GetObject",
"Resource": {
"Fn::Join" : [
"",
["arn:aws:s3:::", { "Ref" : "BucketName" }, "/*" ]
]
},
"Condition": {
"StringLike": {
"aws:UserAgent": [ "hoge*" ]
}
}
}]
},
"Bucket" : { "Ref" : "BucketName" }
}
}
},
"Outputs" : {
"S3BucketPolicy" : {
"Value" : { "Ref" : "S3BucketPolicy" }
}
}
}
大元のTemplate
- 他のTemplateを呼び出す際のResourceは以下のようにする
- TypeはAWS::CloudFormation::Stack
- TemplateURLで呼び出すTemplateを指定
- TemplateのParametersがある場合はそれも指定
- 呼び出したTemplateのOutputsを以下のように参照可能
- { "Fn::GetAtt" : ["[Template呼び出したResource名]", "Outputs.[TemplateのOutputsのキー指定]"]}
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "test",
"Resources" : {
"Bucket" : {
"Type" : "AWS::S3::Bucket"
},
"BucketPolicy" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"TemplateURL" : "https://s3-ap-northeast-1.amazonaws.com/hogemoge-public/s3_bucket_policy.template",
"Parameters" : {
"BucketName" : { "Ref" : "Bucket" }
}
}
}
},
"Outputs" : {
"S3BucketPolicy" : {
"Value" : { "Fn::GetAtt" : ["BucketPolicy", "Outputs.S3BucketPolicy"]}
}
}
}
Templateのチェーン実行
- 大元のTemplate(hoge)を実行
- 呼び出すTemplate(hoge-bucketpolicy-8tffgtdxlxim)も実行され結果が表示された