AWS Lambda运行Python调用EC2 describe_images出现参数校验错误如何解决?
错误原因
AWS Lambda的入口函数lambda_handler有固定的入参规则:
- 第一个入参是触发事件对象,类型为字典,对应你报错信息里的
value: {}, type: <class 'dict'> - 第二个入参是Lambda运行上下文对象,类型为
LambdaContext,对应你报错信息里的value: <__main__.LambdaContext object>
你自定义了lambda_handler的入参名和默认值,但Lambda调用函数时会强制传入上述两个参数,直接覆盖了你设置的默认值,导致传入describe_images接口的Values参数不是要求的字符串类型,触发参数校验失败。
修复方案
按照Lambda的入参规则修改函数逻辑即可,如果你需要固定查询名称前缀为test*、指定owner的镜像,直接把参数写死在函数内即可,修复后的代码如下:
from operator import itemgetter import boto3 client = boto3.client('ec2') def lambda_handler(event, context): # 固定查询参数,也可以按需从event中动态获取参数 name = 'test*' owner = '**********' list_of_images = client.describe_images(Filters=[ {'Name': 'name', 'Values': [name]}, {'Name': 'owner-id', 'Values': [owner]} ]) image_details = sorted(list_of_images['Images'], key=itemgetter('CreationDate'), reverse=True) # 增加空判断,避免无匹配镜像时索引报错 if image_details: return image_details[0] return {"message": "No matching images found"}
如果需要动态传入name和owner参数,可以在触发Lambda时把参数放到event里,对应修改参数获取逻辑即可:
def lambda_handler(event, context): # 从event中取参数,保留默认值兜底 name = event.get('name', 'test*') owner = event.get('owner', '**********') # 后续逻辑和上面一致
内容的提问来源于stack exchange,提问作者Divyesh Jesadiya
相关产品推荐
相关产品推荐

