最も簡単なバックエンドAPIの構築方法

自分で書いたpythonソースコード(計算機能)を Webサービス として一般公開しておくと

- Excel
- google spreadsheet
- 自作アプリ

など、どこからでも自分で書いた計算機能を利用できます。

今回は、**google** の **Cloud Fuinction** というサービスを用いて
APIサーバーの構築方法を紹介します。

# APIサーバーの構築

## google Cloud Fuinction の登録

**google Cloud Fuinction** の説明はここでは省きます。他の情報を参照してください

下記のURLにアクセスしてください
https://cloud.google.com/functions

### 無料で開始をクリック

google にログインしていない場合はログインしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/59db3617-6582-c081-c78d-0ecef02a34c8.png)

###  Cloud Fuinction を始めて使う場合 

アカウント情報の登録が必要です。

#### アカウント情報の登録 ステップ 1/3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/2781154e-faca-3777-4624-1970c831bc21.png)

#### アカウント情報の登録 ステップ 2/3
クレジットカードを入力します。
同じ画面の説明にあるように**自動請求を有効にするまで課金されることはありません** とこのあたりの説明を読んで納得できる方は先に進んでください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/86606ed9-6b95-fa14-8187-87770b46e227.png)

#### アカウント情報の登録 ステップ 3/3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/81453bc3-8b0f-3f80-8fd1-acd14eb25f55.png)

### Google Cloud Functions の管理画面を表示する
左のメニューから Cloud Functions をクリックしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/0e8b7083-4193-63c3-5cf7-4d526ec57a93.png)

## バックエンドAPIとなる 関数の作成
関数の作成 ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/1744aa46-6fb3-38c7-4085-c56bed490558.png)

### 関数の設定 

未認証の呼び出しを許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/b3474574-1b65-3cbe-1424-2440329cb134.png)

### 関数名などの設定 

`関数名`を任意の名前に今回は **function-1** としました

`リージョン`はサーバーの場所で 今回は **asia-northeast1** としました

**URL** を覚えておいてください. 今回は下記になりました
`https://asia-northeast1-hallowed-oven-333004.cloudfunctions.net/function-1`
後ほど使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/1a63412e-3618-5ad3-87f9-680e17bc2d4a.png)

### API を有効にする

外部からのアクセスを許可するために必要な設定を行います。

#### API を有効にするボタンをクリックする

![スクリーンショット 2021-11-23 142318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/cf65c369-5a21-11e2-ec5b-53ff841684df.png)

#### 有効にするボタンをクリックする 
![スクリーンショット 2021-11-23 142332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/6512c84e-d70f-583a-7980-a0dc95b4c87a.png)


### ソースコードを用意します。

今回の例では、下記のソースコードとしました

```python:main.py
import json
def hello_world(request):

    # ここからは定形文です------------------------------------
    if request.method == 'OPTIONS':
        headers = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET, POST',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        }
        return ('', 204, headers)

    headers = {
        'Access-Control-Allow-Origin': '*'
    }
    # ここまでは定形文です------------------------------------

    request_json = request.get_json()
    if request_json:
        A = request_json['A']
        B = request_json['B']
        result = {"C": A + B }
        return (json.dumps(result), 200, headers)
        
        
    return f'Hello World!'

```
説明）
> `定形文---` となっている範囲は外部からのアクセスを許す場合に必要なソースです
`request_json = request.get_json()` の部分で入力情報を受け取っています。

> 受け取る入力情報は **A** という変数と **B** という変数に格納されることとします。
`result = {"C": A + B }` ここで **A** と **B** の足し算を行い、その答えを **C**という名前で格納しています。



### デプロイボタンをクリックする

ソースコード、関数の設定が完了しましたので関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/11a24530-38f8-dcb3-e690-c89d24084f8b.png)


### くるくるを待ちます
![sd9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/4c4a8daf-54e3-381d-e2eb-054079073da2.gif)

## 権限を追加する

外部からのアクセスを許可するために必要な権限の設定を行います。

### [権限] タブを表示します。
右上隅にある [情報パネルを表示] をクリックして、[権限] タブを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/3514c688-ea32-f04e-a25d-3824df93bfdc.png)

#### [プリンシパルを追加] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/4a34cd22-ef7e-044c-3a5f-a8fbc2799679.png)

- `新しいプリンシパル` フィールドで、**allUsers**と入力します。
- `役割を選択` プルダウン メニューから **Cloud Functions** > **Cloud Functions 起動元** 役割を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/61396978-5c1a-77e3-2a38-3c7faf3f3dc8.png)

#### 保存をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/43eac1a6-7404-6e47-3941-16c740bf3443.png)

#### 一般公開アクセスを許可をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/d9a797d6-0871-e0cb-0b1b-3b4b002661f9.png)

# APIサーバーを使ってみる

APIサーバーが完成しました！おめでとうございます。
次はこのAPIサーバーを外部から呼び出してみてテストしてみたいと思います。

覚えておいた **URL** にアクセスしてみます。

## 簡単なチェック
ブラウザのアドレスバーに 覚えておいた **URL**を入力してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/fd010706-2ca6-e4e9-d8fe-2de936afd30e.png)

と表示されれば成功です。

これは、ソースコードの `if request_json` 文 に入らなかった ことを意味しています。

```python:main.py
    request_json = request.get_json()
    if request_json:
        # この if 文 に入らなかった
        
    return f'Hello World!'
```

## APIサーバーに計算させてみる

今度はAPIサーバーに **A** と **B** の足し算をさせてみます。

ここに示すようなソースコードを用意します。
https://colab.research.google.com/drive/1h-GJAU2lBedkLJmzVYSEU7oADmORYv-3?usp=sharing

**A** に **1**, **B** に **5** を設定してサーバーに送ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/d32b54ad-0591-2fbe-9208-2cd8d07ff76f.png)


APIサーバーから **6** という答えが返ってきました。


以上です
あなたの 新たな Webサービス が 一般に公開されました