aws-cliとdockerを使う際、認証情報のマウントを飛ばしてしまった件

##はじめに
流石にそろそろAWSコンソールではなく、aws-cliを使おうと思った時、dockerでやりたいと思い調べたら2020年にaws cliのdockerイメージが公開されていました。
公式にも日本語化されたインストール手順の対象にdockerがありましたので、試してみたところ、
少しつまずいたので記事にしました。

- [AWS CLIインストール ユーザガイド（Docker）](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)


##つまずいた手順
まず、つまずいた手順をそのまま記載します。
こちらに従って、進めていきます。

- [AWS CLIインストール ユーザガイド（Docker）](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html)

```bash:
$ docker run --rm -it amazon/aws-cli --version
// imageがない場合は、pullされます
aws-cli/2.2.2 Python/3.8.8 Linux/4.19.121-linuxkit docker/x86_64.amzn.2 prompt/off
```

###aliasの設定
docker imageを使う場合、`docker run --rm -it amazon/aws-cli`が`aws`とイコールになります。
長いのでエイリアスを設定することでdockerを意識せずに使えるようになります。

```bash:
$ alias aws='docker run --rm -it amazon/aws-cli'

// エイリアス設定前
$ aws --version
-bash: aws: command not found

// エイリアス設定後
$ aws --version
aws-cli/2.2.2 Python/3.8.8 Linux/4.19.121-linuxkit docker/x86_64.amzn.2 prompt/off
```
なお、時が経った時、macにawscliをインストールしたと勘違いする可能性があるため、実際にはawsから少し変えています。以後記事内ではこちらを使っていきます。

```bash:実際の設定
$ alias dockeraws='docker run --rm -it amazon/aws-cli'
```

###認証情報の設定（つまずいた部分✳︎）

ここからアクセスキーとシークレットアクセスキーを取得（ない場合、忘れた場合は新規作成）し、AWSアカウントとの紐付けを行います。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

```bash:
//aws configreの実行
$ dockeraws configure
AWS Access Key ID [None]: AKXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: 
```
*この記事の通りに設定している方はいないと思いますが、この手順は意味がないので不要です。後述を参照してください。

##何が起こったか
Amazon Kinesis DataStreamsのストリームを作成しようとしました。
あまり本筋とは関係ないですが、こちらを参考にして作ろうとしていました。
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/fundamental-stream.html

ストリーム名は、`my-sample`、初期シャード数は`1`とします。

```bash
$ dockeraws kinesis create-stream --stream-name my-sample --shard-count 1
You must specify a region. You can also configure your region by running "aws configure".
```
なるほど・・・？
`aws configure`でリージョン指定していたが？と思いつつ一旦エラー解消のため素直にregionを指定します。

```bash
$ dockeraws kinesis create-stream --stream-name my-sample --shard-count 1 --region ap-northeast-1

Unable to locate credentials. You can configure credentials by running "aws configure".
```
仕方ないので、調べてみたら[前手順](###認証情報の設定)で設定したはずの情報が確かにない。

```bash
$ dockeraws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None
```

##原因
よく考えれば当たり前なのですが、コンテナを常時起動しているわけではなくイメージを都度立ち上げているので、[前手順](###認証情報の設定)の作業はその瞬間立ち上がっていたコンテナに設定されてすぐ破棄されています。

以下２行はそれぞれ別のコンテナに対して行われているので、当然前者の`configure`で入力した内容が後者のコマンド実行時に反映されるわけがありません。

```bash
$ dockeraws configure //コンテナ１
$ dockeraws configure list // コンテナ２
```

AWSもaws-cliとdockerをあえて使おうとしている人間が、まさかこんな当たり前すぎることでつまずくとは思わなかったでしょう。
このことは特に公式の手順にはなかったのですが、以下の記述があったことを思い出す。

![スクリーンショット 2021-05-05 15.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380300/d779806c-cd9e-0129-f9e3-3001aa3561bd.png)

私はaws-cliを利用するのが初めてだったのでホスト側にawsの認証情報は存在していませんでした。
ですのでマウントする対象のファイルはなく、今から設定すれば良いという考えて飛ばしていました。

##解消手順
自身のmacにaws-cliをインストールしたこともする予定もありませんが、コンテナのライフサイクル上、configureにより作成される認証ファイルはコンテナ実行都度読み込ませる必要があります。
読み込みされる対象のファイルを手でホスト側（自身のmac）に作っていきます。
（もし既にPCにaws-cliがインストールされている場合、`aws configure`を自分のPCコンソールで実行すればファイル作成されるのでこの手順は不要です）

####1.マウントする場所を作る
私は、普段開発で使っているworkディレクトリ配下に`dockeraws/.aws`を作りました。

```bash:
$ mkdir {任意の場所}/dockeraws
$ mkdir {任意の場所}/dockeraws/.aws
$ cd {任意の場所}/dockeraws/.aws
```
####2.~/.aws/credentialsにマウントするファイル作成
ファイルの構成はこちらを参考にしました。
[設定ファイルと認証情報ファイルの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)

```bash
$ vi credentials
```

```:credentials
[default]
aws_access_key_id=XXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXX
```
####3.~/.aws/configにマウントするファイル作成
ファイルの構成はこちらを参考にしました。
[設定ファイルと認証情報ファイルの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)

```bash
$ vi config
```

```:config
[default]
region=ap-northeast-1
output=json
```

####4.aliasに設定
この段階で、読み込まれるか動作確認します。

```bash
$ docker run --rm -it -v {任意の場所}/dockeraws/.aws:/root/.aws amazon/aws-cli configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************2DLO shared-credentials-file
secret_key     ****************Re2n shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config
```
問題なさそうです。
しかし、aliasはマウント設定をふくまないコマンドのままのため未だこの結果となります。

```bash
$ dockeraws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None

$ alias
alias dockeraws='docker run --rm -it amazon/aws-cli'
```
alias設定を変更します。

```bash
$ alias aws='docker run --rm -it -v {任意の場所}/dockeraws/.aws:/root/.aws amazon/aws-cli'
```
[こちら](###認証情報の設定)でも触れていますが、私はawsにしてしまうと勘違いする恐れがあるのでエイリアス名を`dockeraws`にしています。

```bash:実際の設定
$ alias dockeraws='docker run --rm -it -v /Users/yukokanai/work/aws/dockeraws/.aws:/root/.aws amazon/aws-cli'
```

> // 上記手順で上書きされますが、万が一aliasを消したい場合は、unalias {エイリアス名}
> $ unalias dockeraws

5.動作確認
先ほどは、Noneだった認証情報が表示されるようになりました。

```bash
$ dockeraws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************2DLO shared-credentials-file
secret_key     ****************Re2n shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config
```
最後に、当初やりたかったコマンドを再実行します。

```bash
$ dockeraws kinesis create-stream --stream-name my-sample --shard-count 1
$ dockeraws kinesis list-streams
{
    "StreamNames": [
        "my-sample"
    ]
}
```
当初はこのコマンド実行するごとにエラーが出たのでてっきりsuccessなど出るかと思ったのでレスポンス無で虚をつかれる。
きちんとストリームが作成されていることを確認しました。

##おわりに
つまずくところが初歩すぎてつらい。
あまりに初歩すぎてかさっと検索した限りでは見つけられませんでしたが、自己解決できてよかったです。
お疲れ様でした。