[TIPS] AWS CLIの「v1」と「v2」を共存させて使う方法 (Dockerコンテナ編)
みなさん、こんにちは! AWS事業本部の青柳@福岡オフィスです。
前回、AWS CLI「v1」と「v2」を両方インストールして共存させる方法をご紹介しました。
今回は、Dockerコンテナを使って「v1」と「v2」の共存を実現する方法をご紹介します。
AWS公式の「AWS CLI v2 Dockerイメージ」が公開されています!
先月、自力でDockerコンテナにAWS CLI v2をインストールしてみたブログ記事を執筆したのですが、、、 [小ネタ] コンテナへAWS CLI v2をインストールする時にチョッとハマったこと | Developers.IO
なんと、その翌日に、AWSから「AWS CLI v2 Dockerイメージ」が正式公開されました。 AWS CLI v2 Docker image | AWS Developer Blog
さすが公式だけあって、良く考えられた作りになっています。
公開されてからしばらく経っていますので、既に使っている方もいらっしゃると思いますが、まだ使ったことがない方のために簡単に使い方を説明します。
AWS CLI v2 Dockerイメージの使い方
イメージは Docker Hub で公開されています。
Dockerイメージを使ってAWS CLIコマンドを使うには、以下のように実行します。
$ docker run --rm -it amazon/aws-cli --version
初回実行時のみイメージのPullが行われます。 その後、バージョン情報が表示されると思います。
$ docker run --rm -it amazon/aws-cli --version Unable to find image 'amazon/aws-cli:latest' locally latest: Pulling from amazon/aws-cli a3f8e652bdc4: Pull complete 8e629876f057: Pull complete 3488f5e662e6: Pull complete 1661c84f1a19: Pull complete 52b292e86d14: Pull complete Digest: sha256:6fb33693dc6b33755f64a94dc894da1a0b88896780f40274fd9423733103d305 Status: Downloaded newer image for amazon/aws-cli:latest aws-cli/2.0.9 Python/3.7.3 Linux/4.14.173-137.229.amzn2.x86_64 botocore/2.0.0dev13
docker run --rm -it amazon/aws-cli
の部分がaws
コマンド相当になります。
後ろにサブコマンド (ec2
、s3
など) やオプション (--verson
、--help
など) を続けることで、PC上でaws
コマンドを実行した場合と同様の結果を得ることができます。
PC側のcredentials
とconfig
を利用する
Dockerコンテナは、コンテナを実行するホストであるPCローカル環境とは独立した環境で動作しますので、本来であれば、資格情報ファイル (credentials) や設定ファイル (config) は別途設定する必要があります。
しかし、PCとコンテナで別々に設定するのは管理が煩雑になります。
そこで「PC上の資格情報ファイルや設定ファイルをコンテナに対して共有する」という方法を取ります。
具体的には、docker run
コマンドのオプションに-v ~/.aws:/root/.aws
を指定します。
これは、PC上の~/.aws
ディレクトリを、コンテナの/root/.aws
ディレクトリにマッピングすることを意味します。
(コンテナ上のプロセスの実行ユーザーはrootであるため、/root
は「rootユーザーのホームディレクトリ」ということになります)
コマンドの実行例は以下のようになります。
$ docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli sts get-caller-identity { "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "123456789012", "Arn": "arn:aws:iam::123456789012:user/aoyagi" }
PC上の資格情報を使って、コンテナ上でaws
コマンドが実行されることが確認できました。
PC側のファイルシステムをコンテナ側で認識させる
AWS CLIの使い方として、ローカルのファイルを指定してコマンドを実行する場合があります。 例えば以下のような使い方です。
- S3バケットへファイルをアップロード、あるいは、S3バケットからファイルをダウンロードする
- IAMポリシーを作成する際、ポリシー定義JSONファイルを指定する
このような使い方をする場合、PC側のファイルシステムをコンテナ側で認識させる必要があります。
ここでも、-v
オプションを使って実現します。
具体的には、docker run
コマンドのオプションに-v $(pwd):/aws
を指定します。
これは、PC上のカレントディレクトリを、コンテナの/aws
ディレクトリにマッピングすることを意味します。
(コンテナのワーキングディレクトリが/aws
に設定されているため、コンテナ側でファイルを認識することができます)
コマンドの実行例は以下のようになります。
$ echo Hello everyone! > foo.txt $ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli s3 cp ./foo.txt s3://aws-cli-docker-demo/ upload: ./foo.txt to s3://aws-cli-docker-demo/foo.txt
PC上でカレントディレクトリに作成したfoo.txt
ファイルを、S3バケットに対してアップロードすることができました。
注意点として、PC側のファイルのパス指定は「相対パス」である必要があります。
(例えば/tmp/foo.txt
といった指定をすることはできません)
Dockerコマンドをエイリアス登録する
さて、Dockerコンテナを使ってAWS CLIのコマンドを実行できることは分かりました。
しかし毎回docker run --rm -it -v ~/.aws:/root/.aws ...
と長いコマンド行を打ち込むのは大変です。
そこで、エイリアスを登録することにします。
~/.bashrc
などに以下の記述を追記します。
alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'
これで、PCローカルにインストールしたAWS CLIを使う感覚で、コンテナ上のAWS CLIを利用することができます。
今回のテーマであるAWS CLI「v1」「v2」の共存ですが、例えば、既にPCローカルにAWS CLI v1がインストールされている場合、AWS CLI v2 Dockerイメージを使ったコマンド行をaws-v2
の名前でエイリアス登録すれば、「v1」「v2」の間で影響を与えることなく使い分けることができるという訳です。
alias aws-v2='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'
AWS CLI v1もDockerコンテナで実行してみよう!
AWS公式で公開されているのは「AWS CLI v2」のDockerイメージのみであり、「v1」のDockerイメージはありません。
無ければ自分で作っちゃおう!という訳で、「v2」のDockerfileを参考にして、「v1」のDockerfileを作ってみました。
参考にしたのは以下のリンクのDockerfileです。 https://github.com/aws/aws-cli/blob/v2/docker/Dockerfile (こちらのDockerfileは Apache License 2.0 に基いて公開されています)
今回作成した「v1」のDockerfileは以下のようになりました。
FROM amazonlinux:2 as installer RUN yum update -y \ && yum install -y unzip \ && curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" \ && unzip awscli-bundle.zip \ && ./awscli-bundle/install -i /usr/local/aws-cli -b /usr/local/bin/aws FROM amazonlinux:2 RUN yum update -y \ && yum install -y groff \ && yum clean all COPY --from=installer /usr/local/aws-cli/ /usr/local/aws-cli/ COPY --from=installer /usr/local/bin/ /usr/local/bin/ WORKDIR /aws ENTRYPOINT ["/usr/local/bin/aws"]
Dockerイメージのビルドを行います。
$ docker image build -t aws-cli-v1 .
作成したDockerイメージから、コンテナが実行できることを確認します。
$ docker run --rm -it aws-cli-v1 --version
エイリアスを登録します。
alias aws-v1='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws aws-cli-v1'
これで、AWS CLI v1をDockerコンテナとして実行することができました。
AWS CLI v2をPCローカルにインストールしている場合であれば、AWS CLI v1をaws-v1
という名前で共存させることができます。
おわりに
前回のブログ記事と併せて、AWS CLIの「v1」と「v2」をいろいろな形でインストールして実行する方法をご紹介しました。
みなさんの使い方に合わせて、是非、組み合わせを考えてみてくださいね。