CloudFormation StackSets で リージョン毎に作成対象リソースを分ける

2021.06.01

いわさです。

StackSetsで複数アカウントや複数のリージョンへCloudFormationスタックを作成することが可能です。

GuardDutyなどなど全リージョンを対象としたいリソースを一発で有効化したかったのですが、一部のリソースは対象リージョンを絞りたくなってきました。
CloudFormationのConditionsとAWSで事前定義されている疑似パラメータを使うことで実現できそうだなぁと思ったのですが、ドキュメントの条件関数のページには以下の記載があります。

これらの条件は、スタックを作成または更新するときに宣言する入力パラメーターに基づいて評価されます。

Parameters以外で評価出来ないのか?そうなのか?と思ったので、試してみました。

やりたいこと

GuardDuty, IAM AccessAnalyzer, Personal Health Dashboard, CloudTrail Insights の通知を受信するために それぞれのCloudWatchイベントルールを作成します。

メインのリソースは東京リージョンにのみしかありませんが、予防措置であることから以下を参考に必要に応じて対象リージョンを広くしたいと思います。

また、Personal Health Dashboard(PHD)についてはグローバルイベント受信のために東京リージョン+バージニア北部を対象としたいと思います。

一部の AWS Health Eventはリージョン固有ではなく、AWS Identity and Access Management (IAM) に送信されるイベントなど、グローバルです。グローバルイベントを受信するには、米国東部 (バージニア北部) リージョンのルールを作成する必要があります。

ということで、今回は以下のように設定してみようと思います。

サービス リージョン
GuardDuty 全リージョン
IAM AccessAnalyzer 全リージョン
Personal Health Dashboard 東京リージョン, バージニア北部
CloudTrail Insights 東京リージョン

テンプレート

StackSetsで全リージョンを選択すると想定して、基本的に全リージョンでGuardDutyとIAM AccessAnalyzerを適用し、PHD用のイベントは東京リージョンとバージニア北部へ、CloudTrailInsightsは東京リージョンのみ作成するように、Conditionsセクションでリージョンの判定を行いました。
なお、以下のテンプレートは事前に"iwasa-topic"というSNSトピックのエクスポート出力が存在する前提になっていますので適宜変更してください。

AWSTemplateFormatVersion: '2010-09-09'
Description: Event Rules
Conditions:
  PhdTargetRegion: 
    !Or [!Equals [!Ref AWS::Region, ap-northeast-1], !Equals [!Ref AWS::Region, us-east-1]]
  TrailInsightTargetRegion: 
    !Equals [!Ref AWS::Region, ap-northeast-1]
Resources:
  GuardDutyRule:
    Type: AWS::Events::Rule
    Properties:
      Name: iwasa-guardduty-rule
      EventPattern:
        source:
          - "aws.guardduty"
        detail-type:
          - "GuardDuty Finding"
      Targets:
      - Arn: 
          Fn::ImportValue: iwasa-topic
        Id: iwasa-guardduty-target
  IamAccessAnalyzerRule:
    Type: AWS::Events::Rule
    Properties:
      Name: iwasa-accessanalyzer-rule
      EventPattern: 
        source: 
          - "aws.access-analyzer"
        detail-type:
          - "Access Analyzer Finding"
      Targets:
      - Arn: 
          Fn::ImportValue: iwasa-topic
        Id: iwasa-accessanalyzer-target
  PhdRule:
    Type: AWS::Events::Rule
    Condition: PhdTargetRegion
    Properties:
      Name: iwasa-phd-rule
      EventPattern: 
        source: 
          - "aws.health"
        detail-type:
          - "AWS Health Event"
      Targets:
      - Arn: 
          Fn::ImportValue: iwasa-topic
        Id: iwasa-phd-target
  TrailInsightRule:
    Type: AWS::Events::Rule
    Condition: TrailInsightTargetRegion
    Properties:
      Name: iwasa-trailinsight-rule
      EventPattern: 
        source: 
          - "aws.cloudtrail"
        detail-type:
          - "AWS Insight via CloudTrail"
      Targets:
      - Arn: 
          Fn::ImportValue: iwasa-topic
        Id: iwasa-trailinsight-target

実行結果

アジアパシフィック(東京)

米国東部(バージニア北部)

米国東部(オハイオ)

まとめ

ConditionsセクションでAWS事前定義の疑似パラメータでも問題なく条件に利用することが出来ました。
ひとつのテンプレートで複数のリージョン条件を混在させる必要がある際には試してみてください。