

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

# 使用 GitHub Actions 和 Terraform 构建 Docker 镜像并将其推送到 Amazon ECR
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform"></a>

*Ruchika Modi，Amazon Web Services*

## Summary
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-summary"></a>

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

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

## 先决条件和限制
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户。
+ 一个活跃的 GitHub 账户。
+ 存储[GitHub 库](https://docs.github.com/en/get-started/quickstart/create-a-repo)。
+ [已安装并配置](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) 1 或更高版本的 Terraform。
+ [Terraform 后端](https://developer.hashicorp.com/terraform/language/settings/backends/s3)的 Amazon Simple Storage Service（Amazon S3）存储桶。
+ 用于 Terraform 状态锁定和一致性的 [Amazon DynamoDB](https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwjO95K9xqCCAxW-KIMDHfOvD7IYABADGgJzZg&gclid=EAIaIQobChMIzveSvcagggMVviiDAx3zrw-yEAAYASADEgJYWfD_BwE&ohost=www.google.com&cid=CAASJuRoKjv_llGjIU3liZ4T2IRecPqw0dVHSvjZ7bee1lvcc36K_lO_&sig=AOD64_1b294pq65HiFN-T1YxQAuXmRu_hw&adurl&ved=2ahUKEwjhiY29xqCCAxUgzjgGHRu6CAIQqyQoAnoECAkQDQ) 表。该表必须有一个名为 `LockID`、类型为 `String` 的分区键。如果未进行此配置，则状态锁定将被禁用。
+ 有权为 Terraform 设置 Amazon S3 后端的 AWS Identity and Access Management（IAM）角色。有关配置说明，请参阅 [Terraform 文档](https://developer.hashicorp.com/terraform/language/settings/backends/s3#assume-role-configuration)。

**限制**

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

## 架构
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-architecture"></a>

**目标技术堆栈**
+ Amazon ECR 存储库
+ GitHub 行动
+ Terraform

**目标架构**

![创建可重复使用的工作 GitHub 流程以构建 Dockerfile 并将映像推送到 Amazon ECR 的工作流程。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/c39c110e-cbe5-459e-a0aa-de27e884fb10/images/298e0e16-3054-49b7-8695-db510e0df2df.png)


下图说明了以下内容：

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

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

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

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

## 工具
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-tools"></a>

**Amazon 服务**
+ [Amazon Elastic Container Registry（Amazon ECR）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)是一项安全、可扩展且可靠的托管容器注册表服务。

**其他工具**
+ [GitHub 操作](https://docs.github.com/en/actions)已集成到 GitHub 平台中，可帮助您在 GitHub 仓库中创建、共享和运行工作流程。您可以使用 GitHub Actions 来自动执行构建、测试和部署代码等任务。
+ [Terraform](https://developer.hashicorp.com/terraform/intro) 是一款基础设施即代码 (IaC) 工具 HashiCorp ，可帮助您创建和管理云和本地基础架构。

**代码存储库**

此模式的代码可在 GitHub [Docker ECR 操作工作流](https://github.com/aws-samples/docker-ecr-actions-workflow)存储库中找到。
+ 创建 GitHub 操作时，Docker 工作流程文件将保存在此存储库的`/.github/workflows/`文件夹中。此解决方案的工作流位于 [workflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml) 文件中。
+ `e2e-test` 文件夹提供了示例 Dockerfile 以供参考和测试。

## 最佳实践
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-best-practices"></a>
+ 有关编写 Dockerfile 的最佳实践，请参阅 [Docker 文档](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)。
+ 对 [Amazon ECR 使用 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。VPC 终端节点由 AWS 提供支持 PrivateLink，该技术使您能够 APIs 通过私有 IP 地址私密访问 Amazon ECR。对于使用 Fargate 启动类型的 Amazon ECS 任务，VPC 端点让任务能够从 Amazon ECR 中提取私有映像，而无需为任务分配公共 IP 地址。

## 操作说明
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-epics"></a>

### 设置 OIDC 提供商和存储库 GitHub
<a name="set-up-the-oidc-provider-and-github-repository"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 OpenID Connect。 | 创建 OpenID Connect（OIDC）提供者。您将在此操作中所用的 IAM 角色的信任策略中使用此提供商。有关说明，请参阅文档[中的在亚马逊 Web Services 中配置 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)。 GitHub  | AWS 管理员、AWS DevOps、常规 AWS | 
| 克隆 GitHub 存储库。 | 将 GitHub [Docker ECR 操作工作流](https://github.com/aws-samples/docker-ecr-actions-workflow)存储库克隆到您的本地文件夹：<pre>$git clone https://github.com/aws-samples/docker-ecr-actions-workflow</pre> | DevOps 工程师 | 

### 自定义 GitHub 可重复使用的工作流程并部署 Docker 镜像
<a name="customize-the-github-reusable-workflow-and-deploy-the-docker-image"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 自定义启动 Docker 工作流的事件。 | 此解决方案的工作流位于 [workflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml) 中。此脚本当前配置为在收到 `workflow_dispatch` 事件时部署资源。您可以自定义此配置，将事件更改为 `workflow_call` 并且从另一个父工作流调用该工作流。 | DevOps 工程师 | 
| 自定义工作流。 | w [orkflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml) 文件被配置为创建动态、可重复使用的工作流程。 GitHub 您可以编辑此文件以自定义默认配置，或者如果您使用`workflow_dispatch`事件手动启动部署，则可以从 Actions 控制台传递输入值。 GitHub [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform.html) | DevOps 工程师 | 
| 部署 Terraform 模板。 | 该工作流程会根据您配置的事件自动部署用于创建 Amazon ECR 存储库的 Terraform 模板。 GitHub 这些模板在 [Github 存储库的根目录](https://github.com/aws-samples/docker-ecr-actions-workflow/tree/main)下以 `.tf` 文件形式提供。 | AWS DevOps， DevOps 工程师 | 

## 问题排查
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 将 Amazon S3 和 DynamoDB 配置为 Terraform 远程后端时出现问题或错误。 | 按照 [Terraform 文档](https://developer.hashicorp.com/terraform/language/settings/backends/s3)中的说明为远程后端配置在 Amazon S3 和 DynamoDB 资源上设置所需的权限。 | 
| 无法通过 `workflow_dispatch` 事件运行或启动工作流。 | 只有工作流也在主分支上进行了配置时，配置为从 `workflow_dispatch` 事件部署的工作流才会运行。 | 

## 相关资源
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-resources"></a>
+ [重复使用工作流程](https://docs.github.com/en/actions/using-workflows/reusing-workflows)（GitHub 文档）
+ [触发工作流程](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow)（GitHub 文档）