AWS Control Tower がサポートしていないリージョンで Configを有効化する

2021.08.25

やりたいこと

AWS Control Towerがまだ未対応のリージョン (2021/08/25 時点では 大阪および北カリフォルニア)の Config記録を有効化します。

図に表します。

img

なお、Control Tower 対応リージョンでは、 この設定は不要です。そのリージョンをControl Tower 管理下にすることで、 よしなに Config設定をしてくれます。

手順

  1. 前提条件
  2. ログアーカイブアカウントに Config用バケットを作成
  3. Config記録の有効化

1. 前提条件

Config記録はアカウント・リージョン毎に 1つしか作成できません。

なので事前に、対象のアカウント・リージョンの Configは無効化しておきましょう。

参考: コンソールから消せないConfigを全リージョンCLIから無効化する | DevelopersIO

2. ログアーカイブアカウントに Config用バケットを作成

img

事前にログアーカイブアカウントに 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です

img

3. Config記録の有効化

img

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 としてください。

img

これを指定する理由は Control Towerの予防的ガードレールがあるためです。 上記実行ロール以外は Config設定ができないようになっています。

アカウントは [スタックを組織単位にデプロイ] を選択。 組織番号に追加したいOUの1つのIDを入力します。 リージョンは現状 Control Tower が対応していない大阪、 および北カリフォルニアを選択します。

img

内容を確認して [送信] を選択します。

img

▼すべてのスタックインスタンスが CURRENT となればOKです

img

(オプション) スタックの追加

先程の作業で OU 1つ分 のアカウント群の設定が完了しました。 以降で他OUもスタックセットに追加する手順を説明します。

スタックセットのページで [アクション]→[StackSet にスタックを追加] を選択します。

同じように [スタックを組織単位にデプロイ] を選択、組織番号を入力します。

img

上書きの設定はデフォルトで、展開していきます。

img

▼すべてのスタックインスタンスが CURRENT となればOKです

img

上記までの作業をCT登録しているOU分行います。

確認

メンバーアカウントの Config設定

展開した北カリフォルニアのConfigを確認してみます。 Configが有効化されていました。

img

img

ログアーカイブアカウントのConfigバケット

ログアーカイブアカウントの Configバケットを確認します。 有効化したアカウント分、Config情報が格納されていること確認できました。

img

運用方法

CT管理のOUが増えたとき

『3. Config記録の有効化 > (オプション)スタックの追加』 の手順を使います。 新しい OU ID で展開することで対応できます。

OUに新規アカウントが追加されたとき

『3. Config記録の有効化 > (オプション)スタックの追加』 の手順を使います。 新規アカウントの所属するOU ID で展開することで対応できます。

特定リージョンのConfig有効化を取り消すとき

Control Tower 未対応リージョン(大阪もしくは北カリフォルニア) が Control Tower 対応になった場合は、 そちら(Control Tower)を使って Config管理するのがいいでしょう。 こちらで作ったスタックは削除します。

[アクション] → [StackSet からスタック削除] を選択します。

展開されているアカウントをカンマ区切りで指定します(組織単位の指定でも可)。 取り消したいリージョンを指定します。

img

上記設定で削除を実行します。

おわりに

AWS Control Towerがまだ未対応のリージョン (2021/08/25 時点では 大阪および北カリフォルニア)の Config記録を有効化してみました。

Control Tower の制約上、Service Managed(Organizations連携)なスタックセットは 展開できない点、注意が必要です。 アカウントが増えたときの自動対応も、基本的に作り込みが必要です。

ちなみに AWSからは以下ソリューションが紹介されています。

こちらを使っても 同じConfig有効化が可能です。 さらにアグリゲータ設定やConformance Packs の展開もできます。 アカウントが増えたときの自動対応もパラメータで設定できます。

より 『Control Tower 環境に寄せたい』場合はこちらを使いましょう。 1つ注意点として、2021/08/25現在 大阪リージョンでは Configアグリゲータが対応していないため このソリューションが展開できません。

『とりあえずConfigを有効化しておきたい』ぐらいのレベルであれば、 今回のブログに紹介した内容で問題ないでしょう。

参考