Подключение к Object Storage из Virtual Private Cloud
Совет
Помимо решения, описанного в статье, доступ в Object Storage от ресурсов облачной сети без доступа в интернет также можно реализовать с помощью сервисного подключения VPC. Подробнее см. на странице Доступ в бакет с помощью сервисного подключения из 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 с 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 создается внутренняя DNS-зона storage.yandexcloud.net.
и ресурсная запись типа A
, сопоставляющая доменное имя storage.yandexcloud.net
сервиса Object Storage с IP-адресом внутреннего сетевого балансировщика. Благодаря этой записи трафик от облачных ресурсов к Object Storage будет направляться на внутренний балансировщик, который будет распределять нагрузку по виртуальным машинам с NAT.
Для развертывания ВМ с NAT используется образ NAT-инстанс на основе Ubuntu 22.04 LTS из Cloud Marketplace, который обеспечивает трансляции IP-адресов источника и назначения, чтобы обеспечить маршрутизацию трафика до публичного IP-адреса Object Storage.
Разместив ВМ с NAT в нескольких зонах доступности, можно получить отказоустойчивость доступа к Object Storage. Увеличивая количество ВМ с NAT, можно масштабировать решение при возрастании нагрузки. При расчете количества ВМ с NAT следует учитывать локальность при обработке трафика внутренним балансировщиком.
Политика доступа Object Storage разрешает действия с бакетом только с публичных IP-адресов ВМ с NAT. Доступ к бакету открыт только для облачных ресурсов, использующих данное решение. Подключиться к бакету в Object Storage через публичный API Endpoint не получится. При необходимости это ограничение можно отключить с помощью параметра в конфигурационном файле Terraform.
Результаты тестирования пропускной способности ВМ с NAT
Решение тестировалось на одной ВМ с NAT в следующей конфигурации:
- Платформа — Intel Ice Lake (
standard-v3
). - Уровень производительности — 100%.
- Количество vCPU — 2.
- Объем RAM — 2 ГБ.
Средняя скорость обработки трафика к Object Storage составила 250 МБ/с в обоих направлениях.
Для тестирования использовалась утилита warpwarp
для тестирования:
warp get \
--host storage.yandexcloud.net \
--access-key <идентификатор_статического_ключа> \
--secret-key <секретный_ключ> \
--tls \
--bucket <имя_бакета> \
--obj.randsize \
--concurrent 20 \
--warp-client <IP-адреса_warp-клиентов>
Рекомендации по развертыванию решения в продуктивной среде
-
При развертывании ВМ с 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-адресов рабочих мест администраторов.
План развертывания
Чтобы развернуть решение и проверить его работу:
- Подготовьте облако к работе.
- Подготовьте среду для развертывания ресурсов.
- Разверните решение.
- Проверьте работоспособность решения.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за использование Object Storage (см. тарифы Yandex Object Storage).
- плата за использование сетевого балансировщика (см. тарифы Network Load Balancer).
- плата за постоянно работающие ВМ (см. тарифы Yandex Compute Cloud).
- плата за использование публичных IP-адресов и исходящий трафик (см. тарифы Yandex Virtual Private Cloud).
Подготовьте среду для развертывания ресурсов
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его и аутентифицируйтесь от имени пользователя.
-
Проверьте наличие учетной записи в облаке Yandex Cloud с правами
admin
на каталог, в котором выполняете развертывание. -
Проверьте квоты в облаке, чтобы была возможность развернуть ресурсы в сценарии:
Информация о количестве создаваемых ресурсов
Ресурс Количество Виртуальные машины 5 vCPU виртуальных машин 10 RAM виртуальных машин 10 ГБ Диски 5 Объем HDD дисков 30 ГБ Объем SSD дисков 40 ГБ Сетевой балансировщик 1 Целевая группа для балансировщика 1 Сети 11 Подсети 3 Статические публичные IP-адреса 4 Группы безопасности 1 Зона DNS 1 Бакет 1 Сервисный аккаунт 2 Статический ключ для сервисного аккаунта 1 1 Если пользователь в
terraform.tfvars
не указал идентификатор существующей сети.
Разверните решение с помощью Terraform
-
Склонируйте на вашу рабочую станцию репозиторий
yandex-cloud-examples/yc-s3-private-endpoint
и перейдите в папкуyc-s3-private-endpoint
:git clone https://github.com/yandex-cloud-examples/yc-s3-private-endpoint.git cd yc-s3-private-endpoint
-
Настройте окружение для аутентификации в Terraform (подробнее см. Начало работы с Terraform):
export YC_TOKEN=$(yc iam create-token)
-
Переменные параметры создаваемых ресурсов определены в файле
variables.tf
. Заполните файлterraform.tfvars
вашими значениями для переменных. Обязательные параметры для изменения отмечены в таблице.Детальная информация о заполняемых значениях
Название
параметраЗамена на
пользовательское
значениеОписание Тип Пример folder_id
да Идентификатор каталога для размещения компонентов решения. string
"b1gentmqf1ve********"
vpc_id
— Идентификатор облачной сети, для которой организуется доступ к Object Storage. Если не указан, то сеть будет создана. string
"enp48c1ndilt********"
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
-
Выполните инициализацию Terraform:
terraform init
-
Проверьте список создаваемых облачных ресурсов:
terraform plan
-
Создайте ресурсы:
terraform apply
-
После завершения процесса
terraform apply
в командной строке будет выведена информация для подключения к тестовой ВМ и тестирования работы с Object Storage. В дальнейшем его можно будет посмотреть с помощью командыterraform output
:Информация о развернутых ресурсах
Название Описание Пример значения path_for_private_ssh_key
Файл с закрытым ключом для подключения по протоколу SSH к ВМ с NAT и тестовой ВМ. ./pt_key.pem
vm_username
Имя пользователя для ВМ с NAT и тестовой ВМ. admin
test_vm_password
Пароль пользователя admin
для тестовой ВМ.v3RСqU****
s3_bucket_name
Имя бакета в Object Storage. s3-bucket-<...>
s3_nlb_ip_address
IP-адрес внутреннего балансировщика. 10.10.1.100
Проверьте работоспособность решения
-
В консоли управления
перейдите в каталог, в котором ранее были созданы ресурсы. -
Выберите сервис Compute Cloud.
-
В списке виртуальных машин выберите ВМ
test-s3-vm
. -
Перейдите на вкладку Серийная консоль.
-
Нажмите кнопку Подключиться.
-
Введите логин
admin
и пароль из вывода командыterraform output test_vm_password
(укажите значение без кавычек). -
Выполните команду:
dig storage.yandexcloud.net
-
Убедитесь, что в ответе от DNS-сервера доменному имени сервиса Object Storage соответствует IP-адрес внутреннего балансировщика. Результат вывода ресурсной записи типа
A
:;; ANSWER SECTION: storage.yandexcloud.net. 300 IN A 10.10.1.100
-
Получите объект из бакета в 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
-
Дополнительно можете выполнить несколько команд для проверки работы 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-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-