IBM Cloud Code Engineでサービス・バインディングを用いてIBM Cloudのサービスを使用する

# 概要
IBM Cloud Code Engineは、IBM Cloud上でコンテナアプリケーションを稼働させるためのサーバレス環境です。コンテナアプリケーションでは、[The Twelve-Factor App](https://12factor.net/ja/)でも記載されている通り、設定情報をコンテナイメージ内に直接持たず、環境変数に格納して利用することが重要となります。それにより、設定変更に伴ってのコンテナイメージの再ビルドが不要となるためです。

Code Engine上のコンテナアプリケーションが、IBM Cloud上の他のサービス（オブジェクトストレージやデータベースなど）を利用する際も、そのサービスの接続用のエンドポイントURLや認証情報は環境変数で扱うことが望ましいと考えられます。Code Engineでは、「サービス・バインディング」という機能により、Code Engine上のアプリケーションやジョブとIBM Cloud上のサービスを紐付けすることで、サービス利用に必要な情報を、アプリケーション・ジョブに環境変数として埋め込むことができます。また、サービスにアクセスするための資格情報も紐付け時に自動生成されます。

この記事では、Code Engineでサービス・バインディングを行うための手順をご紹介します。

# 前提環境
IBM Cloud CLI　：　ibmcloud version 2.13.0+05fd406-2022-11-30T21:03:31+00:00

# 前提の状態
Code Engineの`プロジェクト`は作成済みで、プロジェクト名は「project-01」とします。

# サービスのバインド手順
まず、IBM Cloud CLIでログインします。ログイン先は東京リージョン、リソース・グループはDefaultです。

```bash
ibmcloud login -a https://cloud.ibm.com -r jp-tok -g Default
```

サンプルとしてバインドする先のサービスとして、無料で利用可能なCloudantを`sample-cloudant`という名前で作成します。プランはLiteプランを指定します。

```bash
ibmcloud resource service-instance-create sample-cloudant cloudantnosqldb lite jp-tok -p '{"legacyCredentials": false}'
```

Code Engineでバインドしたいアプリケーションの属するプロジェクトを選択します。

```bash
ibmcloud ce project select --name project-01 
```

選択したプロジェクトにサンプルのアプリケーションをデプロイします。サンプルアプリケーションとして、Code Engineで用意されているHello Worldアプリケーションを利用します(イメージ：`icr.io/codeengine/hello`）。

```bash
ibmcloud ce application create --name sample-application --image icr.io/codeengine/hello
```

本題のバインドの処理は、`ibmcloud ce application bind`コマンドで実行します。デプロイしたサンプルアプリケーションと、上記で作成したCloudantをバインドしています。なお、ジョブに対してバインドする場合は`ibmcloud ce job bind`コマンドを使用します。

```bash
ibmcloud ce application bind --name sample-application --service-instance sample-cloudant  
```
バインドされた結果を確認します。サンプルアプリケーションの詳細情報を取得します。すると、以下のように詳細情報の中にサービス・バインディングに関する項目があります。「環境変数の接頭部」という項目の値（以下では`CLOUDANTNOSQLDB`）を確認します。

```bash
ibmcloud ce application get --name sample-application

（省略）
サービス・バインディング:    
  名前                                         ID                                    サービス・インスタンス  サービス・タイプ  役割 / 資格情報  環境変数の接頭部  経過時間  
  sample-application-ce-service-binding-qqweh  xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx  sample-cloudant         cloudantnosqldb   Writer           CLOUDANTNOSQLDB   65s  
```

以上により、アプリケーション内部で、`CLOUDANTNOSQLDB_<資格情報のキー>`という名前の環境変数が利用可能となります。

IBM Cloud Webコンソールで、作成したCloudantサービスのページの「サービス資格情報」を確認すると、`<Code Engineのアプリケーション名>-ce-service-binding-<ランダム文字列>`という名前の資格情報が作成されています。Cloudantの資格情報として、`apikey`、`host`、`url`、`username`などの項目がありますが、これらがCode Engine上のアプリケーションで以下のような環境変数として利用できるようになります。

- `apikey` → `CLOUDANTNOSQLDB_APIKEY`
- `host` → `CLOUDANTNOSQLDB_HOST`
- `url` → `CLOUDANTNOSQLDB_URL`
- `username` → `CLOUDANTNOSQLDB_USERNAME`


# 接頭部を明示的に指定したい場合
上記ではデフォルトの接頭部（Cloudantの場合は`CLOUDANTNOSQLDB`）を使用しましたが、接頭部を明示的に指定する場合は、`ibmcloud ce application bind`コマンド、または、`ibmcloud ce job bind`コマンドで、`--prefix`オプションを使用します。接頭部は、英大文字、数字、_(アンダーバー)のみが使用可能です。

# 他のリソース・グループのサービスをバインドする場合
上記ではDefaultリソースグループ内（同一リソースグループ内）でのバインドでしたが、Code Engineのプロジェクトとは別のリソース・グループのサービスをバインドする場合は、`ibmcloud ce project update`コマンドでプロジェクトを更新する必要があります。

例えば、DefaultリソースグループのCode Engineプロジェクトが、「resource-group-01」リソースグループのサービスをバインドするためには以下のコマンドを実行します。

```bash
ibmcloud ce project update --binding-resource-group resource-group-01
```