SAM打包与AWS CloudFormation打包的区别

7

文档显示它们完全相同:

本节中描述的sam包和sam deploy命令与其AWS CLI等效命令aws cloudformation package和aws cloudformation deploy完全相同。

但我的经验表明这并不完全正确。当我运行sam deploy时,我的基于Java的Lambda会上传一个带有以下zip结构的artifact到S3:

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

这在Lambda中可以很好地执行。但是,当我按照Lambda + CodePipeline文档中的步骤使用aws cloudformation时,我得到了这个zip结构(实际上是我的git存储库):

  • README.md
  • build/
  • build.gradle
  • buildspec.yml
  • events
  • gradle/
  • gradlew
  • gradlew.bat
  • src/
  • template.yml
注意:即使在 CodeBuild 之外,这种替代结构也会发生,因此我怀疑它与 buildspec.yml 中的内容无关。我可以通过在桌面上调用两个不同的包命令来重现这两个结构。
有任何想法为什么会有差异?我想要理解这个问题,特别是因为文档说它们应该是相同的,在切换我的 buildspec.yml 使用 sam deploy 之前。
谢谢!
2个回答

8

'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}

1

我遇到了一个问题,使用aws cloudformation package ...时,它没有将DefinitionUri更新为我在Step函数中的SAM模板对应的S3 URI。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接