Loading
BLOG 開発者ブログ

2019年12月13日

【Python】Cloud FunctionsとCloud Storageを連携して動かしてみる

今回は、 Cloud FunctionsからCloud Storageへのファイルアップロード Cloud Storageの変更をトリガーにしたCloud Functionsの起動 という、Cloud Functionsを利用した基本的な連携操作を試してみたいと思います。

この記事は アイソルートAdventCalendar2019 13日目の記事です。

こんにちは。
モバイルソリューショングループのimai.kです。

昨日はumeta.kさんの デジタル・ガバメント推進標準ガイドラインをITILに紐づけて考えてみる でした。
あらゆるシステムの運用担当者・設計者の方に一読いただきたい内容でしたね!

目次


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 を入力しましょう。

Allow unauthenticated invocations of new function [qr_upload_gcs]?
(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_gcsgcs_change_log のログが表示されていれば成功です。

最後に

Cloud Functionsを利用すると、GCPリソースの操作や連携が簡単に実現できます。
また、リソース間の連携だけでなく、GCPなどで構築したシステムのAPIを外部に提供することが可能です。

明日の記事はnemoto.rさんによる 【Dynamics365】3分で分かる入門!Dynamics365(CRM)の強みとは? です、お楽しみに!

imai.kのブログ