HashiCorp Agent Skills terraform-search-importで既存リソースをインポートしてみた(Claude Code × Terraform)
HashiCorp Agent Skillsには、既存クラウドリソースの検出からTerraformインポートまでを行うterraform-search-importというスキルがあります。
今回はClaude Codeでこのスキルを使い、AWS CLIで作成したAmazon CloudWatch Logsのロググループを検出し、Terraform管理下にインポートしてみます。
HashiCorp Agent Skillsとは
HashiCorp Agent Skillsは、AIエージェント(Claude Code等)がTerraformの操作を効率的に行うための公式スキル集です。
Terraformのコード生成、スタイルガイド準拠、テスト作成など、さまざまなスキルが提供されています。今回使用するterraform-search-importは、terraform/code-generation/skills/配下にあるスキルの一つです。
Claude Codeへのインストール
HashiCorp Agent Skillsは、Claude Codeのプラグイン機能でインストールできます。
マーケットプレイス経由
まず、HashiCorpのマーケットプレイスを登録します。
claude plugin marketplace add hashicorp/agent-skills
次に、terraform-search-importを含むterraform-code-generationプラグインをインストールします。
claude plugin install terraform-code-generation@hashicorp
terraform-code-generationプラグインには、terraform-search-importのほかにterraform-style-guideやterraform-testなどのスキルも含まれています。
インストールスコープは、デフォルトでuser(全プロジェクト共通)です。プロジェクト単位で管理したい場合は--scope projectを指定します。
terraform-search-importスキルの概要
terraform-search-importは、Terraform 1.14で追加されたterraform queryコマンドを活用し、既存のクラウドリソースを宣言的に検出してTerraform管理下にインポートするスキルです。terraform queryは、クラウドプロバイダーに存在する実際のリソースを.tfquery.hclファイルで定義したクエリに基づいて検出するコマンドです。
主なユースケースは以下です。
- 手動で作成したリソースをTerraform管理下に取り込む
- 既存クラウドインフラの棚卸し・監査
- 複数リージョン・アカウントにまたがるリソースの検出
ワークフロー
スキルは以下の流れで動作します。
- サポート確認 — 対象リソースが
terraform queryのlist resourceに対応しているか確認 - クエリファイル作成 —
.tfquery.hclファイルにlistブロックを記述 - クエリ実行 —
terraform queryで対象リソースを検出 - コード生成 —
-generate-config-outオプションでresourceブロックとimportブロックを自動生成 - クリーンアップ — computed属性の削除、変数化、命名整理
- インポート実行 —
terraform plan→terraform apply
前提条件
- Terraform 1.14以上
- プロバイダーが対象リソースのlist resourceをサポートしていること(最新版を推奨)
listブロックの構文
クエリファイル(.tfquery.hcl)では、listブロックで検出対象を定義します。詳細は公式ドキュメントを参照してください。
list "<リソースタイプ>" "<シンボリック名>" {
provider = <プロバイダー参照>
config {
filter {
name = "<フィルタ名>"
values = ["<値1>", "<値2>"]
}
}
limit = 100
}
configブロックのフィルタはプロバイダー固有で、タグやリージョンなどで絞り込みが可能です。
やってみた
事前準備: CloudWatch Logsロググループの作成
検証用に、AWS CLIでロググループを10個作成します。
for i in $(seq 1 5); do
aws logs create-log-group --log-group-name "demo-prod-$i"
aws logs create-log-group --log-group-name "demo-dev-$i"
done
作成を確認します。
aws logs describe-log-groups --log-group-name-prefix "demo-" --query 'logGroups[].logGroupName' --output table
---------------------
|DescribeLogGroups |
+-------------------+
| demo-dev-1 |
| demo-dev-2 |
| demo-dev-3 |
| demo-dev-4 |
| demo-dev-5 |
| demo-prod-1 |
| demo-prod-2 |
| demo-prod-3 |
| demo-prod-4 |
| demo-prod-5 |
+-------------------+
Claude Codeでスキルを実行
空のディレクトリでClaude Codeに以下のように依頼します。
既存のCloudWatch Logsロググループ(demo-で始まるもの)をTerraform管理下にインポートして
プロバイダー設定の作成からインポート完了まで、すべてスキルが自動で行います。以降のセクションでは、各ステップの内容を確認していきます。
環境セットアップ
スキルはまずプロバイダー設定の生成と、対象リソースのサポート確認を行います。

