使用 lambda 和 Chalice 代码时 API 网关端点中的授权错误

问题描述 投票:0回答:1

场景如下:

  • 我有一个 Chalice 应用程序,有两个端点
    /getStream
    /deleteStream
  • 我将它们迁移到 Nextjs 函数,从而不再需要 Chalice 应用程序。
  • 所以,我删除了API Gateway,但保留了Lambda函数进行备份。

enter image description here

import re
from urllib import request
from chalice import Chalice, Response
from chalicelib.streamEngine import StreamEngine
app = Chalice(app_name='mux-streaming')

print(app, "chalice app")

#  for testing purpose
@app.route('/', methods=['GET'], cors=True, authorizer=None)
def hello():

    print("hello")
        
    return "hello"


@app.route('/getStream', methods=['POST'], cors=True, authorizer=None)
def get_stream():
    request = app.current_request.json_body
    
    creatorID = request['creatorID']
    streamName = request['streamName']
    streamType = request['streamType']
        
        
    streamer = StreamEngine()
    return streamer.getStream(creatorID, streamName, streamType)
    

@app.route('/deleteStream', methods=['POST'], cors=True)
def delete_stream():
    request = app.current_request.json_body
    
    streamID = request['streamID']
    stream = StreamEngine()
    return stream.deleteStream(streamID)

  • 由于某种原因,我想迁移回 Chalice 应用程序,但我没有基础设施即代码,因为它是由另一个开发人员完成的。
  • 因此,我从 AWS 控制台添加了一个 API 网关。

enter image description here

  • 但是API网关抛出授权错误:

获取

https://invoke-url/prod

{
  "message": "Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=asdf"
}

这毫无意义,因为我没有任何授权。

发布后

https://invoke-url/prod/getStream

{
  "headers": {},
  "multiValueHeaders": {},
  "statusCode": 500,
  "body": "{\"Code\":\"InternalServerError\",\"Message\":\"Unknown request.\"}"
}

为了确保 API Gateway 不是冒名顶替者,我用其他 lambda 尝试了它,它工作得很好。 任何帮助将不胜感激。谢谢

aws-lambda aws-api-gateway gorilla chalice
1个回答
0
投票

我对 Chalice 不太熟悉,但根据信息,我认为有一些事情正在发生。 当您部署 Chalice 应用程序时,它会生成基础设施和 API 网关资源以匹配 Lambda 注释。示例取自

Chalice 文档

$ chalice deploy Creating deployment package. Creating IAM role: helloworld-dev Creating lambda function: helloworld-dev Creating Rest API Resources deployed: - Lambda ARN: arn:aws:lambda:us-west-2:12345:function:helloworld-dev - Rest API URL: https://abcd.execute-api.us-west-2.amazonaws.com/api/

因此,当您通过 ClickOps 调出 API 网关时,它可能与 Chalice 应用程序调出的内容完全不匹配,例如启用 Lambda 代理响应或 JWT 授权者。一个很好的例子是基本调用 URL。

在 GET https://invoke-url/prod 上:

{"message": "Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=asdf"}

(评论指出,当授权标头未传递时,它会给出“缺少身份验证令牌”。)
当提供身份验证标头时,即使资源上的身份验证设置为

NONE

,API 网关也会返回响应“身份验证标头需要‘凭据’参数...”。这是一个 AWS 错误(您可以在

此处

阅读更多相关信息)。
当 API 请求尝试访问不存在的 APIGW 资源时,会出现“缺少身份验证令牌”响应。您正在运行 GET

命令,但 APIGW 控制台上没有列出

GET

 资源。创建该资源并将身份验证设置为 
NONE
 后,您应该能够点击该资源。
在 POST https://invoke-url/prod/getStream:

{ "headers": {}, "multiValueHeaders": {}, "statusCode": 500, "body": "{\"Code\":\"InternalServerError\",\"Message\":\"Unknownrequest\"}"}```

这看起来像是 Lambda 中的运行时错误。 CloudWatch 中是否有任何可用日志显示堆栈跟踪或错误消息?
另外,您能详细说明一下以下内容的含义吗?

为了确保 API Gateway 不是冒名顶替者,我用其他 lambda 尝试了它,它工作得很好。任何帮助将不胜感激。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.