Как изменить тип содержимого объекта с помощью интерфейса командной строки AWS?

У меня есть несколько объектов, хранящихся в Amazon S3, тип содержимого которых мне нужно изменить с text/html на application/rss+xml. Я полагаю, что это должно быть возможно сделать с помощью команды копирования, указав один и тот же путь для источника и назначения. Я пытаюсь сделать это с помощью инструментов AWS cli, но получаю такую ​​ошибку:

$ aws s3 cp s3://mybucket/feed/ogg/index.html \
            s3://mybucket/feed/ogg/index.html \
            --content-type 'application/rss+xml'
copy failed: s3://mybucket/feed/ogg/index.html
to s3://mybucket/feed/ogg/index.html
A client error (InvalidRequest) occurred when calling the
CopyObject operation: This copy request is illegal because it is
trying to copy an object to itself without changing the object's
metadata, storage class, website redirect location or encryption
attributes.

Если я укажу другой путь для источника и назначения, я не получу сообщение об ошибке:

$ aws s3 cp s3://mybucket/feed/ogg/index.html \
            s3://mybucket/feed/ogg/index2.html \
            --content-type 'application/rss+xml'
copy: s3://mybucket/feed/ogg/index.html
to s3://mybucket/feed/ogg/index2.html

Несмотря на то, что команда завершается успешно, объект index2.html создается с типом содержимого text/html, а не с типом application/rss+xml, который я указал.

Как я могу изменить эту командную строку, чтобы она работала?


person nelstrom    schedule 08.05.2014    source источник
comment
Только что видел, как эта проблема сообщается о той же проблеме. В этой ветке есть пара обходных путей, так что я посмотрю, как я с ними справлюсь.   -  person nelstrom    schedule 09.05.2014


Ответы (3)


Для внесения этого изменения можно использовать низкий уровень s3api:

$ aws s3api copy-object --bucket archive --content-type "application/rss+xml" \
    --copy-source archive/test/test.html --key test/test.html \
    --metadata-directive "REPLACE"

http://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html

Проблема заключалась просто в невозможности указать --metadata-directive. Спасибо, что указали на открытый вопрос / запрос функции, nelstrom!

person Cawb07    schedule 02.02.2015
comment
Как это можно сделать для нескольких объектов с определенным расширением? - person bart; 11.12.2016
comment
Может быть более чистый способ, но вы можете перечислить объект в файле, затем прочитать все строки и выполнить указанную выше команду в каждой строке, так что приведенное выше будет выглядеть так: while read line; do copy-object --bucket archive --content-type "application/rss+xml" --copy-source archive/$line.html --key $line.html --metadata-directive "REPLACE"; done < objects.txt - person Cawb07; 13.12.2016

Вы также можете сделать это с помощью API более высокого уровня, скопировав файл поверх самого себя, но пометив его как изменение в метаданных:

aws s3 cp \
  --content-type "application/rss+xml" \
  --metadata-directive REPLACE \
  s3://mybucket/myfile \
  s3://mybucket/myfile 
person Malvineous    schedule 25.11.2018

Вы можете переопределить тип содержимого вашего файла с помощью команды aws s3 cp, используя необязательный атрибут --metadata-directive, чтобы указать, что тип содержимого заменяется на тот, который предоставляется с --content-type 'application/rss+xml' во время копирования:

aws s3 cp \
--content-type 'application/rss+xml' \
--metadata-directive REPLACE \
s3://mybucket/feed/ogg/index.html \
s3://mybucket/feed/ogg/index.html

Дополнительная информация: https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html

Затем вы можете проверить это, проверив метаданные файла:

aws s3api head-object \
--bucket mybucket \
--key feed/ogg/index.html
person veben    schedule 06.01.2021