go - 使用 GrantRead 写入 S3 对象,给出 400
问题描述
我的服务使用 AWS S3 go sdk 将对象上传到 aws 账户中,比如ACT1,我想向不同的子账户ACT2授予读取权限,以便它可以在成功上传后读取对象。这就是代码的样子
var canonicalIDOfSubAccount = "abcd09kialjf1124"
// Upload attempts to upload a file at a particular key.
func (s *client) Upload(ctx context.Context, bucket, key string, body io.Reader) (err error) {
defer func() {
if r := recover(); r != nil {
logging.Error("s3", "panic recovered. err: %v", r)
}
}()
params := &s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: body,
GrantRead: aws.String(canonicalIDOfSubAccount),
}
// Perform an upload.
_, err = s.uploader.UploadWithContext(ctx, params)
if err != nil {
fmt.Println("Error is ", err.Error(), err)
}
return
}
执行时,aws 抛出错误
InvalidArgument: Argument format not recognized status 400
如果没有 GrantRead,上传工作正常,但ACT2无法读取对象。
在与 AWS 支持人员核实时,他们说提供规范 id 是标头 GrantRead 的正确值。
解决方案
找到正确使用它的方法:
提供规范 id 时,正确的方法是:
params := &s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: body,
GrantRead: aws.String("id=" + canonicalIDOfSubAccount),
}
推荐阅读
- python - Python 抓取链接的父 URL,然后是这些链接的子 URL,然后是表数据并存储到可读文件中
- c - 使用 C 程序执行代码时支持从 db2/大型机返回值的可能数据类型是什么
- perl - Perl 自动化散列填充和键名
- list - 列表不会随 Ray 并行 python 改变
- python - 为什么我的模型没有通过我在 Tensorflow Keras 中的自定义层?
- c# - 带有 Azure 函数的 Swashbuckle - 定义查询参数
- dictionary - 如何获取 Pyspark 中每一行的字数字典?
- javascript - 本地代理应用程序作为 SaaS 的“窗口”?
- mysql - 如何将带或不带负号的整数转换为 CONVERT_TZ 的时区偏移量?
- ruby-on-rails - 我的索引页面加载缓慢。如何减少加载时间?