IBM Cloud：Private Code Engine へのアクセス・パターン

# はじめに
Code Engine では、アプリを公開する際の公開範囲として "パブリック" や "プライベート" を指定して公開することができます。プライベート公開アプリへのアクセスには CSE 経由、あるいは **VPE (Virtual Private Endpoint)** を定義し、VPC のサブネットから割り振られるアドレスをプロジェクトに割り当てることができます。
本記事では、アクセス元のロケーションに応じてどのようなアクセス・パターンがあるかを記載します。

# 環境
全体構成は以下です。VPC内からのアクセスとClient PCからのアクセスを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/f0879e79-8a2a-3990-a01c-5ac994769eff.png)


# 準備
## Code Engineアプリの設定
今回はデフォルトで提供されている以下のコンテナ・イメージを利用しました。
・`icr.io/codeengine/helloworld`

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/5588b1d5-40b3-4a87-c225-7f40fc4f4d67.png width=70%>

また、アプリの公開範囲を「**プライベート**」に設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/80b78b31-b4b0-4786-6e4a-2486f9a733f4.png)


## VPN for VPCの設定
VPNのルーティング設定にて、CSEを利用できるよう追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/c8a37150-1452-486e-9e10-83564939390d.png)

VPNの作成は以下を参照ください。
Qiita：[IBM Cloud：Client to Site型VPNでVPC環境に接続する (Secrets Manager)](https://qiita.com/takason/items/3d04e4e31daae4def1d7)

## VPEの設定
Code Engineのプロジェクトに対して、VPEを作成しています。
（サブネットからIPアドレスが払い出されているのが分かります）

下記記事にて作成方法を記載しています。参照ください。
・[IBM Cloud：Code EngineのVPE利用方法](https://qiita.com/takason/items/d92119233bff00b26837)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/4876acbb-a196-efb9-256b-ce4526534cd2.png)

# アクセス・パターン
## 【アクセス不可】 パブリックネットワークからのアクセス
念のため、パブリックからアクセスできないことを確認します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/8db3bef7-1e79-e831-e316-05d137645e89.png width=80%>


## 【パターン1】 VPC内のサーバーからのアクセス（VPE利用）
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/18f8d4c9-d04c-982d-d9c5-b94897301479.png width=70%>

VPC内のサーバーからのアクセスの場合、同VPC内に作成されたVPEを利用することができます。

private domainの名前解決をしたところ、VPEのアドレスが返ってきました。
```shell
$ nslookup application-takason-private-domain.private.jp-tok.codeengine.appdomain.cloud
Server:		161.26.0.7
Address:	161.26.0.7#53

Non-authoritative answer:
Name:	application-takason-private-domain.private.jp-tok.codeengine.appdomain.cloud
Address: 10.50.6.7
```
アクセスできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/e6c29625-56dc-1566-bb48-be0bef5852ef.png)

:::note warn
Code EngineではFQDNを用いてアプリへのルーティングを行うため、VPEのアドレスではアクセスすることはできません。
NG例：https://10.50.6.7
:::


## 【パターン2】 VPNを繋いだPCからのアクセス (CSE利用)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/e029fa63-0955-d8ee-30a7-b8cf312cc4e1.png)

private domainの名前解決をしたところ、CSEのアドレスが返ってきました。

```
$ nslookup application-takason-private-domain.private.jp-tok.codeengine.appdomain.cloud
Server:		161.26.0.10
Address:	161.26.0.10#53

Non-authoritative answer:
application-takason-private-domain.private.jp-tok.codeengine.appdomain.cloud	canonical name = cse.s01.jp-tok.codeengine.appdomain.cloud.
Name:	cse.s01.jp-tok.codeengine.appdomain.cloud
Address: 166.9.44.33
Name:	cse.s01.jp-tok.codeengine.appdomain.cloud
Address: 166.9.40.80
Name:	cse.s01.jp-tok.codeengine.appdomain.cloud
Address: 166.9.42.87
```
ブラウザからのアクセスも確認できました。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/5588b1d5-40b3-4a87-c225-7f40fc4f4d67.png width=70%>

つまりこのパターンでは、**「パブリックに名前解決をして」「VPNサーバーを経由して」「IBM Cloud のprivate networkを通り」** Code Engineへアクセスしていると分かります。

## 【パターン3】 VPNを繋いだPCからのアクセス (VPE利用)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/fbe7848a-0c97-16a3-659a-9930978fa0fb.png)

VPNを繋いだ状態でVPEを利用する場合、以下をローカルPCの `/etc/hosts` に追加する必要があります。

```:/etc/hosts (Client PC)
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
10.50.6.7 application-takason.private.jp-tok.codeengine.appdomain.cloud <- !!追加!!
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1             localhost

```

この設定後にprivate domainでアクセスすると、無事ブラウザ表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/e6c29625-56dc-1566-bb48-be0bef5852ef.png)

# まとめ
Code EngineにおけるVPE利用の鍵は、以下のようです。
- VPEアドレスを名前解決できる
- FQDNでアクセスする

Client PCからVPN経由でアクセスする場合、特別な要件がない限りCSE経由でアクセスする構成が簡単ですね。