使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数

Posted

技术标签:

【中文标题】使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数【英文标题】:Deploying Python Lambda Functions in AWS Codepipeline using AWS CDK 【发布时间】:2021-04-08 13:46:43 【问题描述】:

所以我正在尝试使用 Amazon 在 Typescript 中的新云开发工具包通过 Codepipeline 部署一些 lambda 函数。问题是对于我的管道的构建阶段,docs 仅提供了一个示例,用于构建用 typescript 编写的 lambda 函数。我知道这对于在构建规范方面更有经验的人来说可能是一个简单的问题,但我想知道是否有人可以为我提供 Python lambdas 的等效构建规范。

我已粘贴下面的代码,该代码定义了我正在尝试创建的管道。 cdkBuild 工作正常,但我无法为安装、预构建和使用 lambdaBuild 的构建规范构建正确的命令。

const cdkBuild = new codebuild.PipelineProject(this, 'CdkBuild', 
      buildSpec: codebuild.BuildSpec.fromObject(
        version: '0.2',
        phases: 
          install: 
            commands: 'npm install',
          ,
          build: 
            commands: [
              'npm run build',
              'npm run cdk synth -- -o dist'
            ],
          ,
        ,
        artifacts: 
          'base-directory': 'dist',
          files: [
            'AdminStack.template.json',
          ],
        ,
      ),
      environment: 
        buildImage: codebuild.LinuxBuildImage.STANDARD_2_0,
      ,
    );

    const lambdaBuild = new codebuild.PipelineProject(this, 'LambdaBuild', 
      buildSpec: codebuild.BuildSpec.fromObject(
        version: '0.2',
        phases: 
          install: 
            commands: [
              /*'python3 -m venv .venv',
              'source .venv/bin/activate',*/
              'pip install -r requirements.txt -t lambda' 
            ],
          ,
          build: 
            //commands: 'npm run build',
          ,
        ,
        artifacts: 
          'base-directory': 'lambda',
          files: [
            'admin/tutors/put.py ',
            'requirements.txt',
          ],
        ,
      ),
      environment: 
        buildImage: codebuild.LinuxBuildImage.STANDARD_2_0,
      ,
    );

    const sourceOutput = new codepipeline.Artifact();
    const cdkBuildOutput = new codepipeline.Artifact('CdkBuildOutput');
    const lambdaBuildOutput = new codepipeline.Artifact('LambdaBuildOutput');
    const pipeline = new codepipeline.Pipeline(this, 'BackendPipeline', 
      stages: [
        
          stageName: 'Source',
          actions: [
            new codepipeline_actions.CodeCommitSourceAction(
              actionName: 'CodeCommit_Source',
              repository: code,
              output: sourceOutput,
            ),
          ],
        ,
        
          stageName: 'Build',
          actions: [
            new codepipeline_actions.CodeBuildAction(
              actionName: 'Lambda_Build',
              project: lambdaBuild,
              input: sourceOutput,
              outputs: [lambdaBuildOutput],
            ),
            new codepipeline_actions.CodeBuildAction(
              actionName: 'CDK_Build',
              project: cdkBuild,
              input: sourceOutput,
              outputs: [cdkBuildOutput],
            ),
          ],
        ,
        
          stageName: 'Deploy',
          actions: [
            new codepipeline_actions.CloudFormationCreateUpdateStackAction(
              actionName: 'AdminStack_CFN_Deploy',
              templatePath: cdkBuildOutput.atPath('AdminStack.template.json'),
              stackName: 'AdminStack',
              adminPermissions: true,
              parameterOverrides: 
                ...props.lambdaCode.assign(lambdaBuildOutput.s3Location),
              ,
              extraInputs: [lambdaBuildOutput],
            ),
          ],
        ,
      ],
    );

【问题讨论】:

【参考方案1】:

首先你不需要使用虚拟环境。 如果您手动创建 lambda,则工件应该是您上传的 .zip 中的内容,这是所需的库以及您自己的代码。假设你所有的 python lambda 代码和 requirements.txt 在 /lambda 下,buildspec 部分应该是这样的:

codebuild.BuildSpec.fromObject(
            version: '0.2',
            phases: 
              build: 
                'pip install -r lambda/requirements.txt -t lambda'
              ,
            ,
            artifacts: 
              'base-directory': 'lambda',
              files: [
                '**/*'
              ],
            ,
          ),
          environment: 
            buildImage: codebuild.LinuxBuildImage.STANDARD_2_0,
          ,
);

【讨论】:

以上是关于使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在部署前从@aws-cdk/aws-appsync 检索 schema.graphql 文件

与现有代码管道一起使用的 AWS CDK 管道

在 aws-cdk 上的 aws-rds 上,使数据库可公开访问的设置在哪里?

使用 AWS CDK 为 AWS API 网关启用 CORS

如何使用 aws-cdk 从 AWS Secrets Manager 导入 EKS 密钥?

如何在 AWS CDK 的“CodeBuildAction”中指定区域?