チュートリアル: CodePipeline (V2 タイプ) を使用して Docker イメージを構築し Amazon ECR にプッシュする
このチュートリアルは、ソースコードの変更後に Docker イメージを実行して Amazon ECR にプッシュする CodePipeline のビルドアクションの作成について説明します。このチュートリアルでは、プッシュされたイメージをデプロイする Amazon ECS デプロイアクションを追加する方法についても説明します。
重要
コンソールでのパイプライン作成の一環として、CodePipeline は S3 アーティファクトバケットをアーティファクトとして使用します (これは S3 ソースアクションで使用するバケットとは異なります)。S3 アーティファクトバケットがパイプラインのアカウントとは異なるアカウントにある場合は、S3 アーティファクトバケットを所有している AWS アカウントが安全で信頼できることを確認してください。
注記
このチュートリアルでは、GitHub ソースリポジトリと Amazon ECS クラスターにデプロイするための Amazon ECS 標準アクションを備えた CodePipeline パイプラインの ECRBuildAndPublish ビルドアクションについて説明します。Amazon ECS のソースとして ECR イメージリポジトリを含むパイプラインを使用する CodePipeline での CodeDeploy のブルー/グリーンデプロイアクションに関するチュートリアルについては、「チュートリアル: Amazon ECR ソース、ECS - CodeDeploy 間のデプロイでパイプラインを作成する」を参照してください。
重要
このアクションでは、CodePipeline マネージド CodeBuild コンピューティングを使用して、ビルド環境でコマンドを実行します。コマンドアクションを実行すると、AWS CodeBuild で別途料金が発生します。
前提条件
このチュートリアルで CD パイプラインを作成する前に、いつくかのリソースを用意する必要があります。使用を開始するために必要なものは以下のとおりです。
注記
これらのすべてのリソースを、同じ AWS リージョン内に作成する必要があります。
-
ソースコントロールリポジトリ (このチュートリアルでは GitHub を使用します)。このチュートリアルでは、以下を追加します。
-
ステップ 1 では、CodePipeline の ECRBuildAndPublish ビルドアクションの入力アーティファクトとしてソースリポジトリにサンプル Dockerfile を追加します。
-
ステップ 2 では、CodePipeline の Amazon ECS 標準デプロイアクションの要件として、ソースリポジトリにサンプル imagedefinitions.json ファイルを追加します。
-
-
Dockerfile から構築したイメージを含む Amazon ECR イメージリポジトリ。詳細については、Amazon Elastic Container Registry ユーザーガイド の「リポジトリの作成」と「イメージをプッシュする」を参照してください。
-
イメージリポジトリと同じリージョンで作成された Amazon ECS クラスターとサービス。詳細については、「Amazon Simple Queue Service デベロッパーガイド」の「クラスターの作成」と「サービスの作成」を参照してください。
これらの前提条件を満たした後、チュートリアルに進んで CD パイプラインを作成できます。
ステップ 1: ソースリポジトリに Dockerfile を追加する
このチュートリアルでは、ECRBuildAndPublish アクションを使用して Docker イメージを構築し、Amazon ECR にイメージをプッシュします。CodePipeline のマネージドコンピューティングアクションは、CodeBuild を使用して ECR ログインとイメージプッシュのコマンドを実行します。buildspec.yml ファイルをソースコードリポジトリに追加して CodeBuild に処理方法を指示する必要はありません。この例では、次のようにリポジトリに Dockerfile のみを指定します。
このサンプルテキストを貼り付けて Dockerfile ファイルを作成します。このサンプル Dockerfile は、前提条件の ECR イメージの手順で使用されているサンプルと同じです。
FROM public.ecr.aws/amazonlinux/amazonlinux:latest # Install dependencies RUN yum update -y && \ yum install -y httpd # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \ echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh
ソースリポジトリに Dockerfile ファイルを追加するには
-
テキストエディタを開き、上記の Dockerfile をコピーして新しいファイルに貼り付けます。
-
ソースリポジトリに
Dockerfileファイルをコミットし、プッシュします。-
ファイルを追加します。
git add . -
変更をコミットします。
git commit -m "Adding Dockerfile." -
コミットをプッシュします。
git push
ファイルは、必ずリポジトリのルートレベルに配置してください。
/ Dockerfile -
ステップ 2: imagedefinitions.json ファイルをソースリポジトリに追加する
このチュートリアルでは、CodePipeline で Amazon ECS 標準デプロイアクションを使用して、コンテナを Amazon ECS クラスターにデプロイします。Amazon ECS 標準デプロイアクションには、イメージ名と URI を含む imagedefinitions.json ファイルが必要です。imagedefinitions.json ファイルの詳細については、「Amazon ECS 標準デプロイアクション用の imagedefinitions.json ファイル」を参照してください。
このサンプルテキストを貼り付けて imagedefinitions.json ファイルを作成します。hello-world などの Dockerfile の名前を使用し、イメージが保存されている Amazon ECR リポジトリの URI を使用します。
[ { "name": "hello-world", "imageUri": "ACCOUNT-ID.dkr.ecr.us-east-1.amazonaws.com/actions/image-repo" } ]
ソースリポジトリに imagedefinitions.json ファイルを追加するには
-
テキストエディタを開き、上記の例をコピーして新しいファイルに貼り付けます。
-
ソースリポジトリに
imagedefinitions.jsonファイルをコミットし、プッシュします。-
ファイルを追加します。
git add . -
変更をコミットします。
git commit -m "Adding imagedefinitions.json." -
コミットをプッシュします。
git push
ファイルは、必ずリポジトリのルートレベルに配置してください。
/ imagedefinitions.json -
ステップ 3: パイプラインを作成する
CodePipeline ウィザードを使用してパイプラインステージを作成し、ソースリポジトリを接続します。
パイプラインを作成するには
CodePipeline コンソール (https://console.aws.amazon.com/codepipeline/) を開きます。
-
[ようこそ] ページ、[開始方法] ページ、または [パイプライン] ページで、[パイプラインの作成] を選択します。
-
[ステップ 1: 作成オプションを選択する] ページの [作成オプション] で、[カスタムパイプラインを構築する] オプションを選択します。[次へ] を選択します。
-
[ステップ 2: パイプラインの設定を選択する] で、[パイプライン名] に「
MyPipeline」と入力します。 -
CodePipeline は、特徴と料金が異なる V1 タイプと V2 タイプのパイプラインを提供しています。V2 タイプは、コンソールで選択できる唯一のタイプです。詳細については、「パイプラインタイプ」を参照してください。CodePipeline の料金については、料金
を参照してください。 -
サービスロール で、新しいサービスロール を選択して、CodePipeline が IAM でサービスロールを作成できるようにします。
-
[詳細設定] をデフォルト設定のままにし、[次へ] を選択します。
-
[ステップ 3: ソースステージの追加] ページで、ソースステージを追加します。
-
[ソースプロバイダー] で、[GitHub (GitHub アプリ経由)] を選択します。
-
接続 で、既存の接続を選択するか、新規の接続を作成します。GitHub ソースアクション用の接続を作成または管理する方法については、GitHub コネクション を参照してください。
-
リポジトリ名 で、GitHub リポジトリの名前を選択します。
-
[デフォルトブランチ] で、パイプラインを手動で開始する場合、または Git タグではないソースイベントで開始する場合に指定するブランチを選択します。変更元がトリガーでない場合やパイプラインの実行が手動で開始された場合は、デフォルトブランチの HEAD コミットが変更として使用されます。
[次へ] を選択します。
-
-
[ステップ 4: ビルドステージの追加] ページで、[その他のビルドプロバイダー]で、[ECRBuildAndPublish] を選択します。
-
[リポジトリ名] でリポジトリ名を選択します。
-
[次へ] を選択します。
-
-
[ステップ 5: テストステージの追加] で、[テストステージをスキップ] を選択し、もう一度 [スキップ] を選択して警告メッセージを受け入れます。
[次へ] を選択します。
-
[ステップ 6: デプロイステージの追加] ページで、[導入段階をスキップ] を選択します。以下の手順を使用して、ECS アクションを追加します。
-
[Step 7: Review] ページで、パイプラインの設定を確認し、[Create pipeline] を選択してパイプラインを作成します。
-
パイプラインを編集して、Amazon ECS デプロイアクションをパイプラインに追加します。
-
右上の [編集] を選択します。
-
図の最下部で [+ Add stage] (+ ステージの追加) を選択します。[ステージ名] に名前 (
Deployなど) を入力します。 -
[+ Add action group (+ アクションの追加)] を選択します。
-
[アクション名] に名前を入力します。
-
[アクションプロバイダ] で [Amazon ECS] を選択します。[リージョン] をデフォルトでパイプラインのリージョンにすることを許可します。
-
[入力アーティファクト] で、
SourceArtifactなどのソースアクションからの入力アーティファクトを選択します。 -
[Cluster name (クラスター名)] で、サービスが実行されている Amazon ECS クラスターを選択します。
-
[サービス名] で更新するサービスを選択します。
-
[保存] を選択します。
-
編集中のステージで、[完了] を選択します。AWS CodePipeline のペインで [保存] を選択し、警告メッセージで [保存] を選択します。
-
変更を送信してパイプラインのビルドを開始するには、[変更をリリース]、[リリース] の順に選択します。
-
-
パイプラインが実行されたら、パイプラインの構造とステータスを確認します。
-
パイプラインが正常に実行されたら、[詳細を表示] を選択してアクションのログを表示し、マネージドコンピューティングアクション出力を表示します。
-
失敗したアクションのトラブルシューティングを行います。例えば、imagedefinitions.json ファイルがソースリポジトリにない場合、ECS デプロイアクションは失敗する可能性があります。以下は、imagedefinitions.json ファイルがない場合に表示されるエラーメッセージの例です。
ステップ 4: パイプラインのテスト
パイプラインには、エンドツーエンドの AWS ネイティブな継続的デプロイを実行するために必要なすべてが含まれているはずです。次は、コードの変更をソースリポジトリにプッシュすることで機能をテストします。
パイプラインをテストするには
-
設定済みソースリポジトリにコード変更を行い、変更をコミットしてプッシュします。
CodePipeline コンソール (https://console.aws.amazon.com/codepipeline/) を開きます。
-
リストからパイプラインを選択します。
-
ステージを通してパイプラインの進行状況を監視します。パイプラインが終了し、アクションが Docker イメージをコードの変更で作成された ECR にプッシュすることを確認します。