Docker 容器的 Terraform 部署到 aws ecr

Terraform deployment of Docker Containers to aws ecr

我在将我的 docker 图像作为 terraform 部署的一部分部署到 aws ecr 时遇到问题,我正在努力思考最佳的长期战略。

目前我在 s3 和 dynamodb 中有一个 terraform 远程后端,我们称它为我的主帐户。然后我在单独的帐户中有 dev/test 等环境。 terraform 部署目前 运行 离开我的本地 machine (mac) 并使用 aws 'master' 帐户及其凭据,后者又在目标部署帐户中扮演角色根据以下内容创建资源:

provider "aws" { // tell terraform which SDK it needs to load
  alias  = "target"
  region = var.region
  assume_role {

  role_arn = "arn:aws:iam::${var.deployment_account}:role/${var.provider_env_deployment_role_name}"
  }
}

我正在使用 Fargate 部署创建许多 ecs 服务。容器图像由 GitHub 操作在单独的 repos 中构建,并保存为 GitHub 包。这些包名称和版本在创建 ecr 和服务后部署(也许这不是理想的想法),这就是问题出现的地方。

该过程是从 GitHub 包中提取图像,重新标记它并使用 null_resource local-exec 的多次执行上传到 ecr。独立运行良好,但作为 terraform 过程的一部分存在问题。我认为原因是其他资源使用上述提供者来获取权限,但由于 null_resource 不接受提供者,因此无法通过这种方式获得权限。所以我一直在将 aws creds 值传递到 shell。不相信这真的很安全,但目前还没有实际意义,因为它也不起作用。我收到此错误:

Error saving credentials: error storing credentials - err: exit status 1, out: `error storing credentials - err: exit status 1, out: `The specified item already exists in the keychain.``

我的一部分人认为这是错误的方法,当我迁移到通过 Github 操作进行部署时,我可以将通过 terraform 进行的基础设施部署与真正的应用程序部署分开,只使用 GitHub 秘密重置凭据值然后 运行 脚本。

或者,也许钥匙串的东西消失了,我的过程会正常工作吗?安全 ??

这对于这种情况很好,但它并不是我所有用例的通用方法。

我很快将开始使用 docker 容器部署多个 aws lambda 函数。以前没有做过,但看起来过程将是:创建 ecr、部署容器、部署 lambda 函数。这实际上意味着容器部署应该集成到 terraform 部署中,这会循环回到我的 local-exec 问题??

我发现 Actions to deploy to ECR 这意味着将部署拆分为多个文件,但这似乎不够优雅且可能很脆弱。

也许有一个简单的解决方案,但鉴于我正在尝试解决这个问题,我最好的方法是什么?

我知道这不是一个完整的答案,但您应该从环境变量中提取您的 AWS 凭证。我真的不明白您是否需要不同帐户的凭据,但如果您需要,则在操作过程中交换它们。请参阅 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html。 Terraform 应该选择这些并自动将它们用于 AWS 访问。

根据 Kevin Buchs 的回答建议...

我的主要问题与从 mac 部署和钥匙串的使用有关。因为这不在关键路径上,所以我绕过了它并设置了一个 GitHub 动作。

该操作从我的 'master' aws 帐户凭据的 GitHub 机密中加载了环境变量。

AWS_ACCESS_KEY_ID: ${{ secrets.NK_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.NK_AWS_SECRET_ACCESS_KEY }}

我还以相同的方式将目标帐户凭据加载到环境变量中,但使用前缀 TF_VAR。

TF_VAR_DEVELOP_AWS_ACCESS_KEY_ID: ${{ secrets.DEVELOP_AWS_ACCESS_KEY_ID }}
TF_VAR_DEVELOP_AWS_SECRET_ACCESS_KEY: ${{ secrets.DEVELOP_AWS_SECRET_ACCESS_KEY }}

然后我声明 terraform 变量,这些变量将从环境变量中自动填充。

variable "DEVELOP_AWS_ACCESS_KEY_ID" {
  description = "access key for the dev account"
  type = string
}
variable "DEVELOP_AWS_SECRET_ACCESS_KEY" {
  description = "secret access key for the dev account"
  type = string
}

当我 运行 一个带有本地 exec 的 shell 脚本时:

resource "null_resource" "image-upload-to-importcsv-ecr" {

   provisioner "local-exec" {
      command = "./ecr-push.sh ${var.DEVELOP_AWS_ACCESS_KEY_ID} ${var.DEVELOP_AWS_SECRET_ACCESS_KEY} "
   }
}

然后我可以在脚本中使用这些参数来设置凭据,例如

AWS_ACCESS=
AWS_SECRET=
.....
export AWS_ACCESS_KEY_ID=${AWS_ACCESS}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET}

并且脚本现在具有执行任何操作的凭据。