有什么方法可以使用预签名的URL上传并强制执行标记?

时间:2018-10-01 14:41:43

标签: amazon-s3 aws-sdk

有什么方法可以向客户端发出预签名的URL,以将文件上传到S3,并确保上传的文件具有某些标签?以此处的Python SDK为例,这将根据需要生成一个URL:

s3.generate_presigned_url('put_object', 
                          ExpiresIn=3600,
                          Params=dict(Bucket='foo', 
                                      Key='bar', 
                                      ContentType='text/plain', 
                                      Tagging='foo=bar'))

在显式提供标签的情况下上传时,这是令人满意的:

$ curl 'https://foo.s3.amazonaws.com/bar?AWSAccessKeyId=...&Signature=...&content-type=text%2Fplain&x-amz-tagging=foo%3Dbar&Expires=1538404508' \
  -X PUT
  -H 'Content-Type: text/plain' \
  -H 'x-amz-tagging: foo=bar' \
  --data-binary foobar

但是,当S3省略-H 'x-amz-tagging: foo=bar'时,它也接受请求,这将上传不带标签的对象。由于我无法控制客户端,因此...很糟糕。

我尝试过先创建一个空对象并为其添加标签,然后向其发布预签名的URL,但是PUT设置该对象会完全替换它,包括删除所有标签。

我尝试发布一个预先签名的POST URL,但这似乎根本不支持tagging参数:

s3.generate_presigned_post('foo', 'bar', {'tagging': '<Tagging><TagSet><Tag><Key>Foo</Key><Value>Bar</Value></Tag></TagSet></Tagging>'})
$ curl https://foo.s3.amazonaws.com/ \
  -F key=bar \
  -F 'tagging=<Tagging><TagSet><Tag><Key>Foo</Key><Value>Bar</Value></Tag></TagSet></Tagging>'
  -F AWSAccessKeyId=... \
  -F policy=... \
  -F signature=... \
  -F file=@/tmp/foo

<Error><Code>AccessDenied</Code><Message>Invalid according to Policy:
Extra input fields: tagging</Message>...

我只想让客户端将文件直接上传到S3,并确保在此过程中以某种特定方式对其进行标记。有什么办法吗?

2 个答案:

答案 0 :(得分:3)

尝试以下代码:

fields = {
    "x-amz-meta-u1": "value1",
    "x-amz-meta-u2": "value2"
}
conditions = [
    {"x-amz-meta-u1": "value1"},
    {"x-amz-meta-u2": "value2"}
]


presignedurl = s3_client.generate_presigned_post(
    bucket_name, "YOUR_BUCKET_NAME",
    Fields=copy.deepcopy(fields),
    Conditions=copy.deepcopy(conditions)
)

答案 1 :(得分:0)

非常有趣的问题。

是的,预签名URL具有可选参数“ x-amz-tagging”,因此不是必需的。

但是,要强制必须标记资源,应使用适当的IAM策略来实现。也就是说,您的解决方案仅适用于IAM策略。

我可以找到一个示例供您理解,该示例可确保必须标记EC2实例为https://aws.amazon.com/premiumsupport/knowledge-center/iam-policy-tags-restrict/

(因此,您需要根据需要自定义IAM策略)

注意:还有一个名为AWS config的服务,但是它仅用于监视(合规)目的,现在它将解决您的问题,以确保标记是必需的。