【问题标题】:AWS CDK pipeline : how to assign a CodeBuild output to a Lambda code?AWS CDK 管道:如何将 CodeBuild 输出分配给 Lambda 代码?
【发布时间】:2022-02-04 23:36:02
【问题描述】:

我有以下可用的 AWS CDK 管道。它基本上从 2 个不同的 GitHub 存储库中获取源代码(一个用于应用程序代码,一个用于 cdk 代码)并构建应用程序代码和 cdk 代码:

import * as cdk from 'aws-cdk-lib';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline'
import * as codebuild from 'aws-cdk-lib/aws-codebuild'


import { Construct } from 'constructs';
import { CodePipeline, CodePipelineSource, ShellStep, CodeBuildStep } from 'aws-cdk-lib/pipelines';

export class CdkPipelineStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        // parameters
        const ConnectionArn = 'arn:aws:codestar-connections:region:account:connection/xxx-yyyy'


        // Source
        const cdkCodeStarConnection = CodePipelineSource.connection('owner/cdk-repo', 'master', {
            connectionArn: ConnectionArn
        })

        const lambdaCodeStarConnection = CodePipelineSource.connection('owner/lambda-repo', 'master', {
            connectionArn: ConnectionArn
        })

        // Building Lambda
        const lambdaBuildStep = new CodeBuildStep('BuildLambda', {
            buildEnvironment: {
                buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2_3
            },
            input: lambdaCodeStarConnection,
            commands: ['variouscommands'],
            partialBuildSpec: codebuild.BuildSpec.fromObject({
                phases: {
                    install: {
                        "runtime-versions": {
                            python: "3.9"
                        },
                        "commands": ["python --version"]
                    }
                }
            })
        })

        const pipeline = new CodePipeline(this, 'Pipeline', {
            pipelineName: 'Pipeline',
            synth: new ShellStep('Synth', {
                input: cdkCodeStarConnection,
                commands: ['npm ci', 'npm run build', 'npx cdk synth', 'npx cdk ls'],
                additionalInputs: { 'lambda': lambdaBuildStep.addOutputDirectory('lambda') }
            })
        });
    }
}

现在,我想要实现的是能够将构建的代码(因此 lambdaBuildStep 的输出)分配给我在另一个堆栈中的 Lambda 函数,即在下面的代码 sn-p 中,我想要assign_output_CodeBuildStep 成为 lambdaBuildStep 构建我的函数的 s3 位置:

import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';

import { Construct } from 'constructs';
import { Bucket } from 'aws-cdk-lib/aws-s3'

import {backendBuildStep} from 'cdk-pipeline-stack'; 
import {ArtifactMap} from 'aws-cdk-lib/pipelines';


export class LambdaMonolith extends cdk.Stack {
    constructor(scope: Construct, id: string) {
        super(scope, id);

        const s3Code = assign_output_CodeBuildStep

        const LambdaFunction = new lambda.Function(this, 'MyFunction', {
            code: lambdaCode,
            runtime: lambda.Runtime.PYTHON_3_8,
            handler: 'lambda.handler',
          });
    }
};

我似乎找不到将信息从管道堆栈传输到 Lambda 堆栈的方法。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • LambdaMonolith 堆栈是否部署为您的Pipeline 管道中的一个阶段?

标签: amazon-web-services aws-lambda aws-cdk aws-codepipeline


【解决方案1】:

所以我找到了解决方案。也许不是解决方案。确实,这看起来很复杂……我相信还有更好的方法。

所以解决方案在于 CodePipeline 构造中的 ShellStep 将additionalInputs 的输出(因此之前的 CodeBuildStep 的结果,即lambdaBuildStep)附加到动态生成但存储在环境中的特定目录中名为 CODEBUILD_SRC_DIR_BuildLambda_lambda_repo 的变量,因此您可以看到它是 CodeBuildStep 的名称和 repo 的组合(破折号更改为下划线)。

所以我的解决方案是将此环境变量用作我的 Lambda 代码资产。

        const LambdaFunction = new lambda.Function(this, 'MyFunction', {
            code: lambda.Code.fromAsset(process.env.CODEBUILD_SRC_DIR_BuildLambda_lambda_repo || ""),
            runtime: lambda.Runtime.PYTHON_3_8,
            handler: 'lambda.handler',
          });

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 2022-08-14
    • 2023-01-02
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多