記事公開日
AWS MCPサーバーをReadOnlyで安全に連携し、コストレポートに「誰が作ったか」を可視化してみた

この記事のポイント
AWSのコストレポート運用において、「誰がリソースを作成したか不明」という課題を解決するため、マネージド版AWS MCPサーバーを導入した事例を紹介します。筆者独自の3層構造のIAMガードレール設計により、AIエージェントに権限を渡す際のリスクを最小化し、安全なReadOnly環境を構築した実践的な検証プロセスを解説しています。
- 15,000以上のAWS APIを統合するマネージド版MCPの活用:
OSS版とは異なり、マネージド版はEC2やCloudTrailなど15,000以上のAPIをカバーします。これにより、インスタンスIDに加えてNameタグや作成者の詳細情報まで取得可能になります。 - 公式情報に基づく安全なセットアップ:
AWS公式ブログやドキュメントを参照しながら、mcp.jsonの設定方法や、MCP専用IAMユーザーにおける「aws login」を用いたアクセスキー不要の認証手順を詳しく解説しています。 - 筆者独自の3層ガードレール設計と書き込み拒否の検証:
ReadOnlyAccessに加え、機密情報(Secrets ManagerやKMS復号)へのアクセスを明示的にDenyするカスタムポリシーを設計。実際にテスト用のインスタンス作成を試みてエラー(UnauthorizedOperation)になることを確認し、運用上の安全性を実証しています。
はじめに
こんにちは。DXソリューション営業本部の岡田です。
前回の記事では、Kiro PowersのAWS Cost Optimization Powerを使って週次コストレポートを自動生成し、コスト急増の原因を特定する方法をご紹介しました。
朝会でこのレポートを共有したところ、こんなフィードバックをもらいました。
確かに、Cost Explorer APIで取得できるのはインスタンスIDとコスト金額だけ。「このリソース消していいの?」を判断するには、誰が・いつ・何のために作ったかが必要です。
| 情報 | Cost Explorer API(前回) | AWS MCPサーバー(今回追加) |
|---|---|---|
| コスト金額 | ✅ 取得可能 | 対象外(取得可能だが今回の構成では使用しない) |
| インスタンスID | ✅ 取得可能 | ✅ 取得可能 |
| Nameタグ | ❌ 取得不可 | ✅ DescribeInstances |
| 作成者 | ❌ 取得不可 | ✅ CloudTrail LookupEvents |
| インスタンスタイプ | ❌ 取得不可 | ✅ DescribeInstances |
そこで今回は、AIエージェントにAWS環境を探索させてこれらの情報を取得するため、「マネージド版AWS MCPサーバー」を追加することにしました。
ただし、AIエージェントにAWSの操作権限を渡す際、誤ったリソースの削除や変更といったトラブルを防ぐためには「ReadOnly(読み取り専用)」での運用が鉄則です。
本記事では、最少権限のReadOnly構成で、安全にリソース情報を取得する手順を解説します。
マネージド版AWS MCPサーバーとは
AWS MCPサーバーには「OSS版」と「マネージド版」の2種類があります。
| OSS版(awslabs/mcp) | マネージド版(AWS MCP Server) | |
|---|---|---|
| 実行場所 | ローカル(stdio) | AWSがホスト(リモート) |
| セットアップ | ローカルにインストール | 接続するだけ |
| API範囲 | サーバーごとに特化 | 15,000以上のAWS APIを統合カバー |
| 認証 | ローカルのAWS認証情報 | IAMベース |
| 監査ログ | AWS APIコールのみ記録 | MCP操作含めCloudTrailに自動記録 |
| IAM条件キー | 使えない | aws:ViaAWSMCPService等が使える |
前回使ったAWS Cost Optimization PowerはOSS版で、コスト分析に特化しています。今回追加するマネージド版は、EC2やCloudTrailなど15,000以上のAWS APIに自然言語でアクセスできるため、Nameタグや作成者の取得に最適です。
AWS公式ブログ
ガードレール設計:ReadOnly + 機密情報Deny
AIエージェントにAWSの操作権限を渡すことにはリスクがあります。ReadOnlyであっても、機密情報の読み取りには注意が必要です。
今回は以下の3層構造でガードレールを設計しました。
┌─────────────────────────────────┐
│ Layer 3: 運用ルール │ ← Skill定義 / 手動確認
├─────────────────────────────────┤
│ Layer 2: IAMポリシー │ ← ReadOnly + 機密Deny
├─────────────────────────────────┤
│ Layer 1: IAMユーザー分離 │ ← MCP専用ユーザー
└─────────────────────────────────┘
IAMポリシー構成
MCP専用のIAMユーザーに以下の2つのポリシーをアタッチします。
1. ReadOnlyAccess(AWSマネージドポリシー)
EC2、CloudTrail等の全サービスの読み取り権限を付与します。書き込み操作は一切できません。
2. カスタムインラインポリシー(mcp-guardrail)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowMCPAccess",
"Effect": "Allow",
"Action": [
"aws-mcp:InvokeMcp",
"aws-mcp:CallReadOnlyTool",
"aws-mcp:CallReadWriteTool"
],
"Resource": "*"
},
{
"Sid": "DenySecretsAccess",
"Effect": "Deny",
"Action": [
"secretsmanager:GetSecretValue",
"ssm:GetParameter*",
"kms:Decrypt"
],
"Resource": "*"
}
]
}
ポイント:
- aws-mcp:CallReadWriteTool — 名前に反してS3の読み取り等にも必要なため許可しています。実際の書き込み防止はReadOnlyAccessポリシーで担保します。
- Secrets Manager / SSM Parameter Store — 認証情報・APIキーが格納されている可能性があるため明示的にDeny
- KMS Decrypt — 暗号化データの復号を防止
セットアップ手順
Step 1: MCP専用IAMユーザーの作成
- IAMコンソール → ユーザー → ユーザーを作成
- ユーザー名:
mcp-readonly(任意) - 「AWSマネジメントコンソールへのアクセスを提供する」にチェック
- 許可ポリシーで ReadOnlyAccess をアタッチ
- ユーザー作成後、インラインポリシー mcp-guardrail を追加(上記JSON)
Step 2: AWS CLIプロファイルの設定
aws login を使えばアクセスキー不要で認証できます。
aws login --profile mcp-readonly
ブラウザが開くので、作成したユーザーでログインします。
※ aws login を使う場合は、IAMユーザーに iam-local-development:CreateToken の許可が必要です。詳しくは下記ブログをご覧ください。
認証後、動作確認します。
aws sts get-caller-identity --profile mcp-readonly
{
"UserId": "AIDAXXXXXXXXXXXXXXXXX",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/mcp-readonly"
}
Step 3: Kiroのmcp.jsonに追加
AWS公式ドキュメントを参考に、~/.kiro/settings/mcp.json の mcpServers セクションに以下を追加します。
"aws-mcp": {
"command": "uvx",
"timeout": 100000,
"args": [
"mcp-proxy-for-aws@latest",
"https://aws-mcp.us-east-1.api.aws/mcp",
"--metadata",
"AWS_REGION=ap-northeast-1"
],
"env": {
"AWS_PROFILE": "mcp-readonly"
},
"disabled": false,
"autoApprove": []
}
Kiroを再起動すると、aws-mcpが接続されます。
実践:「誰が作った?」を特定する
前回のコストレポートで「NEW」として検出されたインスタンスの詳細を調べてみます。
Before(前回のレポート)
🖥️ 新規出現インスタンス(前回のレポート)
| インスタンスID | アカウント | 今週コスト | 備考 |
|---|---|---|---|
| i-0a1b2c3d4e5f67890 | 検証アカウント01 | $16.44 | NEW |
| i-0f9e8d7c6b5a43210 | 検証アカウント01 | $2.09 | NEW |
→ インスタンスIDとアカウント名だけ。誰が何のために作ったか不明。
After(aws-mcpで詳細を取得)
Kiroがaws-mcp経由でEC2 DescribeInstancesとCloudTrail LookupEventsを実行し、Nameタグと作成者を返してくれます。
🖥️ Nameタグ取得(EC2 DescribeInstances)
| インスタンスID | Name | タイプ | 状態 |
|---|---|---|---|
| i-0a1b2c3d4e5f67890 | example-app-prod-ec201 | m6i.large | stopped |
| i-0f9e8d7c6b5a43210 | bastion-server-prod | t3.medium | stopped |
👤 作成者特定(CloudTrail LookupEvents)
| インスタンスID | Name | 作成者 | 作成日 |
|---|---|---|---|
| i-0a1b2c3d4e5f67890 | example-app-prod-ec201 | user-a@example.co.jp | 2026-04-06 06:16 |
| i-0f9e8d7c6b5a43210 | bastion-server-prod | user-a@example.co.jp | 2026-02-16 02:37 |
→ 検証環境構築に伴うリソースと判明。担当者に直接確認可能に。
インスタンスIDだけだった情報が、Name(用途)・作成者・作成日まで一目でわかるようになりました。「このリソース消していいの?」がレポートを見るだけで判断できます。
全インスタンスの作成者一覧
検証アカウント内の全EC2インスタンスについても一括で調べられます。
📋 全インスタンス作成者一覧
| Name | 作成者 | 作成日 | タイプ |
|---|---|---|---|
| example-app-prod-ec201 | 担当者A | 2026-04-06 | m6i.large |
| bastion-server-prod | 担当者A | 2026-02-16 | t3.medium |
| data-gateway-prod | 担当者B | 2026-03-17 | m5.xlarge |
| ai-processor-dev | 担当者C | 2026-01-26 | t3.large |
| poc-environment | 90日超(ログ期限外) | 2024-03-08 | r6a.2xlarge |
※CloudTrailの保持期間(90日)を超えたインスタンスは作成者を特定できません
書き込み拒否の確認
ReadOnly権限が正しく機能しているか、書き込み操作を試みて拒否されることを確認します。
An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation.
ReadOnlyAccessポリシーにより、書き込み操作は拒否されます。AIエージェントが誤ってリソースを作成・変更・削除するリスクがゼロになります。
同様に、機密情報へのアクセスも確認します。
An error occurred (AccessDeniedException) when calling the GetSecretValue operation: User is not authorized to perform: secretsmanager:GetSecretValue
機密情報Denyポリシーにより、Secrets ManagerやSSM Parameter Storeの値は読み取れません。
まとめ
今回は、コストレポートの「誰が作ったかわからない」という課題を、マネージド版AWS MCPサーバー + ReadOnly権限で解決しました。
| 役割 | ツール | 権限 |
|---|---|---|
| コスト分析 | AWS Cost Optimization Power(OSS版) | Cost Explorer API |
| リソース詳細 | AWS MCPサーバー(マネージド版) | ReadOnly + 機密Deny |
- コストレポートで気になるリソースがあれば、aws-mcpに「誰が作った?」と聞くだけ
- ReadOnly権限なので、AIエージェントが誤ってリソースを変更するリスクはゼロ
- 機密情報Denyで、認証情報の漏洩リスクも防止
AIエージェントにAWSを触らせる際は、まずReadOnlyから始めて、習熟度に応じて権限を広げていくのがおすすめです。
ぜひみなさんもお試しください!
もし「このサービスについて知りたい」「AI・AWS活用のご相談」などのリクエストがございましたら、弊社お問い合わせフォームまでお気軽にご連絡ください。複雑な内容に関するお問い合わせの場合には直接営業からご連絡を差し上げます。また、よろしければ以下のリンクもご覧ください!
<QES関連ソリューション/ブログ>
<QESが参画しているAWSのセキュリティ推進コンソーシアムがホワイトペーパーを公開しました>
※Claude、Claude Codeは、Anthropic, PBCの商標または登録商標です。
※Amazon Web Services、"Powered by Amazon Web Services"ロゴ、およびブログで使用されるその他のAWS商標は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。


