CloudFormation 覚書
CloudFormationの覚書あれこれ
ネストされたスタックのリソースを確認したい場合
# 親スタックのリソース一覧からネストスタックの物理リソースIDだけ抜き出す
# 適宜オプションに"--outpt text"とかつけて
$ aws cloudformation describe-stack-resourecs \
--stack-name ParentStackName \
--query "StackResources[?ResourceType=='AWS::CloudFormation::Stack'].PhysicalResourceId[]"
{
"arn:aws:cloudformation:ap-northeast-1:1234567890:stack/NestedStack-123456/1234455"
}
# describe-stack-resourecsでネストスタックのリソースを表示したい場合
# --physical-resource-id じゃなくて --stack-name で指定する
$ aws cloudformation describe-stack-resourecs \
--physical-resource-id arn:aws:cloudformation:ap-northeast-1:1234567890:stack/NestedStack-123456/1234455
### なぜか親スタックのリソースが表示される
$ aws cloudformation describe-stack-resourecs \
--stack-name arn:aws:cloudformation:ap-northeast-1:1234567890:stack/NestedStack-123456/1234455
### ネストスタックのリソースが表示される
template書くときに参考するやつ
AWSサービス/リソースごとのCfn定義reference
IAMPolicy書くときに参考にするやつ
service + actionのreference
!Sub
の中で${}
をそのまま出力する
USD 記号と中括弧 (
{!Literal} など)。CloudFormation は、このテキストを ${Literal} として解決します。 {}) をそのまま書き込むには、最初の中括弧の後に感嘆符 (!) を追加します (
スイッチロールの有効期限デフォルトが短すぎていらいらするときはロール定義にMaxSessionDurationわすれずに書く
Type: AWS::IAM::Role
Properties:
MaxSessionDuration: 43200 # 12 hours
テンプレート中に「おんなじ内容のリストなんだけど使う場所によってセパレータが違うんだよなー」という場合のMappingsとJoinの組み合わせ
Mappings:
NonProxyMap:
hosts:
aws: [localhost,127.0.0.1,169.254.169.254]
Resources:
...
content: !Sub
- |
environment:
NO_PROXY_C: "${noProxyC}" # localhost,127.0.0.1,169.254.169.254
NO_PROXY_VB: "${noProxyVB}" # localhost|127.0.0.1|169.254.169.254
proxy:
noproxy: "\
${noProxyLF}\ # localhost\n127.0.0.1\n169.254.169.254
"
- noProxyC: !Join [",", !FindMap [NonProxyMap, hosts, aws]]
noProxyVB: !Join ["|", !FindMap [NonProxyMap, hosts, aws]]
noProxyLF: !Join ["\\n", !FindMap [NonProxyMap, hosts, aws]]
Conditionで使えるNull
- 条件キーが 有るとき の Allow/Deny を示したいときは
"Null":{"条件キー": "false"}
を使う - 条件キーが 無いとき の Allow/Deny を示したいときは
"Null":{"条件キー": "true"}
を使う
AWS::Include
を使用するのにarn:aws:cloudformation:${AWS::Region}:aws:transform/Include
に対するAllowポリシーが必要?
- # The AWS::Include transform requires this weird permission.
Sid: UseInclude
Effect: "Allow"
Action: "cloudformation:CreateChangeSet"
Resource: !Sub "arn:aws:cloudformation:${AWS::Region}:aws:transform/Include"
全然情報が転がってない。なんぞこれ
Fn::ForEach
でループ処理が可能に
example
includeの場合と同様にtransform/LanguageExtensions
リソースに対してCreateChangeSetできる権限が必要
- Sid: UseLangExt
Effect: "Allow"
Action: "cloudformation:CreateChangeSet"
Resource: !Sub "arn:aws:cloudformation:${AWS::Region}:aws:transform/LanguageExtensions"
GetAttとSubの合わせ技
Outputs:
Fn::ForEach::Outputs:
- Identifier
- [A, B]
- ${Identifier}Output
Value: !GetAtt
- !Sub {Hoge}Resource # "!GetAtt A.B"のAの部分
- Version # "!GetAtt A.B"のBの部分
Refの中にSub
Resources:
# ...
Fn::ForEach::Outputs:
- Identifier
- [A, B]
- ${Identifier}Fuga
# ...
SomeProp: !Ref
Fn::Sub ${Identifier}Hoge
&{}
構文
"OutputKey"内で使うこれがよくわかってない
OutputKey
The &{} syntax allows non-alphanumeric characters in the Collection to be used in OutputKey parameter.
下でいうValue1、Value2などの値に数字英字以外の、例えば日本語とかが使えるようになる?
'Fn::ForEach::UniqueLoopName':
- Identifier
- - Value1 # Collection
- Value2
- 'OutputKey':
OutputValue
Outputs:
Fn::ForEach::ApiId:
- Identifier
- [A, B]
- ${Identifier}:
Value: !Ref
Fn::Sub: ${Identifier}Api # AWS::ApiGatewayRestApi resource
Export:
Name: !Sub {AWS::StackName}-${Identifier}-RestApiId
とかするとエラーになる
The Name field of Export must not depend on any resources, imported values, or Fn::GetAZs
For outputs, the value of the Name property of an Export can't use Ref or GetAtt functions that depend on a resource.
Similarly, the ImportValue function can't include Ref or GetAtt functions that depend on a resource.
これのこと?となるとFn::ForEachのIdentifierはリソース依存ということ?
追記:
Fn::ImportValue
でも同様の指摘
TransForm: AWS::LanguageExtensions
使うとできるようになること(思いついたら書き足す)
- !Refの中でFn::Subとか使える
Hoge: !Ref Fn::Sub: ${Foo}Bar
EC2インスタンス構築時にprivate ipとか取得する
http://169.254.169.254/latest/meta-data/local-ipv4
AWS::CloudForamtion::Initの中でIP使って設定書き換えたい、とかの場合に使える
テンプレート本文のサイズ上限は通常51.2KB、S3に置いたテンプレートで1MB
どうしてもサイズがでかくなる場合
- S3のほうが上限でかいのでS3に置くようにする
- ネストされたスタックを使うなどしてテンプレートを分割する
-
Fn::ForEach
使うなどしてなるべく短く書く
CloudFormationのDiscordサーバー
CloudForamtion CLI (CFN-CLI)
CloudForamtion Registry
hook, module, Resource TypeなどをあらかじめRegistryに登録しておいて、再利用できるようにする