Rohan jangid
Rohan jangid

Reputation: 195

Get most recent/newest image from ECR using terraform data source

I have an ECR repository named workflow and in this repository, there is 5 image pushed using GitHub action.

Now I have a terraform workflow that will just use the image from ECR and using this ECR image builds the ECS container definition.

so now I want to fetch the latest image with the tag whatever it would be...

I tried the below thing

data "aws_ecr_repository" "example" {
  name = "workflow"
}

and then

 "image": "${data.aws_ecr_repository.example.repository_url}"

but here I only get the Url for the repo without a tag

so how can I pass here the latest or newest image with the tag?

Upvotes: 9

Views: 9256

Answers (3)

Rob
Rob

Reputation: 330

It looks like this feature is now available

data "aws_ecr_image" "service_image" {
  repository_name = "my/service"
  most_recent       = true
}

Upvotes: 11

Math.Random
Math.Random

Reputation: 152

I was looking for the same, look if this documentation suites you https://registry.terraform.io/providers/hashicorp/aws/2.34.0/docs/data-sources/ecr_image

it includes a way to obtain the image:

data "aws_ecr_image" "service_image" {
    repository_name = "my/service"
    image_tag       = "latest"
}

the problem of that is that "image_uri" isnt in the resource. There is an open issue in Github about it: https://github.com/hashicorp/terraform-provider-aws/pull/24526

Meanwhile you can use this format for the url:

"${var.aws_account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.project_name}:${var.latest-Tag}"

Upvotes: 6

Rohan jangid
Rohan jangid

Reputation: 195

As terraform is not capable for this thing and you want to use still terraform in you are workplace then you can use terraform as an external data source

resource "aws_ecs_task_definition" "snipe-main" {
container_definitions    = <<TASK_DEFINITION
[
  {
"image":"${data.aws_ecr_repository.example.repository_url}:${data.external.current_image.result["image_tag"]}"
   }
]
TASK_DEFINITION 
}

data "external" "current_image" {
  program = ["bash", "./ecs-task.sh"]
}
output "get_new_tag" {
  value = data.external.current_image.result["image_tag"]
}
cat ECS-task.sh
#!/bin/bash
set -e
imageTag=$(aws ecr describe-images --repository-name <<here your repo name>> --query 'sort_by(imageDetails,& imagePushedAt)[-1].imageTags[0]')
imageTag=`sed -e 's/^"//' -e 's/"$//' <<<"$imageTag"`
jq -n --arg imageTag "$imageTag" '{"image_tag":$imageTag}'

exit 0

Upvotes: 2

Related Questions