

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 GitHub 動作和 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*

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

此模式說明如何建立可重複使用的 GitHub 工作流程來建置 Dockerfile，並將產生的映像推送至 Amazon Elastic Container Registry (Amazon ECR)。模式會使用 Terraform 和 GitHub Actions 自動化 Dockerfiles 的建置程序。這可將人為錯誤的可能性降至最低，並大幅縮短部署時間。

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) Terraform 第 1 版或更新版本。
+ [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`。如果未設定，則會停用狀態鎖定。
+ AWS Identity and Access Management (IAM) 角色，具有為 Terraform 設定 Amazon S3 後端的許可。如需組態指示，請參閱 [Terraform 文件](https://developer.hashicorp.com/terraform/language/settings/backends/s3#assume-role-configuration)。

**限制 **

此可重複使用的程式碼已僅使用 GitHub 動作進行測試。

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

**目標技術堆疊**
+ Amazon ECR 儲存庫
+ GitHub Actions
+ Terraform

**目標架構**

![建立可重複使用 GitHub 工作流程的工作流程，以建置 Dockerfile 並將映像推送至 Amazon ECR。](http://docs.aws.amazon.com/zh_tw/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 Actions](https://docs.github.com/en/actions) 已整合至 GitHub 平台，協助您在 GitHub 儲存庫中建立、共用和執行工作流程。您可以使用 GitHub 動作來自動化任務，例如建置、測試和部署程式碼。
+ [Terraform](https://developer.hashicorp.com/terraform/intro) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署基礎設施。

**程式碼儲存庫**

此模式的程式碼可在 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>
+ 如需撰寫 Dockerfiles 的最佳實務，請參閱 [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，這項技術可讓您透過私有 IP 地址私密存取 Amazon ECR APIs。對於使用 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 OpenID Connect。 | 建立 OpenID Connect (OIDC) 供應商。您將針對此動作中使用的 IAM 角色，使用信任政策中的提供者。如需說明，請參閱 GitHub 文件[中的在 Amazon Web Services 中設定 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)。 | 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 自訂啟動 Docker 工作流程的事件。 | 此解決方案的工作流程位於 [workflow.yaml。](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml)此指令碼目前設定為在收到`workflow_dispatch`事件時部署資源。您可以將事件變更為 ，`workflow_call`並從另一個父工作流程呼叫工作流程，以自訂此組態。 | DevOps 工程師 | 
| 自訂工作流程。 | [workflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml) 檔案設定為建立動態、可重複使用的 GitHub 工作流程。您可以編輯此檔案來自訂預設組態，或者如果您使用`workflow_dispatch`事件手動啟動部署，則可以從 GitHub Actions 主控台傳遞輸入值。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform.html) | DevOps 工程師 | 
| 部署 Terraform 範本。 | 工作流程會根據您設定的 GitHub 事件，自動部署建立 Amazon ECR 儲存庫的 Terraform 範本。這些範本在 [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 文件）