やりたかったこと
VPCとそれに乗るサービスを別々のTerraformで管理、VPCのIDをoutputで出力してそれをterraform_remote_state
で呼び出して利用したかった。 これはできた
workspace
としてvpc-dev
, db-dev
を用意、db-dev
をデプロイする際にvpc-dev
のoutputを利用したかったが、まだworkspace
をまたいでのoutputの利用はうまくできていない...ヘルプミー
とりあえずうまく行った部分だけ共有!
だめな例
├── vpc
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── vpc.tf
output.tf
output "vpc_id" {
value = "${aws_vpc.vpc.id}"
}
main.tf
とvariable.tf
は省略
vpc.tf
module "vpc" {
source = "./vpc"
}
上記だとmoduleのvpcのoutput
になるが、以下の記事からterraformのremote_state
はルートレベルのものしか許容していないためremote_state
は利用できない
ルートレベル出力のみがアクセス可能です
tfstateを覗いて見るとルートにはoutputがなく、vpcモジュールにoutputがある
terraform.tfstate
~~~~~~~~~略~~~~~~~~~~~~
"modules": [
{
"path": [
"root"
],
"outputs": {},
~~~~~~~~~略~~~~~~~~~~~~
"path": [
"root",
"vpc"
],
"outputs": {
"vpc_id": {
"sensitive": false,
"type": "string",
"value": "vpc-*******"
}
},
~~~~~~~~~略~~~~~~~~~~~~
良い例
モジュールを呼び出した所で再度outputしてあげればOK
vpc.tf
module "vpc" {
source = "./vpc"
}
output "vpc_id" {
value = "${module.vpc.vpc_id}"
}
tfstateを見てみるとルートに値があることが確認できる
terraform.tfstate
~~~~~~~~~略~~~~~~~~~~~~
"modules": [
{
"path": [
"root"
],
"outputs": {
"vpc_id": {
"sensitive": false,
"type": "string",
"value": "vpc-********"
}
},
~~~~~~~~~略~~~~~~~~~~~~
"path": [
"root",
"vpc"
],
"outputs": {
"vpc_id": {
"sensitive": false,
"type": "string",
"value": "vpc-*******"
}
},
~~~~~~~~~略~~~~~~~~~~~~
これによってremote_state
からoutputを取得できるようになりました
workspaceをまたいだremote_state
の利用ができるのかがまだわかっていないので知ってる人いたら教えてほしいです