Python Boto3调用ECR start_image_scan报错:仅接受关键字参数
解决AWS Lambda调用ECR start_image_scan时的TypeError问题
问题场景
创建AWS Lambda Python脚本自动扫描ECR镜像,遍历仓库内的镜像后调用boto3的start_image_scan接口启动扫描。传入生成的参数时触发错误:
[ERROR] TypeError: start_image_scan() only accepts keyword arguments.
硬编码参数时接口可正常运行,尝试多种字符串转换方式后仍报错。
错误原因
你错误地将参数拼接成了字符串格式传递给start_image_scan,但boto3的ECR客户端方法仅接受关键字参数(keyword arguments),无法解析字符串形式的参数结构。
解决方法
不需要拼接字符串参数,直接传递明确的关键字参数,或者用字典构造参数后通过**解包传递。
修改后的核心代码
替换lambda_handler中生成scanid和调用start_image_scan的部分:
def lambda_handler(event, context): client = boto3.client('ecr') output = get_reponames() for rn in output: outputii = get_imageids(rn) for ii in outputii: # 先判断imageTag不为None再做小写比较,避免AttributeError if ii.get('imageTag') and ii['imageTag'].lower() == "latest": print("scan this image") # 方式1:直接传递关键字参数 client.start_image_scan( repositoryName=rn, imageId={ "imageDigest": ii['imageDigest'], "imageTag": ii['imageTag'] } ) # 方式2:构造字典后解包(二选一即可) # scan_params = { # 'repositoryName': rn, # 'imageId': { # 'imageDigest': ii['imageDigest'], # 'imageTag': ii['imageTag'] # } # } # client.start_image_scan(**scan_params) else: print("DONT SCAN") return { 'body': json.dumps("hello world") }
补充说明
- 新增
ii.get('imageTag')判断,避免当镜像无标签(imageTag为None)时调用lower()触发AttributeError - 两种传参方式本质都是传递关键字参数,符合boto3方法的参数要求,可根据习惯选择
内容的提问来源于stack exchange,提问作者Hilo
相关产品推荐
相关产品推荐

