🗺️

手元のCLIエージェントにSSOでAWSを自動操作させるベストプラクティス~MCPサーバ選定とAWS CLI v2構築~(CC,Codex)

に公開

概要

AWSの上にLLMエージェントを構築するのではなく、手元からMCPサーバ等を活用して、手元のPC上のエージェントから,AWSリソースを安全に操作させるための資料です
グラフなど一部を除き全て自分で書きました

主な参考文献『AWSの基本の基本・仕組み・重要用語が全部わかる教科書』第7版

経緯(この記事で扱わないもの)

Amazon Bedrock(基盤), Kiro(VScodeをフォークしたIDE)のようにAWS上でAIを活用するマネージドサービスもいくつかありますが、各自が慣れ親しんだ任意のMCPクライアント(CC,Codex,Gemini CLI, Cursor等)から使う方が、クラウドの常駐コストも減り、別のシステム(私の場合スパコン)等と連携しやすいと考え、MCPサーバを選定するアプローチを探りました

対象

AWSアカウントを持っていない方やしばらく触っていない方でも、Claude CodeやCodex CLIエージェントを介してAWSのサービスを活用できるようにする記事です

AWS IAM Identity CenterユーザによるSSO認証が最新のベストプラクティスらしいので
IAMユーザの代わりにIAM Identity Centerのユーザーを0から作成する以下の手順に従ってアカウント開設とAWS Organizations作成までを済ませることを推奨します
https://zenn.dev/jawsug_bgnr/articles/758387f29c4c3e

AWS Organizationの有効化画面
6.AWS Identity Center設定の章まで推奨です

IAM Identity Center組織のリージョンはバージニア北部と迷うもレイテンシを重視し東京を選択
IAM Identity Centerの有効化画面

許可セットのセッション期間は、実際の作業時間を超えないようになるべく短く設定することが推奨されますが、エージェントの自律性を活かす方針で、最長の12時間を設定しました
IAM Identity Centerで許可セット指定
リレー状態は以下のようにアジアパシフィック(東京)をデフォルトにすると、誤った別リージョン操作を防止できる等の話がありますが、EC2のラインナップ上などで、東京以外のリージョンを選択することもあるだろうと思い、空欄のままにしておきました

https://ap-northeast-1.console.aws.amazon.com/ec2/

不要なIAMユーザ作成を含む手順

(AWS CLI使用時アクセスキーIAMユーザ認証は非推奨)
AWSアカウントを作成しRootユーザからIAMユーザを作成する流れが常識だった
https://dev.classmethod.jp/articles/aws-account-setup-guide-2024-05/
「即時で対策すべき設定」はIAMユーザの部分は省略可能

戦略

基本ローカルのPC上でGitHub WorktreeベースのマルチCLI並列エージェントを(KAMUI OS等で)制御し、既存のMCPサーバから、要件に合ったMCPのjsonを選んでもらいCLIエージェント起動時に渡す方針で進めます。

注意点

ローカルPCのコマンドプロンプト等にAWS CLIをインストールしてawsコマンドを直接Bashで実行させる場合は、profileを複数のエージェントでどう管理させるかの設計が重要です。その際,適切なMCPサーバを与えることで,スキーマや最新ドキュメントへのアクセスを充実させると共に,MCPサーバ使用時に期待される誤った操作に対する警告等が受けられる環境を整備しましょう。

AWS前提知識

インターフェース

サービス アイコン 説明
AWS マネジメントコンソール ManagementConsole_icon GUI(ブラウザ)でAWSを操作するインターフェース
AWS CLI CLI_icon コマンドラインでAWSを操作するインターフェース
AWS SDK SDK_icon プログラム(Python, JS等)からAWSを操作するAPI群

IaC (Infrastructure as Code) ツール

サービス アイコン 説明
AWS CloudFormation CloudFormation_icon yamlテンプレートでAWSリソースを管理するサービス
AWS CDK CDK_icon Python等でインフラを定義し、CloudFormationを生成する
Terraform Terraform AWSだけでなくGCPやAzureも対応したIaC

