[小ネタ]CloudFormation StackSetsでConfigを全リージョン有効化しつつグローバルリソース記録は特定のリージョンのみで有効化する

グローバルリソースの記録は一つのリージョンだけにしよう
2022.04.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、おんづか(@onzuka_muscle)です!

AWSが公開しているAWS Configベストプラクティスをご覧になったことありますでしょうか。

その中に「3.1 つのリージョンでのみグローバルリソース (IAM リソースなど) を記録します。」という項目があります。

3.1 つのリージョンでのみグローバルリソース (IAM リソースなど) を記録します。 これにより、IAM 設定アイテムの冗長コピーをすべてのリージョンで取得することがなくなります。それは費用の節約にもなります。

グローバルリソース(IAMなど)とはリージョンに属さないリソースのことです。

全リージョンでConfigを有効化しておりそれぞれでグローバルリソース記録を有効にしている場合、あるグローバルリソースを変更するとその記録が全リージョンで行われてしまいます。

同じ内容を重複して記録してしまう上に、課金はリージョン毎に発生するので請求額が膨らみます。

それはもったいないので辞めようね、とうのがこのベストプラクティスの言いたいことになります。

こちらで実際に課金が膨らんでしまった話を紹介しています。(スライドが分かりやすい上に面白いのでおすすめです。)

さて本題ですがCloudFormation StackSetsを活用してConfigの全リージョン有効化をしつつ、このベストプラクティスに則ってみます。

テンプレート

CloudFormation StackSetsで展開するテンプレートです。

us-east-1でのみグローバルリソース記録を有効にするテンプレートになってます。

AWSTemplateFormatVersion: "2010-09-09"
# Configのグローバルリソース記録をus-east-1のみ有効にするための条件
Conditions:
  IncludeGlobalResourceRegion: !Equals [!Ref AWS::Region, us-east-1]
Parameters:
  ConfigName:
    Description: Config Name
    Type: String
  S3Bucket:
    Description: Bucket Name
    Type: String

Resources:
  AWSServiceRoleForConfig:
    Type: "AWS::IAM::ServiceLinkedRole"
    Properties:
      AWSServiceName: config.amazonaws.com
  ConfigRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: !Ref ConfigName
      RecordingGroup:
        AllSupported: true
        # Configのグローバルリソース記録をus-east-1のみ有効にする
        IncludeGlobalResourceTypes:
          !If [IncludeGlobalResourceRegion, true, false]
      RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig
  ConfigDeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      Name: !Ref ConfigName
      S3BucketName: !Ref S3Bucket

以下、抜粋して説明します。

Conditionsで「スタックが作成されるリージョンがus-east-1かどうか」を判定しています。

# Configのグローバルリソース記録をus-east-1のみ有効にするための条件
Conditions:
  IncludeGlobalResourceRegion: !Equals [!Ref AWS::Region, us-east-1]

IncludeGlobalResourceTypes(グローバルリソース記録するかどうか)で先ほどの条件を用いて有効・無効を切り替えています。

      RecordingGroup:
        AllSupported: true
        # Configのグローバルリソース記録をus-east-1のみ有効にする
        IncludeGlobalResourceTypes:
          !If [IncludeGlobalResourceRegion, true, false]

なおConfigの配信先S3バケットについては事前に用意しています。下記のアクセス許可が必要なので注意しましょう。

CloudFormation StackSetsで展開してみる

StackSetsを作成していきます。

利用可能な全リージョンを選択します。

StackSetsの作成が完了したらリージョン毎の設定を確認します。

us-east-1

ap-northeast-1

以上です。

参考