Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Сокращатель ссылок
    • Ввод данных в системы хранения
    • Хранение журналов работы приложения
    • Развертывание веб-приложения с использованием Java Servlet API
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Разработка пользовательской интеграции в API Gateway
    • Разработка CRUD API для сервиса фильмов
    • Построение пайплайна CI/CD в GitLab
    • Работа с API-шлюзом по протоколу WebSocket
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Автоматическое копирование объектов из одного бакета Object Storage в другой
    • Визуализация логов в Grafana с помощью плагина Cloud Logging
    • Канареечный релиз функции Cloud Functions
    • Интерактивная отладка функций Cloud Functions
    • Создание функции Node.js с помощью TypeScript
    • Запуск контейнерного приложения в Serverless Containers
    • Передача событий Yandex Cloud Postbox в Data Streams и их анализ с помощью DataLens
    • Использование API Gateway для настройки синтеза речи в SpeechKit
    • Подключение к YDB из функции Cloud Functions на Python
    • Подключение к базе данных YDB из функции Cloud Functions на Node.js
    • Защита API Gateway при помощи Smart Web Security
    • Развертывание веб-приложения с JWT-авторизацией в API Gateway и аутентификацией в Firebase
    • Автоматическая загрузка данных в Yandex SpeechSense с помощью Yandex Workflows
    • Настройка реагирования в Cloud Logging и Yandex Cloud Functions
    • Настройка интеграций Workflows с Tracker, YandexGPT и Yandex Cloud Postbox
    • Разработка функций в Functions Framework и их развертывание в Yandex Serverless Containers

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Создайте сервисные аккаунты
  • Создайте статический ключ
  • Создайте секрет
  • Создайте бакеты Object Storage
  • Подготовьте ZIP-архив с кодом функции
  • Создайте функцию
  • Создайте триггер
  • Протестируйте функцию
  • Как удалить созданные ресурсы
  1. Бессерверные технологии
  2. Автоматическое копирование объектов из одного бакета Object Storage в другой

Автоматическое копирование объектов из одного бакета Yandex Object Storage в другой

Статья создана
Yandex Cloud
Улучшена
Обновлена 21 апреля 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Создайте сервисные аккаунты
  • Создайте статический ключ
  • Создайте секрет
  • Создайте бакеты Object Storage
  • Подготовьте ZIP-архив с кодом функции
  • Создайте функцию
  • Создайте триггер
  • Протестируйте функцию
  • Как удалить созданные ресурсы

Настройте автоматическое копирование объектов из одного бакета Object Storage в другой. Копирование будет осуществляться с помощью функции Cloud Functions, которая запускается по триггеру при добавлении нового объекта в бакет.

Чтобы настроить копирование:

  1. Подготовьте облако к работе.
  2. Создайте сервисные аккаунты.
  3. Создайте статический ключ.
  4. Создайте секрет Yandex Lockbox.
  5. Создайте бакеты Yandex Object Storage.
  6. Подготовьте ZIP-архив с кодом функции.
  7. Создайте функцию Yandex Cloud Functions.
  8. Создайте триггер.
  9. Протестируйте функцию.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость ресурсов входят:

  • плата за хранение данных в бакете (см. тарифы Yandex Object Storage);
  • плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Yandex Cloud Functions);
  • плата за хранение секретов (см. тарифы Yandex Lockbox).

Создайте сервисные аккаунтыСоздайте сервисные аккаунты

Создайте сервисный аккаунт s3-copy-fn с ролями storage.uploader, storage.viewer и lockbox.payloadViewer, от имени которого будет работать функция, и s3-copy-trigger с ролью functions.functionInvoker для вызова функции.

