【GCP】【Python】Google Cloud FunctionsでサーバーレスにAPIをデプロイ!

こんにちは。サッチーです。ニートなので先週は投稿する曜日を1日勘違いしていました。すみません。
前日は@Rimo1129さん(後輩)が[AWSで就活ポートフォリオっぽい何かを作る](https://qiita.com/Rimo1129/items/bb39e68f7e3a7c598577)を書いてくれました~!!!!!就活ちゃんとして、アドベントカレンダーも書いてくれるなんて優秀すぎますね。私はAWS全然わからないので教えて欲しいです。
AWSわからんので私はGoogleが提供しているGoogle Cloud Functionsを使って遊んでみたいと思います。

## Google Cloud Functionsとは
> Cloud Functions は、クラウド サービスの作成と接続に使用できるサーバーレスの実行環境です。Cloud Functions を使用すると、クラウドのインフラストラクチャやサービスで生じたイベントに関連する、単一目的のシンプルな関数を作成できます。対象のイベントが発生すると、関数がトリガーされます。

だそうです。AWSのlambdaみたいなやつです。今回はトリガーとしてHTTPを指定することで、サーバーレスにAPIをデプロイして叩けるようにします。

## 計画
[前回の記事](https://qiita.com/hcpmiyuki/items/19b8456ab2a9c5dc7fe5)でぐるなびのAPIを使って会社周辺の飲食店の情報を収集しました。今回はパラメータとしてキーワードと検索方法(andかorか)を受け取って、キーワードが口コミに含まれているお店の情報のリストを返すような関数をデプロイしようと思います。
データは少なかったのでデータベースには入れずに以下のようなjsonに整えておきます。

```python
[{'id': '1046494',
  'name': '炉ばた 陣や',
  'longitude': '139.712244',
  'latitude': '35.647473',
  'holiday': '',
  'opentime': '月～金 ランチ：11:30～14:00(L.O.13:30)、ディナー：17:00～23:30(L.O.22:30)(※テイクアウト 11:30～22:00（当日受付 11:30～21:30）)\n土・日・祝 11:30～23:30(L.O.22:30)(※【ハッピーアワー開催】土・日・祝14:00～18:00！200円ドリンクをご用意！\n※テイクアウトの受付は11:30～22:00)',
  'category': '居酒屋',
  'pr': '',
  'url_mobile': 'http://mobile.gnavi.co.jp/shop/1046494/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D',
  'image_url': '',
  'review_text': 'かき氷の上に小さな小瓶がさしてありしっかりと冷やしてありますうにとオクラが入ったものうにとゆばが入ったものこれさっぱりとした中にうにのこってりさが見ためも綺麗です食べごたえのある唐揚げと温玉がのった鶏そぼろ丼でボリューム満点でしたラーメンとごはんと豚肉がセットになったボリューム満点の絶品ですランチです甘じょっぱいたれの角煮がゴロっと入っていますふわふわのバンズとの相性もばっちり蒸籠ごと運ばれてくるのでアツアツが持続素敵な気づかいですねさっと炙って火を通しただけのようでかなりのレアふるふるとした柔らかい口当たりレバーが好きな人にはオススメかき氷の上に小さな小瓶がさしてあるしっかりと冷やすてあるますうにとオクラが入るたものうにとゆばが入るたものこれさっぱりとするた中にうにのこってりさが見た目も綺麗です食べるごたえのある唐揚げとオンセンタマゴがのるた鶏そぼろ丼でボリューム満点ですたラーメンとごはんと豚肉がセットになるたボリューム満点の絶品ですランチです甘いじ角煮がゴロっと入るているますふわふわのVANSとの相性もばっちり蒸籠ごと運ぶれるてくるのでアツアツが持続素敵だ気遣いですねさっと炙るて火を通すただけのようだかなりのレアふるふるとするた柔らかい口当たりレバーが好きな人にはオススメ'},
 {'id': '5237768',
  'name': 'IL BOCCALONE',
  'longitude': '139.712111',
  'latitude': '35.647784',
  'holiday': '',
  'opentime': '月～土 17:30～24:00(L.O.23:00)\n日 17:30～23:00(L.O.22:00)',
  'category': 'イタリアン',
  'pr': '',
  'url_mobile': 'http://mobile.gnavi.co.jp/shop/5237768/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D',
  'image_url': '',
  'review_text': 'フィットチーネが濃厚ソースに絡んでて美味しかったです黒キャベツとはいえども思ったより重たい定番のパルメザンチーズのリゾットはチーズ丸ごとの迫力だけじゃなく濃い味もクセになるチーズの美味しさがほんととろけるおすすめ☆外はパリッと柔らかい肉が最高に美味しい海老の旨みが全面にでててまた行きたくなる美味しさですフィットチーネが濃厚ソースに絡むでてる美味しいたです黒キャベツとはいうども思うたより重たい定番のパルメザンチーズのリゾットはチーズ丸ごとの迫力だけじゃない濃い味もクセになるチーズの美味しいさがほんととろけるおすすめ☆外はパリッと柔らかい肉が最高に美味しい海老の旨みが全面にでるてるてまた行くたいなる美味しいさです'}]・・・続く
```

## やっていく
今回はGCPのコンソール上で関数を作成します。もちろんgcloudのコマンドでローカルからデプロイすることもできます。
関数を作成していきます。ここでトリガーにHTTPを指定します。認証はAPIとして公開する場合は未認証の呼び出しを許可するようにしておきます。
![スクリーンショット 2020-12-19 6.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533290/8a0f0ed2-34bc-a2e2-3386-40cc3a5b93ce.png)

次にランタイムをPythonに設定、requirements.txtに必要なパッケージを記述、エントリポイントを実行したい関数名に変えます。また、初めてCloud Functionを使う場合は「APIを有効にする」というところから、Cloud Buildを有効にする必要があります。
あとは関数を記述して、必要なファイルがあれば追加します。(今回はshop_data.jsonを追加)


![スクリーンショット 2020-12-19 7.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533290/f47c1c9e-2ab1-c519-3c30-93afd3ae26ca.png)


デプロイが完了したら緑色のチェックマークが表示されます。
![スクリーンショット 2020-12-19 7.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533290/34327d47-ea93-3386-2e56-1cbf2edf5af1.png)

## 試す
叩く

```
curl "https://asia-northeast1-<プロジェクト名>.cloudfunctionsnet/ebimog-api?keywords=馬,イタリアン&retrieval_type=or"
```

```
{
  "results": [
    {
      "id": "5351809",
      "name": "アンクルトム",
      "longitude": "139.711817",
      "latitude": "35.647634",
      "holiday": "",
      "opentime": "",
      "category": "パスタ",
      "pr": "",
      "url_mobile": "http://mobile.gnavi.co.jp/shop/5351809/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D",
      "image_url": ""
    },
    {
      "id": "5497878",
      "name": "ＡＦＵＲＩ",
      "longitude": "139.710687",
      "latitude": "35.648240",
      "holiday": "無",
      "opentime": "月～日 ランチ・ディナー：11:00～翌5:00",
      "category": "ラーメン",
      "pr": "また食べたいと思うような「懐かしい味」のラーメンがモットー。",
      "url_mobile": "http://mobile.gnavi.co.jp/shop/5497878/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D",
      "image_url": ""
    },
    {
      "id": "6145400",
      "name": "肉寿司 恵比寿横丁店",
      "longitude": "139.710681",
      "latitude": "35.648097",
      "holiday": "年中無休\n※年末年始はお休みさせていただきます。",
      "opentime": "月～土・祝前日 15:00～翌5:00\n日・祝日 15:00～23:00",
      "category": "肉寿司",
      "pr": "牛・馬肉を中心とした肉専門の握り寿司それが肉寿司!!！\n\n朝５時まで元気に営業中！\n名物さしとろは食べるしかない！",
      "url_mobile": "http://mobile.gnavi.co.jp/shop/6145400/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D",
      "image_url": ""
    },・・・以下略
```
返ってきた!

## 終わりに
このようにコンソールから関数を登録するだけで簡単にAPIができました。HTTP以外にも様々なトリガーがあるので、GCPのサービスを使いこなせると楽しそうです。

## 参考
- [Google Cloud FunctionsでPythonを利用してみた(Beta利用)](https://qiita.com/kai_kou/items/dca21cdfd8375a247c2f)