https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-use-azure-functions-with-python-dr/Azure-Functions-Python_1200x675.jpg

PythonでAzure Functionsを使う方法

最終更新日 November 9, 2020

所要時間:12 分

Vonageでは、APIをできるだけシンプルに使えるように努めています。しかし、1つ厄介なことがあります。 Vonage Voice APIのように、私たちのAPIの多くは、通話中にあなたのアプリに何をするかを尋ねる必要があります。つまり、独自の サーバー.それとも?

Azure Functionsでサーバーレスを実現する

マイクロソフトが提供する Azure Functionsのサポートを提供している!多くのサポートが提供されており、すぐに使い始めることができます。 requirements.txt.Pythonで小さなスタンドアロン関数を書いて、それをAzureクラウドに簡単にデプロイできる。

無料ティアには 百万関数の実行を月100万回無料で提供する。小規模なデモアプリや小規模な本番アプリには十分だろう!

機能的になろう

Azure Functionsでホストされた2つのWebhookを使って、シンプルなVonageアプリを構築する方法を紹介しよう。ユーザーがVonageの電話番号に電話をかけると(これが最初のWebhookのトリガーとなる)、ロボットの声で挨拶されるというものだ。ユーザーは自分の気分を入力するよう求められる。ハッピー」なら1、「アンハッピー」なら2、その他好きなオプションを入力する。この時点で、2番目のエンドポイントが入力とともに呼び出され、適切なレスポンスが生成される。

必要なコードとコンフィギュレーションを作成するすべてのステップを説明するが、最終的な結果をご覧になりたい場合は、コードはホスティングされている GitHub

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.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

必要条件

以下のように、いくつかの いくつかセットアップやインストールに必要なものがいくつかありますが、私を信じてください。

  • フリー Azureアカウントで、Azure Functionsを公開できます。

  • インストール Vonage CLIツールそして この短いブログ記事をお読みください。

    これにより vonageこのコマンドを使うと、Vonage Voice Applicationsを作成したり、バーチャルナンバーを購入したり、この2つをリンクさせたりすることができます。

  • インストール ングロック

    コンソールで ngrokコマンドを実行すると、開発マシンにリクエストがトンネルされ、Vonage が開発サーバにウェブフックを送信できるようになります。

  • インストール Azure Functionsコアツール

    これにより、コンソールで funcこのコマンドを使うと、Azure Functions プロジェクトをブートストラップし、ローカルで実行することができます。

  • インストール Azure CLI.

    これで azコマンドを使えるようになる。これで、Azure内に様々なオブジェクトを作成したり、Azure関数を公開したりできるようになる!

最初の関数を作成する

上記の要件をすべてインストールしたら、コンソールを開いてください。Azureファンクションのビルドを開始するために、いくつかの定型コードを作成します。

まず、Azure Functions Core Toolsコマンドを使って、新しいAzure Functionsプロジェクトを作成しましょう、 func.を実行します。 func initを実行して、空の Azure Functions プロジェクトを作成します:

func init enter-your-mood Select a worker runtime: 1. dotnet 2. node 3. python 4. powershell (preview) Choose option: 3 python Writing .gitignore Writing host.json Writing local.settings.json Writing /Users/mark/Documents/Development/nexmo/azure_webhooks/enter-your-mood/.vscode/extensions.json

新しいプロジェクト・ディレクトリにcdして func newを使って、着信コールに応答するための新しいAzure関数を作成する。作成する関数のタイプを聞かれるので、'5' の HTTP trigger を選択する。これは、HTTPリクエストに応答するAzure関数のタイプです。ファンクションの呼び出し名を聞かれたら、次のように入力します。 answer_inboundと入力する。これは、エンドポイントがインバウンドコールに応答するために使用されるからだ。

