首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CDK访问Lambda的API网关的故障

使用CDK访问Lambda的API网关的故障
EN

Stack Overflow用户
提问于 2021-07-25 13:38:22
回答 1查看 415关注 0票数 1

我使用Python来部署由API调用触发的Lambda函数。这是我的代码:

app.py

代码语言:javascript
复制
#!/usr/bin/env python3
import os

from aws_cdk import core

from cvsg_app_bff.usermanagement import UserManagementStack

app = core.App()
UserManagementStack(app, "UserManagementStack")

app.synth()

我的堆栈:

代码语言:javascript
复制
class UserManagementStack(core.Stack):

def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
    super().__init__(scope, construct_id, **kwargs)

    # Lambda functions
    create_new_user: _lambda.Function = _lambda.Function(self, "newUserLambdaHandler",
                                                            runtime=_lambda.Runtime.PYTHON_3_8,
                                                            handler="usermanagement.create_new_user",
                                                            code=_lambda.Code.from_asset("lambda_functions")
                                                            )

    # API gateway setup
    user_apis = api_gw.LambdaRestApi(self, 'UserManagementAPIs', handler=create_new_user, proxy=False)

    user_apis.root.resource_for_path('user').add_method('POST', api_gw.LambdaIntegration(create_new_user))

具有Lambda函数的文件:

代码语言:javascript
复制
def format_return(status_code, response_body):
    response = {
        'statusCode': status_code,
        'body': response_body
    }
    print("Response: ", str(response))
    return response


def is_admin(event):
    # todo: not implemented yet!
    return True


def get_event_body(event):
    print(json.dumps(event))
    return json.loads(event["body"])


def create_new_user(event, context):
    request_body = get_event_body(event)
    if is_admin(event):
        return format_return(200, request_body)
    else:
        return format_return(403, "Not Unauthorised for this operation")

当我部署并到达端点时,我得到了这个消息的502坏网关响应

代码语言:javascript
复制
{
    "message": "Internal server error"
}

我看了一下CloudWatch日志,我可以在format_response方法中看到正确的响应,但是来自客户端到达端点的响应总是502。

如何让API网关返回正确的响应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-26 14:04:31

看起来你的问题是你的Lambda函数返回了一个不正确的响应。由API网关通过Lambda代理集成调用的Lambda函数需要以以下格式返回JSON对象:

代码语言:javascript
复制
{
    "isBase64Encoded": True|False,
    "statusCode": <status code>,
    "headers": {
        "header-name": "header-value",
        # ...
    },
    "body": "{\"your\":\"data\"}" # <--- MUST be a string, NOT an object
}

您的create_new_user函数返回format_return(200, request_body),其中request_bodyget_event_body的结果,后者返回get_event_body(返回dict,而不是字符串)。

像这样修改get_event_body应该可以做到这一点:

代码语言:javascript
复制
def get_event_body(event):
    print(json.dumps(event))
    return json.dumps(event["body"])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68519126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档