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": "*"
        }
    ]
}

认证

支持以下认证方式:

  1. 环境变量
  2. 共享凭证文件
  3. ECS 任务 IAM 角色
  4. 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

1 回复

更多关于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个函数

最佳实践

  1. 先进行Dry Run:在实际删除前,先设置DryRun: true查看将要删除的内容
  2. 保留足够的版本:建议至少保留2-3个版本以便回滚
  3. 定期执行:可以设置定时任务(如每周)自动运行清理
  4. 监控删除操作:记录删除的版本以便审计

集成到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)
	}
}

注意事项

  1. 删除的Lambda版本无法恢复
  2. 确保没有别名指向将被删除的版本
  3. 检查Lambda函数的调用方式是否依赖特定版本
  4. 考虑使用AWS IAM限制删除权限

通过合理使用go-lambda-cleanup,你可以有效管理Lambda函数版本,避免版本堆积导致的资源浪费和管理困难。

回到顶部