amazon-web-services - sam 包与 aws cloudformation 包

标签 amazon-web-services aws-lambda aws-cloudformation aws-codebuild aws-sam

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.

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

  • 元信息
  • com/example/etc,类文件
  • logback.groovy,其他资源
  • lib,其中包含我所有的 jar

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

  • README.md
  • 构建/
  • 构建.gradle
  • buildspec.yml
  • 事件
  • 梯度/
  • 格拉德卢
  • gradlew.bat
  • src/
  • 模板.yml

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

如果您在目录“{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 package”将仅从您指定的位置读取模板文件:

$ aws cloudformation package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket {my-bucket}

关于amazon-web-services - sam 包与 aws cloudformation 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58823209/

相关文章:

amazon-web-services - HashiCorp Vault - 生产环境中的设置/架构

java - 使用 java aws sdk 检查 ec2 实例是否正在运行或终止

python - 使用 API 网关处理 AWS Lambda 错误

amazon-redshift - 用于为频谱 S3 访问创建 IAM 角色的模板

node.js - 向 AWS ec2 实例注册 GoDaddy 域

amazon-web-services - 如何删除/停用当前 PEM 文件并在 AWS 中创建新文件?

amazon-web-services - 如何从 Amazon API Gateway 将参数从 POST 传递到 AWS Lambda

amazon-web-services - Alexa 智能家居技能 : Issue with device discovery

aws-lambda - 尽管有 SubscriptionFilter,AWS CloudWatch LogGroup 从未将日志发送到 Lambda

python - 如何将 Lambda CloudFormation 资源中的环境变量用于 python?