CloudFormation StackSets で リージョン毎に作成対象リソースを分ける
いわさです。
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事前定義の疑似パラメータでも問題なく条件に利用することが出来ました。
ひとつのテンプレートで複数のリージョン条件を混在させる必要がある際には試してみてください。