CircleCIからECSへコンテナをデプロイする方法を解説

CircleCIからECSへコンテナをデプロイする方法を解説

Yuto Deguchi

Yuto Deguchi

ECSにアプリケーションをデプロイするにはECRにイメージをPUSHし、タスク定義を登録するなどの作業が必要となりますが、Webコンソール上で操作をおこなうのは手間がかかってしまいます。

そこで今回はCircleCIを利用して、AWSのECRへイメージをPUSHし、ECSでコンテナを起動させる方法について解説します

AWSで開発をおこなっている方はぜひご覧ください。

構成図

今回サンプルでおこなうAWSの構成図は以下の通りです。

開発者がdevelopブランチにマージを行うとCircleCIのビルドが実行され、ECRへ最新のイメージをPUSHします。

ECRへのPUSHが成功したら、プライベートサブネットに配置されているECSに新たなタスク定義を行いリビジョンを更新し、コンテナを最新の状態に更新する仕組みです。

1.AWSの設定

CircleCIからAWSの操作をおこなうため、必要な権限を持ったユーザーを作成します。以下の権限を持った、AWS CLIにアクセスできるIAMユーザーを作成してください。

  • ecs:UpdateService
  • ecs:RegisterTaskDefinition
  • ecr:CompleteLayerUpload
  • ecr:GetAuthorizationToken
  • ecr:UploadLayerPart
  • ecr:InitiateLayerUpload
  • ecs:DescribeTaskDefinition
  • ecr:BatchCheckLayerAvailability
  • ecr:PutImage

作成したユーザーのアクセスキーIDおよびシークレットアクセスキーは、CircleCIに環境変数として登録します。

なお、アクセスキーIDとシークレットアクセスキーが外部に漏れると簡単にAWSへのアクセスが可能になってしまいます。ローカルに情報を保存したり、ユーザー間での使い回しは絶対にやめましょう。

2.CircleCIの設定

CircleCIでのデプロイをおこなう前に、あらかじめCircleCIにAWSの環境変数を設定しておく必要があります。


まずはCircleCIにログインし、「Projects」を選択します。


対象のリポジトリを検索し、「・・・」をクリックします。


「Project Settings」をクリックします。


左メニューの「Environment Variables」をクリックします。


「Add Environment Variable」をクリックします。「Environment Variable Name」および「Value」には、以下の表に記載されている値をそれぞれ入力してください。

Environment Variable Name Value
AWS_ACCOUNT_ID AWSアカウントID
AWS_ACCESS_KEY_ID AWSアクセスキーID
AWS_SECRET_ACCESS_KEY AWSシークレットアクセスキー
AWS_DEFAULT_REGION ap-northeast-1

また、プロジェクトの状況によっては複数のAWSアカウントへデプロイしたいようなケースもあるかと思います。その場合は以下の記事を参考にしてください。

3.config.ymlの編集

CircleCI側の設定が完了したら、config.ymlを編集していきます。

Orbsを定義する

CircleCIのOrbsは、CircleCIの設定を簡単に共有できるようにする、再利用可能な構成パッケージです。Orbsを使用することで、複数のプロジェクトで同じ設定を共有でき、開発者は再利用可能で保守性の高い設定を作成できます。

以下のOrbsを利用することで、AWS CLIの導入とECSサービスのアップデートが簡単におこなえます。

config.yml
orbs:
    aws-cli: circleci/aws-cli@3.1.3
    aws-ecs: circleci/aws-ecs@3.2.0

  • circleci/aws-cli: CicleCI上のコンテナでAWS CLIを利用できるようにする
  • circleci/aws-ecs :ECSのサービスをアップデートする

コンテナを定義する

続いて、imageをビルドするDockerを指定します。

config.yml
executors:
    deploy_container:
        docker:
          - image: cimg/python:3.10
        resource_class: small

resource_classにはコンテナのスペックを記載します。主に以下の値を設定可能です。

  • small
  • medium
  • medium+
  • large
  • x-large

従量課金に影響するので最初はsmallを利用し、処理落ちするようならスペックを上げていくとよいと思います。

ECRにビルドしたイメージをPUSHする

続いてCircleCI上の仮想環境でDocker buildをおこない、AWS CLIを利用してECRへイメージをPUSHします。

