podmanからECRを利用する

Dockerと近い機能を持ったpodmanではコンテナイメージのレジストリを利用するとも可能です。 今回はECRを利用するケースを考え、podmanとECRの認証ヘルパーを利用してイメージの登録、取得を行う方法を整理してみました。
2023.02.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

podmanとECRについて

podmanはコンテナの開発、管理、実行を行うためのエンジンです。 Dockerと同様にコンテナイメージのレジストリに対して、イメージを登録、取得することが可能です。

Amazon Elastic Container Registry(以下 ECR)はAWSが提供するコンテナイメージのレジストリです。 ECR上ではコンテナイメージの保存等の管理が可能です。

ECRについては以下の記事が参考になるかと思います。

今回はPodmanでのECR上のイメージの登録(Push)と取得(Pull)までの流れを整理します。

今回の説明では省略するもの

以下のものが必要ですが、説明の簡略化のため省略します。

  • IAMの認証情報(イメージのPushに必要)及び権限
  • ECRのリポジトリ
  • コンテナイメージ(今回はDockerの公式イメージのalpineのイメージを使用します。)

PodmanからECRを使う

以下のような流れで作業を行います。

  1. コンテナレジストリの認証ヘルパーの導入
  2. ECRへのイメージの登録(Push)
  3. ECRからのイメージの取得(Pull)

コンテナレジストリの認証ヘルパーの導入

今回はamazon-ecr-credential-helperを利用します。 認証ヘルパーを使用しない場合のログイン方法については付録に記載しておきます。

これは、ECRへのアクセスに際して必要な認証情報をDockerに渡してくれる便利なプラグインのようなものです。 もともとはDocker用ですがPodmanでも問題なく使用できます。

インストール

自分はMacOSを使用しているのでHomebrew形式でインストールしました。 他のOSについては先程のGithubのページにインストール方法が書いてあります。

インストール

$ brew install docker-credential-helper-ecr

設定

~/.docker/config.jsonに以下の内容を追加します。 ~/.docker/config.json は元々はDokcer用の設定ファイルですが、podmanもここを参照してくれます。(さすが!)

~/.docker/config.json

{
	"credHelpers": {
		"public.ecr.aws": "ecr-login",
		"<aws_account_id>.dkr.ecr.<region>.amazonaws.com": "ecr-login"
	}
}

以下の部分は自分の環境に合わせて適宜書き換えてください。

  • <aws_account_id>: ECRリポジトリのあるAWSアカウントID
  • <region>: ECRリポジトリのあるリージョン(例: ap-northeast-1)

以下ではDockerHubの公式イメージのAlpineLinuxのイメージをECRに登録しています。

ECRへのイメージの登録(Push)

上記の設定を済ませたら、後は他のレジストリと同じように使うことができます。

イメージの登録

# Push用のタグ付
$ podman tag docker.io/library/alpine <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:latest

# 
$ podman push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:latest

ここでも<aws_account_id>と<region>は適切な値に書き換えてください。 <repository_name>はイメージを登録したいECRのリポジトリ名です。

認証情報の渡し方

authentication requiredのようなエラーメッセージが表示される場合は適切な認証情報が使われていない可能性が高いです。 amazon-ecr-credential-helperでは以下の方法でAWSへの認証情報を渡すことができます。 ここでは個人的によく使う以下の2つの方法を列挙しておきます。

  1. 環境変数AWS_PROFILEでの認証情報のプロファイルの使用(スイッチロールする場合はこちらが多いかと思います)
  2. 環境変数AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYを使用した認証

他にもAWSへの認証情報の渡し方は以下に書いてあります。

認証情報の渡し方に問題が無いようでしたら、使用しているIAMユーザー、IAMロールの権限を一度確認してください。

ECRからのイメージの取得(Pull)

最後にECRからPodmanでイメージを取得してみます。 これもほぼ、ECR以外から取得する場合と同じです。

これを実行する前に予めDockerHubから取得したAlpineLinxuのイメージは削除してあります。

イメージの取得

$ podman pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:latest

ここでも<aws_account_id>,<region>,<repository_name>は適切な値に書き換えてください。

最後に

amazon-ecr-credential-helperのような認証ヘルパーに対応してくれているのはありがたいですね。 得に大きな障壁もなくECRをPodmanから利用することができました。

付録

以下では認証ヘルパーを使用しなかった場合のログイン方法を整理しておきます。

認証情報を使用しない場合はpodman loginにパスワードを入力する必要があります。 このあたりはDockerと同じですね。

CLI経由でログイン

$ aws ecr get-login-password --region ap-northeast-1 | podman login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com