AWS CodePipeline调用Lambda报PutJobSuccessResult相关错误如何解决
故障根因
你遇到的报错核心原因是Lambda处理函数的参数顺序写反:
AWS Python Lambda运行时固定的handler入参顺序为第一个参数是触发事件event,第二个参数是运行上下文context,你代码中定义的def lambda_handler(context, event):把两个参数顺序颠倒,后续执行jobId= event['CodePipeline.job']['id']取值时,实际是从context对象中取属性,直接抛出属性不存在异常,代码提前终止,没有执行到put_job_success_result回调,CodePipeline长时间收不到任务状态通知,就会抛出你看到的超时错误。
修复方案
调整参数顺序,同时增加异常捕获逻辑,避免其他环节出错时也无法回调CodePipeline导致超时,修复后的代码如下:
import boto3 import time def lambda_handler(event, context): # 初始化codepipeline客户端,提前声明方便异常分支调用 pipeline = boto3.client('codepipeline') job_id = event['CodePipeline.job']['id'] try: sts_connection = boto3.client('sts') acct_b = sts_connection.assume_role( RoleArn="arn:aws:iam::1234567890:role/AssumeRole", RoleSessionName="cross_acct_lambda" ) ACCESS_KEY = acct_b['Credentials']['AccessKeyId'] SECRET_KEY = acct_b['Credentials']['SecretAccessKey'] SESSION_TOKEN = acct_b['Credentials']['SessionToken'] client = boto3.client( 'cloudfront', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, aws_session_token=SESSION_TOKEN, ) response = client.create_invalidation( DistributionId='ABC', InvalidationBatch={ 'Paths': { 'Quantity': 1, 'Items': [ '/*', ] }, 'CallerReference': str(time.time()).replace(".", "") } ) invalidation_id = response['Invalidation']['Id'] print("Invalidation created successfully with Id: " + invalidation_id) # 回调任务成功 pipeline.put_job_success_result(jobId=job_id) return { 'statusCode': 200, 'invalidationId': invalidation_id } except Exception as e: print(f"任务执行失败:{str(e)}") # 出错时回调任务失败,避免CodePipeline超时 pipeline.put_job_failure_result( jobId=job_id, failureDetails={ 'type': 'JobFailed', 'message': str(e) } ) raise e
可选校验项
- 确认你使用的跨账号角色
arn:aws:iam::1234567890:role/AssumeRole具备cloudfront:CreateInvalidation权限 - 确认Lambda执行角色的权限策略包含
sts:AssumeRole动作,允许调用上述跨账号角色 - 可以在Lambda控制台配置模拟CodePipeline触发的测试事件,验证代码运行是否正常
内容的提问来源于stack exchange,提问作者SUBHAS PATIL
相关产品推荐
相关产品推荐

