HashiCorp Agent Skills terraform-search-importで既存リソースをインポートしてみた(Claude Code × Terraform)

HashiCorp Agent Skills terraform-search-importで既存リソースをインポートしてみた(Claude Code × Terraform)

2026.03.29

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の操作を効率的に行うための公式スキル集です。

https://github.com/hashicorp/agent-skills

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-guideterraform-testなどのスキルも含まれています。

インストールスコープは、デフォルトでuser(全プロジェクト共通)です。プロジェクト単位で管理したい場合は--scope projectを指定します。

terraform-search-importスキルの概要

terraform-search-importは、Terraform 1.14で追加されたterraform queryコマンドを活用し、既存のクラウドリソースを宣言的に検出してTerraform管理下にインポートするスキルです。terraform queryは、クラウドプロバイダーに存在する実際のリソースを.tfquery.hclファイルで定義したクエリに基づいて検出するコマンドです。

主なユースケースは以下です。

  • 手動で作成したリソースをTerraform管理下に取り込む
  • 既存クラウドインフラの棚卸し・監査
  • 複数リージョン・アカウントにまたがるリソースの検出

ワークフロー

スキルは以下の流れで動作します。

  1. サポート確認 — 対象リソースがterraform queryのlist resourceに対応しているか確認
  2. クエリファイル作成.tfquery.hclファイルにlistブロックを記述
  3. クエリ実行terraform queryで対象リソースを検出
  4. コード生成-generate-config-outオプションでresourceブロックとimportブロックを自動生成
  5. クリーンアップ — computed属性の削除、変数化、命名整理
  6. インポート実行terraform planterraform apply

前提条件

  • Terraform 1.14以上
  • プロバイダーが対象リソースのlist resourceをサポートしていること(最新版を推奨)

listブロックの構文

クエリファイル(.tfquery.hcl)では、listブロックで検出対象を定義します。詳細は公式ドキュメントを参照してください。

https://developer.hashicorp.com/terraform/language/block/tfquery/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管理下にインポートして

プロバイダー設定の作成からインポート完了まで、すべてスキルが自動で行います。以降のセクションでは、各ステップの内容を確認していきます。

環境セットアップ

スキルはまずプロバイダー設定の生成と、対象リソースのサポート確認を行います。

5sgCMo6SL5bjCfWVDbcg0W_md_—_blog.png

生成されたプロバイダー設定です。

terraform.tf
terraform {
  required_version = ">= 1.14"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

terraform init実行後、terraform providers schemaaws_cloudwatch_log_groupがlist resourceとしてサポートされているか確認します。あわせてconfigブロックのスキーマも確認し、CloudWatch Logグループは現在regionでのフィルタに対応しており、名前やタグでの絞り込みが必要な場合はコード上で対象を抽出する形になることを把握します。

リソースの検出

5sgCMo6SL5bjCfWVDbcg0W_md_—_blog.png

続いて、クエリファイルを生成しterraform queryを実行します。

discovery.tfquery.hcl
list "aws_cloudwatch_log_group" "all" {
  provider = aws
}

なお、初回実行時はproviderブロック付きのクエリファイルを生成しましたが、terraform.tfprovider定義と重複エラーになったため、スキルが自動的に修正して再実行しました。

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_idnameregionが含まれます。

アカウント内に他のロググループも存在する場合、すべて検出されます。前述の通り、CloudWatch Logグループは現在regionでのフィルタに対応しており、名前やタグでの絞り込みが必要な場合は全件取得してからコード上で対象を抽出する形になります。

コード生成とクリーンアップ

5sgCMo6SL5bjCfWVDbcg0W_md_—_blog.png

terraform query -generate-config-out=generated.tfでTerraformコードを生成した後、スキルがdemo-で始まるリソースだけを抽出し、クリーンアップしたコードを作成しました。

main.tf(一部抜粋)
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でエラーになったため自動的に除去しました。

インポートの実行

5sgCMo6SL5bjCfWVDbcg0W_md_—_blog.png

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移行を検討している方は試してみてください。

この記事をシェアする

FacebookHatena blogX

関連記事