You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CodePipeline Lambda动作输出变量传递给CodeBuild动作

问题排查步骤

1. 验证Lambda输出格式是否符合CodePipeline规范

Lambda通过put_job_success_result返回的输出必须严格遵循CodePipeline格式要求,不能直接传递原始字典。需将字典中每个键值对拆分为单独输出项,示例代码如下:

import boto3

codepipeline = boto3.client('codepipeline')

def lambda_handler(event, context):
    stack_outputs = {'SMRoleArn': 'arn:aws:iam::XXXXXXX:role/SageMakerExecXXXXXXXXXXXXXX', 
                     'LambdaRoleArn': 'arn:aws:iam::XXXXXXXXX:role/LambdaExecutioXXXXXXXXXX', 
                     'S3BucketName': 'modeldeploystaging-XXXXXXXXXXXXXXXXXXXX'}
    
    # 构造符合要求的输出结构
    output_payload = {
        'outputs': [
            {'name': 'SMRoleArn', 'value': stack_outputs['SMRoleArn']},
            {'name': 'LambdaRoleArn', 'value': stack_outputs['LambdaRoleArn']},
            {'name': 'S3BucketName', 'value': stack_outputs['S3BucketName']}
        ]
    }
    
    codepipeline.put_job_success_result(
        jobId=event['CodePipeline.job']['id'],
        outputVariables=output_payload['outputs']
    )

注意:outputVariables接收数组格式,每个元素必须包含name和value字段,且value必须为字符串类型。

2. 检查CDK中Lambda Invoke动作的输出变量映射

定义LambdaInvokeAction时,需显式声明输出变量,让CodePipeline识别这些值。示例CDK代码:

from aws_cdk import aws_codepipeline_actions as actions

lambda_invoke_action = actions.LambdaInvokeAction(
    action_name='FetchStackOutputs',
    lambda_function=your_lambda_function,
    # 声明输出变量,名称要和Lambda返回的outputs中的name一致
    variables={
        'SM_ROLE_ARN': 'SMRoleArn',
        'LAMBDA_ROLE_ARN': 'LambdaRoleArn',
        'S3_BUCKET_NAME': 'S3BucketName'
    }
)

这里的键是流水线中使用的变量名,值对应Lambda输出中的name字段。

3. 确认CodeBuild动作的环境变量配置

在CodeBuildAction中,需将流水线变量映射为CodeBuild环境变量,示例代码:

from aws_cdk import aws_codepipeline_actions as actions
from aws_cdk import aws_codebuild as codebuild

build_action = actions.CodeBuildAction(
    action_name='Build',
    project=your_codebuild_project,
    environment_variables={
        # 通过codepipeline_variables引用Lambda动作的输出
        'SM_ROLE_ARN': codebuild.BuildEnvironmentVariable(
            value=lambda_invoke_action.variables['SM_ROLE_ARN']
        ),
        'LAMBDA_ROLE_ARN': codebuild.BuildEnvironmentVariable(
            value=lambda_invoke_action.variables['LAMBDA_ROLE_ARN']
        ),
        'S3_BUCKET_NAME': codebuild.BuildEnvironmentVariable(
            value=lambda_invoke_action.variables['S3_BUCKET_NAME']
        )
    }
)

确保变量名和后续buildspec中引用的名称一致。

4. 验证Buildspec中的环境变量引用

在buildspec.yml中,需通过${env:VAR_NAME}格式引用环境变量,示例:

version: 0.2
phases:
  build:
    commands:
      - echo "SM Role ARN: ${env:SM_ROLE_ARN}"
      - echo "Lambda Role ARN: ${env:LAMBDA_ROLE_ARN}"
      - echo "S3 Bucket Name: ${env:S3_BUCKET_NAME}"

避免直接使用$SM_ROLE_ARN,部分shell环境下可能无法正确解析。

额外检查点

  • 确认Lambda执行权限:需拥有codepipeline:PutJobSuccessResult、codepipeline:PutJobFailureResult权限,以及跨账号读取CloudFormation栈输出的权限。
  • 查看CodePipeline执行日志:在控制台中查看Lambda Invoke阶段的输出详情,确认变量是否被正确捕获。
  • 查看CodeBuild构建日志:检查环境变量是否被正确注入,若变量为空,说明流水线到CodeBuild的映射存在问题。

内容的提问来源于stack exchange,提问作者Francisco Parrilla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:43:01