【小ネタ】 AWS CloudFormationテンプレートでAWSアカウントごとにリソース作成有無を決定する

AWSアカウントごとにリソース作成有無を分ける CFnテンプレート例。Mappings と Conditionsセクションを活用します
2021.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS CloudFormation(CFn) StackSetを使っていて、 「特定のAWSアカウントには、このリソースを作りたくない」要件がでてきました。

Conditions を使って、これを解決してみます。

CFnで使える条件(Conditions)

CFnの Conditions セクションを使ってリソースの作成有無を決定することができます。

シンプルな例を紹介します。

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  Env:
    Type: String
    AllowedValues:
      - prod
      - dev
Conditions: 
  CreateProdResources: !Equals
    - !Ref Env
    - prod
Resources:
  # This topic is only needed in production workloads.
  SNSTopic:
    Type: AWS::SNS::Topic
    Condition: CreateProdResources
    Properties:
      TopicName: !Sub ${Env}-topic

Parameters セクションで指定したパラメータ Env の値によって、 リソースである SNSTopic の作成有無を決定する例です。

  • Env=prod のとき、 SNSTopic は作成されます
  • Env=dev(prod以外) のとき、 SNSTopic は作成されません

Conditions では条件関数を使って、真偽の決定プロセスを定めます。 今回は Fn::Equals を使っています。

詳しい使い方や他の条件関数については以下参照ください。

アカウントごとにリソース作成有無を分ける

以下のようなテンプレートで実現できます。

AWSTemplateFormatVersion: '2010-09-09'
Mappings: 
  AccountParams:
    "111111111111": { CreateResources: yes }
    "222222222222": { CreateResources: yes }
    "333333333333": { CreateResources: no  }
Conditions: 
  CreateResources: !Equals
    - !FindInMap [AccountParams, !Ref "AWS::AccountId", CreateResources]
    - yes
Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
    Condition: CreateResources
    Properties:
      TopicName: hoge-topic

Mappings を活用しました。 Mappings を使うことで AWSアカウントごとに異なるパラメータを 指定することができます。

Mappings, FindInMap などの使い方については以下に記載しているので参照ください。

参考