概要
やりたいこと
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コンソールより
- StackSets
- StackSet の作成
- テンプレートの選択
- テンプレートの準備完了
- テンプレートファイルのアップロード
- StackSet の詳細を指定
- StackSet 名 : guardduty-stackset
- StackSet オプションの設定
- IAM 管理ロール名 : AWSCloudFormationStackSetAdministrationRole
- IAM 実行ロール名 : AWSCloudFormationStackSetExecutionRole
- デプロイオプションの設定
- アカウント
- デプロイ先 : スタックをアカウントにデプロイ
- アカウント番号 : 記載なし
- リージョンの指定
- すべてのリージョンを追加
- デプロイオプション : デフォルト
- アカウント
作成すると自動で実行される。
オペレーションタブで SUCCEEDED になっていることを確認。
スタックインスタンスで全リージョンが CURRENT になっていること。
エラー
Cancelled since failure tolerance has exceeded
一部のリージョンだけ成功し、一部のリージョンは失敗している。
ap-northeast-1 だけ GuardDuty を有効化していたため、そこでエラーが起き、他のリージョンもコケていた。
コメント