sam包vs aws云信息包



文档说他们做的事情完全一样:

本节中描述的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

最新更新