Function URL returns null but Lambda function is working

0

i have a function URL linked to a lambda function that is returning 'null' when referenced. The function calls AWS rekognition and the json response is formatted like so:

Test Event Name test1

Response null

Function Logs START RequestId: b62907a6-2d92-46f2-a1a8-815e4016e2f6 Version: $LATEST { "BoundingBox": { "Width": 0.2756405174732208, "Height": 0.21851715445518494, "Left": 0.3744633197784424, "Top": 0.5871027112007141 }, "AgeRange": { "Low": 38, "High": 46 }, "Smile": { "Value": false, "Confidence": 94.42446899414062 }, "Eyeglasses": { "Value": false, "Confidence": 91.79085540771484 }, "Sunglasses": { "Value": false, "Confidence": 99.99473571777344

So when the function URL is invoked from the browser it is referencing the JSON response (which is NULL). The relevant informaton is contained under "Functional Logs" How can this be rectified? I am using the DetectFaces operation (https://docs.aws.amazon.com/rekognition/latest/dg/faces-detect-images.html)

已提问 9 个月前890 查看次数
1 回答
0
已接受的回答

As you can see here, the response format should be like this:

{
   "statusCode": 201,
    "headers": {
        "Content-Type": "application/json",
        "My-Custom-Header": "Custom Value"
    },
    "body": "{ \"message\": \"Hello, world!\" }",
    "cookies": [
        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
        "Cookie_2=Value2; Max-Age=78000"
    ],
    "isBase64Encoded": false
}

So make sure to construct your response correctly, embedding the Rekognition response in the body attribute and setting the statusCode.

profile pictureAWS
专家
Uri
已回答 9 个月前
profile picture
专家
已审核 1 个月前
  • Hi Uri, thanks for the reply. Do you mean something like this?

    import json import boto3 import requests

    client = boto3.client('rekognition', region_name='ap-southeast-2')

    def lambda_handler(event, context): # TODO implement bucket_name = "intelli1a" file_name = "msic.jpg"

    response = client.detect_faces(Image={'S3Object':{'Bucket':bucket_name,'Name':file_name}},
                                   Attributes=['ALL'])
    
    #Process response
    for faceDetail in response['FaceDetails']:
        print(json.dumps(faceDetail, indent=2))
    
    #Insert JSON response format
    expected_response = {
        "statusCode": 201,
        "headers": {
            "Content-Type": "application/json",
            "My-Custom-Header": "Custom Value"
        },
        "body": "{ \"message\": \"Hello, world!\" }",
        "cookies": [
            "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
            "Cookie_2=Value2; Max-Age=78000"
        ],
        "isBase64Encoded": False
    }
    
  • got it Uri, just a small change and it worls. Thanks so much for your input, really appreciate it

    #Process response
    for faceDetail in response['FaceDetails']:
        return {  'statusCode' : 200,
        'body': json.dumps(faceDetail, indent=2)
    
  • Happy to hear that it works, however, looking at your code, I see that you return inside a loop. This means that your function will operate correctly only if there is a single face in the image.

    You should construct an array of all faces in the loop and then, after the loop, return the array as part of the body.

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则