
Claude Code の Skills で AWS リージョン制限の事前調査を自動化してみた
こんにちは!クラウド事業本部のおつまみです。
みなさん、AWS環境にSCP(Service Control Policy)でリージョン制限をかけたいと思ったことはありますか?私はあります。
セキュリティ強化やコスト管理の観点から、利用するリージョンを東京・大阪・バージニア北部などに絞りたい場面は多いと思います。
クラスメソッドでは、メンバーズのお客様向けに セキュアアカウント というサービスの一機能として、ポータルから数分でリージョン制限を有効化・無効化できる仕組みを無料で提供しています。
ただ、実際に制限をかける前に「今どのリージョンにリソースが存在するか」を把握しておかないと、予期せずリソースが使えなくなるリスクがあります。
この事前調査、手動でやろうとすると EC2・RDS・Lambda・ECS など主要なAWSサービスを全リージョン分チェックする必要があり、かなりの手間です。
そこで、Claude Code Skillsを使って、この調査作業を自動化する aws-region-investigation スキルを作ったので、ご紹介します。
作ったスキル
スキル名: aws-region-investigation
リポジトリ:
目的: SCP によるリージョン制限を導入する前に、許可外リージョンに存在するリソースを網羅的に調査し、マークダウン形式の調査報告書を自動生成する
調査対象サービス
業務利用が多い主要サービスを中心にしています。
| カテゴリ | サービス |
|---|---|
| コンピュート | EC2, Lambda, ECS, EKS, SageMaker |
| ストレージ | EBS, EFS, FSx, S3(バケットリージョン) |
| データベース | RDS, ElastiCache, OpenSearch, Redshift, DynamoDB |
| ネットワーク | VPC, Elastic IP, NAT Gateway, ELB/ALB/NLB, VPN接続, Direct Connect |
| コンテナ | ECR |
| メッセージング | SQS, SNS, Kinesis, MSK |
| 管理・運用 | CloudFormation, Secrets Manager, SSMパラメータ, CloudWatchアラーム |
| 分析 | Glue, Athena |
| その他 | Step Functions, EventBridge, WAF, Backup, Transfer Family |
スキルのファイル構成
~/.claude/skills/aws-region-investigation/
├── skill.md # スキルの説明・実行手順(Claude が読む)
├── config.example.toml # 設定ファイルのテンプレート
└── scripts/
└── investigate_regions.py # 調査スクリプト本体
skill.md は Claude への説明書で、「どんな作業か」「どのコマンドを実行するか」「オプションは何か」を記述しています。
Claude はこのファイルを読んで、適切なコマンドを組み立てて実行してくれます。
実際の SKILL.md はこのようになっています。
---
name: aws-region-investigation
description: AWSリージョン制限(SCP)導入に向けた事前調査スキル。許可リージョン以外でコストが発生しうるAWSリソースを網羅的に調査し、マークダウン形式の調査報告書を自動生成する。「リージョン制限の調査」「許可外リージョンのリソース調査」「SCP適用前の環境調査」などの依頼時に使用する。対象アカウントIDと許可リージョンは実行時に指定可能。
---
# AWSリージョン制限 事前調査スキル
## 概要
`scripts/investigate_regions.py` を実行し、許可外リージョンのリソースを調査してマークダウンレポートを生成する。
## 調査対象サービス(35種類)
EC2、RDS、Lambda、ECS、EKS、EBS、Elastic IP、VPC(カスタム)、CloudFormation、
ElastiCache、OpenSearch、Redshift、DynamoDB、Kinesis、SQS、SNS、ELB/ALB/NLB、
NAT Gateway、VPN接続、Direct Connect、ECR、Secrets Manager、SSMパラメータ、
SageMaker、Glue、Athena、Step Functions、EventBridge、CloudWatchアラーム、
WAF、FSx、EFS、Backup、Transfer Family、MSK、S3(バケットリージョン)
## 実行手順
### 1. 設定ファイルを準備する(推奨)
`config.example.toml` を `config.toml` としてコピーし、顧客ごとに編集する。
### 2. スクリプト実行
\`\`\`bash
# 設定ファイルを使う(推奨)
python3 ~/.claude/skills/aws-region-investigation/scripts/investigate_regions.py \
--config ./config.toml
\`\`\`
**優先順位:** コマンドライン引数 > config.toml > デフォルト値
### 3. レポート確認・補足
スクリプト完了後、生成されたマークダウンファイルの内容を確認し、以下を補足する:
- 検出されたリソースの対処方針(削除・移行・保留)
- 制限適用の推奨タイミング
- 必要に応じて Backlog チケット用テキストを作成
フロントマター(--- で囲まれた部分)の description が特に重要で、ここに書いたキーワードをもとに Claude がスキルを呼び出すトリガーを判断しています。
セットアップ方法
1. 設定ファイルを準備する
config.example.toml をコピーして config.toml を作成し、許可するリージョンを編集します。
cp ~/.claude/skills/aws-region-investigation/config.example.toml ./config.toml
config.toml の主要な設定項目は以下のとおりです。
[aws]
cli_path = "/opt/homebrew/bin/aws"
workers = 10 # 並列実行数
[regions]
allowed = [
"ap-northeast-1", # 東京
"ap-northeast-3", # 大阪
"us-east-1", # バージニア北部
"us-west-2", # オレゴン
]
[output]
dir = "."
prefix = "リージョン制限_事前調査報告" # 実行日付が自動付与される
allowed に指定したリージョンが「許可リージョン」として扱われ、それ以外のリージョンに存在するリソースが調査対象になります。
使ってみる
Claude Code に依頼する
Claude Code を起動して、日本語で依頼するだけです。
リージョン制限の調査をして
Claude がスキルを認識し、設定ファイルを確認しながら以下のコマンドを実行してくれます。
python3 ~/.claude/skills/aws-region-investigation/scripts/investigate_regions.py \
--config ./config.toml
コマンドライン引数での直接実行や、設定の一部上書きも可能です。
# 許可リージョンをコマンドラインで指定する場合
python3 ~/.claude/skills/aws-region-investigation/scripts/investigate_regions.py \
--allowed-regions ap-northeast-1 ap-northeast-3 us-east-1 us-west-2
# アカウントIDだけ上書きしたい場合(設定ファイルも使う)
python3 ~/.claude/skills/aws-region-investigation/scripts/investigate_regions.py \
--config ./config.toml --account-id 999999999999
オプション一覧
| オプション | 説明 |
|---|---|
--config |
設定ファイルパス(省略時はカレントの config.toml を自動探索) |
--allowed-regions |
許可リージョン(複数指定可) |
--account-id |
AWSアカウントID(省略時は自動取得) |
--output |
出力先ファイルパス |
--aws-cli |
AWS CLIのパス |
--workers |
並列実行数 |
優先順位は コマンドライン引数 > config.toml > デフォルト値 です。
実行時間について
並列数10での実行時間は 約3〜5分 です(リージョン数・ネットワーク速度に依存)。
- オプトイン未済リージョンは自動スキップ
- 権限不足のサービスはエラーで止まらずスキップ(調査続行)
- S3バケット数が多い場合は
--workersを増やすと改善することがあります
生成されるレポートの確認
調査完了後、以下の構成でマークダウンレポートが生成されます。
リージョン制限_事前調査報告_20260330.md
レポート構成
- サマリー - 検出リソース数・リージョン数の概要
- 許可外リージョンで検出されたリソース - サービス別の詳細テーブル
- S3バケット(許可外リージョン) - バケット名とリージョン
- リソースなし(オプトイン済み) - クリーンなリージョン一覧
- オプトイン未済リージョン - 未有効化リージョン一覧
- 参考SCPポリシー - 許可リージョンを反映した SCP JSON
実際に出力されたレポートはこのようになります。
実際のレポート出力例
# AWSリージョン制限 事前調査報告
| 項目 | 内容 |
|------|------|
| 対象アカウント | xxxxxxxxxxxx |
| 調査日時 | 2026-03-30 07:25 UTC |
| 許可リージョン | ap-northeast-1 |
---
## 1. サマリー
| 区分 | リージョン数 |
|------|------------|
| 許可外リージョン(リソースあり) | 2 |
| 許可外リージョン(リソースなし) | 14 |
| オプトイン未済 | 17 |
| S3バケット(許可外リージョン) | 16 |
> **⚠️ リージョン制限適用前に対処が必要なリソースが検出されました。**
---
## 2. 許可外リージョンで検出されたリソース
### ⚠️ us-west-2
#### Lambda
| Name | Runtime | Modified |
| --- | --- | --- |
| xxxxxxxxxxxxxxxxxx | nodejs12.x | 2020-05-27T08:38:42.813+0000 |
### ⚠️ us-east-1
#### EC2インスタンス
| ID | State | Type | Name | Launch |
| --- | --- | --- | --- | --- |
| i-xxxxxxxxxxxxxxxxx | stopped | t2.small | aws-cloud9-xxxxxxxx | 2020-05-27T07:19:14+00:00 |
| i-xxxxxxxxxxxxxxxxx | stopped | t3.small | aws-cloud9-xxxxxxxx | 2020-12-04T08:36:36+00:00 |
#### Lambda
| Name | Runtime | Modified |
| --- | --- | --- |
| xxxxxxxxxxxxxxxxxx | nodejs14.x | 2023-01-24T01:03:21.208+0000 |
| xxxxxxxxxxxxxxxxxx | nodejs6.10 | 2019-05-31T00:41:17.274+0000 |
| xxxxxxxxxxxxxxxxxx | nodejs18.x | 2023-11-24T06:07:51.676+0000 |
| xxxxxxxxxxxxxxxxxx | nodejs6.10 | 2018-07-29T11:58:27.363+0000 |
| xxxxxxxxxxxxxxxxxx | nodejs14.x | 2022-06-02T10:40:53.000+0000 |
| xxxxxxxxxxxxxxxxxx | python3.7 | 2020-03-12T05:53:41.335+0000 |
#### EBS ボリューム
| ID | Size | State | Type |
| --- | --- | --- | --- |
| vol-xxxxxxxxxxxxxxxxx | 8 | in-use | gp2 |
| vol-xxxxxxxxxxxxxxxxx | 10 | in-use | gp2 |
#### Elastic IP
| IP | Instance | Domain |
| --- | --- | --- |
| xxx.xxx.xxx.xxx | None | vpc |
#### CloudFormation スタック
| Name | Status |
| --- | --- |
| xxxxxxxxxxxxxxxxxx | CREATE_COMPLETE |
| CDKToolkit | CREATE_COMPLETE |
| xxxxxxxxxxxxxxxxxx | CREATE_COMPLETE |
| aws-cloud9-xxxxxxxx | CREATE_COMPLETE |
| xxxxxxxxxxxxxxxxxx | CREATE_COMPLETE |
| aws-cloud9-xxxxxxxx | CREATE_COMPLETE |
#### SNS トピック
| ARN |
| --- |
| arn:aws:sns:us-east-1:xxxxxxxxxxxx:xxxxxxxxxx |
| arn:aws:sns:us-east-1:xxxxxxxxxxxx:xxxxxxxxxx |
| arn:aws:sns:us-east-1:xxxxxxxxxxxx:xxxxxxxxxx |
#### ECR リポジトリ
| Name | URI |
| --- | --- |
| cdk-xxxxxxxxx-container-assets-xxxxxxxxxxxx-us-east-1 | xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/cdk-xxxxxxxxx-container-assets-xxxxxxxxxxxx-us-east-1 |
#### Systems Manager パラメータ
| Name | Type |
| --- | --- |
| /cdk-bootstrap/xxxxxxxxx/version | String |
| xxxxxxxxxxxxxxxxxx | String |
---
## 3. S3バケット(許可外リージョン)
| バケット名 | リージョン |
|-----------|-----------|
| xxxxxxxxxxxxxxxxxx | us-west-2 |
| cloudtrail-ap-northeast-2-xxxxxxxxxxxx | ap-northeast-2 |
| cloudtrail-ap-south-1-xxxxxxxxxxxx | ap-south-1 |
| cloudtrail-ap-southeast-1-xxxxxxxxxxxx | ap-southeast-1 |
| cloudtrail-ap-southeast-2-xxxxxxxxxxxx | ap-southeast-2 |
| cloudtrail-ca-central-1-xxxxxxxxxxxx | ca-central-1 |
| cloudtrail-eu-central-1-xxxxxxxxxxxx | eu-central-1 |
| cloudtrail-eu-west-1-xxxxxxxxxxxx | eu-west-1 |
| cloudtrail-eu-west-2-xxxxxxxxxxxx | eu-west-2 |
| cloudtrail-eu-west-3-xxxxxxxxxxxx | eu-west-3 |
| cloudtrail-sa-east-1-xxxxxxxxxxxx | sa-east-1 |
| cloudtrail-us-east-2-xxxxxxxxxxxx | us-east-2 |
| cloudtrail-us-west-1-xxxxxxxxxxxx | us-west-1 |
| cloudtrail-us-west-2-xxxxxxxxxxxx | us-west-2 |
| xxxxxxxxxxxxxxxxxx | ap-southeast-2 |
| xxxxxxxxxxxxxxxxxx | us-west-2 |
---
## 4. リソースなし(オプトイン済み)
`ap-northeast-3`, `us-west-1`, `ap-south-1`, `ca-central-1`, `eu-central-1`, `eu-west-3`, `eu-west-1`, `ap-northeast-2`, `eu-west-2`, `eu-north-1`, `ap-southeast-1`, `ap-southeast-2`, `us-east-2`, `sa-east-1`
---
## 5. オプトイン未済リージョン
`ap-east-2`, `ap-south-2`, `mx-central-1`, `eu-south-2`, `eu-south-1`, `me-central-1`, `il-central-1`, `eu-central-2`, `af-south-1`, `me-south-1`, `ap-east-1`, `ca-west-1`, `ap-southeast-3`, `ap-southeast-4`, `ap-southeast-5`, `ap-southeast-6`, `ap-southeast-7`
---
## 6. 参考:SCPリージョン制限ポリシー
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyNonApprovedRegions",
"Effect": "Deny",
"NotAction": [
"iam:*", "organizations:*", "support:*",
"cloudfront:*", "waf:*", "route53:*", "sts:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": ["ap-northeast-1"]
}
}
}
]
}
注意: IAM、Organizations、Route53、CloudFront等のグローバルサービスは NotAction で除外すること。
6番目の参考 SCP ポリシーは、許可リージョンがそのまま埋め込まれた状態で出力されるため、そのまま AWS Organizations に適用する際の参考として使えます。
最後に
Claude Code の Skills に「調査手順 + スクリプト」をセットで登録しておくと、定型的なインフラ調査作業を大幅に効率化できます。
今回の aws-region-investigation スキルは、SCP 導入前の事前調査という特定用途ですが、同じ仕組みで「コスト最適化の調査」「未使用リソースの棚卸し」なども作れそうだな〜と思っています。
AWS 環境のリージョン制限導入を検討している方の参考になれば幸いです。
最後までお読みいただきありがとうございました。
以上、おつまみ(@AWS11077)でした!









