我正在尝试使用 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
,则会出现以下错误:
指定的键不存在。
我在这里做错了什么?
这个存储桶似乎是在不同的区域创建的,即 IE 而不是 us-west-2。那是我唯一一次看到“您尝试访问的存储桶必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点。”
美国标准是 us-east-1
在控制台中检查您的存储桶位置,然后将其用作要使用的端点的参考:http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
region: 'us-west-1',
?
https://s3.amazonaws.com/mybucket/myasset.jpg
替换为 https://mybucket.s3-ap-southeast-2.amazonaws.com/myasset.jpg
以修复该错误。
我遇到了类似的错误,因为存储桶位于区域 us-west-2
中,并且 URL 模式在路径中有存储桶名称。有一次,我将 URL 模式更改为将存储桶名称作为 URL 子域来获取文件,并且它起作用了。
例如,以前的 URL 是
https://s3.amazonaws.com/bucketname/filePath/filename
然后我把它替换为
https://bucketname.s3.amazonaws.com/filePath/filename
就我而言,我选择了错误的 RegionEndpoint。选择正确的 RegionEndpoint 后,它开始工作:)
经过长时间的搜索,我找到了一个可行的解决方案。问题是由于错误的 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
我在使用不同的 AWS 配置文件时遇到了这个问题。我在使用具有管理员权限的帐户时看到了错误,因此似乎不太可能出现权限问题。
从用户的角度来看,AWS 如此容易发出与所需操作几乎没有相关性的错误消息,这真的是我的一个小烦恼。
对于仍然面临此问题的 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}.
这为我解决了这个问题。
以上答案都没有解决我的问题。
以上答案可能更可能是您的问题的原因,但我的问题是我使用了错误的存储桶名称。这是一个有效的存储桶名称,它只是不是我的存储桶。
我指向的存储桶与我的 lambda 函数位于不同的区域,因此请检查您的存储桶名称!
虽然 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...
在创建 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 客户端。
我有同样的错误。当使用与创建存储桶时设置的端点不同的端点创建 s3 客户端时,就会发生这种情况。
错误代码 - 存储桶设置为 EAST 区域。
s3Client = 新 AmazonS3Client(AWS_ACCESS_KEY, AWS_SECRET_KEY, RegionEndpoint.USWest2)
使固定
s3Client = 新 AmazonS3Client(AWS_ACCESS_KEY, AWS_SECRET_KEY, RegionEndpoint.USEast1)
我也遇到过同样的问题。经过一番努力,我发现真正的问题在于 com.amazonaws 依赖项。添加依赖项后,这个错误就消失了。
当我尝试访问不存在的存储桶时出现此错误。
我错误地用存储桶名称变量切换了路径变量,因此存储桶名称具有文件路径值。因此,请仔细检查您在请求中设置的存储桶名称是否正确。
我住在英国一直在尝试“us-west-2”地区。所以重定向到'eu-west-2'。 S3 的正确区域是“eu-west-2”
当我对用户使用的策略(访问密钥/秘密密钥)创建 s3 存储桶有源 ip 约束时,这发生在我身上。我的 IP 是准确的——但由于某种原因它不起作用并给出了这个错误。
在我的情况下,存储桶名称是错误的。
在 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
}
);
ENV["AWS_REGION"]
设置为正确的值(例如"us-east-1"
)