2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Serverless NEG(Network Endpoint Group)を設定しGAEと連携してみた

Last updated at Posted at 2020-08-05

初めまして、最近お客様にフォースがないアピールをするためにトルーパーに変身したg-yamaです。
今後トルーパーと名乗ります。
(画像欠けているけど)

GAE上で個人ブログを構築し運用しているのですが、GCPのベータ版機能:Serverless NEG(Network Endpoint Group)を使ってみたくなり、ブログに適用する前に検証してみたので、記事にしました。

運営しているブログ

ヤマログというブログを運営しています。
https://yamavlog.com/

GCPで触ったことなどの備忘録を書いていますが、たまにガジェットネタなんかも書いています。
※GAEでWordpressを構築する方法や今回のServerless NEGに関する記事もこちらに書いています。

Serverless NEG(Network Endpoint Group)って何??

端的に言えば、GCPのロードバランサのエンドポイントにサーバーレスサービス(GAE,Cloud Run,Cloud Functions)を指定できる機能です。

これにより、GCPのサーバーレスサービスが、

  1. マルチリージョン構成で構築・運用が可能
  2. 使えなかったGCPの機能が利用可能

となります。

2.について個人的に特に注目しており、

  • WAF(Cloud Armor)
  • CDN(Cloud CDN)

が、利用できるようになる点が非常に嬉しいです。

これらはロードバランサとの組合せでの利用が前提の機能なので、GCPのサーバーレスサービスでは利用が出来ず泣き所だったのですが、このデメリットがようやく解消される事になります。

また、GCPのロードバランサとネットワークは他のパブリッククラウドの追随を許さない性能を誇るので、1.についても相当な物が期待出来ると思います。
ゲーム向けのインフラにマッチしそうですね。

詳細については、以下リンク記事をご覧頂けたらと思います。

注意事項

当記事執筆時点ではServerless NEGはbeta版となっており、GCPのSLAは保証されません、ご利用される際はご注意下さい。

事前準備

Cloud SDKの最新化と認証、config設定

手順は割愛させて頂きますが、Serverless NEGを設定する前に

  • Cloud SDKの最新化
  • Cloud SDKの認証
  • config設定(作業プロジェクトや作業アカウントの指定)

は事前に行っておく必要があります。

作業アカウントの権限確認

作業アカウントに、下記IAMロールが付与されているかご確認下さい。

  • Network Admin
  • Compute Instance Admin
  • Security Admin

プロジェクト管理者/編集者のIAMロールが付与されているアカウントであれば大丈夫だと思います。
GCP公式Doc:Serverless NEG-Configure permissions

GAEアプリケーションのデプロイ

今回はバックエンドアプリケーションをGAEにするので、GAE SEにアプリケーションを事前にデプロイしておきます。
アプリケーションは何でも構いません。
※Hello Word!と返すだけのプログラムでもOKです。

私はテスト用のWordpressをデプロイし試す事にしました。

静的IPアドレスの生成

**Serverless NEGはロードバランサと連携(実態はロードバランサのエンドポイント機能)**します。
このため、ロードバランサのフロントエンド(forwarding rule)用の静的IPアドレスが必要となるので作成しておきます。

静的IPアドレスの作成

gcloud compute addresses create 【静的IPアドレス論理名】 \
     --ip-version=IPV4 \
     --global

生成した静的IPアドレスの確認

gcloud compute addresses describe 【作成した静的IPアドレス論理名】 \
    --format="get(address)" \
    --global

実行するとIPアドレスが表示されます。
後ほど利用するので控えておきます。

Cloud SDK beta版 componentsのインストール

Cloud SDKで設定するのでbeta componentsをインストールします。

gcloud components install beta

Serverless NEG作成

下記コマンドを実行し、Serverless NEGを作成します。

gcloud beta compute network-endpoint-groups create 【ServerlessNEG論理名】 \
     --region=【リージョン名】 \
     --network-endpoint-type=SERVERLESS  \
     --app-engine-app \
     --app-engine-service=default

Severless NEG作成結果の確認

下記コマンドを実行し確認します。
リストに作成したServerless NEGが表示されていればOKです。

gcloud beta compute network-endpoint-groups list

NAME         LOCATION         ENDPOINT_TYPE  SIZE
xxxxxxx-neg  asia-northeast2  SERVERLESS     0

補足1:コマンドオプションについて

今回指定したコマンドオプションは次の通りです。

オプション 説明
region Serverless NEGを作成するリージョン名。
バックエンドアプリケーションと同じリージョンにする必要があります。
network-end-point-type NEGの種別Serverless
NEGにする場合は値をSERVERLESSにします。
app-engine-app デフォルトルーティングでGAEを有効にする。
app-engine-service Serverless NEGに追加するGAEのサービス名。
指定が無ければ省略可。

その他オプションについては、下記公式リファレンスをご覧下さい。
gcloud beta compute network-endpoint-groups create

補足2:マルチリージョン構成にする場合

マルチリージョン構成にする場合はリージョンごとのServerless NEGを作成し、ロードバランサのバックエンドサービスに作成したServerless NEGを全て追加すればOKです。

ロードバランサのバックエンドサービスへの追加は後述の手順を参照下さい。

ロードバランサ・バックエンドサービスの設定

コマンドを順次実行し、バックエンドサービスの設定を進めていきます。

バックエンドサービスの作成

gcloud compute backend-services create 【バックエンドサービス論理名】 --global

NAME                     BACKENDS  PROTOCOL
xxxxxxx-backend-service            HTTP

バックエンドサービスにServerless NEGを追加

gcloud beta compute backend-services add-backend 【作成したバックエンドサービス論理名】 \
     --global \
     --network-endpoint-group=【作成したServerlesNEG論理名】 \
     --network-endpoint-group-region=【リージョン名(ServerlessNEGと同じリージョンにする必要あり)】

バックエンドサービスの確認

gcloud beta compute backend-services list

NAME                     BACKENDS                                           PROTOCOL  LOAD_BALANCING_SCHEME  HEALTH_CHECKS
xxxxxxx-backend-service  【リージョン名】/networkEndpointGroups/xxxxxxx-neg       HTTP      EXTERNAL

ロードバランサの設定

コマンドを順次実行し、ロードバランサの設定を進めていきます。
ロードバランサの設定反映は多少時間がかかります。

ロードバランサの作成

gcloud compute url-maps create 【ロードバランサの論理名】 \
     --default-service 【作成したバックエンドサービス論理名】

NAME             DEFAULT_SERVICE
xxxxxxx-url-map  backendServices/xxxxxxx-backend-service

ターゲットhttpプロキシを作成しロードバランサに追加

gcloud compute target-http-proxies create 【ターゲットhttpプロキシ論理名】 \
     --url-map=【作成したロードバランサの論理名】

NAME                URL_MAP
xxxxxxx-http-proxy  xxxxxxx-url-map

フロントエンド(forwarding rule)をロードバランサに追加

gcloud compute forwarding-rules create 【フロントエンド論理名】 \
     --address=【前述の手順で作成した静的IPアドレスの確認で控えたIPアドレスを指定】 \
     --target-http-proxy=【作成したターゲットhttpプロキシ論理名】 \
     --global \
     --ports=80

ロードバランサ・フロントエンドの確認

gcloud compute forwarding-rules list
 
NAME                       REGION  IP_ADDRESS                              IP_PROTOCOL  TARGET
xxxxxxx-http-content-rule          【前述の手順で作成した静的IPアドレスIPアドレス】    TCP          xxxxxxx-http-proxy

動作確認

ロードバランサにリクエストしてみます。

ブラウザのURL入力欄に、**ロードバランサ・フロントエンドのIPアドレス(【前述の手順で作成した静的IPアドレス】)**を入力し実行します。
alt

ロードバランサ経由でGEAにつながり、Wordpressの画面が表示されました。

後片付け

ロードバランサの削除

[Cloud Consoleメニュー]->[ネットワークサービス]->[負荷分散]から、今回作成したロードバランサを削除します。
alt

Serverless NEGと静的IPアドレスの削除

下記コマンドを実行します。

# Serverless NEGの削除
gcloud beta compute network-endpoint-groups delete 【作成したServerlessNEG論理名】 --region=【リージョン名】

# 静的IPアドレスの削除
gcloud compute addresses delete 【作成した静的IPアドレス論理名】 --global

まとめ

構築後に色々試してみたのですが、全く問題なかったので個人ブログに早速導入しました。
現在の構成はこんな感じです。
※会社の諸先輩方、アーキテクト図変じゃね?というご指摘はお手柔らかにお願いします。
yamavlog-architect-202008-3.jpg

個人ブログの方は常時SSL化しているので、当記事と若干設定内容が異なります。差分設定などこちらの記事にまとめました。

Cloud ArmorCloud CDNとの連携もバッチリできます。
Cloud IAPは連携させるとエラーが出ちゃいました。
(確認中ですが、Serverless NEGとはまだ連携出来なそう??)

GCPのサーバーレスサービスの課題が、Serverless NEGでかなり解消されるんじゃないかなと思います。

またマルチリージョン化も出来るようになるので、リージョンレベルでの負荷分散や障害対策にもServerless NEGが活躍しそうです。

GAが待ち遠しいですね。

参考情報

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?