1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

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を使って週次コストレポートを自動生成し、コスト急増の原因を特定する方法をご紹介しました。

朝会でこのレポートを共有したところ、こんなフィードバックをもらいました。

「インスタンスIDだけだと、誰が作ったかわからない。作成者が見えると嬉しい」

確かに、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ユーザーの作成

  1. IAMコンソール → ユーザー → ユーザーを作成
  2. ユーザー名: mcp-readonly(任意)
  3. 「AWSマネジメントコンソールへのアクセスを提供する」にチェック
  4. 許可ポリシーで ReadOnlyAccess をアタッチ
  5. ユーザー作成後、インラインポリシー 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.jsonmcpServers セクションに以下を追加します。

"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で詳細を取得)

「aws-mcpを使って、このインスタンスのNameタグと作成者を教えて」

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権限が正しく機能しているか、書き込み操作を試みて拒否されることを確認します。

「aws-mcpを使って、テスト用のEC2インスタンスを作成して」

An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation.

ReadOnlyAccessポリシーにより、書き込み操作は拒否されます。AIエージェントが誤ってリソースを作成・変更・削除するリスクがゼロになります。

同様に、機密情報へのアクセスも確認します。

「aws-mcpを使って、Secrets Managerのシークレット値を取得して」

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.またはその関連会社の商標です。

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード