AWS Configのリソースタイプ指定が厳格化されたのでリージョンごとに対応する
こんにちは。サービス開発室の武田です。
弊社ではAWSアカウントの初期設定として、複数リージョンにまたがってAWS Configを有効化する運用をしています。2025年9月25日4時ごろ(JST)からAWS Config有効化に失敗し、アカウント初期設定が停止するという問題が発生しました。一部のリージョンでAWS ConfigのAPI呼び出しがValidationException
を返すようになったのです。
本記事では、この問題の原因調査から対応方法の実装、実際の対処方法まで紹介します。
問題の発覚
最初に気付いたのは、put_configuration_recorder
APIを呼び出した際にValidationExceptionが発生するケースでした。これまで動いていたコードが急にエラーを出すようになったのです。
# これまで動いていたコード
config.put_configuration_recorder(
ConfigurationRecorder={
"name": "default",
"recordingGroup": {
"allSupported": False,
"includeGlobalResourceTypes": False,
"resourceTypes": [
"AWS::Budgets::BudgetsAction", # 全てのリージョンでサポートしているわけではない
# ... 他のリソースタイプ
]
},
"roleARN": f"arn:aws:iam::{account_id}:role/..."
}
)
エラーメッセージを確認すると、特定のリソースタイプが「そのリージョンではサポートされていない」というものでした。
An error occurred (ValidationException) when calling the PutConfigurationRecorder operation: The resource type you specified is not supported by AWS Config. Verify the following resource type, and try again: AWS::Budgets::BudgetsAction
原因を調べてみた
調査の結果、AWS側でリソースタイプの指定について厳格化され、次の仕様変更をしていたという結論に至りました。
- 以前: 未対応のリソースタイプを指定しても問題なし
- 現在: 未対応のリソースタイプを指定すると
ValidationException
が発生
これにより、全リージョン共通の設定ファイルを使っていた実装が動かなくなったのです。
具体例:Budgetsのケース
たとえば、AWS::Budgets::BudgetsAction
はバージニア北部リージョン(us-east-1)など一部リージョンのみ利用可能で、すべてのリージョンでは対応していません。対応していないリージョンで指定するとエラーになります。
同様に、IoT関連のリソースタイプ、Pinpoint、Connect、WorkSpacesなどは、リージョンによって対応状況が異なります。
対応リソースタイプの調べ方
では、どのリソースタイプがどのリージョンで対応しているかを調べるにはどうすればよいでしょうか?いくつか方法を試してみました。
方法1: 公式ドキュメントで確認
AWS Configのリソースタイプごとのリージョン対応状況は、公式ドキュメントで確認できます。
この方法では数百種類のリソースタイプとリージョンの組み合わせを確認する必要があるため、網羅的にすべてのリソースタイプを調べることが現実的ではありません。とはいえドキュメントとしてはこれに頼るよりなく、AIの力も借りて調査しました。ただし、このページは完全なリストとはなっていないようで、記載されていないリソースタイプでエラーになることもありました。
方法2: 実際に試してエラーを確認
実際にリソースタイプを指定してConfiguration Recorderを作成し、ValidationExceptionが返ってくるかを確認する方法です。
# 試しに設定してエラーを確認
aws configservice put-configuration-recorder \
--configuration-recorder name=test,roleARN=arn:aws:iam::123456789012:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig \
--recording-group allSupported=false,includeGlobalResourceTypes=false,resourceTypes=[AWS::Budgets::BudgetsAction] \
--region ap-northeast-1
# ValidationExceptionが返ってくれば未対応
ただし、ValidationExceptionは一度に1つのリソースタイプしか教えてくれない ため、数百種類のリソースタイプをこの方法で確認するのはかなりたいへんです。
方法3: マネジメントコンソールで確認
実はもっとも簡単な方法は、AWSマネジメントコンソールでConfiguration Recorderの設定画面を開く ことです。
- 対象リージョンのAWS Configコンソールを開く
- 顧客管理レコーダーの「編集」を選択
- 「特定のリソースタイプ」を選択し
- リソースタイプの一覧から選択しようとすると、そのリージョンで利用可能なリソースタイプのみが表示される
この方法なら、視覚的に確認でき、そのリージョンで対応しているリソースタイプが一目瞭然ですね。ただし、リージョンごとにコンソール画面を切り替えながら調べる必要がある ため、全リージョンを網羅的に確認するのは手間がかかります。主要なリージョン(us-east-1、ap-northeast-1など)だけを確認するならお勧めです。
実際に対応してみた
リージョンごとに異なる対応状況へ対処するため、今回は次のような実装をしました。
対応1: デフォルト設定ファイルの用意
まず、すべてのリージョンで共通的に使えるリソースタイプをデフォルトとして定義します。これがベースラインになります。
// recording_group/default.json
{
"allSupported": false,
"includeGlobalResourceTypes": false,
"resourceTypes": [
"AWS::EC2::Instance",
"AWS::S3::Bucket",
"AWS::Lambda::Function",
// ... 共通的なリソースタイプのみ
]
}
対応2: リージョン固有の除外リストを作成
各リージョンで対応していないリソースタイプを列挙します。
// recording_group/exclude_eu-west-3.json
{
"description": "Europe (Paris) - IoT、Pinpoint等が未サポート",
"region": "eu-west-3",
"excludeResourceTypes": [
"AWS::AppStream::Application",
"AWS::IoTAnalytics::Channel",
"AWS::Pinpoint::App",
"AWS::WorkSpaces::Workspace",
// ... 該当リージョンで未対応のリソースタイプ
]
}
対応3: 実装側で動的に除外処理
Pythonコードでデフォルト設定から除外リストを差し引きます。
# デフォルトの設定を読み込む
recording_group = json.loads(
Path(f"recording_group/default.json").read_text()
)
# 除外リソースタイプを適用
exclude_file = Path(f"recording_group/exclude_{region}.json")
if exclude_file.exists():
with open(exclude_file) as f:
data = json.load(f)
excluded_types = set(data.get("excludeResourceTypes", []))
recording_group["resourceTypes"] = sorted(
list(set(recording_group["resourceTypes"]) - excluded_types)
)
対応4: ValidationExceptionは警告にとどめる
それでも未対応のリソースタイプが混入してエラーになる可能性を考慮し、ValidationExceptionが発生した場合は警告ログを出力して次のリージョンへ進むようにしました。
try:
config.put_configuration_recorder(...)
config.put_delivery_channel(...)
config.start_configuration_recorder(...)
except ClientError as e:
if e.response["Error"]["Code"] != "ValidationException":
raise # ValidationException以外は再スロー
logger.warning(f"AWS Config 有効化に失敗しました。: {e}")
これにより、一部のリージョンで問題があっても全体の処理は継続できるようになりました。
全リソース記録だと簡単
ここまで説明した方法は、特定のリソースタイプだけを記録する場合の対応です。
もし すべてのリソースを記録する 設定なら、話は簡単です。
{
"allSupported": true,
"includeGlobalResourceTypes": true
}
allSupported: true
を指定すれば、AWS側が自動的にそのリージョンで対応しているリソースタイプのみを記録対象にしてくれるため、リージョンごとの差異を気にする必要がありません。
ただし、すべてのリソースを記録するとコストが増加するため、必要なリソースタイプのみを選択的に記録したい場合は、本記事で紹介した方法が必要になります。
なお、コストを抑えつつ全リソースを記録したい場合は、日次記録(Daily Recording)を採用する という選択肢もあります。日次記録では、変更があったリソースのみを1日1回記録するため、継続的な記録と比べてコストを大幅に削減できます。この場合もallSupported: true
を使えば、リージョンごとのリソースタイプ管理は不要です。
まとめ
AWS Configのリソースタイプ指定が厳格化されたことで、複数リージョンでの有効化において次の対応が必要になりました。
- リージョンごとの対応状況を把握する
- デフォルト設定と除外リストを組み合わせた設定管理
- ValidationException発生時のハンドリング
この変更は、AWS側のサービス品質向上の一環と思われますが、既存の実装に影響を与える可能性があります。複数リージョンでAWS Configを運用している場合は、同様の問題が発生していないか確認することをお勧めします。
また、コスト面で問題がなければallSupported: true
を使う方がメンテナンスの手間が少なく、推奨できる選択肢です。