用例
我有一个cloudformation堆栈,其中包含15个以上的Lambda。我可以通过Codepipeline
部署堆栈,该堆栈由两个阶段CodeCommit
和CodeDeploy
组成。在这种方法中,我所有的lambda代码都在cloudformation模板中(即内联代码)。出于安全方面的考虑,我想将此Inline
更改为S3
,这反过来又需要S3BucketName
和S3Key
。
作为临时解决方法
到目前为止,我正在压缩每个lambda文件并手动将S3keyName
和bucketname
作为参数传递给我的堆栈。
是否可以通过Codepipeline完成此步骤?
我对CodeBuild的假设
我知道我们可以使用CodeBuild
。但是到目前为止,我已经看到CodeBuild
仅用于构建package.json
文件。但是在我的用例中,我没有任何东西。而且我可以看到可以指定cloudformation package
命令来将我的lambda从本地包装到S3,该命令将生成S3 codeuri`,但这是针对无服务器应用程序的,其中将有单个lambda,但对于我来说, 15.
我尝试过的事情
我知道,一旦您将git push
赋予codecommit
,它将使您保持在S3中的代码。所以我想从代码提交推送文件中获取S3BucketName
和S3KeyName
并将这些参数传递给我的CFN模板。我可以得到S3BucketName
,但是S3KeyName
我不知道如何得到?而且我不知道这种尝试的方法是否可行?
顺便说一句,我知道我可以使用Shell脚本来自动执行此过程。但是有没有办法通过 CODE PIPELINE 做到这一点?
更新-尝试了无服务器方法
基本上,我使用两个独立运行的不同运行时(例如Nodejs,Python)运行两个构建动作。因此,当我使用无服务器方法时,每个构建都将创建一个带有bucketuri的codeuri的template-export.yml文件,这意味着我将拥有two template-export.yml files
。 Serverless
方法的一个问题是必须create changeset
然后触发Execute changeset
。因此,我需要merge those two template-export.yml files
并运行此create changeset
操作,然后执行execute changeset
。但是我不知道是否有命令来合并两个SAM templates
。否则,一个template-export.yml堆栈将替换其他template-export.yml堆栈。
感谢任何帮助 谢谢
答案 0 :(得分:0)
这里有有关通过CodePipeline和CloudFormation部署多个Lambda函数的文档:https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html
我相信这仍然会将功能代码上传到S3,但是它将利用AWS工具简化此过程。
答案 1 :(得分:0)
如果我对您的理解正确,则只需要将S3存储桶和密钥传送到Lambda CF模板中即可。为此,我在管道中使用了ParameterOverrides
声明。
从本质上讲,管道是一个单独的堆栈,它拾取位于我的源根目录中的CF模板。然后,它将覆盖该模板中的两个参数,这些参数将其指向相应的S3存储桶/键。
- 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"]}}'
现在,您拥有15个Lambda函数的事实可能会给您带来麻烦。为此,我没有确切的答案,因为我实际上是在尝试做完全相同的事情,并以这种方式打包多个Lambda。