Skip to content

Организация масштабируемого подключения к Object Storage (S3) из VPC Yandex Cloud.

License

Notifications You must be signed in to change notification settings

yandex-cloud-examples/yc-s3-private-endpoint

Folders and files

NameName
Last commit message
Last commit date

Latest commit

bb65c06 · Sep 20, 2024

History

5 Commits
Sep 20, 2024
Nov 3, 2023
Nov 3, 2023
Feb 9, 2024
Mar 27, 2024
Nov 3, 2023
Nov 3, 2023
Nov 3, 2023
Nov 3, 2023
Nov 3, 2023
Nov 3, 2023
Nov 3, 2023
Feb 9, 2024

Repository files navigation

Подключение к Object Storage из VPC

Содержание

Описание решения

Подключиться к Yandex Object Storage в Yandex Cloud можно через соответствующий API Endpoint, FQDN которого потом преобразуется в публичный IP-адрес с помощью службы DNS.

В данном сценарии вы развернете в Yandex Cloud облачную инфраструктуру для организации доступа к Object Storage для ресурсов, которые размещены в облачной сети VPC и не имеют публичных IP-адресов или выхода в интернет через NAT-шлюз.

Схема решения

После развертывания решения в Yandex Cloud будут созданы следующие компоненты:

Название Описание
s3-vpc * Облачная сеть с ресурсами, для которых организуется доступ к Object Storage.
s3-nlb Внутренний сетевой балансировщик обеспечивает прием трафика к Object Storage. Балансировщик принимает TCP трафик с портом назначения 443 и распределяет его по ресурсам (ВМ) в целевой группе.
s3-nat-group Целевая группа балансировщика с виртуальными машинами, на которых включена функция NAT.
nat-a1-vm, nat-a2-vm, nat-b1-vm, nat-b2-vm Виртуальные машины с NAT в зонах ru-central1-a и ru-central1-b для передачи трафика к Object Storage и обратно с трансляцией IP-адресов источников и получателей трафика.
pub-ip-a1, pub-ip-a2, pub-ip-b1, pub-ip-b2 Публичные IP-адреса ВМ, в которые облачная сеть VPC транслирует их внутренние IP-адреса.
DNS зона и A-запись Внутренняя DNS зона storage.yandexcloud.net. в сети s3-vpc с ресурсной A записью, сопоставляющей доменное имя storage.yandexcloud.net c IP-адресом внутреннего сетевого балансировщика.
s3-bucket-<...> Бакет в Object Storage.
s3-subnet-a, s3-subnet-b Облачные подсети для размещения ВМ с NAT в зонах ru-central1-a и ru-central1-b.
test-s3-vm Тестовая ВМ для проверки доступа к Object Storage
test-s3-subnet-a Облачная подсеть для размещения тестовой ВМ

* При развертывании можно также указать существующую облачную сеть

Для облачной сети с размещаемыми ресурсами в сервисе Cloud DNS создается внутренняя зона storage.yandexcloud.net. и ресурсная A запись, сопоставляющая доменное имя storage.yandexcloud.net сервиса Object Storage c IP-адресом внутреннего сетевого балансировщика. Благодаря этой записи трафик от облачных ресурсов к Object Storage будет направляться на внутренний балансировщик, который будет распределять нагрузку по виртуальным машинам с NAT.

Для развертывания ВМ с NAT используется образ из Marketplace, который обеспечивает трансляции IP-адресов источника и назначения, чтобы обеспечить маршрутизацию трафика до публичного IP-адреса Object Storage.

Разместив ВМ с NAT в нескольких зонах доступности, можно получить отказоустойчивость доступа к Object Storage. Увеличивая количество ВМ с NAT, можно масштабировать решение при возрастании нагрузки. При расчете количества ВМ с NAT следует учитывать локальность при обработке трафика внутренним балансировщиком.

Политика доступа Object Storage разрешает действия с бакетом только с публичных IP-адресов ВМ с NAT. Доступ к бакету открыт только для облачных ресурсов, использующих данное решение. Подключиться к бакету в Object Storage через публичный API Endpoint не получится. При необходимости это ограничение можно отключить с помощью параметра в Terraform.

