CI環境におけるaws-cliのインストール結構つらいよね問題

つらい、というのはあくまでCircleCIとかでインストールするときの話。

動機

今Docker RegistryをAmazon ECRに移行していってるんですが、今までCI上でやっていたdocker build/docker tag/docker pushのプロセスをECRでも同様にやるために、ecr get-loginをする必要がある。

ecr get-login の正体はECRにdocker loginするためのコマンドを標準出力で返してくれるというもの。

$ aws ecr get-login --region ap-northeast-1
docker login -u AWS -p あなたのアクセストークン none https://あなたのID.dkr.ecr.ap-northeast-1.amazonaws.com

つまり、この docker login コマンドをCI上で実行すれば、ECRに対してdocker pushができる。

別途 ecr get-login でゲットした docker login コマンドを直接CI上でやればよくね?という議論もあるのだが、トークンは失効するし、そもそもウチのプロジェクトはアホみたいにリポジトリが多いのでトークン更新の度に、各リポジトリにcredentialsを設定して回るのはさすがにアホらしい。基本毎回 ecr get-login するのがいいと考えている。 

aws-cliインストールつらいよ問題

aws-cliのリポジトリを見てもらえればわかるが、aws-cliはpythonを必要とする。

CircleCIではcache_directoriesの機能があるので初回以降はインストールしないみたいな制御も可能なのだが、そもそもCI上で使うのにたまにpip周りでハマったりするのもダルい。 なので、この手のツールは基本的にバイナリとして提供されるべきだと思っている。

というわけで、機能はaws-cliに比べると全然足りないのだが、インストールで消耗しないものを作った。 

Goで書かれている。go getで取得するもよいし、リリースタグ毎にtarボールでアーカイブしたlinux用のバイナリも用意してあるので、それをダウンロードして実行ディレクトリに配置するのがCI的には楽。今は機能が少ないので3MBくらいだが、多少機能が膨らんでもaws-cliをインストールするコストよりはいいだろうと思ってる。

ECRであれば、以下のようにやればaws-cliと同じく docker login コマンドが得られるように作ってある。 

$ lightaws ecr get-login --region ap-northeast-1

今後について

今のところaws-cliの機能をフルフルでクローンしていくつもりはさすがに無い。必要に応じて機能を追加していくスタイルなので、欲しいものがあればどんどんPRしていってほしい🙏

よいCIはよいバイナリから