Amazon web services 使用Terraform获取AMI的动态数据源

Amazon web services 使用Terraform获取AMI的动态数据源,amazon-web-services,terraform,Amazon Web Services,Terraform,因此,以下数据源将获取带有组件的最新AMI:web标记。假设我有一些组件有自己的AMI。是否有一种方法可以使这个块更加动态,而不是创建5次相同的块,这样我就可以传入组件的值?我似乎想不出我能传递的唯一价值。我需要重构一下我的代码吗 data "aws_ami" "web" { filter { name = "state" values = ["available"] } filter { name = "tag:component" val

因此,以下数据源将获取带有
组件的最新AMI:web
标记。假设我有一些组件有自己的AMI。是否有一种方法可以使这个块更加动态,而不是创建5次相同的块,这样我就可以传入
组件的值
?我似乎想不出我能传递的唯一价值。我需要重构一下我的代码吗

data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["web"]
  }

  most_recent = true
}
我有一个
默认值
模块,它充当元数据查找,在那里它获取并输出基本内容,如AMI ID和VPC ID

默认模块 主代码
我将
aws\u ami
数据源移动到模块中,让它直接查找ami,而不是从外部传入

因此,我将
ec2_实例
模块更改为:

variable "ami_component" {}

data "aws_ami" "selected" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["${var.ami_component"]
  }

  most_recent = true
}

resource "aws_instance" "instance" {
  ami           = "${data.aws_ami.selected.id}"
  instance_type = "t2.micro"

  tags {
    Name = "HelloWorld"
  }
}
如果您当时觉得需要能够覆盖
ec2\u实例
模块中的AMI,您可以将其改为:

variable "ami_component" {}

variable "override_ami" {
  default = ""
}

data "aws_ami" "selected" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["${var.ami_component"]
  }

  most_recent = true
}

resource "aws_instance" "instance" {
  ami           = "${var.override_ami != "" ? var.override_ami : data.aws_ami.selected.id}"
  instance_type = "t2.micro"

  tags {
    Name = "HelloWorld"
  }
}
这将使用一个条件来检查
override\u ami
变量是否已设置为其他变量,在这种情况下,它将使用该变量,否则它将使用
ami\u组件
变量来查找适当的ami并使用该变量


这样做的好处是将AMI选择逻辑移动到Terraform模块中,使该模块的接口更加简单。

为什么这样做,而不是让
ec2_实例
模块根据组件查找AMI id,然后将
组件
作为变量传递给模块?如果需要怎么办出于某种原因覆盖ami id?向模块添加可选的
override\u ami\u id
变量,然后让实例资源使用它(如果已填充)。这里是新的terraform guy。。。有什么例子吗?我不确定我将如何使用这个新变量来反对最新版本的数据源。用一个例子回答。主要思想是模块应该尽量隐藏一些复杂性,并尽可能提供一个简单的接口。模块的调用者在大多数情况下不需要知道如何获取“正确的”AMI,相反,应该能够说它想要一个“web”AMI,并让模块处理它。啊,好的,这是非常有意义的。今天晚些时候让我试一试。
variable "ami_component" {}

data "aws_ami" "selected" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["${var.ami_component"]
  }

  most_recent = true
}

resource "aws_instance" "instance" {
  ami           = "${data.aws_ami.selected.id}"
  instance_type = "t2.micro"

  tags {
    Name = "HelloWorld"
  }
}
variable "ami_component" {}

variable "override_ami" {
  default = ""
}

data "aws_ami" "selected" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:component"
    values = ["${var.ami_component"]
  }

  most_recent = true
}

resource "aws_instance" "instance" {
  ami           = "${var.override_ami != "" ? var.override_ami : data.aws_ami.selected.id}"
  instance_type = "t2.micro"

  tags {
    Name = "HelloWorld"
  }
}