

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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)*

## 概要
<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 を使用して Dockerfile のビルドプロセスを自動化します。これにより、人為的ミスの可能性が最小限に抑えられ、デプロイ時間を大幅に短縮できます。

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)。
+ Terraform バージョン 1 以降が[インストールされ、設定されている](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)こと。
+ [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) テーブル。テーブルには、データ型が `String` の `LockID` という名前のパーティションキーが必要です。これが設定されていない場合、状態ロックは無効になります。
+ Terraform の Amazon S3 バックエンドを設定するアクセス許可を持つ AWS Identity and Access Management (IAM) ロール。設定の手順については、[Terraform のドキュメント](https://developer.hashicorp.com/terraform/language/settings/backends/s3#assume-role-configuration)を参照してください。

**制限事項**

この再利用可能なコードは、GitHub Actions でのみテストされています。

## アーキテクチャ
<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/ja_jp/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 Actions ワークフローが開始されます。

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 Actions を使用して、コードの構築、テスト、デプロイなどのタスクを自動化できます。
+ [Terraform](https://developer.hashicorp.com/terraform/intro) は HashiCorp の提供する infrastructure as code (IaC) ツールであり、クラウドおよびオンプレミスインフラストラクチャの作成と管理を支援します。

**コードリポジトリ**

このパターンのコードは、GitHub の [Docker ECR Actions ワークフロー](https://github.com/aws-samples/docker-ecr-actions-workflow)リポジトリで利用できます。
+ GitHub Actions を作成すると、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 API にプライベートにアクセスするためのテクノロジーです。Fargate 起動タイプを使用する Amazon ECS タスクの場合、VPC エンドポイントを利用することで、タスクにパブリック IP アドレスを割り当てることなく、Amazon ECR からプライベートイメージをプルできます。

## エピック
<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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| OpenID Connect を設定します。 | OpenID Connect (OIDC) プロバイダーを作成します。このプロバイダーは、このアクションで使用される IAM ロールの信頼ポリシーで使用します。手順については、GitHub ドキュメントの「[Configuring OpenID Connect in Amazon Web Services](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 Actions ワークフロー](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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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/ja_jp/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>
+ [Reusing workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows) (GitHub ドキュメント)
+ [Triggering a workflow](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow) (GitHub ドキュメント)