[GCP]Artifact Registryへのログイン

# 概要
https://cloud.google.com/artifact-registry/docs/docker/authentication?hl=ja

に記述されているGARへの4つの認証方法について、初見で何をやっているのか理解出来なかったため内容を噛み砕いてみた。

**前提**

https://qiita.com/WisteriaWave/private/735f3890ce0e534b00cf

について把握していること

# gCloud CLI認証ヘルパーを使う方法
**前提**
- gcloud CLIをインストールしておく
- GARへのアクセス権限を付与したGoogleアカウントまたはサービスアカウントを用意しておく

**概要**
1. dockerの認証情報設定ファイル(`~/.docker/config.json`)へ「`docker login`コマンド実行時に「対象のDockerレジストリがGARであれば、認証情報ヘルパー`docker-credential-gcloud`から取得した認証情報を使う」ように設定する。
2. gcloudコマンドで、GARへのアクセス権限が付与されたGoogleアカウントまたはサービスアカウントでログインする。
3. `docker login`コマンドでGARへログインする。

```
# 1. ~/.docker/config.json の credHelper へ設定(指定したArtifact Registryのホストでgcloudの認証情報を使う)を追加
gcloud auth configure-docker <Artifact Registryのホスト名>
 
# 2. gcloudコマンドを実行するアカウントの認証
## ユーザーアカウントにする場合(Webブラウザでのパスワード入力が必要)
gcloud auth login <ユーザーアカウント>
## サービスアカウントにする場合(Webブラウザでのパスワード入力不要)
gcloud auth activate-service-account <サービスアカウント> --key-file=<サービスアカウントキーファイルのパス>
 
# 3. Artifact Registyへログイン
docker login https://<Artifact Registryのホスト名>
```

`gcloud auth login`, `gcloud auth activate-service-account`については、[gcloudコマンドまとめ](https://qiita.com/WisteriaWave/items/12f92387ec58bae670e4) を参照。
Artifact Registryのホスト名は、例えば`us-central1-docker.pkg.dev`。
gcloudがインストールされていない環境では無理。
サービスアカウントを使う場合は、サービスアカウントキーをファイルとしてしか指定できないため、シークレットに保存している場合は一旦ファイルに出力するという手間が発生することになりそう。

# スタンドアロン認証情報ヘルパーを使う
[アプリケーションのデフォルト認証情報](https://cloud.google.com/docs/authentication/application-default-credentials?hl=ja)を使って認証する。
`docker login`を実行する環境下でアプリケーションのデフォルト認証情報が取得できればよいため、`gcloud`コマンドのインストールは必須でない。
```
# スタンドアロン認証ヘルパーをインストール
VERSION=2.1.23
OS=linux  # or "darwin" for OSX, "windows" for Windows.
ARCH=amd64  # or "386" for 32-bit OSs
 
curl -fsSL "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v${VERSION}/docker-credential-gcr_${OS}_${ARCH}-${VERSION}.tar.gz" \
| tar xz docker-credential-gcr \
&& chmod +x docker-credential-gcr && sudo mv docker-credential-gcr /usr/bin/
 
# ~/.docker/config.json の credHelper へ設定(指定したArtifact Registryのホストでアプリケーションのデフォルト認証情報を使う)を追加
docker-credential-gcr configure-docker --registries=<Artifact Registryのホスト名>
 
# Artifact Registyへログイン
docker login https://<Artifact Registryのホスト名>
```

# アクセストークンを使う
**前提**
- gcloud CLIをインストールしておく
- GARへのアクセス権限を付与したGoogleアカウントまたはサービスアカウントを用意しておく
- gcloudコマンドを実行するユーザーに`roles/iam.serviceAccountTokenCreator`ロール(正確にはiam.serviceAccounts.getAccessTokenパーミッション)を付与しておく


**概要**
1. GARへのアクセス権限が付与されたサービスアカウントに成り代わって、60分有効なアクセストークンを発行する
2. 以下のユーザー名・パスワードを指定して`docker login`コマンドでGARへログインする。
- ユーザー名: `oauth2accesstoken`
- パスワード: <アクセストークン>

```
gcloud auth print-access-token --impersonate-service-account ACCOUNT | \
docker login -u oauth2accesstoken --password-stdin <Artifact Registryのホスト名>
```

# サービスアカウントキーを使う
**前提**
- GARへのアクセス権限を付与したGoogleアカウントまたはサービスアカウントを用意しておく
- 上記のサービスアカウントのサービスアカウントキーを発行して保存しておく

**概要**
以下のユーザー名・パスワードを指定して`docker login`コマンドでGARへログインする。
- ユーザー名: `json_key`
- パスワード: サービスアカウントキー(中身)


```
cat <サービスアカウントキーファイルのパス> | 
docker login -u json_key --password-stdin https://<ロケーション>-docker.pkg.dev
```

※環境変数にサービスアカウントキーがあるのであれば、
```
echo ${<サービスアカウントキーの環境変数名>} | 
docker login -u json_key --password-stdin https://<ロケーション>-docker.pkg.dev
```
としてもいける。

# 参考

https://cloud.google.com/artifact-registry/docs/docker/authentication?hl=ja

https://qiita.com/WisteriaWave/private/735f3890ce0e534b00cf