プライベート GCE インスタンスへの接続

## はじめに

この記事は、
　[Connecting to private GCE instances](https://www.youtube.com/watch?v=A7stLZjP7uI)
という動画を参考に、『実際にやってみた』という記事になります。


## この記事で実施する事
- GCP内のマーケットプレイスを利用して、
wikiのサンプルページをデプロイする。
- wikiのサンプルページを非公開にして、
公共のインターネットからアクセスできないようにする。
- サーバレスVPCコネクタをデプロイする。
- 非公開のwikiのサンプルページへリクエストを送る。

以下はその必要となる大まかな構成になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/7817eb5d-2a1c-cf8a-65eb-0c3e33ea4214.png)


## マーケットプレイスを利用して、サンプルwikiをデプロイする。

GCPコンソールから`マーケットプレイス` を経由して、
スクショ内の `Media Wiki packaged by Bitnami` を選択。

![marketprace-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/427a07fb-ac26-4be9-0a44-b68d086dac20.png)

![marketprace-wiki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/7fb6e2f4-b448-696c-622e-0997f7b6e538.png)

『使ってみる』を実行して、公共のサービスとしてデプロイしてください。
![marketprace-used.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/cd8e7b6f-abdb-3dfd-1632-292544af93a7.png)

途中、Agreements（協定）画面が表示されますが、
そのまま、利用規約へ同意してください。

料金プランについては、デプロイの画面で概算を確認することができます。
![marketprace-agreements.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/e26ef354-600c-90ff-36a6-f28bc28b3155.png)

『利用規約に同意しました』と表示されるので続けてデプロイを実行。
![marketprace-agreements-decision.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/4fb3343f-2367-a053-d0b9-d71063526cf8.png)

Wikiのデプロイに必要なAPIを有効化してください。
![marketprace-api-check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/dfd0de0d-bac6-def9-5506-34aae9e234dc.png)

wikiのデプロイ構成は、下記を参照。

Deployment Name：`mediawiki-private`　または `任意の名前`
Zone：`asia-northeast2-b`
を入力および選択。

その他はデフォルトのまま、デプロイを続けてください。![marketprace-deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/609691f7-f8e1-3da5-fe98-e62c84bbd7a9.png)

デプロイが完了すると、警告が表示されますが、
これはBeta版のリソースを使用しているが問題ないかという
確認の警告となる為、ここでは気にしないで大丈夫です。
![marketprace-beta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/79e7450c-fba9-7c60-db28-6c65719432fb.png)

`Site address` をクリックして、サンプルwikiのページが開けば、デプロイは完了。
![marketprace-site-address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/fe21ac8e-2698-cef8-6839-969d097d0e3a.png)

wikiのサンプルページ
![marketprace-deploy-wiki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/79acd4ca-cd3a-822a-e4c1-73cf73985125.png)


## wikiのサンプルページへ公共のインターネットから接続できないようにする。

GCPコンソールを開いて、ナビゲーションメニューから `Compute Engine` をクリック。
wikiがデプロイされているVMインスタンスから編集画面へ移動。

ネットワークインターフェースの編集から、
外部IPv4アドレスを『`なし`』に設定を変えて、保存を実行してください。

![computeengine_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/800bf0c0-beff-7caf-28df-298f0da0a5d7.png)


外部IPアドレスの表示が消え、内部IPアドレスからもwikiのページへ
飛ぶことができなければ、Wikiのインスタンスは存在しますが、
外部の公共のインターネットからは切り離されている状態になっています。

![computeengine_private_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/a1ea0cb2-e799-edc6-63a9-9e7dbdfca7fa.png)


## サーバレスVPCコネクタをデプロイする。

GCPコンソールのナビゲーションメニューから
 `VPCネットワーク` → `サーバレスVPCアクセス` へ移動。

![computeengine_vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/9e733d58-484a-dcc1-e123-fb61da04c80e.png)

下記の条件で`サーバレスVPCコネクタ`をデプロイしてください。

名前：`connector`
リージョン：`asia-northeast2`
ネットワーク：`default`
サブネット：`カスタムIP範囲`（`10.8.0.0/28`）
を入力および選択して、その他はデフォルトで『作成』を実行してください。

![computeengine_vpc_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/a3cdfafb-b2bf-eaa7-0ca6-a9c8513c4e7d.png)


## 非公開のwikiのサンプルページへリクエストを送る。

ここでは、非公開となり公共のインターネットから
アクセスができなくなったwikiのサンプルページに対して、
簡単なリクエストを飛ばす為の実装を書きます。

非公開となった`Compute　Engine`のリソースに対して、
リクエストを送るには、`サーバレスVPCコネクタ` を経由する必要があります。

リクエストを送る方法は、`Cloud Functions` を選択します。
![cloudfunction_used.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/851b87ae-ace0-8992-4044-1f4c13432309.png)

下記の条件で`Cloud Functions`をデプロイしてください。

関数名：`function-private`
リージョン：`asia-northeast2`
トリガータイプ：`HTTP`
認証：`未認証の呼び出しを許可`
を入力および選択。

![cloudfunction_create_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/522c0b6a-0e9c-2141-e6e1-ebc0b417f4b9.png)

なお、動作確認が目的ですので、
今回は、IAMでの権限管理を行いません。

詳細セクションをさらに開いて、『`接続`』タブへ移動して、
先程、作成した　`サーバレスVPCコネクタ`　を選択してください。

![cloudfunction_create_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/9103b2c3-4372-358c-f8f6-82b72ef47214.png)

これで `Cloud Functions` からのすべてのトラフィックが、
先程、設定した`サーバレスVPCコネクタ`を経由して、
`Compute Engine` の プライベートIPアドレスにアクセスします。

そのプライベートIPアドレスは、`Cloud Functions`の構成中の
コードデプロイのステップで記述します。

下記は、そのコードデプロイのサンプルになります。
ランタイム：`Python3.8`
エントリポイント：`get_mediawiki`

```
import urllib

def get_mediawiki(request):
  try:
      url = "http://[プライベートアドレス]/rest.php/v1/page/Main_Page/history"
      req = urllib.request.Request(url)
      response = urllib.request.urlopen(req)
      return response.read()
  except Exception as e:
      print(e)
      return str(e)
```

![cloudfunction_code_deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/4504f5f3-6d0e-7d35-a4c7-51fb523198b7.png)


最後に、`CloudFunctions`から`サーバレスVPCコネクタ`を経由して、
MediaWikiサーバーの`REST API`を呼び出せるか確認します。

`Cloud Function` トリガーを実行。
![cloudfunction_trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/67efe3af-50bf-962c-e475-4591fad4ecdb.png)

wikiの`REST API`を呼び出す事ができれば成功。
![cloudfunction_rest_api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952807/4c87ec8f-e989-6abd-85d2-36ccc750f7da.png)

## 終わりに
今回の記事は、動画を視聴しまして、
実際に『手を動かしてみた』という内容でまとめました。

非公開となり、公共のインターネットからの接続が切られた
リソースに対して、アクセスするには、どのようなアーキテクトが
必要であるのか、学んでみたい方は、参考にしていただけると幸いです。

あとで『じっくり読みたい』、『繰り返し読みたい』と
思ってくれましたら、『`ストック`』へ登録、
この記事が読まれている方にとって、
参考になる記事となりましたら、『`いいね`』を
付けていただけますと、励みになりますので、
よろしくお願いします。