Alexaスキルは大きく分けると次の2つから構成される。
- インテントやサンプル発話で構成される対話モデル
- 各インテントを受けて返答を生成するバックエンド
この2つがかみ合ってスキルとして正しく動作する。
対話モデルについてはAlexaコンソールで作るしかないが、バックエンドについてはAlexaサービスとやり取りできれば何で作っても構わない。
その中でLambdaを利用するのが手軽なので、使っているスキルも多いと思う。
素朴にやると、Lambda関数の$LATEST
のARNをそのまま、エンドポイントとしてスキルに設定してしまうがそうするとスキル公開後にアップデートする場合に困ったことになる可能性がある。
この困ったことと、バックエンドがLambdaの場合の私なりの対処方法について書いてみる。
対話モデルとバックエンドの更新タイミングはずれる
バックエンド側は任意のタイミングでデプロイして処理内容をアップデートできる。これはスキルを公開する前はもちろん、公開した後も同様にLambdaをデプロイし直せばアップデートできる1。
一方、対話モデルの方はちょっとでも変更すると再申請しないと公開されない。したがって、対話モデルとバックエンドを同時にアップデートしたくてもどうしても審査の時間の分だけタイムラグが発生する。
いま、すでに公開されているスキルをアップデートする場合を考えてみる。
最初の状態では 対話モデルA+バックエンドv1で動作している。それを最終的にモデルB+バックエンドv2にしたいというケースだ。モデルを変更するので公開には再申請が必要となる。
バックエンドv2にはモデルBへの変更に対応した変更が加えられている。申請を行うと、モデルB+バックエンドv2がAmazonのスキル審査により評価できるようにしなければならない。
しかし対話モデルAとモデルBに設定されたエンドポイントのARNが同一の場合、一般ユーザに公開されている対話モデルは対話モデルAなので、対話モデルAとバックエンドv2の組み合わせでもエラーなく動作しないとエンドユーザがエラーでスキルが使えなくなる。
単純なインテントやサンプル発話の追加程度なら、対話モデルAとバックエンドv2の組み合わせでも動作に問題は生じないだろう。
しかし、対話モデルAにとって破壊的な変更がバックエンドv2に含まれる場合、困る。
破壊的な変更を含めないように注意してバックエンドv2を実装するとか、バックエンドv2を別のLambda関数としてデプロイするとかすれば回避できるが、開発中には対話モデルB+バックエンドv2を目指して実装するので対話モデルAのことを考慮したくないし、このような変更のたびに新しいLambda関数を作っていくのも面倒だ。
では、どうするか?
Lambdaにはバージョンとエイリアス(別名)という機能がある。
作成するとバージョンごと、あるいはエイリアスごとに異なるARNが発行される。
バージョンを作成するとバージョン番号を付けられてその時点の$LATEST
のコードが保存される。ARNの末尾に:<バージョン番号>
を付加すると特定のバージョンを指し示すことができる。なお、バージョン番号は自動的にインクリメントされていく。任意にはつけられない。
エイリアスは任意に名前をつけることができ、そのエイリアスに対応するバージョンを設定する。エイリアスが指し示すバージョンは任意のタイミングで変更できる。$LATEST
を設定しておけば常に最新のバージョンを指し示すこととになる。
特定のエイリアスを指し示すにはARNの末尾に:<エイリアス名>
をつければ良い。
この機能を活用すれば、前述の困ったことは回避できる。
まずは、新規申請でも、既存公開スキルの再申請でも構わないので、バックエンドのエンドポイントにエイリアスを設定している状態にする。
- Lambdaのエイリアスを作成し、 バージョンに
$LATEST
を設定する。 - AlexaスキルのバックエンドのエンドポイントにはこのエイリアスのARNを設定してスキルを申請、公開する。
次の再申請のときには次の手順で申請する。
- 再申請前にLambdaのバージョンを作成し、エイリアスにそのバージョンを設定してバージョンを固定する。
- 新たなエイリアスを作成し、バージョンに
$LATEST
を設定する。 - 対話モデルのエンドポイントに新しいエイリアスのARNを設定して再申請する。
こうすれば、対話モデルAは旧エイリアスで固定されたLambdaバージョンとやり取りして動作し、対話モデルBは最新のLambdaバージョンとやり取りして動作させることができる。しかもLambdaをアップデートすればバックエンドの処理は任意のタイミングで変更することが可能となる。
まとめ
AlexaスキルのバックエンドにLambdaを利用するときにはエンドポイントにエイリアスを設定しておこう。
-
運用上便利ではあるのだけど、公開申請に通ったあと、規約に抵触するような変更もできてしまう。Amazonは何らかチェックをしているのだろうか? ↩