在CodePipeline调用Lambda时传递自定义参数遇KeyError问题
CodePipeline调用Lambda时的参数传递格式与KeyError问题解决
你遇到的问题根源是CodePipeline调用Lambda时传递的event结构和控制台测试的完全不同,直接取顶层的bucket_key自然会报KeyError,而且因为Lambda没有正确通知CodePipeline任务完成,导致CodePipeline不断重试,陷入循环。
CodePipeline传递的Event结构说明
当CodePipeline通过Invoke Lambda动作调用你的函数时,用户自定义参数会被嵌套在固定的层级里,结构大致如下:
{ "CodePipeline.job": { "data": { "actionConfiguration": { "configuration": { "UserParameters": "{\"bucket_key\":\"my_bucket\"}" } } // 其他CodePipeline相关字段省略 }, "id": "job-id", "accountId": "your-account-id" } }
注意这里的UserParameters是字符串格式的JSON,不是直接的JSON对象。
修改后的Lambda代码
需要调整代码,从正确的路径读取参数,并且完成后必须通知CodePipeline任务状态(否则会一直重试循环):
import boto3 import json codepipeline = boto3.client('codepipeline') def lambda_handler(event, context): try: # 解析CodePipeline的event结构,获取用户参数 job_id = event['CodePipeline.job']['id'] user_params_str = event['CodePipeline.job']['data']['actionConfiguration']['configuration']['UserParameters'] user_params = json.loads(user_params_str) bucket_name = user_params['bucket_key'] print(f"获取到Bucket名称: {bucket_name}") # 通知CodePipeline任务成功 codepipeline.put_job_success_result(jobId=job_id) return bucket_name except Exception as e: # 通知CodePipeline任务失败,终止循环重试 codepipeline.put_job_failure_result( jobId=job_id, failureDetails={ 'message': str(e), 'type': 'JobFailed' } ) raise e
关键注意事项
- 必须调用
put_job_success_result或put_job_failure_result告知CodePipeline任务状态,否则CodePipeline会认为任务未完成,不断重复调用Lambda。 - UserParameters是字符串格式的JSON,必须用
json.loads解析成字典后才能读取内部的key。 - 在CodePipeline的Invoke Lambda动作配置里,UserParameters要填写标准的JSON字符串(比如
{"bucket_key":"my_bucket"})。
内容的提问来源于stack exchange,提问作者Jack Rogers
相关产品推荐
相关产品推荐

