【问题标题】:How do I get rid of the Runtime.MarshalError in SQS URL如何摆脱 SQS URL 中的 Runtime.MarshalError
【发布时间】:2022-01-25 07:03:06
【问题描述】:

尝试将一些基本的错误处理和日志记录添加到有效的 Lambda 函数中。添加元素后,我现在收到此错误:

{
  "errorMessage": "Unable to marshal response: sqs.Queue(url='https://us-west-2.queue.amazonaws.com/225565555556/Messages') is not JSON serializable",
  "errorType": "Runtime.MarshalError",
  "stackTrace": []
}

我在 Stack Overflow 上的搜索让我相信需要将某些内容转换为字符串对象,但我不知道在哪里解决这个问题。这是整个函数:

# Backport print_function for backwards compatibility
from __future__ import print_function
import logging
# Use built-in package for encoding/decoding JSON data
import json
# Module required to work with Boto3 environment variables
import os
# Module provides classes for manipulating date/time
from datetime import datetime
# AWS Python SDK module
import boto3
from botocore.exceptions import ClientError

# Reference function environment variables
QUEUE_NAME = os.environ['QUEUE_NAME']
MAX_QUEUE_MESSAGES = os.environ['MAX_QUEUE_MESSAGES']
DYNAMODB_TABLE = os.environ['DYNAMODB_TABLE']

# Create AWS service resource objects
sqs = boto3.resource('sqs')
dynamodb = boto3.resource('dynamodb')
logger = logging.getLogger(__name__)

# Define function entry point
def lambda_handler(event, context):
    
    # Use service resource to call API to retrieve SQS queue name
    try:
        queue = sqs.get_queue_by_name(QueueName=QUEUE_NAME)
        logger.info("Got queue '%s' with URL=%s", QUEUE_NAME, queue.url)
    except ClientError as error:
        logger.exception("Couldn't get queue named %s.", QUEUE_NAME)
        raise error
    else:
        return queue
    
    # Print the number of messages waiting in queue for consumer
    print("ApproximateNumberOfMessages:",
          queue.attributes.get('ApproximateNumberOfMessages'))
    # Iterate through message event records
    for message in event['Records']:
        print("Starting your Lambda Function...")
        body = message["body"]
        id = message['messageId']
        print(str(body))

        # Write message to DynamoDB
        table = dynamodb.Table(DYNAMODB_TABLE)
        # Call DDB API to add message item to table variable
        response = table.put_item(
            Item={
                'MessageId':message['messageId'],
                'Body':message['body'],
                'Timestamp':datetime.now().isoformat()
                },
            )
        print("Wrote message to DynamoDB:", json.dumps(response))

【问题讨论】:

    标签: aws-lambda boto3 amazon-sqs


    【解决方案1】:

    解决此错误的方法是更改​​ else 语句:

     else:
            return queue
    

    收件人:

    else:
        return str(queue)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2014-07-20
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多