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

使用Terraform CDK推送镜像至AWS ECR遇400错误求助

问题排查:Terraform CDK推送ECR Public镜像成功但报400 Bad Request

现象

使用Terraform CDK通过Docker Provider构建并推送镜像至AWS ECR Public仓库,镜像已成功推送到ECR且可在控制台查看,但部署过程中报错:

Unable to create image, image not found: unable to get digest: Got bad response from registry: 400 Bad Request

核心原因分析

该错误本质是Terraform推送镜像后,向Registry请求镜像digest时失败,但镜像推送流程已完成。主要触发点集中在Docker Provider的认证配置和ECR Public的Registry地址处理:

  • Registry认证地址错误:Docker Provider的registryAuth.address配置了完整仓库URI(如public.ecr.aws/xxx/cv),但Docker认证是针对整个Registry域名(public.ecr.aws),而非单个仓库路径,错误地址会导致digest查询请求路径异常,返回400。
  • 镜像Tag未明确指定:未显式设置镜像tag时默认用latest,部分场景下ECR Public对未明确tag的digest查询响应存在延迟或格式问题。
  • 资源依赖时序问题:极端情况下仓库或认证token未完全就绪,Docker Provider的请求提前触发。

解决方案

按以下步骤修改代码:

1. 修正Docker Provider的Registry认证地址

将registryAuth.address从完整仓库URI改为ECR Public的Registry域名public.ecr.aws:

new docker.DockerProvider(this, "docker-provider", {
  registryAuth: [
    {
      address: "public.ecr.aws", // 替换为Registry域名而非完整仓库URI
      username: authToken.userName,
      password: authToken.password,
    },
  ],
});

2. 明确指定镜像Tag

在RegistryImage的name中显式添加tag(如latest),避免默认值引发的查询问题:

new docker.RegistryImage(this, "image-on-public-ecr", {
  name: `${repo.repositoryUri}:latest`, // 明确指定tag
  buildAttribute: {
    context: __dirname,
  },
});

3. 显式添加资源依赖(可选)

若仍有时序问题,给Docker Provider添加依赖,确保仓库和认证token完全创建后再初始化:

new docker.DockerProvider(this, "docker-provider", {
  registryAuth: [
    {
      address: "public.ecr.aws",
      username: authToken.userName,
      password: authToken.password,
    },
  ],
  dependsOn: [repo, authToken], // 显式依赖仓库和认证token
});

验证

修改后重新执行cdktf deploy,Terraform将正确推送镜像并获取digest,不会再出现400错误。

内容的提问来源于stack exchange,提问作者Baran Karaaslan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:55:23