はじめに
これはC#の話と思わせつつ、実はAlexaスキルをC#で実装して、TelloをAlexa経由で操作するという目標を達成するための道中なので、これはAlexaスキルの話なのです。
これまでに、以下のことをやってきました。
- Alexaスキルを素直にNode.jsを使ってAWS Lambdaにデプロイする
- AlexaスキルをC#で実装してAWS Lambdaにデプロイする
- AlexaスキルをNode.jsを使ってTelloを操作する
そうなれば次は当然これです。
- AlexaスキルをC#で実装してTelloを操作する
Node.jsを使う場合はPC上でスキルの処理部分を動かし、ngrokでインターネット側からアクセスできるようにし、Alexaからのリクエストを受け取って、レスポンスを返すという流れでした。
こんな感じで。
> node index.js
>
> ngrok http 3000
これでPC上で動作するプログラムをスキルのエンドポイントにできました。
ではC#で同じことをやるにはどうしたらよいでしょうか。
C#でサーバーレスな仕組みといえばAzure Functions
です。
Azure Functionsのプロジェクトでスキルのエンドポイントを作成し、それをngrokで外部とつなげる、という流れです。
今回はまずはAzure Functionsをngrokを使ってインターネット側からアクセスできるようにします。
Azure Functionsプロジェクトの作成
ファイル→新規作成→プロジェクト
プロジェクト名はTelloControlCSharpSkill
とでもしておきましょう。ゆくゆくはTelloを操作することになるので。
OKボタンを押したら作成完了です。
実行ボタンを押して実行します。
すると以下のようなコンソールが立ち上がり、Azure FunctionsがPC上で動作を開始します。
コンソールに表示された情報の中に、このFunctionにアクセスするためのURLがあります。
このURLをブラウザのアドレス欄に入力してみましょう。
しかし、これはローカルアドレスなので、インターネット経由でこのFunctionにはアクセスできません。
そこでngrokの出番です。
このAzure Functionsは動かしっぱなしにしておきます。
ngrokの実行
ngrokを実行するためには以下の準備をしなければいけません。
Node.jsをインストールし、ngrokをインストールしたら、ngrokを使ってインターネット側から動かしっぱなしになっているFunctionにアクセスできるようにします。
> ngrok http 7071 -host-header="localhost:7071"
とすると、グローバルなURLとローカルアドレス(ポート番号7071)が結び付けられ、インターネット側からアクセスできるようになります。
このURLはngrokを起動するたびにランダムな文字列が割り当てられます。
ではURLhttps://4743e56d.ngrok.io/api/Function1
をブラウザのアドレス欄に入力してみましょう。
やはり先程と同じページが表示されれば正しく動作していることになります。
これでインターネット側からこのFunctionにアクセスできるようになりました。
ということはPC上でAlexaスキルのエンドポイントを動作させて、Alexaからのリクエストを受け取ってスキルの処理を行うことができるようになったということです。
次はこのFunctionでAlexaからのリクエストを受け取ってレスポンスを返す方法について説明します。