AWSだけでなくマルチクラウドに対応したIaCツールであるTerraformもMCPサーバが開発されています

Claude CodeでTerraformをMCPサーバ経由で使う系の記事

AWS CLIの認証ファイル構成

非推奨のIAMユーザ認証アクセスキーの場合

aws configure で設定した認証情報は、ユーザーのホームディレクトリ (~/.aws/) 以下に保存される。主に2つのファイルで管理する。

  1. ~/.aws/credentials (金庫 🔑)
    • 役割: 秘密の認証情報(固定キー)を保管する。
    • 内容: aws_access_key_idaws_secret_access_key のペア。
[default]
aws_access_key_id = AKIA...
aws_secret_access_key = wJalr...
  1. ~/.aws/config (設定・指示書 📄)
  • 役割: デフォルト設定(リージョン等)や、IAMロールの切り替え定義を記述する。
  • 内容: region, output。ロール切り替え用の role_arnsource_profile
[default]
region = ap-northeast-1
output = json

# 'default'の鍵を使って'admin-role'になる設定
[profile admin-role]
role_arn = arn:aws:iam::...:role/AdministratorRole
source_profile = default

関係性:
CLIやSDKは、configsource_profile の指示に基づき、credentials ファイルから秘密鍵を参照し、一時的なロール権限を取得する。


AWS CloudFormation

IaC(yaml + ファンクション)形式の基盤自動化サービス
※ファンクションだけで以下のような簡単な制御は実現可能

  • パラメタ参照
  • 文字列操作
  • 条件判定

AWS CDK

複雑な制御を行う場合は、CDK(Cloud Development Kit)を利用すると主要な言語(Python, TypeScript...)で処理を書きCloudFormationテンプレートを生成できる


AWS CLI

AWS CLI v2のインストール

DockerまたはOSネイティブのターミナルにインストール※v2推奨
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
Windows11に.msiでインストールする場合※デフォルト設定のままNEXTボタンを選択
Windowsで.msiでインストールする画面
WSLから使いたい場合はGUIではなくコマンドラインでのインストールになると思います
以下のように表示されればインストールは完了です

C:\Users\ユーザ名>aws --version
aws-cli/2.31.37 Python/3.13.9 Windows/11 exe/AMD64

AWS CLI v2のSSO認証(最長12時間おきに必要)

https://qiita.com/zzzzico/items/35d9a65951fb8f57c5b2
上記の記事より引用
Identity Center によるユーザー管理では、アクセスキーの手動発行や個別発行は行われません。 厳密には IAM ユーザーにおけるアクセスキーようなものは管理者によって発行されるものではなく、各自がコマンドラインでの対話的な操作を通して認証情報を自動作成しローカルに保存します。
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html
セッション名を作成し、IAM Identity Center の開始 URL または発行者 URL、IAM Identity Center ディレクトリをホストする AWS リージョン、および登録スコープを指定します。

$ aws configure sso
SSO session name (Recommended): my-sso
SSO start URL [None]: https://{各自のアクセスポータルのURL}.awsapps.com/start
SSO region [None]: ap-northeast-1
SSO registration scopes [None]: sso:account:access

AWS CLI バージョン 2.22.0以降では、Proof Key for Code Exchange (PKCE) 認証がデフォルトで使用されます。ブラウザ搭載デバイスでは、PKCE 認証を使用する必要があります。デバイス認証を引き続き使用するには、--use-device-codeオプションを追加してください。

$ aws configure sso --use-device-code

ブラウザ認証後、続けてfirst-test等のprofile名を設定

Default client Region [None]:ap-northeast-1
CLI default output format (json if not specified) [None]:
Profile name [{付与した許可セット名}-{AWSアカウントID(12桁の数字)}]: first-test

具体的な手順はこちら
https://qiita.com/tyskJ/items/0fdf79c818930775773e

