AWS Control Tower がサポートしていないリージョンで Configを有効化する
やりたいこと
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を有効化しておきたい』ぐらいのレベルであれば、 今回のブログに紹介した内容で問題ないでしょう。