Консоль управления
Yandex Cloud CLI
Terraform
API
  1. В консоли управления выберите каталог, в котором хотите создать сервисный аккаунт.
  2. В списке сервисов выберите Identity and Access Management.
  3. Нажмите кнопку Создать сервисный аккаунт.
  4. Укажите имя сервисного аккаунта: s3-copy-fn.
  5. Нажмите Добавить роль и выберите роли storage.uploader, storage.viewer и lockbox.payloadViewer.
  6. Нажмите кнопку Создать.
  7. Повторите предыдущие шаги и создайте сервисный аккаунт s3-copy-trigger с ролью functions.functionInvoker, от имени которого будет вызываться функция.

Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

  1. Создайте сервисный аккаунт s3-copy-fn:

    yc iam service-account create --name s3-copy-fn
    

    Результат:

    id: nfersamh4sjq********
    folder_id: b1gc1t4cb638********
    created_at: "2023-03-21T10:36:29.726397755Z"
    name: s3-copy-fn
    

    Сохраните идентификатор сервисного аккаунта s3-copy-fn (id) и каталога, в котором его создали (folder_id).

  2. Назначьте сервисному аккаунту роли storage.uploader, storage.viewer и lockbox.payloadViewer на каталог:

    yc resource-manager folder add-access-binding <идентификатор_каталога> \
      --role storage.uploader \
      --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    
    yc resource-manager folder add-access-binding <идентификатор_каталога> \
      --role storage.viewer \
      --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    
    yc resource-manager folder add-access-binding <идентификатор_каталога> \
      --role lockbox.payloadViewer \
      --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    

    Результат:

    done (1s)
    
  3. Создайте сервисный аккаунт s3-copy-trigger:

    yc iam service-account create --name s3-copy-trigger
    

    Сохраните идентификаторы сервисного аккаунта s3-copy-trigger (id) и каталога, в котором он был создан (folder_id).

  4. Назначьте сервисному аккаунту роль functions.functionInvoker на каталог:

    yc resource-manager folder add-access-binding <идентификатор_каталога> \
      --role storage.uploader \
      --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    

Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.

  1. Опишите в конфигурационном файле параметры сервисных аккаунтов:

    // Сервисный аккаунт для работы функции
    resource "yandex_iam_service_account" "s3-copy-fn" {
      name        = "s3-copy-fn"
      folder_id   = "<идентификатор_каталога>"
    }
    
    resource "yandex_resourcemanager_folder_iam_member" "uploader" {
      folder_id = "<идентификатор_каталога>"
      role      = "storage.uploader"
      member    = "serviceAccount:${yandex_iam_service_account.s3-copy-fn.id}"
    }
    
    resource "yandex_resourcemanager_folder_iam_member" "viewer" {
      folder_id = "<идентификатор_каталога>"
      role      = "storage.viewer"
      member    = "serviceAccount:${yandex_iam_service_account.s3-copy-fn.id}"
    }
    
    resource "yandex_resourcemanager_folder_iam_member" "payloadViewer" {
      folder_id = "<идентификатор_каталога>"
      role      = "lockbox.payloadViewer"
      member    = "serviceAccount:${yandex_iam_service_account.s3-copy-fn.id}"
    }
    
    // Сервисный аккаунт для вызова функции
    resource "yandex_iam_service_account" "s3-copy-trigger" {
      name        = "s3-copy-trigger"
      folder_id   = "<идентификатор_каталога>"
    }
    
    resource "yandex_resourcemanager_folder_iam_member" "functionInvoker" {
      folder_id = "<идентификатор_каталога>"
      role      = "functions.functionInvoker"
      member    = "serviceAccount:${yandex_iam_service_account.s3-copy-trigger.id}"
    }
    

    Где:

    • name — имя сервисного аккаунта. Обязательный параметр.
    • folder_id — идентификатор каталога. Необязательный параметр. По умолчанию будет использовано значение, указанное в настройках провайдера.
    • role — назначаемая роль.

    Более подробную информацию о параметрах ресурса yandex_iam_service_account в Terraform, см. в документации провайдера.

  2. Проверьте корректность конфигурационных файлов.

    1. В командной строке перейдите в папку, где вы создали конфигурационный файл.

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится информация о сервисном аккаунте. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание сервисных аккаунтов: введите в терминал слово yes и нажмите Enter.

      После этого будут созданы сервисные аккаунты. Проверить появление сервисных аккаунтов можно в консоли управления или с помощью команды CLI:

      yc iam service-account list
      

