ask-cliでalexa skillをデプロイした時に自動生成されたIAMロールで、DynamoDBを使えるようにする


絶対忘れるのでメモ。

課題

  • alexa skill一式をask-cliでデプロイし、lambda関数が生成されたので、
    alexa developer Consoleのテスト画面で呼び出してみたが、INVALID_RESPONSEになってしまう。

  • AWS lambdaのManagement consoleから、「amazon alexa start session」をコピーしたテストイベントを実行してみると、「テーブルが作れません」という意味のエラーが出ていた。

AskSdk.DynamoDbPersistenceAdapter Error: Could not create table (テーブル名)
  • lambda 関数を見たら、DynamoDBへのアクセス権限がなかった。omg

  • そういえば、lambda 関数のコード上では以下のように「セッションはDynamoDBに保存する、存在しなければ作成する」と指定していた。
exports.handler = skillBuilder
  .addRequestHandlers(
    LaunchRequestHandler,
  (中略)
  )
  .withTableName("テーブル名") // セッション情報を保存するDynamoDB上のテーブル名
  .withAutoCreateTable(true) // テーブルが無ければスキルから作成する
  .addErrorHandlers(ErrorHandler)
  .lambda();

  • しかし「ask new」でゲットしたサンプルコードの中には、DynamoDBを使う場合のIAMロールの指定箇所がみあたらない。これは一体どこで書くのだろう?

解決策

設定ファイルらしきものを小一時間捜索しましたが見当たらないので、AWSコンソールで直接IAMをいじって解決。

(1) IAMコンソールで自動生成されたロールを探し、権限付与

AWSのコンソール>IAM>ロール を開き、該当のalexaスキル名の頭に「ask-lambda-」がついたロールを探す。

  • 参考)ask-cliでデプロイした場合のスキル名とLambda関数名とロール名の関係
    • スキル名:nightwatch_snow_cli (skill.jsonのmanifest内のnameで指定した文字列)
    • Lambda関数名:ask-custom-nightwatch_snow_cli-default
    • ロール名:ask-lambda-nightwatch_snow-cli

ロール名をクリック
>「ポリシーをアタッチします」ボタンをクリック
>「ポリシーのフィルタ」入力欄に「Dynamo」と入力
>「AmazonDynamoDBFullAccess」にチェック
>「ポリシーのアタッチ」をクリック

(2) Lambda関数を実行し、テーブルに書き込みされるのを確認

Lambda関数のテストイベントを実行。
エラーが出なくなっていることを確認。(違うエラーは出たけど(w)
AWSのDynamoDBコンソールで、テーブルが生成されていることと、
テーブル内にセッション情報が書き込みされていることを確認。

(3) Todo

Lambda関数のコンソールに戻って再読み込みすると、DynamoDBだけでなくEC2なども権限もついている。IAMロールで AmazonDynamoDBFullAccessを選ぶとこうなってしまう。そもそもDynamoDBについてもfullじゃなくていい。後で減らす。

以上でぃす!