config.yml
commands:
    build-and-push:
        steps:
              - run:
                  name: Docker build
                  command: |
                    docker build --platform linux/amd64 -t ecr-image -f Dockerfile .
               - run:
                  name: Push to AWS ECR
                  command: |
                    aws ecr get-login-password --region ${AWS_DEFAULT_REGION} |  \
                    docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
                    docker tag ecr-image:latest ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-image:latest
                    docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-image:latest

Jobsを定義する

続いてJobsを定義していきます。Jobsはcommandsをひとまとめにしたものです。

config.yml
jobs:
    deploy-image:
        executor: deploy_container
        steps:
            - checkout
            - setup_remote_docker
            - aws-cli/install
            - aws-cli/setup
            - build-and-push


上記のJobsでは以下のことをおこなっています。

  • checkout:リポジトリ内のコードを取得します。
  • setup_remote_docker:dockerを使用するために必要な設定を行います。
  • aws-cli/install:dockerにAWS CLIをインストールします。
  • aws-cli/setup:インストールしたAWS CLIの設定を行います。
  • build-and-push:commandsで定義したコマンドを実行します。ここではDocker buildを行い、ECRへのPUSHを行います。

Workflowsを定義する

最後にWorkflowsを定義します。CircleCIはWorkflowsの定義を見て、上から順番に実行していきます。これまで定義した細かい内容を、Workflowsでどのような順序で実行するのか定義するイメージです。

config.yml
workflows:
    deploy:
        - deploy-image
        - aws-ecs/deploy-service-update:
            cluster: cluster
            family: ecs-task
            service-name: ecs-service


上記ではdeployというWorkflowを定義しています。前節で作成したJobとECSのサービスを更新してくれるaws-ecs/deploy-service-updateを上から順番に呼び出すように定義しました。

完成したconfig.yml

下記がこれまで設定してきた内容を全てまとめたconfig.ymlです。適宜プロジェクトの状態に合わせて編集してみてください。

config.yml
version: 2.1

orbs:
    aws-cli: circleci/aws-cli@3.1.3
    aws-ecs: circleci/aws-ecs@3.2.0

executors:
    deploy_container:
        docker:
          - image: cimg/python:3.10
        resource_class: small

commands:
    build-and-push:
        steps:
              - run:
                  name: Docker build
                  command: |
                    docker build --platform linux/amd64 -t ecr-image -f Dockerfile .
               - run:
                  name: Push to AWS ECR
                  command: |
                    aws ecr get-login-password --region ${AWS_DEFAULT_REGION} |  \
                    docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
                    docker tag ecr-image:latest ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-image:latest
                    docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/ecr-image:latest

jobs:
    deploy-image:
        executor: deploy_container
        steps:
            - checkout
            - setup_remote_docker
            - aws-cli/install
            - aws-cli/setup
            - build-and-push

workflows:
    deploy:
        - deploy-image
        - aws-ecs/deploy-service-update:
            cluster: cluster
            family: ecs-task
            service-name: ecs-service

まとめ

CircleCIでAWSのECRへイメージをPUSHし、ECSでコンテナを起動させる方法について解説しました。

CicleCIのOrbsを使用すれば、簡単に設定をおこなうことが可能です。複数のプロジェクトで同じ設定を共有できるなどのメリットもあるため、ぜひ活用してみてください。

最新情報をメルマガでお届けします!

LIGブログではAIやアプリ・システム開発など、テクノロジーに関するお役立ち記事をお届けするメルマガを配信しています。

<お届けするテーマ>
  • 開発プロジェクトを円滑に進めるためのTIPS
  • エンジニアの生産性が上がった取り組み事例
  • 現場メンバーが生成AIを使ってみた
  • 開発ツールの使い方や開発事例の解説
  • AIをテーマにしたセミナーの案内
  • 最新のAI関連ニュースまとめ など

「AIに関する最新情報を集めたい!」「開発ツールの解説や現場の取り組みを知りたい!」とお考えの方は、ぜひお気軽に無料のメルマガをご購読くださいませ。

購読する(無料)

この記事のシェア数

専門学校卒業後、ソフトウェア開発企業にに入社。その後、転職支援サービス会社の社内SEとして従事した後、2022年にLIGへ入社。これまでの経験を活かし、エンジニアの開発ディレクションやシステム設計を担当。現在インフラに挑戦中。

このメンバーの記事をもっと読む
デザイン力 × グローバル体制を活かしたシステム・アプリ開発
お問い合わせ サービス詳細/実績