尝试连接SQS时,我的lambda超时。 Lambda具有允许其连接到SQS的作用,但它位于VPC和子网内。该问题的解决方案可能是什么?
我在日志中看到此错误:
[INFO] 2019-10-01T14:29:58.303Z e8ad5b4e-119a-48c1-b320-1d855c4efb22 Getting SQS queue url from <some_sqs_queue>...
14:30:16
[CRITICAL] 2019-10-01T14:30:16.743Z e8ad5b4e-119a-48c1-b320-1d855c4efb22 ## Transmission Error Connect timeout on endpoint URL: "https://us-west-2.queue.amazonaws.com/"
这是相关的代码,可在本地使用,但不适用于lambda:
sqs = boto3.client(
'sqs', # region_name="us-west-2",
aws_access_key_id=credentials.access_key,
aws_secret_access_key=credentials.secret_key,
aws_session_token=credentials.token,
config=Config(connect_timeout=6, read_timeout=10, retries={'max_attempts': 2})
)
和
try:
logger.info(f"Getting SQS queue url from {sqs_queue}...")
queue_url = sqs.get_queue_url(QueueName=sqs_queue)['QueueUrl']
# iterate over entries in batches of 10
for batch in [entries[index:index + sqs_batch_limit] for index in range(0, len(entries), sqs_batch_limit)]:
logger.info(f"Sending batch of {len(batch)} records to sqs...")
sqs.send_message_batch(
QueueUrl=queue_url,
Entries=batch
)
logger.info("Sent batch of records to sqs successful")
它甚至没有得到sqs_queue_url
,但它在本地工作。此日志“传输错误连接”错误的可能原因是什么?
答案 0 :(得分:1)
您可以将AWS Lambda函数“位于VPC和子网内”。
但是,Amazon SQS存在于Internet上,而不存在于VPC中。
因此,您将需要一种方法使Lambda功能访问Internet,或者需要使Amazon SQS在VPC中可用。
选项1:允许AWS Lambda函数访问互联网
未将Lambda函数配置为使用VPC时,它可以直接与Internet通信。但是,将 配置为使用VPC时,它无法直接访问Internet。
相反,推荐的配置是:
选项2:使Amazon SQS可在VPC内访问
您可以在VPC中创建Amazon VPC Endpoint for Amazon SQS:
如果您使用Amazon VPC托管AWS资源,则可以在VPC和Amazon SQS之间建立连接。您可以使用此连接将消息发送到您的Amazon SQS队列,而无需通过公共互联网。