AWS CLIバージョン1をDockerで実行する

2019年12月12日

AWS Connand Line Interface

2020年6月10日追記
AWS CLI バージョン 2 からは AWS 公式の Docker イメージが利用できるのでこちらを使いましょう。

amazon/aws-cli - Docker Hub
公式 AWS CLI バージョン 2 Docker イメージの使用 - AWS Command Line Interface

これまで Mac から AWS CLI バージョン 1 を利用するとき、pyenv で Python を入れて、pip で awscli を入れていました。簡単に Python を使えるのは Mac のいいところでもあるのですが、パッケージが増えてくるとバージョンの依存関係の問題が起きることがありました。

コンテナ時代だし、ローカルの Python で実行するのはやめて Docker で実行することにしました。

AWS CLI のコンテナイメージを作る

Docker イメージは AWS 公式のものが無さそうだったので、適当に自分で作ります。バージョンは適宜変更してください。jq は結果をフィルタするときに使うことがあるので入れています。

Dockerfile

FROM python:3.8-alpine3.10

ENV PYTHONIOENCODING=UTF-8

RUN apk add --no-cache jq \
    && pip install awscli

CMD ["aws"]

ビルドします。タグ名は適宜変更してください。

docker build . -t karakaram/awscli

ビルド時の出力をみると、awscli-1.16.301 がインストールされたので、タグをつけておきます。

docker tag karakaram/awscli:latest karakaram/awscli:1.16.301

使い方

こんな感じで使います。

docker run --rm karakaram/awscli aws --version

このままだと AWS のクレデンシャルが無いとエラーがでるので、クレデンシャルがすでにローカル環境にある場合は、コンテナにクレデンシャルをマウントします。

docker run --rm -v $HOME/.aws:/root/.aws karakaram/awscli aws s3 ls

ローカルにクレデンシャルがない場合は、以下のように -it オプションでコンテナを起動し、aws configure コマンドでクレデンシャルを作成します。

docker run --rm -v $HOME/.aws:/root/.aws -it karakaram/awscli aws configure

カレントディレクトリにあるファイルを利用して何かしたい場合は、カレントディレクトリをマウントします。

docker run \
    --rm \
    -v $HOME/.aws:/root/.aws \
    -v `pwd`:/root/work \
    -w /root/work \
    karakaram/awscli \
    aws s3 cp ./foo.txt s3://mybucket

コマンドが長くて辛いので、上記のコマンドを .bashrc などにエイリアスを書くと

alias aws='docker run --rm -v $HOME/.aws:/root/.aws -v `pwd`:/root/work -w /root/work karakaram/awscli aws'

ターミナルで、こんな感じで aws コマンドを実行できます。

aws s3 cp ./foo.txt s3://mybucket

コンテナに入って aws コマンドを実行したいときのために、こんなエイリアスも書いています。

alias aws-docker='docker run --rm -v $HOME/.aws:/root/.aws -v `pwd`:/root/work -w /root/work -it karakaram/awscli ash'

-技術ブログ
-