AWS API MCP ServerでWebアプリをデプロイする

1. はじめに

2025年12月、AIエージェント(Claude Code, Gemini CLI, Cursorなど)によるAIコーディングが当たり前になる中、AWS構築の進め方も大きく変わりつつあります。 従来、AWSの構築、AWSへのアプリケーションのデプロイといえば、マネジメントコンソールを行き来したり、複雑なIaCコードを記述する必要がありました。 ですが、AIエージェントと「AWS API MCP Server」を組み合わせることで、自然言語によってインフラ操作・自動構築ができるようになります。 本記事では、「AWS API MCP Server」を解説し、Claude Codeへの「AWS API MCP Server」追加手順、サンプルプログラムを自然言語でAWSにデプロイする手順をご紹介します。

2. 対象読者

  • AIエージェントを活用してAWS環境へアプリをデプロイしたい方
  • AWSデプロイ作業が「難しそう」と感じる方
  • 生成AIを使った最新のAWSデプロイを体験したい方

3. 背景・課題

アプリケーションをローカルPCで動作させた後、そのアプリをクラウドにデプロイする際のインフラ構築はアプリ実装とは異なる技術的ハードルがあります。また、AWSのようなクラウド環境では、多数のサービスの中からどのサービスをどのように連携/設計すべきなのか、初学者には難しく感じるでしょう。それから、個々のAWSサービス毎の固有用語や設定手順が多いだけでなく、書籍やWeb情報の説明通りにAWSへ実装することができず、技術的に躓くことも多いのではないかと思います。加えて、昨今のアプリは多様な技術スタックの連携によって実装されることが多く、同種のAWSサービス(※1)の中からどれを選定すべきなのか、悩まれる方も多いでしょう。

この躓きやすく悩ましいAWSデプロイについて、AIエージェントと「AWS API MCP Server」を連携することで、自然言語によるプロンプト指示で適合するAWSサービス選定しながら、AIエージェントに任せてAWSデプロイを進めることができます。

※1 例えば、Dockerコンテナをデプロイできるサービスは、以下のように色々あります。

  • AWS App Runner
  • Amazon ECS
  • Amazon EKS
  • Amazon Lightsail
  • Amazon EC2
  • AWS Lambda
  • AWS Batch
  • AWS Elastic Beanstalk

4. AWS API MCP Server とは?

AWS API MCP Serverは、AIエージェントとAWSサービスの間の橋渡しとして機能し、AWSリソースの作成、更新、管理を行うことができます。AIエージェントに自然言語のプロンプト指示を与えることで、AWS CLIコマンドに変換・実行されます。

AWS API MCP Server | AWS MCP Servers

例えば、「S3のリストを表示」と指示することで、AWS CLIの「aws s3 ls」コマンドに変換・実行され、S3バケット一覧が表示されます。

このとき、従来のブラウザによるAWSマネジメントコンソール操作は必要はありません。

  • AWS API MCP Serverの活用例
    • ソースコードの中身を解析した上でのAWSアーキテクチャーの提案、インフラ構築とデプロイ【本記事の記載内容】
    • S3のバケット一覧表示
    • EC2/Lambda/RDS等、AWSリソースの構築
    • AWSリソースの問題調査
    • 障害発生リソースの再起動・復旧
    • システムの稼働状況(ヘルスチェック)の確認
    • バックアップ(スナップショット)の取得
    • アプリケーションの動作不良からインフラのログ調査と原因分析
    • インフラ設定とソースコードを横断したセキュリティ診断
    • アプリの負荷傾向に基づいたコスト分析とリソース最適化

これらのように、アプリ開発、アプリ構築、リリース後の運用/保守のあらゆる場面で、アプリケーション作業とインフラ作業を一気通貫で自律的に実行させることができます。

5. 前提条件・事前準備

本記事でご紹介する手順を行うために必要となる、動作環境の前提条件は次のとおりです。

  • OS
    • macOS
  • IDE
    • Visual Studio Code
  • AIエージェント
    • Claude Code ※最新バージョンを推奨します
  • AIモデル
    • Opus 4.5
  • AWSアカウントの準備
    • ※本記事の手順を実施すると、AWS App Runner等の利用料金が発生します。
  • IAMユーザーのアクセスキーの準備
  • AWS CLIのインストールと認証設定
    • ターミナルでaws configure等でアクセスキーを設定します。
    • awsコマンドが実行可能であること
      • コマンド例 aws s3 ls
  • Docker Desktop または Rancher Desktop などのDocker動作環境
  • Visual Studio Codeで作業フォルダを開いておきます

