2017-02-12 4 views
1

Мой текущий стек AWS API Gateway -> AWS Lambda -> swagger-node + swagger-express-mw + aws-serverless-express.AWS API Gateway Не может GET/когда функция долгое время спала

Таким образом, мой API Swagger размещен как одна функция лямбда узла node.js и вызывается с aws_proxy из шлюза API. Это работает неплохо. Единственное, что когда функция слишком долго спала (холодный старт?), Я получаю Cannot GET / в качестве вывода из каждого URL, который я вызываю первым. Со второго запроса он работает очень быстро. Есть идеи по этому поводу?

Я не думаю, что он исходит из тайм-аута интеграции шлюза API, который составляет 30 секунд. Самое медленное время вызова функции непосредственно через лямбда составляет около 2,5 с, а когда ее называют чаще, она обычно составляет не более 150 мс. Я также увеличил время Lambda Timeout для этой функции до 10 с, поэтому оттуда также не должна появиться ошибка.

Бревна из теста запрос через API шлюза первого Призыва

Response Body

Cannot GET /hello 

Response Headers

{ 
    "x-powered-by": "Express", 
    "x-content-type-options": "nosniff", 
    "content-type": "text/html; charset=utf-8", 
    "content-length": "18", 
    "date": "Sun, 19 Feb 2017 15:00:11 GMT", 
    "connection": "close", 
    "X-Amzn-Trace-Id": "<TRACE-ID>" 
} 

Журналы

Execution log for request test-request 
Sun Feb 19 15:00:07 UTC 2017 : Starting execution for request: test-invoke-request 
Sun Feb 19 15:00:07 UTC 2017 : HTTP Method: GET, Resource Path: /hello 
Sun Feb 19 15:00:07 UTC 2017 : Method request path: {} 
Sun Feb 19 15:00:07 UTC 2017 : Method request query string: {} 
Sun Feb 19 15:00:07 UTC 2017 : Method request headers: {} 
Sun Feb 19 15:00:07 UTC 2017 : Method request body before transformations: 
Sun Feb 19 15:00:07 UTC 2017 : Endpoint request URI: https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:<ACCOUNT-ID>:function:api/invocations 
Sun Feb 19 15:00:07 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=**************************************************************************************************************************************************************************************************************************************************************************************************************************4b0637, X-Amz-Date=20170219T150007Z, x-amzn-apigateway-api-id=965h04axki, Accept=application/json, User-Agent=AmazonAPIGateway_965h04axki, X-Amz-Security-Token=<SECURITY-TOKEN> 
Sun Feb 19 15:00:07 UTC 2017 : Endpoint request body after transformations: {"resource":"/hello","path":"/hello","httpMethod":"GET","headers":null,"queryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"accountId":"<ACCOUNT-ID>","resourceId":"ll6gw8","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId":null,"accountId":"<ACCOUNT-ID>","cognitoIdentityId":null,"caller":"<ACCOUNT-ID>","apiKey":"test-invoke-api-key","sourceIp":"test-invoke-source-ip","accessKey":"<ACCESS-ID>","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":"arn:aws:iam::<ACCOUNT-ID>:root","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_102)","user":"<ACCOUNT-ID>"},"resourcePath":"/hello","httpMethod":"GET","apiId":"965h04axki"},"body":null,"isBase64Encoded":false} 
Sun Feb 19 15:00:11 UTC 2017 : Endpoint response body before transformations: {"statusCode":404,"body":"Cannot GET /hello\n","headers":{"x-powered-by":"Express","x-content-type-options":"nosniff","content-type":"text/html; charset=utf-8","content-length":"18","date":"Sun, 19 Feb 2017 15:00:11 GMT","connection":"close"},"isBase64Encoded":false} 
Sun Feb 19 15:00:11 UTC 2017 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=19f8554e-f6b4-11e6-8184-d3ccf0ccf643, Connection=keep-alive, Content-Length=267, Date=Sun, 19 Feb 2017 15:00:11 GMT, Content-Type=application/json} 
Sun Feb 19 15:00:11 UTC 2017 : Method response body after transformations: Cannot GET /hello 

Sun Feb 19 15:00:11 UTC 2017 : Method response headers: {x-powered-by=Express, x-content-type-options=nosniff, content-type=text/html; charset=utf-8, content-length=18, date=Sun, 19 Feb 2017 15:00:11 GMT, connection=close, X-Amzn-Trace-Id=Root=1-58a9b2f7-91fc7371e41d6ae9c2fbf64d} 
Sun Feb 19 15:00:11 UTC 2017 : Successfully completed execution 
Sun Feb 19 15:00:11 UTC 2017 : Method completed with status: 404 

Бревна из теста запрос через API-шлюз второго Призывании

Реакция Тело

"Hello, stranger!" 

Response Headers

{ 
    "x-powered-by": "Express", 
    "access-control-allow-origin": "*", 
    "content-type": "application/json; charset=utf-8", 
    "content-length": "18", 
    "etag": "W/\"12-E1p7iNXxJ4trMdmFBhlU9Q\"", 
    "date": "Mon, 13 Feb 2017 20:12:36 GMT", 
    "connection": "close", 
    "X-Amzn-Trace-Id": "<Trace-ID>" 
} 

