如何通过 Codepipeline 在 CFN 模板中部署多个 Lambda?
How to deploy multiple Lambda's in CFN Template through Codepipeline?
用例
我有一个 cloudformation 堆栈,其中包含超过 15 个 Lambda。我可以通过 Codepipeline
部署堆栈,它由两个阶段 CodeCommit
和 CodeDeploy
组成。在这种方法中,我所有的 lambda 代码都在 cloudformation 模板中(i.e.inline 代码)。出于安全考虑,我想将此 Inline
更改为 S3
,这又需要 S3BucketName
和 S3Key
.
临时解决方法
截至目前,我正在压缩每个 lambda 文件并手动将 S3keyName
和 bucketname
作为参数传递到我的堆栈。
Is there any way possible to do this step via Codepipeline ?
我对 CodeBuild 的假设
我知道我们可以使用 CodeBuild
。但是到目前为止,我看到 CodeBuild
仅用于构建 package.json
文件。但在我的用例中我没有任何 .而且我还可以看到可以指定 cloudformation package
命令将我的 lambda 从本地包装到 S3 此命令将生成 S3 codeuri`,但这是针对无服务器应用程序的,其中将有单个 lambda 但在我的情况下我有15.
我试过的
我知道只要你给 git push
一个 codecommit
它就会让你在 S3 中编写代码。所以我想的是从 codecommit 推送的文件中获取 S3BucketName
和 S3KeyName
并将这些参数传递给我的 CFN 模板。我可以得到 S3BucketName
但 S3KeyName
我不知道如何得到它?我不知道这个尝试过的方法是否可行?
顺便说一句,我知道我可以使用 shell 脚本来自动执行此过程。但是有没有办法通过 CODE PIPELINE 来做到这一点?
更新--尝试无服务器方法
基本上我 运行 两个构建操作具有两个不同的 运行 时间(i.e.Nodejs,Python),其中 运行 是独立的。因此,当我使用无服务器方法时,每个构建都会创建一个带有 bucketlocation codeuri 的模板-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
的命令。否则一个模板-export.yml 堆栈将替换另一个模板-export.yml 堆栈。
感谢任何帮助
谢谢
这里有关于通过 CodePipeline 和 CloudFormation 部署多个 Lambda 函数的文档:https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html
我相信这仍会将函数代码上传到 S3,但它将利用 AWS 工具简化此过程。
如果我没理解错的话,您只需要将 S3 存储桶和密钥通过管道传输到您的 Lambda CF 模板中。为此,我在管道中使用了 ParameterOverrides
声明。
本质上,管道是一个单独的堆栈,并选择位于我源代码根目录中的 CF 模板。然后它覆盖该模板中的两个参数,将其指向适当的 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"]}}'
现在,您在其中有 15 个 Lambda 函数的事实可能会给它带来麻烦。为此我没有确切的答案,因为我实际上正在尝试做完全相同的事情并以这种方式打包多个 Lambdas。
用例
我有一个 cloudformation 堆栈,其中包含超过 15 个 Lambda。我可以通过 Codepipeline
部署堆栈,它由两个阶段 CodeCommit
和 CodeDeploy
组成。在这种方法中,我所有的 lambda 代码都在 cloudformation 模板中(i.e.inline 代码)。出于安全考虑,我想将此 Inline
更改为 S3
,这又需要 S3BucketName
和 S3Key
.
临时解决方法
截至目前,我正在压缩每个 lambda 文件并手动将 S3keyName
和 bucketname
作为参数传递到我的堆栈。
Is there any way possible to do this step via Codepipeline ?
我对 CodeBuild 的假设
我知道我们可以使用 CodeBuild
。但是到目前为止,我看到 CodeBuild
仅用于构建 package.json
文件。但在我的用例中我没有任何 .而且我还可以看到可以指定 cloudformation package
命令将我的 lambda 从本地包装到 S3 此命令将生成 S3 codeuri`,但这是针对无服务器应用程序的,其中将有单个 lambda 但在我的情况下我有15.
我试过的
我知道只要你给 git push
一个 codecommit
它就会让你在 S3 中编写代码。所以我想的是从 codecommit 推送的文件中获取 S3BucketName
和 S3KeyName
并将这些参数传递给我的 CFN 模板。我可以得到 S3BucketName
但 S3KeyName
我不知道如何得到它?我不知道这个尝试过的方法是否可行?
顺便说一句,我知道我可以使用 shell 脚本来自动执行此过程。但是有没有办法通过 CODE PIPELINE 来做到这一点?
更新--尝试无服务器方法
基本上我 运行 两个构建操作具有两个不同的 运行 时间(i.e.Nodejs,Python),其中 运行 是独立的。因此,当我使用无服务器方法时,每个构建都会创建一个带有 bucketlocation codeuri 的模板-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
的命令。否则一个模板-export.yml 堆栈将替换另一个模板-export.yml 堆栈。
感谢任何帮助 谢谢
这里有关于通过 CodePipeline 和 CloudFormation 部署多个 Lambda 函数的文档:https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html
我相信这仍会将函数代码上传到 S3,但它将利用 AWS 工具简化此过程。
如果我没理解错的话,您只需要将 S3 存储桶和密钥通过管道传输到您的 Lambda CF 模板中。为此,我在管道中使用了 ParameterOverrides
声明。
本质上,管道是一个单独的堆栈,并选择位于我源代码根目录中的 CF 模板。然后它覆盖该模板中的两个参数,将其指向适当的 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"]}}'
现在,您在其中有 15 个 Lambda 函数的事实可能会给它带来麻烦。为此我没有确切的答案,因为我实际上正在尝试做完全相同的事情并以这种方式打包多个 Lambdas。