Amazon ECS にデプロイする

このガイドでは、Bitbucket Pipelines を構成して AWS EC2 Container Service (ECS) 内の既存のサービスに自動的にデプロイする方法について説明します。

ここでは、当社のサンプル Node.js アプリの新しいバージョンを新しい Docker イメージとしてパッケージ化し、このイメージを DockerHub にプッシュします。その後、この更新済み Docker イメージを使用する ECS に新しいタスク定義を登録します。最後に、ECS サービスを更新して、この新しいタスク定義を使用するようにします。
このチュートリアルは 1 ステップごとに行うことも、最後のまとめのみを確認することもできます。 

You may also be interested in these guides: 

次のリポジトリも参照してください。

要件

以下が必要です。

  • 既存の Docker Hub アカウントおよびそこで作成された Docker リポジトリ。このリポジトリにイメージをプッシュします。または、独自の Docker レジストリを使用することもできます。 
  • サービスを稼働中の AWS Elastic Container Service (ECS) セットアップ。
  • RegisterTaskDefinition および UpdateService アクションを実行するための権限が関連付けられた AWS アクセス キー。


アーティファクトのビルド

In this example we package and deploy a Node.js app. To easily build the Node.js project you can configure your bitbucket-pipelines.yml to look like this: 

bitbucket-pipelines.yml
pipelines:
  default:
    - step:
        script: # Modify the commands below to build your repository.
          # build and test the Node app
          - npm install
          - npm test


オンライン バリデーターを使用して bitbucket-pipelines.yml ファイルをチェックすることができます。

Docker イメージのビルドとプッシュ

次に、Node.js アプリを Docker イメージとしてパッケージ化します。これを行うには、リポジトリの Docker を有効にし、Docker イメージを作成して、レジストリにプッシュする必要があります。この例では、Docker イメージを DockerHub にプッシュします。 

First we need a Dockerfile in the root of our repository. We'll use the following: 

Dockerfile
FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

次に、Docker イメージをビルドして、DockerHub レジストリ内のプライベート リポジトリにプッシュします。Bitbucket Pipelines で環境変数として DockerHub 資格情報を構成する必要があります。 

Bitbucket でリポジトリ設定に進み、[Pipelines] > [環境変数] に移動して、Docker Hub のユーザー名とパスワードを保護された変数として追加します。


Now, add those credentials to the bitbucket-pipelines.yml file, as shown below. 

bitbucket-pipelines.yml
pipelines:
  default:
    - step:
        name: build and publish docker image.
        services:
          - docker # enable Docker for your repository
        script: # Modify the commands below to build your repository.
          # set DOCKER_HUB_USERNAME and DOCKER_HUB_PASSWORD as environment variables
          # Docker variables
          - export IMAGE_NAME="${DOCKER_HUB_USERNAME}/${BITBUCKET_REPO_SLUG}:${BITBUCKET_BUILD_NUMBER}"
          # build and test the Node app
          - npm install
          - npm test
          # build the Docker image (this will use the Dockerfile in the root of the repo)
          - docker build -t "$IMAGE_NAME" .
          # authenticate with the Docker Hub registry
          - docker login --username "$DOCKER_HUB_USERNAME" --password "$DOCKER_HUB_PASSWORD"
          # push the new Docker image to the Docker registry
          - docker push "$IMAGE_NAME"

AWS 資格情報のセットアップ

同様に、Bitbucket Pipelines に AWS 資格情報を環境変数として追加する必要があります。[Pipelines] > [環境変数] に進み、AWS のアクセス キー、シークレット アクセスキーおよび既定のリージョンを保護された変数として追加します。

デプロイ ツールのインストール

このデプロイメント スクリプトでは、ビルドの一環として AWS CLIjq ライブラリインストールされている必要があります。この例ではこれらをインストール済みのイメージを使用していますが、別の Docker イメージを使用したり、独自のものを作成する場合は、これらのパッケージがインストール済みであることを確認する必要があります。

bitbucket-pipelines.yml スニペット
          - curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
          - sudo apt-get install jq
          - unzip awscli-bundle.zip
          - ./awscli-bundle/install -b ~/bin/aws
          - export PATH=~/bin:$PATH

ECS タスク定義の登録

次に、新しくプッシュされた Docker イメージを参照する ECS タスク定義を登録します。ECS クラスタでタスク定義を登録すると、バージョンが返されます。これを環境変数に保存することで、後で ECS サービスを更新する際に参照できます。 

bitbucket-pipelines.yml スニペット
          - export ECS_TASK_NAME="${BITBUCKET_REPO_SLUG}"
          # register the ECS task definition and capture the version
          - export TASK_VERSION=$(aws ecs register-task-definition
            --family "${ECS_TASK_NAME}"
            --container-definitions
            '[{"name":"app","image":"'"${IMAGE_NAME}"'","memory":1024}]'
            | jq --raw-output '.taskDefinition.revision')
          - echo "Registered ECS Task Definition: " $TASK_VERSION

