Amazon ECR へのログインがうまくいかず辛かった話【Docker loginで失敗】

##【事象】
Amazon ECR 利用時にログインがうまくいかず辛かった。
しかもレジストリの状況等は参照できているにも関わらず...。

##【解決】
Amazon ECRへのログイン (Docker login) で凡ミスしていた。 
Docker loginしていると思ったらしていなかった。

##【詳細】
Amazon ECRは、トークンを取得してからログインという流れで使用するのですが、
僕は、トークンを取得コマンドが、ECRへのログインコマンドと思い込んでしまい。
ログインできてるのにpullができない時間を過ごし、闇堕ち寸前まで行きました。

>???「魔法少女が魔女を生むならみんな死ぬしかないじゃない！」
>If a magical girl creates a witch We have no choice but to die

Amazon ECRへのログイン方法
　1.IAMで権限設定
　2.Amazon ECRのログインに有効なトークンを取得(12時間らしいです)
　3.Amazon ECRへログイン
　4.あんなことやこんなことができる。

IAMや鍵の設定は各自ググって下さい。
さて問題の、トークン取得とAmazon ECRログインは、下記コマンドで実施します。

・トークン取得
　このコマンドの戻り値をコピペしてそのまま打てば、ECRへのログインが可能

```
〇実行
# aws ecr get-login --no-include-email

〇戻り値
docker login -u AWS -p password https://aws_account_id.dkr.ecr.us-east-1.amazonaws.com
```

・Amazon ECRへのログイン
　「・トークン取得」で実行した# aws ecr get-login --region のコマンドの戻り値をそのまま打つ。

```
# docker login -u AWS -p password https://aws_account_id.dkr.ecr.us-east-1.amazonaws.com
～～～
Login Succeeded
```

という感じ。


僕は `#aws ecr get-login --no-include-email` を打てばそのまま、Amazon ECRにログインできると思っていました。
本来　トークン取得 → docker login → docker pullとかとかするところを
　　　トークン取得 → docker pull という流れで作業に当たろうとして叱られました。

##【激おこメッセージ】

```
[root@localhost tmp]# docker pull  aws_account_id.dkr.ecr.リージョン.amazonaws.com/repository:tag
Error response from daemon: Get <aws_account_id.dkr.ecr.リージョン.amazonaws.com/repository:tag> no basic auth credentials
Docker login
```

この時、メッセージをちゃんと読めていたら、 `Docker login` を拾うことで、ログインで失敗していたのもわかったはずですが、
「ログインできたもの」と思い込んでしました。や～分からなくなっちゃってたんですね。


ここで暗中模索...切り分け要素を探します。


〇2つだけメッセージの中から切り分けポイントを確認
　1.no basic auth credentials
　　→認証の失敗（それはそう）
　2.Docker login
　　→Dockerの環境変数

`1. no basic auth credentials` は、現在お困りとのことで、こちらとしても分かりかねるということで、
`2.Docker login` をヒントに見てみます。

```
[root@localhost tmp]#
[root@localhost tmp]#
[root@localhost tmp]# cat ~/.docker/config.json
{
        "auths": {
                "container-registry.XXX.XXX": {
                        "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
                },
                "https://index.docker.io/v1/": {
                        "auth": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/18.06.1-ce (linux)"
        }
}
[root@localhost tmp]#
[root@localhost tmp]#
```
なんと、なんの問題もなく認証ファイルが作成されてしまっています..。

##はて...。
もう「1.no basic auth credentials」 から何とか探しきるしかなくなりました。
他にもヒントメッセージが欲しく、一旦、参照系のことをしてみます。

リポジトリ参照しようとしたら何かしらHTTPのステータスが出るはず。
そしてグーグル先生に助けてもらえるはず。多分 403 が返ってくるだけだけど...。

いざ、リポジトリ参照コマンドを、叩きます。

```
[root@localhost .aws]# 
[root@localhost .aws]# aws ecr describe-repositories
aws ecr describe-repositories
{
    "repositories": [
        {
            "registryId": "レジストリID", 
            "repositoryName": "リポジトリ名", 
            "repositoryArn": "arn:aws:ecr:リージョン:レジストリID:repository/リポジトリ名", 
            "createdAt": 1535608696.0, 
            "repositoryUri": "リポジトリURL"
        },
    ]
}
[root@localhost .aws]# 
[root@localhost .aws]# 
```
<br>
　　　　　　　　　**（○Д○）**
<br>

参照ができてい～る。
ん？もしかしてオレゴン州に居たりする！？
一応そういうことも無きにしも非ず。AWSの変数の確認もする。

```
[root@localhost ~]# aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************XXX shared-credentials-file
secret_key     ****************XXX shared-credentials-file
    region           リージョン      config-file    ~/.aws/config
[root@localhost ~]# 
```
リージョンも鍵も間違っていなかった。
ここで、原点にかえりドキュメントを参照...。

Amazon ECR レジストリ
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/Registries.html
>結果の出力は、Amazon ECR レジストリに対して Docker クライアントを認証するために使用する、docker login コマンドとなります。

ちゃ～んと書かれていました。

さて、本文冒頭に戻り、正規手順を踏みましょう。

Amazon ECRへのログイン方法
　1.IAMで権限設定
　2.Amazon ECRのログインに有効なトークンを取得(12時間らしいです)
　3.Amazon ECRへログイン
　4.あんなことやこんなことができる。


無事、あんなことやこんなことができました～。
![74ee4865b49e9fecd9d26d4fb779fb0a_400x400.jpeg](https://qiita-image-store.s3.amazonaws.com/0/168731/68776c4e-9a18-6af4-6324-b490f4a8b557.jpeg)
危うく闇堕ち仕掛けました。

「日本人にかえれ | 出光 佐三 |本 | 通販 | Amazon」
https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%81%AB%E3%81%8B%E3%81%88%E3%82%8C-%E5%87%BA%E5%85%89-%E4%BD%90%E4%B8%89/dp/4478027609
↑これ読みたいので誰か買ってください。

Amazon ECR での AWS CLI の使用
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ECR_AWSCLI.html

Amazon ECR レジストリ
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/Registries.html#registry_auth

Docker 環境の設定
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html

Docker コマンドライン
設定ファイル
http://docs.docker.jp/engine/reference/commandline/cli.html#configuration-files

aws . ecr #get-login
https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login.html#get-login

aws . ecr #describe-repositories
https://docs.aws.amazon.com/cli/latest/reference/ecr/describe-repositories.html