The文档说他们做了完全相同的事情:
Both the sam package and sam deploy commands described in this section are identical to their AWS CLI equivalent commands aws cloudformation package and aws cloudformation deploy, respectively.
但我的经验表明这并不完全正确。当我为基于 Java 的 Lambda 运行 sam deploy
时,会使用这种类型的 zip 结构将工件上传到 S3:
- 元信息
- com/example/etc,类文件
- logback.groovy,其他资源
- lib,其中包含我所有的 jar
这在 Lambda 中执行得很好。但是当我按照Lambda + CodePipeline docs并使用aws cloudformation
,我得到了这个zip结构(本质上是我的git存储库):
- README.md
- 构建/
- 构建.gradle
- buildspec.yml
- 事件
- 梯度/
- 格拉德卢
- gradlew.bat
- src/
- 模板.yml
注意:这种替代结构甚至发生在 CodeBuild 之外,因此我怀疑它与 buildspec.yml
中的内容有什么关系。我只需在桌面上调用两个不同的包命令即可重现这两个结构。
有什么想法为什么会出现差异吗?我想理解它,特别是因为文档说它们应该是相同的,然后我将 buildspec.yml
切换为使用 sam deploy
。
谢谢!
最佳答案
“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}
关于amazon-web-services - sam 包与 aws cloudformation 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58823209/