Начало работы с Serverless Containers
В этой инструкции вы подготовите Docker-образ контейнера в Yandex Container Registry и добавите его в Serverless Containers.
Подготовьте Docker-образ контейнера
Docker-образ — исполняемый пакет, который содержит все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации.
Приложение должно определять номер порта, на котором принимать запросы, из переменной окружения PORT
. Значение переменной задается сервисом автоматически.
Чтобы подготовить Docker-образ контейнера:
- Создайте реестр Yandex Container Registry.
- Создайте и соберите Docker-образ на основе Dockerfile
. - Загрузите Docker-образ в реестр.
Примеры приложений и Dockerfile
index.js
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.get("/hello", (req, res) => {
var ip = req.headers['x-forwarded-for']
console.log(`Request from ${ip}`);
return res.send("Hello!");
});
app.listen(process.env.PORT, () => {
console.log(`App listening at port ${process.env.PORT}`);
});
Dockerfile
FROM node:16-slim
WORKDIR /app
RUN npm install express
COPY ./index.js .
CMD [ "node", "index.js" ]
index.py
import os
from sanic import Sanic
from sanic.response import text
app = Sanic(__name__)
@app.after_server_start
async def after_server_start(app, loop):
print(f"App listening at port {os.environ['PORT']}")
@app.route("/hello")
async def hello(request):
ip = request.headers["X-Forwarded-For"]
print(f"Request from {ip}")
return text("Hello!")
if __name__ == "__main__":
app.run(host='0.0.0.0', port=int(os.environ['PORT']), motd=False, access_log=False)
Dockerfile
FROM python:3.10-slim
WORKDIR /app
RUN pip install --no-cache-dir --prefer-binary sanic
COPY ./index.py .
CMD [ "python", "index.py" ]
index.go
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
portStr := os.Getenv("PORT")
fmt.Printf("App listening at port %s\n", portStr)
http.Handle("/hello", hwHandler{})
http.ListenAndServe(":"+portStr, nil)
}
type hwHandler struct{}
func (hwHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
ip := request.Header.Get("X-Forwarded-For")
fmt.Printf("Request from %s\n", ip)
writer.WriteHeader(200)
_, _ = writer.Write([]byte("Hello!"))
}
Dockerfile
FROM golang:latest AS build
WORKDIR /app
ADD index.go .
RUN GOARCH=amd64 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o server-app *.go
FROM scratch
COPY --from=build /app/server-app /server-app
ENTRYPOINT ["/server-app"]
Добавьте образ в Serverless Containers
Создайте контейнер
-
В консоли управления
перейдите в каталог, в котором хотите создать контейнер. -
Выберите сервис Serverless Containers.
-
Нажмите кнопку Создать контейнер.
-
Введите имя и описание контейнера. Формат имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
Чтобы создать контейнер, выполните команду:
yc serverless container create --name <имя_контейнера>
Результат:
id: bba3fva6ka5g********
folder_id: b1gqvft7kjk3********
created_at: "2021-07-09T14:49:00.891Z"
name: my-beta-container
url: https://bba3fva6ka5g********.containers.yandexcloud.net/
status: ACTIVE
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы создать контейнер и его ревизию:
Примечание
Если реестр или репозиторий с Docker-образом не являются публичными, необходимо указать в настройках ревизии сервисный аккаунт, у которого есть права на скачивание Docker-образа. Например, роль container-registry.images.puller
на каталог или реестр, в которых находится Docker-образ.
Если в настройках ревизии указан сервисный аккаунт, у пользователя или сервисного аккаунта, от имени которого создается ревизия, должна быть роль iam.serviceAccounts.user
. Она подтверждает права на использование сервисного аккаунта.
-
Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
-
name
— имя контейнера. Обязательный параметр. Требования к имени:- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
memory
— объем памяти в МБ, выделенный контейнеру. По умолчанию — 128 МБ. -
service_account_id
— идентификатор сервисного аккаунта. -
url
— URL Docker-образа в Yandex Container Registry.
Пример структуры конфигурационного файла:
provider "yandex" { token = "<OAuth-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" zone = "ru-central1-a" } resource "yandex_serverless_container" "test-container" { name = "<имя_контейнера>" memory = <объем_памяти> service_account_id = "<идентификатор_сервисного_аккаунта>" image { url = "<URL_Docker-образа>" } }
Более подробную информацию о параметрах ресурса
yandex_serverless_container
в Terraform, см. в документации провайдера . -
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов: введите в терминал слово
yes
и нажмите Enter.После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
или с помощью команды CLI:yc serverless container list
-
Чтобы создать контейнер, воспользуйтесь методом REST API create для ресурса Container или вызовом gRPC API ContainerService/Create.
Создайте ревизию контейнера
Если реестр или репозиторий с Docker-образом не являются публичными, необходимо указать в настройках ревизии сервисный аккаунт, у которого есть права на скачивание Docker-образа. Например, роль container-registry.images.puller
на каталог или реестр, в которых находится Docker-образ.
Если в настройках ревизии указан сервисный аккаунт, у пользователя или сервисного аккаунта, от имени которого создается ревизия, должна быть роль iam.serviceAccounts.user
. Она подтверждает права на использование сервисного аккаунта.
-
В консоли управления
перейдите в каталог, в котором находится контейнер. -
Выберите сервис Serverless Containers.
-
Выберите контейнер, ревизию которого хотите создать.
-
Перейдите на вкладку Редактор.
-
В разделе Параметры образа вы можете дополнительно указать параметры ревизии:
-
Команда — команды, которые контейнер выполнит при запуске. Соответствует инструкции
ENTRYPOINT
в Dockerfile. -
Аргументы — соответствует инструкции
CMD
в Dockerfile. Аргументы указываются в форматеключ = значение
. Если не указано, будет использоваться значениеCMD
по умолчанию из Docker-образа.В контейнер можно передать несколько аргументов. Для этого нажмите Добавить.
-
Рабочая директория — позволяет изменить рабочую директорию контейнера. Соответствует инструкции
WORKDIR
в Dockerfile. Рекомендуется устанавливать абсолютные пути к папкам.
-
-
Нажмите кнопку Создать ревизию.
Чтобы создать ревизию контейнера, выполните команду:
yc serverless container revision deploy \
--container-name <имя_контейнера> \
--image <URL_Docker-образа> \
--cores 1 \
--memory 1GB \
--concurrency 1 \
--execution-timeout 30s \
--service-account-id <идентификатор_сервисного_аккаунта> \
--command '<команда_1>','<команда_2>' \
--args '<ключ_1=значение_1>','<ключ_2=значение_2>'
Где:
-
--cores
— количество ядер, которые доступны контейнеру. -
--memory
— требуемая память. По умолчанию — 128 МБ. -
--concurrency
— максимальное количество одновременных вызовов одного экземпляра контейнера. По умолчанию — 1, максимальное значение — 16. Если вызовов контейнера больше, чем значениеconcurrency
, Serverless Containers масштабирует контейнер — запускает его дополнительные экземпляры.Примечание
Количество экземпляров контейнеров и одновременных запросов к ним в каждой зоне доступности не может превышать квоты.
-
--execution-timeout
— таймаут. По умолчанию — 3 секунды. -
--service-account-id
— идентификатор сервисного аккаунта, у которого есть права на скачивание Docker-образа. -
--command
— команды, которые контейнер выполнит при запуске. Указываются через запятую. Соответствует инструкцииENTRYPOINT
в Dockerfile. -
--args
— аргументы, соответствует инструкцииCMD
в Dockerfile. Указываются в форматеключ = значение
через запятую. Если не указано, будет использоваться значениеCMD
по умолчанию из Docker-образа.
Результат:
id: bbajn5q2d74c********
container_id: bba3fva6ka5g********
created_at: "2021-07-09T15:04:55.135Z"
image:
image_url: cr.yandex/crpd3cicopk7********/test-container:latest
image_digest: sha256:de8e1dce7ceceeafaae122f7670084a1119c961cd9ea1795eae92bd********
resources:
memory: "1073741824"
cores: "1"
execution_timeout: 3s
service_account_id: ajeqnasj95o7********
status: ACTIVE
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
В Terraform ревизия создается при каждом обновлении параметров работы ресурса.
Чтобы создать ревизию:
-
Обновите в конфигурационном файле параметры ресурса
yandex_serverless_container
:resource "yandex_serverless_container" "test-container" { name = "<имя_контейнера>" cores = "<количество_ядер>" memory = "<объем_памяти>" concurrency = "<одновременные_вызовы>" service_account_id = "<идентификатор_сервисного_аккаунта>" image { url = "<URL_Docker-образа>" command = ["<команда_1>","<команда_2>"] args = ["<ключ_1=значение_1>","ключ_2=значение_2"] work_dir = "<рабочая_директория>" } }
Где:
-
cores
— количество ядер, которые доступны контейнеру. -
memory
— требуемая память. По умолчанию — 128 МБ. -
concurrency
— максимальное количество одновременных вызовов одного экземпляра контейнера. По умолчанию — 1, максимальное значение — 16. Если вызовов контейнера больше, чем значениеconcurrency
, Serverless Containers масштабирует контейнер — запускает его дополнительные экземпляры.Примечание
Количество экземпляров контейнеров и одновременных запросов к ним в каждой зоне доступности не может превышать квоты.
-
command
— команды, которые контейнер выполнит при запуске. Указываются через запятую. Соответствует инструкцииENTRYPOINT
в Dockerfile. -
args
— аргументы, соответствует инструкцииCMD
в Dockerfile. Указываются в форматеключ = значение
через запятую. Если не указано, будет использоваться значение CMD по умолчанию из Docker-образа. -
work_dir
— позволяет изменить рабочую директорию контейнера. Соответствует инструкцииWORKDIR
в Dockerfile. Рекомендуется устанавливать абсолютные пути к папкам.
Более подробную информацию о параметрах ресурса yandex_serverless_container
в Terraform, см. в документации провайдера
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
После этого будет создана ревизия. Проверить создание ревизии можно в консоли управления
или с помощью команды CLI:yc serverless container revision list
-
Чтобы создать ревизию контейнера, воспользуйтесь методом REST API deployRevision для ресурса Container или вызовом gRPC API ContainerService/DeployRevision.
Вызовите контейнер
После создания контейнера вы получите ссылку для вызова. Как узнать ее. Сделайте HTTPS-запрос, передав IAM-токен в заголовке Authorization
:
curl \
--header "Authorization: Bearer $(yc iam create-token)" \
https://bba3fva6ka5g********.containers.yandexcloud.net/hello
Результат:
Hello!
Что дальше
- Изучите концепции сервиса.