AWS S3:您正在尝试访问的存储桶必须使用指定的端点地址进行访问。

316

我试图使用 AWS-SDK-Core Ruby Gem 删除已上传的图片文件。

以下是我的代码:

require 'aws-sdk-core'

def pull_picture(picture)
    Aws.config = {
        :access_key_id => ENV["AWS_ACCESS_KEY_ID"],
        :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"],
        :region => 'us-west-2'
    }

    s3 = Aws::S3::Client.new

    test = s3.get_object(
        :bucket => ENV["AWS_S3_BUCKET"],
        :key => picture.image_url.split('/')[-2],   
    )
end

然而,我遇到了以下错误:

您正在尝试访问的存储桶必须使用指定的端点进行访问。请将所有未来请求发送到此端点。

我知道区域是正确的,因为如果我将它更改为us-east-1,则会显示以下错误:

指定的密钥不存在。

我在这里做错了什么?


10
当我错误地指定了特定存储桶的错误区域时,发生了这种情况。 - The Muffin Man
23个回答

501

看起来很可能这个存储桶是在不同的区域创建的,而不是 us-west-2。这是我见过的唯一时间出现 "The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint." 的情况。

US Standard 是 us-east-1


34
没想到,但对我有效!在AWS SDK中,“US Standard”区域似乎是AWSRegionUSEast1。 - Nerrolken
正在寻找如何设置区域的答案。谢谢! - Sylar
8
如果您正在使用Ruby客户端,请在初始化客户端之前将ENV ["AWS_REGION"]设置为正确的值(例如“us-east-1”)以针对存储桶进行配置。请注意,不要改变原始意思,并尽可能地使翻译通俗易懂。 - Abe Voelker
2
我在Java中遇到了同样的问题。你的解决方案很有帮助。S3中使用奇怪的名称。Endpoint表示区域,key表示存储库中的对象名称... - Gangnus
1
这个API太糟糕了,我简直不敢相信这个问题居然还存在了10年。 - undefined
显示剩余6条评论

29

我曾经遇到过类似的错误,因为存储桶位于us-west-2区域,URL模式中的路径中有存储桶名称。当我将URL模式更改为将存储桶名称作为URL子域名来获取文件时,它就可以正常工作了。

例如之前的URL是:

https://s3.amazonaws.com/bucketname/filePath/filename

然后我将其替换为

https://bucketname.s3.amazonaws.com/filePath/filename

1
将完全限定名称放入我的代码中对我起作用了,例如 https://s3-ap-southeast-1.amazonaws.com/ng-spark/Java8.json 这个位于新加坡可用区的存储桶。 - Nilesh Gule

25

3
你能解释一下如何操作吗? 用什么替换 region: 'us-west-1', - Aamir Afridi
@AamirAfridi 这取决于你使用的SDK。我正在使用iOS SDK,在凭证提供程序中,有一个参数可以设置区域。我已将其设置为我打算使用的区域。 - Jay Q.
1
我刚刚遇到了一个类似的例子,我优化了一个存储桶的区域,但是我忘记更新域名。修复方法是用新的域名替换旧的域名,就像在S3控制台中看到的该存储桶的终端节点引用一样。例如:我用https://mybucket.s3-ap-southeast-2.amazonaws.com/myasset.jpg替换了https://s3.amazonaws.com/mybucket/myasset.jpg来解决这个错误。 - Fabien Haddadi

7

在我的情况下,我选择了错误的RegionEndpoint。选择了正确的RegionEndpoint后,它开始正常工作 :)


6

如果你正在使用 @aws-sdk/client-s3,在发送命令之前,请确保向客户端提供存储桶的区域。

可以通过CLI获取:

$ aws s3api get-bucket-location --bucket <bucket_name>
{
    "LocationConstraint": "ca-central-1"
}
const client = new S3Client({ region: "ca-central-1", credentials...

1
区域也可以在AWS控制台的属性选项卡、存储桶概览部分或任何子文件夹中看到。 - Emanuel George Hategan
在将一些v2的AWS SDK代码迁移到v3时,我曾因此遭受过损失。我的lambda@edge函数有时候能够正常工作,而有时候却不能。原来这是因为我没有在s3配置中手动设置区域,因为执行lambda@edge的lambda函数所在的区域并不是保证的。 - Turner Houghton

6

经过长时间的搜索,我找到了一个可行的解决方案。问题出在错误的区域代码上。

以下是区域代码的列表,请设置正确的代码,您的问题将得到解决。

Code                         Name
US East (Ohio)               us-east-2

US East (N. Virginia)       us-east-1

US West (N. California)     us-west-1

US West (Oregon)            us-west-2

Asia Pacific (Hong Kong)    ap-east-1

Asia Pacific (Mumbai)       ap-south-1

Asia Pacific (Osaka-Local)  ap-northeast-3

Asia Pacific (Seoul)        ap-northeast-2

Asia Pacific (Singapore)    ap-southeast-1

Asia Pacific (Sydney)       ap-southeast-2

Asia Pacific (Tokyo)        ap-northeast-1

Canada (Central)            ca-central-1

Europe (Frankfurt)          eu-central-1

Europe (Ireland)            eu-west-1

Europe (London)             eu-west-2

Europe (Paris)             eu-west-3

Europe (Stockholm)         eu-north-1

Middle East (Bahrain)      me-south-1

South America (São Paulo)   sa-east-1

您可以点击存储桶名称右上角找到您的区域代码。

enter image description here

更多详情请点击


4

在C#中,你可以进行以下检查。我假设在其他SDK中也可能有类似的代码:

        var client = new AmazonS3Client(
            credentials.AccessKey,
            credentials.ClientSecret,
            new AmazonS3Config{}
        );

        var bucketLocationRequest = new GetBucketLocationRequest
        {
            BucketName = amazonS3Bucket.BucketName
        };

        var response = await client.GetBucketLocationAsync(bucketLocationRequest);
        var region = response.Location;

        var regionEndpoint = region != null ? RegionEndpoint.GetBySystemName(region.Value) : RegionEndpoint.EUCentral1;
       
        var clientWithRegion = new AmazonS3Client(
            credentials.AccessKey,
            credentials.ClientSecret,
            new AmazonS3Config
            {
                RegionEndpoint = regionEndpoint
            }
        );

当我在寻找.NET的解决方案时,我最终来到了这个问题,因此我认为它可能对其他人有用。 - 0lukasz0

3
我在使用其他 AWS 账号时遇到了这个问题。我正在使用具有管理员权限的帐户时看到了此错误,因此似乎不太可能是权限问题。 我真的很讨厌 AWS 经常发布与用户操作无关的错误消息。

3

以上答案都没有解决我的问题。

上面的答案可能更有可能是您的问题的原因,但我的问题是我使用了错误的存储桶名称。它是一个有效的存储桶名称,只是不是我的存储桶。

我指向的存储桶位于与我的 Lambda 函数不同的区域,请检查您的存储桶名称!

最初的回答:

以上答案都没有解决我的问题。我的问题是我使用了错误的存储桶名称。请检查您的存储桶名称是否正确。


3
在我的情况下,存储桶名称是错误的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,