https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sending-sms-from-python-with-google-cloud-functions-dr/Blog_Google-Cloud_SMS_1200x600-1.png

Google Cloud Functionsを使ってPythonからSMSを送信する

最終更新日 November 9, 2020

所要時間:1 分

以下のチュートリアルでは、関数を Google Cloud Platformを使用して Python 3.7.

この関数は、Vonage SMS API を使用してユーザーにテキストメッセージを送信します。ユースケースは、アプリをダウンロードするようにユーザーを招待するメッセージを送信することです。この関数は JavaScript フロントエンドから呼び出すことができます。Google Cloud Function を使えばもっと高度なことができますが、これは単純に動作する関数を作成する方法の簡単なデモンストレーションです。

なぜこんなことをするのか

のようなクラウドサービスプロバイダーに個々の機能をデプロイするトレンドです。 グーグル, アマゾンまたは マイクロソフトが成長している。この種のアーキテクチャーの利点は、アプリケーションを可能な限り小さな断片(個々の機能)に分解し、サーバーを管理したり、使用していないサービスに料金を支払ったりすることなく、迅速かつスケーラブルな方法で構築できることだ。

このタイプのデプロイは、ほとんど静的なウェブサイトのために非常に小さなバックエンドのコードを追加する場合に特に便利です。静的サイトジェネレータを使って構築したサイトは、次のようなプラットフォームでホストすることができます。 GitHub PagesNetlifyのようなプラットフォームでホストすることができます。

グーグルでの設定

Google Cloud Platformを使い始めるには、次のサイトにアクセスしてください。 cloud.google.comにアクセスし、サインアップする。Googleアカウントが必要です。GmailやAndroid、その他のGoogleサービスですでにGoogleアカウントを使っている場合は、それを使うことができます。

Google Cloud Platformを使用したことがない場合、初年度に使用できる300ドル(または現地通貨での相当額)のクレジットが提供される。あなたのサイトが非常に人気があり、人々が常にあなたのサイトをヒットしない限り、おそらく無料ティアの許容量を超えて使用することはないでしょう。

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

前提条件の設定

Google Cloud Functionsは、Node.jsまたはPython 3上で動作するように書くことができる。Node.js を使用している場合、Google は Expressライブラリを使います。 FlaskフレームワークのAPIがリクエストとレスポンスの処理に使われる。入ってくるリクエストはすべて flask.Requestとしてあなたの関数に渡され、あなたの関数は Flask アプリケーションと同じようにレスポンスを返す必要があります。

CORS(Cross-Origin Resource Sharing:クロス・オリジン・リソース・シェアリング)を処理する必要があります。これは Flask-CORS.

関数を作成する最初のステップは、Google Cloud PlatformコンソールのCloud Functionsセクションにある "Create a function "をクリックすることです。すると、関数の名前を設定し、いくつかのオプションを選択するプロンプトが表示されます。

Create a Google Cloud FunctionCreate a Google Cloud Function

さっそく見ていこう:

  • 関数の名前は、関数を呼び出すためのURLにも使用されます。

  • 関数に割り当てられるメモリは、使用可能な最大メモリ量です。メモリを大量に消費する関数を構築する場合(オーディオ/ビデオファイルを処理する場合など)、より多くのメモリを割り当てる必要があります。

  • トリガーは、関数を呼び出す方法です。この関数はウェブページのフォームから呼び出されるので、HTTPのままにしておきますが、他のアクションに基づいて動作するように設定することもできます。

  • このチュートリアルでは、インラインエディタを使用しますが、コードを開発する方法に合わせて変更することができます。ブラウザでアップロードするZIPファイル、クラウドストレージにデプロイするZIPファイル、またはリポジトリからデプロイすることもできます。

  • ランタイムを設定する必要がある。デフォルトはNode.jsだが、このチュートリアルではPythonを使う。

コードエディターの下には、見る価値のある高度なオプションがいくつもある:

  • 地域:デフォルトではus-central1(米国アイオワ州)に設定されていますが、ヨーロッパまたはアジアからの訪問者が多い場合は、適宜europe-west1(ベルギー)またはasia-northeast1(東京)に設定するとよいでしょう。これを変更するとURLが変更されます。

  • タイムアウトは60秒に設定されています。私たちの目的にはこれで十分ですが、これを調整することもできます。Cloud Functionsの使用はミリ秒単位で課金されることを忘れないでください。

  • 環境変数:2つの環境変数を設定する必要があります:VONAGE_API_KEYとVONAGE_API_SECRETです。

