こんにちは、yutaです。
何をいまさら!そんなことも知らずにやっていたのか!・・・と言われそうですが。。
Dialogflowの学習を進めるうちで、タイトルの通り、外部APIの利用が無料ではできないということを知ったので共有させていただきます。
具体的には、FulfillmentでInline Editorを使ってCloud Function on Firebaseで外部のAPIにリクエストを送ることが、Firebaseの有料プランでなければ実行できないということです。
ですので、私が外部APIを(無料で)利用する場合は、無料利用可能枠を持っている従量課金制プランであるBlazeプランを利用する必要があります。
しかし、具体的にどれだけの利用が無料であるのかがイマイチよくわかりません。
どういうことなのか少しご説明しますね。
FulfillmentのInline Editorで外部のAPIにリクエストを送るとは
たとえば、GoogleHomeに「今日の東京の天気を教えて」と問いかけた時に、GoogleHomeは外部のお天気サイトに問い合わせをして、返ってきた結果を回答するとします。
[char no="1" char="辰生"]OK Google、今日の東京の天気を教えて[/char] [char no="2" char="ロボ"]本日の東京は雨です。最高気温18度、最低気温・・・[/char]この動作と同じものをDialogflowのみで作成する場合に、外部サイトに問い合わせをするという動作はFulFillmentのInline Editorに記述する必要があり、問い合わせ先のお天気サイトが外部API(というURLだと思ってください)で、Inline Editorに書いた一連の処理を実行するのがCloud Function on Firebaseになります。
外部APIサービスにはOpenWeatherMapを利用して情報を取得しようと考えていました。
OpenWeatherMapは有料のAPIですが、無料でも制限付きで利用が可能なAPIです。
制限ありといえども、3時間ごとの更新の情報を5日後まで取得でき、1分間で60回までの呼び出しが可能ということで、無料でも個人利用には十分です。
このOpenWeatherMapのAPIを使うことで、次のような情報で東京の天気を取得することが可能です。
{ "coord":{ "lon":139.76,"lat":35.68 }, "weather":[{ "id":803,"main":"Clouds","description":"曇りがち","icon":"04d" }], "base":"stations", "main":{ "temp":21.02,"pressure":1017,"humidity":55,"temp_min":19,"temp_max":22 }, "visibility":16093, "wind":{ "speed":4.6,"deg":10 }, "clouds":{ "all":75 }, "dt":1540018560, "sys":{ "type":1, "id":7622, "message":0.0064, "country":"JP", "sunrise":1539982294, "sunset":1540022365 }, "id":1850147, "name":"Tokyo", "cod":200 }
※OpenWeatherMapの利用開始にあたっては次のページを参照ください。
無料天気予報APIのOpenWeatherMapを使ってみる
この情報を利用するために、Inline Editorに次のような感じで処理を書いていたのでした。
var host = 'https://api.openweathermap.org'; var path = '/data/2.5/weather?q=' + place + '&lang=ja&units=metric&appid=' + apikey; http.get({host: host, path: path}, (res) => { let body = ''; // var to store the response chunks res.on('data', (d) => { body += d; }); // store each response chunk res.on('end', () => { //取得したデータの処理 }); });
動いていないことに気付いた理由
最初にも書いている通り、Inline Editorの記述はCloud Function on Firebaseで実行されます。
なので、Inline Editorの左下のリンク「View execution logs in the Firebase console」をクリックすると、Firebaseでの実行ログを見ることができます。
そしてログを見てみると・・・
「Ignoring exception from a finished function」と出ています。
どうやら完了したFunctionでエクセプションが無視されているようです。
そして、後処理でConversationに天気の取得結果を渡したはずが、空になっている・・・
少し下を見てみると、次のようなログが出力されているではないですか。
「Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions」
Google翻訳にかけてみると、次のような日本語になりました。
請求先アカウントが設定されていません。外部ネットワークにはアクセスできず、クォータも厳しく制限されています。これらの制限を削除するには、請求先アカウントを設定してください
なるほど、請求先アカウントを設定せよ、つまり、有料プランを設定せよということですね。
このログによって、処理が動いていない原因がプランの制限であると気付きました。
なぜ知らなかったのか
その問いに対する答えは簡潔明瞭、ズバリ次のとおりです。
「私がFirebaseをよく調べずに使っていたから」
Firebaseの料金のページを確認すると、そこには3種類のプランがあります。
使い始めの状態ではプランは無料の「Sparkプラン」で、SparkプランのCloud Functionsのアウトバウンド ネットワーキングには「Google専用」と書かれています。
アウトバウンドとは「外向き」「出ていく」という意味です。
そして、Google専用とは「Google が所有するサービスにのみ」ということです。
Flameプランは、月額固定の$25、Blazeプランは従量課金(使った分だけ支払い)ですね。
Google が所有するサービスとは
では無料で利用できるGoogleの所有するAPIとは具体的に何なのか・・・
ということをきちんと書いてくれているページを探したのですが、わかるページがありませんでした。
おそらく、次のページに掲載されているGoogle製のAPIが対象なのだと思われます。
・Google Cloud Platform APIライブラリ
Blazeプランに登録すると、外部APIが無料で使える?
実はここが私も未だにきちんと理解できていない点なのですが、従量課金のBlazeプランには無料利用枠が存在します。
それは先の料金表の下部にある「Blaze プランの料金計算ツール」でわかるのですが、
この無料利用枠はもちろんCloud Functionsにも適用されるため、次の画像のとおりに紹介されています。
- 2,000,000 invocations:number of times a function is invoked
- 400,000 GB-seconds:time with 1 GB of memory provisioned
- 200,000 CPU-seconds:time with 1 GHz CPU provisioned
- 5 GB:outbound data transfer
とありますね、それぞれ
- 2千万回の関数呼び出し
- 1秒間1ギガバイトのメモリ提供を40万ギガバイト分まで
- 1秒間1ギガヘルツのCPU提供を20万ギガヘルツ分まで
- 5ギガバイト分の外部との通信
であってるのかな?
これが具体的にどれだけのことをやれば消費されるものなのかがわかりにくいですよね。。
塩や水のように見えるものだったらまだわかるのですが・・
とりあえず、数字の桁がすごく大きいので、個人の練習用で使う限りお金が発生することはそうそうないと思って・・・いいのでしょうか。
というところで現在に至る状況です。
みなさんが、同じようなところでハマった時に参考になれば幸いです。
外部APIの利用はおそらく、先に書いたとおり、従量課金制のBlazeプランでも個人の練習用で使う限りは無料枠内のみで作業ができそうですが、もし詳しい方がいらっしゃれば教えていただければ幸いです。
最後まで読んでいただきありがとうございます。
以上になります!
関連リンク
・【Dialogflowの使い方】Fulfilmentを使ってみる(超基礎編)
・【Dialogflowの使い方】機能の説明と基本的な応答の作り方
・【Dialogflowの使い方】Twitterを連繋させる手順
健康を意識する在宅勤務ブロガー。仕事で鬱になりかけて心身を健やかに保つために運動や睡眠が大切だと悟る。大きい犬が好き。
はじめまして。
いやね、これ、以前から通信系のapiを叩くとログに出る
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions
てなwarningを見てて、
そうゆうことじゃないかな、と前々から思っていたのですが、
これまでほとんどの開発案件ではWebhookベースで実装していたので、
FirebaseのInline Editorの方は追求する必要に迫られていませんでした。
それでも、ほんとうにこういうことなら、もっといろんなところでも言及されていてもいいのにな、何か別の理由があるのかな、と思っていたところ、あぁ、やっぱりということで、ちゃんと書いてくれている方がいてスッキリしました。
だって、外部リソースを取ってこれないなんて大問題ですよね。
ありがとうございました。
Jamesさん、コメントありがとうございます。
そうですよね、意外に(日本語での)言及がなくって私も解決に困っていたので、実際に試してみた結果を共有させていただきました。
逆に私はWebhook側を試したことがなかったので、いただいたコメントでWebhookでは同じような問題が発生しないことが知れてよかったです。
お役に立つことができて、幸いです。
yutaさん、
おつかれさまです。
まぁね、ただ厳密にはこれはDialogflowの問題ではなくて、Firebaseの仕様なので、
簡易に組み込みのInline Editorでやろうとすれば、、、、ということですよね。
action-on-google用の便利なリブラリもあるしね。
他方、
Webhookは、何でも自前でやる代わりに、何でもアリってことで。
なにはともあれ、日本語ロケールのボーカロイド、、英語版のようにもうちょっと流暢に喋らないかなぁwww
まぁ、日本語って難しい。。。んだね。