https://a.storyblok.com/f/270183/24385/6ab64d60f5/aws-lambda.jpg

AWS LambdaでSMS to Google Sheetsアプリケーションを構築する

最終更新日 May 13, 2021

所要時間:6 分

このチュートリアルでは、Pythonで書かれたAWS Lambdaを使って、自分のNexmo番号に送信されたSMSメッセージをキャプチャし、Googleスプレッドシートに記録する方法を紹介します。これは、フィードバックの取得、詳細情報の登録、投票の記録、その他あらゆる形式のデータ収集に使用できます。AWSのLambdaとNexmoアカウントでホスティングされた小さなコードの塊があれば、専用のサーバーは必要ありません。

我々はそれをカバーする:

もし飛び込みで参加したいのであれば、いつでもどうぞ。 コードを手に入れる!

なぜラムダなのか?

サーバーレス・テクノロジーは、急速に台頭しつつあるトレンドだ。マイクロサービスの概念と密接に関連するこのアイデアは、ビジネスが望むすべてを行うモノリシックなアプリケーションを構築する代わりに、それぞれが単一の機能を行う個別の小さなアプリケーションを多数構築し、それらを結びつけるというものだ。

このようなマイクロサービスを構築する際の1つの課題は、フル・サーバー・スタック(OS、ウェブ・サーバー、データベース、アプリケーションなど)を実行するためのオーバーヘッドが、大量の作業とコストを追加する可能性があることだ。そこで、クラウド・コンピューティングの新しいトレンドとしてサーバーレス技術が注目されている。 AWSラムダである。Python、Java、Javascriptのいずれかでシンプルな関数を書くことができ、外部APIコールか、S3にアップロードされたファイルのようなAWSの別の部分によって呼び出される。

独自のサーバーを運用する必要がなくなるだけでなく、コストを抑えることもできる。コードの実行時間に対して、100ミリ秒単位で課金されるだけだ。コードの実行時間に対して100ミリ秒単位で課金されるため、少量のデータをバースト的に処理するシンプルな関数であれば、トラフィックの急増に対応できるキャパシティを持ちながら、かなり安価に利用できる。このモデルにより、LambdaはSMSメッセージを受信するアプリケーションを構築するのに理想的なプラットフォームとなる。

AWS LambdaでSMSの着信を記録する

