Есть ли способ выдать клиенту заранее назначенный 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, и гарантирует , что он будет помечен определенным образом в процессе.Есть ли способ сделать это?