質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • AWS(Amazon Web Services)

    2730questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Node.js

    2528questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Lambdaでマップ型のデータをリスト化しDynamoDBへPOSTしたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,560

YumaYamada

score 28

前提・実現したいこと

AWS Lambda(Node.js)+DynamoDBでアプリのバックエンドを開発しています。
現在プレイリストを作成できるアプリを制作しており、その楽曲のデータ(曲名、ジャケット写真、分数、ジャンル、種類)をマップ型で格納し、その楽曲データをリスト型で並べ、DynamoDBへ保存したいです。

発生している問題・エラーメッセージ

CloudWatchを見ると以下のように表示されます。

[UnexpectedParameter: Unexpected key '0' found in params.Item['SongList'].L[0]] message: 'Unexpected key \'0\' found in params.Item[\'SongList\'].L[0]', code: 'UnexpectedParameter', time: Fri Sep 09 2016 02:04:27 GMT+0000 (UTC) } 'UnexpectedParameter: Unexpected key \'0\' found in params.Item[\'SongList\'].L[0]\n at ParamValidator.fail (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:50:37)\n at ParamValidator.validateStructure (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:77:14)\n at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:88:21)\n at ParamValidator.validateList (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:103:14)\n at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:90:21)\n at ParamValidator.validateStructure (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:75:14)\n at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:88:21)\n at ParamValidator.validateMap (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:117:14)\n at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:92:21)\n at ParamValidator.validateStructure (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:75:14)

body-jsonにはクライアント側でPOSTしたデータが渡っていたのが確認できたため、Lambdaでの記入方法が間違っていると考えています。タイムアウト等もありません。

該当のソースコード

Lambdaには以下の形で記入しました

"use strict";
let AWS = require('aws-sdk');

AWS.config.apiVersions = {
    dynamodb: '2012-08-10'
};

let dynamo = new AWS.DynamoDB();


exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));

  var param ={
   TableName: "Playlist",
   Item:{
    "PlaylistName": {S : event["body-json"]["PlaylistName"] },
    "DJName": {S : event["body-json"]["DJName"] },
    "ArtWork": {S : event["body-json"]["ArtWork"] },
    "CategoryId": {S: event["body-json"]["CategoryId"]},
    "DateCreated" : {S : event["body-json"]["DateCreated"]},
    "Description" : {S : event["body-json"]["Description"]},
    "Like" : {N : event["body-json"]["Like"]},

    "SongList" : { 
        L:[
          [{ 
             M: {
           "Avatar":{ S : event["body-json"]["Avatar"]}
               }
            }],
        ]
        },
      },
    };

 dynamo.putItem(param, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

};

POSTの際は以下のようにデータを渡しました。

{
  "DateCreated": "2016-08-17T12:00+09:00",
  "DJName": "MyTestDJ3",
  "PlaylistName": "Happy4",
   "ArtWork": "test.png",
  "CategoryId": "Happy",
   "Description": "testDesc",
   "Like": "0",
   "SongList" : [
       {"Avatar" : "TestAvatar"}
       ]
}

補足情報(言語/FW/ツール等のバージョンなど)

クライアント側でのPOSTはpostmanを使用しています。
AWSはLambda(Node.js4.3),DynamoDB,API GW(POST)を使用しています。

その他不備がありましたらご教示いただけますと幸いです。
以上、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

一先ず自己解決しました。

"SongList": { 
         L:[{M:{"Test" : {S : event["body-json"].SongList["0"].Test}}}
         ]}

上記をPutItemすると以下のように出力されました

"stuff":[
       {"Test" :"Test"}
       ]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ソースコードがどこにも載っていません(載っているのはデータ型ですね)
もう少し質問が具体的だと回答が付きやすいかもしれません

Process exited before completing requestに関してgoogle先生で調べますと、いくつか出てきます

https://www.google.co.jp/search?q=Process+exited+before+completing+request&ie=utf-8&oe=utf-8&client=firefox-b&gfe_rd=cr&ei=nRLSV7vgJIbC9AWI5L7IDg

http://hacknote.jp/archives/11464/

http://hacknote.jp/archives/11416/

私の勝手な想像ですが、現在はわからないことだらけなのではないでしょうか?
目的達成のためには、1歩ずつ進んでいくのが良いかと思います
まずは、Node.jsでHelloWorldから始めるとか
DynamoDBへデータを入れる簡単なプログラムを作るところから開始されてはいかがでしょうか?

質問の回答にはなっていませんが…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/09 11:21

    ご回答有り難うございます。ソースコードの追加変更と、それに伴い別のエラーが出てきましたので、差し支えなければご回答いただけますと幸いです。

    キャンセル

  • 2016/09/09 13:05

    すみません。私の方でnode.jsを使用して、DynamoDBへデータを挿入したことが無いので、直接の原因が特定できないのですが、
    DynamoDBで定義されているデータと、node.jsからputしようとしているデータが一致していないようです

    以下とか参考にしてみてください
    http://qiita.com/inouet/items/b2246d2419daf1788f63
    http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.NodeJs.03.html

    このような複雑なデータよりも、まずは、すごく簡単なテスト用のテーブルなどを用意し、1つカラムに対して、1つのデータを挿入してみるといったstep1から始めた方が良いと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • AWS(Amazon Web Services)

    2730questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Node.js

    2528questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。