【问题标题】:sam 包与 aws cloudformation 包
【发布时间】:2020-03-08 10:19:34
【问题描述】:
The docs 说他们做的事情完全相同:
本节中描述的 sam package 和 sam deploy 命令
与其 AWS CLI 等效命令 aws cloudformation 相同
package 和 aws cloudformation deploy。
但我的经验表明这并不完全正确。当我为基于 Java 的 Lambda 运行 sam deploy 时,会使用这种类型的 zip 结构将工件上传到 S3:
- 元信息
- com/example/etc,类文件
- logback.groovy,其他资源
- lib,其中包含我所有的 jars
这在 Lambda 中执行得很好。但是当我关注Lambda + CodePipeline docs 并使用aws cloudformation 时,我得到了这个zip 结构(本质上是我的git repo):
- README.md
- 构建/
- build.gradle
- buildspec.yml
- 事件
- 毕业/
- gradlew
- gradlew.bat
- src/
- template.yml
注意:这种替代结构甚至发生在 CodeBuild 之外,所以我怀疑它是否与 buildspec.yml 中的内容有关。我可以简单地通过在我的桌面上调用两个不同的包命令来重现这两个结构。
任何想法为什么会有差异?我想理解它,特别是因为文档说它们应该是相同的,在我切换我的buildspec.yml 以使用sam deploy 之前。
谢谢!
【问题讨论】:
标签:
amazon-web-services
aws-lambda
amazon-cloudformation
aws-codebuild
aws-sam
【解决方案1】:
'sam package' 和'aws cloudformation package' 一样愚蠢。区别来自“sam build”,它将构建一个新的“template.yaml”并放置在“{app_dir}/.aws-sam/build/template.yaml”下,并带有依赖项。
这个新的“template.yaml”被“sam package”(而不是“{app_dir}/template.yaml”)使用,因此在包中添加了所需的依赖项。请调查目录“{app_dir}/.aws-sam/build/”以了解更多信息。
如果您在“{app_dir}/.aws-sam/build”目录中运行“cloudformation package”,您将获得与“sam package”相同的结果。
使用 'sam package' 和 --debug 来查看它正在读取哪个模板文件:
$ sam package --output-template-file packaged.yaml --s3-bucket {bucket_name} --debug
Using SAM Template at /home/ec2-user/sam-app/.aws-sam/build/template.yaml
'aws cloudformation package' 只会从您指定的位置读取模板文件:
$ aws cloudformation package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket {my-bucket}
【解决方案2】:
我遇到了aws cloudformation package ... 的问题,它没有将DefinitionUri 更新为 SAM 模板的相应 S3 URI,我对 Step 函数的处理如下:
DemoStepFunction:
Type: AWS::Serverless::StateMachine
Properties:
DefinitionUri: stepfunctions/demo_step_1.json
sam package... 解决了问题并创建了正确的 Cloudformation 模板:
DemoStepFunction:
Type: AWS::Serverless::StateMachine
Properties:
DefinitionUri:
Bucket: pipeline-demo-test1
Key: cassdasd6565casdawwebf5f3