[HCP Terraform]No Code Provisioningで作成したWorkspaceにリソースをImportしてみた

[HCP Terraform]No Code Provisioningで作成したWorkspaceにリソースをImportしてみた

Clock Icon2025.04.17

No Code Provisioningで作成したHCP Terraform Workspaceに、リソースのImportが可能か気になり試してみました。

結論

可能です。

No-code moduleで作成されるWorkspace及びStatefileはユーザー側で操作可能であるため、Importもできます。

工夫が必要な点もあります。

デフォルトではNo-code Provisioning時に自動的にリソース(Applyの自動承認)が作成されます。

Importする際にはすでにリソースが存在する状態のため、この動作では無駄なリソースが作成されたり、エラーが出たりする可能性があります。

自動的にリソースが作成されないように設定(Applyの自動承認->手動承認に変更※)し、No-code Provisioningを実行する必要があります。

やってみた

No Code Provisioningで作成したWorkspaceに、Amazon SQSキューをImportしてみます。

作成されるWorkspaceのProjectには、AWS認証用のIAMロールが設定されている前提とします。

リソースの作成

SQSキューを作成します。

CloudShell等で以下のコマンドを実行します。

aws sqs create-queue --queue-name no-code-import

Moduleの作成

Private Module用にGitHubリポジトリを作成します。

Private Registryに登録するにはリポジトリの命名が、terraform-[PROVIDER]-[NAME]である必要があります。

今回はterraform-aws-sqsとしました。

GitHubリポジトリ内に、以下のコードを保存します。

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_sqs_queue" "this" {
  name = "no-code-import"
}

コミットして、OriginにPushします。

git add .
git commit -m "add: tag"
git push origin HEAD

Private Registryでリリースタグが必要なため、作成します。

$ gh release create v0.0.1
? Title (optional) v0.0.1
? Release notes Leave blank
? Is this a prerelease? No
? Submit? Publish release
https://github.com/<Org名>/terraform-aws-sqs/releases/tag/v0.0.1

No Code ModuleとしてPrivate Registryに登録

HCP TerraformでPrivate Registryに登録します。この際、No Code Provisioningを有効にします。

vscode-drop-1744869420429-16fk7pu0ow8.png

No Code Provisioning実行

Registryに移動して、Provision workspaceからNo Code Provisioningを実行します。

vscode-drop-1744869345472-kzzd9ar4n9.png

WorkspaceやProjectを指定します。

この際に、Apply methodsManual applyを指定してください。

Auto ApplyではWorkspace作成と同時にApplyが行われるため、リソースが作成されるためです。

vscode-drop-1744865662956-lo7z1gfpzd.png

Runも自動的に作成されますが、同様の理由でdiscardedしておきます。

vscode-drop-1744865925013-nc2o1x7w0zl.png

この時点では、Statefileは空であることを確認できます。

vscode-drop-1744866118007-xl03hzuuwd.png

Importの実行

ではImportを実行してみます。

以下の内容でmain.tfを作成します。

Workspaceの接続とimportを実行します。

main.tf
terraform {
  cloud {
    organization = "<HCP Terraform Organizations名>"

    # No Code Provisioningで作成したWorkspaceとの接続
    workspaces {
      name    = "no-code-import"
      project = "<Project名>" # オプション
    }
  }
}

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

resource "aws_sqs_queue" "this" {
  name = "no-code-import"
}

import {
  to = aws_sqs_queue.this
  id = "https://queue.amazonaws.com/80398EXAMPLE/MyQueue" # 要置き換え
}

Terraformコマンドを実行します。

terraform init
terraform plan

Plan結果を確認すると、1 to importになっていることを確認できます。

plan結果
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.

Applyを実行します。

terraform apply

WorkspaceのStatefileからもImportされていることが確認できました。

vscode-drop-1744867217596-1mdt2caml2j.png

動作確認: No Code Moduleのバージョンアップ

手動でImportしたあとも、No Code ProvisioningでWorkspaceが管理されているか確認してみます。

今回はNo Code Moduleをバージョンアップして、Workspaceに通知が来るかを確認します。

Private Moduleのコードを更新します。

今回はSQSにタグを追加します。

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_sqs_queue" "this" {
  name = "no-code-import"
  # タグの定義を追加
  tags = {
    Name = "no-code-import"
  }
}

originへPush及び、新しいリリースの作成を行います。

git add .
git commit -m "add: tag"
git push origin HEAD
gh release create v0.0.2

Private Moduleのバージョンを更新します。

vscode-drop-1744869618981-ij5wd1wxllq.png

vscode-drop-1744868257619-8kydhwcfgyc.png

Workspaceを見ると、新しいモジュールバージョンが利用可能になっていることを確認できました。

vscode-drop-1744868349974-x3mjwart51q.png

View updateから進んで、アップデートも問題なく実行できました。

vscode-drop-1744868555130-3rz13vg63wg.png

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.