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

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