You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform数据源获取ECR仓库的最新带标签镜像

获取ECR仓库带标签的最新镜像(Terraform实现)

你当前使用的aws_ecr_repository数据源仅能返回仓库基础URL,无法获取镜像标签或版本信息。要拿到带标签的最新镜像地址,有两种实用方案:

方案一:在Terraform中动态获取最新镜像标签

场景1:镜像已打latest标签

如果GitHub Action推送镜像时会自动打上latest标签,直接用aws_ecr_image数据源即可:

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

data "aws_ecr_image" "latest" {
  repository_name = data.aws_ecr_repository.example.name
  image_tag       = "latest"
}

# 在容器定义中引用完整镜像地址
"image": "${data.aws_ecr_repository.example.repository_url}:${data.aws_ecr_image.latest.image_tag}"

场景2:镜像无latest标签(需动态排序取最新)

如果镜像标签是语义化版本、时间戳或Commit SHA这类可排序的值,可通过external数据源调用AWS CLI获取所有标签,排序后取最后一个:

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

# 调用AWS CLI获取所有带标签的镜像标签
data "external" "ecr_image_tags" {
  program = [
    "aws", "ecr", "list-images",
    "--repository-name", data.aws_ecr_repository.example.name,
    "--filter", "tagStatus=TAGGED",
    "--query", "imageIds[*].imageTag",
    "--output", "text"
  ]
}

# 排序标签并取最新的一个
locals {
  sorted_tags = sort(split("\t", data.external.ecr_image_tags.result.result))
  latest_tag  = local.sorted_tags[length(local.sorted_tags) - 1]
}

# 引用完整镜像地址
"image": "${data.aws_ecr_repository.example.repository_url}:${local.latest_tag}"

方案二:从GitHub Action传递镜像标签到Terraform

这种方案更可靠,直接复用CI流程中刚推送的镜像标签,避免Terraform判断"最新"时的误差:

1. GitHub Action中传递标签

在推送镜像的步骤里输出当前使用的标签,再传给Terraform:

- name: Push Image to ECR
  id: push-ecr
  run: |
    # 用短Commit SHA作为标签示例,也可替换为版本号、时间戳等
    IMAGE_TAG=$(git rev-parse --short HEAD)
    docker push ${{ secrets.ECR_REPO_URL }}:$IMAGE_TAG
    echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT

- name: Terraform Apply
  run: |
    terraform apply -var "image_tag=${{ steps.push-ecr.outputs.image_tag }}" -auto-approve

2. Terraform中接收并使用标签

定义变量并拼接完整镜像地址:

variable "image_tag" {
  type        = string
  description = "Tag of the ECR image deployed via CI"
}

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

# 在容器定义中引用
"image": "${data.aws_ecr_repository.example.repository_url}:${var.image_tag}"

内容的提问来源于stack exchange,提问作者Rohan jangid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:25:24