ChatGPT解决这个技术问题 Extra ChatGPT

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

指定的键不存在。

我在这里做错了什么?

当我不小心为指定的存储桶指定了错误的区域时,这发生在我身上。

b
blnc

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

美国标准是 us-east-1


永远不会想到这一点,但它对我有用!在 AWS 开发工具包中,“美国标准”区域似乎是 AWSRegionUSEast1。
正在寻找如何设置区域的答案。谢谢!
如果您使用的是 Ruby 客户端,请在初始化客户端之前将存储桶的 ENV["AWS_REGION"] 设置为正确的值(例如 "us-east-1"
如果您需要使用多个存储桶(例如开发/登台/生产等)怎么办?
我在Java中遇到了同样的问题。您的解决方案有所帮助。他们在 S3 中使用奇怪的名称。区域的端点,存储库中对象名称的键...
J
Jay Q.

在控制台中检查您的存储桶位置,然后将其用作要使用的端点的参考:http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region


你能解释一下怎么做吗?用什么替换 region: 'us-west-1',
@AamirAfridi 这取决于您使用的 SDK。我正在使用 iOS SDK,在凭据提供程序中,有一个参数可以设置区域。我已将其设置为我打算使用的区域。
我刚刚有一个类似的例子,我优化了一个桶的区域,但我没有更新域名。修复方法是用新域名替换以前的域名,如该存储桶的 S3 控制台中的端点参考中所示。示例:我将 https://s3.amazonaws.com/mybucket/myasset.jpg 替换为 https://mybucket.s3-ap-southeast-2.amazonaws.com/myasset.jpg 以修复该错误。
p
prasun

我遇到了类似的错误,因为存储桶位于区域 us-west-2 中,并且 URL 模式在路径中有存储桶名称。有一次,我将 URL 模式更改为将存储桶名称作为 URL 子域来获取文件,并且它起作用了。

例如,以前的 URL 是

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

然后我把它替换为

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

输入完全限定名称对我有用,例如。 s3-ap-southeast-1.amazonaws.com/ng-spark/Java8.json 用于位于新加坡可用区的存储桶
Z
Zeeshan Ahmed

就我而言,我选择了错误的 RegionEndpoint。选择正确的 RegionEndpoint 后,它开始工作:)


V
Vikram Kodag

经过长时间的搜索,我找到了一个可行的解决方案。问题是由于错误的 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

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

https://i.stack.imgur.com/Q0nG8.png

模式详情Click


k
kokociel

我在使用不同的 AWS 配置文件时遇到了这个问题。我在使用具有管理员权限的帐户时看到了错误,因此似乎不太可能出现权限问题。

从用户的角度来看,AWS 如此容易发出与所需操作几乎没有相关性的错误消息,这真的是我的一个小烦恼。


R
RamanSM

对于仍然面临此问题的 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}.

这为我解决了这个问题。


P
Peter Grainger

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

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

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


P
Pankaj Rawat

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

var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USWest2);

g
glimmbo

对于使用 @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...

区域也在 AWS 控制台中的属性选项卡、存储桶的存储桶概览部分或任何子文件夹中可见。
D
Duncan

对于许多 S3 API 包(我最近在 npm s3 package 中遇到了这个问题),您可能会遇到假定区域为美国标准的问题,如果您选择托管存储桶,按名称查找将要求您明确定义区域在那个区域之外。


R
Rathan

在创建 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 客户端。


T
Tushar

我有同样的错误。当使用与创建存储桶时设置的端点不同的端点创建 s3 客户端时,就会发生这种情况。

错误代码 - 存储桶设置为 EAST 区域。

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

使固定

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


S
Shridhar Acharya

我也遇到过同样的问题。经过一番努力,我发现真正的问题在于 com.amazonaws 依赖项。添加依赖项后,这个错误就消失了。


S
Sven Möhring

当我尝试访问不存在的存储桶时出现此错误。

我错误地用存储桶名称变量切换了路径变量,因此存储桶名称具有文件路径值。因此,请仔细检查您在请求中设置的存储桶名称是否正确。


d
dansek

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


C
CamHart

当我对用户使用的策略(访问密钥/秘密密钥)创建 s3 存储桶有源 ip 约束时,这发生在我身上。我的 IP 是准确的——但由于某种原因它不起作用并给出了这个错误。


p
prageeth

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


0
0lukasz0

在 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 的解决方案时,我最终遇到了这个问题,所以我认为它可能对其他人有用。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