Чтобы создать сервисный аккаунт, воспользуйтесь методом create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.

Чтобы назначить сервисному аккаунту роли на каталог, воспользуйтесь методом setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.

Создайте статический ключСоздайте статический ключ

Создайте статический ключ доступа для сервисного аккаунта s3-copy-fn.

Консоль управления
Yandex Cloud CLI
Terraform
API
  1. В консоли управления перейдите в каталог, в котором находится сервисный аккаунт.
  2. В списке сервисов выберите Identity and Access Management.
  3. На панели слева выберите Сервисные аккаунты и выберите сервисный аккаунт s3-copy-fn.
  4. На верхней панели нажмите кнопку Создать новый ключ.
  5. Выберите Создать статический ключ доступа.
  6. Задайте описание ключа и нажмите кнопку Создать.
  7. Сохраните идентификатор и секретный ключ.
  1. Выполните команду:

    yc iam access-key create --service-account-name s3-copy-fn
    

    Результат:

    access_key:
      id: aje6t3vsbj8l********
      service_account_id: ajepg0mjt06s********
      created_at: "2023-03-21T14:37:51Z"
      key_id: 0n8X6WY6S24********
    secret: JyTRFdqw8t1kh2-OJNz4JX5ZTz9Dj1rI********
    
  2. Сохраните идентификатор (key_id) и секретный ключ (secret). Получить значение ключа снова будет невозможно.

  1. Опишите в конфигурационном файле параметры ключа:

    resource "yandex_iam_service_account_static_access_key" "sa-static-key" {
      service_account_id = "<идентификатор_сервисного_аккаунта>"
    }
    

    Где service_account_id — идентификатор сервисного аккаунта s3-copy-fn.

    Более подробную информацию о параметрах ресурса yandex_iam_service_account_static_access_key в Terraform, см. в документации провайдера.

  2. Проверьте корректность конфигурационных файлов.

    1. В командной строке перейдите в папку, где вы создали конфигурационный файл.

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание статического ключа доступа: введите в терминал слово yes и нажмите Enter.

      Если при создании ключа возникли ошибки, Terraform на них укажет.
      При успешном создании ключа Terraform запишет его в свою конфигурацию, но не покажет пользователю. В терминал будет выведен только идентификатор созданного ключа.

      Проверить появление ключа у сервисного аккаунта можно в консоли управления или с помощью команды CLI:

      yc iam access-key list --service-account-name=s3-copy-fn
      

Чтобы создать ключ доступа, воспользуйтесь методом REST API create для ресурса AccessKey или вызовом gRPC API AccessKeyService/Create.

Создайте секретСоздайте секрет

Создайте секрет Yandex Lockbox для хранения статического ключа доступа.

Консоль управления
Yandex Cloud CLI
Terraform
API
  1. В консоли управления выберите каталог, в котором хотите создать секрет.

  2. В списке сервисов выберите Lockbox.

  3. Нажмите кнопку Создать секрет.

  4. В поле Имя укажите имя секрета: s3-static-key.

  5. В блоке Данные секрета:

    1. Выберите тип секрета Пользовательский.

    2. Добавьте значение идентификатора ключа:

      • В поле Ключ укажите: key_id.
      • В поле Значение укажите значение идентификатора ключа, которое получили ранее.
    3. Нажмите кнопку Добавить ключ/значение.

    4. Добавьте значение секретного ключа:

      • В поле Ключ укажите: secret.
      • В поле Значение укажите значение секретного ключа, которое получили ранее.
  6. Нажмите кнопку Создать.

Чтобы создать секрет, выполните команду:

yc lockbox secret create --name s3-static-key \
  --payload "[{'key': 'key_id', 'text_value': '<идентификатор_ключа>'},{'key': 'secret', 'text_value': '<значение_секретного_ключа>'}]"

Результат:

