DockerコンテナからAWSコマンドを簡単に実行できるコマンドをつくってみた

なるべくDockerを利用して手元の端末を汚さない試み。便利かはわかりません。


## 使い方

`docker-aws` コマンドはDockerコンテナで`aws` コマンドを実行しています。
認証情報はホストの`~/.aws` を参照します。

S3にバケット作成してファイルをアップロードしたり削除したりしてみます。

AWS CLIでS3を操作するコマンド一覧 - Qiita
https://qiita.com/uhooi/items/48ef6ef2b34162988295

```console
# credentialsがある前提
> ls ~/.aws
config      credentials models

> docker-aws --version
aws-cli/1.16.263 Python/2.7.16 Linux/4.9.184-linuxkit botocore/1.12.253

> docker-aws s3 mb s3://kai-cli-test
make_bucket: kai-cli-test

> echo "hoge" > hoge.txt

> docker-aws s3 cp hoge.txt s3://kai-cli-test
upload: ./hoge.txt to s3://kai-cli-test/hoge.txt

> docker-aws s3 cp s3://kai-cli-test/hoge.txt hoge2.txt
download: s3://kai-cli-test/hoge.txt to ./hoge2.txt

> ls
hoge.txt   hoge2.txt

> cat hoge2.txt
hoge

# 後片付け
> docker-aws s3 rm s3://kai-cli-test/hoge.txt
delete: s3://kai-cli-test/hoge.txt

> docker-aws s3 rb s3://kai-cli-test
remove_bucket: kai-cli-test
```

## 環境設定

### Dockerイメージを作成

下記を参考に`aws` コマンドを実行するのに最低限のDockerfileを用意してイメージを作成します。

Dockerでaws-cli環境を作ればアカウント切替が簡単に - Qiita
https://qiita.com/icck/items/40545486a342179a5bd3

AWS CLI用のDockerイメージを作った
https://blog.lorentzca.me/aws-cli-on-docker/


```Dockerfile
FROM alpine

ARG pip_installer="https://bootstrap.pypa.io/get-pip.py"

# Install dependent packages
RUN apk --update add \
    python \
    curl \
    groff

# Install awscli
RUN curl ${pip_installer} | python && \
    pip install awscli
```

で、`docker build` します。

```console
> docker build -t aws-cli .
```

#### AWS CLI v2のイメージを作成する

AWS CLI v2がGA(一般利用可能: 2020/02/12)になったので、イメージ作成しようと思って調べてみたら、すでに試されている方がおられたのでそちらが参考になります。感謝！

AWS CLI v2をDockerでお手軽に試してみる - Qiita
https://qiita.com/tomohisaota/items/8b8aa2d1dbf0d01da450


### コマンドを作成

下記を参考にしてDockerコンテナ内で`aws` コマンドを実行できるようにします。

Dockerにホームディレクトリをマウントしちゃおう - Qiita
https://qiita.com/74th/items/a3a7d6826a67e8a61608

Dockerコンテナからホスト側カレントディレクトリにアクセス - Qiita
https://qiita.com/yoichiwo7/items/ce2ade791462b4f50cf3


ポイントは以下のとおりです。

- `-v $HOME/.aws:$HOME/.aws -e "HOME=$HOME"` で認証情報をホストにあるものを参照
- `-v $PWD:$PWD -w $PWD` でコマンド実行時のカレントディレクトリを指定
- `--entrypoint=aws` と`$*` で通常の`aws` コマンド実行と同じ挙動を実現

```sh:docker-aws
#!/bin/bash
docker run -it --rm \
  -v $HOME/.aws:$HOME/.aws -e "HOME=$HOME" \
  -v $PWD:$PWD -w $PWD \
  --entrypoint=aws \
  aws-cli \
  $*
```

作成したファイルのシンボリックリンクを`/usr/local/bin` にはって実行できるようにします。`/usr/local/bin` が`$PATH` に含まれている前提です。

自作のコマンドを作成した - Qiita
https://qiita.com/yoshiken/items/2b8e6c24d6b95e65b625

```console
> chmod +x docker-aws
> ln -s docker-aws /usr/local/bin/
```

これで最初にあげたように`docker-aws` コマンドが実行できるようになります。
コマンド実行のカレントディレクトリがDockerコンテナで参照できるので、たいていのコマンド実行では問題にならないかなと。
`docker-aws` がコマンド打つのに長ったらしいのはエイリアスなんかでどうにでもなります。


## まとめ

使えるかわかりませんが、とりあえずイメージしてたコマンドが出来上がりました。
これを応用すればGCPの`gcloud` コマンドなんかもDockerコンテナで実行できそうですね。


## 参考

AWS CLIでS3を操作するコマンド一覧 - Qiita
https://qiita.com/uhooi/items/48ef6ef2b34162988295

Dockerでaws-cli環境を作ればアカウント切替が簡単に - Qiita
https://qiita.com/icck/items/40545486a342179a5bd3

AWS CLI用のDockerイメージを作った
https://blog.lorentzca.me/aws-cli-on-docker/

Dockerにホームディレクトリをマウントしちゃおう - Qiita
https://qiita.com/74th/items/a3a7d6826a67e8a61608

Dockerコンテナからホスト側カレントディレクトリにアクセス - Qiita
https://qiita.com/yoichiwo7/items/ce2ade791462b4f50cf3

自作のコマンドを作成した - Qiita
https://qiita.com/yoshiken/items/2b8e6c24d6b95e65b625