Рекомендации по развертыванию решения в продуктивной среде

  • При развертывании ВМ с NAT в нескольких зонах доступности рекомендуется указывать четное число ВМ для их равномерного распределения по зонам доступности.

  • Выбирая количество ВМ с NAT, следует учитывать локальность при обработке трафика внутренним балансировщиком.

  • После ввода решения в эксплуатацию рекомендуется уменьшать количество ВМ с NAT или изменять список зон доступности в параметре yc_availability_zones только в заранее запланированный период времени. В процессе применения изменений возможны прерывания в обработке трафика.

  • Если при возрастании нагрузки к Object Storage внутри ВМ с NAT наблюдается большое значение метрики CPU steal time, то для ВМ с NAT рекомендуется включить программно-ускоренную сеть.

  • По умолчанию доступ к бакету в Object Storage разрешен через консоль управления Yandex Cloud. Это разрешение можно отменить с помощью параметра bucket_console_access = false.

  • Если не указать параметр mgmt_ip при bucket_private_access = true, то развертывание решения с помощью Terraform на рабочей станции будет завершаться с ошибкой доступа к бакету.

  • В случае использования собственного DNS сервера в его настройках необходимо создать ресурсные A записи вида:

    Имя Тип Значение
    storage.yandexcloud.net. A <IP-адрес_внутреннего_балансировщика>
    <имя_бакета>.storage.yandexcloud.net. A <IP-адрес_внутреннего_балансировщика>
  • Сохраните приватный SSH ключ pt_key.pem, используемый для подключения к ВМ с NAT, в надежное место либо пересоздайте его отдельно от Terraform.

  • После развертывания решения доступ по SSH к ВМ c NAT будет закрыт. Для разрешения доступа к ВМ с NAT по протоколу SSH добавьте входящее правило для SSH трафика (TCP/22) в группе безопасности s3-nat-sg, чтобы разрешить доступ только с определенных IP-адресов рабочих мест администраторов.

  • После проверки работоспособности удалите тестовую ВМ и её подсеть.

Подготовка к развертыванию

  1. Перед выполнением развертывания нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт

  2. Установите Terraform

  3. Проверьте наличие учетной записи в облаке с правами admin на каталог

  4. Установите и настройте Yandex Cloud CLI

  5. Установите Git

  6. Проверьте квоты в облаке, чтобы была возможность развернуть ресурсы в сценарии:

    Посмотреть справочную информацию по количеству ресурсов, создаваемых в сценарии
    Ресурс Количество
    Виртуальные машины 5
    vCPU виртуальных машин 10
    RAM виртуальных машин 10 ГБ
    Диски 5
    Объем HDD дисков 30 ГБ
    Объем SSD дисков 40 ГБ
    Сетевой балансировщик 1
    Целевая группа для балансировщика 1
    Сети 1*
    Подсети 3
    Статические публичные IP-адреса 4
    Группы безопасности 1
    Зона DNS 1
    Бакет 1
    Сервисный аккаунт 2
    Статический ключ для сервисного аккаунта 1

    * Если пользователь в terraform.tfvars не указал идентификатора существующей сети.

  7. Перед развёртыванием решения уже должен существовать каталог облачных ресурсов в Yandex Cloud, в котором будут размещаться компоненты решения.