非推奨(IAMユーザによる有効期限のない認証)

aws configureコマンドで以下を事前に設定

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

Session Manager プラグイン

加えてSession Manager プラグインをインストールすると後述するEC2へのSSHの代替ツール
としてEC2へSSH接続時のセットアップが不要になるので推奨です
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
以下の表示になればインストール完了です
インストール完了時の表示


AWSマネジメントコンソール

AWS Access Key等の発行はWEB上のGUIで手動で行う必要がありますが、SSO方式では不要です

https://dev.classmethod.jp/articles/aws-cloudshell-supports-amazon-q-cli/

AWS関連MCPサーバ

AWS公式MCP

https://github.com/awslabs/mcp/tree/main

https://github.com/awslabs/mcp/tree/main/src に50を超えるMCPサーバが実装されています
全てのMCPサーバはuv, uvxまたはdockerで動かせるjsonが提供されています

ただし、以下のMCPサーバは、実装を公開せずHTTP経由でアクセスする手順を含むREADME.mdのみが提供されています。頻繁なアップデートを想定した選択だと思います。
AWS の公式ドキュメントから直接情報を取得できるAWS Knowledge MCP Server

【メモ】外部のmcp-proxy等を使わずMCP Python SDKのfastmcpでstdio→http対応が完結

MCPクライアントがHTTPトランスポートをサポートしていない場合やトラブル時、fastmcpユーティリティを使用してstdioからHTTPトランスポートにプロキシすることができます。

{
  "mcpServers": {
    "aws-knowledge-mcp-server": {
      "command": "uvx",
      "args": ["fastmcp", "run", "https://knowledge-mcp.global.api.aws"]
    }
  }
}

不必要なMCPでLLMのコンテキストを圧迫しない策としてCore MCP ServerによるDynamic Proxy Server Strategyが提供されており、awslabs.core-mcp-server1つ追加するだけで良く、実際に与えるMCPサーバ群をenvで調整できる

{
  "mcpServers": {
    "awslabs.core-mcp-server": {
      "command": "uvx",
      "args": [
        "awslabs.core-mcp-server@latest"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR",
        "aws-foundation": "true",
        "solutions-architect": "true"
        // Add other roles as needed
      },
      "autoApprove": [],
      "disabled": false
    }
  }
}

この場合、以下のMCPが重複排除されて提供される

core-mcp-serverの"env"で設定したロール 有効化されるMCPサーバセット
"aws-foundation" aws-knowledge-server, aws-api-server
"solutions-architect" diagram-server, pricing-server, cost-explorer-server, syntheticdata-server, (aws-knowledge-server※重複)

詳細はこちら
https://awslabs.github.io/mcp/servers/core-mcp-server

具体的なAWS Knowledge MCPツール一覧は以下の通り
search_documentation: AWSドキュメント全体を検索
read_documentation: AWS ドキュメントページを取得してマークダウンに変換
recommend: AWS ドキュメントページのコンテンツ推奨事項を取得
list_regions (実験的) : 全AWS リージョンのリストを、その識別子と名前を含めて取得
get_regional_availability(実験的) : SDK サービス API と CloudFormation リソースの AWS リージョンの可用性情報を取得

AWS MCPサーバ集の中には~/.aws/credentials/のアクセスキーがある前提の実装になっているものもあるかもしれません(要調査)
その時は~/.aws/config/のSSO認証情報をcredentialsに反映する以下の記事を参照して下さい
https://zenn.dev/labbase/articles/303c7dd492ebc1


AWS Terraform MCP Server

  • AWS 上でアプリを構築するための Terraform の具体的なアドバイスを入手
  • セキュリティとコンプライアンスのスキャンのために Checkov と連携

MCP Proxy for AWSとは

