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

nav*_*8tr 9 amazon-web-services terraform terraform-provider-aws

我们将最新批准的 AMI 存储在 AWS 参数存储中。使用 Terraform 创建新实例时,我想以编程方式获取此 AMI ID。我有一个命令来提取 AMI ID,但我不确定如何将它与 Terraform 一起使用。

这是我用来提取 AMI ID 的命令:

$(aws ssm get-parameter --name /path/to/ami --query 'Parameter.Value' --output text)
Run Code Online (Sandbox Code Playgroud)

这是我的 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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

如何使用命令在 Terraform 脚本中提取 AMI ID?

yda*_*coR 20

您可以使用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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,更好的方法可能是使用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"
  }
}
Run Code Online (Sandbox Code Playgroud)