使用boto3调用SQS SendMessage时遇QueueUrl无效错误求助
问题描述
尝试从SQS队列获取URL,区域为us-east-1,使用传统格式端点https://queue.amazonaws.com/XXXXXXXXXXXX/MyMessages,但调用send_message时触发InvalidAddress错误,提示传入的地址对当前端点无效。
代码示例
import json import boto3 from datetime import datetime def lambda_handler(event, context): now = datetime.now() current_time = now.strftime("%H:%M:%S %p") sqs = boto3.client('sqs', region_name="us-east-1") # 获取队列URL queueurl = sqs.get_queue_url(QueueName='MyMessages') print(queueurl) for x in range(5): sqs.send_message( QueueUrl=str(queueurl), MessageBody=current_time ) return { 'statusCode': 200, 'body': json.dumps(current_time) }
错误信息
Test Event Name sendMessage Response { "errorMessage": "An error occurred (InvalidAddress) when calling the SendMessage operation: The address {'QueueUrl': 'https://queue.amazonaws.com/XXXXXXXXXXXX/MyMessages', 'ResponseMetadata': {'RequestId': '10fea792-29fa-5484-9bc0-fbb6ad9320b7', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '10fea792-29fa-5484-9bc0-fbb6ad9320b7', 'date': 'Tue, 27 Dec 2022 05:27:05 GMT', 'content-type': 'text/xml', 'content-length': '322'}, 'RetryAttempts': 0}} is not valid for this endpoint.", "errorType": "ClientError", "requestId": "ba1f3c72-6180-4308-ad12-0bc6b02c3793", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 18, in lambda_handler\n sqs.send_message(\n", " File \"/var/runtime/botocore/client.py\", line 391, in _api_call\n return self._make_api_call(operation_name, kwargs)\n", " File \"/var/runtime/botocore/client.py\", line 719, in _make_api_call\n raise error_class(parsed_response, operation_name)\n" ] } Function Logs START RequestId: ba1f3c72-6180-4308-ad12-0bc6b02c3793 Version: $LATEST {'QueueUrl': 'https://queue.amazonaws.com/XXXXXXXXXXXX/MyMessages', 'ResponseMetadata': {'RequestId': '10fea792-29fa-5484-9bc0-fbb6ad9320b7', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '10fea792-29fa-5484-9bc0-fbb6ad9320b7', 'date': 'Tue, 27 Dec 2022 05:27:05 GMT', 'content-type': 'text/xml', 'content-length': '322'}, 'RetryAttempts': 0}} [ERROR] ClientError: An error occurred (InvalidAddress) when calling the SendMessage operation: The address {'QueueUrl': 'https://queue.amazonaws.com/XXXXXXXXXXXX/MyMessages', 'ResponseMetadata': {'RequestId': '10fea792-29fa-5484-9bc0-fbb6ad9320b7', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '10fea792-29fa-5484-9bc0-fbb6ad9320b7', 'date': 'Tue, 27 Dec 2022 05:27:05 GMT', 'content-type': 'text/xml', 'content-length': '322'}, 'RetryAttempts': 0}} is not valid for this endpoint. Traceback (most recent call last): File "/var/task/lambda_function.py", line 18, in lambda_handler sqs.send_message( File "/var/runtime/botocore/client.py", line 391, in _api_call return self._make_api_call(operation_name, kwargs) File "/var/runtime/botocore/client.py", line 719, in _make_api_call raise error_class(parsed_response, operation_name)END RequestId: ba1f3c72-6180-4308-ad12-0bc6b02c3793 REPORT RequestId: ba1f3c72-6180-4308-ad12-0bc6b02c3793 Duration: 1108.64 ms Billed Duration: 1109 ms Memory Size: 128 MB Max Memory Used: 65 MB Init Duration: 275.81 ms
解决方案
问题核心是get_queue_url的返回值处理错误:sqs.get_queue_url()返回的是包含QueueUrl字段和ResponseMetadata的字典,你直接将整个字典转为字符串传给send_message的QueueUrl参数,导致传递的不是有效URL字符串,而是字典的字符串形式,从而触发InvalidAddress错误。
修正代码只需从返回字典中提取QueueUrl字段的值:
import json import boto3 from datetime import datetime def lambda_handler(event, context): now = datetime.now() current_time = now.strftime("%H:%M:%S %p") sqs = boto3.client('sqs', region_name="us-east-1") # 从返回字典中提取实际队列URL queue_response = sqs.get_queue_url(QueueName='MyMessages') queue_url = queue_response['QueueUrl'] print(queue_url) for x in range(5): sqs.send_message( QueueUrl=queue_url, MessageBody=current_time ) return { 'statusCode': 200, 'body': json.dumps(current_time) }
修正后,传递给send_message的是正确的队列URL字符串,错误即可解决。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

