IBMCloud ROKS (Redhat Openshift) におけるICOS接続 -Part1-

# 概要
IBMCloud上のRedhat Openshift環境にてPV（PersistentVolume:外部ストレージ）としてICOSオブジェクトストレージを利用する方法をまとめました。

以下の３つのステップで記載します。

 * IBM Cloud Object Storage のセットアップ <font color="Magenta"><- この記事の範囲 (part1)</font>
     - [(参考) IBMCloud Docs - IBM Cloud Object Storage のセットアップ](https://cloud.ibm.com/docs/openshift?topic=openshift-storage-cos-understand)
 * IBM Cloud Object Storage プラグインのインストール [[Link]](https://qiita.com/naoki_fisher/items/13ee88d754e8bfab90d4)
 * アプリへのオブジェクト・ストレージの追加 [[Link]](https://qiita.com/naoki_fisher/items/f5d4d20baa1d19cafafb)


# IBMCloud Object Storage Setup

## 1. オブジェクト・ストレージ・サービス・インスタンスの作成
### 1-1. COS（ストレージ）のオーダ
リンク先のオーダ画面で必要な情報を指定し、新規にCOSリソースを作成する。
[COSオーダ画面](https://cloud.ibm.com/objectstorage/create)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/de1c95c3-9501-11ff-0b1b-bcc37063920b.png)

### 1-2. 作成したCOSバケットのリソースを確認する
* IBMCloud Portal -> 左上メニュー -> リソース・リスト を選択
* ストレージタブを展開し、作成したリソースを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/91a5eb9f-6afb-39e5-b6d8-e21ca1d51f95.png)

### 1-3. 作成したCOSバケットへ資格情報を作成・登録する
* 対象COSバケット -> サービス資格情報タブ -> 新規資格情報を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/7ea7dc46-afff-ea71-23b9-880d77ac682f.png)

* ポップアップしたダイアログで必要情報を入力し、追加
    * ロールでは、Reader権限以上が必要(今回はWriter権限とした)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/526e4dff-7863-5199-d8fe-b9847ddf9f5b.png)

* 作成したCOSバケットのCredential情報を確認
    * apikey値を取得 (後の手順で利用。OAuth2の認証のToken情報)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/852ff4c9-62f1-2dab-caa2-428127dd0573.png)

## 2. Openshift(Kubernetes)へ手順1のサービス資格に紐づくシークレット作成・登録およびYAMLファイル適用
本手順はOpenshiftClusterとICOS間の接続にあたり必要となる認証資格情報をOpenshiftClusterのSecret情報として登録する手順です。

### 2-1. COSバケットのGUID(グローバル一意識別子)情報をIBMCloudCLIコマンドで取得する

* まずCOSバケット名を確認する -> "Cloud Object Storage-Test"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/450fd06d-cc5b-29ac-19a5-cf44da219335.png)

* IBMCloud CLIでコマンド実行

    * もしご自身の端末にIBMCloudCLIをインストールしていない場合、OpenshiftCluster利用ではCLI操作で必要となるので以下の手順を参考に事前インストールをお願いいたします。
[IBMCloudCLIのインストール](https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja)

    * GUID取得コマンド 
`ibmcloud resource service-instance <service_name> | grep GUID`
    * コマンド実行例
        * 実行結果の`15cbab4b-9c98-4424-xxxx-18962cdb565d`部分がGUID。
        * Secret情報に必要なため1-3手順のapikeyと同様に、GUIDもコピーしておく。
```
実行コマンド:
% ibmcloud resource service-instance "Cloud Object Storage-Test" | grep GUID
GUID:                  15cbab4b-9c98-4424-xxxx-18962cdb565d
```


### 2-2. OpenshiftClusterにSecretを登録する

* oc createコマンド
    * コマンド構文
    * `oc create secret generic <secret-name> --type=ibm/ibmc-s3fs --from-literal=api-key=<api_key> --from-literal=service-instance-id=<service_instance_guid>`
    * 実行コマンド例
        * secret名(<secret-name>)は"cos-write-access-test"としている
        * 上記手順でメモした`apikey` \<api_key>および`GUID` \<service_instance_guid>の部分に入力
```
実行コマンド: 
oc create secret generic cos-write-access-test --type=ibm/ibmc-s3fs --from-literal=api-key=v04BsrXXXXXXzDJdzGpSHaKKvcXXXXXXr826ZrgdJiZu --from-literal=service-instance-id=15cbab4b-9c98-4424-xxxx-18962cdb565d
```
* (参考) 実行ログおよびSecretが作成されていることを確認
    * secretのリストに"cos-write-access-test"が含まれていることを確認。
