Docker×AWS#ECS, ECR, Docker(2023/5/6)

概要
Webアプリ開発をする際に、dockerfile作成後AWSのECRリポジトリをコマンド上で作成し、プッシュするまでの流れをまとめる。
実行環境
OS : Windows 11 pro
使用技術(Webアプリ)
バックエンド | フロントエンド | |
言語 | Python | Typescript |
フレームワーク | FastAPI | Vue.js |
ライブラリ | React |
必要な事前知識(超簡易版)
ECR
- Docker hubのAWS版だと考えると簡単かもしれない。
- 機能 : AWS上にDocker imageをプッシュし、それを共同開発しているメンバーに共有できる。また共有されたものをプルできる。
ECS
- ECSはAWS上でDockerを実際に起動する場所のことを指す
- 機能:AWS上でコンテナを起動 ⇒ 運用
Step1 必要なコマンドをinstallする
- AWS CLI
Step2 AWSアカウントと紐づける
1.以下のコマンドを実行
aws configure
コマンド実行後以下の項目を入力する
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
2.4項目の詳細
AWS Access Key ID | AWSアカウントで作成したアクセスキーIDを入力する。IAMユーザーに対してアクセスキーを作成することができる。AWS Management Consoleの IAM ダッシュボード で新しいアクセスキーを作成できる。 |
AWS Secret Access Key | 上のアクセスキーIDに関連付けられたシークレットアクセスキーを入力する。これはアクセスキーを作成した際にのみ表示されるため、紛失した場合は新しいアクセスキーを作成する。 |
Default region name | AWSリソースにアクセスする際に使用するデフォルトのリージョンを入力する。例: us-west-2 や ap-northeast-1 など。リージョン名はAWS リージョン表 で確認できる。 |
Default output format | AWS CLIのデフォルトの出力フォーマットを指定する。利用可能なフォーマットは json, yaml, text, および table である。ちなみに僕はなんとなくjsonにしてみた。フォーマット指定に意味があるのかは不明。詳しい人いたら教えてください。 |
3.設定ができているかの確認
設定が完了したら以下のコマンドを実行する
aws configure list
出力例
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************ABCD shared-credentials-file
secret_key ****************EFGH shared-credentials-file
region us-west-2 config-file ~/.aws/config
ここでアクセスキーとシークレットキーの値は、実際の値ではなく*
でマスクされる。
また、aws configure get <設定名>
コマンドを実行して特定の設定値を取得することもできる。
例えば、
aws configure get region
と実行すれば、設定されたデフォルトリージョンの値を表示する。
Step3 ECRリポジトリを作成する
まず以下のコマンドを実行してリポジトリを作成する。
aws ecr create-repository --repository-name backend-repo-name
backend-repo-nameに任意の名称を付ける
作成した後は、実際に作成されているかどうかを確認する。以下のコマンドを実行して確認する。
aws ecr describe-repositories
出力例
{
"repositories": [
{
"repositoryArn": "arn:aws:ecr:us-west-2:123456789012:repository/my-repo",
"registryId": "123456789012",
"repositoryName": "my-repo",
"repositoryUri": "123456789012.dkr.ecr.us-west-2.amazonaws.com/my-repo",
"createdAt": "2020-01-01T00:00:00Z",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
}
},
{
"repositoryArn": "arn:aws:ecr:us-west-2:123456789012:repository/another-repo",
"registryId": "123456789012",
"repositoryName": "another-repo",
"repositoryUri": "123456789012.dkr.ecr.us-west-2.amazonaws.com/another-repo",
"createdAt": "2020-02-01T00:00:00Z",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
}
}
]
}
- 上記の出力例は、
my-repo
とanother-repo
という2つのリポジトリを作成したという設定である。 - 各リポジトリについてARN、リポジトリ名、リポジトリURI、作成日時、イメージタグの可変性、イメージスキャン設定などの情報が表示される。

