[TIPS] AWS CLIの「v1」と「v2」を共存させて使う方法 (Dockerコンテナ編)

先月末に公開された「AWS CLI v2 Dockerイメージ」の利用方法と、「v1」のDockerイメージ化を紹介します。
2020.04.24

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

みなさん、こんにちは! 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コマンド相当になります。 後ろにサブコマンド (ec2s3など) やオプション (--verson--helpなど) を続けることで、PC上でawsコマンドを実行した場合と同様の結果を得ることができます。

PC側のcredentialsconfigを利用する

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は以下のようになりました。

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」をいろいろな形でインストールして実行する方法をご紹介しました。

みなさんの使い方に合わせて、是非、組み合わせを考えてみてくださいね。