AWS Configのすべてのリソース記録を全リージョンで有効化するPythonスクリプト書いた

こんにちは、臼田です。

皆さん、スクリプト書いてますか?

今回は主に弊社のお客様向けですが、AWS Configのすべてのリソース記録を全リージョンで有効化するスクリプトを書いたので共有します。

AWS Configの設定について

AWS ConfigはAWSの各種リソースについて、変更履歴を管理するサービスです。例えばEC2のインスタンスなら、いつ誰が作成して、誰がStopしたか、名前を変更したか、などリソースベースで辿ることができます。他にも、セキュリティグループの変更も取れるので、誤って広い範囲で公開してしまったのがいつのタイミングなのか、なども取れます。

そんなAWS Configですが、リソースの種類毎に取得する・しないを選択できます。セキュリティ的にはもちろん全て取得したほうがいいのですが、AWS Configの料金体系として設定項目の数をベースとした課金であるため、頻繁に設定項目が増えるような自動化がされている環境などでは結構な費用になることもあり環境によって絞る必要があります。

弊社では現状利用費がかかりすぎないようにリソースを絞る事をデフォルトとしていますが、セキュリティやコンプライアンス用件のためにこれを全有効化することがあり、そのためのスクリプトを書きました。

スクリプト

このスクリプトを利用する条件は下記のとおりです。

  • AWS Configは全リージョンで有効化してある
  • 各リージョンのAWS Configで利用しているRole・S3バケットは共通である

Python 3.6で書いてます。

import sys
import boto3

main_region = 'ap-northeast-1'
role_name = 'YOUR_ROLE_NAME'
account_id = boto3.client('sts').get_caller_identity()['Account']
s3_bucket_name = 'YOUR_BUCKET_NAME'

print('Account is: ' + account_id)
agree = input('Is it OK? (y/n): ')
if agree != 'y': sys.exit()

ec2 = boto3.client('ec2')
regions = ec2.describe_regions()['Regions']

try:
	for region in regions:
		region_name = region['RegionName']
		global_resource = True if region_name == main_region else False
		print(region_name)
		config = boto3.client('config', region_name=region_name)
		r = config.put_configuration_recorder(
			ConfigurationRecorder={
				'name': 'default',
				'roleARN': ''.join([
					'arn:aws:iam::',
					account_id,
					':role/',
					role_name]),
				'recordingGroup': {
					'allSupported': True,
					'includeGlobalResourceTypes': global_resource,
				}
			}
		)
		print(r)
except Exception as e:
	print(e)

流れは下記のようになっています。

  • ec2.describe_regions()で全リージョンを取得してループ
    • リージョンがメインリージョンならグローバルリソースの記録を有効化(True)
    • すべてのリソース記録を有効化するようにしてconfig.put_configuration_recorder()

これは設定の変更のみですが、boto3からAWS Configの有効化を実施する場合にはstart_configuration_recorder()を使う必要があったりして、マネジメントコンソールからだと見えない部分が多いので注意が必要です。またrecorderはdefaultのみ設定が可能です。詳細はboto3のドキュメントなどをご確認ください。

まとめ

限定的なユースケースですが、全リージョンを操作する必要がある処理は面倒なのでスクリプトを書くと楽になります。

ぜひいろんなスクリプトを書いて公開しましょう。