Управление метаданными объектов
Каждому объекту, загружаемому в объектном хранилище S3, можно прикрепить метаданные — дополнительные параметры, описывающие свойства или контекст использования файла. Это удобно для идентификации, настройки кеширования, указания формата, прав доступа и других целей.
- AWS CLI
- Python API
Если AWS CLI еще не установлен, установите и настройте его. Для работы с объектным хранилищем используйте команды s3api и s3.
AWS CLI. Управление метаданными объектов
Загрузка объекта с метаданными
В терминале выполните команду:
aws s3api put-object \
--bucket <bucket_name> \
--key <object_name> \
--body <path> \
--metadata "<key_name>"="<key_value>","<key_name>"="<key_value>"
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта;
<path> — путь к локальному файлу;
<key_name> — ключ;
<key_value> — значение.
Получение метаданных объекта
В терминале выполните команду:
aws s3api head-object \
--bucket <bucket_name> \
--key <object_name>
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта.
Пример ответа:
{
"AcceptRanges": "bytes",
"LastModified": "2025-05-16T14:35:27+00:00",
"ContentLength": 328,
"ETag": "\"0dd6fdb23ae2cdb9cb612d440d649173\"",
"ContentType": "binary/octet-stream",
"Metadata": {
"key": "value"
}
}
Изменить метаданные объекта
Нельзя изменить метаданные напрямую. Вместо этого нужно перезаписать объект с тем же именем и новыми метаданными.
В терминале выполните команду:
aws s3api copy-object \
--bucket <bucket_name> \
--key <object_name> \
--copy-source <bucket_name>/<object_name> \
--metadata "<key_name>"="<key_value>" \
--metadata-directive REPLACE
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта;
<key_name> — ключ;
<key_value> — значение.
Подробнее об объектах см. в статье Об объектах. Подробнее о метаданных объекта см. в статье Метаданные объекта.
Boto3 — это библиотека Python, предоставляющая программный интерфейс (SDK) для взаимодействия с объектным хранилищем S3. Подробности см. в документации AWS Boto3.
Python API. Управление метаданными объектов
Загрузка объекта с метаданными
import boto3
from botocore.exceptions import ClientError
session = boto3.session.Session(profile_name='default') #Создает сессию с использованием профиля default. Профиль находится в файле ~/.aws/credentials.
s3 = session.client('s3', endpoint_url='$endpoint')
def upload_file_with_metadata(bucket_name, object_key, file_path, metadata_dict):
try:
with open(file_path, 'rb') as data:
s3.put_object(
Bucket=bucket_name,
Key=object_key,
Body=data,
Metadata=metadata_dict
)
print(f"Файл '{file_path}' загружен в {bucket_name}/{object_key} с метаданными: {metadata_dict}")
except Exception as e:
print(f"Ошибка загрузки: {e}")
upload_file_with_metadata(
bucket_name='<bucket_name>',
object_key='<object_name>',
file_path='<path>',
metadata_dict={'<key_name>': '<key_value>', '<key_name>': '<key_value>'}
)
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта;
<path> — путь к локальному файлу;
<key_name> — ключ;
<key_value> — значение.
Получение метаданных объекта
import boto3
from botocore.exceptions import ClientError
session = boto3.session.Session(profile_name='default') #Создает сессию с использованием профиля default. Профиль находится в файле ~/.aws/credentials.
s3 = session.client('s3', endpoint_url='$endpoint')
def get_object_metadata(bucket_name, object_key):
try:
response = s3.head_object(Bucket=bucket_name, Key=object_key)
metadata = response.get('Metadata', {})
print(f"Метаданные для {bucket_name}/{object_key}: {metadata}")
return metadata
except Exception as e:
print(f"Ошибка получения метаданных: {e}")
return None
get_object_metadata('<bucket_name>', '<object_name>')
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта.
Изменить метаданные объекта
Нельзя изменить метаданные напрямую. Вместо этого нужно перезаписать объект с тем же именем и новыми метаданными.
import boto3
from botocore.exceptions import ClientError
session = boto3.session.Session(profile_name='default') #Создает сессию с использованием профиля default. Профиль находится в файле ~/.aws/credentials.
s3 = session.client('s3', endpoint_url='$endpoint')
def update_object_metadata(bucket_name, object_key, new_metadata):
try:
s3.copy_object(
Bucket=bucket_name,
Key=object_key,
CopySource={'Bucket': bucket_name, 'Key': object_key},
Metadata=new_metadata,
MetadataDirective='REPLACE'
)
print(f"Метаданные объекта {object_key} обновлены: {new_metadata}")
except Exception as e:
print(f"Ошибка обновления метаданных: {e}")
update_object_metadata(
bucket_name='<bucket_name>',
object_key='<object_name>',
new_metadata={'<key_name>': '<key_value>', '<key_name>': '<key_value>'}
)
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта;
<key_name> — ключ;
<key_value> — значение.
Подробнее об объектах см. в статье Об объектах. Подробнее о метаданных объекта см. в статье Метаданные объекта.