Istnieją dwie różne integracje Lambda, które możesz skonfigurować w API Gateway, takie jak integracja Lambda i integracja Lambda proxy. W przypadku integracji Lambda możesz dostosować to, co zamierzasz przekazać do Lambda w ładunku, którego nie musisz analizować treści, ale gdy używasz integracji Lambda Proxy w API Gateway, API Gateway będzie proxy wszystko do Lambda w ładunku lubię to,
{
"message": "Hello me!",
"input": {
"path": "/test/hello",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"pathParameters": {"proxy": "hello"},
"requestContext": {
"accountId": "123456789012",
"resourceId": "us4z18",
"stage": "test",
"requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
"identity": {
"cognitoIdentityPoolId": "",
"accountId": "",
"cognitoIdentityId": "",
"caller": "",
"apiKey": "",
"sourceIp": "192.168.100.1",
"cognitoAuthenticationType": "",
"cognitoAuthenticationProvider": "",
"userArn": "",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"user": ""
},
"resourcePath": "/{proxy+}",
"httpMethod": "GET",
"apiId": "wt6mne2s9k"
},
"resource": "/{proxy+}",
"httpMethod": "GET",
"queryStringParameters": {"name": "me"},
"stageVariables": {"stageVarName": "stageVarValue"},
"body": "{\"foo\":\"bar\"}",
"isBase64Encoded": false
}
}
Na przykład, do którego się odwołujesz, nie pobiera treści z pierwotnego żądania. Konstruuje treść odpowiedzi z powrotem do API Gateway. Powinien być w tym formacie,
{
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "...",
"isBase64Encoded": false
}
Myślę, że jest kilka rzeczy do zrozumienia podczas pracy z integracją API Gateway z Lambda.
Integracja Lambda vs Integracja Lambda Proxy
Kiedyś istniała tylko integracja Lambda, która wymaga szablonów mapowania. Przypuszczam, że dlatego wciąż widzę wiele przykładów, które go używają.
Jak przekazać parametr zapytania lub trasy do AWS Lambda z Amazon API Gateway
Architektura bezserwerowa na AWS
body jest ciągiem znaków ucieczki, a nie JSON
Korzystając z Lambda Proxy Integration, ciało w przypadku lambda jest łańcuchem znaków ze znakiem ucieczki odwrotnym ukośnikiem, a nie kodem JSON.
Jeśli przetestowano w programie formatującym JSON.
Poniższy dokument dotyczy odpowiedzi, ale powinien dotyczyć wniosku.
Aby JavaScript mógł uzyskać do niego dostęp jako obiekt JSON, należy przekonwertować go z powrotem na obiekt JSON za pomocą json.parse w języku JapaScript, json.dumps w Pythonie.
Dokumentacja AWS pokazuje, co należy zrobić.
źródło
Używam lambdy z Zappą; Przesyłam dane z POST w formacie json:
Mój kod dla basic_lambda_pure.py to:
Otrzymałem następną odpowiedź json:
moje dane było na ciała klucza, ale jest code64 zakodowany Jak mogę wiedzieć? Widziałem klucz isBase64Encoded
Kopiuję wartość dla klucza body i dekoduję za pomocą tego narzędzia i „eureki”, otrzymuję wartości.
Mam nadzieję, że to ci pomoże. :)
źródło
Być może zapomniałeś zdefiniować
Content-Type
nagłówek. Na przykład:źródło