为了账号安全,请及时绑定邮箱和手机立即绑定

sam local start-api go lambda 在 linux ubuntu 上返回

sam local start-api go lambda 在 linux ubuntu 上返回

Go
千巷猫影 2022-08-01 15:37:42
在本地运行 aws sam 应用程序时返回“内部服务器错误”。我创建了 aws sam hello-world 示例:sam init --runtime go1.x --name robertsamlocallyhelloworld然后我使用以下命令在本地运行应用程序:sam local start-api然后:curl 127.0.0.1:3000/hello图像下载已开始,一段时间后停止。端点返回:我正在使用:Sam Cli:1.15.0Docker:20.10.0输出:/hello502 "Internal server error"Invoking hello-world (go1.x)<br>Image was not found.<br>Building image....................................<br>Skip pulling image and use local one: amazon/aws-sam-cli-emulation-image-go1.x:rapid-1.15.0.<br>Mounting /home/robert/projects/try_dir/try_sam_go_daemons/robertsamlocallyhelloworld/hello-world as /var/task:ro,delegated inside runtime container<br>START RequestId: 159c8e80-649d-4c71-8b54-3221387af308 Version: $LATEST<br>fork/exec /var/task/hello-world: no such file or directory: PathError<br>null<br>END RequestId: 159c8e80-649d-4c71-8b54-3221387af308<br>REPORT RequestId: 159c8e80-649d-4c71-8b54-3221387af308  Init Duration: 0.38 ms  Duration: 9.30 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 128 MB <br>Lambda returned empty body!<br>Invalid lambda response received: Invalid API Gateway Response Keys: {'errorMessage', 'errorType'} in {'errorMessage': 'fork/exec /var/task/hello-world: no such file or directory', 'errorType': 'PathError'}<br>2021-01-11 23:55:41 127.0.0.1 - - [11/Jan/2021 23:55:41] "GET /hello HTTP/1.1" 502 <br>2021-01-11 23:55:41 127.0.0.1 - - [11/Jan/2021 23:55:41] "GET /favicon.ico HTTP/1.1" 403 <br>
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

错误消息明确指出:


Invalid API Gateway Response Keys

我遇到了一个类似的错误,其中我收到了响应status_code的错误:


Invalid lambda response received: Invalid API Gateway Response Keys: {'status_code'} in {'status_code': 200, 'body': '"Success!!"'}

显然,SAM 试图模拟 API 网关,status_code不是 API Gateway 在响应中期望的关键之一。因此,我将其更改为键从到status_codestatusCode


    return {

    'statusCode': 200,

    'body': json.dumps("Success!!")

}

而且,它工作正常。


我建议您查看 API 网关响应密钥,并尝试将您的响应映射到该密钥。


查看完整回答
反对 回复 2022-08-01
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我也得到了这个错误,因为本地调用无法访问template.yml中引用的环境变量。例如:


...

 #template.yml

     Policies:

    # Give Create/Read/Update/Delete Permissions to the SampleTable

    - DynamoDBCrudPolicy:

        TableName: !Ref SampleTable

  Environment:

    Variables:

      # Make table name accessible as environment variable from function code during execution

      SAMPLE_TABLE: !Ref SampleTable


...

一种解决方案是部署应用程序并从控制台获取env变量,然后将它们输入到“env.json”或类似文件中:


{

"getAllItemsFunction": {

    "SAMPLE_TABLE": "dev-demo-SampleTable-*ID*"

},}

然后,您可以通过向 .喜欢这个:-e env.jsonsam local invoke command


sam local invoke getAllItemsFunction -e events/event-get-all-items.json -n env.json

老实说,不知道SAMPLE_TABLE和“!Ref SampleTable“正在发生,但它有效。看看这个: https://youtu.be/NzPqMrdgD1s?t=799


查看完整回答
反对 回复 2022-08-01
?
青春有我

TA贡献1784条经验 获得超8个赞

我在 https://stackoverflow.com/a/72067740/93074 上写的答案相同


因此,从以下介绍如何使用CDK使lambda和api网关工作的教程中,我设法隔离了没有以下行将导致502 BAD GATEWAY错误,建议的返回类型如前所述。它在道具中。new apigateway.RestApi


defaultCorsPreflightOptions: {

...

        allowOrigins: ['http://localhost:3000'],

      },

该op没有指定他的基础设施命题方法。如果不使用CDK并使用Cloud Formation YAML,那么它可能与扩展的YAML中的等效项有关(尽管扩展的最终结果超出了我的能力范围)。


method.response.header.Access-Control-Allow-Origin


BrokerAPItest41BB435C:

    Type: AWS::ApiGateway::Resource

    Properties:

      ParentId: !GetAtt 'BrokerAPID825C3CC.RootResourceId'

      PathPart: test

      RestApiId: !Ref 'BrokerAPID825C3CC'

    Metadata:

      aws:cdk:path: BrokerAwsDeployStack/BrokerAPI/Default/test/Resource

  BrokerAPItestOPTIONS843EE5C3:

    Type: AWS::ApiGateway::Method

    Properties:

      HttpMethod: OPTIONS

      ResourceId: !Ref 'BrokerAPItest41BB435C'

      RestApiId: !Ref 'BrokerAPID825C3CC'

      AuthorizationType: NONE

      Integration:

        IntegrationResponses:

          - ResponseParameters:

              method.response.header.Access-Control-Allow-Headers: '''Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'''

              method.response.header.Access-Control-Allow-Origin: '''http://localhost:3000'''

              method.response.header.Vary: '''Origin'''

              method.response.header.Access-Control-Allow-Methods: '''OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'''

            StatusCode: '204'

        RequestTemplates:

          application/json: '{ statusCode: 200 }'

        Type: MOCK

      MethodResponses:

        - ResponseParameters:

            method.response.header.Access-Control-Allow-Headers: true

            method.response.header.Access-Control-Allow-Origin: true

            method.response.header.Vary: true

            method.response.header.Access-Control-Allow-Methods: true

          StatusCode: '204'

    Metadata:


查看完整回答
反对 回复 2022-08-01
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信