id: e6q2ad0j9b55********
folder_id: b1gktjk2rg49********
created_at: "2021-11-08T19:23:00.383Z"
name: s3-static-key
status: ACTIVE
current_version:
  id: g6q4fn3b6okj********
  secret_id: e6e2ei4u9b55********
  created_at: "2023-03-21T19:23:00.383Z"
  status: ACTIVE
  payload_entry_keys:
    - key_id
    - secret
  1. Опишите в конфигурационном файле параметры секрета:

    resource "yandex_lockbox_secret" "my_secret" {
      name = "s3-static-key"
    }
    
    resource "yandex_lockbox_secret_version" "my_version" {
      secret_id = yandex_lockbox_secret.my_secret.id
      entries {
        key        = "key_id"
        text_value = "<идентификатор_ключа>"
      }
      entries {
        key        = "secret"
        text_value = "<значение_секретного_ключа>"
      }
    }
    

    Где:

    • name — имя секрета.
    • key — название ключа.
    • text_value — значение ключа.

    Примечание

    Рекомендуется использовать ресурс yandex_lockbox_secret_version_hashed, он хранит в состоянии Terraform значения в хешированном виде. Поддержка ресурса yandex_lockbox_secret_version остается.

    Более подробную информацию о ресурсе yandex_lockbox_secret_version_hashed см. в документации провайдера.

    Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:

    • yandex_lockbox_secret;
    • yandex_lockbox_secret_version.
  2. Проверьте корректность конфигурационных файлов.

    1. В командной строке перейдите в папку, где вы создали конфигурационный файл.

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание секрета: введите в терминал слово yes и нажмите Enter.

Чтобы создать секрет, воспользуйтесь методом REST API create для ресурса Secret или вызовом gRPC API SecretService/Create.

Создайте бакеты Object StorageСоздайте бакеты Object Storage

Создайте два бакета: основной — где будут храниться файлы, и резервный — куда будут копироваться файлы из основного бакета.

Консоль управления
AWS CLI
Terraform
API
  1. В консоли управления выберите каталог, в котором хотите создать бакеты.

  2. В списке сервисов выберите Object Storage.

  3. Создайте основной бакет:

    1. Нажмите кнопку Создать бакет.
    2. В поле Имя укажите имя для основного бакета.
    3. В полях Доступ на чтение объектов, Доступ к списку объектов и Доступ на чтение настроек выберите Ограниченный.
    4. Нажмите кнопку Создать бакет.
  4. Таким же образом создайте резервный бакет.

Если у вас еще нет интерфейса командной строки AWS CLI, установите и сконфигурируйте его.

Создайте основной и резервный бакеты:

aws --endpoint-url https://storage.yandexcloud.net \
  s3 mb s3://<имя_основного_бакета>

aws --endpoint-url https://storage.yandexcloud.net \
  s3 mb s3://<имя_резервного_бакета>

Результат:

make_bucket: <имя_основного_бакета>
make_bucket: <имя_резервного_бакета>

Примечание

Terraform взаимодействует с Object Storage от имени сервисного аккаунта. Назначьте сервисному аккаунту нужную роль, например storage.admin, на каталог, в котором будут создаваться ресурсы.

  1. Опишите в конфигурационном файле параметры для создания сервисного аккаунта и ключа доступа:

    ...
    // Создание сервисного аккаунта
    resource "yandex_iam_service_account" "sa" {
      name = "<имя_сервисного_аккаунта>"
    }
    
    // Назначение роли сервисному аккаунту
    resource "yandex_resourcemanager_folder_iam_member" "sa-admin" {
      folder_id = "<идентификатор_каталога>"
      role      = "storage.admin"
      member    = "serviceAccount:${yandex_iam_service_account.sa.id}"
    }
    
    // Создание статического ключа доступа
    resource "yandex_iam_service_account_static_access_key" "sa-static-key" {
      service_account_id = yandex_iam_service_account.sa.id
      description        = "static access key for object storage"
    }
    
  2. Опишите в конфигурационном файле параметры основного и резервного бакетов:

    resource "yandex_storage_bucket" "main-bucket" {
      access_key = yandex_iam_service_account_static_access_key.sa-static-key.access_key
      secret_key = yandex_iam_service_account_static_access_key.sa-static-key.secret_key
      bucket     = "<имя_основного_бакета>"
    }
    
    resource "yandex_storage_bucket" "reserve-bucket" {
      access_key = yandex_iam_service_account_static_access_key.sa-static-key.access_key
      secret_key = yandex_iam_service_account_static_access_key.sa-static-key.secret_key
      bucket     = "<имя_резервного_бакета>"
    }
    

    Подробнее о ресурсе yandex_storage_bucket см. в документации провайдера Terraform.

  3. Проверьте корректность конфигурационных файлов.

    1. В командной строке перейдите в папку, где вы создали конфигурационный файл.

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  4. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание бакетов: введите в терминал слово yes и нажмите Enter.

