sam 包 vs aws cloudformation 包

sam package vs aws cloudformation package

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.

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

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

注意:这种替代结构甚至发生在 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/”以了解更多信息。

如果您 运行 'cloudformation package' 在目录 '{app_dir}/.aws-sam/build' 中,您将得到与 '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}

我遇到了 aws cloudformation package ... 的问题,它没有将 DefinitionUri 更新为 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