在AWS Lambda中调试Python 3代码时,我注意到它超时很多。当我进行未经授权的API调用或资源不存在时,似乎会发生这种情况。例如,一个简单的Lambda函数:
import boto3
def lambda_handler(event, context):
aws = boto3.Session(region_name='us-west-1')
s3 = aws.resource('s3')
obj = s3.Object('mybucket', 'secretfile.xml')
print(obj.get())
在我的本地计算机上,代码引发异常:
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
那为什么Lambda超时而不是抛出相同的异常?
答案 0 :(得分:0)
检查您的CloudWatch日志。您确定您没有在本地主机上看到与Lambda上不同的 问题吗?如果只是某些时间(而不是所有时间)超时,则可能表示您的安全性存在问题。 Lambda对其调用使用临时端口范围(请参阅https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#nacl-ephemeral-ports),因此您所调用的任何内容都可能仅允许在某些端口上进行通讯,而不能在所有端口上进行通讯。因此,当它碰巧使用允许的端口时,它可以工作,但是当它使用不允许的端口时,您会超时。您需要检查安全组和NACLS,以查看您的lambda调用了什么,以确保它们允许Lambda可能用于呼叫的完整临时端口范围。
许多boto3呼叫将以指数退避重试,这可能会导致超时(https://github.com/boto/botocore/issues/864可能会提供一些见解)
不过,我对lambda可能在做什么或调用了很多假设,因此您可能需要添加有关函数的更多详细信息,以获得更精确的响应。
答案 1 :(得分:0)