Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Alexa Hostedおさらい&Blueprintsでスキルリリースしてみた / Alexa...
Search
Kuniaki Shimizu
February 28, 2019
Technology
0
550
Alexa Hostedおさらい&Blueprintsでスキルリリースしてみた / Alexa Hosted & Blueprints review
【大阪】スマートスピーカーミーティング 2019/02/28(
https://osaka-driven-dev.connpass.com/event/117481/
) のLTの資料です
Kuniaki Shimizu
February 28, 2019
Tweet
Share
More Decks by Kuniaki Shimizu
See All by Kuniaki Shimizu
RAGのretrievalの評価を “ranx”で行う / Evaluate retrival of RAG using "ranx"
kun432
1
2.6k
VoiceLunchJP#27 Voiceflow Updates 2022 (EN)
kun432
0
170
VoiceLunchJP#27 Voiceflow Updates 2022
kun432
0
170
Voiceflowではじめる音声アプリ・チャットボット開発〜2022年版〜 / Introduction to Developing Voice Apps & Chatbots with Voiceflow
kun432
1
1.3k
VoiceLunchJP#3 VoiceflowでAudioPlayerスキルを作ろう!ハンズオン / VoiceLunchJP3 Alexa's Audio Player Hands-on using Voiceflow
kun432
0
190
Skill Connections やってみた / Introduction to Alexa Skill Connections
kun432
1
1.7k
Skill Connectionsやってみた / Introduction to Alexa's Skill Connection
kun432
0
470
ノンコーディングで始めるAlexaスキル開発 / Introduction to Alexa Skill Development with non-conding
kun432
0
300
Alexaでもparタグ使いたい!〜Alexaで発話とサウンドを並列再生する〜 / Speak with Background Music on Alexa
kun432
0
1.8k
Other Decks in Technology
See All in Technology
転生CISOサバイバル・ガイド / CISO Career Transition Survival Guide
kanny
2
390
『衛星データ利用の方々にとって近いようで触れる機会のなさそうな小話 ~ 衛星搭載ソフトウェアと衛星運用ソフトウェア (実物) を動かしながらわいわいする編 ~』 @日本衛星データコミニティ勉強会
meltingrabbit
0
120
Platform Engineeringは自由のめまい
nwiizo
4
1.9k
現場で役立つAPIデザイン
nagix
29
10k
Kubernetes x k6 で負荷試験基盤を開発して 負荷試験を民主化した話 / Kubernetes x k6
sansan_randd
2
730
SCSAから学ぶセキュリティ管理
masakamayama
0
140
サーバーレスアーキテクチャと生成AIの融合 / Serverless Meets Generative AI
_kensh
12
3k
株式会社EventHub・エンジニア採用資料
eventhub
0
4.2k
WAF に頼りすぎない AWS WAF 運用術 meguro sec #1
izzii
0
460
技術負債の「予兆検知」と「状況異変」のススメ / Technology Dept
i35_267
1
1k
トラシューアニマルになろう ~開発者だからこそできる、安定したサービス作りの秘訣~
jacopen
2
1.5k
2.5Dモデルのすべて
yu4u
2
610
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
The Language of Interfaces
destraynor
156
24k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
310
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
29
2.2k
Producing Creativity
orderedlist
PRO
343
39k
Code Review Best Practice
trishagee
66
17k
Documentation Writing (for coders)
carmenintech
67
4.6k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
おさらい でスキル リリースしてみた
アジェンダ • 自己紹介 • おさらい • おまけ) でスキルリリースしてみた
自己紹介
@kun432 通信事業者系ISPのインフラエンジニア 最近はWiFIのシステム開発・運用全般 - Twitter/Facebook/Github/はてなブログ/Alexa - ポートフォリオ: https://kun432.github.io/ I ❤
Alexa: 8 (JP:7, US:1) Google: 1 Clova: 1 今しがた一つリジェクトされました、、、 個までの道のりは長い、、、
JAWS DAYS 2019に行ってきました。 - コンテナ人気すごい。でもAlexa関連も良かったです。 - Alexaハンズオン最高。資料はQiitaで公開されてます。オススメ。 →「Qiita: CodeStar+Twilio PayでAlexa経由の電話決済を実装する」
(by 岡本さん) - パブリックスペースでの導入事例を作りたい - 導入事例(商店街・ホテル)の現地レポをブログ載せてます。 - Alexa居酒屋、池袋パルコ、名古屋松坂屋、行きたい、、、
おさらい
これまでの スキル開発 開発者コンソール 対話モデル設計 /エンドポイント 設定/公開申請 静的コンテンツ (画像/音声/動画) 永続データ等 アカウント
アカウント バックエンド 実装 エラー時の 解析等 権限、ロー ルの管理
これまでの スキル開発 開発者コンソール 対話モデル設計 /エンドポイント 設定/公開申請 静的コンテンツ (画像/音声/動画) 永続データ等 アカウント
アカウント バックエンド 実装 エラー時の 解析等 権限、ロー ルの管理
これまでの スキル開発 AmazonとAWSの両方のアカウントが必要。 Amazon.comのアカウント持っててハマる。 AmazonとAWSで画面行ったり来たり。 AWSのサービスごとに画面行ったり来たり。 AWSいろいろ知らなくていいことがたくさん出てくる。 - Lambdaでnpmパッケージ追加するならローカル環境必要。 -
S3で静的ファイル扱うにはバケットのCORS設定が必要。 - S3、Alexaからはパブリックアクセス前提? - CloudWatch Logs見にくい。 - DynamoDB、RDBとは違う。 初心者にはやさしくない
そこで
スキルの作成、編集、公開がAlexa開発者コンソール で完結、ブラウザだけあればよい フロントエンド(対話モデル) バックエンド(Lambda相当) ファイルストレージ(S3相当) セッションストレージ(DynamoDB相当) ロギング(CloudWatch Logs相当) AWSアカウント不要、AmazonアカウントだけでOK 権限管理とかない(IAM)
シンプル!
開発者 コンソール 相当 相当 相当 Amazon.co.jp アカウント
None
※カスタムスキルのみ ※ 分程度で作成される
None
None
必ず忘れないで実施!
これだけ
超簡単
さぁ、コードを 書こう!
その前に・・・
特有の やり方や制限がある
今日の本題
おさらい 自分向けまとめ
自分向けまとめ • スキル開発に慣れてくるといろいろやりたくなる。 ◦ 静的ファイル、セッション、 、などなど ◦ ここが最初のハードル • いろいろ調べるけど、情報が多すぎる。
◦ リソース使う前提のものが多い ◦ でそれできるんだっけ? • 楽したい ◦ 使う場合に特化した情報がほしい ◦ コード頻繁に書かないので、コピペで済ませたい • とはいうものの、 ◦ まあ一応 も知って起きたいよね。 ◦ 違いを把握しておけばよい 完全にLGTMなまとめです!
画像、動画、音声、等 静的ファイル使いたい
静的ファイル(これまで) S3でホストが一般的 リージョン選択可能、東京リージョンが一般的 バケットにCORS設定必要 オブジェクトにパブリックアクセス権を付与 コードからは画像、音声、動画それぞれのやり方で呼び出す const imageUrl = 'https://s3-ap-northeast-1.amazonaws.com/xxxxxx/sample.png';
const myImage = new Alexa.ImageHelper() .addImageInstance(imageUrl) .getImage(); const url = 'https://s3-ap-northeast-1.amazonaws.com/xxxxxx/sample.mp4'; return handlerInput.responseBuilder .speak(speechText) .addVideoAppLaunchDirective(url, 'title', 'subtitle') .getResponse();
静的ファイル( ) Alexa Hosted専用のS3でホスト。スキルごとにバケットが用意される。 リージョンは米国東部(バージニア北部)のみ。 → レイテンシー注意 設定変更一切不可(アクセス権付与、バージョニング、暗号化)。 → 逆に言うと何も気にせずアップロードだけで良い
コードからは署名付きURLで呼び出す必要があり。 → 有効時間60秒固定、変更不可。問題になるケースがあるかも? const Util = require('util.js'); ... handle(handlerInput){ const pictureUrl = Util.getS3PreSignedUrl("Media/picture.jpg"); return handlerInput.responseBuilder .speak('画像付きのハローワールドです ') .withStandardCard('card title', 'card text', pictureUrl) .getResponse(); }
静的ファイル( ) const AWS = require('aws-sdk'); const s3SigV4Client = new
AWS.S3({ signatureVersion: 'v4' }); module.exports.getS3PreSignedUrl = function getS3PreSignedUrl(s3ObjectKey) { const bucketName = process.env.S3_PERSISTENCE_BUCKET; const s3PreSignedUrl = s3SigV4Client.getSignedUrl('getObject', { Bucket: bucketName, Key: s3ObjectKey, Expires: 60*1 // the Expires is capped for 1 minute }); console.log(`Util.s3PreSignedUrl: ${s3ObjectKey} URL ${s3PreSignedUrl}`); return s3PreSignedUrl; }
静的ファイル( ) const AWS = require('aws-sdk'); const s3SigV4Client = new
AWS.S3({ signatureVersion: 'v4' }); module.exports.getS3PreSignedUrl = function getS3PreSignedUrl(s3ObjectKey) { const bucketName = process.env.S3_PERSISTENCE_BUCKET; const s3PreSignedUrl = s3SigV4Client.getSignedUrl('getObject', { Bucket: bucketName, Key: s3ObjectKey, Expires: 60*1 // the Expires is capped for 1 minute }); console.log(`Util.s3PreSignedUrl: ${s3ObjectKey} URL ${s3PreSignedUrl}`); return s3PreSignedUrl; } ・util.jsでaws-sdkを使っている ・よいところ - 環境変数からS3のバケット名を とってきている - Github等でコードを公開する場合、 このほうが都合が良い - 普通にLambda使う場合でもこのほう がいいんでは?
静的ファイル( )
静的ファイル( )
静的ファイル( )
静的ファイル( )
セッション使いたい
セッション(これまで) 3種類 Request attributes (1回のリクエスト中) Session attributes (1回のセッション中) Persistent attributes
(セッション跨ぎ) Persistent attributes DynamoDBが一般的(S3でもできなくはない) LambdaのIAMロールにDynamoDBアクセス権付与 DynamoDBPersistentAdapterを使う SkillBuilders内でテーブル名を指定 テーブル自動作成も可(要権限) 読み書きする
セッション(これまで) const Alexa = require('ask-sdk'); ・・・ exports.handler = Alexa.SkillBuilders.standard() .addRequestHandlers(
・・・ .withTableName("sampleTableName") .withAutoCreateTable(true) .lambda(); const Alexa = require('ask-sdk-core'); const Adapter = require('ask-sdk-dynamodb-persistence-adapter'); exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( new Adapter.DynamoDbPersistenceAdapter( {tableName: 'sampleTableName', createTable: true })) .lambda(); (全部入り) を使う場合 (ミニマム) を使う場合
セッション(これまで) async handle(handlerInput) { ・・・ const attr = await handlerInput.attributesManager.getPersistentAttributes();
const info = attr.info; ・・・ } async handle(handlerInput) { ・・・ const attr = await handlerInput.attributesManager.getPersistentAttributes(); attr.info = "foo"; handlerInput.attributesManager.setPersistentAttributes(attr); await handlerInput.attributesManager.savePersistentAttributes(); ・・・ } 読み 書き
セッション( ) • Persistent attributes ◦ DynamoDBは使えない、S3のみ ◦ S3-persistence-adapterを使う ▪
パッケージ追加必須 ▪ バケット名を指定する必要がない ▪ バケット内にユーザIDごとのファイルが作成 される
セッション( ) 必ず実施! npmパッケージを使いたい場合も同じです。
セッション( ) const Alexa = require('ask-sdk-core'); const persistenceAdapter = require('ask-sdk-s3-persistence-adapter');
・・・ exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( new persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET})) .lambda(); .lambda(); 読み書きは 使う場合と同じ
セッション( ) const Alexa = require('ask-sdk-core'); const persistenceAdapter = require('ask-sdk-s3-persistence-adapter');
・・・ exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( new persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET})) .lambda(); .lambda(); 読み書きは 使う場合と同じ ・util.jsを思い出してほしい ・環境変数からS3のバケット名を とってきている
セッション( )
セッション( )
セッション( ) “amzn1.ask.account.〜”というファイルが作成される ユーザID単位であることがわかる 中身を見たい場合はチェックしてダウンロード、テキストエディタ等 で見る(ブラウザからは見れない)
セッション( ) exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( .withPersistenceAdapter( new
persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET, objectKeyGenerator: deviceIdKeyGenerator})) .lambda(); function deviceIdKeyGenerator(requestEnvelope) { if (requestEnvelope && requestEnvelope.context && requestEnvelope.context.System && requestEnvelope.context.System.device && requestEnvelope.context.System.device.deviceId) { return requestEnvelope.context.System.device.deviceId; } throw 'Cannot retrieve device id from request envelope!'; } デバイスごとにセッションを保存したい場合
セッション( ) exports.handler = Alexa.SkillBuilders.custom() .addRequestHandlers( ・・・ .withPersistenceAdapter( .withPersistenceAdapter( new
persistenceAdapter.S3PersistenceAdapter( {bucketName:process.env.S3_PERSISTENCE_BUCKET, objectKeyGenerator: deviceIdKeyGenerator})) .lambda(); function deviceIdKeyGenerator(requestEnvelope) { if (requestEnvelope && requestEnvelope.context && requestEnvelope.context.System && requestEnvelope.context.System.device && requestEnvelope.context.System.device.deviceId) { return requestEnvelope.context.System.device.deviceId; } throw 'Cannot retrieve device id from request envelope!'; } デバイスごとにセッションを保存したい場合 objectKeyGeneratorにIDを生成する 関数を指定する デバイスIDの場合
セッション( ) “amzn1.ask.device.〜”というファイルが作成される デバイスID単位であることがわかる
セッション( ) • Persistent attributes ◦ DynamoDBは使えない、S3のみ → 結果整合性には注意かも ◦
S3-persistence-adapterを使う ▪ パッケージ追加必須 ▪ バケット名を指定する必要がない → 環境変数も勝手に設定されるので便利 → コード内に書く必要がなくて便利 ▪ バケット内にユーザIDごとのファイルが作成 される → デバイスIDも可能、いろいろできる 再掲 DynamoDB高いので普通に Lambda 使う場合でもS3でやればいいという声 もあり
デバッグしたい
デバッグ( )
デバッグ( ) ここはそんなに変わらない。ロググループ探さなくてよいのは楽。
デバッグ( )※余談 ロググループの中を見ると、 codebuild のログが出てて、 AWSリソースがいろ いろいじられるさまが見えて面白い
無料枠について
無料枠( ) アカウントごとに適用 → スキル単位ではない → たくさんスキルを作る場合は注意! 超えた場合は1ヶ月の猶予期間内にAWSに要移行 → 事前に通知が来るらしい
→ エンドポイント変更が必要になるはず?再審査? 詳細は公式サイトを参照
無料枠( ) AWS Lambda - スキルの利用頻度 (時間&回数) リクエスト100万件/月 コンピューティング時間 320万秒/月
AWS CodeCommit - コードのサイズと更新頻度 ストレージ 50 GB Gitリクエスト 10,000件/月 ほとんど問題ないと思うけど、音声・動画ファイルを使う場合と永続 セッションを使う場合は気をつけたほうが良いかも。 Amazon S3 - スキル内からのファイル の利用頻度 ストレージ容量 5GB GETリクエスト 20,000件/月 PUTリクエスト 2,000件/月 データ転送量 15 GB/月
まとめ
まとめ AWSアカウント不要、開発者コンソールで完結する のでとても楽ちん ブラウザだけあればOK、ローカル環境構築不要 ハンズオンとかで良さげ 基本的なことはAlexa Hostedでも全部できる ハンズオンとかで良さげ ハンズオンとかで良さげ 個人レベル・小規模な開発なら問題なし
それ以外はAWSで。
スキルを作って どんどん公開しよう!
None
None
Any questions?
おまけ) でスキルリリースしてみた
None
• 予め用意されたテンプレートから、必要な値だけを変更 して、スキルを作成する。 • テンプレートいろいろ ◦ クイズ ◦ ◦ トリビア
◦ フラッシュブリーフィング ◦ などなど、現在 種類以上 • 現時点( 年 月末) オンリー ◦ アカウントでしか作れない ◦ スキルしかリリースできない
None
• 超かんたん! ◦ テンプレベースだからバグることがない ◦ 本当の意味でスキルの中身に集中できる ◦ テンプレの種類が豊富、ありがちなものはほぼカバー ▪ よくある案内スキルとかならすぐできる
◦ 審査リジェクトの可能性は低い • デメリット ◦ 日本ではまだ使えない(そのうち使えるようになるはず) ◦ 多言語もできない ◦ 凝ったことはできない ◦ 統計情報へのアクセスができない • その他 ◦ テンプレを作って公開できるといいな
None
※楽しかったので 超オススメ!
導入事例レポ
導入事例レポ
None