cyb*_*tes 31 amazon-s3 amazon-web-services amazon-iam aws-lambda
我在Lambda函数上从S3 AWS服务获得了acccess denied错误.
这是代码:
// dependencies
var async = require('async');
var AWS = require('aws-sdk');
var gm = require('gm').subClass({ imageMagick: true }); // Enable ImageMagick integration.
exports.handler = function(event, context) {
var srcBucket = event.Records[0].s3.bucket.name;
// Object key may have spaces or unicode non-ASCII characters.
var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
/*
{
originalFilename: <string>,
versions: [
{
size: <number>,
crop: [x,y],
max: [x, y],
rotate: <number>
}
]
}*/
var fileInfo;
var dstBucket = "xmovo.transformedimages.develop";
try {
//TODO: Decompress and decode the returned value
fileInfo = JSON.parse(key);
//download s3File
// get reference to S3 client
var s3 = new AWS.S3();
// Download the image from S3 into a buffer.
s3.getObject({
Bucket: srcBucket,
Key: key
},
function (err, response) {
if (err) {
console.log("Error getting from s3: >>> " + err + "::: Bucket-Key >>>" + srcBucket + "-" + key + ":::Principal>>>" + event.Records[0].userIdentity.principalId, err.stack);
return;
}
// Infer the image type.
var img = gm(response.Body);
var imageType = null;
img.identify(function (err, data) {
if (err) {
console.log("Error image type: >>> " + err);
deleteFromS3(srcBucket, key);
return;
}
imageType = data.format;
//foreach of the versions requested
async.each(fileInfo.versions, function (currentVersion, callback) {
//apply transform
async.waterfall([async.apply(transform, response, currentVersion), uploadToS3, callback]);
}, function (err) {
if (err) console.log("Error on excecution of watefall: >>> " + err);
else {
//when all done then delete the original image from srcBucket
deleteFromS3(srcBucket, key);
}
});
});
});
}
catch (ex){
context.fail("exception through: " + ex);
deleteFromS3(srcBucket, key);
return;
}
function transform(response, version, callback){
var imageProcess = gm(response.Body);
if (version.rotate!=0) imageProcess = imageProcess.rotate("black",version.rotate);
if(version.size!=null) {
if (version.crop != null) {
//crop the image from the coordinates
imageProcess=imageProcess.crop(version.size[0], version.size[1], version.crop[0], version.crop[1]);
}
else {
//find the bigger and resize proportioned the other dimension
var widthIsMax = version.size[0]>version.size[1];
var maxValue = Math.max(version.size[0],version.size[1]);
imageProcess=(widthIsMax)?imageProcess.resize(maxValue):imageProcess.resize(null, maxValue);
}
}
//finally convert the image to jpg 90%
imageProcess.toBuffer("jpg",{quality:90}, function(err, buffer){
if (err) callback(err);
callback(null, version, "image/jpeg", buffer);
});
}
function deleteFromS3(bucket, filename){
s3.deleteObject({
Bucket: bucket,
Key: filename
});
}
function uploadToS3(version, contentType, data, callback) {
// Stream the transformed image to a different S3 bucket.
var dstKey = fileInfo.originalFilename + "_" + version.size + ".jpg";
s3.putObject({
Bucket: dstBucket,
Key: dstKey,
Body: data,
ContentType: contentType
}, callback);
}
};
Run Code Online (Sandbox Code Playgroud)
这是Cloudwatch上的错误:
AccessDenied: Access Denied
Run Code Online (Sandbox Code Playgroud)
这是堆栈错误:
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:329:35)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:596:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:21:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:37:9)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:598:12)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
Run Code Online (Sandbox Code Playgroud)
没有任何其他描述或信息S3存储桶权限允许每个人放置列表和删除.
如何访问S3存储桶?
PS:在Lambda事件属性上,主体是正确的并具有管理权限.
hel*_*loV 35
您的Lambda没有特权(S3:GetObject).
转到IAM仪表板,检查与Lambda执行相关联的角色.如果您使用AWS向导,它会自动创建一个名为的角色oneClick_lambda_s3_exec_role.点击Show Policy.它应该显示类似于附加图像的东西.确保S3:GetObject列出.
Ada*_*zyk 18
我遇到了这个问题,经过数小时的IAM政策疯狂,解决方案是:
完成.您精心编写的IAM角色策略无关紧要,特定的存储桶策略也没有关系(我也写过这些策略以使其工作).或者他们只是不在我的帐户上工作,谁知道.
[编辑]
经过大量的修修补补,上述方法并不是最好的.试试这个:
Run Code Online (Sandbox Code Playgroud){ "Version": "2012-10-17", "Id": "Lambda access bucket policy", "Statement": [ { "Sid": "All on objects in bucket lambda", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AWSACCOUNTID:root" }, "Action": "s3:*", "Resource": "arn:aws:s3:::BUCKET-NAME/*" }, { "Sid": "All on bucket by lambda", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AWSACCOUNTID:root" }, "Action": "s3:*", "Resource": "arn:aws:s3:::BUCKET-NAME" } ] }
为我工作,并不要求您与所有经过身份验证的AWS用户共享(大部分时间都不理想).
ved*_*dat 17
有趣的是,当文件不存在时,AWS返回403(拒绝访问).确保目标文件位于S3存储桶中.
The*_*VTM 15
如果您要指定资源,请不要忘记添加子文件夹规范.像这样:
"Resource": [
"arn:aws:s3:::BUCKET-NAME",
"arn:aws:s3:::BUCKET-NAME/*"
]
Run Code Online (Sandbox Code Playgroud)
如果您对您的S3存储加密设置(如AWS KMS),您可能需要确保角色应用到您的lambda函数的IAM被添加到列表中IAM>加密密钥>区域>键>关键用户进行相应的您用来加密静态 S3 存储桶的密钥。
例如,在我的屏幕截图中,我添加了CyclopsApplicationLambdaRole角色,该角色已作为IAM 中的关键用户应用于我的 Lambda 函数,用于加密 S3 存储桶的同一 AWS KMS 密钥。当您打开加密密钥UI时,不要忘记为您的密钥选择正确的区域。
在 IAM > Encryption keys 中,选择您的区域并单击密钥名称:

在 S3 中指定的密钥的 IAM 加密密钥中添加作为密钥用户的角色:

小智 6
如果所有其他策略鸭子都在一行中,并且该对象不存在并且请求者对该存储桶没有 ListBucket 权限,S3 仍将返回“拒绝访问”消息。
\n\n来自https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html:
\n\n\n\n...如果您请求的对象不存在,Amazon S3\n 返回的错误取决于您是否也具有 s3:ListBucket 权限。
\n\n如果您拥有存储桶的 s3:ListBucket 权限,Amazon S3 将返回 HTTP 状态代码 404(“无此类密钥”)错误。如果您\xe2\x80\x99t\n 没有 s3:ListBucket 权限,Amazon S3 将返回 HTTP\n 状态代码 403(“访问被拒绝”)错误。
\n
| 归档时间: |
|
| 查看次数: |
40231 次 |
| 最近记录: |