Usecase
I have a cloudformation Stack with more then 15 Lambdas in it. I can able to deploy the stack through Codepipeline
which consists of two stages CodeCommit
and CodeDeploy
. In this approach all my lambda code is in cloudformation template(i.e.inline code). For Security concerns i want to change this Inline
to S3
which inturn requires S3BucketName
and S3Key
.
As a temporary workaround
As of now i am zipping each lambda file and passing manually S3keyName
and bucketname
as a parameters to my stack .
Is there any way possible to do this step via Codepipeline ?
My Assumption on CodeBuild
I Know we can use the CodeBuild
for it. But upto now i have seen CodeBuild
is only used to build package.json
file. But in my usecase i dont have any . And also i can see it is possible to specify cloudformation package
command to wrap my lambda from local to S3 this command will generate S3 codeuri`, but this is for Serverless Applications where there will be single lambda but in my case i have 15.
What i had tried
I know that as soon as you give a git push
to codecommit
it will keep you code in S3. So what i thought is to get the S3BucketName
and S3KeyName
from the codecommit pushed file and pass these parameters to my CFN template. I can able to get the S3BucketName
but S3KeyName
i dont know how to get that ? And i dont know whether this tried apporach is a workable one ?
BTW i know i can use shell script just to automate this process. But is there a way possible to do it via CODE PIPELINE ?
Update--Tried Serverless Approach
Basically i run two build actions with two different runtimes(i.e.Nodejs,Python) which runs independently. So when i use serverless approach each build will create a template-export.yml file with codeuri of bucketlocation , that means i will have two template-export.yml files
. One problem with Serverless
approach it must have to create changeset
and then it trigger Execute changeset
. Because of that i need to merge those two template-export.yml files
and run this create changeset
action followed by execute changeset
. But i didn't know is there a command to merge two SAM templates
.Otherwise one template-export.yml stack will replace other template-export.yml stack.
Any help is appreciated Thanks
If I'm understanding you right, you just need an S3 Bucket and Key to be piped into your Lambda CF template. To do this I'm using the ParameterOverrides
declaration in my pipeline.
Essentially, the pipeline is a separate stack and picks up a CF template located in the root of my source. It then overrides two parameters in that template that point it to the appropriate S3 bucket/key.
- Name: LambdaDeploy
Actions:
- Name: CreateUpdateLambda
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: 1
Configuration:
ActionMode: CREATE_UPDATE
Capabilities: CAPABILITY_IAM
RoleArn: !GetAtt CloudFormationRole.Arn
StackName: !Join
- ''
- - Fn::ImportValue: !Sub '${CoreStack}ProjectName'
- !Sub '${ModuleName}-app'
TemplatePath: SourceOut::cfn-lambda.yml
ParameterOverrides: '{ "DeploymentBucketName" : { "Fn::GetArtifactAtt" : ["BuildOut", "BucketName"]}, "DeploymentPackageKey": {"Fn::GetArtifactAtt": ["BuildOut", "ObjectKey"]}}'
Now, the fact that you have fifteen Lambda functions in this might throw a wrench in it. For that I do not exactly have an answer since I'm actually trying to do the exact same thing and package up multiple Lambdas in this kind of way.