【发布时间】:2021-05-12 17:46:53
【问题描述】:
Terraform v0.12.x
这是我的另一篇帖子How to use Terraform modules for code re-use? 的后续问题。
我有 2 个旨在重用其他模块的模块。我的目录结构是...
/terraform/
/terraform/blue/main.tf
/terraform/green/main.tf
/terraform/module_snapshot/main.tf
/terraform/module_ebs/main.tf
我想在两个部署之间重复使用 module_ebs/main.tf,blue/main.tf 和 green/main.tf。它只是这样做
resource "aws_ebs_volume" "ebs" {
availability_zone = "us-east-1a"
snapshot_id = "sn-123456abcded"
size = 500
type = "gp2"
tags = {
Name = "test-ebs"
}
}
output "ebs_id" {
value = aws_ebs_volume.ebs.id
description = "Volume id of the EBS volume"
}
这个想法是green/main.tf 使用module_ebs/main.tf 创建一个EBS 卷(它有一个名为ebs_id 的输出)。
provider "aws" {
region = "us-east-1"
}
terraform {
required_version = ">= 0.12.17, < 0.13"
backend "s3" {
bucket = "my-terraform-states"
key = "test-modules/terraform.tfstate"
region = "us-east-1"
}
}
module "green_ebs" {
source "../module_ebs"
}
output "green_ebs_id" {
value = module.green_ebs.ebs_id
}
当我这样做时,我得到了所需的 EBS 卷
$ cd /terraform/green
$ terraform plan -out out.o
$ terraform apply "out.o"
green_ebs_id = "vol-123456abcdef"
现在我想让blue/main.tf 拍摄green 的EBS 卷的快照,所以我这样做了
provider "aws" {
region = "us-east-1"
}
terraform {
required_version = ">= 0.12.17, < 0.13"
backend "s3" {
bucket = "my-terraform-states"
key = "test-modules/terraform.tfstate"
region = "us-east-1"
}
}
module "green" {
source "../module"
}
module "snapshot" {
source "../module_snapshot"
green_ebs_id = module.green.green_ebs_id
}
output "blue_ebs_id" {
value = module.blue_ebs.ebs_id
}
但是,当我运行上述脚本时,它(当然)也运行green/main.tf,这当然会破坏它的 EBS 卷并创建另一个卷,这不是我想要做的。
$ cd /terraform/blue
$ terraform plan -out out.o
# module.green.aws_ebs_volume.ebs will be destroyed
- resource "aws_ebs_volume" "ebs" {
...
}
如何在不销毁和重新创建资源的情况下使用其他部署的资源?
【问题讨论】:
标签: terraform terraform-provider-aws