Cloud Functions で Python プログラムを走らせ 、メモリ利用量を監視してみよう（ノンプログラミング）

Google Cloud Funcions（以下、GCF）のランタイムが Node.js 6 に加え、Node.js 8 と Python3.7 がベータ版として利用可能になっています。今回は、GCP公式ブログで Laurent Picard 氏の記事「Python サーバレスファンクションを数分でデプロイする」を参考に GCF を解説します。

Laurent Picard 氏の記事 URL：https://medium.com/google-cloud/deploying-a-python-serverless-function-in-minutes-with-gcp-19dd07e19824

　本記事を読まれた方は是非とも Laurent Picard 氏の記事を読んでいただければ、喜んでいただけることでしょう。

目次
1. GCF を3分で実行してみる
2. GCF の監視（Stackdriver）
3. まとめ


1. GCF を3分で実行してみる

　GCF をシンプルに説明すると「関数を実行させる GCP サービスの1つ」です。AWS であれば Lambda に相当します。文章より画面で見る方がわかりやすいため、以下の手順で GCF の関数を作りましょう。
　
＜手順＞
GCP コンソールで Cloud Functions の画面を開く
ボタン「関数の作成」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/7ad2bca7-3d30-61e1-6044-50d93483940f.png)

＜各項目の設定＞
・名前：get-ebooks
・割り当てるメモリ：256MB
・トリガー：HTTP
・ソースコード：インラインエディタ
・ランタイム：Python3.7（ベータ版）
・main.py：GitHub からコピー＆ペースト
このプログラムは、Google Books API を用いて、書籍の著者を検索キーとし、書籍のページ数が多い順にソートします。コードは以下に公開されています。
https://github.com/PicardParis/cloud-snippets/blob/master/python/gcf-get-ebooks/main.py
・requirements.txt：変更なし
・実行する関数：get_ebooks_by_author
・リージョン：asia-northeast1
入力後、以下のようにコードが記述されていることを確認し、保存ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/1a7740a0-6236-bc08-8758-c2e65ae834a6.png)

GCF に今回作成した関数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/b3ae9462-2630-ad65-84a3-ec776332215e.png)


get-ebooks をクリックし「トリガー」を開くと URL が表示されてます。この URL にアクセスしたときがトリガーとなり、GCF で作成した関数が実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/ff71f9b6-bdca-23f4-456d-2bd39e4549ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/57e777a1-b99a-6b91-c9ee-52b47ccd49c7.png)


＜関数実行後のブラウザ画面＞
　上図の URL を開くと、指輪物語（ロード・オブ・ザ・リング）の作者 JRR Tolkien 氏の書籍がページ数の多い順に表示されています。検索元は Python code に書かれているとおり Google Books API を使っています。また、検索する際の言語（lang）は英語（en）となってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/3a77e7a9-52cb-2732-5169-ceac2c08ef65.png)

　URL にパラメータ author , lang を追加することで、作者や言語指定ができます。2018年10月よりアニメ「ジョジョの奇妙な冒険 黄金の風」が放送開始されたので、荒木飛呂彦先生＆日本語（jp）で検索してみることにしましょう。
URI：https://asia-northeast1-toru-kazama.cloudfunctions.net/get-ebooks?lang=jp&author=荒木飛呂彦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/10a3592a-3c49-44c3-0639-6415799e85a8.png)


　12件ヒットしました。ページ数が表示されないのは Google Books に値が入っていないためです。好きな作者で検索したり、Python code の修正 / 検索すると良いでしょう。
　あっという間に、GCF で何ができそうかイメージが浮かんだと思われます。サーバを起動せず、関数実行時に課金されるサーバレスアーキテクチャに必要な GCP サービスの1つが GCF です。


＜GCF のダッシュボード＞
　関数実行後、「呼び出し関数」「実行時間」「メモリ使用量」の3種類が可視化できます。下図はメモリ使用量のグラフです。今回使った簡易な Python code でも約40MBを消費していることがわかります。
　関数実行に問題がある場合、メモリ不足が要因の1つと考えられますので、最低でもメモリ使用量は「監視」が必要です。GCF のメモリを128MB～2GBと柔軟に変更することで解決が期待できます。
　ほか、実行時間はデフォルトで60秒後にタイムアウトしますので、処理要件に応じて code 修正やタイムアウト値の変更をすることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/740031c1-885b-9e74-5426-fa480ffa7a83.png)


2. GCF の監視（Stackdriver）
　Stackdriver で GCF のメモリ使用量の監視設定を行います。まず、GCP コンソールの左ペインから「モニタリング」をクリックします。Stackdriver の初期設定を行ってていない場合は画面に従って設定を完了させましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/9c5f02da-5836-2349-ab68-f4a750b6f183.png)


　
　Alerting から Create a Policy を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/e9453105-7072-c4fa-59df-9fe589987328.png)



　下図のような画面が表示されますが、メモリ監視するには右上の「OPT IN」に変更する必要があります。OPT IN をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/f635ebd7-33f1-4b43-d5a9-7e08211b5815.png)



　これで OPT IN 画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/70701c7d-fc8c-b557-e729-a5c9ab6c9455.png)



　さっそく「Conditions」の設定を行います。ADD CONDITION をクリックし、下表のとおり入力してください。

・Target

　実際の設定画面は下図となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/1146b037-8a8f-e157-a2f2-32767ed9d5f4.png)



・Configuration

　実際の設定画面は下図となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/6604afaa-2e03-4efc-403a-707a08dc1532.png)



　これで Conditions の設定が完了しました。

　次は Notifications (optional) で「Email」を選択し、メールアドレスを入力します。Documentation (optional) は、メール本文にマークダウン形式でコメントを追加することができます。障害時の対応方法をこの部分に記載すると良いでしょう。
　Name this policy は、ポリシー名を入力する必要があるので「GCF」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/d4e5e2c4-187d-efef-a01f-6a8e7715103d.png)


　すべての設定が完了しましたので SAVE ボタンを押します。これで Stackdriver の監視設定は「1分間隔に GCF のメモリ使用量が 30MB を超過した場合、指定のメールアドレスに内容を送信する」となります。

　最後に GCF の関数（URL）を再実行し、着信したメールを開いてみましょう。数分後に以下のようなメールが届いているはずです。メモリ使用量が 30 MB（31,457,280 Byte） を超過したことを示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386394/bb6cb8c0-7c5e-8b92-f0d0-ebe3010ae217.png)



3. まとめ
　GCF の設定は非常に簡単です。ただ、運用を考えると GCF のメモリ使用量は監視しておいた方が良いため、Stackdriver の監視設定（一例）を記載しました。つまずくところが「2点」ほどあったと思います。「OPT IN」と「メモリ値の計算方法」ですので Tips として覚えておきましょう。
　GCF はサーバレスアーキテクチャを実現させるための重要なサービスの1つです。Pub/Sub や GCS を基点とした cool なサーバレスアーキテクチャを経験すると GCP の活用範囲は広くなります。この記事を機会に是非とも GCF を触ってみましょう。プログラムが書けなくても上述のコードを C&P するだけで体験できます！

　GCP全般について、クラウドエースでは豊富な技術者によるサポートで快適なGCP生活のお手伝いをしておりますので、是非ご相談ください。