生成されたプロバイダー設定です。
terraform {
required_version = ">= 1.14"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
terraform init実行後、terraform providers schemaでaws_cloudwatch_log_groupがlist resourceとしてサポートされているか確認します。あわせてconfigブロックのスキーマも確認し、CloudWatch Logグループは現在regionでのフィルタに対応しており、名前やタグでの絞り込みが必要な場合はコード上で対象を抽出する形になることを把握します。
リソースの検出

続いて、クエリファイルを生成しterraform queryを実行します。
list "aws_cloudwatch_log_group" "all" {
provider = aws
}
なお、初回実行時はproviderブロック付きのクエリファイルを生成しましたが、terraform.tfのprovider定義と重複エラーになったため、スキルが自動的に修正して再実行しました。
terraform queryの実行結果です。
list.aws_cloudwatch_log_group.all account_id=123456789012,name=/aws/apigateway/welcome,region=ap-northeast-1 /aws/apigateway/welcome
list.aws_cloudwatch_log_group.all account_id=123456789012,name=demo-dev-1,region=ap-northeast-1 demo-dev-1
list.aws_cloudwatch_log_group.all account_id=123456789012,name=demo-dev-2,region=ap-northeast-1 demo-dev-2
...
list.aws_cloudwatch_log_group.all account_id=123456789012,name=demo-prod-5,region=ap-northeast-1 demo-prod-5
出力は<クエリアドレス> <identity属性> <名前>の形式です。identity属性にはaccount_id、name、regionが含まれます。
アカウント内に他のロググループも存在する場合、すべて検出されます。前述の通り、CloudWatch Logグループは現在regionでのフィルタに対応しており、名前やタグでの絞り込みが必要な場合は全件取得してからコード上で対象を抽出する形になります。
コード生成とクリーンアップ

terraform query -generate-config-out=generated.tfでTerraformコードを生成した後、スキルがdemo-で始まるリソースだけを抽出し、クリーンアップしたコードを作成しました。
resource "aws_cloudwatch_log_group" "demo_dev_1" {
name = "demo-dev-1"
retention_in_days = 0
log_group_class = "STANDARD"
}
import {
to = aws_cloudwatch_log_group.demo_dev_1
identity = {
account_id = "123456789012"
name = "demo-dev-1"
region = "ap-northeast-1"
}
}
resource "aws_cloudwatch_log_group" "demo_prod_1" {
name = "demo-prod-1"
retention_in_days = 0
log_group_class = "STANDARD"
}
import {
to = aws_cloudwatch_log_group.demo_prod_1
identity = {
account_id = "123456789012"
name = "demo-prod-1"
region = "ap-northeast-1"
}
}
# ... 残り8個も同様
ポイントとしては、importブロックのprovider引数はresourceブロックが存在する場合は不要です。スキルは最初provider = awsを含めていましたが、terraform planでエラーになったため自動的に除去しました。
インポートの実行

terraform planでインポート内容を確認します。
aws_cloudwatch_log_group.demo_dev_1: Preparing import... [identity=account_id=123456789012,name=demo-dev-1,region=ap-northeast-1]
aws_cloudwatch_log_group.demo_dev_2: Preparing import... [identity=account_id=123456789012,name=demo-dev-2,region=ap-northeast-1]
...
Plan: 10 to import, 0 to add, 0 to change, 0 to destroy.
差分がないことを確認し、terraform applyで適用します。
aws_cloudwatch_log_group.demo_dev_1: Importing... [identity=account_id=123456789012,name=demo-dev-1,region=ap-northeast-1]
aws_cloudwatch_log_group.demo_dev_1: Import complete [identity=account_id=123456789012,name=demo-dev-1,region=ap-northeast-1]
...
Apply complete! Resources: 10 imported, 0 added, 0 changed, 0 destroyed.
10個のロググループがすべてTerraform管理下にインポートされました。
後片付け
検証用リソースを削除します。
terraform destroy
Terraformで管理していないロググループが残っている場合は、AWS CLIで削除します。
for i in $(seq 1 5); do
aws logs delete-log-group --log-group-name "demo-prod-$i"
aws logs delete-log-group --log-group-name "demo-dev-$i"
done
おわりに
HashiCorp Agent Skillsのterraform-search-importスキルを使い、CloudWatch Logsロググループの検出からTerraformインポートまでを試しました。
Claude Codeにインポートしたい旨を伝えるだけで、サポート状況の確認からクエリ作成、コード生成までを一連の流れで実行してくれます。手動で1つずつterraform importを実行する手間と比較すると、大幅に効率化できます。
また、terraform queryの構文やimportブロックの書き方を知らなくても、スキルが適切なコードを生成してくれるため、Terraformに慣れていない方でも既存リソースのインポートに取り組みやすいと感じました。既存リソースのTerraform移行を検討している方は試してみてください。







