この記事は公開されてから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
以上です。