CloudFormation MCP Serverを使用して自然言語でAWSリソースを操作する

最近、Amazon Q Developerが日本語化したことで自然言語による生成AIの活用がより身近になりましたね。
今回は、CloudFormation MCP Serverを使用して自然言語でどの程度AWSリソース操作が可能かを試してみます。

CloudFormation MCP Serverとは
-------------------
自然言語で1100を超えるAWSサービスを作成、管理できるサービスです。

1. リソースの一覧表示
list_resources関数を使用して、指定したリソースタイプのすべてのリソースを取得できます

2. リソースの詳細取得
   get_resource関数を使用して、リソースタイプとIDを指定して詳細情報を取得できます

3. リソースの作成
create_resource関数を使用して、リソースタイプとプロパティを指定してリソースを作成できます

4. リソースの更新
update_resource関数を使用して、JSONパッチ形式で変更を適用できます

5. リソースの削除
delete_resource関数を使用して、リソースタイプとIDを指定してリソースを削除できます

6. リソーススキーマ情報の取得
get_resource_schema_information関数を使用して、リソースタイプのスキーマを確認できます

7. 長時間実行操作のステータス確認
get_request_status関数を使用して、リクエストトークンを指定して操作の状態を確認できます

今回はEC2のリソースで作成更新削除の機能を試してみます。


前提条件
-------------------
動作環境はMacを前提として進めます。
AWSクレデンシャルの設定とQ Developer無料利用枠ユーザー用のビルダーID作成等は済ませておきましょう。

事前準備
-------------------

今回はAmazon Q Developer CLIにCloudFormation MCP Serverを設定します。
Amazon Q Developer CLIをインストールしましょう。

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-installing.html


結果(例):

     $ q --version
     q 1.10.1


Amazon Q Developer CLIの導入が完了したらCloudFormation MCP Serverを設定しましょう。

https://awslabs.github.io/mcp/servers/cfn-mcp-server/



```bash:コマンド:
cat << EOF > ~/.aws/amazonq/mcp.json
{
  "mcpServers": {
    "awslabs.cfn-mcp-server": {
      "command": "uvx",
      "args": [
        "awslabs.cfn-mcp-server@latest"
      ],
      "env": {
        "AWS_PROFILE": "プロファイル名"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
EOF

cat ~/.aws/amazonq/mcp.json
```

これで準備は完了です。


動作確認
-------------------
設定が済んだら以下のコマンドでQ cahtを起動してみます。

```bash:コマンド:
q chat
```

以下のような画面が立ち上がります。
awslabscfn_mcp_serverが読み込まれていることも確認できますね。
![スクリーンショット 2025-05-22 9.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/550be7ea-447f-4efc-914c-4363fa014d47.png)


それでは早速自然言語でAWSのリソースを作成してみます。
以下の自然言語でEC2インスタンスを一台作成します。
英語で出力されることがあるので、プロンプトで日本語を指定しておくと確実です。


```bash:コマンド:
東京リージョンにAmazon Linux2023最新版のEC2を1台作成してください。インスタンスサイズはt2.microでEBSは8GB。VPCはデフォルトVPC。インスタンス名はcfnmcp。セキュリティグループでインバウンドアクセスを許可しない。セッションマネージャーからは接続可能とする。途中経過は全て日本語でやりとりすること。
```

このように作成要件が表示されるはずなので、問題なければ承認しましょう。
![スクリーンショット 2025-05-22 9.47.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/5c0ae433-c4d5-455e-8b3d-192ea97304d2.png)


承認後はリアルタイムで作成状況を確認することができます。
ところどころで失敗しているようで、すぐに正しいパラメーターでトライして作業が進んでいる様子を見られるのが面白いですね。
![スクリーンショット 2025-05-22 9.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/4ba09f97-9a5b-4d24-b936-8073debe61a1.png)


数分ほど待つと、作成が完了したようです。
作成したリソースの詳細も報告してくれています。
![スクリーンショット 2025-05-22 9.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/d9c1eaa0-fcc9-4262-bf66-3384d8d81e49.png)


マネジメントコンソールでも確認してみましょう。
問題なく作成できているようですね。
![スクリーンショット 2025-05-22 9.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/fcac364c-de9f-4846-ae97-2f1225287e0e.png)


ターゲットインスタンス一覧に表示されているのでセッションマネージャーの設定も問題なさそうです。
![スクリーンショット 2025-05-22 9.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/a530449b-d1ec-4296-a6ee-ade96abd3c67.png)


続いてリソースの更新操作もしてみましょう。
インスタンスタイプをt2.smallに変更してみましょう。

```bash:コマンド:
cfnmcpのインスタンスタイプをt2.smallに変更してください
```

作成時と同じように作業の進捗を確認できます。
眺めているとインスタンスの状態を確認して、停止後にインスタンスタイプを変更していることがわかります。
![スクリーンショット 2025-05-22 10.10.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/c1c9450f-2553-490b-ac64-e37d0dcc0462.png)


数分ほどで変更が完了しました。変更結果を確認できます。
![スクリーンショット 2025-05-22 10.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/edcdb541-1cb5-4eb6-8d44-37fef5a711e7.png)


ここまでで興味深かったのは、CloudFormationでスタックを作成して管理しているというわけではないという点ですね。
今回のように自然言語による対話式の命令はAWS CLIを通じてAWSサービスのAPIを呼び出して操作しているようでした。

![スクリーンショット 2025-05-22 10.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/6cb74943-8182-4b96-992b-1be6386650cb.png)


それでは今回作成したリソースを削除してみましょう。
削除前にAMIを作成する追加注文も入れてみます。

```bash:コマンド:
cfnmcpのAMIを作成後にEC2を削除してください
```

![スクリーンショット 2025-05-22 11.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/9e0cdba4-f83e-4ba8-ad1f-33fa278aaa1f.png)


AMIの作成とEC2の削除の結果も確認できました。
![スクリーンショット 2025-05-22 11.24.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193020/ca21f223-f560-44dd-bcdc-051ab700c926.png)





まとめ
-------------------
日本語による自然言語の命令でAWSのリソースを操作できるという体験は衝撃的でした。
つい最近日本語対応したAmazon Q Developerを組み合わせればAWS活用のハードルは格段に下がったと実感しています。
ハードルは下がった一方で、生成AIに頼りすぎてしまうと意図しない操作が発生する可能性もありそうなので、反映内容を十分に確認をした上で慎重に適用する必要はあります。
生成AIという特性上、本番環境等での更新系操作の適用はまだまだ難しそうな印象です。PoCで環境をクイックに作成したい場合や初期構築時等における工数の短縮等の恩恵を得られるかもしれませんね。
参照系操作であれば適用範囲は多そうですね。例えば、使っていないEIPを出力するとか、ちょっとした調べ物をしたい場合は便利な気がしています。
引き続き、生成AIを過信しすぎず上手に活用するのが肝要ですね。