sam 包与 aws cloudformation 包

Pat*_*ody 5 amazon-web-services aws-cloudformation aws-lambda aws-codebuild aws-sam

该文件说,他们做同样的事情:

本节中描述的 sam package 和 sam deploy 命令分别与它们的 AWS CLI 等效命令 aws cloudformation package 和 aws cloudformation deploy 相同。

但我的经验表明这并不完全正确。当我运行sam deploy基于 Java 的 Lambda 时,会使用这种类型的 zip 结构将工件上传到 S3:

  • 元信息
  • com/example/etc,类文件
  • logback.groovy,其他资源
  • lib,其中包含我所有的 jars

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

  • 自述文件
  • 建造/
  • 构建.gradle
  • 构建规范.yml
  • 事件
  • 等级/
  • 梯度
  • gradlew.bat
  • 来源/
  • 模板.yml

注意:这种替代结构甚至发生在 CodeBuild 之外,所以我怀疑它与buildspec.yml. 我可以简单地通过调用桌面上的两个不同的包命令来重现这两个结构。

任何想法为什么会有差异?我想了解它,特别是因为在我切换buildspec.yml到使用sam deploy.

谢谢!

sha*_*aws 6

“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”相同的结果。

使用带有 --debug 的 'sam package' 来查看它正在读取哪个模板文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

'aws cloudformation package' 只会从您指定的位置读取模板文件:

$ aws cloudformation package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket {my-bucket}
Run Code Online (Sandbox Code Playgroud)