Lin*_*ang 1 lambda amazon-s3 amazon-web-services node.js
我正在使用 lambda 函数来缩略图 s3 存储桶中的图像。我在这里找到了一个示例:Image conversion using Amazon Lambda and S3 in Node.js。但是,重构代码后,调用 s3.getObject() 时访问被拒绝。我检查了我的 IAM 策略是否错误地授予了权限,但我拥有对 Lambda、S3 和 CloudFront 的完全访问权限。下面是抛出异常的方式:
async.waterfall([
function download(next) {
console.log(srcBucket+ " "+srcKey);
s3.getObject({
Bucket: srcBucket,
Key: srcKey
}, next);
console.log(srcBucket+ " "+srcKey+ "After");
}
], function(err, result) {
if (err) {
console.error(err);
}
// result now equals 'done'
console.log("End of step " + key);
callback();
});
Run Code Online (Sandbox Code Playgroud)
另外,我的 matchng 正则表达式设置与示例相同:
var srcBucket = event.Records[0].s3.bucket.name;
var typeMatch = srcKey.match(/\.([^.]*)$/);
var fileName = path.basename(srcKey);
if (!typeMatch) {
console.error('unable to infer image type for key ' + srcKey);
return;
}
var imageType = typeMatch[1].toLowerCase();
if (imageType != "jpg" && imageType != "gif" && imageType != "png" &&
imageType != "eps") {
console.log('skipping non-image ' + srcKey);
return;
}
Run Code Online (Sandbox Code Playgroud)
我的 Lambda 政策是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
当 Lambda 在尝试使用 S3 时收到访问被拒绝错误时,几乎总是 Lambda 的角色策略出现问题。一般来说,您需要类似这样的内容来授予 Lambda 对 S3 存储桶的访问权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::mybucket",
"arn:aws:s3:::mybucket/*"
],
"Effect": "Allow"
}
]
}
Run Code Online (Sandbox Code Playgroud)