我对AWS lambda和SAM相对较新,现在我可以正常工作了,但有一个看似简单的问题,找不到答案。
我花了上周的时间来使用SAM(构建,打包,部署多次,直到可以正常工作)启动并运行lambda应用程序。
因此,现在我要上传到的S3存储桶中包含以前(由sam package
上传)的许多版本的zip代码。
sam package
'上传新版本?在我用来存储lambda包的存储桶中,我还有一个自定义层。
因此,如果只是应用程序包,我可以轻松地(现在)进入并删除存储桶中的所有内容,然后重新构建/打包/部署以对其进行清理。 ...但是那也会删除我的图层(并且-同样的问题-我现在确定该图层正在使用存储桶中的哪个zip文件)。
但是无论如何,这种方法不会长期有效,因为我计划将大约10-15个不同的程序包/功能放在一起,因此在仅更新其中一个时删除存储桶中的所有内容将行不通。
感谢您的任何想法,想法和帮助!
答案 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 打包版本,但毕竟删除它们可能并不总是一个好主意......