amazon-web-services - AWS CLI:aws s3 presign 不适用于 ap-east-1(香港)区域(“位置约束与区域特定端点不兼容”)
问题描述
我一直未能对位于 ap-east-1(香港)AWS 区域的存储桶中的 S3 对象使用签名 URL。
具体来说,我首先将签名版本设置为 V4(请参阅https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version),如下所示:
aws configure set default.s3.signature_version s3v4
然后使用以下命令创建一个签名 URL:
aws s3 presign --region=ap-east-1 s3://<name of bucket in ap-east-1 region>/<object name>
当我测试生成的 URL 时:
curl -i "https://<bucket name>.s3.amazonaws.com/<object name>?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...%2Fap-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190928T034534Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=..."
...我收到一个 HTTP/400 响应,正文设置为:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>IllegalLocationConstraintException</Code>
<Message>The ap-east-1 location constraint is incompatible for the region specific endpoint this request was sent to.
</Message>
<RequestId>...</RequestId>
<HostId>
有趣的是,当对位于 us-west-2(俄勒冈)AWS 区域的另一个存储桶中的对象执行相同操作时,生成的签名 URL 可以正常工作。
有没有人遇到过这个问题?我不太清楚如何解析错误消息,但我想知道是否需要设置--endpoint-url
配置设置,如果需要,设置为什么?
任何人的想法?
谢谢,索伦
解决方案
您需要在 CLI 配置中设置寻址样式才能使其正常工作。有关详细信息,请参阅AWS CLI S3 配置文档。
步骤集:
aws configure set default.s3.addressing_style virtual
aws s3 presign s3://<bucket-in-ap-east-1>/<object_key> --region ap-east-1
Python中的等效代码
import boto3
def generate_presigned_url(bucket_region, bucket_name, object_key, expiration):
s3_client = boto3.client('s3', region_name=bucket_region, config=boto3.session.Config(s3={'addressing_style': 'virtual'}, signature_version='s3v4'))
response = s3_client.generate_presigned_url('get_object', Params={'Bucket': bucket_name, 'Key': object_key}, ExpiresIn=expiration)
return response
用法
generate_presigned_url('ap-east-1', bucket_name, object_name, expiration)
样本输出
推荐阅读
- java - 带有循环的 postDelayed 处理程序
- r - 在 R 中寻找一种解决方案来遍历日期范围以从 NOAA API 获取气候数据
- php - 我如何从发布的文本中找到特定的 li
- dart - 颤振页面视图未显示两张幻灯片
- tomcat - 我想使用 curl 命令从 tomcat 中取消部署一些战争。但是由于 CSRF 令牌而出错
- java - Logback 错误:[tag-name] 没有适用的操作,当前 ElementPath 是 [tag-path]
- python - python api show 在 openstack 中聚合管理程序
- java - 在界面中使用@RequestMapping 是不是一个坏主意?
- typescript - Vue 2 + TypeScript:避免直接改变 Prop - 在基于类的组件中使用 vue-property-decorator
- pandas - 以下行需要大量时间来更新,因为它有近 2.5l 记录存在