使用 GitHub Actions 和 Terraform 构建 Docker 镜像并将其推送到 Amazon ECR - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 GitHub Actions 和 Terraform 构建 Docker 镜像并将其推送到 Amazon ECR

Ruchika Modi,Amazon Web Services

Summary

此模式说明了如何创建可重复使用 GitHub 的工作流程来构建 Dockerfile 并将生成的映像推送到亚马逊弹性容器注册表 (Amazon ECR) Container Registry (Amazon ECR)。该模式使用 Terraform 和 Actions 自动执行 Dockerfiles 的构建过程。 GitHub 这最大限度地减少了人为错误的可能性,并大大缩短了部署时间。

向 GitHub 存储库的主分支 GitHub 推送操作会启动资源的部署。该工作流程根据 GitHub 组织和存储库名称的组合创建唯一的 Amazon ECR 存储库。然后,它将 Dockerfile 映像推送到 Amazon ECR 存储库。

先决条件和限制

先决条件

  • 一个活跃的 AWS 账户。

  • 一个活跃的 GitHub 账户。

  • 存储GitHub 库

  • 已安装并配置 1 或更高版本的 Terraform。

  • Terraform 后端的 Amazon Simple Storage Service(Amazon S3)存储桶。

  • 用于 Terraform 状态锁定和一致性的 Amazon DynamoDB 表。该表必须有一个名为 LockID、类型为 String 的分区键。如果未进行此配置,则状态锁定将被禁用。

  • 有权为 Terraform 设置 Amazon S3 后端的 AWS Identity and Access Management(IAM)角色。有关配置说明,请参阅 Terraform 文档

限制

此可重复使用的代码仅通过 GitHub 操作进行了测试。

架构

目标技术堆栈

  • Amazon ECR 存储库

  • GitHub 行动

  • Terraform

目标架构

创建可重复使用的工作 GitHub 流程以构建 Dockerfile 并将映像推送到 Amazon ECR 的工作流程。

下图说明了以下内容:

1. 用户将 Dockerfile 和 Terraform 模板添加到存储库中。 GitHub

2. 这些新增内容启动了 GitHub 操作工作流程。

3. 该工作流检查 Amazon ECR 存储库是否存在。否则,它将根据 GitHub 组织和存储库名称创建存储库。

4. 该工作流构建 Dockerfile 并将映像推送到 Amazon ECR 存储库。

工具

Amazon 服务

其他工具

  • GitHub 操作已集成到 GitHub 平台中,可帮助您在 GitHub 仓库中创建、共享和运行工作流程。您可以使用 GitHub Actions 来自动执行构建、测试和部署代码等任务。

  • Terraform 是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地基础架构。

代码存储库

此模式的代码可在 GitHub Docker ECR 操作工作流存储库中找到。

  • 创建 GitHub 操作时,Docker 工作流程文件将保存在此存储库的/.github/workflows/文件夹中。此解决方案的工作流位于 workflow.yaml 文件中。

  • e2e-test 文件夹提供了示例 Dockerfile 以供参考和测试。

最佳实践

  • 有关编写 Dockerfile 的最佳实践,请参阅 Docker 文档

  • Amazon ECR 使用 VPC 端点。VPC 终端节点由 AWS 提供支持 PrivateLink,该技术使您能够 APIs 通过私有 IP 地址私密访问 Amazon ECR。对于使用 Fargate 启动类型的 Amazon ECS 任务,VPC 端点让任务能够从 Amazon ECR 中提取私有映像,而无需为任务分配公共 IP 地址。

操作说明

Task说明所需技能

配置 OpenID Connect。

创建 OpenID Connect(OIDC)提供者。您将在此操作中所用的 IAM 角色的信任策略中使用此提供商。有关说明,请参阅文档中的在亚马逊 Web Services 中配置 OpenID Connect。 GitHub

AWS 管理员、AWS DevOps、常规 AWS

克隆 GitHub 存储库。

将 GitHub Docker ECR 操作工作流存储库克隆到您的本地文件夹:

$git clone https://github.com/aws-samples/docker-ecr-actions-workflow
DevOps 工程师
Task说明所需技能

自定义启动 Docker 工作流的事件。

此解决方案的工作流位于 workflow.yaml 中。此脚本当前配置为在收到 workflow_dispatch 事件时部署资源。您可以自定义此配置,将事件更改为 workflow_call 并且从另一个父工作流调用该工作流。

DevOps 工程师

自定义工作流。

w orkflow.yaml 文件被配置为创建动态、可重复使用的工作流程。 GitHub 您可以编辑此文件以自定义默认配置,或者如果您使用workflow_dispatch事件手动启动部署,则可以从 Actions 控制台传递输入值。 GitHub

  • 确保指定正确的 AWS 账户 ID 和目标区域。

  • 创建 Amazon ECR 生命周期策略(请参阅示例策略)并相应地更新默认路径(e2e-test/policy.json)。

  • 该工作流程文件需要两个 IAM 角色作为输入:

    • 有权为 Terraform 设置 Amazon S3 后端的 IAM 角色(请参阅先决条件部分)。您可以相应地在 .yaml 文件中更新默认角色名称 workload-assumable-role

    • 具有访问权限的 IAM 角色 GitHub。Amazon ECR 策略中也使用此角色来限制 Amazon ECR 操作。有关更多信息,请参阅 data.tf 文件

DevOps 工程师

部署 Terraform 模板。

该工作流程会根据您配置的事件自动部署用于创建 Amazon ECR 存储库的 Terraform 模板。 GitHub 这些模板在 Github 存储库的根目录下以 .tf 文件形式提供。

AWS DevOps, DevOps 工程师

问题排查

问题解决方案

将 Amazon S3 和 DynamoDB 配置为 Terraform 远程后端时出现问题或错误。

按照 Terraform 文档中的说明为远程后端配置在 Amazon S3 和 DynamoDB 资源上设置所需的权限。

无法通过 workflow_dispatch 事件运行或启动工作流。

只有工作流也在主分支上进行了配置时,配置为从 workflow_dispatch 事件部署的工作流才会运行。

相关资源