AWS Lambda 및 DynamoDB Null 응답
Lambda 함수에서 DynamoDB 테이블에 쓰려고합니다. 함수를 테스트하면 오류 메시지없이 null이 반환되고 테이블에 아무것도 기록되지 않습니다. 기능은 아래와 같습니다. '제품'테이블에 대한 액세스를 허용하는 권한 정책으로이 기능에 대한 서비스 역할을 이미 설정했습니다. 일부 자습서에서 "AWS Lambda 애플리케이션"을 생성 한 다음 Lambda 함수를 생성하는 방법에 대해 언급 한 적이 있지만 이것이 내 사용에 필요하다고 생각하지 않았습니다.
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = async (event, context, callback) => {
dynamodb.putItem({
TableName: "Products",
Item: {
"sku": {S: "29574839"},
"name": {S: "Test Code"}
}
}, function(err, data) {
if (err) {
console.log(err, err.stack);
return callback(null, {
statusCode: '500',
body: err
});
} else {
return callback(null, {
statusCode: '200',
body: 'Adding to table!'
});
}
});
};
또한 문서 클라이언트를 사용해 const docClient = new dynamodb.DocumentClient();보았는데 "dynamodb.DocumentClient is not a constructor"라는 오류가 발생합니다.
내가 여기서 무엇을 놓치고 있습니까? 감사!
CloudWatch 로그 표시 (요청 ID 제거) : 기능 로그 : START RequestId : 버전 : $ LATEST END RequestId : REPORT RequestId : 기간 : 491.07ms 청구 기간 : 500ms 메모리 크기 : 128MB 최대 메모리 사용 : 87MB 초기화 기간 : 405.37ms
답변
비동기 처리기를 사용하고 있기 때문에 문제는 처리기의 본문이 실행되기 전에 함수가 완료된다는 것입니다.
이를 수정하는 한 가지 방법 Promise은 AWS 문서에 표시된대로를 사용하는 것입니다 . 예를 들면 :
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = async (event, context, callback) => {
const promise = new Promise(function(resolve, reject) {
dynamodb.putItem({
TableName: "Products",
Item: {
"sku": {S: "29574839"},
"name": {S: "Test Code"}
}
}, function(err, data) {
if (err) {
console.log(err, err.stack);
return callback(null, {
statusCode: '500',
body: err
});
} else {
return callback(null, {
statusCode: '200',
body: 'Adding to table!'
});
}
});
})
return promise;
};
위의 변경 사항은 예시 일 뿐이므로 일부 조정이 여전히 필요합니다.