The文档说他们做的完全一样:
本节中描述的sam软件包和sam部署命令与它们的AWS CLI等效命令完全相同aws cloudformation程序包和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
。
谢谢!
'sam package'和'aws cloudformation package'一样愚蠢。区别来自“ sam build”,它将构建一个新的“ template.yaml”,并通过依赖项放置在“ {app_dir} /。aws-sam / build / template.yaml”下。
此新的'template.yaml'由'sam包'使用(而不是'{app_dir} /template.yaml'),因此在包中添加了所需的依赖项。请调查目录“ {app_dir} /。aws-sam / build /”以了解更多信息。
如果您在目录'{app_dir} /。aws-sam / build'中运行'cloudformation package',您将获得与'sam package'相同的结果。
与--debug一起使用'sam软件包',以查看它正在读取哪个模板文件:
$ 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}