『今日のゴミ出し』というAlexaスキルを公開しました。
Alexaスキル - 今日のゴミ出し
初めてAlexaスキルを公開してから**失敗した!**と思ったことのひとつに、
「Lambdaのモジュールにバージョンを付けていなかった」
という点があります。
Alexaスキルに限らず、普通に開発する人なら「何を今さら」という感じでしょうが、**「Lambdaとか雰囲気で使ってるんだよね。」**という私のような初学者に向けてAlexaスキル開発を例に取り、AWS Lambdaバージョン管理のススメをまとめます。
Alexaスキル開発とAWS Lambda
なぜAlexaスキル開発時にAWS Lambdaのバージョン管理を推奨するのか。それはバージョン管理をしていない場合、
公開後のアップデートが面倒臭くなるから
です。
Alexaスキル公開後の流れ
Alexaスキル開発ではデフォルトのエンドポイントにAWS Lambda関数のARNを指定します。
自分が開発したAlexaスキルは審査を通過すると自動的にストアに公開されます。それと同時に、スキルの開発バージョンが自動的に生成されます。
スキル公開後にAlexa Skill Kitコンソールを見ると**「公開バージョン」と「開発バージョン」**が表示さていることが分かります。
公開バージョンは閲覧専用で、開発バージョンを使ってスキルをアップデートしていきます。
スキル公開直後、開発バージョンには公開バージョンと同じエンドポイントが指定されています。
開発バージョンだけLambdaを更新したい!
ではこの時Lambdaモジュールを更新して開発バージョンにのみ更新を適用したい場合、どうしたら良いでしょう。
……
Lambdaでバージョン管理をしていない場合、公開バージョンは常に最新のLambda関数を参照しているため、**Lambda関数を新規に作成するしかありません。**環境変数もテストパターンもそっくり同じものを作らなければならないので、とてつもなく面倒くさいです。(AWSコンソールを見る限り「既存の関数をコピーする」といったことはできない気がします。)
AWS Lambdaのバージョン管理
この問題を解決するためにAWS Lambdaでバージョン管理します。
バージョン管理の概要
具体的な手順の前にLambdaのバージョン管理について概要をさらっと記します。
AWS Lambdaのバージョン管理の要点は以下2つです。
- バージョンごとにARN(エンドポイント)が変わる
- 編集できるのは最新バージョン($LATEST)のみ
バージョンごとにARN(エンドポイント)が変わる
AlexaスキルのエンドポイントにはLambdaのARNを指定します。
Lambdaでバージョンを発行するとARNがバージョンごとに一意になります。具体的には一番最後にバージョン番号が付与されます。
例えば最新を示すバージョンであれば**「$LATEST」が末尾に付きます。これはバージョンを付けない場合と同意です。**
一方で過去に発行したバージョンは末尾にバージョン番号が付きます。(以下の例ではバージョン「1」)
これによって公開中のスキルと開発中のスキルに同じLambda関数の異なるバージョンを使い分けることができます。
編集できるのは最新バージョンのみ
Lambda関数の最新バージョンは$LATEST
となり、最新バージョンのみモジュールが更新可能になります。通常のバージョンはコードはもちろん環境変数なども更新は行えず読み取り専用になります。
このためスキル申請のタイミングでLambdaのバージョンを発行しエンドポイントに設定することで**「誤って公開バージョンを変更してしまう」などを防ぐことができます。**
新しいバージョンを発行する
バージョンの発行はとても簡単です。
AWS Lambdaの関数コンソールのバージョンから$LATEST
を選択し**「アクション」=>「新しいバージョンを発行」**をクリックします。
ダイアログが表示されるので**「バージョンの説明」を入力して「発行」**を実行します。
注意点
AWS Lambdaで新しいバージョンを発行すると、新バージョンの**「トリガー」がリセットされるようです。Alexaスキルで利用する場合は新バージョンで「Alexa Skills Kit」**をトリガーに追加して保存しましょう。(トリガーの変更は可能)
まとめ(Alexaスキル開発の流れ)
ということでAlexaスキル開発を例にAWS Lmabdaのバージョン管理のススメでした。
Alexaスキル開発の流れでまとめると、
- Alexaスキル開発
- 公開申請手前でLambdaのバージョン発行
- 発行されたバージョンでARNを修正し、スキルを公開申請する
- 公開後の開発は最新バージョン(
$LATEST
)を使って1に戻る
という感じになります。
以上!