[HCP Terraform]VCS連携したWorkspaceのPlanをローカルのCLIから実行する
HCP TerraformのVCS Driven Workflowでは、VCSに変更があった際に自動的にTerraformのplan・applyを実行するように設定できます。
通常tfファイルにバックエンド用のWorkspaceを定義するのですが、VCS Driven Workflowでは設定を省略できます。
「VCS Driven Workflow利用時に、どうやってローカルからterraform plan
を実行すればよいのか?」という質問をもらったため、ブログにします。
結論、コンソールに環境変数で以下をセットすれば可能です。
- HCP Terraform Organizations名(
TF_CLOUD_ORGANIZATION
) - Workspace名(
TF_WORKSPACE
)
export TF_CLOUD_ORGANIZATION=<Organizations名>
export TF_WORKSPACE=<Workspace名>
Workspace(VCS Driven)とtfファイルの用意
以下のコードを使います。
cloudブロック
の設定は以下で、空にしています。
terraform {
required_version = ">= 1.10.2"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.82.2"
}
}
cloud {}
}
Working Directoryに上記のコードがある部分を設定、実行モードはRemoteでWorkspaceを作成しました。
Runが成功したところまで確認しました。
ちなみに、この状態でローカルでコマンドを実行すると以下のようにエラーがでます。
terraform plan
╷
│ Error: Invalid or missing required argument
│
│ "organization" must be set in the
│ cloud configuration or as an
│ environment variable:
│ TF_CLOUD_ORGANIZATION.
╵
╷
│ Error: Invalid workspaces configuration
│
│ Missing workspace mapping
│ strategy. Either workspace "tags"
│ or "name" is required.
│
│ The 'workspaces' block configures
│ how Terraform CLI maps its
│ workspaces for this single
│ configuration to workspaces
│ within an HCP Terraform or
│ Terraform Enterprise
│ organization. Two strategies are
│ available:
│
│ [bold]tags[reset] - A set of tags
│ used to select remote HCP
│ Terraform or Terraform Enterprise
│ workspaces to be used for this
│ single
│ configuration. New workspaces
│ will automatically be tagged with
│ these tag values. Generally, this
│ is the primary and recommended
│ strategy to use. This option
│ conflicts with "name".
│
│ [bold]name[reset] - The name of a
│ single HCP Terraform or Terraform
│ Enterprise workspace to be used
│ with this configuration.
│ When configured, only the
│ specified workspace can be used.
│ This option conflicts with "tags"
│ and with the TF_WORKSPACE
│ environment variable.
環境変数をセット
ローカルのtfファイルがあるディレクトリに移動します。
以下のコマンドを実行して、環境変数をセットします。
export TF_CLOUD_ORGANIZATION=<Organizations名>
export TF_WORKSPACE=<Workspace名>
動作確認
ローカルからのPlan
ローカルからPlanを実行し、正常に実行できることを確認できました。
terraform plan
No changes. Your infrastructure matches the configuration.
ローカルのtfファイルを書き換えて、Planしてみます。
EC2のEnvタグをprod
-> test
に変更しました。
resource "aws_instance" "main" {
ami = data.aws_ssm_parameter.amazonlinux_2023.value
instance_type = "t3.micro"
subnet_id = module.vpc.private_subnets[0]
tags = {
Name = local.name
# 自動デプロイのテスト時にコメント外す
+ Env = "test"
- Env = "prod"
}
}
Planを実行してみると、ローカルで変更したファイルの情報が反映されて差分が確認できました。
terraform plan
Terraform will perform the following actions:
# aws_instance.main will be updated in-place
~ resource "aws_instance" "main" {
id = "i-hogehoge"
~ tags = {
~ "Env" = "prod" -> "test"
"Name" = "prod-hcp-tf-aws-book"
}
~ tags_all = {
~ "Env" = "prod" -> "test"
# (1 unchanged element hidden)
}
# (38 unchanged attributes hidden)
# (8 unchanged blocks hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
ちなみに、Plan自体はHCP Terraform上で行われてコンソールには結果がストリーミングされている形になります。
ローカルにAWS認証情報をセットする必要はありません。
ローカルからのApply
Applyの動作についても、確認します。
結論、Applyは実行できずエラーがでます。
「ローカルから、ユーザーが間違ってApplyしてしまった」といったことを避けられて良いですね。
terraform apply
│ Error: Apply not allowed for workspaces with a VCS connection
│
│ A workspace that is connected to a VCS
│ requires the VCS-driven workflow to ensure
│ that the VCS remains the single source of
│ truth.
おわりに
VCS Driven Workflow利用時の、ローカルからのPlanについてでした。
環境変数を設定することで、ローカルからPlanを実行できます。Applyは不可で、HCP Terraform上から実行する必要があります。
cloudブロックと環境変数両方で設定した場合は、cloudブロックが優先されることに注意してください。
以上、AWS事業本部の佐藤(@chari7311)でした。