IBM Cloud：Code EngineのVPE利用方法

# 概要
この度、Code EngineのVirtual Private Endpoint(VPE)機能が追加されました。
IBM Cloud Virtual Private Endpoint (VPE) for VPC を使用すると、サポートされている IBM Cloud サービスにプライベートネットワークからアクセスできます。具体的には、VPC のネットワークから、選択した IP アドレス (VPC のサブネットから割り振られるアドレス) を使用して接続することができます。

本記事では、Code EngineのVPE利用の設定方法を記載します。
- VPE Gatewayの作成
- Code Engineアプリのprivate公開

### 参考
本記事は以下のdocsに従っています。
- [Code Engine での仮想プライベート・エンドポイントの使用
](https://cloud.ibm.com/docs/codeengine?topic=codeengine-vpe)
VPE機能のより詳細な情報については、以下を参照ください。
- [仮想プライベート・エンドポイント・ゲートウェイについて](https://cloud.ibm.com/docs/vpc?topic=vpc-about-vpe&locale=ja)
- [IBM Cloud: VPCのVirtual Private Endpoint機能について試してみた](https://qiita.com/testnin2/items/4663169274975bdb7a9e)
# 設定VPE手順
本章では、ibmcloud CLIを用いてアプリケーションをVPE経由で公開する手順を記載します。

### 前提条件
- 使用可能な[VPC](https://cloud.ibm.com/docs/vpc?topic=vpc-getting-started)がある
- 1つ以上の[仮想サーバーを作成](https://cloud.ibm.com/docs/vpc?topic=vpc-creating-virtual-servers)している
- [浮動IP](https://cloud.ibm.com/docs/vpc?topic=vpc-creating-a-vpc-using-the-ibm-cloud-console#reserving-a-floating-ip-address)を予約し、[ssh鍵](https://cloud.ibm.com/docs/vpc?topic=vpc-ssh-keys)を用いて仮想サーバーに接続できる
- IBM CloudポータルにてUI・CLI・APIを使用できる
- アプリをデプロイできるCode Engineのプロジェクトを作成している

## 作業手順
### VPEのオーダー
初めにVPEをオーダーします。
左上のハンバーガーメニューより、`VPC INfrastructure`->`Virtual private endpoint gateways`を選択します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/afb57b4f-2f37-29d7-857d-46bab62b8d21.png width=50%>

`作成`をクリックし、各項目を入力します。
ここで、リージョンには指定したいVPCがある場所を選択します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/9eae0f44-748d-2ccf-f740-8b5d4f0cdc70.png width=70%>

`Cloud service`に`Code Engine`を選択し、`Cloud service regions`にCode Engineプロジェクトを作成したリージョンを選択します。
`Reserve IP`にて、VPEに割り振るIPをVPCのSubnetから決定します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/2dc91e10-ecb9-f6b8-1177-0438a687e1d8.png width=70%>

### アプリのprivate公開
##### 1. ibmcloud CLIにてログインし、アプリを公開するCode Engineのプロジェクトを選択します。
```
$ ibmcloud login -apikey [APIキー] -g [リソースグループ] -r [Code Engineプロジェクトのリージョン]
$ ibmcloud ce project select -n [プロジェクト名]
```
##### 2. コンテナ・レジストリーより、指定のアプリをprivate公開でにデプロイします。
今回はコンテナ・イメージにCode Engineのチュートリアルにあるhellowaroldイメージを指定しました。
アプリで使用するportはデフォルトで`8080`ですが、アプリがポート 8080 以外のポートで listen する場合は、`--port xxx`で指定します。
```
$ ibmcloud ce application create -n myapp-hello --image icr.io/codeengine/helloworld　--visibility=private
Creating application 'myapp-hello'...
The Route is still working to reflect the latest desired specification.
Configuration 'myapp-hello' is waiting for a Revision to become ready.
Ingress has not yet been reconciled.
Waiting for load balancer to be ready.
Run 'ibmcloud ce application get -n myapp-hello' to check the application status.
OK

https://myapp-hello.xxxxxxxxxxx.private.jp-tok.codeengine.appdomain.cloud
```
作成されたURLにprivateが含まれていればIBM Cloud外からのアクセスはできません。

# private公開になっているか確認
#### 同VPC内のWindowsサーバーのブラウザで確認してみます。
以下のようにアクセスできました。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/ef3e3c37-3a23-b2ea-7dea-8c3f30b7367f.png width=70%>

#### 自PC(IBM Cloud外)からアクセスしてみます。
アクセスに失敗したので、private公開になっていることが確認できました。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/adbef538-2391-4a90-d79f-aca023203081.png width=80%>

#### curlで確認します。
VPEを作成したVPCにある仮想サーバーからcurlしてみます。
以下のように応答が返ってきました。
```:VPC内の仮想サーバー
root@takamura-scc-target-ubuntu2004:~# curl https://myapp-hello.xxxxxxxxx.private.jp-tok.codeengine.appdomain.cloud
Hello World from:
. ___  __  ____  ____
./ __)/  \(    \(  __)
( (__(  O )) D ( ) _)
.\___)\__/(____/(____)
.____  __ _   ___  __  __ _  ____
(  __)(  ( \ / __)(  )(  ( \(  __)
.) _) /    /( (_ \ )( /    / ) _)
(____)\_)__) \___/(__)\_)__)(____)

```

自PCからも試してみます。
以下のようにcurlに失敗しました。
```:自PC（IBM Cloud外）
$ curl https://myapp-hello.xxxxxxxxx.private.jp-tok.codeengine.appdomain.cloud
curl: (6) Could not resolve host: myapp-hello-xxxxxxxxx.private.jp-tok.codeengine.appdomain.cloud
```

# 注意
VPE suport前に作成されたプロジェクトではVPEを利用できません。VPEが必要な場合は、Caseにて既存プロジェクトをVPE対応に変更することが可能です。

参考：[IBM Cloud: Caseの起票方法と注意点](https://qiita.com/takason/items/9636c693230e344bee8d)

### GUIで確認する方法
新規application作成画面にて、以下のような注意書きが表示される場合はサポートされていません。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/3ce3637f-5310-f149-3860-5b8afe89bac9.png width=80%>

### CLIで確認する方法
以下のコマンドを実行し、`Application Private Visibility Supported`が`False`になっている場合、VPEはサポートされていませんのでご注意ください。
```
$ ibmcloud ce project get -n myproject
Getting project 'myproject'...
OK

Name:                                      myproject  
ID:                         abcdabcd-abcd-abcd-abcd-f1de4aab5d5d
Status:                                    active  
Enabled:                                   true  
Application Private Visibility Supported:  false  　### 確認する行 ###
Selected:                                  true  
Region:                                    us-south 
Resource Group:             default
Service Binding Service ID: ServiceId-1234abcd-abcd-abcd-1111-1a2b3c4d5e6f
Age:                        52d 
Created:                                   Tue, 28 Sep 2021 05:12:16 -0500  
Updated:                                   Tue, 28 Sep 2021 05:12:19 -0500  

Quotas:
...
    
```