Общие вопросы про Cloud Functions
Я могу получить логи моей работы в сервисах?
Да, вы можете запросить информацию о работе с вашими ресурсами из логов сервисов Yandex Cloud. Для этого обратитесь в техническую поддержку
Как загрузить ZIP-архив с исходным кодом для обновления функции Serverless через CLI?
Чтобы создать версию функции из файла с ZIP-архивом, выполните команду:
yc serverless function version create --source-path
Подробнее о загрузке кода читайте в инструкции Создать версию функции.
Какого размера должен быть архив с исходным кодом для загрузки в Cloud Functions?
Напрямую можно загрузить файл размером до 3,5 МБ. Файл большего размера необходимо загружать через Yandex Object Storage. Подробнее в документации.
Я не владелец облака, но мне предоставили доступ. Какие права/роли мне нужны, чтобы я мог опубликовать функцию?
Для управления доступом к функции необходимы роли admin или resource-manager.clouds.owner. Подробнее в документации.
Как в функции на Node.js получить доступ к переменной окружения?
Для доступа к переменным окружения используется глобальная переменная process.env. Подробнее в документации
Какие модули Python можно использовать при работе с Cloud Functions? Как подключать новые модули?
Модули можно загрузить в ZIP-архиве размером до 3,5 МБ. Файл большего размера необходимо загружать через Object Storage. Подробнее в документации.
Вызов функций Cloud Functions для навыков Яндекс Алисы бесплатный. Если я из функции Cloud Functions навыка буду вызывать другую свою функцию Cloud Functions — это тоже бесплатно?
Такие вызовы будут тарифицироваться по правилам, описанным в разделе Правила тарификации для Cloud Functions.
Я хочу увеличить квоты. Как определить подходящие значения для них?
Подробнее о том, какие квоты увеличивать и насколько, в разделе Взаимосвязь квот.
Почему при попытке отправить запрос к API сервиса возвращается ошибка Illegal duration format?
При отправке API-запроса, тело которого содержит параметры в формате type.googleapis.com/google.protobuf.Duration, сервис может вернуть ошибку:
Illegal duration format; duration must end with 's' for type type.googleapis.com/google.protobuf.Duration
Передавать значения в этом формате необходимо с добавлением суффикса s.
Например:
{
"timeout": "120s"
}
Как подключиться из функции к управляемой базе данных?
По умолчанию функция Cloud Functions запускается в изолированной IPv4-сети с включенным NAT-шлюзом.
Чтобы подключиться к кластеру, укажите в параметрах функции идентификатор облачной сети, в которой находится кластер. Функция получит доступ в интернет и к пользовательским ресурсам в указанной сети, в том числе к виртуальным машинам. Подробнее о подключении функции к облачной сети читайте в разделе Сетевое взаимодействие в Cloud Functions.
Также можно подключиться к базе данных через интернет. Для этого включите публичный доступ к кластеру и настройте шифрованное соединение. Оно обязательно при подключении к базе данных через интернет согласно требованиям стандарта PCI DSS. Например, порядок подключения к кластеру Managed Service for MySQL® приведен в разделе Предварительная настройка для подключения к кластеру MySQL®.
Можно ли назначить функции статический IP-адрес?
Нет, назначить функции Cloud Functions статический IP-адрес нельзя. Функция может выполняться на ресурсах с разными IP-адресами.
В качестве альтернативы создайте виртуальную машину Yandex Compute Cloud, назначьте ей статический публичный IP-адрес, установите среду выполнения нужного языка программирования и запускайте код на этой виртуальной машине.
Примечание
Для вызова функции через собственный домен можно использовать API-шлюз:
Почему при обращении к API SpeechKit, Vision OCR или Translate возникает ошибка CORS?
При обращении к API из фронтенда веб-приложения может возникнуть ошибка:
Access to XMLHttpRequest at '<https://vision.api.cloud.yandex.net/vision/v1/batchAnalyze>'
from origin '...' has been blocked by CORS policy: Response to preflight request doesn't
pass access control check: No 'Access-Control-Allow-Origin'
Фронтенд веб-приложения не может обращаться к API этих сервисов напрямую. AI-сервисы не поддерживают кросс-доменные запросы, потому что их API не отвечают на запросы OPTIONS.
Чтобы отправлять запросы к API, создайте функцию Cloud Functions и разместите в ней обработчик, который будет передавать запросы в SpeechKit, Vision OCR или Translate.
Почему возникает ошибка No node can serve the request: Concurrent requests exceeded?
При вызове функции код не выполняется, а в логах появляется сообщение:
429 Message: No node can serve the request: Concurrent requests exceeded
Ошибка возникает при превышении одной или нескольких квот:
- «Количество одновременных операций над всеми функциями и версиями в одном облаке»;
- «Количество одновременных операций над одной функцией и ее версиями»;
- «Количество одновременно выполняемых вызовов всех функций в каждой зоне доступности».
Проверьте текущее потребление квот
Почему в логах функции появляется ошибка HTTP 499?
В логах функции Cloud Functions может появиться сообщение Error: Code 499 Message: request cancelled.
Ошибка означает, что клиент разорвал соединение до того, как функция завершила обработку запроса. Например, если код выполняется 10 секунд, а клиент ожидает ответ только 5 секунд, через 5 секунд клиент закроет соединение и в логах появится ошибка HTTP 499.
Чтобы устранить ошибку:
- увеличьте время ожидания ответа на стороне клиента;
- если изменить тайм-аут клиента нельзя, разбейте долгую задачу на несколько функций, запускаемых по таймеру.
Если ошибка сохраняется, добавьте логирование в код и проанализируйте логи:
Почему возникает ошибка No node can serve the request: Too many reschedules?
При вызове функции код не выполняется, а в логах появляется сообщение:
Code: 429 Message: No node can serve the request: Too many reschedules
Ошибка может возникнуть, если функция не отвечает на HTTP-запрос и завершает работу. Выполнение запроса планируется повторно, но при последующих запусках запрос снова не выполняется, и вызов зацикливается.
Чтобы устранить ошибку, приведите код функции в соответствие с требованиями среды выполнения.
Как добавить в функцию промежуточный CA-сертификат, если проверка TLS завершается ошибкой unable to get local issuer certificate?
Ошибка certificate verify failed: unable to get local issuer certificate обычно означает, что сервер, к которому обращается функция, отдает только листовой сертификат без промежуточного. Корневой сертификат, которым в итоге подписана цепочка, при этом может быть в системном хранилище доверенных сертификатов, но без промежуточного сертификата клиент не может выстроить цепочку до корня. Ситуация может возникнуть после перевыпуска сертификата новым CA, когда на сервере остался старый промежуточный сертификат или в конфигурации указан cert.pem вместо fullchain.pem.
Что можно сделать:
-
Если сервер ваш, настройте на нем отдачу полной цепочки сертификатов (
fullchain.pem). После этого проверка пройдет без изменений в коде функции. -
Если сервер сторонний, подключите промежуточный сертификат на стороне функции. Для этого положите файл с промежуточным сертификатом в код функции и передайте его в HTTP-клиент вместе с системным бандлом сертификатов. Путь к системному бандлу в среде выполнения —
/etc/ssl/certs/ca-certificates.crt.Примеры для Python:
-
requests: объедините системный бандл (certifi.where()) со своим сертификатом в один файл и передайте его в параметреverify="/path/to/bundle.crt". Либо задайте переменную окружения версии функцииREQUESTS_CA_BUNDLE. -
httpx:import httpx client = httpx.Client(verify="/path/to/bundle.crt") -
aiohttpили стандартный модульssl:import ssl ctx = ssl.create_default_context(cafile="/etc/ssl/certs/ca-certificates.crt") ctx.load_verify_locations("/path/to/intermediate.crt")
В других языках программирования используйте аналогичный подход: передайте путь к дополнительному сертификату через параметры HTTP-клиента или TLS-контекста и не заменяйте системный бандл, а дополняйте его.
-
Обратите внимание:
- Не передавайте в параметр
verifyтолько свой сертификат без склейки с системным бандлом — иначе перестанет проверяться доверие ко всем остальным хостам. - Дописать сертификат прямо в файл
/etc/ssl/certs/ca-certificates.crtвнутри функции не получится. Подключайте сертификат через параметры клиента, как показано выше.