python-3.x 获取“内部服务器错误”502:坏网关错误

quhf5bfb  于 2023-01-14  发布在  Python
关注(0)|答案(2)|浏览(226)

我刚刚开始在AWS上工作。我正在构建lambda,RDS MYSQL数据库和API网关之间的系统连接。
在python中创建了一个lambda函数,将数据插入MYSQL数据库,并使用lambda函数配置了API网关。当我在lambda控制台中测试lambda函数时,一切正常。但当我试图从postman调用API时,它会导致“消息”:“内部服务器错误”和502坏网关。

import pymysql
import sys
import logging
import json

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(
        host='',
        port=int(3306),
        user="",
        passwd="",
        db="")
except:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
    sys.exit()

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")

cursor=conn.cursor()

def lambda_handler(event, context):
    print(event)
    
    http_method = event['httpMethod']
    
    if http_method == "GET":
        Serial_Number = int(event['queryStringParameters']['Serial_Number'])
        platform = int(event['queryStringParameters']['platform'])
        architecture = int(event['queryStringParameters']['architecture'])
        
    elif http_method == "POST":
        body = json.loads(event['body'])
        
        Serial_Number = body['Serial_Number']
        platform = body['platform']
        architecture = body['architecture']
        
    return{
        'statusCode' : 200,
        'headers': {'Content-Type': 'application/json'},
        'body' : json.dumps(Insertion(Serial_Number, platform, architecture)),
        'messageReason' : "Successfully updated Details"
    }
    
def Insertion(Serial_Number, platform, architecture):
    item_count = 0
    
    with conn.cursor() as cur:
        cur.execute("insert into system_data (Serial_Number, platform, architecture) values(%s, %s, %s)", (Serial_Number, platform, architecture))

        conn.commit()
        cur.execute("select * from system_data")
        
        for row in cur:
            item_count += 1
            logger.info(row)
    return "Added %d items to RDS MySQL table" %(item_count)

但是当我试图用postman调用API时,我在postman中得到了“内部服务器错误”。

e4yzc0pl

e4yzc0pl1#

API Gateway with Lambda Integration中的Http状态502与lambda的格式错误响应相关。此指南www.example.com中介绍了响应的有效结构https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
这就是为什么在lambda测试控制台中您会得到一个200 - OK响应,因为它是一个有效的通用json,但从API Gateway进行的测试无效,因为这不是预期的结构。
从您的代码中可以看出,问题是由于响应中的字段“messageReason”无效而引起的。请尝试删除此字段并将其包含在标头或正文中

mpbci0fu

mpbci0fu2#

502 Bad Gateway异常,通常是因为Lambda代理集成后端返回了不兼容的输出,偶尔也会因为负载过重导致调用乱序。
我遇到了同样的问题,因为我发送了response_body=None。然后,我创建了一个字典{},它工作了。

return {
        'statusCode': 200,
        'headers': 
            {
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Methods': 'OPTIONS,POST'
            },
        'body': json.dumps(response_body)
    }

相关问题