Open18

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

### ネストスタックのリソースが表示される
えんぶんえんぶん

スイッチロールの有効期限デフォルトが短すぎていらいらするときはロール定義に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]]
えんぶんえんぶん

AWS::Includeを使用するのにarn:aws:cloudformation:${AWS::Region}:aws:transform/Includeに対するAllowポリシーが必要?

https://stackoverflow.com/questions/53993584/permission-issue-on-resource-arnawscloudformationus-east-1awstransform

- # 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でループ処理が可能に

https://dev.classmethod.jp/articles/cloudformation-foreach/

https://aws.amazon.com/jp/blogs/devops/exploring-fnforeach-and-fnfindinmap-enhancements-in-aws-cloudformation/

example
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-foreach-examples.html

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"内で使う&{}構文

これがよくわかってない

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-foreach.html#intrinsic-function-reference-foreach-parameters

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

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html

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