機能を創造する

個々の関数が何をするかはあなた次第です。私は簡単な例を書きました。 Gistで見ることができる。これは2つの引数を取る:

  • phone送信先の電話番号。VonageはE.164形式の番号を要求します。

  • platformユーザーのデバイスのOSはiosかandroidのどちらかです。これにより、Apple App StoreとGoogle Play Storeのどちらにリンクするメッセージが表示されるかが決まります。

import vonage
from flask import jsonify

def send_sms(request):
    data = request.get_json()

    # VONAGE_API_KEY and VONAGE_API_SECRET are in env vars
    # which are set in the Google Cloud function
    client = vonage.Client()

    # you may prefer to use link shorteners to see how many clickthroughs happen
    ios_msg = "Download our iOS app from https://example.org/apple"
    android_msg = "Download our Android app from https://example.org/android"

    if data['platform'] == "ios":
        msg = ios_msg
    elif data['platform'] == "android":
        msg = android_msg

    # you need some more data checking here. just an example...
    args = {
        'from': 'MyApp',
        'to': data['phone'],
        'text': msg
    }
    response = client.send_message(args)
    return jsonify(response)

関数を書いたら、それをデプロイする最も簡単な方法は、Google Cloud Functionsウェブサイトのコードエディタにコピー&ペーストすることです。コードエディタの下で、実行する関数の名前を設定する必要があります。これは、ファイル内のどの関数を呼び出すかを Cloud Functions に伝えます。Advancedセクションで、環境変数も設定する必要があります、 VONAGE_API_KEYVONAGE_API_SECRET.

Set environment variablesSet environment variables

完了したら、'Save'を押し、Googleの魔法のロボットが機能を展開するまでしばらく待ちます。

curl -X "POST" "https://us-central1-youraccountname.cloudfunctions.net/app-sms" \ -H 'Content-Type: application/json; charset=utf-8' \ -d $'{ "phone": " 447700900000 ", "platform": "ios" }'

デモンストレーションのために、以下はSMS APIから送り返されたものである。 SMS APIから送り返されるものです。:

{
  "message-count": "1",
  "messages": [
    {
      "status": "0",
      "network": "23410",
      "remaining-balance": "10.00000000",
      "to": "447700900000",
      "message-price": "0.03330000",
      "message-id": "1500000000000AA1"
    }
  ]
}

(message-idのような情報をフロントエンドに送り返すのではなく、フィルタリングすることを強くお勧めします)。

フロントエンドの統合

関数を記述したら、次のステップはその関数呼び出しをフロントエンドに統合することです。JavaScriptベースのフロントエンドでは、呼び出すCloud Functionsが クロスオリジンリソース共有(CORS)ヘッダーを送り返すようにする必要があります。

あなたが書いて本番で使うコードは、ここで示した例よりももう少し洗練されたものにする必要があります。コードが「サーバーレス」だからといって、セキュリティについて考える必要がないわけではありません。あなたの関数は小さく、自己完結しているので、他のコードに影響を与えることはできませんが、それでも、関数に入ってくるデータを検証し、関数から呼び出されるAPI(VonageのAPIを含む)が安全に呼び出されるようにすることを考える必要があります。

次のページ

GoogleのCloud Functionsは、MicrosoftのAzure FunctionsやAmazon Web ServicesのLambda関数と同様に、非常にシンプルなAPIを構築することができる。静的サイトやJavaScriptフロントエンド、モバイルアプリへの統合に最適だ。

クラウドファンクションは、複数のAPIプロバイダーから提供されるサービスを統合する方法として使うことができる。例えば、Cloud Functionsを使って次のようなことができる:

  • VonageのVoiceサービスからのWebhookイベントへの応答

  • GitHubや継続的インテグレーション・サービスからの通知を受け取り、何らかの条件にマッチしたらテキスト・メッセージをトリガーする。

  • Eコマースシステムと決済プロバイダーから情報を収集し、注文が発送された際に顧客にお礼のメッセージを送信する。

  • モバイルアプリの分析データをFirestoreのようなデータベースに保存する。

最初の関数を作ってしまえば、その関数が自分の取り組んでいるあらゆる問題を解決できることに気づき始める。

シェア:

https://a.storyblok.com/f/270183/384x384/cd91b5afd9/tom.png
Tom Morris

Polyglot hacker and lifelong student trying a little bit of everything and documenting the experience.