tekutoのメモ帳

alexaやらゲームやらその他諸々および掛け算

【0円で超簡単】Alexaスキルのパフォーマンスを70%改善した方法

f:id:tekuto:20210527092501p:plain

今回は、色々なスキルで応用できるパフォーマンス改善の方法についてです。

  • 費用は実質無料

  • コードの修正が基本不要で超簡単

というコスパ最強なので、Alexaスキル開発者は必見です。

効果

このスキルで実験してみました。 シンプルさを謳っているだけあって、パフォーマンスは重要です。 alexa-skills.amazon.co.jp


まずは効果を見てみましょう。
Alexa Developer Consoleの「PERFORMANCE」の「エンドポイントのレイテンシー」のデータをグラフにしました。

f:id:tekuto:20210527092044p:plain

2つの改善を行い、最終的には、p90が1500ms から、460msに減少しました。

それでは実際にやったことを書いていきます。

1. Lambdaのランタイムの更新

シンプル時計では、Node.jsを利用しています。
ランタイムをNode.js12.x から、現時点で最新のNode.js14.x に変更しました。
これで200msの改善です。

基本的には互換性があるので、コードの変更は不要だと思いますが、念のため動作確認はしましょう。 シンプル時計の場合は、呼ばれるはずのないダミーで登録しているIntentが呼び出されるようになってしまったので、そこだけ修正しました。(謎い)

f:id:tekuto:20210523180909p:plain
diff

2. Provisioned Concurrency の設定

aws.amazon.com

Lambdaにはコールドスタート問題というのがあります。 (詳細は調べるとたくさん出てきます。) この問題を解決する機能が2019年の12月に発表されました。
いろいろな理由があって試してなかったのですが、840ms改善という思った以上の効果がありました。

  • 最近はコールドスタート問題が改善されたという話をよく聞いていた
  • そもそもシンプル時計のレスポンスはそんなに遅くないのでは?
  • Lambdaの無料枠が使えない
  • 処理する時以外も起動しておくのがもったいないなぁ

試したきっかけは、Alexa AWSプロモーションクレジットが使いきれなかったと言うだけですw
毎月100ドル分のクレジットがもらえる中で、Provisioned Concurrencyをメモリ:256MB、予約数:1で設定した場合、月3.5ドルくらいなので、実質無料です!

developer.amazon.com

注意点としては、Provisioned Concurrencyを使う場合、aliasの利用が必要っぽいです。
シンプル時計では、Alexa側の設定エンドポイントをLATEST運用(aliasやバージョン指定なし)していたので、スキルの申請が必要でした。 (スキル自体には変更ないので、1営業日でサクッと通りました。)

まとめ

  1. Lambdaのランタイムの更新
  2. Provisioned Concurrencyの設定

を設定して70%のパフォーマンス改善しました。

そして何より、Alexa AWSプロモーションクレジット で毎月100ドルもらえるのはすごいので、まだの人は申し込みましょう。

最後に

プロモーションクレジットはスキル開発を始めた2年前に、一度申請してたのですが、最近までもらえてませんでした。
というのも、最初に申請した時に、AWSアカウントIDが不正(ハイフンが含まれていた)で、適用されてなかったそうです。
(不備があった場合も申請完了のページは表示されるので、直してもらえるといいなぁ)

最近AWS費用がかかるようになり辛くなってきたので、改めて問い合わせてみて発覚。 同じようなケースで貰えてなかった人は是非もう一度申請してみてください!