AWS S3:您试图访问的桶必须使用指定的端点寻址

我试图用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,则会出现以下错误:

指定的密钥不存在。

我哪里做错了?

228562 次浏览

似乎这个桶是在一个不同的地区创建的,IE而不是us-west-2。这是我唯一一次看到“您试图访问的桶必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点。”

美国标准是us-east-1

检查你的桶在控制台中位置,然后使用它作为使用哪个端点的参考: http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region < / p >

对于许多S3 API包(我最近遇到了NPM s3包这个问题),你可能会遇到区域被假设为美国标准的问题,如果你选择在该区域之外托管一个桶,通过名称查找将要求你显式定义该区域。

我遇到了类似的错误,因为桶位于区域us-west-2中,URL模式的路径中有桶名。有一次,我改变了URL模式,以bucketname作为URL子域来抓取文件,它工作了。

例如,以前的URL是

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

然后我把它换成

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

对于仍然面临此问题的ppl,尝试按如下方式将s3_host添加到配置散列中

   :storage => :s3,
:s3_credentials => {:access_key_id => access key,
:secret_access_key => secret access key},
:bucket => bucket name here,
:s3_host_name => s3-us-west-1.amazonaws.com or whatever comes as per your region}.

这为我解决了问题。

在创建S3Client期间,您可以指定到特定区域的端点映射。如果默认为s3.amazonaws.com,则桶将在北弗吉尼亚州的us-east-1中创建。

AWS文档中关于S3端点和区域的更多详细信息:http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

因此,在创建S3Client并使用同一区域中的同一客户端访问S3资源时,始终要确保端点/区域。

如果桶是从AWS S3控制台创建的,则从控制台检查该桶的区域,然后使用上面链接中提到的端点详细信息在该区域中创建S3 Client。

当我试图访问一个不存在的桶时,我得到了这个错误。

我错误地将路径变量与桶名变量交换,因此桶名具有文件路径值。所以可能需要仔细检查,你在请求上设置的桶名是否正确。

我也犯了同样的错误。当s3客户端创建的端点与创建桶时设置的端点不同时,就会发生这种情况。

  • 错误码-桶设置与东部地区。

s3Client = New AmazonS3Client(AWS_ACCESS_KEY, AWS_SECRET_KEY, RegionEndpoint.USWest2)

  • 修复

s3Client = New AmazonS3Client(AWS_ACCESS_KEY, AWS_SECRET_KEY, RegionEndpoint.USEast1)

我也遇到过同样的问题。经过一番挣扎,我发现真正的问题出在网站上。amazonaws依赖性。添加依赖项后,此错误消失。

以上答案都不能解决我的问题。

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

我指向的桶是在不同的区域,我的lambda函数,所以检查你的桶名!

我住在英国,一直在尝试“美国西部2”地区。所以重定向到'eu-west-2'。S3的正确区域是'eu-west-2'

当我对用户(访问密钥/秘密密钥)用于创建s3桶的策略有一个源ip约束时,就发生了这种情况。我的IP是准确的——但出于某种原因,它不能工作,并给出了这个错误。

经过长时间的寻找,我找到了一个可行的解决方案。这个问题是因为错误的region-code

下面是区域代码列表,设置适当的一个,您的问题将得到解决。

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

对于模式详细信息点击

我在使用不同的AWS配置文件时遇到了这个问题。当我使用一个具有管理权限的帐户时,我看到了这个错误,所以权限问题的可能性似乎不大。

从用户的角度来看,AWS很容易发出与所需操作几乎没有关联的错误消息,这真的是我的一个讨厌之处。

在我的例子中,我选择了错误的RegionEndpoint。选择正确的RegionEndpoint后,它开始工作:)

虽然S3桶是全局的,但在访问桶时,我们需要给出区域。我在.netcore中得到错误,一旦我在下面的代码中添加了区域,它就开始工作了。

var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USWest2);
对于那些使用@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...

在我的情况下,桶名是错误的。

在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
}
);

我在c#.net上得到了这个异常,它在更改客户端创建的RegionEndpoint值后得到了修复,如下所示

var client = new AmazonS3Client(accesKey,secretKey, RegionEndpoint.APSoutheast2)