有没有办法在我的AWS账户中已经存在的Terraform资源中使用这些资源,这些资源是手动创建的?我不想更改它们,说实话,我不想“触摸”它们。我只需要一些用于我所创建环境的资源。 例如,vpc和IAM。
我已经阅读了一些有关导入的信息,但是我不确定这是答案吗?
答案 0 :(得分:1)
Terraform有两种使用资源的方式,这些资源存在于要应用的上下文或目录之外。
第一个是data sources,它允许您查找现有资源并将有关它们的信息传递给其他资源。 aws_ami
data source文档提供了这个有用的示例:
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
文档中有一个示例,提供了一个很好的示例,其中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)}"
}
使用现有资源的第二种方法是import them into the state。这使Terraform可以开始管理现有资源,就像Terraform最初创建它们一样。这样,对Terraform配置所做的任何更改都将在下次运行terraform apply
时应用于现有资源。这也意味着,如果您运行terraform destroy
,则资源将被删除。