
[英]How do i pass parameters from first cdk stack's output to another cdk stack's input, when deploying using jenkins pipeline?
[英]Caching Lambda Docker images from a CDK stack in a pipeline
为简单起见,假设我们有一个包含单个 lambda function 创建为 Docker 图像的堆栈:
import { Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
export class FunStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const exampleFun = new lambda.DockerImageFunction(this, "ExampleFun", {
code: lambda.DockerImageCode.fromImageAsset("lambda/example_fun"),
timeout: Duration.seconds(10)
});
}
}
我省略了lambda/example_fun
的内容,因为它很简单,即它包含一个带有一些虚拟处理程序的 single.py 文件和一个 Dockerfile,它使用 say public.ecr.aws/lambda/python:3.9 作为基础并使用处理程序为 cmd。
现在,特别是如果有很多这样的 lambda 和/或它们很大,CDK 管道(例如您作为AWS CDK Workshop的一部分构建的管道)将不会缓存它们中的任何一个。 具体来说,让我们有:
import * as cdk from 'aws-cdk-lib';
import * as codecommit from 'aws-cdk-lib/aws-codecommit';
import { Construct } from 'constructs';
import {CodeBuildStep, CodePipeline, CodePipelineSource} from "aws-cdk-lib/pipelines";
import { FunStack } from "./fun-stack";
import { Stage, StageProps } from "aws-cdk-lib";
export class FunPipelineStage extends Stage {
constructor(scope: Construct, id: string, props?: StageProps) {
super(scope, id, props);
new FunStack(this, 'Fun');
}
}
export class FunPipelineStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const repo = new codecommit.Repository(this, 'FunRepo', {
repositoryName: "FunRepo"
});
const pipeline = new CodePipeline(this, 'Pipeline', {
pipelineName: 'FunLambdaPipeline',
synth: new CodeBuildStep('SynthStep', {
input: CodePipelineSource.codeCommit(repo, 'master'),
installCommands: [
'npm install -g aws-cdk'
],
commands: [
'npm ci',
'npm run build',
'npx cdk synth'
]
})
});
const deploy = new FunPipelineStage(this, 'Deploy');
const deployStage = pipeline.addStage(deploy);
}
}
应该如何修改管道以允许我们在部署时缓存管道生成的DockerImageFunction
?
如果我正确阅读了AWS CodeBuild 中构建缓存的文档并从BuildSpec 的 CDK 文档中正确推断,我想我应该使用codebuild.BuildSpec.fromObject
来指定构建规范文件。
通过一些实验,我能够通过fromObject
和 buildspec 文件执行简单的安装和/或构建命令,但不太清楚如何缓存。 特别是,管道如何引用作为堆栈的一部分构建的 Docker 图像? 目标是在每次构建时,如果 Docker 图像没有改变,它们将从缓存中读取并避免重建。
也许另一种选择是设置一个 ECR 存储库,以某种方式在每次构建时检查是否找到构建容器的 hash,如果没有,则构建并推送。 但是,我不知道如何具体执行此操作,因为我看不到如何引用构建的 Docker 图像(如果这有意义的话)。
使用partialBuildSpec
prop 提供部分构建规范,并使用cache
prop 指定缓存方法,如模块概述所示:
...
synth: new CodeBuildStep('SynthStep', {
input: CodePipelineSource.codeCommit(repo, 'master'),
installCommands: [
'npm install -g aws-cdk'
],
commands: [
'npm ci',
'npm run build',
'npx cdk synth'
],
partialBuildSpec: codebuild.BuildSpec.fromObject({
cache: {
paths: [ "path/to/cache/**/*" ]
}
}),
cache: codebuild.Cache.bucket(new s3.Bucket(this, 'Cache')),
})
容器将在任何情况下构建 - 你可以让它更快。 容器 hash 不先构建它是不可能知道是否改变的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.