sam软件包vs aws cloudformation软件包

时间:2019-11-12 16:50:59

标签: amazon-web-services aws-lambda amazon-cloudformation aws-codebuild aws-sam

The文档说他们做的完全一样:

  

本节中介绍的sam软件包和sam deploy命令   与它们的AWS CLI等效命令完全相同aws cloudformation   package和aws cloudformation分别部署。

但我的经验表明,事实并非如此。当我为基于Java的Lambda运行sam deploy时,会使用以下类型的zip结构将工件上传到S3:

  • META-INF
  • com / example / etc,类文件
  • logback.groovy,其他资源
  • lib,其中包含我所有的罐子

这在Lambda中执行得很好。但是当我遵循Lambda + CodePipeline docs并使用aws cloudformation时,我得到了这个zip结构(本质上是我的git repo):

  • README.md
  • 构建/
  • build.gradle
  • buildspec.yml
  • 事件
  • gradle /
  • gradlew
  • gradlew.bat
  • src /
  • template.yml

注意:这种替代结构甚至发生在CodeBuild之外,因此我怀疑它是否与buildspec.yml中的内容有关。我只需在桌面上调用两个不同的package命令即可重现这两种结构。

任何想法为何会有区别?我想了解一下,尤其是因为文档说它们应该相同,所以在我将buildspec.yml切换为使用sam deploy之前。

谢谢!

1 个答案:

答案 0 :(得分:1)

“ sam软件包”与“ aws cloudformation软件包”一样愚蠢。区别来自“ sam build”,它将构建一个新的“ template.yaml”,并将其与依赖项放在“ {app_dir} /。aws-sam / build / template.yaml”下。

“ sam软件包”(而不是“ {app_dir} /template.yaml”)使用了这个新的“ 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软件包”将仅从您指定的位置读取模板文件:

$ aws cloudformation package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket {my-bucket}