VPCからCode EngineにVPE経由で通信させてみた


## 概要

　　IBM Cloudにて[Code Engine](https://cloud.ibm.com/docs/codeengine?topic=codeengine-getting-started)サービスとVPC間でPrivate Endpointで通信して見ました。以下のような通信ルートになります。![qiita1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/ce6a1bdf-af05-87ff-c61b-f43a975dbc22.jpeg)



## 背景
Cloudにて動くアプリを外部向けに公開する場合にセキュリティを担保するために、CloudflareやAkamaiなどを前方に立てることが多いと思います。その場合にはmTLS仕組みを利用すると思いますが、Originサーバーはセキュリティ担保用コンポーネントからのアクセスのみ許可することが必要になります。 
Code EngineはPublic、Private、Protected Onlyという3つのEndpointを提供していまして、理想はセキュリティ担保用コンポーネントから直接Code Engineに通信させ、Code Engine側ではセキュリティ担保用コンポーネントからのリクエストのみに絞ることですが、Code Engineには現時点でソースIPを絞る機能が提供されていないです。

## 検証の目的
セキュリティグループやACLの機能が存在するVPCの経由で通信させることで、mTLS前提になるPrivate Network内の通信が可能であることや、制限となる部分があるかを確認する。

## 検証の流れ

#### 1.VPC、Subnet、VSIを作成する。
  詳細の手順はここで紹介しません。以下のリンクに詳しい手順がありますので、参考してください。
https://cloud.ibm.com/docs/vpc?topic=vpc-creating-a-vpc-using-the-ibm-cloud-console
※注意点：
・VSI用セキュリティグループの設定で、VPC内の通信はできるように設定してください。
#### 2.Code Engineのアプリを作成する。
##### 1) IBM CloudのカタログからCode Engineを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/43a13ed7-3cb7-6354-a3b5-ef5ef8978630.png)
##### 2) 「Projects」タブを選択し、画面が遷移したらCreateをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/22ac63e0-1787-3fb3-dc52-ee6775c0652c.png)
##### 3) 「Location」、「Name」、「Resource Group」の選択と記入の上、Createをクリックします。
![スクリーンショット 2022-04-11 11.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/97a8bbe4-c3cb-3aba-f9c9-c40eeeef9913.png)
##### 4) 作成されたProjectにて、「Create Application」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/1ca17483-4620-42cf-391d-319c6f73ac83.png)

##### 5) 以下のようにアプリ名、ビルド方法、Listening Portを記入します。本検証ではSource Codeからビルドする方法を選択しました。設定が完了したらCreateをクリックします。
![スクリーンショット 2022-04-11 11.52.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/e1ac6884-986b-35eb-9150-23c5a83da2e5.png)

Runtime SettingsではMinを１に設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/ca137165-292c-4ee9-815e-c84d4fea2bb5.png)


※注意点：オープンではないGitのリポジトリとコンテナレジストリへアクセスさせる場合には別途設定が必要ですので、以下のリンクからその手順を確認してください。

プライベートコードリポジトリへのアクセス：https://cloud.ibm.com/docs/codeengine?topic=codeengine-code-repositories
プライベートコンテナリポジトリへのアクセス：https://cloud.ibm.com/docs/codeengine?topic=codeengine-add-registry

##### 6) Private Endpointを控える。
![スクリーンショット 2022-04-11 16.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/337bb144-ecb7-660b-e650-5edbd60d7eda.png)


#### 3.VPC上にVPEを作成する。

##### 1) VPC Infrastructure画面にて、「Virtual private endpoint gateways」を選択し、Createをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/a5e67a75-17e3-f64e-eae2-abf12c602a22.png)

##### 2) 名前を記入し、VPCを選択します。Security Groupも別途作成し、設定することをおすすめします。
![スクリーンショット 2022-04-11 16.23.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/d51b1964-5d7d-4558-5309-b9eb94bb62d4.png)

CloudサービスでCode Engineを選択し、呼び出し対象のProjectを選択します。
※プロジェクト内の特定のアプリを選択することができません。
![スクリーンショット 2022-04-11 16.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/15772fb7-ffce-c10f-e242-22d83f243cd8.png)

VPEの作成から、Private DNSへの反映まで数分がかかります。


#### 4.VSIからCurlで呼び出せるかを確認する。

VSIにログインし、Curlコマンドで、アプリのPrivate Endpoint向けにリクエストを送信すると、以下のように結果が表示されます。
![スクリーンショット 2022-04-11 17.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/e8dd380a-3f62-f15d-5cff-d3160cd427d5.png)


## 感想と注意点

・ご存知かもしれませんが、ALBから直接VPEへリクエストを転送させることが可能です。ただCode EngineのVPEの場合特定のURLの指定ができず、Projectのすべてのアプリ向けに投げれるようになっていますので、必ずProxy的なものがVPCに必要です。以下のような感じです。
![qiita1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169189/ef262193-b08d-bdd9-3ab9-21a364f8d1a6.jpeg)


・Code Engineは利用されないときにインスタンスをゼロにすることが大きなメリットですが、なぜかゼロの状態でリクエストを投げると反応しません。バグか私の設定のどこか問題あるかもしれません。
・今回はVPCを利用しましたが、実際ClassicのLoad balancerを利用したほうが楽ではないかと思います。