CloudFormation で特定リージョンの Config のみ有効化する方法を考えてみた

CloudFormation で特定リージョンの Config のみ有効化する方法を考えてみました。
2022.07.01

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

こんにちは。アノテーションの中村 (誠) です。
今回は CloudFormation で特定リージョンの Config のみ有効化する方法を考えてみたので紹介します。

結論

以下の方法で実現しました。

  • AWS CLI の cloudformation create-stack コマンドを使用する
  • リージョン情報は配列に保持する
  • cloudformation create-stack コマンド実行時に、--region オプションで配列内のリージョンを指定する

きっかけ

以下の 3 点がきっかけで、今回の方法を考えるに至りました。

  • 全リージョンで AWS Config を有効化することによるコストを抑えたい
  • 各リージョンのマネジメントコンソールから作業することの運用負荷を軽減したい
  • AWS Organizations を使用していない単一アカウント環境で、StackSets を使用せずに実現する方法を模索していた

注意点

AWS Config のベストプラクティスは、すべてのアカウントとすべてのリージョンで AWS Config を有効化することです。

AWS Config ベストプラクティス | Amazon Web Services ブログ より

1.すべてのアカウントとリージョンで AWS Config を有効にします。
これは、 Center for Internet Security (CIS) が推奨する業界のベストプラクティスです。AWS Config を使用すると、AWS リソースの設定を監査し、設定のベストプラクティスに確実に準拠することができます。 AWS CloudFormation StackSets を使用すると、共通の CloudFormation テンプレートを使用して、複数のアカウントとリージョンで AWS Config を有効にできます。

今回紹介する方法は、個人的に考えてみた内容であり、AWS のベストプラクティスではない点にご注意ください。

参考にした資料

今回の方法を考えるにあたり、以下のブログを参考にしました。

上記のブログで紹介されている CloudFormation テンプレートを使用しました。
ブログ内のテンプレートでは、グローバルリソースの記録を us-east-1 でのみ有効化できるようになっており、冒頭に記載したコストを抑えたいという目的にも合致しています。

2 つ目のブログでは、全リージョンを取得するコマンドが紹介されており、ループ処理のヒントになりました。

aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  echo "##### enable GuardDuty in ${region}"
  aws --region ${region} guardduty create-detector --enable
done

今回は上記のループ処理を参考に、特定のリージョンのみに限定することと、cloudformation create-stack コマンドを使用するよう書き換えました。

作成したスクリプト

今回作成したスクリプトは以下の通りです。

regions=(us-east-1 ap-northeast-1)

for region in "${regions[@]}"
do
    echo "$region"
    aws cloudformation create-stack \
    --stack-name sample-stack \
    --template-body file://template.yaml \
    --parameters ParameterKey=ConfigName,ParameterValue=my-config-name ParameterKey=S3Bucket,ParameterValue=my-config-bucket-hogehoge \
    --region "$region"
done

ポイントは以下の点です。

  • Config を有効化するリージョンを regions という配列に保持
  • ループ処理内で配列のリージョンを取得
  • ループ処理内で cloudformation create-stack コマンドを実行してテンプレートを展開
  • テンプレートの展開先リージョンを --region オプションで指定

スタック名、テンプレート名は任意です。
また、2 つの ParameterValue についても任意の名前で問題ありませんが、ParameterKey=S3BucketParameterValue は S3 バケットの名前になるので、後述する既存の S3 バケットの名前を指定します。

S3 バケットについて

今回使用するテンプレートでは、Config で使用する S3 バケットを事前に作成しておく必要があります。
また、S3 バケットには Config からアクセスを許可するバケットポリシーを記載します。バケットポリシーについては、以下の AWS 公式ドキュメントに記載例があるので、そちらを利用します。

Amazon S3 バケットのアクセス許可 - AWS Config

CloudShell でスクリプトを実行

上記の準備をした後で、今回は CloudShell でスクリプトを実行してみました。
事前準備として、CloudShell にテンプレートファイルをアップロードしました。

CloudShell 上でスクリプトを実行します。

実行後に、指定したリージョンで Config が有効化されていることを確認しました。
また、グローバルリソースの記録は us-east-1 でのみ有効化されていることも確認できました。

まとめ

今回は CloudFormation で特定リージョンの Config のみ有効化する方法を考えてみたので紹介しました。
あらためてにはなりますが、AWS Config のベストプラクティスは、すべてのアカウントとすべてのリージョンで AWS Config を有効化することです。

ただし、検証環境などでコストが気になる場合には、今回のような方法もあるかと思い、紹介しました。
一例として参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。