Наша AWS Лямбда-функция принимает полезные данные, которые необходимо загрузить в / tmp из AWS Cloudfront. Затем он выполняет некоторые изображения, просто комбинируя эти изображения. 99% времени работает без нареканий. В последние пару недель (без внесенных изменений) мы теперь видим 4 или 5 504 ошибки тайм-аута запроса каждые 60 минут.
В нашем безсерверном режиме (см. Скриншот с пролетами) вызов функции завершается неудачно, поскольку истекло время ожидания , но все GET облачного фронта равны 200. К 268 мс загружаются все изображения, необходимые для функции, и кажется, что функция движется дальше. Тем не менее, API имеет максимум 29 секунд, поэтому функция продолжает работать, хотя шлюз API возвращает 504? Как мне преодолеть это, если функция работает нормально?
Мы включили трассировку рентгеновских лучей (см. Скриншот), и нет никаких подробностей ошибок при вызове функций любого типа? Как вы можете видеть на скриншоте, функция находится в состоянии ожидания. Не уверен, куда go отсюда отлаживать. Получение 504 ошибок раздражает, но я действительно хочу знать, что функция работает правильно.
Я думал, что xray даст мне некоторые реальные следы, хотя я мог видеть (возможно, я не настроил правильно), но на данном этапе в xray ничего не говорится о том, где время истекает в шагах вызова функции.
Вот наш более простой обработчик. Я не включаю другие функции, которые, как я полагаю, могли бы быть тайм-аутом, но они должны быть очень быстрыми. Образ будет создаваться всего за секунду, загрузка на S3 происходит, может быть, самое большее несколько секунд, затем происходит аннулирование, затем аннулирование, которое может занять еще пару секунд, если так? Это не должно быть 30 секунд, и ничто не вызывает исключение.
const { getBucketObjects, buildRackImage, uploadRackImageToS3, invalidateCdn } = require('./utils')
const HTTP_OK = 200
module.exports.buildRack = async event => {
try {
let rack
try {
rack = event.rack ? event : JSON.parse(event.body)
} catch (e) {
return Promise.reject(new Error(e))
}
if (!rack.image_name) {
// eslint-disable-next-line no-throw-literal
throw 'Image name was not provided.'
}
// basic data validation that all images are either jpg or png
const errorMsg = []
if (!rack.images) {
// eslint-disable-next-line no-throw-literal
throw 'Images array is empty.'
}
for (let i = 0; i < rack.images.length; i++) {
const typeMatch = rack.images[i].image.match(/\.([^.]*)$/) // Infer the image type.
if (!typeMatch) {
errorMsg.push(`Could not determine the image type: ${rack.images[i].image}`)
}
const imageType = typeMatch[1]
if (imageType !== 'jpg' && imageType !== 'png') {
errorMsg.push(`Unsupported image type: ${rack.images[i].image}`)
}
}
if (errorMsg.length > 0) {
errorMsg.push(JSON.stringify(rack.images))
// eslint-disable-next-line no-throw-literal
throw errorMsg.join(' ')
}
/**
* Download the rack images from S3, build the rack,
* and upload to an S3 bucket
*/
const getObjectResponse = await getBucketObjects(rack)
if (!getObjectResponse) {
// eslint-disable-next-line no-throw-literal
throw getObjectResponse
}
/**
* Build the rack image locally using imagemagick
*/
const buildRackImageResponse = await buildRackImage(rack)
if (!buildRackImageResponse) {
// eslint-disable-next-line no-throw-literal
throw buildRackImageResponse
}
/**
* Upload the rack image to S3
*/
const uploadRackImageResponse = await uploadRackImageToS3(rack.image_name)
if (!uploadRackImageResponse) {
// eslint-disable-next-line no-throw-literal
throw uploadRackImageResponse
}
/**
* Invalidate the rack image name from CDN if it exists
*/
const invalidateCdnResponse = await invalidateCdn(rack.image_name)
if (!invalidateCdnResponse) {
// eslint-disable-next-line no-throw-literal
throw invalidateCdnResponse
}
return {
statusCode: HTTP_OK,
body: JSON.stringify({
message: 'Rack Successfully Built!',
statusCode: HTTP_OK,
}),
isBase64Encoded: false,
}
} catch (e) {
// eslint-disable-next-line no-console
console.log(JSON.stringify(e))
return Promise.reject(new Error(e))
}
}