Любой способ использовать предварительно загруженные URL-адреса и применять теги? - PullRequest
0 голосов
/ 01 октября 2018

Есть ли способ выдать клиенту заранее назначенный 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 голосов
/ 08 октября 2018

Попробуйте следующий код:

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)
)
0 голосов
/ 08 октября 2018

Довольно интересный вопрос.

Да, в предварительно подписанном URL-адресе есть необязательный параметр «x-amz-tagging», так что это не обязательно.

Однако для обеспечения того, что ресурсы должны быть помечены, это должно быть достигнуто с использованием соответствующего IAMполитика.т.е. ваше решение только с политикой IAM.

Я мог бы найти один пример для вашего понимания, который гарантирует, что экземпляр EC2 должен быть помечен как https://aws.amazon.com/premiumsupport/knowledge-center/iam-policy-tags-restrict/

(Следовательно, вам нужно настроить свой IAMполитика, основанная на необходимости)

Примечание. Существует также служба с именем AWS config, однако она предназначена только для целей мониторинга (соответствия), теперь она решит вашу проблему, чтобы убедиться, что теги являются обязательными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...