【AWS】ECS構築の基礎 −ECR編−


はじめに

ECSクラスターの構築に慣れてきたので、今回はタスク(コンテナ)イメージをECRにプッシュして、そこからイメージを読み込むようにタスク定義を新しく作成してみることにしました。

ECRとは

AWS上でDockerコンテナイメージを管理するサービスです。
ECSに統合されているため、開発から本稼働までのワークフローを簡略化することができたりします。

実装

今回はDockerHubから取得したコンテナイメージsimplehttpをECRにプッシュして、タスク定義を修正(イメージの読込先の修正)した後に新しくサービスをつくってみることにしました。

リポジトリの作成

マネジメントコンソールとAWS CLIから、それぞれリポジトリを作成してみます。

マネジメントコンソール

ECS画面の左側にあるリポジトリを押すと以下の画面になります。

"リポジトリを作成"を押すと以下の画面になるので、リポジトリ名を指定します。

以下のようにリポジトリが作成されます。

AWS CLI

aws-cliで作成する場合は以下のようなコマンドを打ちます。
--image-scanning-configuration scanOnPush=trueの部分でイメージスキャンの設定を行っています。
イメージスキャンはコンテナイメージ内のソフトウェアの脆弱性を解析するものです。

$ aws ecr create-repository --repository-name ecr-simplehttp --region ap-northeast-1 --image-scanning-configuration scanOnPush=true
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:338233790232:repository/ecr-simplehttp",
        "registryId": "338233790232",
        "repositoryName": "ecr-simplehttp",
        "repositoryUri": "338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp",
        "createdAt": "2021-07-06T20:12:56+09:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

このようにリポジトリが作成されます。

ECRへのコンテナイメージのプッシュ

DockerHubからECRへプッシュしたいイメージをプルします。

$ docker pull gkoenig/simplehttp
Using default tag: latest
latest: Pulling from gkoenig/simplehttp
12dc4b9ba0e4: Pull complete
Digest: sha256:1f0c62b20a6718a42d5e6f06c6f4df37c0b52d0fc3e64b431889bb5d492b08ee
Status: Downloaded newer image for gkoenig/simplehttp:latest
docker.io/gkoenig/simplehttp:latest

以下のコマンドでプルしたイメージを確認することができます。

$ docker images
REPOSITORY                    TAG              IMAGE ID       CREATED         SIZE
gkoenig/simplehttp            latest           66cd53172aac   14 months ago   7.43MB

作成したリポジトリを選択して"プッシュコマンドを表示"を選択します。

これらのコマンドを順に実行します。

まず、認証トークンを取得して、レジストリに対してDockerクライアントを認証します。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 338233790232.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

すでにイメージをpullしているので、ステップ2(イメージビルド)はスキップしてイメージへのタグ付けを行います。

$ docker tag gkoenig/simplehttp 338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp:latest

docker imagesを実行すると、タグ付けができていることを確認することができます。

REPOSITORY                    TAG              IMAGE ID       CREATED         SIZE
338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp   latest           66cd53172aac   14 months ago   7.43MB

最後に、リポジトリへイメージをプッシュします。

$ docker push 338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp:latest
The push refers to repository [338233790232.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp]
22cfb2031743: Pushed
latest: digest: sha256:1f0c62b20a6718a42d5e6f06c6f4df37c0b52d0fc3e64b431889bb5d492b08ee size: 528

成功していればプッシュされたイメージが以下のように表示されます。

ECRにプッシュしたイメージからコンテナを起動させるように、タスク定義を修正します。

タスク定義名をチェックして、"新しいリビジョンの作成"を選択します。

イメージにタグ名を記述して更新します。

td-simplehttp-ec2-2というリビジョンが新しく作成されます。

最新リビジョンのタスク定義を指定したサービスを新しく作成して、タスクが実行されるかどうか確かめます。


ELBのDNS名をコピーしてアクセスすると、ページが表示され、タスクが実行されていることを確認できます。

参考資料