Журналы

Execution log for request test-request 
Mon Feb 13 20:12:36 UTC 2017 : Starting execution for request: test-invoke-request 
Mon Feb 13 20:12:36 UTC 2017 : HTTP Method: GET, Resource Path: /hello 
Mon Feb 13 20:12:36 UTC 2017 : Method request path: {} 
Mon Feb 13 20:12:36 UTC 2017 : Method request query string: {} 
Mon Feb 13 20:12:36 UTC 2017 : Method request headers: {} 
Mon Feb 13 20:12:36 UTC 2017 : Method request body before transformations: 
Mon Feb 13 20:12:36 UTC 2017 : Endpoint request URI: https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:<LAMBDA-FUNCTION-ID>:function:api/invocations 
Mon Feb 13 20:12:36 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=*******************************************************************************************************************************************************************************************************************************************************************************************************************************************3e1b18, X-Amz-Date=20170213T2Z, x-amzn-apigateway-api-id=965h04axki, X-Amz-Source-Arn=arn:aws:execute-api:eu-central-1:<ACCOUNT-ID>:965h04axki/null/GET/hello, Accept=application/json, User-Agent=AmazonAPIGateway_965h04axki, X-Amz-Security-Token=<TOKEN> 
Mon Feb 13 20:12:36 UTC 2017 : Endpoint request body after transformations: {"resource":"/hello","path":"/hello","httpMethod":"GET","headers":null,"queryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"accountId":"<ACCOUNT-ID>","resourceId":"ll6gw8","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId":null,"accountId":"<ACCOUNT-ID>","cognitoIdentityId":null,"caller":"427402682812","apiKey":"test-invoke-api-key","sourceIp":"test-invoke-source-ip","accessKey":"<ACCESS-KEY>","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":"arn:aws:iam::<ACCOUNT-ID>:root","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_102)","user":"<ACCOUNT-ID>"},"resourcePath":"/hello","httpMethod":"GET","apiId":"965h04axki"},"body":null,"isBase64Encoded":false} 
Mon Feb 13 20:12:36 UTC 2017 : Endpoint response body before transformations: {"statusCode":200,"body":"\"Hello, stranger!\"","headers":{"x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"18","etag":"W/\"12-E1p7iNXxJ4trMdmFBhlU9Q\"","date":"Mon, 13 Feb 2017 20:12:36 GMT","connection":"close"},"isBase64Encoded":false} 
Mon Feb 13 20:12:36 UTC 2017 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=c3354327-f228-11e6-8c1d-ed11cc413770, Connection=keep-alive, Content-Length=315, Date=Mon, 13 Feb 2017 20:12:36 GMT, Content-Type=application/json} 
Mon Feb 13 20:12:36 UTC 2017 : Method response body after transformations: "Hello, stranger!" 
Mon Feb 13 20:12:36 UTC 2017 : Method response headers: {x-powered-by=Express, access-control-allow-origin=*, content-type=application/json; charset=utf-8, content-length=18, etag=W/"12-E1p7iNXxJ4trMdmFBhlU9Q", date=Mon, 13 Feb 2017 20:12:36 GMT, connection=close, X-Amzn-Trace-Id=Root=1-58a21334-8ea6c4b5944eebb873bc7d2e} 
Mon Feb 13 20:12:36 UTC 2017 : Successfully completed execution 
Mon Feb 13 20:12:36 UTC 2017 : Method completed with status: 200 

ответ

0

Я думаю, что ответ "не может получить /" исходит из самой вашей функции лямбда. Можете ли вы проверить журналы API-шлюза API Gateway (или Test Invoke на консоли), чтобы узнать, что отличается от запроса интеграции и ответа при первом вызове?

+0

Хорошим вопросом. Я добавил журналы с первого и второго вызовов с помощью API Gateway –

+0

Да, это определенно происходит от функции Lambda, которая, как представляется, является безсерверным экспресс-модулем.Можете ли вы увеличить время ожидания функции Lambda в настройках лямбда? Это, вероятно, поможет, если экспресс-сервер займет более 2,5 секунд для инициализации. –

+0

@ JackKohn-AWS thx за подсказку. Я увеличил его, и теперь он работает. Но в первый раз я не получил 500, а 404. Я заменил журналы сверху. –

0

Я не видел никакой реальной документации по этому поводу (только this Medium post), но я также испытал тот факт, что лямбда может быть заморожена до первого вызова, или в случае, если ее долго не вызывают.

Решение состоит в том, чтобы запланировать регулярный розарий просыпаться лямбда, с Amazon CloudWatch Events

+0

Конечно, я знаю это решение, но, на мой взгляд, это только плохое решение. Я сделаю это на производстве, если нет лучшего, но я думал, что тема будет стоить вопроса, чтобы получить очаровательное решение;) Потому что, если AWS хочет нажать Lambda вперед, не должно быть такой ошибки –