2017-11-13 31 views
0

ハードコードされたデータ項目をDynamoDBに配置しようとしています。このアップデートを実行するためにAWS SDKオブジェクトを使用しています。そして、以下のコードでは、すべてのデバッグ「はconsole.log」が印刷されつつあるが、最終的に、それはタスクがDynamoDBのに更新なしで3.00秒3.00秒後にタスクがタイムアウトしました - nodeJSを使用したLambdaアプリケーション

後にタイムアウトし印刷し

function updatedb(intent, session, callback) { 
    let country; 
    const repromptText = null; 
    const sessionAttributes = {}; 
    let shouldEndSession = false; 

console.log("In the function"); 
const AWS = require("aws-sdk"); 
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' }); 

var params = { 
    TableName: "Location", 
    Item: { 
     "LocationID": { "S": "11" }, 
     "Country": { "S": "10" }, 
     "Description": { "S": "10" }, 
     "Name": { "S": "10" } 
    } 
}; 
console.log("Param loaded & executing the DocClient Put"); 

docClient.put(params, function (err, data) { 
    if (err) { 
     speechOutput = 'Update failed'; 
     console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2)); 
     callback(sessionAttributes, 
      buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession)); 
    } else { 
     console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2)); 
     speechOutput = 'Update successful'; 
     callback(sessionAttributes, 
      buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession)); 
    } 
}); 
} 

次の項目がすでにありますDynamoDBのこのラムダ関数UE-西-1である(アイルランド) 3)両)DynamoDBの 2の「場所」という名前のテーブルがあります)

1を確認し、このラムダ関数のために割り当てられた役割は、すべての操作を行うことができますこのテーブルに?

{ 
"Version": "2012-10-17", 
"Statement": [ 
    { 
     "Sid": "Stmt1510603004000", 
     "Effect": "Allow", 
     "Action": [ 
      "dynamodb:*" 
     ], 
     "Resource": [ 
      "arn:aws:dynamodb:eu-west-1:752546663632:table/Location" 
     ] 
    } 
] 
} 

どのように私のラムダ関数は、テーブルだけで地域との「場所」を見つけない以下のポリシーの詳細を参照してください - コード等、エンドポイントを持っているように見えないのですか? - ちょうどチュートリアルに基づいて開発されました。

私は行方不明ですか?

お手伝いできますか?

+0

ラムダ関数にタイムアウトが設定されていますか? –

+0

いいえマット - デフォルトタイムアウトは3秒だと思います – mkanywhere

+0

CLIを使用してアイテムを置くことはできますか?あなたはそれを試しましたか? –

答えて

0

AWSは、あなたの身元に基づいて、地域とテーブル名を組み合わせてテーブルを探します。

私は正常にこのコードを使用してテーブルに投稿することができました:

const AWS = require('aws-sdk'); 

const dynamoDB = new AWS.DynamoDB({region: 'us-west-2'}); 

var params = { 
    TableName: "my-table", 
    Item: { 
    "LocationID": { S: "11" }, 
    "Country": { S: "10" }, 
    "Description": { S: "10" }, 
    "Name": { S: "10" } 
    } 
}; 

dynamoDB.putItem(params, (err, data) => { 
    if (err){ 
    console.error(err.stack); 
    } else { 
    console.log(data); 
    } 
}); 

あなたはCLIからテーブルへの実際のポストでできる場合は、少なくとも1つの残りの問題がまだある:それはと思われますDocumentClientクラスを誤って使用しています。 DynamoDB.putItemの構文とDynamoDB.DocumentClient.putの構文が混ざっているようです。

私のコードでは、あなたがやっていることに基づいて直接DynamoDBクラスを使用しています。同じことをすることができなかった理由はありません。そうしないと、あなたは変更する必要があり、あなたのItemオブジェクト:あなたは文字列を挿入する場所地図を挿入しようとしているため

var params = { 
    TableName: "my-table", 
    Item: { 
    "LocationID": "11", 
    "Country": "10", 
    "Description": "10", 
    "Name": "10" 
    } 
}; 

私の推測では、あなたのコードは、現在出てerroringされます。 Cloudwatchを設定している場合は、ログを確認できます。

最後に、あなたのコードにcallbackを使用していません。ラムダを呼び出すクライアントに応答することを意図している場合は、それを行う必要があります。 NodeJSのバージョンによっては、ラムダが有効な応答を返さずにタイムアウトすることがあります。

0

私は同様の問題があったので、関数の先頭にrequireステートメントを入れてみてください。

const AWS = require("aws-sdk"); 
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' }); 
+0

あなたの前にあなたの機能がありますか? – tgf

+0

@tgfはい、私のnode.jsコードは以下のコードで始まります。 var aws = require( 'aws-sdk'); var ses =新しいaws.SES({ 地域: 'us-east-1' }); – sahana2266