【GCP】初めてのAPIゲートウェイ

## はじめに

こんにちは。ジールの@________________-_です。
GCPの**API ゲートウェイ**を利用する機会があったので、チュートリアルを参考に簡単なAPIを作成してみました。
APIゲートウェイとバックエンドにcloud functionsを利用しただけの単純な構成です。
普段APIを作ることが無いので、ドキドキの初めての~~おつかい~~実装となりました。

https://cloud.google.com/api-gateway/docs/quickstart-console

## サービスアカウントの作成

まずは、API構成に紐づけるサービスアカウントとcloud functionsに紐づけるサービスアカウントを作成します。

IAMのコンソール画面の左ペインから「サービスアカウント」を選択します。
上部の「サービスアカウントを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/77fdcc53-408d-32ee-b582-69ac6253e3a8.png)
API構成に紐づけるサービスアカウント名を入力して「完了」をクリックします。
今回はcloud functions関数を認証なしで実行できる様にする為、サービスアカウントに権限は付与しません。
※認証ありの場合に関しては別途記事を記載する予定です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/49b56a3b-4e3d-600c-f9b7-f72615923239.png)
同じ作業を繰り返し、cloud functions用のサービスアカウントも作成します。
関数から各種GCPサービスにアクセスしない為、こちらもサービスアカウントに権限付与は不要です。

## cloud functionsの作成

API ゲートウェイのバックエンドとして実行する関数を作成します。

cloud functionsのコンソール画面上部の「関数の作成」をクリックします。
最初に構成を設定していきます。
「関数名」を入力して、「リージョン」を選択します。
「トリガータイプ」は「HTTP」を選択します。
「認証」は「未認証の呼び出しを許可」を選択します。
「HTTPSが必須」をチェックします。
設定が完了しましたら「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/88b9b5ce-dfe5-d62e-99fe-74d32d81e655.png)
「ランタイム、ビルド、接続、セキュリティの設定」欄を開き、「ランタイム」タブを選択します。
「ランタイム サービスアカウント」で、上記で作成したcloud functions用のサービスアカウントを選択します。
「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/7105d75f-9d7f-3da5-4a91-9f17b5e04e24.png)
次に実行するコードを設定します。
「ランタイム」で「python3.x」を選択します。
コードはデフォルトで入力されている**hello_world**関数をそのまま利用します。
「デプロイ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/abdce29e-e6a0-599f-aad2-58e0a50e80a2.png)

デプロイ完了後、関数が正しく動くかテストしてます。
認証無しなので誰でも実行できます。
関数のトリガーURLは、cloud functionsコンソール画面で関数名をクリック後、トリガータブを開くと記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/d47bab25-fa64-bd74-ccba-5441eceb1a18.png)
コマンドで実行した結果「**testestest**」が返ってくればOKです。

```sh
curl https://region-project_name.cloudfunctions.net/helloworld?message=testestest
>>> testestest
```

## API ゲートウェイの作成

いよいよ本命のAPIゲートウェイを作成する訳ですが、コンソールから作成する前にAPI定義を記載した構成ファイルを準備する必要があります。

### 構成ファイルの準備
OpenAPI仕様を使用してAPI ゲートウェイの動作を定義していきます。
そもそもOpenAPIとは？？？という感じなのですが、[こちら](https://qiita.com/teinen_qiita/items/e440ca7b1b52ec918f1b)の記事に詳しくまとまっておりました。先人達の記事に今日も感謝です。

分かったつもりになったところで、構成ファイルを作成していきます。
`address:`の部分を上記で作成したcloud functions関数のトリガーURLに変更します。
修正後、yamlファイルとしてローカルに保存します。
ファイル名に日本語が入っていると取り込む際にエラーになるので要注意です。

```yaml:openapi2-functions.yaml
# openapi2-functions.yaml
swagger: '2.0'
info:
  title: hello_test
  description: Sample API on API Gateway with a Google Cloud Functions backend
  version: 1.0.0
schemes:
  - https
produces:
  - application/json
paths:
  /hello/{message}:
    get:
      summary: echo message
      operationId: hello
      x-google-backend:
        address: https://region-project_name.cloudfunctions.net/helloworld
        path_translation: CONSTANT_ADDRESS
      responses:
        '200':
          description: A successful response
          schema:
            type: string
    parameters:
      - name: message
        in: path
        required: true
        type: string
        description: message
```
※API構成の詳細説明は割愛させていただきます。
詳しく知りたい方は[APIゲートウェイ公式ドキュメント](https://cloud.google.com/api-gateway/docs/openapi-overview)や[Swagger 基本構造](https://swagger.io/docs/specification/2-0/basic-structure/)のサイトをご確認下さいませ。
また、[google独自のOpenAPIの拡張拡張](https://cloud.google.com/endpoints/docs/openapi/openapi-extensions)や[OpenAPI 機能の制限](https://cloud.google.com/endpoints/docs/openapi/openapi-limitations)など、APIゲートウェイでの独自拡張・制限がございますので併せてご確認下さいませ。


### APIゲートウェイの作成

構成ファイルが作成できたので、いよいよAPIゲートウェイを作成していきます！

APIゲートウェイのコンソール画面に行くと、なにやらAPIの有効化が足りてない様子。
「LAUNCH」をクリックして不足したAPIを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/161d9628-4a39-29a1-5374-a2ad0b00c62f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/3b90341f-0d67-b9e1-1079-03ec176322fe.png)


各種APIを有効に出来ましたら、「ゲートウェイを作成」をクリックします。
「APIを選択」は「新しいAPIの作成」を選択します。
「表示名」、「API ID」を入力します。
「構成を選択」は「新しいAPI構成の作成」を選択します。
「API仕様をアップロード」でローカルに保存したAPI構成ファイルを選択します。
「表示名」を入力します。
「サービスアカウントを選択」でAPIゲートウェイ用に作成したサービスアカウントを選択します。
「ゲートウェイの詳細 表示名」を入力して、「場所」を選択します。
設定が完了したら「ゲートウェイを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2166013/2770b823-68de-d24f-a13b-c99a2173c3a7.png)

### APIゲートウェイを実行してみる

APIゲートウェイがデプロイ出来たら、コマンドで実行してみます。
「**testestest**」が返ってきたら成功です。
無事に~~おつかい~~実装でけた！！！

```sh
 curl https://xxx.an.gateway.dev/hello/testestest
>>> testestest
```

## さいごに
構成ファイルの作成で若干躓いたりもしましたが、
そこさえ乗り越えられれば後はスムーズに出来る印象です。
少なくともチュートリアルをそのまま実装するだけであれば、問題なく実装できそうです。
今回はcloud functionsもAPIゲートウェイも認証なしで実装しましたが、
認証が必要になる場合も多々あると思います。
次回は認証ありを作成していきます。

## 参照
https://cloud.google.com/api-gateway/docs/quickstart-console

https://cloud.google.com/api-gateway/docs/openapi-overview

https://cloud.google.com/endpoints/docs/openapi/openapi-extensions

https://cloud.google.com/endpoints/docs/openapi/openapi-limitations

https://qiita.com/teinen_qiita/items/e440ca7b1b52ec918f1b

https://swagger.io/docs/specification/2-0/basic-structure/

***
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
 
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area