当前位置: 首页 > 知识库问答 >
问题:

如何正确设置S3和IAM以将文件上传到S3存储桶?

通煜祺
2023-03-14

我想使用S3托管通过Kotlin Spring Boot应用程序上载的文件。我按照说明使用了各种其他文档,并尝试了一些解决stackoverflow上类似问题的方法。我总是收到403错误。如何设置S3和IAM以便上载文件?我如何找出问题所在?任何帮助都将不胜感激。

我已经激活了访问日志记录,这需要很长时间,而且还没有对我有太大帮助,特别是因为生成日志需要45分钟。忽略状态为200的响应,日志中会出现以下消息(桶代表我的桶的名称):

  • 获取/桶?加密=HTTP/1.1“404服务器端加密配置NotFoundError

我通过

AmazonS3ClientBuilder.defaultClient()

我检查了实现,它从我设置的环境变量中检索凭据。

要提交文件,我在S3Service实现中使用以下方法:

private fun uploadFileToBucket(fileName: String, file: File) {
    s3client.putObject(
            PutObjectRequest(bucketName, fileName, file)
                    .withCannedAcl(CannedAccessControlList.PublicRead)
    )
}

这是我对IAM用户的策略(用户从组继承策略):

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:PutAccountPublicAccessBlock",
            "s3:GetAccountPublicAccessBlock",
            "s3:ListAllMyBuckets",
            "s3:HeadBucket"
        ],
        "Resource": "*"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket",
            "arn:aws:s3:::bucket/*"
        ]
    }
]

}

这就是bucket策略:

{
    "Version": "2012-10-17",
    "Id": "PolicyId",
    "Statement": [
        {
            "Sid": "StmtId",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account:user/username"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket"
        }
    ]
}

最后,我希望能够将文件放入存储桶并提供对这些文件的公共访问。例如,我想从Angular应用程序上传图像,通过我的Spring Boot应用程序上传它们并将它们显示在Angular应用程序上。现在我甚至无法通过Postman上传它们而不会出现403错误。

共有2个答案

幸弘扬
2023-03-14

正如Mark B所指出的,IAM策略可以缩短,并且存储桶策略无论如何都不需要。但是,上传文件适用于这些设置和修改后的设置。我的代码和S3配置中的问题是我试图修改ACL而不允许它在我的存储桶中。正如我在下面的屏幕截图中标记的那样,必须禁用阻止新的公共ACL,否则服务器根据定义以403响应。

杜良骏
2023-03-14

IAM政策可以缩短为:

{
 "Version": "2012-10-17",
 "Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket",
            "arn:aws:s3:::bucket/*"
        ]
    }
 ]
}

换句话说,第二条语句提供了完全的S3访问权限,因此IAM策略中的第一条语句毫无意义。

您的桶策略可能有问题。很难说,因为我认为您已经用占位符替换了几个值。但是,在这种情况下,您根本不需要桶策略。我会删除它。

 类似资料:
  • 如果有人帮我解决这个问题,我会非常感激。 我正在为我的项目使用codeigniter框架。并想将我的图像上传到amazon s3桶中。当我尝试使用S3.php文件时 string(92)“不支持您提供的授权机制。请使用AWS4-HMAC-SHA256。” 有人能帮我解决这个问题吗。

  • 我正在使用amazon s3 android低级sdk上传文件,并希望设置md5校验和来上传数据。 1)以下是创建凭据的代码: 2)以下是计算md5的代码 } 3)以下是使用元数据设置md5的代码: 但是当我设置md5时,amazon抛出了一个异常: 原因:com.amazonaws.services.s3.model.AmazonS3Exception:匿名用户无法发起多部分上传。请进行身份验证

  • 有没有一种方法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS帐户中。我可以使用aws cli命令一次复制一个文件: 然而,我有1000份文件要复制。我不想复制源存储桶中的所有文件,因此无法使用sync命令。有没有一种方法可以用需要复制的文件名列表来调用一个文件,从而自动化这个过程?

  • 问题内容: 我想使用python复制s3存储桶中的文件。 例如:我的存储桶名称=测试。在存储桶中,我有2个文件夹名称为“ dump”和“ input”。现在,我想使用python将文件从本地目录复制到S3“转储”文件夹…有人可以帮助我吗? 问题答案: 尝试这个… [更新]我不是pythonist,所以感谢您对import语句的注意。另外,我不建议将凭证放在您自己的源代码中。如果您在AWS内部运行此

  • 问题内容: 我认为,当jenkins构建静态网站时,我有一个简单的用例,因此在构建结束时,我有一个类似于$ WORKSPACE / site-result的文件夹。 现在,我想将此文件夹上传到S3(如果已有存储,请清理存储桶)。我该怎么做? 我正在使用管道,但是如果需要可以切换到自由样式项目。到目前为止,我已经安装了S3插件(S3发布者插件)。已创建IAM用户。向“配置系统”部分添加了凭据。并且找

  • 我用的是fs。readFile读取大约700KB的本地mp4文件,AWS SDK将文件加载到我的S3存储桶中。这个过程是可行的,但文件已损坏,可能是因为S3上生成的文件大小仅为500KB左右而被截断。 我使用的代码可以很好地处理图像。只是不适用于mp4文件。这是我的代码: 我已尝试从params对象中省略ContentEncoding和/或ContentType属性。 编辑: 因此,当我conso