AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ)

2019-03-09Amazon, AWS, Bash, Docker

AWSコマンドを実行するための環境づくりをしたいが、自前のMac環境だけでなく、Windows環境のことも考慮して構築したいですよね。

Dcokerを作って実現するための手順をまとめてみました。

Dockerを使えれば、MacだろうがWindowsだろうがLinuxだろうが同じ手順で aws-cli 実行の環境が構築可能です。

事前にDockerのインストールが必要

こめんなさい。事前にDockerのインストールはされていることが前提です。
こちらはネット上に情報が転がっているので独力で頑張ってみてください。

"Docker Hub"から適当なコンテナを探す

Docker Hub から適当な既存のコンテナを探しました。

以下のコンテナがダンロード数も多く、比較的頻繁に更新されてそうでした。

Dockerを使った aws-cli を早速試してみる

実行のためには、以下の3つの情報が必要。

export AWS_ACCESS_KEY_ID="<id>"
export AWS_SECRET_ACCESS_KEY="<key>"
export AWS_DEFAULT_REGION="<region>"

環境変数として定義して export すれば利用可能ということで早速試してみます。

IAM管理コンソールページから、キー情報を取得

  1. IAM Management Console のページを開く。
  2. 左サイドのメニューから「ユーザー」を選択すれば、現在登録されているIAMユーザの一覧が表示されます。
  3. 既存のものを使いたい 場合はそれをクリック。 新しいものを使いたい 場合は「ユーザーを追加」ボタンをクリック。

今回は既存のものを利用したいので、クリックしました。

「アクセスキー」 は最大2つまで登録できます。今回は既存のものがすでに登録してあったが 忘れてしまったため 新しく作成。

ボタンを押すと即座に新しいアクセスキーが作成されます。
このタイミングでしっかりメモしておかないと2度と シークレットアクセスキー は確認できないので、メモしておきます。

環境変数を設定

Bash( Windowsの方はコマンドプロンプトかPowerShell )を開いて、以下の環境変数を設定します。

$ export AWS_ACCESS_KEY_ID="<先程のページのアクセスキーID>"
$ export AWS_SECRET_ACCESS_KEY="<先程のページのシークレットアクセスキー>"
$ export AWS_DEFAULT_REGION="ap-northeast-1"

AWS_DEFAULT_REGION は一番良く使うデフォルトのリージョンを指定する必要があります。( 僕の場合は東京リージョン
AWSの以下のページから自分がよく使うものを1つ選んで設定すればよいです。

Bash起動時に自動的に環境変数が設定されるように、 ~/.bashrc ファイルに追記しておくとよいでしょう。

ようやく aws-cli の実行

早速 Docker を使った aws-cli の実行。

S3 上のバケットをチェックしてみます。


$ docker run --rm -t $(tty &>/dev/null && echo "-i") mesosphere/aws-cli s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".

エラーが出る。
Docker上で動くコンテナには、 export した 環境変数 など見えるはずがないので当然でした。
export したとしてもコンテナ起動時に環境変数を引き渡さないといけないようです。
export いらないですよね。 )

$ docker run --rm -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" mesosphere/aws-cli s3 ls

2018-10-01 09:15:46 XXX
2012-08-11 22:27:15 YYY
2018-11-06 04:47:24 ZZZ
2019-02-16 22:58:25 s3-transfer-for-sftp

ようやく正常に動作しました。ただ、コマンドラインが長すぎて何がなんやら。
コマンドを折り返して見やすくすると、以下のようになります。

--rm で実行終了のたびにコンテナを消してゴミ掃除。
-e で環境変数を引き渡す。

$ docker run \
  --rm \
  -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" \
  -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
  -e "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" \
  mesosphere/aws-cli s3 ls

コマンドが長すぎるので一工夫

流石に長過ぎるので、以下のようにaliasかシェルスクリプトを作成します。

$ alias aws='docker run --rm -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" mesosphere/aws-cli'

$ aws s3 ls
2018-10-01 09:15:46 XXX
2012-08-11 22:27:15 YYY
2018-11-06 04:47:24 ZZZ
2019-02-16 22:58:25 s3-transfer-for-sftp

先に設定した環境変数3つとともに、awsコマンドの実行環境切り替えファイルを作っておくと便利。 ( アスタリスク部分は秘密 )

export AWS_ACCESS_KEY_ID="********************"
export AWS_SECRET_ACCESS_KEY="****************************************"
export AWS_DEFAULT_REGION="ap-northeast-1"

alias aws='docker run --rm -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" mesosphere/aws-cli'

switch-aws-config-genzouw みたいなファイルを作ってやって、以下のコマンドを叩くと切り替えられます。

$ . switch-aws-config-genzouw

alias設定に関する補足

※今回使ったDockerコンテナの提供元には、以下のaliasを使うことが推奨されていたが、これを利用すると jq などでAWSコマンド実行結果をパースすると出力結果が崩れてしまいます。
したがって、 -t とその後ろのインタラクティブ操作に関するオプションは除外しました。

# コンテナ提供ページには以下のコマンドの利用が推奨されていたが、 "-t" オプションが悪さをしている模様
alias aws='docker run --rm -t $(tty &>/dev/null && echo "-i") -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" -e "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" mesosphere/aws-cli'

ひとこと

aws-cli 実行に必要な Python などがインストールされていない環境でも実行可能。バージョンもコンテナのバージョンを指定すれば変更可能。

2019-03-09Amazon, AWS, Bash, Docker