我们有一个需要能够访问私有 S3 存储桶的 Lambda 函数。
存储桶已启用“阻止所有公共访问”和以下资源策略:
{
"Version": "2012-10-17",
"Id": "Policy1620740846405",
"Statement": [
{
"Sid": "Stmt1620740843181",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::'''''':role/integrations-shopifyBucketOrdersFunctionRole-*****",
"arn:aws:iam::'''''':root",
"arn:aws:iam::''''''':user/transalisS3"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket/*",
"arn:aws:s3:::bucket"
]
}
]
}
我还将 AmazonS3FullAccess 策略直接附加到 Lambda 使用的 IAM 角色。 但是,当 Lambda 函数尝试访问 S3 存储桶时,它会给出访问被拒绝的错误:
AccessDenied: Access Denied
使用 IAM 用户凭证连接到 S3 的外部系统在尝试访问存储桶时也会出现相同的错误。
有人知道可能导致此错误的原因吗?
以下是出错的 Lambda 代码:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.bucketOrders = async (event, context) => {
let response = {};
let eventBucket = event.Records[0].s3.bucket.name;
let eventFile = event.Records[0].s3.object.key;
let decodedKey = decodeURIComponent(eventFile);
try {
let objectData = await s3.getObject({
Bucket: eventBucket,
Key: decodedKey,
}).promise();
答案 0 :(得分:1)
在创建 Lambda 应用程序时,有一个选项可以自动生成 IAM 角色,该角色有一个权限边界,附加了无效资源 - 导致一切失败。