6. 実施手順

6.1 uv コマンドのインストール

AWS API MCP Server を実行するために必要な uv というパッケージマネージャーをインストールします。 ターミナルで以下を実行します。

curl -LsSf https://astral.sh/uv/install.sh | sh

インストールが完了したら、変更を反映させるためにターミナルを再起動するか、画面の指示に従ってパスを通してください(通常は自動で設定されますが、反映されない場合はターミナルを一度閉じて開き直すのが確実です)。

6.2 AWS API MCP Server のセットアップ

Claude Code に AWS API MCP Server を追加するため、ターミナルで以下を実行します。

claude mcp add -s project \
  -e AWS_REGION=ap-northeast-1 \
  -e AWS_API_MCP_PROFILE_NAME=default \
  -- awslabs-aws-api-mcp-server \
  uvx awslabs.aws-api-mcp-server@latest

コマンドの解説

コマンド/オプション 説明
claude mcp add Claude Code に新しい MCP サーバーを追加するコマンドです。
-s project プロジェクトスコープで設定を追加します(現在のプロジェクト設定ファイル .mcp.json などに保存されます)。
-e AWS_REGION=ap-northeast-1 AWSのリージョンを東京(ap-northeast-1)に指定しています。
-e AWS_API_MCP_PROFILE_NAME=default お使いのPCに設定されているAWSプロファイル(~/.aws/credentials)の default を使用します。default以外のプロファイルを指定する場合は、適宜変更してください。
awslabs-aws-api-mcp-server サーバーに付ける名前です。
uvx awslabs.aws-api-mcp-server@latest uv ツールを使って、最新版の当該プログラムをダウンロード・実行します。

6.3 AWS Documentation MCP Server のセットアップ

AWS API MCP Serverを利用する際、AWS Documentation MCP Server を併用することでAIエージェントの実行精度が向上します。 ターミナルで以下を実行します。

claude mcp add -s project \
  -- awslabs-aws-documentation-mcp-server \
  uvx awslabs.aws-documentation-mcp-server@latest

コマンドの解説

コマンド/オプション 説明
claude mcp add Claude Code に新しい MCP サーバーを追加するコマンドです。
-s project プロジェクトスコープで設定を追加します(現在のプロジェクト設定ファイル .mcp.json などに保存されます)。
awslabs-aws-documentation-mcp-server サーバーに付ける名前です。
uvx awslabs.aws-documentation-mcp-server@latest uv ツールを使って、最新版の当該プログラムをダウンロード・実行します。

6.4 Claude Codeの起動

claude

新しくMCP Serverを追加すると下記画面が表示される場合があります、Enter を押下してください。

6.5 AWS API MCP Serverの動作確認

スラッシュコマンド/mcpを実行し、下記画面のようにawslabs-aws-api-mcp-serverawslabs-aws-documentation-mcp-serverが、connectedとなっていることを確認してください。

/mcp

動作確認として、S3の一覧を表示という簡単なプロンプトを入力してみましょう。 S3バケット一覧が表示されれば Claude Code から AWS API MCP Server が連携され、自然言語が aws s3 ls コマンドに変換・実行されていることがわかります。

S3の一覧を表示

※Claude Codeの画面上にDo you want to proceed?と表示された場合、適宜、表示内容を確認してYesorNoを選択してください。

※ご利用のAWSアカウント内でS3バケット未作成の場合は表示されません。このような場合はEC2やVPCなど、存在するAWSリソースの一覧表示をお試しください。

6.6 プログラムをローカルPCで実行する

今回は FastAPI を使用したシンプルな、おみくじアプリを作成します。 デプロイするアプリケーションで使用するソースコードを以下に用意しました。 下記の2つのファイル(fortunes.pyDockerfile)を、作業フォルダに作成してください。

fortunes.py

from fastapi import FastAPI
from fastapi.responses import HTMLResponse
import random

