[HCP Terraform]No Code Provisioningで作成したWorkspaceにリソースをImportしてみた
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リポジトリ内に、以下のコードを保存します。
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を有効にします。
No Code Provisioning実行
Registryに移動して、Provision workspace
からNo Code Provisioningを実行します。
WorkspaceやProjectを指定します。
この際に、Apply methods
はManual apply
を指定してください。
Auto Apply
ではWorkspace作成と同時にApplyが行われるため、リソースが作成されるためです。
Runも自動的に作成されますが、同様の理由でdiscarded
しておきます。
この時点では、Statefileは空であることを確認できます。
Importの実行
ではImportを実行してみます。
以下の内容でmain.tf
を作成します。
Workspaceの接続とimportを実行します。
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: 1 to import, 0 to add, 0 to change, 0 to destroy.
Applyを実行します。
terraform apply
WorkspaceのStatefileからもImportされていることが確認できました。
動作確認: No Code Moduleのバージョンアップ
手動でImportしたあとも、No Code ProvisioningでWorkspaceが管理されているか確認してみます。
今回はNo Code Moduleをバージョンアップして、Workspaceに通知が来るかを確認します。
Private Moduleのコードを更新します。
今回はSQSにタグを追加します。
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のバージョンを更新します。
Workspaceを見ると、新しいモジュールバージョンが利用可能になっていることを確認できました。
View update
から進んで、アップデートも問題なく実行できました。