AWS Lambda:SAM部署...确定并删除旧的S3软件包版本?

时间:2019-11-04 06:28:22

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

我对AWS lambda和SAM相对较新,现在我可以正常工作了,但有一个看似简单的问题,找不到答案。

我花了上周的时间来使用SAM(构建,打包,部署多次,直到可以正常工作)启动并运行lambda应用程序。

问题

因此,现在我要上传到的S3存储桶中包含以前(由sam package上传)的许多版本的zip代码。

问题

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

轻微并发症

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

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

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

2 个答案:

答案 0 :(得分:0)

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

2. 当“ sam软件包”上传新版本时自动删除软件包的旧版本-我不知道这样的事情。

3。通过AWS控制台,您可以看到您的图层版本,但我认为没有指示您的功能/图层CodeUri / ContentUri

答案 1 :(得分:0)

您可以尝试将当前部署的堆栈与您存储在 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 请求请求某种自动清理机制,但由于超出范围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 打包版本,但毕竟删除它们可能并不总是一个好主意......