Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Terraform - Get a value from parameter store and pass to resource

We store our latest approved AMIs in AWS parameter store. When creating new instances with Terraform I would like to programatically get this AMI ID. I have a command to pull the AMI ID but I'm not sure how to use it with Terraform.

Here is the command I use to pull the AMI ID:

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

And here is my Terraform script:

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"
    ]
  }
}

How can I use the command to pull the AMI ID in the Terraform script?

like image 527
navig8tr Avatar asked Sep 03 '19 17:09

navig8tr


People also ask

What is Aws_ssm_parameter in terraform?

Resource: aws_ssm_parameter. Provides an SSM Parameter resource. Note: overwrite also makes it possible to overwrite an existing SSM Parameter that's not created by Terraform before.

What is Aws_db_parameter_group?

Resource: aws_db_parameter_group. Provides an RDS DB parameter group resource. Documentation of the available parameters for various RDS engines can be found at: Aurora MySQL Parameters. Aurora PostgreSQL Parameters.

How do I get Arn of parameter in SSM?

You can locate the Amazon Resource Name (ARN) of the default key in the AWS KMS console on the AWS managed keys page. The default key is the one identified with aws/ssm in the Alias column.

What is an SSM parameter?

AWS Systems Manager Parameter Store (SSM) provides you with a secure way to store config variables for your applications. You can access SSM via AWS API directly from within the app or just use from AWS CLI. SSM can store plaintext parameters or KMS encrypted secure strings.


1 Answers

You can use the aws_ssm_parameter data source to fetch the value of a parameter at runtime:

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"
    ]
  }
}

However, a better approach might be to use the aws_ami data source to filter for the AMI you want more directly instead of pushing the AMI ID to SSM parameter store and then looking it up later. You can filter on a number of criteria including name, account owner and tags. Here's the example from the aws_instance resource documentation that is looking for the latest 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"
  }
}
like image 66
ydaetskcoR Avatar answered Sep 28 '22 02:09

ydaetskcoR