GitHub Actions と Terraform を使用して Docker イメージを構築し Amazon ECR にプッシュする - AWS 規範ガイダンス

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

GitHub Actions と Terraform を使用して Docker イメージを構築し Amazon ECR にプッシュする

Ruchika Modi (Amazon Web Services)

概要

このパターンでは、再利用可能な GitHub ワークフローを作成して Dockerfile を構築し、結果のイメージを Amazon Elastic Container Registry (Amazon ECR) にプッシュする方法について説明します。このパターンは、Terraform と GitHub Actions を使用して Dockerfile のビルドプロセスを自動化します。これにより、人為的ミスの可能性が最小限に抑えられ、デプロイ時間を大幅に短縮できます。

GitHub リポジトリのメインブランチへの GitHub プッシュアクションにより、リソースのデプロイが開始されます。このワークフローでは、GitHub 組織とリポジトリ名の組み合わせに基づいて一意の Amazon ECR リポジトリが作成されます。その後、Dockerfile イメージが Amazon ECR リポジトリにプッシュされます。

前提条件と制限事項

前提条件

  • アクティブな AWS アカウント。

  • アクティブな GitHub アカウント。

  • GitHub リポジトリ

  • Terraform バージョン 1 以降がインストールされ、設定されていること。

  • Terraform バックエンドの Amazon Simple Storage Service (Amazon S3) バケット。

  • Terraform の状態ロックと整合性のための Amazon DynamoDB テーブル。テーブルには、データ型が StringLockID という名前のパーティションキーが必要です。これが設定されていない場合、状態ロックは無効になります。

  • Terraform の Amazon S3 バックエンドを設定するアクセス許可を持つ AWS Identity and Access Management (IAM) ロール。設定の手順については、Terraform のドキュメントを参照してください。

制限事項

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

アーキテクチャ

ターゲットテクノロジースタック

  • Amazon ECR リポジトリ

  • GitHub Actions

  • Terraform

ターゲットアーキテクチャ

再利用可能な GitHub ワークフローを作成して Dockerfile を構築し、Amazon ECR にイメージをプッシュするワークフロー。

この図表は、以下を示すものです:

1. ユーザーが Dockerfile と Terraform テンプレートを GitHub リポジトリに追加します。

2. これらの追加により、GitHub Actions ワークフローが開始されます。

3. ワークフローは、Amazon ECR リポジトリが存在するかどうかをチェックします。既存のものがなければ、GitHub の組織とリポジトリ名に基づいてリポジトリが作成されます。

4. Dockerfile が構築され、Amazon ECR リポジトリにイメージがプッシュされます。

ツール

Amazon サービス

その他のツール

  • GitHub Actions は GitHub プラットフォームに統合されており、GitHub リポジトリ内のワークフローの作成、共有、実行に役立ちます。GitHub Actions を使用して、コードの構築、テスト、デプロイなどのタスクを自動化できます。

  • Terraform は HashiCorp の提供する infrastructure as code (IaC) ツールであり、クラウドおよびオンプレミスインフラストラクチャの作成と管理を支援します。

コードリポジトリ

このパターンのコードは、GitHub の Docker ECR Actions ワークフローリポジトリで利用できます。

  • GitHub Actions を作成すると、Docker ワークフローファイルはこのリポジトリの /.github/workflows/ フォルダに保存されます。このソリューションのワークフローは workflow.yaml ファイル内にあります。

  • e2e-test フォルダには、参照およびテスト用のサンプル Dockerfile が用意されています。

ベストプラクティス

  • Dockerfiles を記述するためのベストプラクティスについては、Docker ドキュメントを参照してください。

  • Amazon ECR の VPC エンドポイントを使用します。VPC エンドポイントには AWS PrivateLink が使用されています。これは、プライベート IP アドレスを介して Amazon ECR API にプライベートにアクセスするためのテクノロジーです。Fargate 起動タイプを使用する Amazon ECS タスクの場合、VPC エンドポイントを利用することで、タスクにパブリック IP アドレスを割り当てることなく、Amazon ECR からプライベートイメージをプルできます。

エピック

タスク説明必要なスキル

OpenID Connect を設定します。

OpenID Connect (OIDC) プロバイダーを作成します。このプロバイダーは、このアクションで使用される IAM ロールの信頼ポリシーで使用します。手順については、GitHub ドキュメントの「Configuring OpenID Connect in Amazon Web Services」を参照してください。

AWS 管理者、AWS DevOps、AWS 全般

GitHub リポジトリのクローンを作成します。

GitHub Docker ECR Actions ワークフローリポジトリのクローンをローカルフォルダに作成します。

$git clone https://github.com/aws-samples/docker-ecr-actions-workflow
DevOps エンジニア
タスク説明必要なスキル

Docker ワークフローを開始するイベントをカスタマイズします。

このソリューションのワークフローは workflow.yaml 内にあります。このスクリプトは現在、workflow_dispatch イベントを受信したときにリソースをデプロイするように設定されています。この設定をカスタマイズするには、イベントを workflow_call に変更し、このワークフローを別の親ワークフローから呼び出します。

DevOps エンジニア

ワークフローをカスタマイズします。

Workflow.yaml ファイルは、動的で再利用可能な GitHub ワークフローを作成するように設定されています。このファイルを編集してデフォルト設定をカスタマイズすることもできますが、workflow_dispatch イベントを使用してデプロイを手動で開始している場合は、GitHub Actions コンソールからの入力値を渡すこともできます。

  • 正しい AWS アカウント ID とターゲットリージョンを指定してください。

  • Amazon ECR ライフサイクルポリシーを作成し (サンプルポリシーを参照)、これに応じてデフォルトパス (e2e-test/policy.json) を更新します。

  • ワークフローファイルには、入力として 2 つの IAM ロールが必要です。

    • Terraform の Amazon S3 バックエンドを設定するアクセス許可を持つ IAM ロール (「前提条件」セクションを参照)。これに応じて、yaml ファイル内のデフォルトのロール名 workload-assumable-role を更新できます。

    • GitHub へのアクセス許可を持つ IAM ロール。このロールは Amazon ECR ポリシーでも使用され、Amazon ECR オペレーションを制限します。詳細については、data.tf ファイルを参照してください。

DevOps エンジニア

Terraform テンプレートをデプロイします。

このワークフローにより、設定済みの GitHub イベントに基づいて、Amazon ECR リポジトリを作成する Terraform テンプレートが自動的にデプロイされます。これらのテンプレートは、Github リポジトリのルートにある .tf ファイルとして使用できます。

AWS DevOps、DevOps エンジニア

トラブルシューティング

問題ソリューション

Amazon S3 と DynamoDB を Terraform リモートバックエンドとして設定する際の問題またはエラー。

Terraform ドキュメントの指示に従って、リモートバックエンド設定のための Amazon S3 および DynamoDB リソースに必要となるアクセス許可を設定します。

workflow_dispatch イベントでワークフローを実行または開始できない。

workflow_dispatch イベントからデプロイするように設定されたワークフローは、このワークフローがメインブランチでも設定されている場合にのみ機能します。

関連リソース