Open9

Alexaスキル開発学習メモ

Yuma ItoYuma Ito
Yuma ItoYuma Ito

簡単なスキルは開発者コンソールだけで開発が可能。(Lambdaへのデプロイもできるので本当に楽!)

本格的に開発する際はSDKなどを利用したほうが良さそう。

Yuma ItoYuma Ito

TypeScriptでAlexaスキルを開発する準備を整える。

ちょっと久々だったのでメモ。自分の記事を参考にするけど1年半前だからだいぶ古い。

https://qiita.com/yuma-ito-bd/items/cca7490fd7e300bbf169

TypeScriptのインストール

まずは、package.jsonの作成

npm init

TypeScriptのインストール

npm install --save-dev typescript

tsconfig.json(TypeScriptの設定ファイル)の作成

npx tsc --init
Yuma ItoYuma Ito

ESLintのインストール

npm install --save-dev eslint

ESLintの初期設定

npm init @eslint/config

色々と質問がされるので、プロジェクトの状況に応じて順次回答する。
必要に応じて追加のnpmパッケージをインストールすることができる。

今回は以下のように回答した。

npx: installed 40 in 3.039s
✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · none
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · node
✔ How would you like to define a style for your project? · guide
✔ Which style guide do you want to follow? · airbnb
✔ What format do you want your config file to be in? · JavaScript
Checking peerDependencies of eslint-config-airbnb-base@latest
The config that you've selected requires the following dependencies:

@typescript-eslint/eslint-plugin@latest eslint-config-airbnb-base@latest eslint@^7.32.0 || ^8.2.0 eslint-plugin-import@^2.25.2 @typescript-eslint/parser@latest
✔ Would you like to install them now with npm? · No / Yes

Installing @typescript-eslint/eslint-plugin@latest, eslint-config-airbnb-base@latest, eslint@^7.32.0 || ^8.2.0, eslint-plugin-import@^2.25.2, @typescript-eslint/parser@latest

TypeScriptを用いて、AirbnbのConfig (eslint-config-airbnb-typescript)を採用する場合、追加でパッケージをインストールする。

npm install eslint-config-airbnb-typescript --save-dev

その後、記載されている通りに.eslintrc.jsを編集する。

.eslintrc.js
module.exports = {
  env: {
    es2021: true,
    node: true,
  },
  extends: [
    'airbnb-base',
+    'airbnb-typescript/base'
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
+    project: './tsconfig.json'
  },
  plugins: [
    '@typescript-eslint',
  ],
  rules: {
  },
};

Yuma ItoYuma Ito

Prettierのインストール

https://prettier.io/

npm install --save-dev prettier

Integrating with Linters · Prettier に記載の通り、ESLintとPrettierの設定が競合するので eslint-config-prettierを追加インストール。

npm install --save-dev eslint-config-prettier

.eslintrc.jsに追記。

.eslintrc.js
module.exports = {
...
  extends: [
    'airbnb-base',
    'airbnb-typescript/base',
+    'prettier'
  ],
...
};

Prettierの設定ファイルを作成し、設定。

touch .prettierrc.js
.prettierrc.js
module.exports = {
  trailingComma: "es5",
  tabWidth: 4,
  semi: true,
  singleQuote: true,
};
Yuma ItoYuma Ito

あとはVSCodeの拡張機能をインストールして、設定ファイルを書けばOK!

https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

settings.json
{
    "[typescript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode" // フォーマッタをprettierに指定
    },
    "editor.formatOnSave": true, // ファイル保存時にPrettierでフォーマット
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true // ファイル保存時にESLintでフォーマット
    }
}
Yuma ItoYuma Ito

Allexa hosted skillでコードのデプロイに失敗する

自分で作成したコードをAllexa hosted skillに作成されるLambdaへのデプロイがエラーになってしまった。

エラーメッセージはないので原因が不明。。。

ただ、チュートリアル(コーヒーショップ)で作成した際のpackage.jsonを利用すると正常にデプロイが成功した。

npmモジュールのインストールとかでエラーになっているのか?

package.json
  "dependencies": {
    "ask-sdk": "^2.12.0",
    "ask-sdk-core": "^2.12.0",
    "ask-sdk-model": "^1.37.2",
    "googleapis": "^95.0.0",
    "open": "^8.4.0",
    "server-destroy": "^1.0.1"
  }

試しにgoogleapisを消してデプロイしてみたら成功した。

ここでもAmazonとGoogleが対立しているのか?

自分でLambdaを作成してそこに接続させることにしよう。

Yuma ItoYuma Ito

Alexaスキルを自作のLambda関数でホスティングする

https://developer.amazon.com/ja-JP/docs/alexa/custom-skills/host-a-custom-skill-as-an-aws-lambda-function.html

前述の通り、Alexa hosted skillではなぜかGoogle APIのnpmパッケージをインストールできないので、自分のAWS環境でLambda関数を作成することにした。

1. Lambda関数を作成する

今回はAWSコンソールから作成した。Terraformとかで再度作成してみたい。(Terraformで構築する例

作成したらARNをコピーしておく。

2. Alexaスキルのエンドポイントを設定

開発者コンソールにて、ビルド>カスタム>エンドポイントを開いて、作成したLambdaのARNを入力する。

この状態で「エンドポイントを保存」をクリックすると以下のエラーが発生した。

3. AlexaスキルIDをLambda関数のトリガーにセット

AWSコンソールに戻り、Lambda関数の「トリガーを追加」からAlexaスキルIDを設定する。

もう一度Alexaスキルの「エンドポイントを保存」をクリックすると成功!

Yuma ItoYuma Ito

4. Lambda関数にソースコードをアップロードする

必要ならば環境変数とかの設定も行う

5. Lambda関数のテストを行う(任意)

Lambda関数のテストイベントのテンプレートにalexa-skills-kit-start-session(LaunchRequestを送るイベント)が用意されている。

これを実行して、LaunchIntentの応答が返ってきたらOK!

6. Alexaスキルの開発者コンソールでテスト

Alexaスキルの開発者コンソールに戻り、テストタブからAlexaスキルをテストする。

できたー!!