Closed3

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

masamasa

概要

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

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

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-repoanother-repoという2つのリポジトリを作成したという設定である。
  • 各リポジトリについてARN、リポジトリ名、リポジトリURI、作成日時、イメージタグの可変性、イメージスキャン設定などの情報が表示される。
masamasa

Step4 ECRへログイン後Dockerイメージをプッシュする

Step3まででECRリポジトリの作成までが完了しているため、次に実際に作成したECRリポジトリにログインしてDockerイメージをプッシュする。

主な流れ

1.ローカルでDockerイメージをビルド
2.ECRへログインする。
3.Dockerイメージに作成したリポジトリのURIを含むタグをつける。
4.タグをつけた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アカウントID
your-account-id
ECRリポジトリのURIに含まれる12桁の数値。例:123456789012.dkr.ecr.us-west-2.amazonaws.com/my-repo123456789012
補足: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
masamasa

概要

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

使用技術

  • Terraform

このスクラップは2023/05/06にクローズされました