awslabではなくawsのリポジトリの
https://github.com/aws/mcp-proxy-for-aws
AWS IAM 認証 (SigV4) を使用するAWS上のMCPサーバ(Amazon Bedrock AgentCoreで構築した等)に接続するケースの話。今回は手元にAIエージェントを構築する前提なので不要。詳細は以下
https://zenn.dev/dehio3/scraps/90fbe3c47a595a
上記のproxyの機能以外にもlibraryを提供。LangChain、LlamaIndex 等の人気フレームワークを使用して、プログラムでAIエージェントを構築と書いてある。要するに、手元のPCの任意MCPクライアントに、このMCPサーバを与えれば、自然言語だけで、AWS上でAIエージェント組めるってことか
※前提条件 AWS CLI または 環境変数 (オプション:Docker)

2025/12/02追記

AWS MCP Server(Remote)という名前でpreviewとしてアナウンスされた(2025/10/30)
https://docs.aws.amazon.com/aws-mcp/latest/userguide/getting-started-aws-mcp-server.html
公式ガイドのStep3の以下のjsonを見ると、正体はmcp-proxy-for-awsだと分かる

{
  "mcpServers": {
    "aws-mcp": {
      "command": "uvx",
      "args": [
        "mcp-proxy-for-aws@latest",
        "https://aws-mcp.us-east-1.api.aws/mcp",
        "--metadata", "AWS_REGION=us-west-2"
      ]
    }
  }
}

様々なMCPサーバ https://github.com/awslabs/mcp/ をマネージドでセットアップを不要にし
AWSがホストするHTTP MCPサーバに、手元のエージェントが(※AWS上のサブエージェント等は介さない模様?)アクセスできるようになったらしい

つまりユーザはmcp-proxy-for-awsラッパーを手元でセットするだけで
ユーザ ⇆ 任意のMCPクライアント ⇆ mcp-proxy-for-aws ⇆ マネージドHTTP AWS MCPサーバ群
(特にAWS API MCPサーバ等を使うと ⇆ AWSリソースまで)
が認証セットアップと上記のjsonだけで実現するらしいので今夜検証

参考記事
https://dev.classmethod.jp/articles/claude-code-use-aws-remote-mcp-server/
https://qiita.com/yoshimi0227/items/cd97de409813fa408813


非公式MCP

公式以外でも以下のようなMCPサーバは存在しますが、7か月前が最終コミットで、CLIエージェント浸透以前のツールなのと、MCPの仕様変更:「SSE廃止➡HTTP Streamable推奨」への対応も記載がなく不安要素が多いです
https://github.com/alexei-led/aws-mcp-server
AWSを含むパブリッククラウド等、セキュリティ面の配慮が重要な領域では、個人開発の非公式サーバを選ぶのは抵抗があります


AWSに限定しないIaCツール MCPサーバ

Awesome MCPサーバ集の中で一番☆が多いものをピックアップ
https://github.com/punkpeye/awesome-mcp-servers

Terraform

DockerでMCPサーバを起動する
hashicorp公式(Go実装)
https://github.com/hashicorp/terraform-mcp-server
非公式(※Rustでソースビルドも可)
https://github.com/nwiizo/tfmcp

Kubernetes

Kubernetes(K8s)を使えばAWSへの依存度が下げられますが
本当にK8sが要件の規模に合っているかは検討の余地があります
コンテナのオーケストレーションもAWSならEKS(K8s)よりECSを検討するのが先

https://github.com/Flux159/mcp-server-kubernetes

SSHの代わりにSession Manager

AWS EC2等で作成したインスタンスに複数の手順を踏んでSSH接続する方法もありますが
「公開鍵/秘密鍵の作成・パスフレーズ管理...etc」のルールを
全ての並列CLIエージェントに順守させることはコストが大きいです

そのため
Session Manager プラグインを使用するのが良さそうです

以下の記事の「Session Manager とは?」以降の対話が理解の助けになったので引用させて頂きます
https://aws.amazon.com/jp/builders-flash/202406/systems-manager-series/

