Terraform-从参数存储获取值并传递给资源

23
我们将最新批准的 AMI 存储在 AWS 参数存储中。在使用 Terraform 创建新实例时,我想以编程方式获取此 AMI ID。我有一个命令来获取 AMI ID,但我不知道如何在 Terraform 中使用它。
这是我用于获取 AMI ID 的命令:
$(aws ssm get-parameter --name /path/to/ami --query 'Parameter.Value' --output text)

这是我的 Terraform 脚本:

resource "aws_instance" "nginx" {
  ami           = "ami-c58c1dd3" # pull value from parameter store
  instance_type = "t2.micro"
  #key_name        = "${var.key_name}"

  provisioner "remote-exec" {
    inline = [
      "sudo yum install nginx -y",
      "sudo service nginx start"
    ]
  }
}

在Terraform脚本中,我应该如何使用命令来提取AMI ID?

2个回答

50
你可以使用aws_ssm_parameter 数据源在运行时获取参数的值:
data "aws_ssm_parameter" "ami" {
  name = "/path/to/ami"
}

resource "aws_instance" "nginx" {
  ami           = data.aws_ssm_parameter.ami.value # pull value from parameter store
  instance_type = "t2.micro"

  provisioner "remote-exec" {
    inline = [
      "sudo yum install nginx -y",
      "sudo service nginx start"
    ]
  }
}
然而,更好的方法可能是使用aws_ami数据源,直接过滤您想要的AMI,而不是将AMI ID推送到SSM参数存储中,然后稍后再查找。您可以根据许多标准进行过滤,包括名称、账户所有者和标记。下面是来自aws_instance 资源文档的示例,该示例正在查找最新的Ubuntu 20.04 AMI:
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.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"
  }
}

我们不能使用您的第二个选项,因为我们的AMI需要经过另一个团队的批准流程,然后才会发布到参数存储中供我们使用。不过第一个选项完美地运作。 - navig8tr
你的其他团队可以应用一个特定的标签,供你过滤。这个方法可能行得通,也可能不行,但无论如何,我认为这是一个值得提出的建议。 - ydaetskcoR
谢谢你的回答!这里必须使用字符串插值吗?不加引号直接写 ami = data.aws_ssm_parameter.ami.value 行不行? - The Unknown Dev
是的,但问题使用了HCL1语法,因此答案也使用了它。HCL2语法允许两种方式,但会在不必要的插值时发出警告。 - ydaetskcoR
将答案更新为HCL2语法,因为0.12已经发布很久了,我正在逐步更新到HCL2语法的答案,即使原始问题是0.11版本,除非问题明确要求使用HCL1/0.11答案。 - ydaetskcoR

0

我建议您使用这种方法,因为您已经在AWS SSM中存储了AMI ID:

resource "aws_instance" "nginx" {
   ami           = data.aws_ssm_parameter.ami.value
   instance_type = "t2.micro"

   provisioner "remote-exec" {
    inline = [
      "sudo yum install nginx -y",
      "sudo service nginx start"
    ]
   }
}

data "aws_ssm_parameter" "ami" {
  name = "/production/ami"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接