Subscribed unsubscribe Subscribe Subscribe

CloudFormationで複数アプリケーションでExport名を一意にする

For each AWS account, Export names must be unique within a region.

ということなので、Export名は動的にしないと2つ目のアプリケーションで同じテンプレートを使う場合にエラーになってしまいます。

そこで、Export名を動的にする方法をご紹介致します。

Export名を動的にする

  • スタック生成
  IAMStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub
        - ${S3TemplateURL}/IAM.yaml
        - { S3TemplateURL: !Ref S3TemplateURL }
      TimeoutInMinutes: 5
      Parameters:
        AppName: !Ref AppName
  • Output
Parameters:
  AppName:
    Type: String
....
Outputs:
  FlowLogsRoleArn:
    Value: !GetAtt FlowLogsRole.Arn
    Export:
      Name: !Sub
        - ${AppName}FlowLogsRoleArn
        - { AppName: !Ref AppName }
  • Import
  VPCFlowLog:
    Type: AWS::EC2::FlowLog
    Properties:
      DeliverLogsPermissionArn:
        Fn::ImportValue: !Sub
        - ${AppName}FlowLogsRoleArn
        - { AppName: !Ref AppName }
      LogGroupName: !Sub VPCFlowLogsGroup-${AWS::StackName}
      ResourceId: !Ref VPC
      ResourceType: VPC
      TrafficType: ALL

これでアプリケーション毎にExport名がuniqueになります。

コツとしては一番親のcreate-stack時に渡したパラメーターはExportせずにパラメーターとして子スタックに渡すことです。
そして、各スタックで生成されたものはExportします。

配列に対して、指定する場合はインデントを注意してください。以下のように指定すれば成功します。

      Certificates:
        - CertificateArn:
            Fn::ImportValue: !Sub
              - ${AppName}AcmCertificateArn
              - { AppName: !Ref AppName }

Outputs - AWS CloudFormation