app = FastAPI()

@app.get("/", response_class=HTMLResponse)
async def read_root():
    fortunes = ["大吉", "中吉", "小吉", "吉", "末吉", "凶"]
    lucky_items = [
        "金の腕時計", "新しい文房具", "ミントタブレット", "文庫本", "温かいお茶",
        "折りたたみ傘", "お気に入りの音楽", "散歩", "古い写真", "甘いお菓子",
        "スマートフォン", "ハンカチ", "スニーカー", "観葉植物", "マグカップ"
    ]

    selected = random.choice(fortunes)
    item = random.choice(lucky_items)

    html_content = f"""
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>おみくじ</title>
        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@400;600&display=swap" rel="stylesheet">
        <style>
            :root {{
                --sky-light: #e8f4fc;
                --sky-mid: #7ec8ed;
                --sky-accent: #4ab3e6;
                --blue-deep: #2196c9;
                --text-primary: #1a4a5e;
                --text-muted: #5a8fa8;
            }}

            * {{
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }}

            body {{
                background: var(--sky-light);
                background-image:
                    radial-gradient(ellipse at 30% 0%, rgba(126, 200, 237, 0.5) 0%, transparent 50%),
                    radial-gradient(ellipse at 70% 100%, rgba(184, 223, 245, 0.6) 0%, transparent 50%),
                    linear-gradient(180deg, #f0f9ff 0%, var(--sky-light) 50%, #d4edfc 100%);
                min-height: 100vh;
                display: flex;
                align-items: center;
                justify-content: center;
                font-family: "Shippori Mincho", "Hiragino Mincho ProN", "Yu Mincho", serif;
                color: var(--text-primary);
                overflow: hidden;
            }}

            body::before {{
                content: "";
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
                opacity: 0.02;
                pointer-events: none;
            }}

            @keyframes fadeInUp {{
                from {{
                    opacity: 0;
                    transform: translateY(30px);
                }}
                to {{
                    opacity: 1;
                    transform: translateY(0);
                }}
            }}

            .card {{
                position: relative;
                text-align: center;
                padding: 4rem 3.5rem;
                background: linear-gradient(145deg,
                    rgba(255, 255, 255, 0.95) 0%,
                    rgba(248, 252, 255, 0.9) 100%);
                border: 1px solid rgba(74, 179, 230, 0.2);
                border-radius: 16px;
                min-width: 320px;
                backdrop-filter: blur(20px);
                box-shadow:
                    0 20px 60px rgba(33, 150, 201, 0.15),
                    0 8px 25px rgba(74, 179, 230, 0.1),
                    inset 0 1px 0 rgba(255, 255, 255, 0.8);
                animation: fadeInUp 0.8s ease-out;
            }}

            .card::before {{
                content: "";
                position: absolute;
                top: 0;
                left: 30%;
                right: 30%;
                height: 3px;
                background: var(--sky-accent);
                border-radius: 0 0 3px 3px;
            }}

            .title {{
                font-size: 0.8rem;
                letter-spacing: 0.4em;
                color: var(--text-muted);
                margin-bottom: 2.5rem;
                text-transform: uppercase;
                animation: fadeInUp 0.8s ease-out 0.1s backwards;
            }}

            .result {{
                font-size: 5.5rem;
                font-weight: 600;
                margin-bottom: 2.5rem;
                line-height: 1;
                color: var(--text-primary);
                animation: fadeInUp 0.8s ease-out 0.2s backwards;
            }}

            .divider {{
                width: 50px;
                height: 1px;
                background: var(--sky-mid);
                margin: 0 auto 2rem;
                animation: fadeInUp 0.8s ease-out 0.3s backwards;
            }}

            .label {{
                font-size: 0.7rem;
                letter-spacing: 0.25em;
                color: var(--text-muted);
                margin-bottom: 0.75rem;
                animation: fadeInUp 0.8s ease-out 0.4s backwards;
            }}

            .item {{
                font-size: 1.2rem;
                margin-bottom: 3rem;
                color: var(--blue-deep);
                animation: fadeInUp 0.8s ease-out 0.5s backwards;
            }}

            .btn {{
                display: inline-block;
                padding: 0.875rem 2rem;
                background: var(--sky-accent);
                color: #fff;
                font-family: inherit;
                font-size: 0.8rem;
                letter-spacing: 0.1em;
                text-decoration: none;
                border: none;
                border-radius: 4px;
                transition: background 0.2s ease;
                animation: fadeInUp 0.8s ease-out 0.6s backwards;
            }}

            .btn:hover {{
                background: var(--blue-deep);
            }}
        </style>
    </head>
    <body>
        <div class="card">
            <div class="title">今日の運勢</div>
            <div class="result">{selected}</div>
            <div class="divider"></div>
            <div class="label">ラッキーアイテム</div>
            <div class="item">{item}</div>
            <a href="/" class="btn">もう一度引く</a>
        </div>
    </body>
    </html>
    """
    return HTMLResponse(content=html_content)

