AWS CLIをコンテナから使えるようにする

## はじめに

以前、AWS EC2のインスタンスにAWS CLIをインストールし、使用できるようにしていました。 
しかしこれでは常にインスタンスが一つ必要になってしまいますし、AWSの利用料金も発生してしまいます。
次に試したのはローカルPC(Mac)でAWS CLIを使えるようにしました。
これはこれで便利でしたが、別のPC(Windows)でも同じことがやりたくなりましたし、さらに別のPC(Ubuntu)でもやりたくなりました。
毎回毎回環境を構築するのはとても手間です。
だったら、コンテナで稼働するようにさせれば、dockerfileを配布するだけで異なる環境で構築できるようになるのでは？と思いました。

## CloudShellというもう一つの手段について

AWSにはCloudShellというサービスがあります。
このサービスはIAMユーザーアクセスキーを使用せず、aws cliを利用することができます。

[AWS アクセスキーを管理するためのベストプラクティス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html#use-roles)

今回の試みはDockerコンテナの学習も兼ねて行いましたが、CloudShellのほうが、IAMユーザーアクセスキーを発行せずにAWSにアクセスにできるという大きなメリットがありますので、本記事を参考にされる前に上記サイトをご一読ください。

## 目的

MacでもWindowsでもUbuntuでもコンテナからAWS CLIを使えるようにする。

## 前提

docker、docker-compose、docker for windowsは利用可能な状態であること。

## 参考

[AWS ドキュメント - AWS CLI のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)

## 構成

```
aws
	└docker
	│	└aws-cli
	│		└Dockerfile
	├docker-compose.yml
	└work
```

## Dockerfile

コンテナ内でやりたいことを詰め込んでいます。
・aws cli
・kubectl
・eksctl
・ansible
・ansible community.kubernetes

```dockerfile
FROM python:3.6

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

# install command.
RUN apt-get update && apt-get install -y less vim jq unzip sshpass

# create local bin directory
RUN mkdir -p /root/.local/bin
ENV PATH $PATH:/root/.local/bin

# install aws-cli
#RUN pip install --user --upgrade awscli==${awscli_version}

# install aws-cli ver2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install

# install sam
RUN pip install --user --upgrade aws-sam-cli

# install eksctl
RUN curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
RUN mv /tmp/eksctl /usr/local/bin
RUN eksctl version

# install kubectl 1.17.9
RUN curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.9/2020-08-04/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin
RUN mkdir -p $HOME/bin && cp /usr/local/bin/kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
RUN echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile

RUN aws --version
RUN kubectl version --short --client

RUN echo "alias ll='ls -al'" >> /root/.bashrc

RUN pip install ansible

RUN ansible-galaxy collection install community.kubernetes

WORKDIR /root
```


## docker-compose.yml

workフォルダを用意しておき、コンテナ内とのファイルのやり取りに使います。

```yaml
version: '3'
services:
  aws-cli:
    container_name: 'aws-cli'
    image: aws-cli/aws-cli
    build:
      context: ./
      dockerfile: ./docker/aws-cli/Dockerfile
    tty: true
    volumes:
      - ./work:/work
```

## コンテナの起動

```
$ docker-compose run --rm aws-cli bash
root@xxxxxxxx:~# 
```

## 動作確認

### ・aws configure

awx cliの初期設定を行います。
IAMのアクセスキー、シークレットアクセスキーは事前に用意しておいてください。
また、リージョンは目的のリージョンを指定してください。

```
$ aws configure
AWS Access Key ID [None]: xxxxxxxx
AWS Secret Access Key [None]: xxxxxxxx
Default region name [None]: us-west-1
Default output format [None]: json
```

### ・現在のアカウント情報の確認

現在作業中のアカウント情報を確認してみます。
エラーにならずjson形式で表示されれば初期設定は完了しています。

```
# aws sts get-caller-identity
{
    "UserId": "xxxxxxxx",
    "Account": "xxxxxxxx",
    "Arn": "arn:aws:iam::xxxxxxxx:user/xxxxxxxx"
}
```

## おわりに

これでdocker、docker-composeが使える環境ならどの環境でもお手軽にaws cliが利用できる環境が整いました。
githubにでも登録しておけば、git cloneするだけで環境構築が完了します。
次はeksctlやkubectlを使ってAWS EKSに触れてみます。