![](/img/trans.png)
[英]Terraform for AWS: Pass specific resource address based on AZ of the beanstalk instance
[英]How to pass/concat variable into the `data.aws_ami` section in the `aws_instance` resource
我在ami=data.aws_ami.$var.ami_name.id
行内连接变量时遇到困难。
我试过ami= "${data.aws_ami.(var.ami_name).id}"
但在这两种情况下我都得到:
79: ami = data.aws_ami.(var.ami_name)).id
│
│ An attribute name is required after a dot.
它仅适用于字符串值data.aws_ami.ubuntu-1804.id
。
我的问题是如何将变量连接到data.aws_ami
?
最终目标是根据不同的操作系统 ec2 实例(Suse、Ubuntu、RHEL)进行配置,这一切都取决于部署时提供的变量。
variable "ami_name" {
default = "ubuntu-1804"
}
resource "aws_instance" "linux" {
key_name = var.ami_key_pair_name
#ami = var.ami_id
ami = data.aws_ami.$var.ami_name.id
#ami = data.aws_ami.ubuntu-1804.id
instance_type = "t2.micro"
tags = {
Name = var.instance_name
}
vpc_security_group_ids = [
aws_security_group.allow-ssh-http.id
]
}
我进行了搜索,但找不到任何相关内容。 我正在使用Terraform v0.15.4
这是您所问的可能性:
variable "ami_name" {
type = string
default = "ubuntu"
validation {
condition = can(regex("suse|ubuntu|RHEL", var.ami_name))
error_message = "Invalid ami name, allowed_values = [suse, ubuntu, RHEL]."
}
}
data "aws_ami" "os" {
for_each = toset(["suse", "ubuntu", "RHEL"])
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["*${each.value}*"]
}
}
resource "aws_instance" "linux" {
ami = data.aws_ami.os[var.ami_name].id
instance_type = "t2.micro"
...
}
您显示的代码: data.aws_ami.$var.ami_name.id
它肯定无效。
我的方法是在 aws_ami 中使用for_each
,它会给我们一个数组,我们可以稍后在 aws_instance 资源中使用它,您可以向集合中添加更多项目以添加其他操作系统,并且与您可以更改的过滤器相同所有这一切都可以满足您的需求。
另外,我为您的ami_name
变量添加了验证,这样我们可以在任何问题导致错误之前立即防止它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.