Чтобы создать бакет, воспользуйтесь методом REST API create для ресурса Bucket или вызовом gRPC API BucketService/Create.

Подготовьте ZIP-архив с кодом функцииПодготовьте ZIP-архив с кодом функции

  1. Сохраните следующий код в файл с названием handler.sh:

    set -e
    (
      cat | jq -c '.messages[]' | while read message; 
      do
        SRC_BUCKET=$(echo "$message" | jq -r .details.bucket_id)
        SRC_OBJECT=$(echo "$message" | jq -r .details.object_id)
        aws --endpoint-url="$S3_ENDPOINT" s3 cp "s3://$SRC_BUCKET/$SRC_OBJECT" "s3://$DST_BUCKET/$SRC_OBJECT"
      done;
    ) 1>&2
    
  2. Добавьте файл handler.sh в ZIP-архив handler-sh.zip.

Создайте функциюСоздайте функцию

Создайте функцию, которая при добавлении нового объекта в основной бакет будет копировать его в резервный бакет.

Консоль управления
Yandex Cloud CLI
Terraform
API
  1. В консоли управления перейдите в каталог, в котором хотите создать функцию.

  2. В списке сервисов выберите Cloud Functions

  3. Создайте функцию:

    1. Нажмите кнопку Создать функцию.
    2. Укажите имя функции — copy-function.
    3. Нажмите кнопку Создать.
  4. Создайте версию функции:

    1. Выберите среду выполнения Bash, отключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.

    2. Укажите способ загрузки ZIP-архив и выберите архив handler-sh.zip, который создали на предыдущем шаге.

    3. Укажите точку входа handler.sh.

    4. В блоке Параметры укажите:

      • Таймаут — 600.

      • Память — 128 МБ.

      • Сервисный аккаунт — s3-copy-fn.

      • Переменные окружения:

        • S3_ENDPOINT — https://storage.yandexcloud.net.
        • DST_BUCKET — имя резервного бакета, в который нужно копировать объекты.
      • Секреты Lockbox:

        • AWS_ACCESS_KEY_ID — идентификатор секрета s3-static-key, идентификатор версии latest, ключ секрета key_id.
        • AWS_SECRET_ACCESS_KEY — идентификатор секрета s3-static-key, идентификатор версии latest, ключ секрета secret.
    5. Нажмите кнопку Сохранить изменения.

  1. Создайте функцию copy-function:

    yc serverless function create --name=copy-function
    

    Результат:

    id: b09bhaokchn9********
    folder_id: <идентификатор_каталога>
    created_at: "2024-10-21T20:40:03.451Z"
    name: copy-function
    http_invoke_url: https://functions.yandexcloud.net/b09bhaokchn9********
    status: ACTIVE
    
  2. Создайте версию функции copy-function:

    yc serverless function version create \
      --function-name copy-function \
      --memory=128m \
      --execution-timeout=600s \
      --runtime=bash \
      --entrypoint=handler.sh \
      --service-account-id=<идентификатор_сервисного_аккаунта> \
      --environment DST_BUCKET=<имя_резервного_бакета> \
      --environment S3_ENDPOINT=https://storage.yandexcloud.net \
      --secret name=s3-static-key,key=key_id,environment-variable=AWS_ACCESS_KEY_ID \
      --secret name=s3-static-key,key=secret,environment-variable=AWS_SECRET_ACCESS_KEY \
      --source-path=./handler-sh.zip
    

    Где:

    • --function-name — имя функции, версия которой создается.
    • --memory — объем RAM.
    • --execution-timeout — максимальное время выполнения функции до таймаута.
    • --runtime — среда выполнения.
    • --entrypoint — точка входа.
    • --service-account-id — идентификатор сервисного аккаунта s3-copy-fn.
    • --environment — переменные окружения.
    • --secret — секрет, содержащий части статического ключа доступа.
    • --source-path — путь до ZIP-архива handler-sh.zip.

    Результат:

    done (1s)
    id: d4e394pt4nhf********
    function_id: d4efnkn79m7n********
    created_at: "2024-10-21T20:41:01.345Z"
    runtime: bash
    entrypoint: handler.sh
    resources:
      memory: "134217728"
    execution_timeout: 600s
    service_account_id: ajelprpohp7r********
    image_size: "4096"
    status: ACTIVE
    tags:
      - $latest
    environment:
      DST_BUCKET: <имя_резервного_бакета>
      S3_ENDPOINT: https://storage.yandexcloud.net
    secrets:
      - id: e6qo2oprlmgn********
        version_id: e6q6i1qt0ae8********
        key: key_id
        environment_variable: AWS_ACCESS_KEY_ID
      - id: e6qo2oprlmgn********
        version_id: e6q6i1qt0ae8********
        key: secret
        environment_variable: AWS_SECRET_ACCESS_KEY
    log_options:
      folder_id: b1g681qpemb4********
    concurrency: "1"
    
  1. Опишите в конфигурационном файле параметры функции:

    resource "yandex_function" "copy-function" {
      name               = "copy-functionn"
      user_hash          = "first function"
      runtime            = "bash"
      entrypoint         = "handler.sh"
      memory             = "128"
      execution_timeout  = "600"
      service_account_id = "<идентификатор_сервисного_аккаунта>"
      environment = {
        DST_BUCKET  = "<имя_резервного_бакета>"
        S3_ENDPOINT = "https://storage.yandexcloud.net"
      }
      secrets = {
        id = "<идентификатор_секрета>"
        version_id = "<идентификатор_версии_секрета>"
        key = "key_id"
        environment_variable = "AWS_ACCESS_KEY_ID"
      }
      secrets = {
        id = "<идентификатор_секрета>"
        version_id = "<идентификатор_версии_секрета>"
        key = "secret"
        environment_variable = "AWS_SECRET_ACCESS_KEY"
      }
      content {
        zip_filename = "./handler-sh.zip"
      }
    }
    

    Где:

    • name — имя функции.
    • user_hash — произвольная строка, определяющая версию функции.
    • runtime — среда выполнения функции.
    • entrypoint — точка входа.
    • memory — объем памяти в мегабайтах, отведенный для выполнения функции.
    • execution_timeout — таймаут выполнения функции.
    • service_account_id — идентификатор сервисного аккаунта s3-copy-fn.
    • environment — переменные окружения.
    • secrets — секрет, содержащий части статического ключа доступа.
    • content — путь до ZIP-архива handler-sh.zip c исходным кодом функции.

    Более подробную информацию о параметрах ресурса yandex_function см. в документации провайдера.

  2. Проверьте корректность конфигурационных файлов.

    1. В командной строке перейдите в папку, где вы создали конфигурационный файл.

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание функции: введите в терминал слово yes и нажмите Enter.

