502部署时带有API网关 + lambda的“内部服务器错误” 我使用api-gateway + lambda组合来处理邮政请求。我正在使用节点 +无服务器框架。 当我离线运行无服务器时,我能够发送发布请求并将数据存储在...

问题描述 投票:0回答:3
我检查了什么:

response主体是一个字符串

响应中的状态代码,正文,响应标头
使用回调模式返回我的响应(请参见上文)

    我检查了什么:
  • 可能的原因是我的API-GATEWAY API无法访问调用Lambda功能。如何在
  • serverless.yml
  • 文件中进行设置?

MyYML: service: myService provider: name: aws runtime: nodejs12.x iamRoleStatements: - Effect: "Allow" Action: - "s3:GetObject" - "s3:PutObject" Resource: "arn:aws:s3:::myS3Bucket/*" functions: saveToS3: handler: handler.saveToS3 events: - http: path: users method: post cors: true plugins: - serverless-offline resources: Resources: NewResource: Type: AWS::S3::Bucket Properties: BucketName: myS3Bucket

  • 发现问题,面对面,因为我花了几个小时才找到它。
    
    
    我有两个问题:
我的主lambda函数在其前面具有“异步”,但我正在用回调实现它。删除“异步”修复了它。 我的响应格式缺少“标题”和“ ISBASE64CODED”字段。包括删除502错误的那些(请参见下文)。

链接:
-https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-gateway-simple-proxy-for-lambda-for-lambda-for-lambda-for-lambda-for-lambda-act-format
amazon-web-services aws-lambda aws-api-gateway serverless-framework
3个回答
4
投票
https://github.com/dherault/serverless-foundline/issues/405

如果使用API网关,请确保您的lambda函数的响应看起来像下面的代码段。否则,它将抛出“ 502-畸形的lambda函数”错误。
    { "isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": { "headerName": "headerValue", ... }, "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... }, "body": "..." }
  • 如果您使用的是代理集成,则需要小心,因为对于每个可能的语法错误,它都会丢弃内部服务器错误。
  • catch(e => callback(null, { statusCode: 500, body: JSON.stringify(e) }));

    错误可以在此处设置标题吗? 如果不是,则可能是语法错误。

在我们的情况下,我们正在使用无服务器 + API网关 + lambda。我们的主要app.ts导出一个由无服务器包裹的异步处理程序。例如(EnvironmentService只是环境配置的服务层): const allowedBinaryMimeTypes = EnvironmentService.getFileMimeTypesAllowed(); ... const handler = serverless(app, { binary: allowedBinaryMimeTypes });

在修改任何代码之前,502不良网关错误日志正在显示此(AWS CloudWatch):


1
投票


我们的解决方案是覆盖默认的AWS提供商超时。


0
投票

S3ServiceFile(致电GetObject):
    static async getObject(type: string, pathParams: APIGatewayProxyEventPathParameters): Promise<any> {
        const params = await this.setRequestParams(type, pathParams.id, pathParams.fileName);

        try {
            // get S3 object/file
            const data = await S3.getObject(params).promise();

            // some bug with AWS converting JPG objects to JPEGg
            const contentType = data.ContentType === 'image/jpeg' ? 'image/jpg' : data.ContentType;

            return {
                statusCode: 200,
                headers: {
                    'Access-Control-Allow-Headers': 'Content-Type',
                    'Access-Control-Allow-Origin': '*', // Required for CORS support to work
                    'Access-Control-Allow-Methods': 'OPTIONS,GET',
                    'Content-Type': contentType
                },
                body: data.Body.toString('base64'),
                isBase64Encoded: true
            };
        } catch (err) {
            console.error(err);
            throw err;
        }
    }


我使用CDK。在我的情况下,我添加了参数

binaryMediaTypes: ["application/json"]

,该参数被错误地使用:

const myApi = new ApiGw.RestApi(this, "my-api", { restApiName: `my-awesome-api`, defaultCorsPreflightOptions: { allowOrigins: ApiGw.Cors.ALL_ORIGINS, allowMethods: ApiGw.Cors.ALL_METHODS, allowHeaders: ["Content-Type", "Accept", ...], }, ... binaryMediaTypes: ["application/json"], // <-- Problematic property }); enter image description here

binaryMediaTypes

当您创建将用作特定服务(例如AWSenter image description here)的API时,您将非常有用。 从API定义中解散,它像魅力一样工作

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.