为了简单起见,假设我们有一个堆栈,其中包含一个创建为Docker映像的lambda函数:
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
的内容,因为它很简单,也就是说,它包含一个.py文件和一些虚拟处理程序,以及一个Dockerfile,该Dockerfile使用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
?
如果我正确地阅读了Build caching in AWS CodeBuild的文档,并且正确地从CDK docs for BuildSpec推导出了正确的结论,我认为我应该使用codebuild.BuildSpec.fromObject
来指定buildspec文件。
通过一些实验,我能够通过fromObject
和buildspec文件执行简单的安装和/或构建命令,但不知道如何缓存。特别是,管道如何引用作为堆栈一部分构建的Docker映像?目标是在每次构建时,如果Docker映像没有更改,则该高速缓存中读取它们,避免重新构建。
也许另一种选择是建立一个ECR库,在每次构建时检查是否找到了构建容器的哈希,如果没有,则构建并推送。然而,我不知道如何具体地做到这一点,因为我不知道如何引用构建的Docker映像,如果这有意义的话。
1条答案
按热度按时间c86crjj01#
提供带有
partialBuildSpec
属性的部分buildspec,并使用cache
属性指定缓存方法,如模块概述中所示:除此之外,你的前提是错误的:容器将在任何情况下被构建-你可以让它更快。如果不先构建它,就不可能知道容器哈希是否发生了变化。如果你想缓存docker层以使构建更快,你可以尝试该高速缓存中包含
/var/lib/docker/overlay2/**/*
。可能相关:
https://github.com/aws/aws-cdk/issues/19157
https://github.com/aws/aws-cdk/issues/9080