Чтобы создать функцию, воспользуйтесь методом create для ресурса Function или вызовом gRPC API FunctionService/Create.

Чтобы создать версию функцию, воспользуйтесь методом createVersion для ресурса Function или вызовом gRPC API FunctionService/CreateVersion.

Создайте триггерСоздайте триггер

Создайте триггер для Object Storage, который будет вызывать функцию copy-function при создании нового объекта в основном бакете.

Консоль управления
Yandex Cloud CLI
Terraform
API
  1. В консоли управления перейдите в каталог, в котором хотите создать триггер.

  2. В списке сервисов выберите Cloud Functions

  3. На панели слева выберите Триггеры.

  4. Нажмите кнопку Создать триггер.

  5. В блоке Базовые параметры:

    • Укажите имя триггера: bucket-to-bucket-copying.
    • В поле Тип выберите Object Storage.
    • В поле Запускаемый ресурс выберите Функция.
  6. В блоке Настройки Object Storage:

    • В поле Бакет выберите основной бакет.
    • В поле Типы событий выберите Создание объекта.
  7. В блоке Настройки функции:

    • В поле Функция выберите функцию copy-function.
    • В поле Сервисный аккаунт выберите сервисный аккаунт s3-copy-trigger.
  8. Нажмите кнопку Создать триггер.