```

% oc create secret generic cos-write-access-test --type=ibm/ibmc-s3fs --from-literal=api-key=v04Bsr202VK1zDJdzGpSHaKKvcyzSlnwr826ZrgdJiZu --from-literal=service-instance-id=15cbab4b-9c98-4424-9d94-18962cdb565d
secret/cos-write-access-test created
% oc get secret
NAME                       TYPE                                  DATA   AGE
cos-write-access-test      ibm/ibmc-s3fs                         2      38s
~一部省略~
%
```
### 2-3. YAMLファイル作成
* apikey(OAUTH2認証), keyprotect(暗号化鍵)を用いてICOSとセキュアに接続するためのYAMLファイルを作成する。

* YAMLファイルではaccess-key(apikey),kp-root-key-crn()のパラメータを指定する必要がある。
    * まずKeyProtectで暗号鍵を作成し、CRN(一意の識別子)情報をbase64形式に変換する必要がある。


### 2-3-1. KeyProtectサービスでの事前作業

* KeyProtectリソースを以下ページからオーダする
https://cloud.ibm.com/catalog/services/key-protect

* IBMCloudポータル -> リソース・リスト -> セキュリティ -> 上記で作成したKeyProtectリソースを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/c35eb105-93d1-ac33-2c41-5871a7a896f2.png)
* 新規に暗号鍵(openshift-icos-key)を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/5d887085-0a7c-0f17-5734-f2063367bb6f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/ae9caf3e-38db-3fda-e0cc-78b8a79e9abb.png)


* 作成したKeyProtectの暗号鍵のCRN識別子をコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/9bf0df24-b25f-47b0-8297-7d813a2c9e57.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/54b2f2a6-f056-cf08-74bc-7688c96a1e2f.png)


### 2-3-2. 作成したKeyProtect鍵のCRN情報をbase64にエンコードする
（YAMLがbase64での入力が必要なため）

```python
# base64エンコードコマンド (MACターミナルで実行した例）
% echo -n 'crn:v1:bluemix:public:kms:jp-tok:a/db415xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' | base64
Y3JuOnYxOmJsdWVtaXg6cHVibGljOmttczpqcC10b2s6YS9kYjQxNWM1NTljMGU0NjhjYjk0MTRlZGI4MmFlZTZmZTo5MGQ1Njk5Yy04ODJlLTRiMDAtYTZiZC03YmEwMGM5ZjY5MTQ6a2V5OjcwZTM4ZmEwLThjY2EtNGViNy05Y2FkLWxxxxxxxxxxxxxxxx==
%

```

### 2-3-3. YAMLファイル 編集
Clusterアクセスしている端末上でYAMLファイルを作成する。
apikey,KeyProtectのCRN(base64形式)を利用して、YAMLファイルを以下のように作成

```yaml:secret-test-icos.yml
apiVersion: v1
data:
    access-key: v04Bsr202VK1zDJdzGpSHaKKvcyzSlnxxxxxxxxxxxxxxxx
    kp-root-key-crn: Y3JuOnYxOmJsdWVtaXg6cHVibGljOmttczpqcC10b2s6YS9kYjQxNWM1NTljMGU0NjhjYjk0MTRlZGI4MmFlZTZmZTo5MGQ1Njk5Yy04ODJlLTRiMDAtYTZiZC03YmEwMGM5ZjY5MTQ6a2V5OjcwZTM4ZmEwLThjY2EtNGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
kind: Secret
metadata:
    name: cos-write-access-test
type: ibm/ibmc-s3fs
```

### 2-4. YAMLファイル OpenshiftCluster適用

### 2-4-1. YAMLファイルをOpenshiftClusterへ適用

```python

% kubectl apply -f secret_test_icos.yml
secret/cos-write-access-test configured
%
```


### 2-4-2. ICOSサービスとKeyProtectサービス間の接続許可設定

:::note warn
KeyProtectサービスで暗号鍵をICOSバケットを暗号化する場合、本作業(2-4-2手順)が必要になります。ICOSサービスとKeyProtectサービス間の接続をIAMサービスで明示的に許可します。今回はICOSバケットをKeyProtectサービスで暗号化する手順を実施します。
もし2-4-1手順を行わない場合、ClusterにPVCのYAML適用する際(Part3記事)に認証エラーが出てしまい接続に失敗します。
:::

* IAM管理画面へ移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/1c9a5815-544b-b5c4-edcd-67a5a3f487d6.png)
* IAM -> アクセスの管理 -> 許可 を選択し、作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/25419da9-9713-25e4-7187-dbf0848935b6.png)
* ソース・ターゲットとなるサービスおよびリソースグループを選択して許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/14d1b99c-8bf1-2bb9-a633-9ea7b0211b58.png)
* 許可設定が正しいことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/c3ae24d8-64d3-8c86-10f6-439bf8a19500.png)


### 3. まとめ
* ここまででClusterにSecret適用が完了しました。
* Part2手順 (ICOSプラグインをOpenshiftクラスタにインストール)に続きます。