docker-compose + AWS ECR(azon Elastic Container Registry) AWS CLIの複数アカウントの管理について



# AWS CLIのアカウント管理

- AWS ECR に Docker imageをpushしようとした時に会社用と、個人用のアカウント管理するのがちょっと手こずったのでメモ
    - 結論：<br>
      ローカルにある`~/.aws/credentials`ファイルで管理
- docker-composeを使ってECRにimageをpushするときに、ちょっと手こずったのでメモ
    - 結論：<br>
      複数回に分けてimageをpushする必要がある

※ AWS CLI2がインストールされている前提

参考：
こちらの記事からだいだいわかったので引用させていただきます
[awscliの設定切り替え](https://qiita.com/ryuzee/items/e3ce493f132f1981f57a)


## AWS CLIで複数アカウントを管理する
### モチベ
会社でもAWSアカウントを使っているけど、個人開発でもECRにpushしたい。でもpushしようとしたら、その会社アカウントではpushできませんよ！的なエラーが出る。

### アカウント管理
以下のファイルがこのように２種類以上のアカウントを管理する。

最終的にこのファイルが以下のような形になっていれば良いのでvimで書いても良いとは思う。
この記事では他の方法を紹介している。

```~/.aws/credentials
[default]
aws_access_key_id=***********AI
aws_secret_access_key=**************************hi
region = ap-northeast-1

[profile test-user]
aws_access_key_id = ************HI
aws_secret_access_key = *************************3MA
region=us-west-2
```

## ~/.aws/credentials に新しくアカウントを登録する方法
公式サイトに載っていたのでそちらを記載
参考：https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html

![スクリーンショット 2021-02-24 11.47.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/537455d7-3679-e391-a526-ff63666fb3b1.png)

```
$ aws configure
```
とすると(AWS CLIが既にインストールされていれば)Access KeyやSecret Access Keyを標準入力で求められるので、IAMを作成した時に表示されるkeyを入力する。

Default region name, Default output formatについては任意の値を。

上の作業が終わった後に

```
$ cat ~/.aws/credentials
```
とかで確認してみると新しい情報が追加されているはず。

### keyの保存
新しくIAMを作成したときは、IAMの作成完了画面で aws_access_key_id, aws_secret_access_keyの２つが発行されて`new_account_credentials.csv`というファイルが一緒に保存できる画面が出ると思うのでそこから２つのkeyを保存しておく。

### ecrにpushするときの権限
ecrにpushするときはそれぞれ個人ごとにIAMを作成してecrにpushできる権限をつけてpushできるようにする
pushできるようにするための権限はここら辺

```
AmazonEC2ContainerRegistryFullAccess
AmazonEC2ContainerRegistryPowerUser
AmazonEC2ContainerRegistryReadOnly
```

参考：
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ecr_managed_policies.html

## アカウントの切り替え

```
export AWS_DEFAULT_PROFILE=test-user
```
としてから

```
aws s3 list
```
や
```
aws ecr get-login
```
などの任意のログインするコマンドなどを実行する

`test-user`は[default]などで囲まれている`~/.aws/credentials`のファイルの値を入力する

#### こっちでもできるらしい

```
aws s3 list --profile test-user
```

## docker-compose + ECR
まぁ、ここは簡単に。
知らなかったので記載するが、Docker imageをECRにpushするときはaws cliを正しいアカウントで切り替えた後に以下のコマンドを実行するとpushできる。

が、docker-composeの場合ってどうするんや？？
と思ったのでちょっと調べてみたが、あまり情報なかった。。。（3分くらいしか調べてないけど）

**結論**
docker-composeの場合は一気に複数のimageを作るので複数回push作業を行う必要がある。
もしかしたら違う方法があるのかもしれないので知っている方いたら教えてください。

なので、例えば
こんな感じの環境をDockerに乗せるときは api-server, db-server(Model), mysqlの３つのimageをdocker-composeで作る必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/cdfa20de-d0d6-7f3c-6581-c07e7c75b9d6.png)

その場合は、それぞれのサービスごとにECRでレポジトリを作成して、それぞれの環境にpushするようにする。

ちょっとめんどくさいのでもっといい方法、楽なスクリプトとか書けばいいのかな？とは思うがわからん。


```
# タグをつける
$ docker tag hello-world:latest aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

# ECRにpushする
$ docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
```
出力：

```
The push refers to a repository [aws_account_id.dkr.ecr.us-east-1.amazonaws.com/hello-world] (len: 1)
e9ae3c220b23: Pushed
a6785352b25c: Pushed
0998bf8fb9e9: Pushed
0a85502c06c9: Pushed
latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b size: 6774
```
参考：https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/getting-started-cli.html

以上。