Выполните команду:

yc serverless trigger create object-storage \
  --name bucket-to-bucket-copying \
  --bucket-id <имя_основного_бакета> \
  --events 'create-object' \
  --invoke-function-name copy-function \
  --invoke-function-service-account-name s3-copy-trigger

Где:

  • --name — имя триггера.
  • --bucket-id — имя основного бакета.
  • --events — события, после наступления которых триггер запускается.
  • --invoke-function-name — имя вызываемой функции.
  • --invoke-function-service-account-name — имя сервисного аккаунта, от имени которого будет вызываться функция.

Результат:

id: a1s92agr8mpg********
folder_id: b1g88tflru0e********
created_at: "2024-10-21T21:04:01.866959640Z"
name: bucket-to-bucket-copying
rule:
  object_storage:
    event_type:
      - OBJECT_STORAGE_EVENT_TYPE_CREATE_OBJECT
    bucket_id: <имя_основного_бакета>
    batch_settings:
      size: "1"
      cutoff: 1s
    invoke_function:
      function_id: d4eofc7n0m03********
      function_tag: $latest
      service_account_id: aje3932acd0c********
status: ACTIVE
  1. Опишите в конфигурационном файле параметры триггера:

    resource "yandex_function_trigger" "my_trigger" {
      name        = "bucket-to-bucket-copying"
      object_storage {
          bucket_id = "<имя_основного_бакета>"
          create    = true
      }
      function {
        id                 = "<идентификатор_функции>"
        service_account_id = "<идентификатор_сервисного_аккаунта>"
      }
    }
    

    Где:

    • name — имя триггера.
    • object_storage — параметры хранилища:
      • bucket_id — имя основного бакета.
      • create — триггер вызовет функцию при создании нового объекта в хранилище.
    • function — настройки функции, которую будет запускать триггер:
      • id — идентификатор функции copy-function.
      • service_account_id — идентификатор сервисного аккаунта s3-copy-trigger.

    Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера.

  2. Проверьте корректность конфигурационных файлов.

    1. В командной строке перейдите в папку, где вы создали конфигурационный файл.

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание триггера: введите в терминал слово yes и нажмите Enter.

Чтобы создать триггер для Object Storage, воспользуйтесь методом create для ресурса Trigger или вызовом gRPC API TriggerService/Create.

Протестируйте функциюПротестируйте функцию

Консоль управления
  1. В консоли управления перейдите в каталог, где находится основной бакет.
  2. В списке сервисов выберите Object Storage.
  3. Нажмите на имя основного бакета.
  4. В правом верхнем углу нажмите кнопку Загрузить.
  5. В появившемся окне выберите необходимые файлы и нажмите кнопку Открыть.
  6. Консоль управления отобразит все объекты, выбранные для загрузки. Нажмите кнопку Загрузить.
  7. Обновите страницу.
  8. Перейдите в резервный бакет и убедитесь, что в нем появились добавленные файлы.

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Удалите объекты из бакетов.
  2. Удалите бакеты.
  3. Удалите триггер bucket-to-bucket-copying.
  4. Удалите функцию copy-function.

Была ли статья полезна?

Предыдущая
Создание интерактивного serverless-приложения с использованием WebSocket
Следующая
Визуализация логов в Grafana с помощью плагина Cloud Logging
Проект Яндекса
© 2025 ООО «Яндекс.Облако»