因此,以下数据源将获取标记为component:web
的最新AMI。让我们说我有一些带有自己AMI的组件。有没有一种方法可以让我更加动态,我可以传递component
的值?我似乎无法想到我可以传递的唯一值。我是否需要重构一下我的代码?
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:component"
values = ["web"]
}
most_recent = true
}
我有一个defaults
模块作为元数据查找,它可以获取并输出AMI ID和VPC ID等基本内容。
# defaults/main.tf
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:component"
values = ["web"]
}
most_recent = true
}
output "web_ami" {
value = "${data.aws_ami.web.id}"
}
# service_name/main.tf
module "defaults" {
source = "../defaults"
region = "${var.region}"
environment = "${var.environment}"
}
module "ftpserver" {
source . = "../ec2_instance"
ami_id = "${module.defaults.web_ami}"
...
}
答案 0 :(得分:2)
我将aws_ami
数据源移动到模块中,让它直接查找AMI,而不是从外部传入。
所以我会将ec2_instance
模块更改为:
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_instance
模块中的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_ami
变量是否已被设置为其他情况,在这种情况下它将使用它,否则它将使用ami_component
变量来查找适当的AMI并使用相反。
这有利于将AMI选择逻辑移动到Terraform模块中,使得到该模块的接口更加简单。