【发布时间】:2019-01-11 00:37:01
【问题描述】:
从 Lambda 函数(无服务器 nodejs)内部调用 S3.waitFor() 函数时遇到问题。我正在尝试使用 S3.putObject() 从一个休息 api 将文件异步写入 Amazon S3,并使用 S3.waitFor() 从另一个休息 api 轮询结果文件以查看写入是否准备好/完成。
请看下面的sn-p:
...
S3.waitFor('objectExists', {
Bucket: bucketName,
Key: fileName,
$waiter: {
maxAttempts: 5,
delay: 3
}
}, (error, data) => {
if (error) {
console.log("error:" + JSON.stringify(error))
} else {
console.log("Success")
}
});
...
给定 valid bucketName 和 invalid fileName,当代码在我的本地测试脚本中运行时,它会在 15 秒(3 秒 x 5 次重试)后返回错误并生成如下结果:
error: {
"message": "Resource is not in the state objectExists",
"code": "ResourceNotReady",
"region": null,
"time": "2018-08-03T06:08:12.276Z",
"requestId": "AD621033DCEA7670",
"extendedRequestId": "JNkxddWX3IZfauJJ63SgVwyv5nShQ+Mworb8pgCmb1f/cQbTu3+52aFuEi8XGro72mJ4ik6ZMGA=",
"retryable": true,
"statusCode": 404,
"retryDelay": 3000
}
同时,当它在 AWS lambda 函数内部运行时,它直接返回结果如下:
error: {
"message": "Resource is not in the state objectExists",
"code": "ResourceNotReady",
"region": null,
"time": "2018-08-03T05:49:43.178Z",
"requestId": "E34D731777472663",
"extendedRequestId": "ONMGnQkd14gvCfE/FWk54uYRG6Uas/hvV6OYeiax5BTOCVwbxGGvmHxMlOHuHPzxL5gZOahPUGM=",
"retryable": false,
"statusCode": 403,
"retryDelay": 3000
}
如您所见,retryable 和 statusCode 值在两者之间是不同的。
在lamba上,当文件不存在时,它似乎总是得到statusCode 403。在我本地时,一切正常(每 3 秒重试 5 次并收到 statusCode 404)。
我想知道这是否与 IAM 角色有关。这是我的 serverless.yml 中的 IAM 角色声明设置:
iamRoleStatements:
- Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
- "sns:Publish"
- "sns:Subscribe"
- "s3:*"
Resource: "*"
如何通过 lambda 函数使其工作? 提前谢谢!
【问题讨论】:
-
你的bucket和lambda函数在同一个区域吗?
-
@MikePatrick 是的,它在同一个地区。顺便说一句,我找到了解决这个问题的方法。它与 S3.headObject() 函数有关。我很快就会发布解决方案。感谢您的努力。
标签: node.js amazon-web-services amazon-s3 aws-lambda serverless-framework