cd enter-your-mood func new Select a template: 1. Azure Blob Storage trigger 2. Azure Cosmos DB trigger 3. Azure Event Grid trigger 4. Azure Event Hub trigger 5. HTTP trigger 6. Azure Queue Storage trigger 7. Azure Service Bus Queue trigger 8. Azure Service Bus Topic trigger 9. Timer trigger Choose option: 5 HTTP trigger Function name: [HttpTrigger] answer_inbound Writing /Users/mark/Documents/Development/nexmo/azure_webhooks/enter-your-mood/answer_inbound/__init__.py Writing /Users/mark/Documents/Development/nexmo/azure_webhooks/enter-your-mood/answer_inbound/function.json The function "answer_inbound" was created successfully from the "HTTP trigger" template.

上の出力から funcがPythonファイル __init__.pyと設定ファイルが作成されていることがわかります、 function.json.

編集する function.jsonを編集し、"authlevel "を "anonymous "に設定する。これでVonageは余計な認証なしで呼び出せるようになる。

{
    "scriptFile": "__init__.py",
    "bindings": [
    {
        "authLevel": "anonymous",
        "type": "httpTrigger",
        ...

Pythonの定型関数を実行する。 func hostコマンドを使って実行する:

# Run the functions locally: func host start

ブラウザを URL でロードすると http://localhost:7071/api/answer_inbound?name=bobでブラウザをロードすると、"Hello bob!" と表示されるはずです!あなたは最初のAzure Functionを "書きました"!

Azure関数から電話へ

誰かがあなたの番号にダイヤルしたときにVonageが何をすべきかを知るために、あなたの関数にNCCOアクションを出力させたいでしょう。そのためには、関数コードを以下のように置き換える必要があります:

def main(req: func.HttpRequest) -> func.HttpResponse:
    return func.HttpResponse(json.dumps([
        {
            'action': 'talk',
            'text': 'Welcome to the mood reporting hotline. Please enter 1 if you are happy, or 2 if you are unhappy.',
            'bargeIn': True,
        },
        {
            'action': 'input',
            'eventUrl': [ f'https://{req.headers["host"]}/api/mood_feedback' ],
            'maxDigits': 1,
            'timeOut': 10,
        },
    ]), mimetype='application/json')

上記のコードは、2つのNCCOアクションを含むJSONレスポンスを返す。NCCOアクションとは、Vonageに対する命令で、電話の処理方法を指示するものである。この場合、2つのアクションがある:

  • この talkアクションは、発信者にメッセージを読み上げるようVonageに指示します。

  • この inputアクションはVonageに、ユーザーが数字を入力するよう指示します。 eventURL

なぜなら bargeIntrueアクションで talkアクションで inputに設定しているので、アクションが開始される前に発信者が数字を入力すると、Vonageは単にせっかちなだけだと判断し、次の命令を実行する。 input命令を実行する。

もう一度 func host startを再度実行すると http://localhost:7071/api/answer_inbound?name=bobでブラウザーをロードすると、上記のアクションを含むJSONの束が表示されるはずだ。

開発サーバーへのトンネル

まだ開発中ですが、Vonageがあなたの関数にアクセスできるようにしたいでしょう。私の同僚である アーロン・バセットが書いた Ngrok トンネルを使ってローカルの開発サーバーを Vonage API に接続する。.

Ngrokがどのように機能するかはお分かりいただけたと思う。 別のを実行する:

ngrok http 7071

別のコンソールウィンドウで func host startもう一つのコンソールウィンドウで、出力されたNgrok URLをロードし、その後に続く /api/answer_inbound.のように表示されるはずです。 https://r4nd0m.ngrok.io/api/answer_inbound(ただし、r4nd0mではなく、あなた自身のランダムなプレフィックスを付けてください!)。

それがうまくいったら、今度はVonageに開発サーバーとの連絡方法を伝える番だ!

Vonageを開発サーバーに接続する

まだの場合は、インストール後、Vonage CLIにapiキーとシークレットを設定する必要があります。

vonage config:set --apiKey=XXXXXX --apiSecret=XXXXXX

を実行して新しいVonage Voice Applicationsを作成します。 vonage apps:createを実行し、プロンプトが表示されたら "Enter Your Mood "と名前を付けます。残りのコマンドラインプロンプトに従ってアプリケーションを作成します。

vonage apps:create

これにより、Vonage API Dashboardに "Enter Your Mood "というアプリが作成されます。このアプリにリンクされた電話番号への着信が検出されると、このアプリは以下のWebhookを呼び出します。 https://r4nd0m.ngrok.io/api/answer_inboundを呼び出し、着信コールの詳細を投稿する。このエンドポイントのAzure Functionは、NCCO Actionsで応答することが期待されている。秘密鍵も保存されている。今は使わないが、"private.key "というファイルに保存されている。

バーチャル番号を購入し、Vonageアプリにリンクする必要があります。そこで、先ほど作成されたアプリケーションID(ここでは「4f33ff5e-dbbc-11e9-8656-6bdabe7b8258」)を控えておく。

バーチャルナンバーをまだ持っていない場合は、購入する。購入するには Vonage APIダッシュボードでも でもVonageのCLIツールを使って番号を検索し、購入することもできます。番号を入手したら、以下のコマンドでアプリとリンクさせる。電話番号は購入したもの、アプリケーションIDは上記で説明したものに置き換える:

vonage apps:link [APPLICATION_ID] --number=number

あなたの携帯電話で、先ほどリンクした番号に電話をかけてください。

何が起こるか:Voiceが応答し、上記のメッセージが表示されます。携帯電話の番号パッドに番号を入力すると、おそらくビープ音が鳴った後、通話が切れます。それは 2番目ののURLは /api/mood_feedbackはまだ存在しないからだ!

入力処理

この場合は、上記と同様の手順を踏む:

  • 実行する func newを選択し HTTP triggerを選択し、関数名に "mood_feedback "と入力してください。

  • ファイルを修正する。 function.jsonファイルを修正し authLevelanonymous.

次に __init__.pyを開き、関数コードを次のように置き換える:

def main(req: func.HttpRequest) -> func.HttpResponse:
    try:
        req_body = req.get_json()
        return func.HttpResponse(json.dumps([
            {
                'action': 'talk',
                'text': 'Thank you for telling us how you feel.',
            },
        ]), mimetype='application/json')
    except ValueError:
        return func.HttpResponse(
            "Could not parse request body.",
            status_code=400
        )

ここには、電話から送信されたデータを抽出するためのコードが少し追加されている。 今度は通話中に番号を入力すると、"Thank you for telling us how you feel. "というメッセージが聞こえるはずだ。

レスポンスをダイナミックにする

これがうまくいったら、呼び出しに対する反応がもう少し共感的になるようにしてみよう。関数の上に、以下のグローバル変数を追加する:

RESPONSES = {
    "1": "It's great that you're so happy!",
    "2": "I'm sorry that you're unhappy.",
}
UNEXPECTED_RESPONSE = "I'm sorry, I don't understand that feedback."

さて、返すNCCOの中で、文字列を次のように置き換える。 RESPONSES.get(req_body['dtmf'], UNEXPECTED_RESPONSE).この式はリクエスト(req_body['dtmf'])からDTMFコードを抽出し、関連する応答を RESPONSESで関連する応答を探そうとする。 UNEXPECTED_RESPONSE.あなたの番号に電話して試してみてください!

Azureでファンクションアプリを作成する

あなたがこれまでやってきたことは 素晴らしい- 開発マシンの電源が入っていて、コンソールウィンドウが開いていて func host& ngrok.しかし、それは現実的ではない。そこで今回は、書いたコードをAzure Functionsにデプロイして、Microsoftがホストしてくれる方法を紹介しよう!

Azureのサーバーとやりとりするには、Azure CLIコマンドを使う、 az.

まず、Azureアカウントにログインする必要があります。 az login.ブラウザが起動し、Azureアカウントにログインするよう求められます。まだAzureアカウントにサインアップしていない場合は、今すぐサインアップしてください。

# Connect `az` to your Azure account: az login

では、以下の3つの azそれぞれのコマンドにコメントをつけているので、何をするのかがわかるだろう。変更する必要があるのは MYVONAGEFUNCTIONSTOREをグローバルにユニークなものに置き換えることだ。実際の名前は重要ではありません - 実行中の関数のデータを保存する場所であり、ユーザーに見られることはありません。また moodfeedbackappをグローバルにユニークなものに変更する必要があります。

# Create a resource group. (This is analagous to a Vonage 'Application'): az group create --name myResourceGroup --location westeurope # Create a storage account for storing your function data: az storage account create --name "MYVONAGEFUNCTIONSTORE" \ --location westeurope --resource-group myResourceGroup \ --sku Standard_LRS # Create a function app for grouping your functions together: az functionapp create --resource-group myResourceGroup --os-type Linux \ --consumption-plan-location westeurope --runtime python \ --name "moodfeedbackapp" --storage-account "MYVONAGEFUNCTIONSTORE"

関数をAzureに公開する

func azure functionapp publish moodfeedback --build remote Getting site publishing info... Creating archive for current directory... Perform remote build for functions project (--build remote). Uploading 6.08 KB [##################################################################] Remote build in progress, please wait... Updating submodules. Preparing deployment for commit id '5bfe469a6e'. Running oryx build... Writing the artifacts to a Squashfs file Parallel mksquashfs: Using 1 processor Creating 4.0 filesystem on /home/site/deployments/20190919110956.squashfs, block size 131072. ... Remote build succeeded! Syncing triggers... Functions in moodfeedback: answer_inbound - [httpTrigger] Invoke url: https://moodfeedback.azurewebsites.net/api/answer_inbound mood_feedback - [httpTrigger] Invoke url: https://moodfeedback.azurewebsites.net/api/mood_feedback

関数が正常にデプロイされているかどうかは、次のページで確認できます。 https://moodfeedback.azurewebsites.net/api/answer_inbound(にアクセスし、NCCO JSON出力が生成されていることを確認してください。

Vonageアプリのアップデート

Vonageは、誰かがあなたのバーチャル番号に電話したとき、あなたの開発サーバーを呼び出すべきだとまだ考えています!これを修正するには、新しいURLを指すようにVonageアプリを更新してください。次のコマンドを実行し、アプリケーションIDをあなた自身のものに置き換え、"moodfeedbackapp "をあなた自身の機能アプリ名に置き換えてください。

nexmo app:update 4f33ff5e-dbbc-11e9-8656-6bdabe7b8258 "Mood Feedback" "https://moodfeedbackapp.azurewebsites.net/api/answer_inbound" "https://api.example.org/events" --answer_method POST

次のステップ

このチュートリアルの目的は、Azure Functionsを使ってVonage Voice API呼び出し用のWebhookハンドラを構築する方法を紹介することでした。この例でできることはそれほど多くはありませんが、Azureストレージやその他のAPIを使えば、もっと面白く実用的な例を構築できるでしょう。

アプリに面白い機能を組み込みたいなら、そうすればいい:

  • フィードバック結果をVonage SMS API経由でリサーチャーに送信。

  • 音声入力APIを統合し、数値コードの代わりに音声入力を扱う。

  • 各通話者のフィードバックをデータベースに保存し、長期的な傾向を分析する。

その他のリソース

シェア:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Mark Smithヴォネージの卒業生

マークはNexmoのクライアント・ライブラリの名目上の責任者である(ただし、彼が書いているのはPythonとJavaのライブラリだけである)。もともとはJavaの開発者だったが、18年間Pythonの開発者であり、最近はGoやRustにも手を出している。プログラミング言語の限界に挑戦し、そのテクニックを他のプログラマーに教えるのが好きだ。バイキングの帽子をかぶっているがバイキングではない。