golang清理AWS Lambda未使用或旧版本插件库go-lambda-cleanup的使用
Golang 清理 AWS Lambda 未使用或旧版本插件库 go-lambda-cleanup 的使用
go-lambda-cleanup 是一个基于 Go 的 CLI 工具,用于移除 AWS Lambda 未使用的旧版本。它是一个单一二进制文件,无需额外依赖。
安装
go-lambda-cleanup 以单一二进制文件分发。下载二进制文件并将其安装到系统 PATH 中的目录。对于 UNIX/LINUX 环境,推荐路径是 /usr/local/bin
。
VERSION=2.0.17
wget https://github.com/karl-cardenas-coding/go-lambda-cleanup/releases/download/v$VERSION/go-lambda-cleanup-v$VERSION-linux-amd64.zip
unzip go-lambda-cleanup-v$VERSION-linux-amd64.zip
sudo mv glc /usr/local/bin/
Docker
go-lambda-cleanup 也提供 Docker 镜像:
VERSION=v2.0.16
docker pull ghcr.io/karl-cardenas-coding/go-lambda-cleanup:$VERSION
可以通过环境变量传递 AWS 凭证:
export AWS_ACCESS_KEY_ID=47as12fdsdg....
export AWS_SECRET_ACCESS_KEY=21a5sf5dg8e...
docker run -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY ghcr.io/karl-cardenas-coding/go-lambda-cleanup:$VERSION clean -r us-east-1 -d
使用
基本命令格式:
Usage:
glc [flags]
glc [command]
Available Commands:
clean 移除除 $LATEST 版本外的所有旧版 AWS Lambda
help 获取命令帮助
version 打印当前 glc 版本号
Flags:
-d, --dryrun 执行干运行 (bool)
-h, --help 显示帮助
-l, --listFile string 指定包含要删除 Lambda 的文件
-m, --moreLambdaDetails 设置为 true 显示 Lambda 名称和要删除的版本数 (bool)
-p, --profile string 指定用于认证的 AWS 配置文件
-r, --region string 指定目标 AWS 区域
-i, --size-iec 以 IEC 单位显示文件大小 (bool)
-v, --verbose 设置为 true 启用调试 (bool)
保留版本
要保留除 $LATEST
外的旧版本,使用 -c
标志:
$ glc clean -r us-east-2 -c 2 -p myProfile
显示详细信息
使用 -m
标志显示 Lambda 名称和版本计数等详细信息:
glc clean -r us-east-1 -dmp mySuperAwesomeProfile
干运行
使用 -d
标志预览执行:
$ glc clean -p myProfile -r us-east-1 -d
自定义列表
可以提供包含要清理的 Lambda 函数的输入文件(JSON 或 YAML 格式):
YAML 示例 (custom_list.yaml
):
lambdas:
- stopEC2-instances
- putControls
JSON 示例 (custom_list.json
):
{
"lambdas": [
"stopEC2-instances",
"putControls"
]
}
使用自定义列表:
$ glc clean -r us-east-1 -p myProfile -l custom_list.yaml
IAM 权限
go-lambda-cleanup 需要以下 IAM 权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "goLambdaCleanup",
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:ListVersionsByFunction",
"lambda:ListAliases",
"lambda:DeleteFunction"
],
"Resource": "*"
}
]
}
认证
支持以下认证方式:
- 环境变量
- 共享凭证文件
- ECS 任务 IAM 角色
- EC2 实例 IAM 角色
共享文件示例
$ export AWS_PROFILE=sb-test
$ glc clean -r us-west-2
环境变量示例
$ export AWS_ACCESS_KEY_ID=YOUR_AKID
$ export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
$ export AWS_SESSION_TOKEN=TOKEN
$ glc clean -r us-west-2
GitHub Actions 定时任务
示例 GitHub Actions 配置:
name: Nightly Lambda Version Cleanup
on:
schedule:
# 每天 04:00 执行
- cron: '0 04 * * *'
env:
VERSION: 'v2.0.16'
jobs:
build:
name: Run go-lambda-cleanup
runs-on: ubuntu-latest
steps:
- name: Pull Docker Image
run: docker pull ghcr.io/karl-cardenas-coding/go-lambda-cleanup:$VERSION
- name: Run go-lambda-cleanup in Test
env:
AWS_ACCESS_KEY_ID: ${{secrets.AWS_TEST_ACCESS_KEY}}
AWS_SECRET_ACCESS_KEY: ${{secrets.AWS_TEST_SECRET_ACCESS_KEY}}
REGION: us-east-1
run: docker run -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY ghcr.io/karl-cardenas-coding/go-lambda-cleanup:$VERSION clean -r $REGION
- name: Run go-lambda-cleanup in Prod
env:
AWS_ACCESS_KEY_ID: ${{secrets.AWS_PROD_ACCESS_KEY}}
AWS_SECRET_ACCESS_KEY: ${{secrets.AWS_PROD_SECRET_ACCESS_KEY}}
REGION: us-east-1
run: docker run -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY ghcr.io/karl-cardenas-coding/go-lambda-cleanup:$VERSION clean -r $REGION
更多关于golang清理AWS Lambda未使用或旧版本插件库go-lambda-cleanup的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang清理AWS Lambda未使用或旧版本插件库go-lambda-cleanup的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用go-lambda-cleanup清理AWS Lambda未使用或旧版本
go-lambda-cleanup是一个用于清理AWS Lambda函数未使用或旧版本的Go语言工具库。它可以帮助你自动化管理Lambda函数版本,删除不再需要的旧版本,从而节省AWS资源使用成本。
安装
go get github.com/aws-samples/go-lambda-cleanup
基本使用示例
package main
import (
"fmt"
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws-samples/go-lambda-cleanup/pkg/cleanup"
)
func main() {
// 创建AWS会话
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-east-1"), // 替换为你的AWS区域
})
if err != nil {
log.Fatalf("创建AWS会话失败: %v", err)
}
// 创建清理器实例
cleaner := cleanup.NewLambdaCleaner(sess)
// 配置清理选项
opts := cleanup.Options{
DryRun: false, // 设置为true只显示将要删除的内容而不实际删除
KeepVersions: 3, // 保留的最新版本数量
MaxAgeDays: 30, // 保留不超过30天的版本
FunctionName: "my-function", // 指定特定函数名,留空则处理所有函数
}
// 执行清理
results, err := cleaner.Cleanup(opts)
if err != nil {
log.Fatalf("清理失败: %v", err)
}
// 输出结果
fmt.Println("清理结果:")
for _, result := range results {
fmt.Printf("函数: %s\n", result.FunctionName)
fmt.Printf("保留的版本: %v\n", result.KeptVersions)
fmt.Printf("删除的版本: %v\n", result.DeletedVersions)
fmt.Printf("错误: %v\n", result.Err)
fmt.Println("---------------------")
}
}
高级功能
1. 排除特定版本
opts := cleanup.Options{
KeepVersions: 3,
ExcludeVersions: []string{"1", "2", "3"}, // 排除这些版本号不被删除
}
2. 使用标签过滤函数
opts := cleanup.Options{
KeepVersions: 3,
TagFilters: map[string]string{
"Environment": "production", // 只处理带有Environment=production标签的函数
},
}
3. 并发处理多个函数
cleaner := cleanup.NewLambdaCleaner(sess, cleanup.WithConcurrency(10)) // 同时处理10个函数
最佳实践
- 先进行Dry Run:在实际删除前,先设置
DryRun: true
查看将要删除的内容 - 保留足够的版本:建议至少保留2-3个版本以便回滚
- 定期执行:可以设置定时任务(如每周)自动运行清理
- 监控删除操作:记录删除的版本以便审计
集成到CI/CD流程
// 在部署后自动清理旧版本
func postDeploymentCleanup() {
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String(os.Getenv("AWS_REGION")),
}))
cleaner := cleanup.NewLambdaCleaner(sess)
_, err := cleaner.Cleanup(cleanup.Options{
FunctionName: os.Getenv("LAMBDA_FUNCTION_NAME"),
KeepVersions: 3,
DryRun: os.Getenv("DRY_RUN") == "true",
})
if err != nil {
log.Printf("清理失败(非致命): %v", err)
}
}
注意事项
- 删除的Lambda版本无法恢复
- 确保没有别名指向将被删除的版本
- 检查Lambda函数的调用方式是否依赖特定版本
- 考虑使用AWS IAM限制删除权限
通过合理使用go-lambda-cleanup,你可以有效管理Lambda函数版本,避免版本堆积导致的资源浪费和管理困难。