文档说他们做的事情完全一样:
本节中描述的sam包和sam部署命令与它们的AWS CLI等效命令AWS cloudformation相同package和aws-cloudformation分别部署。
但我的经验表明这并不完全正确。当我为我的基于Java的Lambda运行sam deploy
时,会得到一个上传到S3的工件,该工件具有以下类型的zip结构:
- META-INF
- com/example/etc,类文件
- logback.groovy,其他资源
- lib,里面装着我所有的罐子
这在Lambda中执行得很好。但是,当我遵循Lambda+CodePipeline文档并使用aws cloudformation
时,我得到了以下zip结构(本质上是我的git-reo(:
- README.md
- 构建/
- build.gradle
- buildspec.yml
- 事件
- 渐变/
- gradlew
- 坡度.bat
- src/
- template.yml
注意:这种替代结构甚至发生在CodeBuild之外,所以我怀疑它与buildspec.yml
中的内容有任何关系。我可以通过在桌面上调用两个不同的包命令来复制这两种结构。
有什么想法为什么会有区别吗?在我将buildspec.yml
切换为使用sam deploy
之前,我想了解一下,尤其是因为文档说它们应该是一样的。
谢谢!
"am包"one_answers"aws cloudformation包"一样愚蠢。不同之处在于"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包"可以查看它正在读取哪个模板文件:
$ 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,对于Step函数,我有如下所示:
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