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

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

　[SwaggerでLambdaのデバッグ環境を作る(1)](https://qiita.com/poruruba/items/e3a46787c79517a815f9)

今回は、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で認証しないと呼び出せない何かのサーバを作る](https://qiita.com/poruruba/items/f320c66387f4530485a4)

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

ぜひ、今までの記事を参考にRESTfulサーバで動作するアプリを作成してください。
特に、Node.js使いの方は、Swagger-nodeという素晴らしいツールがありますので、苦も無くRESTfulサーバを構築できるかと思います。

　[SwaggerでLambdaのデバッグ環境を作る(1)](https://qiita.com/poruruba/items/e3a46787c79517a815f9)
　[SwaggerでLambdaのデバッグ環境を作る(2)：Helperライブラリを使ったLambdaの書き方](https://qiita.com/poruruba/items/dd2cb33d591914107925)

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

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

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261826/2420a38a-1edb-fe7d-53f9-db3e676c1220.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](https://qiita-image-store.s3.amazonaws.com/0/261826/8822861c-fb6e-be26-cea7-f407069e9d4d.png)

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

> gcloud app logs tail -s default

以上