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

概要

やりたいこと

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 用準備

StackSets の利用には 2種類ある。

今回のように自身のアカウントのみにデプロイする場合はセルフマネージド型となる。

2 種類の IAM を自分のアカウントに作成する。

  • 管理用 IAM Role (AWSCloudFormationStackSetAdministrationRole) : CloudFormation StackSet を作成するアカウント
  • 実行用 IAM Role(AWSCloudFormationStackSetExecutionRole) : 実行先のアカウント

今回は管理も実行も同じアカウントなので、一つにまとめた Cloudformation テンプレートを作成する。

  • AdministratorAccountId : 自分のアカウントID
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 を有効化していたため、そこでエラーが起き、他のリージョンもコケていた。

参考

スタックセットの作成

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

コメント

タイトルとURLをコピーしました