経緯
先日、TypeScriptでAlexaスキルを作ったことについてLTする機会があったので、あわせて(?) alexa-skill-typescript-template というリポジトリでAlexaスキルをTypeScriptで作るテンプレートを公開しました。
AlexaのカスタムスキルはAWS Lambdaを使って開発することが多いかと思うのですが、調べていた限りではなかなかTypeScriptで開発されているドキュメントはあまり多くありませんでした。
自分としてはTypeScriptで開発した方が今までのAWS Lambdaを使った開発の中でも効率が良かったと感じたので、自分が公開しているAlexaスキルの開発でも利用しているもので共有出来る部分をテンプレートとして公開してみました。
(また、2018年4月にリリースされたAlexa Skills Kit SDK v2 for Node.js
は、TypeScriptで開発されており、型定義が元々されているため、AlexaスキルをTypeScriptで作るのは一段とフィットしていると自分は考えています。)
このテンプレートで出来ること
TypeScriptファイルからJavaSctiptファイルへのコンパイル。
コンパイルされたJavaScriptファイルを含めたフォルダをAWS Lambdaの関数としてパッケージング。
AWS SAM ( Serverless Application Model )でAlexaスキルで利用するAWS Lambda関数をはじめとした各AWSリソースのデプロイ。
利用するにあたって必要なもの
TypeScriptのインストール
$ yarn global add typescript
AWS SAM CLIの準備
- AWS SAM CLIのインストール
$ pip install aws-sam-cli
- AWSの認証情報の設定
お使いのAWSアカウントのIAMの認証情報を下記の通り設定します。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-config-files.html
デプロイするLambda関数をアップロードするためのS3バケットの用意
AWS Lambdaの関数としてデプロイする際に、前段階として後述で出てくる $ sam package
というコマンドでAWS Lambdaの関数としてJavaScriptファイルをパッケージングしてS3にアップロードする必要があるため用意します。
主なファイル・フォルダについて
-
skill/src
フォルダ
開発では主にこのフォルダの内容を編集します。-
skill/src/index.ts
AWS Lambdaの関数として使うメインのファイルです。
-
skill/dist
フォルダ
このフォルダはskill/src
フォルダの内容をコンパイルし、必要なパッケージをインストールした状態で格納されます。template.yml
AWS SAMのテンプレートです。
デフォルトではskill/dist
フォルダをAWS Lambdaの関数としてデプロイするよう指定してあります。
(なお、自分のAlexaスキル開発ではスキルで使うDynamoDBも一緒にこのファイルで管理しています。)
使い方
AWSに各リソースをデプロイする場合
$ sam package --template-file template.yaml \
--output-template-file serverless-output.yaml \
--s3-bucket 「アップロード先のS3バケット名」
$ sam deploy --template-file serverless-output.yaml \
--stack-name 「スタック名」 \
--capabilities=CAPABILITY_IAM
※「アップロード先のS3バケット名」と「スタック名」は任意に変更してください。
TypeScriptファイルをコンパイルする場合
$ cd src/
$ yarn build
上記2つをまとめて1度にやる場合
$ sh deploy.sh
※このシェルスクリプト内も「アップロード先のS3バケット名」と「スタック名」は任意に変更してください。