ECS サービスの更新

次に、既存の ECS サービスを更新して、先ほど登録したタスク定義を使用できるようにします。 

bitbucket-pipelines.yml スニペット
          # ECS variables
          - export ECS_CLUSTER_NAME="${BITBUCKET_REPO_OWNER}"
          - export ECS_SERVICE_NAME="${BITBUCKET_REPO_SLUG}"
          # Update the ECS service to use the updated Task version
          - aws ecs update-service --cluster "${ECS_CLUSTER_NAME}" --service "${ECS_SERVICE_NAME}" --task-definition "${ECS_TASK_NAME}:${TASK_VERSION}"

要約

ECS へのデプロイをすぐに開始するには、AWS と Docker Hub の資格情報がリポジトリ変数として構成済みである必要があります。 

Then create your bitbucket-pipelines.yml file in the root of your repository after replacing the following fields with your own values:

  • IMAGE_NAME (docker イメージの名前)
  • ECS_TASK_NAME (ECS タスクの名前)
  • ECS_CLUSTER_NAME (デプロイ先の ECS クラスタの名前)
  • ECS_SERVICE_NAME (ECS サービスの名前)
  • AWS_DEFAULT_REGION (ECS クラスタを実行中のリージョン)
bitbucket-pipelines.yml
# enable Docker for your repository
options:
  docker: true

pipelines:
  default:
    - step:
        name: build and publish docker image.
        services:
          - docker # enable Docker for your repository
        script: # Modify the commands below to build your repository.


          # set DOCKER_HUB_USERNAME and DOCKER_HUB_PASSWORD as environment variables
          # Docker variables
          - export IMAGE_NAME="${DOCKER_HUB_USERNAME}/${BITBUCKET_REPO_SLUG}:${BITBUCKET_BUILD_NUMBER}"
          # build and test the Node app
          - npm install
          - npm test
          # build the Docker image (this will use the Dockerfile in the root of the repo)
          - docker build -t $IMAGE_NAME .
          # authenticate with the Docker Hub registry
          - docker login --username $DOCKER_HUB_USERNAME --password $DOCKER_HUB_PASSWORD
          # push the new Docker image to the Docker registry
          - docker push $IMAGE_NAME
    - step:
        name: deploy-to-ecs
        image: atlassian/pipelines-awscli:latest
        deployment: test
        script:
          # AWS authentication variables
          # set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY as environment variables
          # set AWS_SECURITY_TOKEN and AWS_SESSION_TOKEN as environment variables if using temporary credentials via AWS STS
          - export AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-"us-east-1"} #default is us-east-1
          # Dockerhub Authentication variables
          # set DOCKER_HUB_USERNAME and DOCKER_HUB_PASSWORD as environment variables
          # Docker variables
          - export IMAGE_NAME="${DOCKER_HUB_USERNAME}/${BITBUCKET_REPO_SLUG}:${BITBUCKET_BUILD_NUMBER}"
          # ECS variables
          - export ECS_CLUSTER_NAME="${BITBUCKET_REPO_OWNER}"
          - export ECS_SERVICE_NAME="${BITBUCKET_REPO_SLUG}"
          - export ECS_TASK_NAME="${BITBUCKET_REPO_SLUG}"
          # Create ECS cluster, task, service
          - aws ecs list-clusters | grep "${ECS_CLUSTER_NAME}" || aws ecs create-cluster --cluster-name "${ECS_CLUSTER_NAME}"
          # Updating the existing cluster, task, service
          - export TASK_VERSION=$(aws ecs register-task-definition
            --family "${ECS_TASK_NAME}"
            --container-definitions
            '[{"name":"app","image":"'"${IMAGE_NAME}"'","memory":1024}]'
            | jq --raw-output '.taskDefinition.revision')
          - echo "Registered ECS Task Definition:" "${TASK_VERSION}"
          # Create ECS Service
          - aws ecs list-services --cluster "${ECS_CLUSTER_NAME}"  | grep "${ECS_SERVICE_NAME}" || aws ecs create-service --service-name "${ECS_SERVICE_NAME}" --cluster "${ECS_CLUSTER_NAME}" --task-definition "${ECS_TASK_NAME}" --desired-count 1
          - aws ecs update-service --cluster "${ECS_CLUSTER_NAME}" --service "${ECS_SERVICE_NAME}" --task-definition "${ECS_TASK_NAME}:${TASK_VERSION}"
          # Follow https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html for instrunctions
          # needed to provide the compute resources (EC2 instances) that the tasks will run on.


オンライン バリデーターを使用して bitbucket-pipelines.yml ファイルをチェックすることができます

最終更新日: 2019 年 2 月 28 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.