プライベート GCE インスタンスへの接続
はじめに
この記事は、
Connecting to private GCE instances
という動画を参考に、『実際にやってみた』という記事になります。
この記事で実施する事
- GCP内のマーケットプレイスを利用して、
wikiのサンプルページをデプロイする。 - wikiのサンプルページを非公開にして、
公共のインターネットからアクセスできないようにする。 - サーバレスVPCコネクタをデプロイする。
- 非公開のwikiのサンプルページへリクエストを送る。
以下はその必要となる大まかな構成になります。

マーケットプレイスを利用して、サンプルwikiをデプロイする。
GCPコンソールからマーケットプレイス を経由して、
スクショ内の Media Wiki packaged by Bitnami を選択。


『使ってみる』を実行して、公共のサービスとしてデプロイしてください。

途中、Agreements(協定)画面が表示されますが、
そのまま、利用規約へ同意してください。
料金プランについては、デプロイの画面で概算を確認することができます。

『利用規約に同意しました』と表示されるので続けてデプロイを実行。

Wikiのデプロイに必要なAPIを有効化してください。

wikiのデプロイ構成は、下記を参照。
Deployment Name:mediawiki-private または 任意の名前
Zone:asia-northeast2-b
を入力および選択。
その他はデフォルトのまま、デプロイを続けてください。
デプロイが完了すると、警告が表示されますが、
これはBeta版のリソースを使用しているが問題ないかという
確認の警告となる為、ここでは気にしないで大丈夫です。

Site address をクリックして、サンプルwikiのページが開けば、デプロイは完了。

wikiのサンプルページ

wikiのサンプルページへ公共のインターネットから接続できないようにする。
GCPコンソールを開いて、ナビゲーションメニューから Compute Engine をクリック。
wikiがデプロイされているVMインスタンスから編集画面へ移動。
ネットワークインターフェースの編集から、
外部IPv4アドレスを『なし』に設定を変えて、保存を実行してください。

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

サーバレスVPCコネクタをデプロイする。
GCPコンソールのナビゲーションメニューから
VPCネットワーク → サーバレスVPCアクセス へ移動。

下記の条件でサーバレスVPCコネクタをデプロイしてください。
名前:connector
リージョン:asia-northeast2
ネットワーク:default
サブネット:カスタムIP範囲(10.8.0.0/28)
を入力および選択して、その他はデフォルトで『作成』を実行してください。

非公開のwikiのサンプルページへリクエストを送る。
ここでは、非公開となり公共のインターネットから
アクセスができなくなったwikiのサンプルページに対して、
簡単なリクエストを飛ばす為の実装を書きます。
非公開となったCompute Engineのリソースに対して、
リクエストを送るには、サーバレスVPCコネクタ を経由する必要があります。
リクエストを送る方法は、Cloud Functions を選択します。

下記の条件でCloud Functionsをデプロイしてください。
関数名:function-private
リージョン:asia-northeast2
トリガータイプ:HTTP
認証:未認証の呼び出しを許可
を入力および選択。

なお、動作確認が目的ですので、
今回は、IAMでの権限管理を行いません。
詳細セクションをさらに開いて、『接続』タブへ移動して、
先程、作成した サーバレスVPCコネクタ を選択してください。

これで 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)

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

wikiのREST APIを呼び出す事ができれば成功。

終わりに
今回の記事は、動画を視聴しまして、
実際に『手を動かしてみた』という内容でまとめました。
非公開となり、公共のインターネットからの接続が切られた
リソースに対して、アクセスするには、どのようなアーキテクトが
必要であるのか、学んでみたい方は、参考にしていただけると幸いです。
あとで『じっくり読みたい』、『繰り返し読みたい』と
思ってくれましたら、『ストック』へ登録、
この記事が読まれている方にとって、
参考になる記事となりましたら、『いいね』を
付けていただけますと、励みになりますので、
よろしくお願いします。
Discussion