Amazon ECR を CP4D のプライベート・コンテナー・レジストリとして使う

Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。

参考：

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html


## Amazon ECR の開始方法

Amazon ECR の使用を開始するには、Amazon ECR コンソールでリポジトリを作成します。Amazon ECR コンソールの指示に従って、最初のリポジトリの作成を開始します。

### イメージリポジトリを作成するには

リポジトリは、Docker または Open Container Initiative (OCI) イメージを Amazon ECR に保存する場所です。Amazon ECR からイメージをプッシュまたはプルするたびに、イメージをプッシュまたはプルするリポジトリとレジストリの場所を指定します。

#### リポジトリ作成手順例
1. Amazon ECR コンソール (https://console.aws.amazon.com/ecr/) を開きます。
2. `使用方法` をクリックします。
![ecr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/e4e3a39c-4a23-e168-e535-b7579a96e416.png)
3. リポジトリを作成 画面で以下のように設定し、`リポジトリを作成`をクリックします。
一般設定：
   - 可視性設定: `プライベート` を選択します。
   - リポジトリ名: 任意のリポジトリ名を指定します。
   - タグのイミュータビリティ: `無効`

   イメージスキャンの設定：

      - プッシュ時にスキャン: `無効`
     
   暗号化設定：

      - KMS 暗号化:  `無効`

![ecr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/bae43f6e-3a2d-a6e0-7edf-389ef26af8ca.png)
リポジトリが作成されました。
![ecr3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/e2817bd0-5d43-fcda-1c24-e51f85a662a5.png)


## レジストリの認証

参考：

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/registry_auth.html

認証トークンは、IAM プリンシパルからアクセス可能で 12 時間有効な Amazon ECR レジストリにアクセスするために使用されます。

「認可トークンを使用する - CLI を使用して Amazon ECR プライベートレジストリに対して Docker を認証するには」を参考にしAmazon ECRにログインしてみます。



AWS CLI の get-login-password コマンドを使用して認証トークンを取得します。

```
# aws ecr get-login-password --region ap-northeast-1
eyJwYX...(省略)...fQ==
```

この認証トークンを使用して、Amazon ECRにログインしたり、各種コマンドを実行したりできます。

skopeoコマンドでのログインコマンド実行例：
```
# /usr/bin/skopeo login --tls-verify=false -u AWS -p eyJwYX...(省略)...fQ== xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded!
```


## CP4Dのプライベート・コンテナー・レジストリーとして使用する場合に注意すること

CP4D docのこちらのステップを実行する際の注意点です。

https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.7.x?topic=registry-mirroring-images-directly-private-container

Amazon ECRはCP4Dのプライベート・コンテナー・レジストリー要件の2つ目 `イメージ名でのパス分離文字の使用を許可している` を満たしていないようです。

[レジストリー要件](https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.7.x?topic=cluster-setting-up-private-container-registry)
> プライベート・コンテナー・レジストリーは、以下の要件を満たしている必要があります
>
> -  Docker イメージ・マニフェスト・バージョン 2、スキーマ 2 のサポート
> -  イメージ名でのパス分離文字の使用を許可している
> -  Red Hat OpenShift Container Platform クラスターに近接していること
> -  クラスター内のすべてのノードからアクセス可能で、すべてのノードがプライベート・コンテナー・レジストリーにプッシュしたり、プライベート・コンテナー・レジストリーからプルしたりするための許可を持っている必要があります。


そのため、手順どおりにイメージのミラーリングを実行する（`cpd-cli manage mirror-images`）と次のようなエラーになります。

エラー例：
```
error: unable to push manifest to XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/cpopen/ibm-cert-manager-operator:4.1.0-ppc64le: name unknown: The repository with name 'cpopen/ibm-cert-manager-operator' does not exist in the registry with id 'XXXXXXXXXX'
```

このエラーを回避するため、Amazon ECRの場合は、ミラーリングの前に各イメージ名のリポジトリを作成しておく必要があります。手順例は以下のとおりです。

1. (CP4D doc記載の手順どおり) ミラーリング前に実行する「IBM Entitled Registryからミラーリングするイメージへのアクセス権限があることを確認」のための次のコマンドを実行します。

   ```
   cpd-cli manage list-images \
   --components=${COMPONENTS} \
   --release=${VERSION} \
   --inspect_source_registry=true
   ```

2. 上のコマンドの実行により、`${CPD_CLI_MANAGE_WORKSPACE}/olm-utils-workspace/work/offline/${VERSION}/.ibm-pak/data/cases/*/*/*images.csv` ファイルが作成されます。この`*images.csv`ファイルを参照すると必要なイメージ名を取得できます。

   例として、次が`ibm-cert-manager-4.1.0-images.csv`の先頭部分を抜き出したものです。2フィールド目`image_name`がイメージ名です。このイメージ名(この例では `cpopen/ibm-cert-manager-operator`)を持つリポジトリを作成します。

   ```ibm-cert-manager-4.1.0-images.csv
   registry,image_name,tag,digest,mtype,os,arch,variant,insecure,digest_source,image_type,groups
   icr.io,cpopen/ibm-cert-manager-operator,4.1.0,sha256:4e3ec61a34fc7c71d213999b68b1f5c3f866f97e19c12fb001d506d4166a50f1,LIST,"","","",0,CASE,"",""
   icr.io,cpopen/ibm-cert-manager-operator,4.1.0-amd64,sha256:8c4a4e3d5b99e3ab93c52c3a16beb23a1cda20cc6c4bba0ba02ce1eaa75bdcba,IMAGE,linux,amd64,"",0,CASE,"",""
   :
   ```

3. 必要なイメージ名のリポジトリを作成します。
   Amazon ECR コンソールから作成することも可能ですが、数が多いので、次のようなコマンドで作成することをお勧めします。

   ```
    aws ecr create-repository \
      --repository-name $repo_name \
      --image-scanning-configuration scanOnPush=true \
      --region $AWS_REGION
   ```

:::note info
[Amazon Elastic File System のセットアップ](https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.7.x?topic=storage-setting-up-amazon-elastic-file-system)を実施する場合は、`nfs-subdir-external-provisioner` リポジトリも作成しておく必要があります。
:::

リポジトリを作成しておけば、あとは手順どおりにイメージのミラーリングを実行できます。

必要なリポジトリ作成後の画面例：
![ecr-image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/d1e87492-de21-0e73-77c7-aa3ec90810e1.png)

認証トークンをインストール環境変数 `PRIVATE_REGISTRY_PUSH_PASSWORD` と `PRIVATE_REGISTRY_PULL_PASSWORD` にセットします。


```
export PRIVATE_REGISTRY_LOCATION=xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
PRIVATE_REGISTRY_PUSH_USER=AWS
PRIVATE_REGISTRY_PUSH_PASSWORD=eyJwYX...(省略)...fQ==
PRIVATE_REGISTRY_PULL_USER=AWS
PRIVATE_REGISTRY_PULL_PASSWORD=eyJwYX...(省略)...fQ==
```