Session Managerの概要を示したAWS構成図

  • SSH通信用22番ポート開放不要
  • VPN などの閉域接続をせずともプライベートネットワークにあるサーバーにもアクセス可能
  • 踏み台サーバーが不要
  • ID/PW やサーバー接続用の鍵管理が不要 (マネージメンドコンソールからの接続時のみ)

Session Managerは、AWS Systems Managerという枠組みの一部に位置付けられ下記の設定を担う

  • SSHやリモートデスクトップのような双方向のストリーミング接続のセットアップ
  • SSH中のlog記録(CloudTrailを使用するため、S3への記録とCloudWatchフィルタリングも可能)
  • セキュリティグループやfirewall(インスタンス上で動作するSSM Agentが各セッションに対して外向きのソケット接続を作成➡本来の目的はトラブルシューティング)

※アクセス制御はIAMを利用
AWS Systems Managerの全体像
Youtube動画
日本語版はこちら
https://zenn.dev/kiiwami/articles/814b09e6836cc225
Session Managerの環境構築
リモートのEC2インスタンスへのSSM Agent導入が必須だが、有名なAMI(Amazon Machine Image)ならプリインストールされているので不要

  • Amazon Linux (2も含む)
  • Ubuntu Server
  • macOS
  • Windows Server

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent-technical-details.html

EC2上の SSM Agent の自動更新を有効化(推奨)

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/troubleshooting-ssm-agent.html
最新バージョンのエージェントを使用しないと、マネージドノードが Systems Manager の各種ツールや機能を使用できなくなる可能性があります。このため、マシン上で SSM Agent を最新状態に維持するプロセスを自動化することをお勧めします。詳細については、「SSM Agent への更新の自動化」を参照してください。GitHub の「SSM Agent リリースノート」ページをサブスクライブすると、SSM Agent の更新に関する通知を受け取ることができます


マネージドサービスを利用せず通常のSSH接続を行う場合

Claude Code標準のBash(ssh ...)でSSH接続できます
秘密鍵を/.ssh/とかにOpenSSH形式で置いておくとパスフレーズ入力する欄が下の方に用意され

Enter Passphrase: 

に入力することでSSHできましたが
並列エージェントでは毎回手動で入力するのは面倒なのでssh-agentを推奨

ssh-agentの制約(個人的なメモ)

ssh-agentによる自動認証情報の使用はtmuxを使わない限り、別ターミナルに引き継げない
KAMUI OSだとWindowsではtmux(WSL)使えない
私が構築したVibeCodeHPCと同様の手法では上手くいかない

Claude DesktopのようにCLI型でないMCPクライアントでも
以下のMCPサーバを与えることでCLI相当に昇格できます
https://github.com/wonderwhy-er/DesktopCommanderMCP
MCPツールの使い方に関する23K tokenものコンテキストが内蔵しているが、SSH先がどんなOSのインタラクティブShellであろうと、問題なく複数のコネクションを維持できる堅牢性は唯一無二。これで最初に1回手動でパスフレーズを入力して、その後は確立したそのSSHセッションを利用し続けるように指示することがおすすめの使い方です(CLIが提供するツールと多少被っても採用する価値はある)

他にも以下のようなSSH用のMCPサーバがあるみたいですが、"env"ではなく"args"フィールドに直接パスフレーズを入力するので、この.mcp.jsonの置き場所に困ります
https://github.com/tufantunc/ssh-mcp

MCP json
{
    "mcpServers": {
        "ssh-mcp": {
            "command": "npx",
            "args": [
                "ssh-mcp",
                "-y",
                "--",
                "--host=1.2.3.4",
                "--port=22",
                "--user=root",
                "--password=pass",
                "--key=path/to/key",
                "--timeout=30000",
                "--maxChars=none"
            ]
        }
    }
}

まとめ

