【问题标题】:Why am I able to upload to AWS S3 from my localhost, but not from my AWS Elastic BeanStalk instance?为什么我可以从本地主机上传到 AWS S3,但不能从我的 AWS Elastic BeanStalk 实例上传?
【发布时间】:2018-05-02 21:13:09
【问题描述】:

我正在使用 AWS Credentials* 连接到我的 AWS S3。

final AmazonS3 s3 = new AmazonS3Client(
                  new AWSStaticCredentialsProvider(new BasicAWSCredentials("accessKey*",
                      "secretKey")));
              s3.setRegion(Region.US_West.toAWSRegion());
              s3.setEndpoint("s3-us-west-1.amazonaws.com");

从我的本地主机,我可以上传图片,因为我启用了版本控制,我得到 versionId 用于下一行。

versionId = s3.putObject(new PutObjectRequest("bucketName", name, convFile)).getVersionId();

PS 3:上面的代码被包装在一个 try-catch 块中,并且 catch 块打印出这个

 You failed to upload fileName => fileName.jpeg (Permission denied)

但是,如果我从 ElasticBeanStalk 执行相同的代码,我会得到 versionId=null 并且图像不会上传到 S3。

我没有看到凭据异常。

    • 当我在用户(在 IAM 下)中搜索 accessKey 时,我意识到它没有分配给任何用户。

阅读所有文档后,我创建了两个用户。 一个在我创建的组下,另一个没有组。

我使用了这些用户的 accessKey,但我仍然无法将图像上传到 S3。

这就是我的存储桶策略的样子 创建两个用户后

{
    "Version": "2012-10-17",
    "Id": "Policy1",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::someNumnber:user/username"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucketName"
        }
    ]
}

在创建两个用户之前(当 localhost 成功将图像上传到 S3 时进行了以下设置)

{
    "Version": "2012-10-17",
    "Id": "Policy15",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bcktName",
                "arn:aws:s3:::bcktName/*"
            ]
        }
    ]
}

我在 4 个晚上都对这个问题感到震惊。 请帮我。 我不使用 boto 或任何其他东西。 它是一个直接上传到 tomcat 的战争文件,它必须将图像上传到 S3。它在 localhost 中有效,但在 S3 中无效。

PS:这就是我的 CORS 配置的样子

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>20000</MaxAgeSeconds>
    <ExposeHeader>ETag</ExposeHeader>
    <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
    <ExposeHeader>x-amz-request-id</ExposeHeader>
    <ExposeHeader>x-amz-id-2</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

PS 2:

我应该在访问控制列表中做些什么吗?截至目前,我看到所有者帐户与我整个 AWS 的用户名相同。我认为在本地工作的访问密钥和密钥也与所有者帐户有关。

【问题讨论】:

  • 您附加到 Elastic Beanstalk EC2 实例的角色策略是什么?
  • @Ashan 你的意思是角色策略,IAM 角色?我的 BeanStalk 的 Ec2 实例的“IAM 角色”看到了“aws-elasticbeanstalk-ec2-role”
  • 是的。角色内部授予的权限是什么?
  • AmazonS3FullAccess、AWSElasticBeanstalkWebTier、AWSElasticBeanstalkMulticontainerDocker 和 AWSElasticBeanstalkWorkerTier。一切都有 AWSManagerPolicy。
  • 还要仔细检查角色中的信任关系是否有 ec2.amazon...

标签: amazon-web-services amazon-s3 amazon-elastic-beanstalk


【解决方案1】:

在 Web 配置文件中检查您的 AWSAccessKey 和 AWSSecretKey。 Aws API 使用这些凭据登录到您的 s3。

我也遇到了同样的问题,我通过这样做解决了它。

希望这对任何人都有帮助。

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2021-06-13
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2012-07-05
    • 2015-11-07
    • 2019-03-03
    相关资源
    最近更新 更多