Terraform 有两种使用其所应用的上下文或目录之外存在的资源的方法。
第一个是数据源 https://www.terraform.io/docs/configuration/data-sources.html它允许您查找现有资源并将有关它们的信息传递给其他资源。这aws_ami数据源 https://www.terraform.io/docs/providers/aws/r/instance.html文档提供了这个有用的示例:
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = "${data.aws_ami.ubuntu.id}"
instance_type = "t2.micro"
tags = {
Name = "HelloWorld"
}
}
这允许 Terraform 获取与数据源中指定的条件匹配的现有 AMI,选择最新的 AMI,然后将 AMI 的 ID 传递给aws_instance
资源,以便从该 AMI 构建它。
即使您使用 Terraform 创建所有资源,这仍然很有用,因为它允许您拆分 Terraform 配置以限制爆炸半径并控制同时更新的内容,同时仍然允许您访问有关这些资源的信息。这aws_subnet_ids https://www.terraform.io/docs/providers/aws/d/subnet_ids.html文档中有一个示例提供了一个很好的示例,其中子网可能是由 Terraform 在与您要创建的实例不同的上下文或目录中创建的:
data "aws_subnet_ids" "private" {
vpc_id = "${var.vpc_id}"
tags = {
Tier = "Private"
}
}
resource "aws_instance" "app" {
count = "3"
ami = "${var.ami}"
instance_type = "t2.micro"
subnet_id = "${element(data.aws_subnet_ids.private.ids, count.index)}"
}
利用现有资源的第二种方法是将它们导入该州 https://www.terraform.io/docs/import/index.html。这允许 Terraform 开始管理现有资源,就像 Terraform 最初创建它们一样。因此,当您下次运行时,对 Terraform 配置所做的任何更改都将应用于现有资源terraform apply
。这也意味着如果你跑了terraform destroy
那么该资源将被删除。