この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
やりたいこと
AWS Control Towerがまだ未対応のリージョン (2021/08/25 時点では 大阪および北カリフォルニア)の Config記録を有効化します。
図に表します。
なお、Control Tower 対応リージョンでは、 この設定は不要です。そのリージョンをControl Tower 管理下にすることで、 よしなに Config設定をしてくれます。
手順
- 前提条件
- ログアーカイブアカウントに Config用バケットを作成
- Config記録の有効化
1. 前提条件
Config記録はアカウント・リージョン毎に 1つしか作成できません。
なので事前に、対象のアカウント・リージョンの Configは無効化しておきましょう。
参考: コンソールから消せないConfigを全リージョンCLIから無効化する | DevelopersIO
2. ログアーカイブアカウントに Config用バケットを作成
事前にログアーカイブアカウントに S3バケットを作成しておきます。 このバケットに Configからの配信される設定情報が格納されます。
CFnテンプレートの準備
以下CloudFormation テンプレートを使います。
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
BucketName: { Type: String }
OrgID: { Type: String }
Resources:
# Bucket
ConfigBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref BucketName
VersioningConfiguration:
Status: Enabled
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
# Bucket Policy
ConfigBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref ConfigBucket
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: "AWSConfigBucketPermissionsCheck"
Effect: "Allow"
Principal:
Service:
- "config.amazonaws.com"
Action: "s3:GetBucketAcl"
Resource: !Sub "arn:aws:s3:::${ConfigBucket}"
- Sid: "AWSConfigBucketExistenceCheck"
Effect: "Allow"
Principal:
Service:
- "config.amazonaws.com"
Action: "s3:ListBucket"
Resource: !Sub "arn:aws:s3:::${ConfigBucket}"
- Sid: "AWSConfigBucketDelivery"
Effect: "Allow"
Principal:
Service:
- "config.amazonaws.com"
Action: "s3:PutObject"
Resource: !Sub "arn:aws:s3:::${ConfigBucket}/${OrgID}/AWSLogs/*"
Condition:
StringEquals:
s3:x-amz-acl: "bucket-owner-full-control"
S3バケット、およびそのバケットポリシーを生成するものです。 S3バケットポリシーは以下ドキュメントを参考にしています。
CFnテンプレートの展開
ログアーカイブアカウントにて、このテンプレートを展開します。 入力するパラメータは以下のとおりです。
- スタック名: 任意 (例: config-bucket-for-control-tower-unsupported-regions)
- パラメータ > BucketName: 任意 (例: config-bucket-for-ct-unsupported-regions-${アカウントID})
- パラメータ > OrgID: 所属するOrganizations組織ID (o-xxxxxxxxxx)
▼ S3バケット、S3バケットポリシーが作成されていればOKです
3. Config記録の有効化
CT管理OUの各アカウントへ Config有効化を行っていきます。 CloudFormation StackSets を活用します。
CFnテンプレートの準備
以下 CFnテンプレートを準備します。 Config用IAMロール、Config記録、 およびConfig配信チャネルを生成するものです。
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
BucketName: { Type: String }
OrgID: { Type: String }
Resources:
# Role for Config Recorder
ConfigRecorderRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub config-role-for-${AWS::Region}
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- config.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWS_ConfigRole"
# Config Recorder
ConfigRecorder:
Type: AWS::Config::ConfigurationRecorder
Properties:
RoleARN: !GetAtt ConfigRecorderRole.Arn
RecordingGroup:
AllSupported: true
IncludeGlobalResourceTypes: false
# Config Delivery Channel
ConfigDeliveryChannel:
Type: AWS::Config::DeliveryChannel
Properties:
S3BucketName: !Ref BucketName
S3KeyPrefix: !Sub "${OrgID}"
ConfigSnapshotDeliveryProperties:
DeliveryFrequency: "One_Hour"
スタックセット作成
この作業は 管理アカウント上で行います。
CloudFormation StackSets の画面にて [StackSetsの作成] を選択します。 先程のテンプレートを選択、スタック名・パラメータは以下とします。
- スタック名: 任意 (例: enable-config-for-control-tower-unsupported-regions)
- パラメータ > BucketName: 先程作成したConfig用バケットの名前
- パラメータ > OrgID: 所属するOrganizations組織ID (o-xxxxxxxxxx)
アクセス許可は「セルフサービスのアクセス許可」を選択します。 そして IAM管理ロールを AWSControlTowerStackSetRole、 IAM 実行ロール名を AWSControlTowerExecution としてください。
これを指定する理由は Control Towerの予防的ガードレールがあるためです。 上記実行ロール以外は Config設定ができないようになっています。
アカウントは [スタックを組織単位にデプロイ] を選択。 組織番号に追加したいOUの1つのIDを入力します。 リージョンは現状 Control Tower が対応していない大阪、 および北カリフォルニアを選択します。
内容を確認して [送信] を選択します。
▼すべてのスタックインスタンスが CURRENT
となればOKです
(オプション) スタックの追加
先程の作業で OU 1つ分 のアカウント群の設定が完了しました。 以降で他OUもスタックセットに追加する手順を説明します。
スタックセットのページで [アクション]→[StackSet にスタックを追加] を選択します。
同じように [スタックを組織単位にデプロイ] を選択、組織番号を入力します。
上書きの設定はデフォルトで、展開していきます。
▼すべてのスタックインスタンスが CURRENT
となればOKです
上記までの作業をCT登録しているOU分行います。
確認
メンバーアカウントの Config設定
展開した北カリフォルニアのConfigを確認してみます。 Configが有効化されていました。
ログアーカイブアカウントのConfigバケット
ログアーカイブアカウントの Configバケットを確認します。 有効化したアカウント分、Config情報が格納されていること確認できました。
運用方法
CT管理のOUが増えたとき
『3. Config記録の有効化 > (オプション)スタックの追加』 の手順を使います。 新しい OU ID で展開することで対応できます。
OUに新規アカウントが追加されたとき
『3. Config記録の有効化 > (オプション)スタックの追加』 の手順を使います。 新規アカウントの所属するOU ID で展開することで対応できます。
特定リージョンのConfig有効化を取り消すとき
Control Tower 未対応リージョン(大阪もしくは北カリフォルニア) が Control Tower 対応になった場合は、 そちら(Control Tower)を使って Config管理するのがいいでしょう。 こちらで作ったスタックは削除します。
[アクション] → [StackSet からスタック削除] を選択します。
展開されているアカウントをカンマ区切りで指定します(組織単位の指定でも可)。 取り消したいリージョンを指定します。
上記設定で削除を実行します。
おわりに
AWS Control Towerがまだ未対応のリージョン (2021/08/25 時点では 大阪および北カリフォルニア)の Config記録を有効化してみました。
Control Tower の制約上、Service Managed(Organizations連携)なスタックセットは 展開できない点、注意が必要です。 アカウントが増えたときの自動対応も、基本的に作り込みが必要です。
ちなみに AWSからは以下ソリューションが紹介されています。
こちらを使っても 同じConfig有効化が可能です。 さらにアグリゲータ設定やConformance Packs の展開もできます。 アカウントが増えたときの自動対応もパラメータで設定できます。
より 『Control Tower 環境に寄せたい』場合はこちらを使いましょう。 1つ注意点として、2021/08/25現在 大阪リージョンでは Configアグリゲータが対応していないため このソリューションが展開できません。
『とりあえずConfigを有効化しておきたい』ぐらいのレベルであれば、 今回のブログに紹介した内容で問題ないでしょう。