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アカウントへデプロイしたいようなケースもあるかと思います。その場合は以下の記事を参考にしてください。
 
        複数のAWSアカウントへCircleCIでデプロイする方法を解説
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: smallresource_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:latestJobsを定義する
続いて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に関する最新情報を集めたい!」「開発ツールの解説や現場の取り組みを知りたい!」とお考えの方は、ぜひお気軽に無料のメルマガをご購読くださいませ。
 
     
        

 
                         
                                 
                         
                         
                                 
                         
                                 
                             
                            