Claude Code の Skills で AWS リージョン制限の事前調査を自動化してみた

Claude Code の Skills で AWS リージョン制限の事前調査を自動化してみた

2026.03.30

こんにちは!クラウド事業本部のおつまみです。

みなさん、AWS環境にSCP(Service Control Policy)でリージョン制限をかけたいと思ったことはありますか?私はあります。

セキュリティ強化やコスト管理の観点から、利用するリージョンを東京・大阪・バージニア北部などに絞りたい場面は多いと思います。

クラスメソッドでは、メンバーズのお客様向けに セキュアアカウント というサービスの一機能として、ポータルから数分でリージョン制限を有効化・無効化できる仕組みを無料で提供しています。

https://classmethod.jp/aws/services/secure-account/#region-restrictions

ただ、実際に制限をかける前に「今どのリージョンにリソースが存在するか」を把握しておかないと、予期せずリソースが使えなくなるリスクがあります。

この事前調査、手動でやろうとすると EC2・RDS・Lambda・ECS など主要なAWSサービスを全リージョン分チェックする必要があり、かなりの手間です。

そこで、Claude Code Skillsを使って、この調査作業を自動化する aws-region-investigation スキルを作ったので、ご紹介します。

作ったスキル

スキル名: aws-region-investigation

リポジトリ:

https://github.com/o2mami-cm/claude-code-skill-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

レポート構成

  1. サマリー - 検出リソース数・リージョン数の概要
  2. 許可外リージョンで検出されたリソース - サービス別の詳細テーブル
  3. S3バケット(許可外リージョン) - バケット名とリージョン
  4. リソースなし(オプトイン済み) - クリーンなリージョン一覧
  5. オプトイン未済リージョン - 未有効化リージョン一覧
  6. 参考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)でした!

参考

この記事をシェアする

FacebookHatena blogX

関連記事