Terraform Cloudで別のWorkspaceのStateファイルの値を参照する

2023.05.17

「Terraform Cloudで別のWorkspaceのStateファイルを参照するには、どうしたらいいんだろう?」

Terraformを書いていると、別のStateファイルの情報を参照したくなることがあります。

Terraform Cloudの場合、どんな操作が必要かをブログにしてみました。

結論

  • 参照される側
    • WorkspaceのRemote state sharingの設定で参照側のWorkspaceを許可
    • 参照される値をoutputで定義
  • 参照する側
    • data.terraform_remote_stateで該当の値を取得

例えば、VPC IDを他のWorkspaceで参照する場合は以下のようになります。

vpc/main.tf(参照される側)

resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"

  tags = {
    Name = "main"
  }
}

output "vpc_id" {
    value = aws_vpc.main.id
}

securitygroup/main.tf(参照する側)

# OrganizationやWorkspaceを指定してdataで取得
data "terraform_remote_state" "vpc" {
  backend = "remote"

  config = {
    organization = "<Organization名>"
    workspaces = {
      name = "<参照側のWorkspace名>"
    }
  }
}

resource "aws_security_group" "test" {
  name        = "test"
  description = "test"
  # VPC IDを取得
  vpc_id      = data.terraform_remote_state.vpc.outputs.vpc_id
}

補足

参照する側Workspaceの実行モードがLocalの場合、参照される側の以下の作業は不要です。

WorkspaceのRemote state sharingの設定で参照側のWorkspaceを許可

現時点(2023/05/14)では、実行モードLocal参照される側のRemote state sharingで参照側を許可していなくても、参照が可能でした。

やってみる

以下の2つのWorkspace/Stateファイルがあると仮定します。

  • VPC(参照される側)
  • セキュリティグループ(参照する側)

セキュリティグループ WorkspaceでVPC WorkspaceのからVPC IDを参照して、セキュリティグループを作成します。

サンプルコードはGithubにあります。

実際に試す場合は、backend.tf.sampleの値を適切な値に修正して、backend.tfにファイル名を変更してください。

terraform-sample/tfstate-ref-tfc at main · msato0731/terraform-sample

Terraformコードの用意

以下のディレクトリ構成になっています。

VPCとSecurity GroupでStateファイルを分けている構成です。

$ tree  
.
├── security-group
│   ├── backend.tf
│   └── main.tf
└── vpc
    ├── backend.tf
    └── main.tf

必要な部分だけ抜粋して、紹介します。

参照される側のVPCのコードでは、VPC IDをOutputとして定義しています。

vpc/main.tf

# 省略
resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"

  tags = {
    Name = "main"
  }
}

output "vpc_id" {
    value = aws_vpc.main.id
}

参照する側のSecurityGroupのコードでは、dataでWorkspaceのOutputを取得して、VPC IDをセットしています。

security-group/main.tf

# VPC WorkspaceのState取得
data "terraform_remote_state" "vpc" {
  backend = "remote"

  config = {
    organization = "<Organization名>" # 要修正
    workspaces = {
      name = "tfstate-ref-tfc-test-vpc"
    }
  }
}

resource "aws_security_group" "test" {
  name        = "test"
  description = "test"
  # VPC ID取得
  vpc_id      = data.terraform_remote_state.vpc.outputs.vpc_id
}

コードの用意ができたら、terraform initを実行してWorkspaceを作成します。

作成したWorkspaceでTerraform CloudでAWSリソースを作成できるように、AWS認証情報の設定を行なってください。

この時点でVPCの方は、terraform plan/applyに成功します。

しかし、Security Groupの方はVPC WorkspaceのState Fileを参照できず失敗します。

次の手順でSecurity Group Workspaceを許可してください。

VPC Workspace(参照される側)でSecurity Group Workspace(参照する側)を許可

VPC Workspace -> General -> Remote State Sharingを選択して、Security Group WorkspaceをShare先に指定するか組織全体にShareするかを行います。

手順を実施後は、Security Group Workspaceの方でもterraform plan/apply`に成功します。

おわりに

Terraform Cloudで別WorkspaceのStateファイルを参照する手順についてでした。

参照される側のWorkspaceで、他のWorkspaceから参照を許可するかどうかを設定できるのは便利かと思いました。

このWorkspaceのStateファイルはどこのWorkspaceから参照されているかを把握しやすそうです。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考

あわせて読みたい記事