こんにちは!
先月から any に SRE としてジョインしました @sasashuuu です!
プロダクトの信頼性をさらに上げていけるよう、ガンガンと改善を図っていければと思います!💪
この記事は、any プロダクトチーム AdventCalendar 2025、11日目の記事となります!
最近 GA となった Kiro CLI や AWS MCP サーバーを用いて何かできないかな〜と思い、本記事を執筆しましたので、よければご覧ください!
前提条件
本記事ではサンドボックス環境(ホストマシン、AWS アカウント)を利用しているので、 AI エージェントに関するセキュリティ対策やその他事故防止のための措置等についてはあまり触れていません。
記事の内容を参考にする場合は、十分に注意し、個人の責任で実施してください。
- Kiro CLI のインストールおよびログインが完了していること(※オプトアウトも推奨)
- AWS 環境および IAM ユーザーの払い出しと実行環境でのクレデンシャル設定が完了していること
- Terraform のインストールが完了していること
背景・課題感
AWS コンソールや CLI から構築したインフラリソース、
とにかく IaC(Terraform)への取り込みが面倒くさい!!!
と思ったことはありませんか...?(僕はあります)
最近は、Terraform の v1.14.0 が GA となり query コマンドなどが正式に使えるようになりました。import によるリソース取り込みもかなり便利になりましたよね。
ただ、取り込み方は便利になったとはいえ、いまだに 「そもそも Terraform 上の取り込み対象の resource type どれだっけ?」 と言ったケースに見舞われることはあるかと思います(そしてその後の取り込みも手間)。
例えば、S3 のバケットをコンソールから作成したのち、Terraform へ取り込むといったシチュエーションを想定してみましょう。
2025年11月時点、デフォルト設定のままだと以下のような内容となります。
バケット本体だけでなく、パブリックアクセスブロックや暗号化設定等もありますので、この設定でバケットを作成すると、Terraform のリソースタイプでは以下のように複数に分かれます。
- aws_s3_bucket
- aws_s3_bucket_public_access_block
- aws_s3_bucket_server_side_encryption_configuration
こちらはあくまで一例ですが、単一のリソースのように見えても 「実はリソースが細かなコンポーネントに分かれていた」 といったケースがあるかと思います。これらをできるだけ認知負荷低く、楽に IaC へ取り込める方法はないかなと考えたことが背景にありました。
そこで Kiro CLI + AWS 公式 MCP サーバー
今どき AI エージェントにまるっと投げればいい感じに取り込んでくれるんじゃ、、!?
前項の課題感などを解消するために AI エージェント + MCP サーバーを使ってみます。
ざっくりやりたいことのイメージは以下です。
1. AWS 特化型の AI エージェント(Kiro CLI)を利用し、自然言語で問い合わせ
2. AWS 公式 MCP サーバーを用いて AWS や Terraform のプラクティスや最新の公式ドキュメントの情報などを取得
3. ローカルのファイルシステムに書き込み(*.tf にて import する内容を実装)
AI エージェントには Kiro CLI を使用します。
Kiro CLI は AWS 公式の Amazon Q Developer CLI の後継であり、生成 AI を使ったアシストを行ってくれるクライアントツールです。ポイントとしては、ビルトインツールの aws(前身は Amazon Q Developer CLI の use_aws)が使えるため、自然言語をもとに AWS CLI の間接的な実行によるシームレスなリソースの操作が行える点が強みです。
MCP サーバーは AWS 公式より提供されている以下を使います。
取得できる情報を抜粋して紹介すると、ざっくり以下のような内容です。
-
AWS Knowledge MCP Server
- AWS のベストプラクティス
- API リファレンス
- サービスに関する最新情報
-
AWS Terraform MCP Server
- AWS に関する Terraform のリソースのベストプラクティス
- AWS プロバイダードキュメント
実践
(デモ用)取り込み対象となる AWS リソースの作成
デモ用にあらかじめ適当な AWS リソースを作成しておきました。
冒頭にも軽く触れたいた、コンソールからデフォルト設定のまま作成した S3 のバケットを使います。
作業ディレクトリ内のファイル構成等について
Kiro CLI などを使う上で必要ファイルの構成や全体像を先にざっくりと解説しておきます。
.
├── .kiro
│ └── agents
│ └── aws_tf.json
├── AGENTS.md
├── main.tf
// その他必要に応じ、backend.tf 等、*.tf といったファイルなど複数配置
.kiro/* や AGENTS.md といった Kiro CLI に関する設定ファイルは後ほどの手順で作成していきます)。
また、*.tf については本筋のテーマと逸れるため、詳細を割愛しています。
-
.kiro/agents/*.json- Kiro CLI のカスタムエージェント(ユースケースに沿った個別のエージェント)向けの設定ファイルです(※内容の詳細は後述)
- 操作権限や利用するツール等の定義等を行います
-
AGENTS.md- AI エージェントに対するコンテキストや指示のためのオープンフォーマットです
- ガイドラインのようなものを定義するイメージです
カスタムエージェントのためのセットアップ
まずは Kiro Cli を起動しましょう。
kiro-cli
% kiro-cli
✓ aws-knowledge-mcp-server loaded in 2.56 s
⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣶⣶⣦⡀⠀⠀⠀⢀⣴⣶⣦⣄⡀⠀⠀⢀⣴⣶⣶⣦⡀⠀⠀⢀⣴⣶⣶⣶⣶⣶⣶⣶⣶⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣶⣶⣶⣶⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢰⣿⠋⠁⠈⠙⣿⡆⠀⢀⣾⡿⠁⠀⠈⢻⡆⢰⣿⠋⠁⠈⠙⣿⡆⢰⣿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣦⠀⠀⠀⠀⣴⡿⠟⠋⠁⠀⠀⠀⠈⠙⠻⢿⣦⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣿⣇⣴⡿⠋⠀⠀⠀⢀⣼⠇⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⢠⣤⣤⣤⣤⣄⠀⠀⠀⠀⣿⡆⠀⠀⣼⡟⠀⠀⠀⠀⣀⣀⣀⠀⠀⠀⠀⢻⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣿⡿⠋⠀⠀⠀⢀⣾⡿⠁⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⢸⣿⠉⠉⠉⣿⡇⠀⠀⠀⣿⡇⠀⣼⡟⠀⠀⠀⣰⡿⠟⠛⠻⢿⣆⠀⠀⠀⢻⣧⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⠙⠁⠀⠀⢀⣼⡟⠁⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⢸⣿⣶⣶⡶⠋⠀⠀⠀⠀⣿⠇⢰⣿⠀⠀⠀⢰⣿⠀⠀⠀⠀⠀⣿⡆⠀⠀⠀⣿⡆
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣼⠟⠀⢸⣿⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⣿⡇
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⠀⣠⡀⠀⠀⠹⣷⡄⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⣤⣄⠀⠀⠀⠀⠹⣿⡅⠀⠀⠸⣿⠀⠀⠀⠸⣿⠀⠀⠀⠀⠀⣿⠇⠀⠀⠀⣿⠇
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣾⡟⣷⡀⠀⠀⠘⣿⣆⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⣿⡟⣷⡀⠀⠀⠀⠘⣿⣆⠀⠀⢻⣧⠀⠀⠀⠹⣷⣦⣤⣤⣾⠏⠀⠀⠀⣼⡟
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀⠀⠀⠈⢻⡇⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀⠀⠀⠀⠈⢻⡇⠀⠀⢻⣧⠀⠀⠀⠀⠉⠉⠉⠀⠀⠀⠀⣼⡟
⠀⠀⠀⠀⠀⠀⠀ ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀⠀⢀⣼⠇⠀⠸⣿⣄⡀⢀⣠⣿⠇⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀⠀⠀⢀⣼⠇⠀⠀⠀⠻⣷⣦⣄⡀⠀⠀⠀⢀⣠⣴⣾⠟
⠀⠀⠀⠀⠀⠀⠀ ⠀⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠀⠀⠀⠈⠙⠻⠿⠿⠿⠿⠟⠋⠁
╭─────────────────────────────── Did you know? ────────────────────────────────╮
│ │
│ Kiro can use tools without asking for confirmation every time. Give │
│ /tools trust a try │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
Model: Auto (/model to change) | Plan: KIRO FREE (/usage for more detail)
続いてカスタムエージェントの構成を作成していきます。
インタラクティブなモードで入力を求められるので、必要な設定を行ってください。
(agent name や description は任意の内容を入力、それ以外は一旦デフォルトで OK です。)
> /agent generate
> /agent generate
✔ Enter agent name: · aws_tf
✔ Enter agent description: · aws tf
✔ Agent scope · Local (current workspace)
Select MCP servers (use Space to toggle, Enter to confirm):
✓ Agent 'aws_tf' has been created and saved successfully!
この時点で作業ディレクトリに .kiro/agents および設定用の json ファイルが作成され、以下のような状態になるかと思います。
.
├── .kiro
│ └── agents
│ └── aws_tf.json
// *.tf 等
{
"name": "aws_tf",
"description": "aws tf",
"prompt": "You are an AWS Terraform specialist. Help users with Terraform configurations, AWS infrastructure as code, best practices, troubleshooting, and optimization. Focus on writing clean, maintainable Terraform code and following AWS security best practices.",
"mcpServers": {},
"tools": [
"*"
],
"toolAliases": {},
"allowedTools": [],
"resources": [
"file://AGENTS.md",
"file://README.md"
],
"hooks": {},
"toolsSettings": {},
"useLegacyMcpJson": false,
"model": null
}
aws_tf.json は MCP サーバー利用のための設定等を加え、以下のように書き換えます。
{
"name": "aws_tf",
"description": "aws tf",
"prompt": "You are an AWS and Terraform specialist. Help users with AWS infrastructure management, Terraform configurations, best practices, troubleshooting, and optimization. Focus on practical solutions for cloud infrastructure deployment and management.",
"mcpServers": {
+ "aws-knowledge-mcp-server": {
+ "url": "https://knowledge-mcp.global.api.aws",
+ "type": "http"
+ },
+ "awslabs.terraform-mcp-server": {
+ "command": "uvx",
+ "args": [
+ "awslabs.terraform-mcp-server@latest"
+ ],
+ "env": {
+ "FASTMCP_LOG_LEVEL": "ERROR"
+ },
+ "disabled": false,
+ "autoApprove": []
}
},
"tools": [
"*"
],
"toolAliases": {},
"allowedTools": [
+ "read",
+ "write",
+ "@aws-knowledge-mcp-server",
+ "@awslabs.terraform-mcp-server"
],
"resources": [
"file://AGENTS.md",
"file://README.md"
],
"hooks": {},
"toolsSettings": {},
"useLegacyMcpJson": false,
"model": null
}
詳細な定義方法については Kiro 公式ドキュメントの Agent configuration reference などを参考にしてください。
本設定については "mcpServers" に利用する MCP サーバーを定義していること、"allowedTools" にユーザーの許可なしでツールが利用できるようにしていることなどが主な変更点です。
また、補足として、ビルトインツールの aws に関してはデフォルトで trust read-only commands となっており、読み取り専用の権限となっている模様でした。
[aws_tf] > /tools
Tool Permission
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔Built-in
...
- aws trust read-only commands
...
...
AGENTS.md は以下のような内容で定義しました(これは Kiro CLI では自動生成されないので、別途新規作成してください)。
# ガイドライン
## terraform の実行について
* terraform plan のみ許可
* terraform plan の実行結果は `terraform-plan-<YYYYMMDDHHMMSS>.log` のフォーマットのファイルにログ出力すること
## terraform への既存リソースの取り込み指示について
* terraform への既存リソースの取り込み指示が合った場合は以下に準ずること
* 単一のリソースに対する取り込み指示であっても、関連または依存するリソースタイプがないかを網羅し、ある場合はそれらも一緒に取り込むこと
* aws の built in tool および現在設定されているクレデンシャル情報を元にリモートのリソースを参照すること
* main.tf へ import block および resource block を実装し、差分がない状態にすること
* terraform.tf や providers.tf を参考に、リージョンを選択肢、適切なバージョンのドキュメントを参照すること
これでカスタムエージェントのための簡単なセットアップができたので、次項ではいよいよ取り込み作業をしていきます。
Terraform 取り込みの実施
いよいよ Terraform への取り込みを実施していきましょう。
再度 Kiro CLI を起動します。先ほどとは異なり、--agent オプションを用いてカスタムエージェントを指定しましょう。
kiro-cli --agent aws_tf
% kiro-cli --agent aws_tf
✓ aws-knowledge-mcp-server loaded in 2.08 s
✓ awslabs.terraform-mcp-server loaded in 4.24 s
⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢀⣴⣶⣶⣦⡀⠀⠀⠀⢀⣴⣶⣦⣄⡀⠀⠀⢀⣴⣶⣶⣦⡀⠀⠀⢀⣴⣶⣶⣶⣶⣶⣶⣶⣶⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣶⣶⣶⣶⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢰⣿⠋⠁⠈⠙⣿⡆⠀⢀⣾⡿⠁⠀⠈⢻⡆⢰⣿⠋⠁⠈⠙⣿⡆⢰⣿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣦⠀⠀⠀⠀⣴⡿⠟⠋⠁⠀⠀⠀⠈⠙⠻⢿⣦⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣿⣇⣴⡿⠋⠀⠀⠀⢀⣼⠇⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⢠⣤⣤⣤⣤⣄⠀⠀⠀⠀⣿⡆⠀⠀⣼⡟⠀⠀⠀⠀⣀⣀⣀⠀⠀⠀⠀⢻⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣿⡿⠋⠀⠀⠀⢀⣾⡿⠁⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⢸⣿⠉⠉⠉⣿⡇⠀⠀⠀⣿⡇⠀⣼⡟⠀⠀⠀⣰⡿⠟⠛⠻⢿⣆⠀⠀⠀⢻⣧⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⠙⠁⠀⠀⢀⣼⡟⠁⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⢸⣿⣶⣶⡶⠋⠀⠀⠀⠀⣿⠇⢰⣿⠀⠀⠀⢰⣿⠀⠀⠀⠀⠀⣿⡆⠀⠀⠀⣿⡆
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣼⠟⠀⢸⣿⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⣿⡇
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⠀⣠⡀⠀⠀⠹⣷⡄⠀⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⣤⣄⠀⠀⠀⠀⠹⣿⡅⠀⠀⠸⣿⠀⠀⠀⠸⣿⠀⠀⠀⠀⠀⣿⠇⠀⠀⠀⣿⠇
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣾⡟⣷⡀⠀⠀⠘⣿⣆⠀⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⣿⡟⣷⡀⠀⠀⠀⠘⣿⣆⠀⠀⢻⣧⠀⠀⠀⠹⣷⣦⣤⣤⣾⠏⠀⠀⠀⣼⡟
⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀⠀⠀⠈⢻⡇⠀⢸⣿⠀⠀⠀⠀⣿⡇⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀⠀⠀⠀⠈⢻⡇⠀⠀⢻⣧⠀⠀⠀⠀⠉⠉⠉⠀⠀⠀⠀⣼⡟
⠀⠀⠀⠀⠀⠀⠀ ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀⠀⢀⣼⠇⠀⠸⣿⣄⡀⢀⣠⣿⠇⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀⠀⠀⢀⣼⠇⠀⠀⠀⠻⣷⣦⣄⡀⠀⠀⠀⢀⣠⣴⣾⠟
⠀⠀⠀⠀⠀⠀⠀ ⠀⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁⠀⠀⠀⠀⠀⠈⠙⠻⠿⠿⠿⠿⠟⠋⠁
╭─────────────────────────────── Did you know? ────────────────────────────────╮
│ │
│ Use /tangent or ctrl + t (customizable) to │
│ start isolated conversations ( ↯ ) that don't affect your main chat │
│ history │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
Model: Auto (/model to change) | Plan: KIRO FREE (/usage for more detail)
[aws_tf] >
取り込み指示を行います。
途中 AWS CLI の実行に伴う確認を求められるので、問題がなければ許可してください。
[aws_tf] > kiro-terraform-import-demo という S3 バケットを terraform へ取り込んでください。
[aws_tf] > kiro-terraform-import-demo という S3 バケットを terraform へ取り込んでください。
> S3バケット kiro-terraform-import-demo をTerraformに取り込みます。まず、現在のTerraform設定を確認し、その後AWSからバケット情報を取得して取り込みを行います。
Batch fs_read operation with 2 operations (using tool: read)
Purpose: Terraform設定ファイルの確認
↱ Operation 1: Reading file: /your_path/kiro_aws_tf_playground/terraform.tf, all lines
↱ Operation 2: Reading file: /your_path/kiro_aws_tf_playground/providers.tf, all lines
✓ Successfully read 153 bytes from /your_path/kiro_aws_tf_playground/terraform.tf
✓ Successfully read 46 bytes from /your_path/kiro_aws_tf_playground/providers.tf
⋮
- Summary: 2 operations processed, 2 successful, 0 failed
- Completed in 0.0s
Running aws cli command (using tool: aws):
Service name: s3api
Operation name: head-bucket
Parameters:
- bucket: "kiro-terraform-import-demo"
Region: ap-northeast-1
Label: S3バケット情報の取得
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
[aws_tf] > y
Running aws cli command (using tool: aws):
Service name: s3api
Operation name: get-bucket-versioning
Parameters:
- bucket: "kiro-terraform-import-demo"
Region: ap-northeast-1
Label: S3バケットのバージョニング設定取得
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
[aws_tf] > y
Running aws cli command (using tool: aws):
Service name: s3api
Operation name: get-bucket-encryption
Parameters:
- bucket: "kiro-terraform-import-demo"
Region: ap-northeast-1
Label: S3バケットの暗号化設定取得
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
[aws_tf] > y
Running aws cli command (using tool: aws):
Service name: s3api
Operation name: get-public-access-block
Parameters:
- bucket: "kiro-terraform-import-demo"
Region: ap-northeast-1
Label: S3バケットのパブリックアクセスブロック設定取得
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
[aws_tf] > y
Running aws cli command (using tool: aws):
Service name: s3api
Operation name: get-bucket-tagging
Parameters:
- bucket: "kiro-terraform-import-demo"
Region: ap-northeast-1
Label: S3バケットのタグ取得
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
[aws_tf] > y
- Completed in 0.599s
- Completed in 0.453s
- Completed in 0.437s
- Completed in 0.539s
⋮
● Execution failed after 0.436s:
An error occurred (NoSuchTagSet) when calling the GetBucketTagging operation: The TagSet does not exist
Reading file: /your_path/kiro_aws_tf_playground/main.tf, from line 1 to 1 (using tool: read) ⋮
● Execution failed after 0.0s:
starting index: 1 is outside of the allowed range: (0, 0)
Reading directory: /your_path/kiro_aws_tf_playground (using tool: read, max depth: 0)
✓ Successfully read directory /your_path/kiro_aws_tf_playground (10 entries)
- Completed in 0.0s
> 取得した情報を元に、S3バケットとその関連リソース(パブリックアクセスブロック、暗号化設定)をmain.tfに追加します。
I'll create the following file: main.tf (using tool: write)
Purpose: S3バケットのimport blockとresource blockを追加
+ 1: import {
+ 2: to = aws_s3_bucket.kiro_terraform_import_demo
+ 3: id = "kiro-terraform-import-demo"
+ 4: }
+ 5:
+ 6: resource "aws_s3_bucket" "kiro_terraform_import_demo" {
+ 7: bucket = "kiro-terraform-import-demo"
+ 8: }
+ 9:
+ 10: import {
+ 11: to = aws_s3_bucket_public_access_block.kiro_terraform_import_demo
+ 12: id = "kiro-terraform-import-demo"
+ 13: }
+ 14:
+ 15: resource "aws_s3_bucket_public_access_block" "kiro_terraform_import_demo" {
+ 16: bucket = aws_s3_bucket.kiro_terraform_import_demo.id
+ 17: block_public_acls = true
+ 18: block_public_policy = true
+ 19: ignore_public_acls = true
+ 20: restrict_public_buckets = true
+ 21: }
+ 22:
+ 23: import {
+ 24: to = aws_s3_bucket_server_side_encryption_configuration.kiro_terraform_import_demo
+ 25: id = "kiro-terraform-import-demo"
+ 26: }
+ 27:
+ 28: resource "aws_s3_bucket_server_side_encryption_configuration" "kiro_terraform_import_demo" {
+ 29: bucket = aws_s3_bucket.kiro_terraform_import_demo.id
+ 30:
+ 31: rule {
+ 32: bucket_key_enabled = true
+ 33: apply_server_side_encryption_by_default {
+ 34: sse_algorithm = "AES256"
+ 35: }
+ 36: }
+ 37: }
Replacing: main.tf
- Completed in 0.0s
> それでは、terraform planを実行して差分がないことを確認します。
Running tool ExecuteTerraformCommand with the param (from mcp server: awslabs.terraform-mcp-server)
⋮ {
⋮ "command": "plan",
⋮ "working_directory": "/your_path/kiro_aws_tf_playground",
⋮ "aws_region": "ap-northeast-1"
⋮ }
- Completed in 5.393s
I'll create the following file: /your_path/kiro_aws_tf_playground/terraform-plan-20251124190259.log (using tool: write)
Purpose: terraform planの結果をログファイルに保存
+ 1: aws_s3_bucket.kiro_terraform_import_demo: Preparing import... [id=kiro-terraform-import-demo]
+ 2: aws_s3_bucket.kiro_terraform_import_demo: Refreshing state... [id=kiro-terraform-import-demo]
+ 3: aws_s3_bucket_public_access_block.kiro_terraform_import_demo: Preparing import... [id=kiro-terraform-import-demo]
+ 4: aws_s3_bucket_server_side_encryption_configuration.kiro_terraform_import_demo: Preparing import... [id=kiro-terraform-import-demo]
+ 5: aws_s3_bucket_public_access_block.kiro_terraform_import_demo: Refreshing state... [id=kiro-terraform-import-demo]
+ 6: aws_s3_bucket_server_side_encryption_configuration.kiro_terraform_import_demo: Refreshing state... [id=kiro-terraform-import-demo]
+ 7:
+ 8: Terraform will perform the following actions:
+ 9:
+ 10: # aws_s3_bucket.kiro_terraform_import_demo will be imported
+ 11: resource "aws_s3_bucket" "kiro_terraform_import_demo" {
+ 12: acceleration_status = null
+ 13: arn = "arn:aws:s3:::kiro-terraform-import-demo"
+ 14: bucket = "kiro-terraform-import-demo"
+ 15: bucket_domain_name = "kiro-terraform-import-demo.s3.amazonaws.com"
+ 16: bucket_prefix = null
+ 17: bucket_region = "ap-northeast-1"
+ 18: bucket_regional_domain_name = "kiro-terraform-import-demo.s3.ap-northeast-1.amazonaws.com"
+ 19: force_destroy = false
+ 20: hosted_zone_id = "Z2M4EHUR26P7ZW"
+ 21: id = "kiro-terraform-import-demo"
+ 22: object_lock_enabled = false
+ 23: policy = null
+ 24: region = "ap-northeast-1"
+ 25: request_payer = "BucketOwner"
+ 26: tags = {}
+ 27: tags_all = {}
+ 28:
+ 29: grant {
+ 30: id = "xxxxxxxxxxx"
+ 31: permissions = [
+ 32: "FULL_CONTROL",
+ 33: ]
+ 34: type = "CanonicalUser"
+ 35: uri = null
+ 36: }
+ 37:
+ 38: server_side_encryption_configuration {
+ 39: rule {
+ 40: bucket_key_enabled = true
+ 41:
+ 42: apply_server_side_encryption_by_default {
+ 43: kms_master_key_id = null
+ 44: sse_algorithm = "AES256"
+ 45: }
+ 46: }
+ 47: }
+ 48:
+ 49: versioning {
+ 50: enabled = false
+ 51: mfa_delete = false
+ 52: }
+ 53: }
+ 54:
+ 55: # aws_s3_bucket_public_access_block.kiro_terraform_import_demo will be imported
+ 56: resource "aws_s3_bucket_public_access_block" "kiro_terraform_import_demo" {
+ 57: block_public_acls = true
+ 58: block_public_policy = true
+ 59: bucket = "kiro-terraform-import-demo"
+ 60: id = "kiro-terraform-import-demo"
+ 61: ignore_public_acls = true
+ 62: region = "ap-northeast-1"
+ 63: restrict_public_buckets = true
+ 64: }
+ 65:
+ 66: # aws_s3_bucket_server_side_encryption_configuration.kiro_terraform_import_demo will be imported
+ 67: resource "aws_s3_bucket_server_side_encryption_configuration" "kiro_terraform_import_demo" {
+ 68: bucket = "kiro-terraform-import-demo"
+ 69: expected_bucket_owner = null
+ 70: id = "kiro-terraform-import-demo"
+ 71: region = "ap-northeast-1"
+ 72:
+ 73: rule {
+ 74: blocked_encryption_types = []
+ 75: bucket_key_enabled = true
+ 76:
+ 77: apply_server_side_encryption_by_default {
+ 78: kms_master_key_id = null
+ 79: sse_algorithm = "AES256"
+ 80: }
+ 81: }
+ 82: }
+ 83:
+ 84: Plan: 3 to import, 0 to add, 0 to change, 0 to destroy.
+ 85:
+ 86: -----------------------------------------------------------------------------
+ 87:
+ 88: Note: You didn't use the -out option to save this plan, so Terraform can't
+ 89: guarantee to take exactly these actions if you run "terraform apply" now.
Creating: /your_path/kiro_aws_tf_playground/terraform-plan-20251124190259.log
- Completed in 0.0s
> S3バケット kiro-terraform-import-demo のTerraformへの取り込みが完了しました。
## 実施内容
以下の3つのリソースをmain.tfに追加しました:
1. aws_s3_bucket - S3バケット本体
2. aws_s3_bucket_public_access_block - パブリックアクセスブロック設定(すべて有効)
3. aws_s3_bucket_server_side_encryption_configuration - サーバーサイド暗号化設定(AES256、Bucket Key有効)
## 結果
terraform planの実行結果:
- **Plan: 3 to import, 0 to add, 0 to change, 0 to destroy**
- 差分なしで取り込み可能な状態です
実行ログは terraform-plan-20251124190259.log に保存しました。
次回 terraform apply を実行すると、これらのリソースがTerraformの管理下に入ります。
▸ Credits: 0.65 • Time: 1m 19s
しっかりと差分なく、取り込めた模様です(terraform plan の実行結果やログもしっかり出力されました)。
また、今回のデモでは S3 のバケット本体の aws_s3_bucket だけでなく、aws_s3_bucket_public_access_block や aws_s3_bucket_server_side_encryption_configuration といった関連リソースについても取り込まれました🎉
おわりに
自然言語などをもとに AWS 環境への API 実行を間接的に行えるビルトインツールを持った Kiro CLI と AWS 公式 MCP サーバーを使うことで、便利に AWS リソースへの操作が行えることが分かりました。今回は Terraform へのリソース取り込みに焦点を当てましたが、初期構築やその他の作業等、幅広く利用していけそうな印象です。今後も色々と活用方法などを模索していきたいと思います!
参考