Step4 ECRへログイン後Dockerイメージをプッシュする
Step3まででECRリポジトリの作成までが完了しているため、次に実際に作成したECRリポジトリにログインしてDockerイメージをプッシュする。
主な流れ
2.ECRへログインする。
3.Dockerイメージに作成したリポジトリのURIを含むタグをつける。
4.タグをつけたDockerイメージをプッシュする
1.ローカルでDockerイメージをビルド1.ローカルのDockerイメージをビルド
今回はdocker-compose.ymlを作成している前提で話を進める。
以下のコマンドを実行
docker-compose build
2.ECRへログインする。
以下のコマンドを実行
aws ecr get-login-password --region your-region | docker login --username AWS --password-stdin your-account-id.dkr.ecr.your-region.amazonaws.com
必須情報 | 詳細 |
AWSアカウントIDyour-account-id
|
ECRリポジトリのURIに含まれる12桁の数値。例:123456789012.dkr.ecr.us-west-2.amazonaws.com/my-repo の123456789012 補足:12桁の数値はAWSアカウント作成時に作成される |
リージョンyour-region
|
AWSリージョンコード。例:us-west-2 , ap-northeast-1 ... |
コマンドのyour-region
, your-account-id
を自分が作成したECRリポジトリに合わせて変更する。
出力
Login Succeeded
が出たら成功
3.Dockerイメージに作成したリポジトリのURIを含むタグをつける。
以下のコマンドを実行してローカルにあるDockerイメージに新しいタグを付け、そのタグをECRのリポジトリに対応する形式に変換する
docker tag local-image-name:local-tag your-account-id.dkr.ecr.your-region.amazonaws.com/your-repo-name:desired-tag
コマンド | 詳細 |
local-image-name:local-tag | ローカルにある Docker イメージの名前とタグ |
your-account-id | AWS アカウントの ID |
dkr.ecr.your-region.amazonaws.com | ECR のエンドポイント。your-region は、使用している AWS リージョン(例:us-west-2)に置き換える |
your-repo-name | ECR にあるリポジトリの名前(Step3で作成したリポジトリ名) |
desired-tag | ECR にプッシュする際に使用する新しいタグ名。これにより、ECR 内でイメージのバージョンや機能を識別できる |
4.タグをつけたDockerイメージをプッシュする
Dockerイメージにタグを付け終わったのでプッシュする。
以下のコマンドを実行する。
docker push your-account-id.dkr.ecr.your-region.amazonaws.com/your-repo-name:desired-tag
よく見たらわかる通り、タグ付けをする際に実行したコマンドのlocal-tag
以降の文字列をそのままコピーすれば良い
実行後にエラーを吐かなければ成功
DockerイメージがECRにプッシュされているか確認するには以下のコマンドを実行する
aws ecr list-images --repository-name your-repo-name
your-repos-name
には作成したECRリポジトリ名を入れる。
出力
{
"imageIds": [
{
"imageDigest": "aaa:abc123・・・・・・・・・・・・・・・・",
"imageTag": "タグ名"
}
]
}
このような出力になったらDockerイメージのECRリポジトリへのプッシュ成功である。
Example
region
- ap-northeast-1
dockerのイメージ達
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7db30c35b7ed librolink-backend "/bin/bash -c 'pipen…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp librolink-backend-1
140da9985644 postgres "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:5432->5432/tcp librolink-db-1
78f9cc5a1942 librolink-web "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:5173->5173/tcp
docker tag
docker tag librolink-web:latest `アカウントID`.dkr.ecr.ap-northeast-1.amazonaws.com/librolink-front:desired-tag
docker push
docker push `アカウントID`.dkr.ecr.ap-northeast-1.amazonaws.com/librolink-front:desired-tag

概要
- 前回の記事でDockerをECRリポジトリにプッシュすることができたので、AWS Fargateを使用してプッシュしたDockerイメージをデプロイしてみる
使用技術
- Terraform