来自另一个Terraform计划的参考变量

时间:2019-03-22 06:02:46

标签: amazon-web-services amazon-ec2 terraform terraform-provider-aws aws-dms

我已经使用Terraform在AWS中创建了具有主要和灾难恢复网站架构的设置。

主网站位于Region1中,灾难恢复位于Region2中。该脚本创建为不同的计划或不同的目录。

对于region1,我创建了一个目录,该目录仅包含主要网站Terraform脚本以启动主要网站基础结构。

对于region2,我创建了另一个目录,该目录仅包含灾难恢复网站Terraform脚本以启动灾难恢复网站基础结构。

在我的主要网站脚本中,我需要一些灾难恢复网站的值,例如VPC对等连接ID,DMS端点ARN等。

如何从灾难恢复网站目录到主网站目录引用这些变量?

1 个答案:

答案 0 :(得分:2)

一种选择是使用terraform_remote_state data source从另一个状态文件中获取输出,如下所示:

vpc / main.tf

resource "aws_vpc" "foo" {
  cidr_block = "10.0.0.0/16"
}

output "vpc_id" {
  value = "${aws_vpc.foo.id}"
}

route / main.tf

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "us-east-1"
  }
}

resource "aws_route_table" "rt" {
  vpc_id = "${data.terraform_remote_state.vpc.vpc_id}"
}

但是,只要提供程序的本机数据源存在于所需资源中,几乎总是更好的选择。

因此,在您的情况下,您将需要使用数据源(例如aws_vpc_peering_connection数据源)才能通过以下方式建立跨VPC路由:

data "aws_vpc_peering_connection" "pc" {
  vpc_id          = "${data.aws_vpc.foo.id}"
  peer_cidr_block = "10.0.0.0/16"
}

resource "aws_route_table" "rt" {
  vpc_id = "${aws_vpc.foo.id}"
}

resource "aws_route" "r" {
  route_table_id            = "${aws_route_table.rt.id}"
  destination_cidr_block    = "${data.aws_vpc_peering_connection.pc.peer_cidr_block}"
  vpc_peering_connection_id = "${data.aws_vpc_peering_connection.pc.id}"
}

您需要对灾难恢复区域中的其他任何ID或需要引用的内容执行类似的操作。

值得注意的是,DMS资源没有任何数据源,因此您要么需要使用terraform_remote_state数据源来获取所有ID(例如源{{3}和目标端点ARN, }}或结构化,以便所有DMS内容都发生在DR区域中,然后您只需要引用其他区域的aws_dms_replication_taskVPC ID和可能的database names即可所有这些都是通过数据源完成的。