CloudFormation StackSets コンソールで AWS GuardDuty を全リージョンで有効化する

2020年7月4日

概要

やりたいこと

GuardDuty を有効化したい。全リージョンで。

GuardDuty はリージョナルなサービスなため、リージョンごとで有効化しないといけない。

CloudFormation StackSets

複数のアカウントおよびリージョンのスタックを 1 度のオペレーションで、作成、更新、削除できるようにする。

2種類ある。自分のアカウントか、他人のアカウントかの違い。
今回はセルフマネージド型。

  • セルフマネージド型 : 特定のリージョンで特定の AWS アカウントにスタックインスタンスをデプロイできまる
  • サービスマネージド型 : 特定のリージョンで AWS Organizations によって管理されているアカウントにスタックインスタンスをデプロイできる

Cloudformation でデプロイ

GuardDuty 有効化

GuardDuty の有効化だけなら、コードはシンプル。

AWSTemplateFormatVersion: 2010-09-09
Description: GuardDuty
Resources:
  GuardDuty:
    Type: AWS::GuardDuty::Detector
    Properties:
      Enable: true

デプロイ。自分の aws cli で指定しているリージョン (ap-northeast-1) で GuardDuty が有効になっていることを確認する。

aws cloudformation deploy --stack-name guardduty-test --template-file iam.yaml

しかし、他のリージョンでは GuardDuty は有効になっていない。

そのため、StackSets を利用する。
その前に、上で有効化した GuardDuty を無効化しておく(1個だけ有効になっていると StackSets でエラーになる)。

aws cloudformation delete-stack --stack-name guardduty-test

StackSets 用 IAM Role 作成

StackSets の利用には専用の IAM の作成が必要。

2 種類作成する必要がある。

  • 管理用IAMロール : AWSCloudFormationStackSetAdministrationRole
  • 実行用IAMロール : AWSCloudFormationStackSetExecutionRole

管理用 IAM は CloudFormation Stack が存在するアカウントで、実行用 IAM は実行先のアカウントで必要。
今回は同じアカウントなので、一つにまとめた Cloudformation テンプレートを作成する。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  AdministratorAccountId:
    Type: String
    Description: AWS Account Id of the administrator account (the account in which StackSets will be created).
    MaxLength: 12
    MinLength: 12

Resources:
  AWSCloudFormationStackSetAdministrationRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWSCloudFormationStackSetAdministrationRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudformation.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: AssumeRole-AWSCloudFormationStackSetExecutionRole
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - sts:AssumeRole
                Resource:
                  - "arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole"
  AWSCloudFormationStackSetExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWSCloudFormationStackSetExecutionRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              AWS:
                - !Ref AdministratorAccountId
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - !Sub arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess
  

デプロイ

aws cloudformation deploy --stack-name stacksets-iam --template-file iam.yaml --capabilities CAPABILITY_NAMED_IAM --parameter-overrides AdministratorAccountId=111111111111

AWSCloudFormationStackSetAdministrationRole と AWSCloudFormationStackSetExecutionRole が作成されていること。

コンソールから StackSets

CloudFormationコンソールより

  1. StackSets
  2. StackSet の作成
  3. テンプレートの選択
    • テンプレートの準備完了
    • テンプレートファイルのアップロード
  4. StackSet の詳細を指定
    • StackSet 名 : guardduty-stackset
  5. StackSet オプションの設定
    • IAM 管理ロール名 : AWSCloudFormationStackSetAdministrationRole
    • IAM 実行ロール名 : AWSCloudFormationStackSetExecutionRole
  6. デプロイオプションの設定
    • アカウント
      • デプロイ先 : スタックをアカウントにデプロイ
      • アカウント番号 : 記載なし
    • リージョンの指定
      • すべてのリージョンを追加
    • デプロイオプション : デフォルト

作成すると自動で実行される。
オペレーションタブで SUCCEEDED になっていることを確認。

スタックインスタンスで全リージョンが CURRENT になっていること。

エラー

Cancelled since failure tolerance has exceeded

一部のリージョンだけ成功し、一部のリージョンは失敗している。

ap-northeast-1 だけ GuardDuty を有効化していたため、そこでエラーが起き、他のリージョンもコケていた。

参考

スタックセットの作成

セルフマネージド型のアクセス許可を持つスタックセットの作成