The文档说他们做的完全一样:
本节中介绍的sam软件包和sam deploy命令 与它们的AWS CLI等效命令完全相同aws cloudformation package和aws cloudformation分别部署。
但我的经验表明,事实并非如此。当我为基于Java的Lambda运行sam deploy
时,会使用以下类型的zip结构将工件上传到S3:
这在Lambda中执行得很好。但是当我遵循Lambda + CodePipeline docs并使用aws cloudformation
时,我得到了这个zip结构(本质上是我的git repo):
注意:这种替代结构甚至发生在CodeBuild之外,因此我怀疑它是否与buildspec.yml
中的内容有关。我只需在桌面上调用两个不同的package命令即可重现这两种结构。
任何想法为何会有区别?我想了解一下,尤其是因为文档说它们应该相同,所以在我将buildspec.yml
切换为使用sam deploy
之前。
谢谢!
答案 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}