【Python】Cloud FunctionsとCloud Storageを連携して動かしてみる
今回は、 Cloud FunctionsからCloud Storageへのファイルアップロード と Cloud Storageの変更をトリガーにしたCloud Functionsの起動 という、Cloud Functionsを利用した基本的な連携操作を試してみたいと思います。
この記事は アイソルートAdventCalendar2019 13日目の記事です。
こんにちは。
モバイルソリューショングループのimai.kです。
昨日はumeta.kさんの デジタル・ガバメント推進標準ガイドラインをITILに紐づけて考えてみる でした。
あらゆるシステムの運用担当者・設計者の方に一読いただきたい内容でしたね!
目次
- GCPアクセスの準備
- Cloud Storageにバケットを作成する
- Cloud FunctionsからCloud Storageに画像をアップロードする
- Cloud StorageへのファイルアップロードをトリガーにCloud Functionsを起動する
- 最後に
Let’s begin
では、早速進めましょう!
(なお、この記事はPython3系の環境を前提としています。)
GCPアクセスの準備
こちらを参考に、GCPのプロジェクト作成、CloudSDKのインストール・gcloudコマンドのセットアップを行なってください。
Cloud Storageにバケットを作成する
このあとの操作で画像をCloud Storageにアップロードするために、
Cloud Storageにバケットを作成しておきましょう。
この際、 YOUR_TRIGGER_BUCKET_NAME
にはグローバルに固有な名前を設定する必要があることに注意してください。
gsutil mb gs://YOUR_TRIGGER_BUCKET_NAME
Cloud FunctionsからCloud Storageに画像をアップロードする
では、画像アップロードのスクリプトを組んでいきましょう。
今回は、[Google Cloud Functions]でQRコード作成APIを構築!を参考に、
「二次元バーコード画像をCloud Functionsで作成し、Cloud Storageにアップロードする」
という操作を行っていきます。
(QRコードはデンソーウェーブの登録商標です)
まずは、任意のディレクトリに、requirements.txtを作成してください。
# requirements.txt Click==7.0 Flask==1.0.2 itsdangerous==1.1.0 Jinja2==2.10 MarkupSafe==1.1.0 Pillow==5.4.1 qrcode==6.1 six==1.12.0 Werkzeug==0.14.1 google-cloud-storage==1.23.0
次に、メインのスクリプトを作成します。
先ほどrequirements.txtを配置したディレクトリにmain.pyを作成してください。
今回は、以下のようにしてみました。
# main.py import sys import qrcode import io import os import tempfile from flask import escape, helpers from google.cloud import storage storage_client = storage.Client() def qr_upload_gcs(request): img = generate_qr_image(url=request.args.get('q')) _, temp_local_filename = tempfile.mkstemp() img.save(temp_local_filename) bucket = storage_client.bucket('YOUR_TRIGGER_BUCKET_NAME') blob = bucket.blob('sample.png') blob.upload_from_filename(temp_local_filename) os.remove(temp_local_filename) return 'Image was uploaded!' def generate_qr_image(url='https://www.isoroot.jp/'): qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4) qr.add_data(url) qr.make(fit=True) img = qr.make_image() return img
作成したスクリプトをデプロイしましょう。(少し時間がかかります。)
gcloud functions deploy qr_upload_gcs --runtime python37 --trigger-http
もし、以下のように聞かれたら、 y
を入力しましょう。
(y/N)?
デプロイが完了したら、 https://{region}-{project_name}.cloudfunctions.net/qr_upload_gcs
のようなURLが吐き出されます。
上記URLに q=https://www.isoroot.jp/
とクエリーパラメータを付与し、ブラウザに入力してみましょう。
https://{region}-{project_name}.cloudfunctions.net/qr_upload_gcs?q=https://www.isoroot.jp/
では、画像がアップロードされているか、Cloud Storageのバケットを見にいきましょう。
画像が作成されていれば、成功です。
Cloud StorageへのファイルアップロードをトリガーにCloud Functionsを起動する
それでは次に、Cloud Storageの変更を起点にCloud Functionsを起動してみましょう。
先ほど作成したmain.pyに、Googleのサンプルを参考に、以下の関数を追加してみます。
# main.py def gcs_change_log(data, context): print('Event ID: {}'.format(context.event_id)) print('Event type: {}'.format(context.event_type)) print('Bucket: {}'.format(data['bucket'])) print('File: {}'.format(data['name'])) print('Metageneration: {}'.format(data['metageneration'])) print('Created: {}'.format(data['timeCreated'])) print('Updated: {}'.format(data['updated'])) return 'Done!'
Cloud StorageをトリガーにしたCloud Functionsの起動はCloud Pub/Subに基づいたものとなっており、
以下のイベントを起点に発火させることが可能です。
- ファイナライズ
- 削除
- アーカイブ
- メタデータの更新
実際にどのイベントをトリガーにCloud Functionsを起動するかは、
関数のデプロイコマンドにパラメータを付与することで設定できます。
それでは、デプロイしましょう。
gcloud functions deploy gcs_change_log --runtime python37 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.finalize
これで、Cloud Storageへのファイルアップロードをトリガーに起動される関数がデプロイできました。
せっかくなので、二次元バーコード画像のアップロードにより、この関数を起動してみましょう。
先ほどと同じように、ブラウザに以下を入力してみましょう。
https://{region}-{project_name}.cloudfunctions.net/qr_upload_gcs?q=https://www.isoroot.jp/
関数が動作したかどうかは、Cloud ConsoleのCloud Functionsの詳細やStackdriver Loggingから確認することができます。
今回は、Stackdriver Loggingを見てみましょう。
以下のように、 qr_upload_gcs
や gcs_change_log
のログが表示されていれば成功です。
最後に
Cloud Functionsを利用すると、GCPリソースの操作や連携が簡単に実現できます。
また、リソース間の連携だけでなく、GCPなどで構築したシステムのAPIを外部に提供することが可能です。
明日の記事はnemoto.rさんによる 【Dynamics365】3分で分かる入門!Dynamics365(CRM)の強みとは? です、お楽しみに!