Dockerfile

FROM python:3.9-slim

WORKDIR /app

RUN pip install --no-cache-dir fastapi uvicorn

COPY fortunes.py /app/fortunes.py

CMD ["uvicorn", "fortunes:app", "--host", "0.0.0.0", "--port", "8000"]

ローカルでの実行手順

Docker環境が起動していることを確認し、以下のコマンドをターミナル上で実行してコンテナをビルド・起動します。

1. Dockerイメージのビルド

   docker build -t fortunes-app .

2. コンテナの起動

   docker run -p 8080:8000 fortunes-app

※ ホスト側のポート8080を、コンテナ側のポート8000(FastAPIのデフォルト)に転送しています。

3. 動作確認

ブラウザで http://localhost:8080 にアクセスしてください。 「今日の運勢」が表示されれば成功です。

4. コンテナの停止

確認ができたら、ターミナルで Ctrl + C を押してサーバーを停止してください。

6.7 このプログラムに適したAWS構成を提案してもらう

AIエージェントにAWS構成を提案してもらいましょう。

作業フォルダのfortunes.pyDockerfileなどのコードベースをClaude Codeに把握させることで、精度を高めて出力させることができます。

コードベースを把握させるためには、Claude Code上で/initコマンドを実行します

/init

「Do you want to proceed? (実行しますか?)」と確認を求められるので、内容を確認して実行を許可(Enter または Yes)してください。

このFastAPIアプリをAWSで公開したい。
初心者におすすめ、コード変更無し、オートスケール、
管理が楽、コストが安い構成を提案して。
まだ実装しないでください。

このプロンプトを実行すると、おそらく「AWS App Runner」が提案されると思います。

※ 本記事のこの後の説明を統一するため、意図して「AWS App Runner」が提案されるプロンプトとしています。

※ 時間経過による新規AWSサービスのリリース、既存サービスの改善など、提案内容が変わる可能性があります。

私が本プロンプトを実行した結果、AWS App Runnerがおすすめされ、簡易的な構成図、概算コスト、他の選択肢との比較表が出力されました。

6.8 AWSリソース作成と、デプロイ

提案された構成(AWS App Runner)で実際にデプロイを行います。

通常、App Runnerへのデプロイを行うには、以下の手順が必要です。

  1. ECRリポジトリの作成
  2. Dockerイメージのビルド
  3. AWSへのログイン(ECRログイン)
  4. イメージのプッシュ
  5. App Runnerサービスの作成(IAMロール設定など含む)

これらを人間が手動で行うと手数が多く大変ですが、AWS API MCP Serverを使えば、自然言語で指示するだけでClaude Codeが実行してくれます。

以下のプロンプトを入力してください。

留意点:

デプロイを進めることでAWSへの課金が加算されます。 本記事の構成(1 vCPU、2 GBメモリ)における App Runner の利用料金目安(東京リージョン)は、1日(24時間)稼働させた場合、待機時間が多い場合で約0.43 USD(約65円)、常にリクエストを処理し続けた場合で約2.37 USD(約356円)程度です(2025年12月現在)。

提案してくれた App Runner の構成でデプロイを進めてください。
ECRのリポジトリ名は `fortunes-app`、App Runnerのサービス名は `fortunes-service` とします。

Claude Code は必要な手順を計画し、順次コマンドを実行していきます。

途中で「Do you want to proceed? (実行しますか?)」と確認を求められるので、内容を確認して実行を許可(Enter または Yes)してください。

