AWS ElasticBeanstalk - S3。拒绝访问

Posted

技术标签:

【中文标题】AWS ElasticBeanstalk - S3。拒绝访问【英文标题】:AWS ElasticBeanstalk - S3. Access Denied 【发布时间】:2021-11-06 19:42:40 【问题描述】:

我正在为我的 nodejs 应用程序使用 elasticbeanstalk。我正在尝试将对象上传到 S3 存储桶并尝试读取对象,但我收到了 AccessDenied 错误。 有线的事情是,我可以从我的本地执行这些操作。所以我认为问题不在于 IAM 用户。但是有了桶里的政策,我却不确定。 我在存储桶中添加了一个策略:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "AddCannedAcl",
            "Effect": "Allow",
            "Principal": 
                "AWS": [
                    "arn:aws:iam::000000000000:user/myuser",
                    "arn:aws:iam::000000000000:role/aws-elasticbeanstalk-service-role"
                ]
            ,
            "Action": "*",
        "Resource": [
            "arn:aws:s3:::my-bucket",
            "arn:aws:s3:::my-bucket/*"
        ],               
        "Condition": 
                "StringEquals": 
                    "s3:x-amz-acl": "public-read"
                
            
        
    ]

但仍然无法使其工作。我还公开了所有内容(我不想要的)只是为了测试,即使这样也无法上传或读取对象。

谁能帮我解决这个问题。我发现 AWS 中的角色和政策真的很难理解。还有任何教程或指南可以在那里学习,这样我就可以提高我在这个主题上的技能?我总是在 aws 中遇到权限问题。

错误:

Error: AccessDenied: Access Denied

async uploadFileToS3(params: any) 
    try 
        const s3UploadResult = await this.s3.upload(params).promise();

        return s3UploadResult;

     catch (error) 
        throw new Error(error);
    


const params = 
                Bucket: 'my-bucket',
                Key: `$new Date().pdf`,
                Body: req.files ? req.files.file.data : file.buffer,
                ACL: 'public-read'
            ;

            const result = await this.awsService.uploadFileToS3(params);

非常感谢!

【问题讨论】:

您究竟是如何测试访问权限的?您是否使用过 AWS CLI?它的形式是什么? mm 我不知道你测试访问是什么意思。我只是想上传图像。在这种情况下,我没有使用 aws cli。我更新了 aws 控制台上的政策。 你的资源应该是"arn:aws:s3:::my-bucket/*" 是的,我有这样的。我用那个更新了我的问题 【参考方案1】:

当您取消保修时,请仔细检查所有政策操作:

"Resource": "arn:aws:s3:::mybuild"

您允许对存储桶本身进行操作,

而不是“在里面”或“在里面的物体上”

要允许您应该使用存储桶内的操作:

"Resource": "arn:aws:s3:::mybuild/*"

如果您需要两者,您可以将您的政策更新为:

"Resource": ["arn:aws:s3:::mybuild","arn:aws:s3:::mybuild/*"]

存储桶策略的几个典型用例示例: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-policies-s3.html

为了学习,我强烈推荐这些文章:

https://hamzahabdulla1.medium.com/aws-iam-identity-vs-resource-policy-abfe099e14d1 https://jayendrapatil.com/aws-iam-roles-vs-resource-based-policies/ https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html

【讨论】:

感谢您的回复!我在资源中添加了 /*,但仍然出现相同的错误。我将使用传递给方法上传和方法的参数更新我的问题,也许这会有所帮助。 好吧,我遗漏了一些东西,最后我需要添加“资源”:[“arn:aws:s3:::mybuild”,“arn:aws:s3:::mybuild/* "]。非常感谢!!

以上是关于AWS ElasticBeanstalk - S3。拒绝访问的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk 拒绝 AWS S3 存储权限

通过 ElasticBeansStalk 上托管的 API Gateway 在 AWS S3 上上传图像

如何在 Elasticbeanstalk 环境中运行的 docker 容器中承担 AWS 角色?

Elastic beanstalk 实例无法访问私有 S3 文件

上传到 S3 之前的 AWS 临时文件?

AWS Elastic Beanstalk / S3 / CloudFront Cache-Control 标头