【问题标题】:AWS Lambda's: SAM deployment ...identifying and removing old S3 package versions?AWS Lambda 的:SAM 部署 ...识别和删除旧的 S3 包版本?
【发布时间】:2020-02-29 11:05:45
【问题描述】:

我对 AWS lambda 和 SAM 比较陌生,现在我已经开始工作了,但我有一个看似简单的问题却找不到答案。

上周我使用 SAM 启动并运行了一个 lambda 应用程序(构建、打包、部署多次,直到它工作)。

问题

所以现在我用来上传的 S3 存储桶有许多(大约 100 个)以前上传的(由sam package)我的压缩代码的版本。

问题

  1. 您如何识别哪些压缩包是当前的(即由当前函数和/或层使用),并删除所有旧的过时的包?
  2. 在 SAM(命令行选项或模板文件中)有没有办法 让它自动删除旧版本的包,当你 'sam package' 上传新版本?
  3. AWS 控制台中是否有某个地方可以找到当前函数或层正在使用的存储桶中哪个 zip 文件的密钥? (我试图到处找到它,但无法设法......很容易获得 ARN,但不是你的存储桶中映射到的实际 URI)

轻微并发症

在我用来存储 lambda 包的存储桶中,我还有一个自定义层。
因此,如果只是应用程序包,我可以轻松(现在)进入并删除存储桶中的所有内容,然后重新构建/打包/部署以清理它。 ...但这也会删除我的图层(并且 - 同样的问题 - 我现在确定该图层正在使用存储桶中的哪个 zip 文件)。

但是这种方法无论如何都不会长期有效,因为我计划将大约 10-15 个不同的包/功能放在一起,所以当只更新其中一个时删除存储桶中的所有内容是行不通的。

感谢您的任何想法、想法和帮助!

【问题讨论】:

    标签: aws-lambda aws-sam-cli aws-sam


    【解决方案1】:

    实际上,CloudFormation(SAM 所基于)仅使用 S3 作为临时存储。当您创建或更新 Lambda 函数时,会生成一份代码副本,因此您可以从存储桶中删除所有对象,而 Lambda 函数仍然可以正常工作。

    警告:在某些情况下可能需要 S3 对象,例如回滚 CloudFormation 堆栈。例如“CloudFormation 堆栈部署回滚”场景(reference):

    1. 部署版本 N 的堆栈
    2. 删除版本N使用的打包S3对象
    3. 使用触发 CloudFormation 回滚的“错误”模板文件部署版本 N+1

    【讨论】:

      【解决方案2】:

      您可以尝试将当前部署的堆栈与您存储在S3 中的堆栈进行比较。假设您有一个名为 test-stack 的堆栈,那么您可以使用 AWS CLI 从 CloudFormation 检索 已处理 堆栈,如下所示:

      AWS_PAGER="" aws cloudformation get-template --stack-name test-stack \
        --output json --template-stage Processed
      

      要仅获取已处理的模板正文,您可能需要再次通过管道输出输出

      jq -r ".TemplateBody"
      

      现在您有了处理后的 CFN 模板,该模板告诉您它正在使用哪些 S3 存储桶和密钥。以下是 lambda 函数的示例:

      MyLambda:
        Type: 'AWS::Lambda::Function'
        Properties:
          Code:
            S3Bucket: my-bucket
            S3Key: 0c53a7ccb1c1762eaeebd96555d13a20
      

      然后您可以尝试删除当前堆栈未引用的 s3 对象。

      曾经有一个 github ticket 请求某种自动清理机制,但它已被关闭,因为它超出了范围 https://github.com/aws/serverless-application-model/issues/557#issuecomment-417867028

      值得注意的是,您还可以尝试设置一个 S3 生命周期规则来自动清理旧的 s3 对象,如下所示:https://github.com/aws/aws-sam-cli/issues/648 但是,我认为这并不总是一个合适的解决方案。

      最后但并非最不重要的一点是,有人尝试在 sam 文档中包含一些自动清理方法,但被驳回为:

      [...] 某些用例需要这些打包的 S3 对象持久存在,删除它们会导致严重问题。一个这样的示例是“CloudFormation 堆栈部署回滚”场景:1) 部署堆栈的版本 N,2) 删除版本 N 使用的打包 S3 对象,3) 使用触发的“坏”模板文件部署版本 N+1 CloudFormation 回滚。

      https://github.com/awsdocs/aws-sam-developer-guide/pull/3#issuecomment-462993286

      因此,虽然可以识别过时的 S3 打包版本,但毕竟删除它们可能并不总是一个好主意...

      【讨论】:

        【解决方案3】:

        1.在您的packaged.yaml(调用sam package 后生成)文件中,您可以在每个lambda 函数下看到一个CodeUri 和唯一路径s3://your bucket/idid 是当前函数和/或层使用的 ID,驻留在您的存储桶中。 在图层中是ContentUri

        2.当你'sam package'上传新版本时自动删除旧版本的包 - 我不知道有这样的事情。

        3.通过 AWS 控制台,您可以看到您的层版本,我认为没有迹象表明您的功能/层CodeUri/ContentUri

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-15
          • 1970-01-01
          • 2021-11-11
          • 2018-09-19
          • 1970-01-01
          • 2021-07-01
          • 2021-02-10
          相关资源
          最近更新 更多