LLMエージェントにMCP経由でAWSリソースを操作させるのに必要な事前準備

  • AWSアカウントでRootユーザを作成:必須

  • IAMユーザを作成:IAMユーザを用いたアクセスキーによる有効期限のない認証は非推奨

    • AWS Security Token Services (STS):既存IAMユーザ認証ならアクセスキーの代わりに推奨
  • IAM Identity Centerユーザを作成(SSO):推奨

  • AWS CLI v2インストール:推奨

  • AWSマネジメントコンソールWEB上でIAMユーザアクセスキーを取得:非推奨

    • aws configureコマンドでローカルPCの~/.aws/credential/🔑に保存:非推奨
  • aws configure ssoコマンドでブラウザ認証により~/.aws/config/📄で完結:推奨

  • AWS Session Manager プラグインのインストール:任意(EC2アクセス時SSHよりも推奨)

    • EC2へ SSM Agent インストール:必須 ※有名なAMI(≒OS)なら不要
    • EC2で SSM Agent 自動更新設定:推奨
  • Terraform CLIインストール:任意(AWS Terraform MCP Serverで必須)

  • AWS公式MCPサーバ集をプロジェクト外にクローン:必須
    推奨フォルダ構成

KAMUI📂
- MCPserverTemplates📂
  - AWS公式MCPサーバのリポジトリ
  - Awesome MCP Serversのリポジトリ
  - その他のMCPサーバのリポジトリ
  - kamuicode
    - クリエイティブ系MCPサーバ集
- プロジェクト名📂
  - envなど設定済みのMCPサーバ集
    - .mcp.xxx.json
    - .mcp.yyy.json
  - PrivateリポジトリGitHubとリンクしたファイル群
    - 個人情報を含まないMCPサーバ集
  • CLIエージェントを起動し要件を伝え.mcp.{用途名など}.jsonを何パターンか作成してもらう

  • 実際に作業するエージェントに目的に応じた.mcp.jsonをアタッチして起動

2025/11/30追記

npmパッケージへのサプライチェーン攻撃は、uvを使用するAWS MCPサーバでは影響を受けませんでしたが同様のセキュリティリスクが考えられます

いずれもSSOを利用した /.aws/ に置く機密情報・権限・有効期限の最小化は必須だと考えます

AWS認証情報を管理する複数のAWSプロファイルを簡単にスイッチできるAWSumeに
AWSume 1Passwordプラグインを導入すると
1Password CLIを使ってMFAワンタイムパスワードの自動取得もできるらしい
※VSCodeの ${input:}でAWS profileを選択する方式
https://dev.classmethod.jp/articles/aws-mcp-1password-awsume-setup/

無料で使えるBitwardenを検討するも非推奨

Bitwarden MCPサーバ等
https://github.com/bitwarden/mcp-server/blob/main/src/tools/index.ts
ターミナルの環境変数として直接セットアップする手段はなく
ID・パスワード等もLLMがgetする仕組みがあり、安全とは言い難い
LLMのコンテキストを介さずに伝えるには、Bitwarden CLI自体が提供する exportでjson,encrypted_json,zipでファイル出力する機能があるが、それでは意味がない
https://bitwarden.com/help/cli/#export
ssh-agentを隠蔽して自動SSH認証する機能も提供しているが、今回はSSHではない
https://bitwarden.com/help/ssh-agent/

ローカルのBitwarden CLIを使用するので比較的安全かと思ったが
Never commit sensitive credentials (BW_SESSION, client_id, client_secret)
とあるのでBW_SESSIONの有効範囲は、そのターミナルに限らずGlobal(別のPC等)に有効ということだろうか

{
  "mcpServers": {
    "bitwarden": {
      "command": "npx",
      "args": ["-y", "@bitwarden/mcp-server"],
      "env": {
        "BW_SESSION": "your-session-token-here",
        "BW_CLIENT_ID": "organization.your-client-id", # 組織のAdmin機能が必要な場合
        "BW_CLIENT_SECRET": "your-client-secret"       # 組織のAdmin機能が必要な場合
      }
    }
  }
}

Discussion