【IBM Cloud】Acountが異なるContainer Registryを使ってCode Engineにアプリケーションをデプロイする 

ドキュメントが分散していて苦労したので、記録しておきます。  

# やりたいこと

* GitHub Enterprise（以下、GHE）で管理しているソースコードから、Code Engineに直接アプリケーションをデプロイしたい。
* デプロイ中に作られるコンテナイメージは、異なるAccount上のContainer Registryに格納したい。

## なんでローカルでビルドしないの？

Apple SiliconとIntelの差を気にしたくなかったからです。。

# 引っ掛かりポイント

* ドキュメントと画面で言葉が異なっていて、説明文を探しにくいところでしょうか・・・
* Container Registryの無料プランでは、1アカウントあたりが保持しておけるイメージの合計サイズが、小さめに設定されています。（500Mだったかな？）<br>当手順でイメージをpushするときに上限を超えた場合、`403 forbidden`が返却されます。<br>**ここで初手で権限の確認を始めると沼にハマります。**<br>まずは、Container Registryに保管されているイメージを削除して、リポジトリの空きを増やしてからリトライしてみてください。<br>（うまく行っていたデプロイが急に403を吐くようになったら、大概この理由です。）

  ```
  ERROR: failed to push jp.icr.io/namespace/registry: unexpected status from POST request to https://jp.icr.io/v2/namespace/registry/blobs/uploads/: 403 Forbidden
  ------
   > exporting to image:
  ------
  error: failed to solve: failed to push jp.icr.io/namespace/registry: unexpected status from POST request to https://jp.icr.io/v2/namespace/registry/blobs/uploads/: 403 Forbidden
  ```



# 前提

* GHE上に、docker build ＆ runすれば稼働できる状態のWebアプリケーションのソースコードがある。（通常のGitHubでは、検証していません。）
* IBM Cloudに、Code Engineを立ててある。
* **異なるアカウント**のIBM Cloudに、Container Registryを立ててある。



# やったこと

## ローカルPC〜GHE

1. ローカルPCでssh-keygenを実行し、秘密鍵・公開鍵を作成します。
  このあたりは詳しく解説されているページがたくさんあるので、説明は割愛します。（GHEとCode Engineの接続に利用するだけなので、専用の鍵を作るのをお勧めします。）

2. **公開鍵**をGHEに登録します。
  このあたりは詳しく解説されている(ry

## Container Registry

1. Namespaceを作ります。
  私はロケーション `東京` に `jp-myspace` という名前で作りました。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/fffc75eb-137a-bba3-a157-501e65b64e8c.png)

2. Container RegistryにアクセスするためのAPIキーを作ります。
  **Container RegistryがあるAccountで、**
  [コンソールからのサービス ID を使用した Container Registry へのアクセス権限の付与](https://cloud.ibm.com/docs/codeengine?topic=codeengine-add-registry#authorize-cr-service-id)のステップ1〜3を実施します。
  ＜メニューの場所＞
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/78fe555b-5c03-d96b-5806-ac3a2d5186fc.png)


### 注意と補足
* ステップ1-⑤-a: ドキュメントには `コンテナー・レジストリー` と書かれていますが、 `Container Registry`と入力してください。
* ステップ1-⑤-b: 私は「すべてのリソース」にしました。
* ステップ1-⑤-c: 私は「リーダー」「ライター」「管理者」を選択しました。<br>（「管理者」は要らないと思いますが、手戻りがイヤだったので。）
* ステップ2: ステップ1で作業したサービスIDに、追加で実施してください。
* ステップ2-②-c: サービスIDには「ServiceId-」の部分も含みます。<br>（例：ServiceId-xxx99x99-99xx-9xx9-x999-99x999x9x99x）
  ＜ステップ1〜2を実行すると、こんな感じになります。＞
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/88485d2d-7057-528e-b69e-51193c98f7e7.png)


## Code Engine

アプリケーションを作成します。

1. 「実行するコードの選択」は、`ソースコード`を選択します。
  「ソース・コードURL」は、SSHでリポジトリをクローンするときのURLを入力します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/41bfe42f-3d6d-f90a-681a-1b35ff3c89b3.png)

2. 「ビルド詳細の指定ボタン」を押して、デプロイの詳細を入力します。
  ・コード・リポジトリー・アクセス: ドロップダウンに新規作成の選択肢がありますので、追加します。（このとき、GHE用に作った**秘密鍵**を入力します。）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/50e516fb-c1b3-3dba-d46c-e73eb30b153c.png)
  ・レジストリサーバー: `<Container RegistryでNamespaceを作ったロケーション>.icr.io`です。東京の場合は `jp.icr.io` になります。
  ・レジストリー・アクセス・シークレット: [Code Engine へのレジストリー・アクセス権限の追加](https://cloud.ibm.com/docs/codeengine?topic=codeengine-add-registry#add-registry-access-ce)の⑤以降を参考に作成してください。<br>作成ボタンは、またもや選択肢の中に隠れています。。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/dbab642a-de22-22eb-91fe-f2d5ec4d9789.png)
  ・名前空間: Container Registryに作成したNamespaceを入力します。（私の場合は `jp-myspace`）
  ・リポジトリー名とタグ: 特定の名前を付ける必要が無ければ、デフォルトでOKです。

3. 「作成」ボタンを押して作成開始！

4. 画面が切り替わるので、右側メニューの「ロギングの起動」をクリックして、デプロイのログを確認します。<br>あとはログと睨めっこしながらトライ＆エラーです。