今回のデモでは、Pythonでアプリケーションを書く。Lambdaでは、アプリケーション・バンドルの一部として、好きなサードパーティ・ライブラリを使うことができる。最初のバージョンでは、Nexmoの番号に送信されたSMSを受信し、そのメッセージをLambdaのログに記録します。以下の Video では、最初の Lambda アプリケーションを作成し、Nexmo API から ˶[webhooks](https://docs.nexmo.com/messaging/setup-callbacks) を受信するように設定する手順を説明します。また、[Nexmoアカウント](${CUSTOMER_DASHBOARD_URL}/sign-up?icid=tryitfree_api-developer-adp_nexmodashbdfreetrialsignup_nav)が必要で、このために番号を購入する必要があります。

AWS Lambdaを使い始めるための詳細は、以下のサイトを参照してください。 スタートガイド.

ビデオに収録されている重要なポイントを紹介しよう:

import json

print('Loading function')

def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
return "OK"

という名前の関数を呼び出し、eventというオブジェクトを渡すように設定されている。 lambda_handlerという名前の関数を呼び出し、eventというオブジェクトを渡すように設定されている。このイベントには、API Gateway Integrations Requestでマッピングするパラメータが含まれている。

{
"type" : "$input.params('type')",
"to" : "$input.params('to')",
"msisdn" : "$input.params('msisdn')",
"messageId" : "$input.params('messageId')",
"message-timestamp" : "$input.params('message-timestamp')",
"text" : "$input.params('text')"
}

を返します。 lambda_handlerは単純にイベントデータを受け取り、JSONオブジェクトとしてログに出力します。 OK文字列を返します。この文字列はAPIゲートウェイを通過してNexmoに返されます。

グーグルシーツの設定

上の例はかなり基本的なもので、やっていることはLambdaのログファイルにメッセージを記録することだけだ。

参加者がSMSで素早くフィードバックできるようにしたいイベントのシナリオを考えてみましょう。その情報を保存し、共有するのに最適な方法は Googleシートそして幸運なことに APIがあります。がある。

前回のビデオでは、Googleデベロッパーズコンソール(アカウントを取得してください。 ここからで新しいプロジェクトを作成し、そのプロジェクトのDrive APIを有効にして、Service Account Keyを設定する必要があります。このタイプのアクセスは、サーバー間アプリケーション用に設計されています。LambdaアプリケーションはGoogle Docsに接続する。

サービス・アカウント・キーが作成されると、JSONファイルでダウンロードされた認証情報のセットが提供される。その中のパラメータの一つは client_emailと呼ばれるもので、これはEメールアドレスの形をしています。このアドレスをメモしておいてください。

ログイン グーグルドライブという新しいスプレッドシートを作成します。 nexmosms.このスプレッドシートを、サービス・アカウント・キーに関連するアドレスと共有し、編集権限を与える必要がある。これでLambdaは、あなたと一緒にドキュメントで共同作業をしている別のユーザーのように振る舞います。

GoogleシートへのSMSメッセージの追加

外部APIを使うようになったので、Lambdaのコードはもう少し複雑にする必要がある。サードパーティのライブラリを使うことになるので、ブラウザ上でコードを書くだけでは済まなくなる。その代わりに zipバンドルを作成する必要があります。

これらのコーディング・ステップのビデオは省略する。その代わり、詳しい手順は以下の通りだ。まずは空のディレクトリを作り、そこに lambda_function.py

mkdir nexmosms cd nexmosms touch lambda_function.py

バンドルで使うライブラリは、pipパッケージマネージャを使ってコマンドラインからインストールできる。通常のシステムパスではなく、ローカルフォルダにインストールする必要があります。 -tフラグを使って、カレントディレクトリ pwdをバックスティックで指定できます。ライブラリをパッケージに追加するには nexmoライブラリをパッケージに追加するには、次のコマンドを使います:

pip install nexmo -t `pwd`

使いたい他のライブラリについても、このコマンドを繰り返す必要がある:

pip install oauth2client -t `pwd` pip install gspread -t `pwd` pip install nexmo -t `pwd`

これでライブラリの入ったフォルダができたので、あとはそれらを lambda_function.pyファイルで使うだけだ:

ラムダ関数のコードが少し詳しくなった:

import json
import requests
from time import strftime as timestamp
from oauth2client.service_account import ServiceAccountCredentials
import gspread
import nexmo
from creds import *

最初の部分は、必要なライブラリをインポートするものだが、その中に、pipでバンドルする際に含めなかった、以下のようなものも含まれていることに気づくだろう。 timeなど、pipを使ったバンドルには含まれていないものもあることに気づくだろう。これは、Lambdaが Python 2.7標準ランタイム.

次にGoogle Sheetsへのアクセスを設定し、Nexmo API KeyとAPI Secretをファイルに入力します。以下のコードでは、Xの部分をあなたの詳細情報に置き換えてください。

# Setup access to Google sheets
scopes = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('creds.json', scopes=scopes)
#Nexmo Credentials
nexmo_key = 'XXXXXX'
nexmo_secret = 'XXXXXX"

Google Service Account キーを設定する際にダウンロードした認証情報ファイルは、バンドルに含めるために、名前を creds.jsonにリネームし、バンドルに含める必要があります。

そして addrowという関数をバンドルに追加します:

def addrow(sender, text):
gc = gspread.authorize(credentials)
sheet = gc.open('nexmosms').worksheet("Sheet1")
sheet.append_row([timestamp('%Y-%m-%d %H:%M:%S'), sender, text])

この関数には2つの値が渡される、 senderこれはメッセージを送信した携帯電話番号(MSISDN)である。 textメッセージの本文であるこの関数は gcオブジェクトを作成します。 sheetオブジェクトを作成します。 nexmosmsというドキュメントを開き Sheet1.最後に、そのシートに新しい行を追加します。 timestampを最初のカラムとして追加し、その後に送信者とメッセージ・テキストを追加します。

そして、元のラムダ・ハンドラを更新して、新しい関数を使えるようにする:

def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
addrow(event['msisdn'], event['text'])
client = nexmo.Client(key=nexmo_key, secret=nexmo_secret)
client.send_message({'from': event['to'], 'to': event['msisdn'], 'text': 'Thanks for your feedback!'})
return "OK"

上記のコードでは、デバッグを助けるために、受信したデータをログに表示することに変わりはない。 addrow関数を呼び出している。

次に、公式の Nexmoパイソンライブラリ(を使用します。 を使います。を使って、Lambda関数からメッセージの発信者にレスポンスを返します。私たちは nexmo.Clientインスタンスを作成し client.send_messageインスタンスを作成し fromの番号を、ユーザーがメッセージを送信したNexmoの番号に設定して呼び出します。to'はメッセージを送信したユーザーの電話番号(MSISDN)で、メッセージ本文には textには Thanks for your feedback!.最後に "OK"をNexmo APIに返します。

これだけだ!Nexmoに登録した番号にSMSを送信し、そのテキストメッセージをNexmoのWebhook経由でAWS Lambda関数に送信することができます。Lambdaはメッセージの内容をGoogle Sheetに記録し、返信を送信します。

次の Video では、バンドルのアップロードと、実際に動作するコードのデモをお見せします:

コードを取得する!

すべてのコードのバンドルは、私の GitHub.感想を聞かせてください。 ツイッターの @sammachin.

シェア:

https://a.storyblok.com/f/270183/384x384/7fbbc7293b/sammachin.png
Sam Machinヴォネージの卒業生