理系学生日記

おまえはいつまで学生気分なのか

Alpine ベースのコンテナイメージで AWS CLI v2 を使う

CI/CD で以下のコマンドを実行したかっただけでした。

$ aws ecr get-login-password | docker login --username AWS --password-stdin [AWS Account ID].dkr.ecr.ap-northeast-1.amazonaws.com/my-repository

このコマンドラインには 2 つの実行バイナリが必要です。 AWS CLI v2docker です。

つまり、AWS CLI v2 と docker の双方の入ったコンテナイメージが欲しい。

問題

Docker 公式が提供している docker イメージは alpine ベースです。

そして alpine が利用しているのは musl libc です。

一方で、AWS CLI v2 は glibc を利用します。

AWS CLI バージョン 2 では glibc、groff、および less を使用します。これらは、Linux のほとんどの主要なディストリビューションにデフォルトで含まれています。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html

musl libc と glibc の齟齬により、インストール手順 に従っても alpine 上に AWS CLI v2 は動作しません。公式においても alpine はサポートされていません。

CentOS、Fedora、Ubuntu、Amazon Linux 1、および Amazon Linux 2 の最近のディストリビューションの 64 ビット版が AWS CLI バージョン 2 でサポートされています。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html#cliv2-linux-prereq

この問題を解決するには大きくわけて 2 つのアプローチがありそうです。

  1. aws cli v2 のコンテナイメージに docker をインストールする
  2. docker のコンテナイメージに aws cli v2 をインストールする

aws cli v2 のコンテナイメージに docker をインストールすれば良いのでは?

aws cli v2 入りのイメージは Docker Hub 上で amazon/aws-cli として公開されています。こちらは Amazon Linux 2 ベース。

もちろん Amazon Linux 2 に対する docker のインストールは可能です。AWS 公式でも謳っている。

しかし、docker daemon をコンテナ上で起動させるのはそれなりに大変です。 何が現在のプラクティスなのかさっぱり追えていない。

docker のコンテナイメージに aws cli v2 をインストールする

なので、公式のdocker用イメージに AWS CLI v2 をインストールします。 AWS CLI v2 が glibc を要求するのであれば、alpine に glibc をインストールすれば良い。

alpine 向けの glibc ビルドはこちらで提供されています。

僕も以下のコメントを参考にインストールを行いました。

GLIBC_VER=2.31-r0

# install glibc
apk --no-cache add binutils curl
curl -sL https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub
curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk
curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk
apk add --no-cache glibc-${GLIBC_VER}.apk glibc-bin-${GLIBC_VER}.apk

# install awscliv2
curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip
unzip -q awscliv2.zip
aws/install

これで、CI/CD 上でコマンドが通るようになります。

$ aws ecr get-login-password | docker login --username AWS --password-stdin $ECR_REPOSITORY
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded