Node.js
RESTful
swagger
gcp

SwaggerでLambdaのデバッグ環境を作る(6):GCPのCloud Endpointsをデバッグする

第1回投稿で、SwaggerでLambdaのデバッグ環境を作りました。

 SwaggerでLambdaのデバッグ環境を作る(1)

今回は、Google Cloud Platform(以降GCP)のCloudEndpointsをデバッグします。

GCPへの設定は、以下に書いてある手順に従って進めます。

 https://cloud.google.com/endpoints/docs/openapi/get-started-app-engine?hl=ja

ですが、GCPのCloudEndpointsをデバッグするのではなく、Swagger定義ファイルを使って動作していたLambdaのNode.jsのコードを、CloudEndpointsに移設するイメージです。

CloudEndpointsは、Swagger定義ファイル(別名OpenAPI)に基づいて動作します。

したがって、これまでSwagger定義ファイルに基づくRESTfulサーバがあるのであれば、(実行環境に依存した処理がなければ)そのまま移設することができるわけです。

今回は、GCPのCloudEndpointsの実装として、App EngineのNode.jsを選択しました。もし、GCPのCompute Engineで構築したい場合は、以下を参考にしてください。

AWS Cognitoで認証しないと呼び出せない何かのサーバを作る


RESTfulサーバで動作するアプリを用意する

ぜひ、今までの記事を参考にRESTfulサーバで動作するアプリを作成してください。

特に、Node.js使いの方は、Swagger-nodeという素晴らしいツールがありますので、苦も無くRESTfulサーバを構築できるかと思います。

 SwaggerでLambdaのデバッグ環境を作る(1)

 SwaggerでLambdaのデバッグ環境を作る(2):Helperライブラリを使ったLambdaの書き方


GCPのプロジェクトを作成する。

まずは、以下のWebページから、プロジェクトを作成しましょう。すでに作ってある場合はそれを使います。

Google Cloud Console

 https://console.cloud.google.com/?hl=ja

プロジェクト名は適当ですが、たとえば、「TestProject」としました。

image.png

Google Cloud SDKのインストールやアプリの作成など、もろもろの準備が必要でして、以下のページの「始める前に」の作業はあらかじめ済ませておいてください。(手抜きですみません)

 https://cloud.google.com/endpoints/docs/openapi/get-started-app-engine?hl=ja

途中、regionが聞かれますが、asia-northeast1 を選択しましょう。


Swagger定義ファイルをGCPの環境に合わせる

これからが本番です。

ローカルのRESTful環境でアプリのデバッグが終わっている想定です。

GCPのCloud Endpointsにデプロイするために、Swagger定義ファイルを編集する必要があります。具体的には、host:の部分です。

こんな感じに変更します。

 host: "【プロジェクトID】.appspot.com"

修正はそれだけです。

デプロイしましょう。


gcloud endpoints services deploy api\swagger\swagger.yaml


以下のような表示が出れば、成功とのことです。


Service Configuration [2019-02-16r0] uploaded for service [【プロジェクトID】.appspot.com]


次に、「app.yaml」ファイルを作成します。Swaggerプロジェクトフォルダのルートに置きます。


app.yaml

# Copyright 2015-2016, Google, Inc.

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

runtime: nodejs
env: flex

# [START configuration]
endpoints_api_service:
# The following values are to be replaced by information from the output of
# 'gcloud endpoints services deploy openapi-appengine.yaml' command.
name: 【プロジェクトID】.appspot.com
rollout_strategy: managed
# [END configuration]


【プロジェクトID】の部分を環境に合わせて変更してください。

修正はこれだけです。

実装の方は、適当で構わないのですが、シンプルに以下で作ってみました。


api\swagger\swagger.yaml

・・・

/test-get:
get:
x-swagger-router-controller: routing
operationId: test-get
responses:
200:
description: Success
schema:
$ref: "#/definitions/CommonResponse"
・・・


api\controllers\routing.js

・・・

const func_table = {
// "test-func" : require('./test_func').handler,
// "test-dialogflow" : require('./test_dialogflow').fulfillment,
"test-get" : require('./test-get').handler,
};
・・・


api\controllers\test-get\index.js

'use strict';

const HELPER_BASE = process.env.HELPER_BASE || '../../helpers/';
const Response = require(HELPER_BASE + 'response');
const Redirect = require(HELPER_BASE + 'redirect');

exports.handler = async (event, context, callback) => {
console.log(event.queryStringParameters);
return new Response({ message: process.env.MESSAGE });
};



.env

MESSAGE="Good Morning"


/test-getにGETでアクセスすると、.envに書いたメッセージがJSON文字列で返ってくる、という単純なものです。

早速、デプロイを始めましょう。

デプロイによって、アプリの実装がGCPのCloud Endpointsにアップロードされます。


gcloud app deploy


途中、continueしますか?と聞かれますが、当然y(Yes)を入力します。

数分かかります。(これを繰り返したくなければ、しっかりローカルのデバッグ環境でデバッグしておきましょう!)

以下のようなメッセージが表示されて、デプロイが完了です。

 Setting traffic split for service [default]...done.

本当にデプロイができたのか、以下のURLをブラウザからたたいてみましょう


https://【プロジェクトID】.appspot.com/test-get


こんな感じで結果が返ってきましたでしょうか?

image.png

ちなみに、以下を入力すると、console.log出力していたデバッグメッセージが表示されます。(ちょっと反応は遅いですが)


gcloud app logs tail -s default


以上