如何在AWS中已经存在的Terraform资源中使用(手动创建)?

时间:2019-05-28 06:40:17

标签: amazon-web-services terraform

有没有办法在我的AWS账户中已经存在的Terraform资源中使用这些资源,这些资源是手动创建的?我不想更改它们,说实话,我不想“触摸”它们。我只需要一些用于我所创建环境的资源。 例如,vpc和IAM。

我已经阅读了一些有关导入的信息,但是我不确定这是答案吗?

1 个答案:

答案 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,则资源将被删除。