翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル:Amazon ECS による標準デプロイ CodePipeline
このチュートリアルでは、Amazon ECS を使用して完全なエンドツーエンドの継続的デプロイ (CD) パイプラインを作成する方法について説明します。CodePipeline
注記
このチュートリアルは、の Amazon ECS 標準デプロイアクションを対象としています。CodePipelineの Amazon ECS CodeDeploy を使用してブルー/グリーンデプロイアクションを実行するチュートリアルについては、を参照してください。CodePipeline チュートリアル:Amazon ECR ソースと ECS to-デプロイを使用してパイプラインを作成する CodeDeploy
前提条件
このチュートリアルで CD パイプラインを作成する前に、いつくかのリソースを用意する必要があります。使用を開始するために必要なものは以下のとおりです。
注記
これらのすべてのリソースを、同じ AWS リージョン内に作成する必要があります。
-
Dockerfile およびアプリケーションリソースを使用するソースコントロールリポジトリ (このチュートリアルでは CodeCommit を使用します)。詳細については、AWS CodeCommitユーザーガイドの「CodeCommitリポジトリの作成」を参照してください。
-
Dockerfile およびアプリケーションソースから作成したイメージを含む Docker イメージリポジトリ (このチュートリアルでは Amazon ECR を使用します)。詳細については、Amazon Elastic Container Registry ユーザーガイド の「リポジトリの作成」と「イメージをプッシュする」を参照してください。
-
イメージリポジトリでホストされた Docker イメージを参照する Amazon ECS タスク定義。詳細については、Amazon Elastic Container Service デベロッパーガイド の「タスク定義の作成」を参照してください。
重要
の Amazon ECS 標準デプロイアクションは、Amazon ECS CodePipeline サービスで使用されているリビジョンに基づいてタスク定義の独自のリビジョンを作成します。Amazon ECS サービスを更新せずにタスク定義の新しいリビジョンを作成した場合、デプロイアクションはそれらのリビジョンを無視します。
このチュートリアルで使用するタスク定義の例を以下に示します。
name
とfamily
に使用する値は、ビルド仕様ファイルのために次のステップで使用します。{ "ipcMode": null, "executionRoleArn": "
role_ARN
", "containerDefinitions": [ { "dnsSearchDomains": null, "environmentFiles": null, "logConfiguration": { "logDriver": "awslogs", "secretOptions": null, "options": { "awslogs-group": "/ecs/hello-world
", "awslogs-region": "us-west-2", "awslogs-stream-prefix": "ecs" } }, "entryPoint": null, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "command": null, "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": 128, "volumesFrom": [], "stopTimeout": null, "image": "image_name
", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "hello-world
" } ], "placementConstraints": [], "memory": "2048", "taskRoleArn": null, "compatibilities": [ "EC2", "FARGATE" ], "taskDefinitionArn": "ARN
", "family": "hello-world
", "requiresAttributes": [], "pidMode": null, "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "1024", "revision": 1, "status": "ACTIVE", "inferenceAccelerators": null, "proxyConfiguration": null, "volumes": [] } -
前に説明したタスク定義を使用するサービスを実行する Amazon ECS クラスター。詳細については、Amazon Simple Queue Serviceデベロッパーガイド の クラスターの作成 と サービスの作成 を参照してください。
これらの前提条件を満たした後、チュートリアルに進んで CD パイプラインを作成できます。
ステップ 1: ビルド仕様ファイルをソースリポジトリに追加する
このチュートリアルではCodeBuild、を使用して Docker イメージを構築し、そのイメージを Amazon ECR にプッシュします。buildspec.yml
ファイルをソースコードリポジトリに追加して CodeBuild に処理方法を指示します。ビルド仕様の以下の例では、次のように動作します。
-
プレビルドステージ:
-
Amazon ECR にログインします。
-
リポジトリ URI を ECR イメージに設定して、ソースの Git コミット ID の最初の 7 文字を使用するイメージタグを追加します。
-
-
ビルドステージ:
-
Docker イメージを作成し、イメージに
latest
と Git コミット ID の両方をタグ付けします。
-
-
ポストビルドステージ:
-
両方のタグを持った ECR リポジトリにイメージをプッシュします。
-
Amazon ECS サービスのコンテナ名およびイメージとタグがあるビルドのルートに
imagedefinitions.json
という名前のファイルを作成します。CD パイプラインのデプロイステージでこの情報を使用してサービスのタスク定義の新しいリビジョンを作成し、新しいタスク定義を使用してサービスを更新します。imagedefinitions.json
ファイルは ECS ジョブワーカーに必須です。
-
このサンプルテキストを貼り付けて、buildspec.yml
ファイルを使用して、イメージとタスク定義の値を置き換えます。このテキストでは、サンプルアカウント ID 111122223333 を使用しています。
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $REPOSITORY_URI:latest . - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPOSITORY_URI:latest - docker push $REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json
このチュートリアルで使用する Amazon ECS サービスで、前提条件 で提供されているサンプルタスクの定義に合わせてビルド仕様が書き込まれています。REPOSITORY_URI
値は image
リポジトリ (イメージタグなし) に対応し、ファイルの末尾近くの
値はサービスのタスク定義のコンテナ名に対応します。hello-world
ソースリポジトリに buildspec.yml
ファイルを追加するには
-
テキストエディタを開き、上記のビルド仕様をコピーして新しいファイルに貼り付けます。
-
REPOSITORY_URI
の値 (
) を、Docker イメージの自分の Amazon ECR リポジトリ URI (イメージタグなし) に置き換えます。012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
を、Docker イメージを参照するサービスのタスク定義のコンテナ名に置き換えます。hello-world
-
ソースリポジトリに
buildspec.yml
ファイルをコミットし、プッシュします。-
ファイルを追加します。
git add .
-
変更をコミットします。
git commit -m "Adding build specification."
-
コミットをプッシュします。
git push
-
ステップ 2: 継続的デプロイパイプラインを作成する
CodePipeline ウィザードを使用してパイプラインステージを作成し、ソースリポジトリを ECS サービスに接続します。
パイプラインを作成するには
https://console.aws.amazon.com/codepipeline/ CodePipeline
でコンソールを開きます。 -
[Welcome (ようこそ)] ページで、[Create pipeline (パイプラインの作成)] を選択します。
CodePipeline を初めて使用する場合は、[Welcome (ようこそ)] の代わりに紹介ページが表示されます。[今すぐ始める] を選択します。
-
[Step 1: Name (ステップ 1: 名前)] ページの [パイプライン名] ボックスにパイプラインの名前を入力し、[Next (次へ)] を選択します。このチュートリアルでは、パイプライン名は hello-world です。
-
「ステップ 2: ソースステージの追加」ページの「ソースプロバイダー」で、を選択しますAWS CodeCommit。
-
[Repository name (リポジトリ名)] で、パイプラインのソース場所として使用する CodeCommit リポジトリの名前を選択します。
-
[ブランチ名] で使用するブランチを選択し、[Next (次へ)] を選択します。
-
-
[ステップ 3: ビルドステージの追加] ページで、[ビルドプロバイダー] を選択しAWS CodeBuild、[プロジェクトの作成] を選択します。
-
[Project name] では、ビルドプロジェクトに一意の名前を選択します。このチュートリアルでは、プロジェクト名は hello-world です。
-
[環境イメージ] で、[Managed image (マネージド型イメージ)] を選択します。
-
[オペレーティングシステム] で、[Amazon Linux 2] を選択します。
-
[ランタイム] で、[Standard (標準)] を選択します。
-
[画像] で、を選択します
aws/codebuild/amazonlinux2-x86_64-standard:3.0
。 -
[イメージバージョン] と [環境タイプ] には、既定値を使用します。
-
[Enable this flag if you want to build Docker images or want your builds to get elevated privileges (Docker イメージを構築する場合、またはビルドで昇格された権限を取得する場合は、このフラグを有効にする)] を選択します。
-
CloudWatchログを選択解除します。アドバンスト の拡張を必要とする場合があります。
-
[続行] を選択しますCodePipeline。
-
[Next] (次へ) を選択します。
注記
ウィザードは、codebuild-
build-project-name
-service-role CodeBuild というビルドプロジェクトのサービスロールを作成します。このロール名を書き留めます。これには後で Amazon ECR アクセス権限を追加します。
-
-
[Step 4: Add deploy stage (ステップ 4: デプロイステージの追加)] の [デプロイプロバイダ] に、[Amazon ECS] を選択します。
-
[Cluster name (クラスター名)] で、サービスが実行されている Amazon ECS クラスターを選択します。このチュートリアルでは、クラスターは default です。
-
[サービス名] で更新するサービスを選択し、[Next (次へ)] を選択します。このチュートリアルでは、サービス名は hello-world です。
-
-
[ステップ 5: レビュー] ページで、パイプラインの設定を確認し、[パイプラインの作成] を選択してパイプラインを作成します。
注記
これでパイプラインが作成され、さまざまなパイプラインステージを通して実行を試みます。ただし、ウィザードによって作成されたデフォルトの CodeBuild ロールには、
buildspec.yml
ファイルに含まれるコマンドのすべてを実行するアクセス権限がないため、ビルドステージは失敗します。次のセクションで、ビルドステージのアクセス権限を追加します。
ステップ 3: Amazon ECR のアクセス権限をロールに追加する CodeBuild
CodePipelineウィザードは、codebuild-build-project-name
-service-role CodeBuild というビルドプロジェクト用の IAM ロールを作成しました。このチュートリアルの名前は codebuild-hello-world-service-role です。buildspec.yml
ファイルは Amazon ECR API オペレーションの呼び出しを実行するため、これらの Amazon ECR コールを行うアクセス権限を許可するポリシーがロールに必要です。以下の手順では、適切なアクセス権限をロールにアタッチします。
Amazon ECR CodeBuild のアクセス権限をロールに追加するには
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
左のナビゲーションペインで、[Roles] (ロール) を選択します。
-
検索ボックスに 「codebuild-」と入力し、CodePipeline ウィザードによって作成されたロールを選択します。このチュートリアルでは、ロール名は codebuild-hello-world-service-role です。
-
[Summary (概要)] ページで、[Attach policy (ポリシーのアタッチ)] を選択します。
-
AmazonEC2 ContainerRegistryPowerUser ポリシーの左側にあるボックスを選択し、[ポリシーをアタッチ] を選択します。
ステップ 4: パイプラインのテスト
パイプラインには、エンドツーエンドの AWS ネイティブな継続的デプロイを実行するために必要なすべてが含まれているはずです。次は、コードの変更をソースリポジトリにプッシュすることで機能をテストします。
パイプラインをテストするには
-
設定済みソースリポジトリにコード変更を行い、変更をコミットしてプッシュします。
https://console.aws.amazon.com/codepipeline/ CodePipeline
でコンソールを開きます。 -
リストからパイプラインを選択します。
-
ステージを通してパイプラインの進行状況を監視します。パイプラインが終了し、Amazon ECS サービスがコード変更から作成された Docker イメージを実行することを確認します。