Развертывание Terraform сценария

  1. На вашей рабочей станции склонируйте репозиторий yandex-cloud-examples/yc-s3-private-endpoint из GitHub и перейдите в папку сценария yc-s3-private-endpoint:

    git clone https://github.com/yandex-cloud-examples/yc-s3-private-endpoint.git
    
    cd yc-s3-private-endpoint
  2. Настройте окружение для развертывания (подробности):

    export YC_TOKEN=$(yc iam create-token)
  3. Заполните файл terraform.tfvars вашими значениями. Обязательные параметры для изменения отмечены в таблице.

    Посмотреть детальную информацию о заполняемых значениях
    Название
    параметра
    Нужно
    изменение
    Описание Тип Пример
    folder_id да ID каталога для размещения компонент решения. string b1gentmqf1ve9uc54nfh
    vpc_id - ID облачной сети, для которой организуется доступ к Object Storage. Если не указано, то VPC будет создана. string enp48c1ndilt42veuw4x
    yc_availability_zones - Список зон доступности для развертывания ВМ с NAT. list(string) ["ru-central1-a", "ru-central1-b"]
    subnet_prefix_list - Список префиксов облачных подсетей для размещения ВМ с NAT (по одной подсети в каждой зоне доступности из списка yc_availability_zones, перечисленных в порядке: ru-central1-a, ru-central1-b и т.д.). list(string) ["10.10.1.0/24", "10.10.2.0/24"]
    nat_instances_count - Количество разворачиваемых ВМ с NAT. Рекомендуется указывать четное число для равномерного распределения ВМ по зонам доступности. number 4
    bucket_private_access - Ограничить доступ к бакету только с публичных IP-адресов ВМ с NAT. Используется значение true для ограничения, false для отмены ограничения. bool true
    bucket_console_access - Разрешить доступ к бакету через консоль управления Yandex Cloud. Используется значение true для разрешения, false для запрета. Требует указания, когда параметр bucket_private_access имеет значение true. bool true
    mgmt_ip да Публичный IP-адрес рабочей станции, на которой происходит развертывание Terraform сценария. Используется для разрешения рабочей станции выполнять действия с бакетом в процессе развертывания Terraform. Требует указания, когда параметр bucket_private_access имеет значение true. string A.A.A.A
    trusted_cloud_nets да Список агрегированных префиксов облачных подсетей, для которых разрешен доступ к Object Storage. Используется во входящем правиле групп безопасности для ВМ с NAT. list(string) ["10.0.0.0/8", "192.168.0.0/16"]
    vm_username - Имя пользователя для ВМ с NAT и тестовой ВМ. string admin
    s3_ip - Публичный IP-адрес сервиса Object Storage. string 213.180.193.243
    s3_fqdn - Доменное имя сервиса Object Storage. string storage.yandexcloud.net
  4. Выполните инициализацию Terraform:

    terraform init
  5. Проверьте список создаваемых облачных ресурсов:

    terraform plan
  6. Создайте ресурсы:

    terraform apply
  7. После завершения процесса terraform apply в командной строке будет выведен список информации для подключения к тестовой ВМ и тестирования работы с Object Storage. В дальнейшем его можно будет посмотреть с помощью команды terraform output:

    Посмотреть информацию о развернутых ресурсах
    Название Описание Пример значения
    path_for_private_ssh_key Файл с private ключом для подключения по протоколу SSH к ВМ с NAT и тестовой ВМ. ./pt_key.pem
    vm_username Имя пользователя для ВМ с NAT и тестовой ВМ. admin
    test_vm_password Пароль пользователя admin для тестовой ВМ. v3RСqUrQN?x)
    s3_bucket_name Имя бакета в Object Storage. s3-bucket-5efzzpvmys
    s3_nlb_ip_address IP-адрес внутреннего балансировщика. 10.10.1.100

Проверка работоспособности

  1. В консоли Yandex Cloud в каталоге folder_id выберите сервис Compute Cloud и в списке виртуальных машин выберите ВМ test-s3-vm. Подключитесь к серийной консоли ВМ, введите логин admin и пароль из вывода команды terraform output test_vm_password (укажите значение без кавычек).

  2. В серийной консоли ВМ выполните команду dig storage.yandexcloud.net и убедитесь, что в ответе от DNS сервера доменному имени сервиса Object Storage соответствует IP-адрес внутреннего балансировщика. Результат вывода ресурсной A записи:

    ;; ANSWER SECTION:
    storage.yandexcloud.net. 300    IN      A       10.10.1.100
    
  3. Получите объект из бакета в Object Storage с помощью команды инструмента AWS CLI. Имя бакета будет получено из переменной среды на тестовой ВМ.

    aws --endpoint-url=https://storage.yandexcloud.net \
    s3 cp s3://$BUCKET/s3_test_file.txt s3_test_file.txt
    

    Результат:

    download: s3://<имя-бакета>/s3_test_file.txt to ./s3_test_file.txt
    
  4. Дополнительно можете выполнить несколько команд для проверки работы с Object Storage. Имя бакета будет получено из переменной среды на тестовой ВМ.

    Загрузите скачанный тестовый файл в бакет под другим именем:

    aws --endpoint-url=https://storage.yandexcloud.net \
    s3 cp s3_test_file.txt s3://$BUCKET/textfile.txt
    

    Результат:

    upload: ./s3_test_file.txt to s3://<имя-бакета>/textfile.txt
    

    Получите список объектов в бакете:

    aws --endpoint-url=https://storage.yandexcloud.net \
    s3 ls --recursive s3://$BUCKET
    

    Результат:

    2023-08-16 18:24:05         53 s3_test_file.txt \
    2023-08-16 18:41:39         53 textfile.txt
    

    Удалите загруженный в бакет объект:

    aws --endpoint-url=https://storage.yandexcloud.net \
    s3 rm s3://$BUCKET/textfile.txt
    

    Результат:

    delete: s3://<имя-бакета>/textfile.txt
    

Удаление созданных ресурсов

Чтобы удалить ресурсы, созданные с помощью Terraform, выполните команду terraform destroy.

Важно

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

About

Организация масштабируемого подключения к Object Storage (S3) из VPC Yandex Cloud.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages