こんにちは、サーバーワークスのこけしの人、坂本(@t_sakam)です。
さて、前回の「Alexa虎の巻」の第10回目は「Alexa-hostedスキルでセッション永続性を使用する」の第2回目でした。実際にS3に保存されたデータの確認をしたり「Alexa-hostedスキル内のS3へのアクセス権限はこんな設定になっているんじゃないかな?」ということを想像で確認してみました。
今回のテーマは「Alexa-hostedスキルで他のAWSアカウントのDynamoDBを利用する」です。Alexa-hostedスキルにはDynamoDBが付属していません。ですので、Alexa-hostedスキルを使う時はS3に置いたデータを使うことが多いと思いますが、S3ではなく「DynamoDBにあるデータを使いたい」というパターンもあるかもしれません。
今回は、Alexa-hostedスキルから自分が持っている他のAWSアカウントに接続して、DynamoDBに存在するテーブルをスキャンしてみたいと思います。
まず、今回は他のAWSアカウントに接続して、スキャンできるかの「接続確認」までを行いたいと思います。
1. IAMのマネジメントコンソールへ
AWSのマネジメントコンソールに入り「サービスを検索する」の入力ボックスに「IAM」と入力、「IAM」が表示されたら選択してIAMのマネジメントコンソールに移動します。
2. ロールの作成
左メニューから「ロール」を選択、画面真ん中辺りの「ロールを作成」ボタンを押します。
3. 別のAWSアカウント
「ロールを作成」画面が表示されたら「別のAWSアカウント」を選択します。この設定は後で変更することになります。最終的には、手順15に出てくる「Lambda実行ロールARN」に書き換えますが、この時点ではアカウントIDしか入力できないので、手順15のモザイクの部分のアカウントIDを入力しておきます。この設定をしておけば、この設定したアカウントに関しては、外部でもこのロールを使用することができます。※「Lambda実行ロールARN」の確認方法は手順14と手順15をご確認ください。
入力できたら「次のステップ:アクセス権限」ボタンを押します。
4. ポリシーの作成
「ポリシーの作成」ボタンを押します。
5. DynamoDBのScan権限付与
次の画面でサービスは「DynamoDB」、アクションは読み込みの中から今回の接続テストで利用する「Scan」を選びます。今回は接続テストなので、リソースは「すべてのリソース」を選択しておきます。
「ポリシーの作成」ボタンを押します。
6. ポリシー名の入力
適宜、好きなポリシー名を入力して「ポリシーの作成」ボタンを押します。今回は「MameChishiki」と入力しました。
7. ポリシー作成完了
「MameChishiki が作成されました。」と表示されます。「MameChishiki」の箇所がリンクになっているので、クリックします。
8. ポリシーの確認
ポリシーのJSONを確認すると、きちんとDynamoDBのScanが「Allow」になっていて、リソースが「*」になっていることが確認できます。
9. ロールの作成
「ロールの作成」画面に戻ります。「次のステップ:タグ」ボタンを押します。次のページのタグは適宜入力してください。今回は何も入力せず、進みます。
10. 確認
確認画面で適宜ロール名を入力します。今回は「MameChishikiRole」と入力しました。「ロールの作成」ボタンを押します。
11. 完成
ロールが作成できました。「MameChishikiRole」リンクをクリックします。
12. ロールARNのコピー
後の手順で必要になるので、ロールARNの右端にある「ファイル」アイコンをクリックして、ロールARNをコピーします。この値は、どこかにペーストして控えておきます。
次にポリシー名の「MameChishiki」をクリックします。
13. 「信頼関係」の編集
画面下の「信頼関係」タブを選択し「信頼関係の編集」ボタンを押します。
14. AWS Lambda実行ロールARNをコピーする1
Alexa開発者コンソールの画面を別のブラウザで開きます。「豆知識スキル」を選択し、画面上メニューから「コードエディタ」を選択します。画面左上の「リンク」アイコンをクリックします。
15. AWS Lambda実行ロールARNをコピーする2
「AWS Lambda実行ロールARN」が表示されるので、コピーします。
16. ポリシーにペースト
先程の「信頼関係の編集」画面に戻り、アカウントIDが入力されている箇所に「AWS Lambda実行ロールARN」をペーストします。画面下の「信頼ポリシーの更新」ボタンを押します。
17. コードを編集
Alexa開発者コンソールに戻ります。コードは赤枠のように編集済みです。赤枠以外のところでは「index.js」ファイルの上の方に以下のコードを入れておきます。
const AWS = require('aws-sdk');
赤枠の箇所は以下のようになっています。LaunchRequestHandlerの中に追加のコードを挿入します。
上から3行目のRoleArnのところに手順12でコピーしたロールARNをペーストします。STSについてはまた別の機会にブログにしたいと思います。いったんこれで他のAWSアカウントと安全に接続できるんだなくらいに思っていただけると幸いです。よろしければ、公式の「Alexa-hostedスキルで個人のAWSリソースを使用する」もご確認ください。
「console.log('credentials: ', credentials)」で接続時の情報をCloudWatch Logsに出力します。また、DynamoDBの「MameChishikiTest」というテーブルをスキャンして「console.log('tableData: ', tableData)」でスキャンした内容をCloudWatch Logsに出力します。最後にエラーの出力なく、出力できていたら他のAWSアカウントに接続していることになります。
const message = `こんにちは。${counter}回目のご利用ありがとうございます。`; const STS = new AWS.STS({ apiVersion: '2011-06-15' }); const credentials = await STS.assumeRole({ RoleArn: 'arn:aws:iam::XXXXXXXXXXXX:role/MameChishikiRole', RoleSessionName: 'ExampleSkillRoleSession' }, (err, res) => { if (err) { console.log('AssumeRole FAILED: ', err); throw new Error('Error while assuming role'); } return res; }).promise(); console.log('credentials: ', credentials); const dynamoDB = new AWS.DynamoDB({ apiVersion: '2012-08-10', accessKeyId: credentials.Credentials.AccessKeyId, secretAccessKey: credentials.Credentials.SecretAccessKey, sessionToken: credentials.Credentials.SessionToken }); const tableData = await dynamoDB.scan({ TableName: 'MameChishikiTest' }, (err, data) => { if (err) { console.log('Scan FAILED', err); throw new Error('Error while scanning table'); } return data; }).promise(); console.log('tableData: ', tableData); const speakOutput = message + requestAttributes.t('START_MESSAGE');
18. デプロイ
編集できたら「デプロイ」ボタンを押します。デプロイできたらテストします。 画面上メニューの「テスト」を選択します。
19. テスト
いつものように「豆知識を実行して」と入力してマシンの「Enter」ボタンを押します。
20. ログ: Amazon CloudWatch
テスト結果のログを確認するために、画面左メニュー下の「ログ: Amazon CloudWatch」リンクをクリックします。
21. ログストリーム
CloudWatch Logsの画面が表示されます。ログストリームの中の一番上のリンクをクリックします。
22. 完了
特にエラーが出力されることもなく「console.log('credentials: ', credentials)」、console.log('tableData: ', tableData)」の内容が出力されているので、接続できてますね。
まとめ
今回は「Alexa-hostedスキルで他のAWSアカウントのDynamoDBを利用する」をお送りしました。簡単な設定をすることで、他のAWSアカウントに接続できることがお分かりいただけたのではないかと思います。
Alexa-hostedスキルでもいざとなれば、他のAWSアカウントを利用してDynamoDBやDynamoDB以外のサービスも使うことができますね。
いや〜、「Alexa」って本当にいいものですね!