実行される主な処理の流れ:

  1. ECRリポジトリの作成: aws ecr create-repository などが実行されます。
  2. Dockerビルドとプッシュ: ローカルでビルドしたイメージがECRにアップロードされます。
  3. App Runnerサービスの作成: アップロードされたイメージを使ってサービスが起動します。

※デプロイ完了までには数分〜10分程度かかります。

処理が完了すると、Claude Code が「デプロイが完了しました」といったメッセージと共に、アプリケーションのURL(https://xxxxxxxx.ap-northeast-1.awsapprunner.com のような形式)を表示してくれます。

AWSマネジメントコンソールで確認:

マネジメントコンソールからも作成されたリソースを確認できます。

App Runnerの管理画面を開くと、fortunes-service というサービスが作成され、ステータスが Running になっていることがわかります。

6.9 ブラウザで動作確認

発行されたApp RunnerのドメインURL(https://...awsapprunner.com)に、ブラウザからアクセスしてみましょう。

ローカル実行時と同様に、「今日の運勢」画面が表示されれば、AWSへのデプロイ成功です!

6.10 後片付け、AWSリソースの削除

最後に、不要な課金が継続しないよう、作成したAWSリソースを削除して後片付けを行います。 これも自然言語で指示するだけで、Claude Codeが関連リソースを特定して削除してくれます。

作成したApp Runnerサービス、IAMロール、ECRリポジトリを削除してください。

ここでも「Do you want to proceed?」と確認を求められるので、削除対象のリソース(App Runnerサービス fortunes-service と ECRリポジトリ fortunes-app)が含まれていることをよく確認してから、実行を許可してください。

これでAWSリソースが削除されました。

7. まとめ

本記事では、AIエージェントに「AWS API MCP Server」を連携させることで、アプリやAWSの専門知識がなくても、自然言語による指示でWebアプリケーションをAWS環境にデプロイできることを解説しました。

AWS API MCP Serverを活用するメリット:

  • 学習コストの削減: AWSの専門用語やマネジメントコンソール操作が難しいと感じる方でも、自然言語でAWSを操ることができます。
  • 迅速な構築とデプロイ: 対話形式でスムーズにAWS構成の提案をもらい、インフラの構築、デプロイまで進められます。
  • 運用の効率化: リソースの確認や削除などの運用タスクも、プロンプト入力で実施できます。

2025年12月、AIと対話しながらインフラを作り上げるスタイルは、今後の開発におけるスタンダードになっていくでしょう。AIによる技術革新を味方につけ、よりクリエイティブで価値あるアプリ開発を行うため、まずはこの一歩から始めてみてはいかがでしょうか。

執筆者

三島 映人 NTT西日本グループのサービス開発におけるテックリードやプロジェクトマネジメント、アプリケーション開発組織の技術統括、エンジニア育成を行っています。 MBA、PMI認定PMP等を保有。趣味は自作キーボードの設計。

商標

  • Amazon Web Services、AWS、App Runner、およびその他のAWSサービス名は、米国およびその他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
  • Claude、Claude Code は、Anthropic PBC の商標です。
  • Docker は、Docker, Inc. の商標または登録商標です。
  • Python は、Python Software Foundation の登録商標です。
  • Visual Studio Code は、Microsoft Corporation の商標または登録商標です。
  • macOS は、Apple Inc. の商標です。
  • その他、記載されている会社名、製品名は、各社の登録商標または商標です。

免責事項

  • 本記事の内容は執筆時点(2025年12月)の情報に基づいており、サービスの仕様変更等により内容が変更される可能性があります。
  • 本記事で紹介する設定手順や使用方法は、特定の環境での動作確認に基づくものであり、すべての環境での動作を保証するものではありません。
  • AWS API MCP Server および AWS Documentation MCP Server は AWS Labs によって提供されるオープンソースプロジェクトであり、AWSの公式サポート対象外です。
  • 本記事では生成AIを活用した内容が含まれており、AIによる情報の生成過程でハルシネーション(事実に基づかない情報の生成)が発生する可能性があります。記載内容の正確性については、必ず公式ドキュメントや信頼できる情報源で検証してください。

© NTT WEST, Inc.