Amazon ECRを利用したプライベートリポジトリの作成と利用
はじめに
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