尝试从 aws ec2 客户端访问存储桶时出现位置约束异常

Posted

技术标签:

【中文标题】尝试从 aws ec2 客户端访问存储桶时出现位置约束异常【英文标题】:Location constraint exception while trying to access bucket from aws ec2 client 【发布时间】:2017-04-29 16:34:21 【问题描述】:

我正在尝试从 Java Web 应用程序创建存储桶。我的 tomcat 配置在 AWS EC2 实例上。它在尝试连接到 AWS S3 时出现以下错误:

com.amazonaws.services.s3.model.AmazonS3Exception:  
The unspecified location constraint is incompatible for the region specific endpoint this request was sent to. 
(Service: Amazon S3; Status Code: 400;..).

这是代码示例:

public class FileOperationsUtil 
 private final BasicAWSCredentials awsCreds = new BasicAWSCredentials("xyz", "zyz");
private final  AmazonS3 s3Client = new AmazonS3Client(awsCreds); private final String bucketName = "grex-prod"; 
      //public static final Region ap-south-1;
 public void uploadFile(InputStream fileInputStream,
String fileUploadLocation, String fileName) throws IOException 
s3Client.setRegion(Region.getRegion(Regions.AP_SOUTH_1));
// Region apsouth1 = Region.getRegion(Regions.ap-south-1);                  //   s3Client.setRegion(apsouth1);                                                                  //  s3Client.setRegion(Region.getRegion(Regions.ap-south-1));
//s3Client.create_bucket(bucket, CreateBucketConfiguration='LocationConstraint': 'ap-northeast-2')
s3Client.createBucket(bucketName);
File fileToUpload = new File(fileUploadLocation);
        fileToUpload.mkdirs();
// Full file path
        String fullFilePath = (fileUploadLocation + fileName);
        ObjectMetadata meta = new ObjectMetadata();

        // meta.setContentLength(contents.length);
        meta.setContentType("image/png");

        // Upload files to a specific AWS s3 bucket
        s3Client.putObject(new PutObjectRequest("grex-prod", fullFilePath,
                fileInputStream, meta)
                .withCannedAcl(CannedAccessControlList.Private));
     
    public void deleteFolder(String oldFullFilePath) 
       // System.out.println("inside");
       ObjectListing objects = s3Client.listObjects(bucketName, oldFullFilePath);
        for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) 
s3Client.deleteObject(bucketName, objectSummary.getKey());
s3Client.deleteObject(bucketName, oldFullFilePath);

【问题讨论】:

您可能想要显示一些代码。听起来好像您正在向一个区域发送请求,要求它在不同的区域创建存储桶。 【参考方案1】:

在你上面的例子中:

s3Client.setRegion(Region.getRegion(Regions.AP_SOUTH_1));
// Region apsouth1 = Region.getRegion(Regions.ap-south-1);                  //   s3Client.setRegion(apsouth1);                                                                  //  s3Client.setRegion(Region.getRegion(Regions.ap-south-1));
//s3Client.create_bucket(bucket, CreateBucketConfiguration='LocationConstraint': 'ap-northeast-2')

“region”和“LocationConstraint”都应该匹配。如果要在“ap-south-1”中创建存储桶,则两者都应设置为该值。

您收到的错误是由于两个值不匹配,也就是说您连接到一个区域(可能是 ap-south-1),然后尝试创建一个打算存在于另一个区域(ap -northeast-2)。

通过排除“LocationConstraint”,创建存储桶的位置完全基于您连接到的“区域”。通过使用“LocationConstraint”,您可以确保您不会尝试在您想要的区域之外的区域创建存储桶。

【讨论】:

【参考方案2】:

使用“locationConstraint”时有一些规则:

    区域“us-east-1”与“locationConstraint”中的所有区域兼容 对于任何其他区域,region 和 locationConstraint 必须相同。

简而言之:

仅使用“us-east-1”,您可以使用任何区域作为 locationConstraint 在所需区域创建存储桶。(region='us-east-1' locationConstraint=) 与所有其他地区 region 和 locationConstraint 应该相同(region='us-west-2', locationConstraint='us-west-2') 任何其他区域都会抛出“code:IllegalLocationConstraintException”

【讨论】:

以上是关于尝试从 aws ec2 客户端访问存储桶时出现位置约束异常的主要内容,如果未能解决你的问题,请参考以下文章

AWS CLI 'cp' 失败并显示“指定的存储桶不存在”

从 Nuxt 上传到 AWS S3 存储桶时出现 500 内部服务器错误

尝试访问 AWS Mumbai S3 服务器时出现 301 重定向

AWS S3 存储桶策略:如何授予对 EC2 实例的访问权限?

从“aws ec2 describe-instances”输出解析 json 时出现问题

将超过特定大小的文件发布到 Elastic Beanstalk (EC2) 服务器时出现问题