Reputation: 1
So I am trying to deploy some lambda functions through Codepipeline using Amazon's new Cloud Development Kit in Typescript. The issue is that for the Build stage of my pipeline, the docs only provide an example for building lambda functions written in typescript. I know this is probably a simple issue for someone more experienced with build specs but I was wondering if someone could provide me with the equivalent buildspec for Python lambdas.
I have pasted the code below that defines the pipeline I am trying to create. The cdkBuild works fine but I am having trouble coming up with the proper commands for install, prebuild, and build with the buildspec for 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],
}),
],
},
],
});
Upvotes: 0
Views: 1108
Reputation: 11
First of all you do not need to use a virtual environment. The artifacts should be what would be in the .zip you upload if you create a lambda manually which are the required libraries as well as your own code. Assuming all your python lambda code and the requirements.txt is under /lambda, the buildspec part should look like this:
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,
},
});
Upvotes: 0