目次
はじめに
Alexa-Hostedスキルを、ASK CLI (Alexa Skills Kit – Command Line Interface)を使って開発する時の注意点を紹介します。
ASK CLIはAlexaスキルをローカル環境で開発できる便利なツールです。しかし、実際の開発ではサーバー環境の開発者コンソールとローカル環境の両方で作業が発生し、最悪の場合は一方の更新が他方の更新で上書きされる可能性があります。
このためASK CLIと開発者コンソールが、どのように成果物を管理・更新しているのか、調査しました。それを元に開発作業に適用すべき利用指針(というには大げさですが)をまとめました。
更新プロセスの説明(推測)に紙幅を費やしていますが、先に結論を知りたい方はこちらを御覧ください。
ベストプラクティスは
いきなりですが、もしベストプラクティスはと聞かれると、
「もしあなたがVisual Studio Code (VS Code)のユーザーなら、ExtensionのAlexa Skills Kit (ASK) Tookitを使いましょう」
と答えます。「CLIじゃ無いじゃないか」と言われてしまいそうですが、あれこれ試行錯誤してみた結果としては、ASK Toolkitの利用が一番問題が少ないようです。
とは言うものの、ASK Toolkitの利用にも注意点はあります。また筆者のようにコマンドラインでの操作が好みの人もいるでしょう。ここではCLIとしての利用を前提に、注意点をまとめてみました。
Alexa Skills Kit (ASK) Toolkitを使った開発については別途紹介したいと考えています。
ASK Toolkitを使った開発については、下記の記事を御覧ください。
- Alexa Skills Kit (ASK) ToolkitとVS Codeでスキルを開発する(前編)
- Alexa Skills Kit (ASK) ToolkitとVS Codeでスキルを開発する(前編)
ASK CLIの管理対象
Alexa-Hostedスキルを作成すると、初期状態では下記の成果物が作成されます。
├── ask-resources.json ├── lambda/ │ ├── index.js │ ├── package.json │ └── util.js └── skill-package/ ├── interactionModels/ │ └── custom/ │ └── ja-JP.json └── skill.json
この中でASK CLIで管理する成果物は大きく以下の2つに分かれます。
- ソースコード(lambda)
- スキルパッケージ (skill-package)
これらの成果物は、何れもGitプロジェクトとして管理されますが、ソースコードとスキルパッケージでは、その管理の仕方に違いがあります。
Gitレポジトリの構成
成果物を入れるレポジトリは、AWS CodeCommitで管理されています。AWSクラウド上で提供されるGitベースのサービスです。クライアント側ではGitツールが使えます。
このレポジトリには、dev
, master
, prod
の3つのブランチが切られています。ローカル環境には、そのうちmaster
, prod
の2つのブランチが、チェックアウトされています。ローカル環境でのデフォルトはmaster
ブランチです。またmaster
, prod
はそれぞれDevelopment
, Live
のステージ(実行環境)と紐付けられています。
ブランチ | ローカル | リモート | ステージ(実行環境) |
dev | ○ | ||
master | ○ | ○ | Development |
prod | ○ | ○ | Live |
ソースコードの管理
ソースコードはGitレポジトリの中で管理されています。index.js
を例に、Gitレポジトリの中でどの様に管理されているか、概要を下図に示します(筆者による推測を含む)。
ソースコードの管理はシンプルです。Gitのオペレーションに慣れていれば、特に問題はないはずです。
ローカル環境での更新
下記のステップでDevelopment
ステージのコードを更新できます。
- U: ローカル環境の
master
ブランチでソースコードを更新 - U: commit/pushの操作でサーバーの
master
ブランチに反映 - S: サーバーの
dev
ブランチにmerge - S:
Development
ステージに反映
U – ユーザー
S – システム (Alexa)
下記のステップでLive
ステージのコードを更新できます。このコードの更新は、スキルの再認定を受ける必要がありません。
- U: ローカル環境の
master
ブランチでソースコードを更新(そしてDevelopment
ステージでテスト) - U: ローカル環境を
prod
ブランチに変更 - U:
master
ブランチの変更をprod
ブランチにmerge - U: commit/pushの操作でサーバーの
prod
ブランチに反映 - S:
Live
ステージに反映
開発者コンソールでの更新
開発者コンソールでは、ソースコードを変更した後、保存
、デプロイ
、公開
の3つの操作ができます(公開はスキルが公開済みの場合のみ可能)。
下記のステップでDevelopmentステージのコードを更新できます。
- U: 開発者コンソールで変更を
保存
- S: サーバーの
dev
ブランチにcommit - U: 開発者コンソールで変更を
デプロイ
- S: サーバーの
master
ブランチにmerge - S:
Development
ステージに反映
下記のステップでProductionステージのコードを更新できます。
- U: 開発者コンソールで変更を
公開
- S: サーバーの
prod
ブランチにcommit - S:
Live
ステージに反映
コンフリクトの解消
Gitのpush/pullで対応できます。
ローカル環境での更新は、Gitのcommit/pushを通してサーバー環境に反映します。
開発者コンソールでの更新は、Gitのpullを通してローカル環境に反映します。このとき開発者コンソールでは、デプロイまで実行しておきます。そうしないと、devブランチとmasterブランチで違いができてしまい、あとでmerge作業が必要になるからです。
スキルパッケージの管理
スキルパッケージには、スキルマニフェスト(./skill-package/skill.json)と、対話モデル(./skill-package/interactionModels/custom/ja-JP.json)が含まれています。これらもソースコード同様にGitレポジトリの中で管理されますが、その更新のプロセスは少し異なります。
skill.jsonを例に、Gitレポジトリの中でどの様に管理されているか、概要を下図に示します(筆者による推測を含む)。 対話モデル(ja-JP.json)の場合も同じです。以下の説明のスキルマニフェストを対話モデルと読み替えてください。
ソースコードの場合と違い、開発者コンソールでの更新がGitに反映されません。このためローカル環境での更新と開発者コンソールでの更新が、コンフリクトを起こす可能性があり、注意が必要です。これについては後述します。
ローカル環境での更新
下記のステップでDevelopment
ステージのスキルバッケージを更新できます。
- U: ローカル環境の
master
ブランチでスキルマニフェストを更新 - U: commit/pushの操作でサーバーの
master
ブランチに反映 - S: サーバーの
master
ブランチの内容を使ってビルドを実行 - S:
Development
ステージに反映
注意が必要なのは、#3, #4のステップです。ビルド時にはスキルマニフェストだけでなく、対話モデルもmasterブランチから取得されます。もし開発者コンソールで対話モデルを更新していた場合は、Gitからの古い内容で上書きされてしまいます。これについては、この後のコンフリクトの解消で詳しく述べます。
ソースコードと違って、スキルマニフェストが直接Live
ステージに反映されることはありません。必ず認定審査を経て反映されます。
開発者コンソールでの更新
開発者コンソールからは、スキルのアクセス権限の設定などで、スキルマニフェストを更新する場合があります。
- U: 開発者コンソールで変更を保存 (例: アクセス権限)
- S: ビルドを実行
- S: Developmentステージに反映
ソースコードとの違いは、更新結果がGitには反映されないことです。開発者コンソールから見えている対話モデルの内容は、Gitとは別の領域で管理されているようです。
コンフリクトの解消
開発者コンソールでの更新がGitに反映されないため、開発者コンソールでの更新後にローカル環境を更新してGitからcommit/pushすると、開発者コンソールでの更新が上書きされてしまいます。
これを避けるためには、開発者コンソールで管理している最新のスキルマニフェストをダウンロードして、ローカル環境のスキルマニフェストを更新する必要があります。下記のコマンドでダウンロードできます。スキルIDは、開発者コンソールのスキル一覧の画面から取得できます。
ask smapi get-skill-manifest -s {skill id}
同じく対話モデルの場合は下記になります。(ロケールは日本語を仮定しています)
ask smapi get-interaction-model -l ja-JP -s {skill id}
ビルド中に上書きされるのは、変更されたスキルマニフェストだけではないことに注意が必要です。対話モデルも上書きされる可能性があります。このためスキルマニフェストをローカル環境で更新する時には、スキルマニフェストと対話モデルの両方を最新化しておく必要があります。同じことは、対話モデルを更新する場合にも当てはまります。
ASK CLI利用時の指針
筆者の場合は、下記のような指針で対応しています。
- ソースコード
- 常にローカル環境で更新し、Gitでサーバー環境にpushします。
- もし開発者コンソールで更新した場合は、Gitでローカル環境にpullします。
- 対話モデル
- 常に開発者コンソールで更新します。スロットなどを使うと定義内容が複雑になり、JSONファイルの直接編集は困難だからです。
- スキルマニフェスト
- 基本は開発者コンソールで更新します。
- 設定項目の中には開発者コンソールからは定義できない項目があり、その場合はローカル環境で更新し、サーバー環境にGitでpushします。
- ローカル環境で更新する前には、対話モデルとスキルマニフェストの両方をサーバー環境からダウンロードして最新化します。
- スキルマニフェストは、対話モデルと違って頻繁に更新するものでは無いので、更新の必要なときだけ、一時的に上記のステップを踏むようにしています。
スキルマニフェストの更新時に、対話モデルの最新化を忘れないでください。もし忘れると対話モデルが古い内容で上書きされてしまい、悲惨な結果となります。
問題が発生するシナリオ
参考までに、上書きが発生するシナリオについて記述します。
下記のシナリオでは、開発者コンソールで対話モデルを変更した後に、ローカル環境でスキルマニフェストを変更しています。この変更をサーバーにpushすると、サーバー環境でビルドのプロセスが走り、Gitに保管されていたオリジナルの対話モデルが使われます。このため開発者コンソールから行った対話モデルへの変更が失われます。
- 初期状態
Local Git | Remote Git | Dev Con | Development | |
index.js | V0 | V0 | V0 | V0 |
skill.json | V0 | V0 | V0 | V0 |
ja-JP.json | V0 | V0 | V0 | V0 |
- ローカル環境でソースコード(index.js)を更新してpush
- スキルパッケージのビルドは発生せず
Local Git | Remote Git | Dev Con | Development | |
index.js | V0 -> V1 | V0 -> V1 | V0 -> V1 | V0 -> V1 |
skill.json | V0 | V0 | V0 | V0 |
ja-JP.json | V0 | V0 | V0 | V0 |
- 開発者コンソールで対話モデル(ja-JP.json)を更新
- スキルパッケージをビルド
- Gitからは更新されないため問題は発生せず
Local Git | Remote Git | Dev Con | Development | |
index.js | V0 | V0 | V0 | V0 |
skill.json | V0 | V0 | V0 | V0 |
ja-JP.json | V0 | V0 | V0 -> V1 | V0 -> V1 |
- ローカル環境でスキルマニフェスト(skill.json)を更新してpush
- スキルパッケージをビルド
- Gitから更新されるため問題発生
- 対話モデル(ja-JP.json)がV1からV0に戻る
Local Git | Remote Git | Dev Con | Development | |
index.js | V0 | V0 | V0 | V0 |
skill.json | V0 -> V1 | V0 -> V1 | V0 -> V1 | V0 -> V1 |
ja-JP.json | V0 | V0 | V1 -> V0 | V1 -> V0 |
おわりに
Alexa-Hostedスキルを、ASK CLI (Alexa Skills Kit – Command Line Interface)を使って開発する時の注意点を紹介しました。
裏で動いている仕組みが判ってしまえば(判ったつもりになれば?)、それほど難しいことではありませんし、不用意な操作で変更を上書きするといった、不幸な事故も避けられるのではと思います。
参考情報
更新記録
日付 | 内容 |
2021/04/27 | ASK Toolkitを使った開発記事へのリンクを追加 |
2021/04/13 | 記述を追加・改良 |
2021/03/31 | 初版公開 |