📚

Amazon ECRを利用したプライベートリポジトリの作成と利用

2022/02/22に公開

はじめに

Amazon Elastic Container Registry (以下ECR) は、AWSが提供するコンテナレジストリサービスです。AWS IAMベースの権限管理を行うことができ、またAWSが提供する様々なコンテナサービスとの連携を行うことができるという特徴があります。

この記事ではECRを利用してプライベートレジストリを作成し、自作のイメージをレジストリに登録/取得できるようになるまでの手順を案内します。

IAMユーザーの作成と権限の設定

まず初めに、プライベートレジストリにアクセスするためのIAMユーザーの作成を行います。

IAMユーザーの作成手順についてはここでは省略します。手順はこちらが参考になります。

すでにIAMユーザーを作成してある場合はそちらをそのまま利用できます。ただし、ユーザーを経由してECRを利用するためにはECRに対する権限が正しく設定されている必要があります。

以下の権限ポリシーはECRの機能を十分に利用するための一例です。

ECRに必要な権限ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:GetLifecyclePolicy",
                "ecr:GetLifecyclePolicyPreview",
                "ecr:ListTagsForResource",
                "ecr:DescribeImageScanFindings"
            ],
            "Resource": "*"
        }
    ]
}

また、AWSが管理するポリシーを利用することもできます。以下は提供されているマネージドポリシーの一例です。

  • AmazonEC2ContainerRegistryFullAccess
  • AmazonEC2ContainerRegistryPowerUser
  • AmazonEC2ContainerRegistryReadOnly

マネージドポリシーに関する情報はこちらにまとまっています。

プライベートリポジトリの作成

次に、コンテナイメージを保管するためのプライベートリポジトリの作成を行います。

AWS CLIを用いて以下のコマンドを実行すると、masuwo3/hogeというリポジトリを作成できます。

$ aws ecr create-repository --repository-name masuwo3/hoge
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:<region>:<account-id>:repository/masuwo3/hoge",
        "registryId": "<aws_account_id>",
        "repositoryName": "masuwo3/hoge",
        "repositoryUri": "<account-id>.dkr.<region>.amazonaws.com/masuwo3/hoge",
        ...(snip)...
    }
}

ECRに対するDocker CLIでの認証設定

Docker CLIを通してECR上のリポジトリにアクセスするには、まずプライベートレジストリに対する認証設定を行う必要があります。

ECRレジストリに接続するために必要な認証トークンaws ecr get-login-passwordコマンドから取得することができます。このトークンをDocker CLIに受け渡し、認証設定を行うことでリポジトリへのアクセスが可能となります。

認証トークンの取得からDocker CLIへの設定までは一行のコマンドでまとめて行うことができます。

$ aws ecr get-login-password | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
Login Succeeded

上記のコマンドを実行することで、ECRの認証トークンを利用してDocker CLIの認証を通すことができます。

コンテナイメージの登録

プライベートレジストリを通してECR上のリポジトリにアクセスすることができるようになったので、次はイメージの登録を行います。

まずはDockerfileを作成し、これをもとにローカルに簡単なコンテナイメージ(hoge)を作成します。

$ cat <<EOF > Dockerfile
FROM ubuntu:14.04

CMD ["echo", "hoge"]
EOF

$ docker build . -t hoge
[+] Building 5.4s (5/5) FINISHED
# ...(snip)...

続いて、作成したイメージをリポジトリに登録します。docker imagesからイメージのID(d50e1452969f)を確認し、docker tagでイメージに対してECRのURIを含む形式でタグを設定します。最後にそのイメージをdocker pushすることでリポジトリにイメージが登録されます。

$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
# ...(snip)...
hoge              latest    d50e1452969f   11 months ago   197MB

$ docker tag d50e1452969f <aws_account_id>.dkr.ecr.<region>.amazonaws.com/masuwo3/hoge:latest
$ docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/masuwo3/hoge:latest

コンテナイメージの取得

コンテナイメージが登録できた後は、別の環境でECRからイメージを取得できることを確認します。イメージを取得する場合も登録する際と同様に、事前に認証設定を行う必要があります。

登録時のECRのURIを含む形式のタグを指定し、docker pullを行う事でイメージを取得できます。取得後、docker runからイメージ実行することが確認できます。

$ docker pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/masuwo3/hoge:latest
$ docker run <aws_account_id>.dkr.ecr.<region>.amazonaws.com/masuwo3/hoge:latest
hoge

ここまでの手順で、作成・登録したイメージを別環境で取得し、実行することができました。

リポジトリベースでの権限管理

前述の手順ではユーザーに対して権限を設定しましたが、リポジトリベースで権限を設定することもできます。リポジトリに対して設定する権限ポリシーをリポジトリポリシーと呼びます。

以下の例では、masuwo3/hogeに対してリポジトリポリシーを設定しています。これによりユーザー(masuwo3)がECRに対する権限を持っていなくとも、このリポジトリに対してはアクセスできるようになります。

$ cat repos_policy.json 
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "ECR Repository Policy",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::<aws_account_id>:user/masuwo3"
    },
    "Action": [
       "ecr:DescribeImages",
       "ecr:DescribeRepositories"
    ]
  }]
}

$ aws ecr set-repository-policy --repository-name masuwo3/hoge --policy-text file://repos_policy.json
{
    "registryId": "<aws_account_id>",
    "repositoryName": "masuwo3/hoge",
    "policyText": "{\n  \"Version\" : \"2012-10-17\",..."
}

ユーザーではなくリポジトリを中心に権限設計を行いたい場合は、リポジトリポリシーを活用できるかもしれません。

料金と無料枠について

ECRの料金はストレージ量とデータ送信量に対して課金されます。ここでは2022年2月時点での料金をまとめます。

ストレージ課金についてはプライベート・パブリック共通で1GBあたり0.10USDの課金が毎月発生します。

データ送信に対する課金は以下のテーブルに従います(ap-northeast-1)。

データ送信量 料金
次の 9.999 TB/月 0.114USD/GB
次の 40 TB/月 0.089USD/GB
次の 100 TB/月 0.086USD/GB
150 TB/月超 0.084USD/GB

また、新規AWSユーザー向けの無料枠として、500MB分のストレージ枠が無料で提供されています。データ転送についても全体で共通の100GB無料枠の対象となります。

参考までに、今回利用したubuntu:14.04のイメージサイズは197MBでした。1,2個程度のコンテナイメージであれば十分に無料枠に収まる範囲ではないかと思います。

参考

Discussion