Запуск контейнерного приложения в Yandex Serverless Containers
- Подготовьте облако к работе
- Создайте сервисный аккаунт
- Создайте сеть и настройте группу безопасности
- Создайте виртуальную машину с MongoDB
- Создайте секрет Yandex Lockbox
- Создайте реестр Container Registry
- Загрузите Docker-образ в реестр
- Создайте контейнер Serverless Containers
- Создайте API-шлюз API Gateway
- Проверьте работу приложения
- Как удалить созданные ресурсы
С помощью этого руководства вы сможете развернуть контейнер с приложением в сервисе Serverless Containers для администрирования СУБД MongoDB.
СУБД развернута на виртуальной машине Yandex Compute Cloud, контейнер с приложением хранится в реестре Yandex Container Registry, чувствительные данные зашифрованы с помощью Yandex Lockbox, а безопасный доступ к приложению реализован через API-шлюз Yandex API Gateway. Вся инфраструктура контейнерного приложения располагается в одном каталоге.
Чтобы развернуть контейнерное приложение:
- Подготовьте облако к работе.
- Создайте сервисный аккаунт.
- Создайте сеть и настройте группу безопасности.
- Создайте виртуальную машину Compute Cloud с MongoDB.
- Создайте секрет Yandex Lockbox и версию.
- Создайте реестр Container Registry.
- Загрузите Docker-образ в Container Registry.
- Создайте контейнер Serverless Containers.
- Создайте API-шлюз API Gateway.
- Проверьте работу приложения.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки приложения входит:
- плата за постоянно запущенную ВМ (см. тарифы Yandex Compute Cloud);
- плата за хранение секретов (см. тарифы Yandex Lockbox);
- плата за хранение Docker-образа (см. тарифы Yandex Container Registry);
- плата за количество вызовов контейнера, вычислительные ресурсы, выделенные для выполнения приложения, и исходящий трафик (см. тарифы Serverless Containers);
- плата за запросы к API-шлюзу (см. тарифы Yandex API Gateway).
Создайте сервисный аккаунт
Создайте сервисный аккаунт и назначьте ему роли на каталог, в котором будет размещаться инфраструктура контейнерного приложения.
- В консоли управления
перейдите в каталог, в котором будет размещаться инфраструктура контейнерного приложения. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта —
mongo-express
. - Нажмите Добавить роль и выберите роли
container-registry.images.puller
,lockbox.payloadViewer
иserverless-containers.containerInvoker
. - Нажмите Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сервисный аккаунт с именем
mongo-express
:yc iam service-account create --name mongo-express
-
Назначьте сервисному аккаунту роли
container-registry.images.puller
,lockbox.payloadViewer
иserverless-containers.containerInvoker
на каталог, в котором будет размещаться контейнер:yc resource-manager folder add-access-binding <имя_или_идентификатор_каталога> \ --role container-registry.images.puller, lockbox.payloadViewer, serverless-containers.containerInvoker \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Где:
<имя_или_идентификатор_каталога>
— имя или идентификатор каталога, в котором будет размещаться контейнер.--subject serviceAccount
— идентификатор сервисного аккаунтаmongo-express
.
Чтобы создать сервисный аккаунт, воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
Чтобы назначить сервисному аккаунту роли на каталог, воспользуйтесь методом REST API updateAccessBindings для ресурса Folder или вызовом gRPC API FolderService/UpdateAccessBindings.
Создайте сеть и настройте группу безопасности
-
В консоли управления
выберите каталог, в котором нужно создать сеть. -
В списке сервисов выберите Virtual Private Cloud.
-
Справа сверху нажмите Создать сеть.
-
В поле Имя укажите
mongo-express-network
. -
В поле Дополнительно выберите опцию Создать подсети.
-
Нажмите Создать сеть.
-
На панели слева выберите
Группы безопасности. -
Нажмите значок
напротив группы безопасности, созданной по умолчанию для сетиmongo-express-network
. -
В открывшемся меню нажмите Редактировать.
-
Настройте группу безопасности:
-
Нажмите Создать группу безопасности.
-
В блоке Правила добавьте правило по инструкции под таблицей:
Направление
трафикаОписание Диапазон портов Протокол Назначение /
ИсточникCIDR блоки Входящий
any
27017
Любой
CIDR
0.0.0.0/0
- Выберите вкладку Исходящий трафик или Входящий трафик.
- Нажмите Добавить правило.
- В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик. Чтобы открыть все порты, нажмите Выбрать весь диапазон.
- В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.
- В поле Назначение или Источник выберите
CIDR
— правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите0.0.0.0/0
. - Нажмите Сохранить.
-
Нажмите Сохранить.
-
Повторно нажмите Сохранить.
-
-
Создайте облачную сеть:
yc vpc network create \ --name mongo-express-network
-
Узнайте имя или идентификатор группы, которую требуется изменить:
yc vpc security-groups list
Результат:
+----------------------+---------------------------------+------------------------------------+----------------------+ | ID | NAME | DESCRIPTION | NETWORK-ID | +----------------------+---------------------------------+------------------------------------+----------------------+ | enp9bmjge93b******** | default-sg-enp509crtquf******** | Default security group for network | enp509crtquf******** | +----------------------+---------------------------------+------------------------------------+----------------------+
-
Добавьте правило с помощью команды
update-rules
и параметра--add-rule
:yc vpc security-group update-rules <имя_или_идентификатор_группы> \ --add-rule "direction=ingress,port=27017,protocol=any,v4-cidrs=[0.0.0.0/0,0.0.0.0/0]"
Где
<имя_или_идентификатор_группы>
— значение, полученное шагом ранее.
-
Чтобы создать облачную сеть, воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create и передайте в запросе:
- Идентификатор каталога, в котором будет размещаться сеть.
- Имя новой сети
mongo-express-network
в параметреname
.
-
Чтобы добавить правило в группу безопасности, воспользуйтесь методом REST API updateRules для ресурса SecurityGroup или вызовом gRPC API SecurityGroupService/UpdateRules и передайте в запросе:
-
Идентификатор группы безопасности, в которую будут добавлены правила, в параметре
securityGroupId
.Чтобы узнать идентификатор группы безопасности, воспользуйтесь методом REST API list для ресурса SecurityGroup или вызовом gRPC API SecurityGroupService/List и передайте в запросе идентификатор каталога в параметре
folderId
. -
Новые правила группы безопасности в массиве
additionRuleSpecs[]
:- Направление трафика —
ingress
. - Имя протокола передачи трафика в параметре
additionRuleSpecs[].protocolName
—any
. - Список CIDR и масок подсетей в параметре
additionRuleSpecs[].cidrBlocks.v4CidrBlocks[]
—[0.0.0.0/0,0.0.0.0/0]
. - Первый порт из диапазона портов для трафика в параметре
additionRuleSpecs[].ports.fromPort
—0
. - Последний порт из диапазона портов для трафика в параметре
additionRuleSpecs[].ports.toPort
—65535
.
- Направление трафика —
-
Создайте виртуальную машину с MongoDB
Рекомендуем использовать ВМ в минимальной конфигурации.
-
В консоли управления
выберите каталог, в котором нужно создать ВМ. -
В списке сервисов выберите Compute Cloud.
-
Справа сверху нажмите Создать виртуальную машину.
-
В блоке Общая информация укажите имя ВМ —
mongo-vm
. -
В блоке Образ загрузочного диска:
-
Перейдите на вкладку Container Solution и нажмите Настроить.
-
В открывшемся окне перейдите на вкладку Docker-compose и укажите спецификацию ВМ:
version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: mongo_db_user MONGO_INITDB_ROOT_PASSWORD: <пароль> ports: - 27017:27017
В значении параметра
MONGO_INITDB_ROOT_PASSWORD
задайте пароль, который будет использоваться для доступа к БД. Для создания пароля можно воспользоваться генератором паролей . Сохраните пароль, он понадобится вам на следующих шагах. -
Нажмите Применить.
-
-
В блоке Доступ укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя ВМ.
- В поле SSH-ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.
-
Нажмите Создать ВМ.
Дождитесь перехода ВМ в статус Running
и сохраните ее публичный IP-адрес — он потребуется для подключения к БД.
-
Подготовьте пару ключей (открытый и закрытый) для SSH-доступа на ВМ.
-
Подготовьте файл спецификации Docker-контейнера
docker-spec.yaml
:version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: mongo_db_user MONGO_INITDB_ROOT_PASSWORD: <пароль> ports: - 27017:27017
В значении параметра
MONGO_INITDB_ROOT_PASSWORD
задайте пароль, который будет использоваться для доступа к БД. Для создания пароля можно воспользоваться генератором паролей . Сохраните пароль, он понадобится вам на следующих шагах. -
Выполните команду:
yc compute instance create-with-container \ --coi-spec-file docker-spec.yaml \ --name mongo-vm \ --zone ru-central1-b \ --ssh-key ssh-key.pub \ --create-boot-disk size=30
Где:
--coi-spec-file
— путь к файлу спецификации Docker-контейнера.--name
— имя ВМ.--zone
— зона доступности.--ssh-key
— содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.--create-boot-disk size
— размер загрузочного диска. Должен быть не менее 30 ГБ.
Результат:
done (1m40s) id: epde18u4mahl******** folder_id: b1g7gvsi89m3******** created_at: "2023-02-08T10:34:06.601Z" name: mongo-vm ...
Создайте секрет Yandex Lockbox
В секрете Yandex Lockbox в зашифрованном виде будут храниться данные для аутентификации.
- В консоли управления
выберите каталог, в котором будет создан секрет. - В списке сервисов выберите Lockbox.
- Нажмите Создать секрет.
- В поле Имя введите имя секрета —
mongodb-creds
. - В блоке Версия:
- В поле Ключ введите
login
. - В поле Значение введите логин пользователя БД —
mongo_db_user
.
- В поле Ключ введите
- Нажмите Добавить ключ/значение и укажите второй секрет:
- В поле Ключ введите
password
. - В поле Значение введите пароль для доступа к БД — значение
MONGO_INITDB_ROOT_PASSWORD
из спецификации ВМ.
- В поле Ключ введите
- Нажмите Создать.
-
Создайте секрет
mongodb-creds
с помощью команды:yc lockbox secret create \ --name mongodb-creds \ --payload "[{'key': 'login', 'text_value': 'mongo_db_user'},{'key': 'password', 'text_value': '<пароль>'}]"
Где:
--name
— имя секрета.--payload
— содержимое секрета в виде массива YAML или JSON.<пароль>
— значениеMONGO_INITDB_ROOT_PASSWORD
из спецификации ВМ.
Результат:
id: e6q6nbjfu9m2******** folder_id: b1qt6g8ht345******** created_at: "2023-02-08T10:34:06.601Z" name: mongodb-creds status: ACTIVE current_version: id: e6q0s9airqca******** secret_id: e6q6nbjfu9m2******** created_at: "2023-02-08T10:34:06.601Z" status: ACTIVE payload_entry_keys: - login - password
Чтобы создать секрет, воспользуйтесь методом REST API create для ресурса Secret или вызовом gRPC API SecretService/Create.
Создайте реестр Container Registry
В реестре Container Registry будет храниться Docker-образ приложения mongo-express
.
- В консоли управления
выберите каталог, в котором будет создан реестр. - В списке сервисов выберите Container Registry.
- Нажмите Создать реестр.
- Задайте имя реестра
app-registry
. - Нажмите Создать реестр.
Создайте реестр app-registry
:
yc container registry create --name app-registry
Результат:
done
id: crpd50616s9a********
folder_id: b1g88tflru0e********
name: app-registry
status: ACTIVE
created_at: "2023-02-08T10:34:06.601Z"
Чтобы создать реестр, воспользуйтесь методом REST API create для ресурса Registry или вызовом gRPC API RegistryService/CreateRegistryRequest.
Загрузите Docker-образ в реестр
-
Зарегистрируйтесь на Docker Hub
. -
Установите Docker:
-
Скачайте
образmongo-express
:docker pull mongo-express
Результат выполнения команды:
Using default tag: latest latest: Pulling from library/mongo-express 6a428f9f83b0: Pull complete f2b1fb32259e: Pull complete 40888f2a0a1f: Pull complete 4e3cc9ce09be: Pull complete eaa1898f3899: Pull complete ab4078090382: Pull complete ae780a42c79e: Pull complete e60224d64a04: Pull complete Digest: sha256:dcfcf89bf91238ff129469a5a94523b3025913dcc41597d72d4d5f4a******** Status: Downloaded newer image for mongo-express:latest docker.io/library/mongo-express:latest
-
Аутентифицируйтесь в Container Registry с помощью Docker Credential helper:
CLI-
Сконфигурируйте Docker для использования
docker-credential-yc
:yc container registry configure-docker
Результат:
Credential helper is configured in '/home/<user>/.docker/config.json'
Настройки сохраняются в профиле текущего пользователя.
-
Проверьте, что Docker сконфигурирован — в конфигурационном файле
${HOME}/.docker/config.json
должна появиться строка:"cr.yandex": "yc"
Docker готов к использованию.
-
-
Загрузите Docker-образ в реестр:
CLI-
Присвойте загруженному образу
mongo-express
URL видаcr.yandex/<идентификатор_реестра>/<имя_Docker-образа>:<тег>
:docker tag mongo-express \ cr.yandex/<идентификатор_реестра>/mongo-express:mongo-tag
-
Загрузите образ
mongo-express
в реестр:docker push cr.yandex/<идентификатор_реестра>/mongo-express:mongo-tag
-
Создайте контейнер Serverless Containers
Чтобы запустить приложение в Yandex Cloud, создайте контейнер и его ревизию.
- В консоли управления
перейдите в каталог, в котором хотите создать контейнер. - Выберите сервис Serverless Containers.
- Нажмите Создать контейнер.
- Введите имя контейнера
mongo-express-container
. - Нажмите Создать.
- Перейдите на вкладку Редактор.
- В блоке Ресурсы укажите объем RAM —
1024 МБ
. - В блоке Параметры образа:
- В поле URL образа укажите Docker-образ, загруженный ранее.
- В поле Переменные окружения добавьте переменные:
ME_CONFIG_BASICAUTH_USERNAME
— оставьте значение пустым.ME_CONFIG_BASICAUTH_PASSWORD
— оставьте значение пустым.VCAP_APP_PORT
— укажите порт8080
.ME_CONFIG_MONGODB_SERVER
— укажите публичный адрес ВМ, полученный ранее.
- В поле Секреты Lockbox укажите секреты:
ME_CONFIG_MONGODB_AUTH_USERNAME
— укажите секрет с ключомlogin
.ME_CONFIG_MONGODB_AUTH_PASSWORD
— укажите секрет с ключомpassword
.
- В блоке Настройки:
- В поле Сервисный аккаунт укажите
mongo-express
. - В поле Таймаут, с укажите
15
.
- В поле Сервисный аккаунт укажите
- В блоке Ресурсы укажите объем RAM —
- Нажмите Создать ревизию.
-
Создайте контейнер:
yc serverless container create --name mongo-express-container
Результат:
id: bba3fva6ka5g******** folder_id: b1gqvft7kjk3******** created_at: "2023-02-08T10:34:06.601Z" name: mongo-express-container url: https://bba3fva6ka5g********.containers.yandexcloud.net/ status: ACTIVE
-
Создайте ревизию контейнера:
yc serverless container revision deploy \ --container-name mongo-express-container \ --image <URL_Docker-образа> \ --cores 1 \ --memory 1GB \ --concurrency 1 \ --execution-timeout 15s \ --service-account-id <идентификатор_сервисного_аккаунта_mongo-express> \ --environment ME_CONFIG_BASICAUTH_USERNAME="", ME_CONFIG_BASICAUTH_PASSWORD="", VCAP_APP_PORT=8080, ME_CONFIG_MONGODB_SERVER=<публичный_адрес_ВМ> \ --secret environment-variable=ME_CONFIG_MONGODB_AUTH_USERNAME,key=login \ --secret environment-variable=ME_CONFIG_MONGODB_AUTH_PASSWORD,key=password
Где:
-
--image
— URL Docker-образаmongo-express
, загруженного ранее. -
--service-account-id
— идентификатор сервисного аккаунтаmongo-express
, созданного ранее. -
--environment
— переменные окружения:ME_CONFIG_BASICAUTH_USERNAME
— оставьте значение пустым.ME_CONFIG_BASICAUTH_PASSWORD
— оставьте значение пустым.VCAP_APP_PORT
— укажите порт8080
.ME_CONFIG_MONGODB_SERVER
— укажите публичный адрес ВМ, полученный ранее.
-
--secret environment-variable
— секретыME_CONFIG_MONGODB_AUTH_USERNAME
иME_CONFIG_MONGODB_AUTH_PASSWORD
, созданные ранее.
Результат:
id: bbajn5q2d74c******** container_id: bba3fva6ka5g******** created_at: "2023-02-08T10:34:06.601Z" image: image_url: cr.yandex/crpd3cicopk7********/mongo-express-container:latest image_digest: sha256:de8e1dce7ceceeafaae122f7670084a1119c961cd9ea1795eae92bd******** resources: memory: "1073741824" cores: "1" execution_timeout: 15s service_account_id: ajeqnasj95o7******** status: ACTIVE
-
Чтобы создать контейнер, воспользуйтесь методом REST API create для ресурса Container или вызовом gRPC API ContainerService/Create.
Чтобы создать ревизию контейнера, воспользуйтесь методом REST API deployRevision для ресурса Container или вызовом gRPC API ContainerService/DeployRevision.
Создайте API-шлюз API Gateway
Создайте API-шлюз с расширением x-yc-apigateway-integration:serverless_containers
.
-
В консоли управления
выберите каталог, в котором необходимо создать API-шлюз. -
В списке сервисов выберите API Gateway.
-
Нажмите Создать API-шлюз.
-
В поле Имя введите название API-шлюза —
mongo-express-gw
. -
В блок Спецификация добавьте спецификацию:
openapi: 3.0.0 info: title: Sample API version: 1.0.0 servers: - url: https://mongo-express-container.apigw.yandexcloud.net paths: /{proxy+}: x-yc-apigateway-any-method: x-yc-apigateway-integration: type: serverless_containers container_id: <идентификатор_контейнера> service_account_id: <идентификатор_сервисного_аккаунта> parameters: - explode: false in: path name: proxy required: false schema: default: '-' type: string style: simple
Где:
container_id
— идентификатор контейнераmongo-express-container
.service_account_id
— идентификатор сервисного аккаунтаmongo-express
.
-
Нажмите Создать.
-
Подготовьте файл спецификации API по стандарту OpenAPI 3.0
.Спецификация
openapi: 3.0.0 info: title: Sample API version: 1.0.0 servers: - url: https://mongo-express-container.apigw.yandexcloud.net paths: /{proxy+}: x-yc-apigateway-any-method: x-yc-apigateway-integration: type: serverless_containers container_id: <идентификатор_контейнера> service_account_id: <идентификатор_сервисного_аккаунта> parameters: - explode: false in: path name: proxy required: false schema: default: '-' type: string style: simple
Где:
container_id
— идентификатор контейнераmongo-express-container
.service_account_id
— идентификатор сервисного аккаунтаmongo-express
.
-
Укажите параметры и создайте API-шлюз с помощью команды:
yc serverless api-gateway create \ --name mongo-express-gw \ --spec=<путь_к_файлу_спецификации>
Чтобы создать API-шлюз, воспользуйтесь методом REST API create для ресурса ApiGateway или вызовом gRPC API ApiGatewayService/Create.
Проверьте работу приложения
Перейдите по ссылке https://mongo-express-container.apigw.yandexcloud.net
. Откроется административная панель MongoDB.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: