AWS Lambda:驱动云自动化的无服务器引擎
Source: Dev.to
请提供您希望翻译的文章正文内容,我将为您翻译成简体中文,并保持原有的格式、Markdown 语法以及代码块和链接不变。
概述
AWS Lambda 是一种无服务器计算服务,使您能够在无需管理服务器的情况下运行应用程序逻辑。您只需上传代码并定义触发器;AWS 会自动处理资源配置、扩展和执行。Lambda 支持多种语言,包括 Python、Node.js、Java、Go、.NET、Ruby 和自定义运行时。
关键收益
- 无需配置或维护服务器 – 消除配置、打补丁和管理基础设施的运营负担。
- 自动扩展 – 无需任何配置即可从零扩展到成千上万的并发请求。
- 按使用付费计费 – 只为函数实际使用的计算时间付费;空闲时间不产生费用。
- 深度集成 AWS 服务 – 与 S3、DynamoDB、CloudWatch、EventBridge、SNS/SQS、API Gateway 等原生协作。
Lambda 如何提升自动化
传统自动化通常需要专用服务器,导致成本高昂的闲置基础设施、手动扩展以及操作系统维护。Lambda 用以下方式取代了这种模式:
- 按需的无服务器计算
- 基于事件的执行
- 自动资源管理
- 降低运维工作负载
开发者可以专注于业务逻辑,而无需关注基础设施问题。
实际使用案例
1. 自动化 EBS 快照清理
组织经常创建 EBS 快照,却忘记删除旧的快照,导致不必要的存储费用。可以使用计划的 EventBridge 规则触发 Lambda 函数,实现:
- 检索账户拥有的所有快照。
- 确定超过定义保留期限的快照。
- 删除过期的快照。
收益: 节省存储成本,确保保留合规,消除手动清理工作。
# lambda_cleanup_snapshots.py
import boto3
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
snapshots = ec2.describe_snapshots(OwnerIds=['self'])['Snapshots']
for snap in snapshots:
snap_id = snap['SnapshotId']
print(f"Deleting Snapshot: {snap_id}")
try:
ec2.delete_snapshot(SnapshotId=snap_id)
except Exception as e:
print(f"Error deleting {snap_id}: {e}")
return {
"status": "Completed",
"deleted_snapshots": len(snapshots)
}
2. 删除未挂载的 EBS 卷
当 EC2 实例被终止后,其 EBS 卷可能仍处于 available 状态,继续产生费用。计划的 Lambda 函数可以:
- 列出所有状态为
available的卷。 - 删除每个未挂载的卷。
收益: 降低浪费的存储成本,提升云环境卫生,实现自动化清理。
# lambda_cleanup_volumes.py
import boto3
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
volumes = ec2.describe_volumes(
Filters=[{'Name': 'status', 'Values': ['available']}]
)['Volumes']
for vol in volumes:
vol_id = vol['VolumeId']
print(f"Deleting Unattached Volume: {vol_id}")
try:
ec2.delete_volume(VolumeId=vol_id)
except Exception as e:
print(f"Error deleting {vol_id}: {e}")
return {
"status": "Completed",
"deleted_volumes": len(volumes)
}
3. 自动启动已停止的 EC2 实例
某些环境需要在工作时间或补丁窗口后启动 EC2 实例。每日计划触发(例如上午 9 点)可以运行 Lambda 函数,完成:
- 查找处于
stopped状态的实例。 - 根据标签过滤或特定实例 ID 启动它们。
收益: 确保所需服务器准时可用,减少人工操作,支持 DevOps 自动化。
# lambda_start_instances.py
import boto3
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
response = ec2.describe_instances(
Filters=[{'Name': 'instance-state-name', 'Values': ['stopped']}]
)
stopped_instances = [
instance['InstanceId']
for reservation in response['Reservations']
for instance in reservation['Instances']
]
if stopped_instances:
print(f"Starting instances: {stopped_instances}")
ec2.start_instances(InstanceIds=stopped_instances)
else:
print("No stopped instances found")
return {
"action": "start_instances",
"instances": stopped_instances
}
与其他 AWS 服务的集成
Lambda 可以由广泛的 AWS 事件触发,例如:
- S3 – 对象创建或删除
- DynamoDB – 流记录
- CloudWatch – 定时 cron 作业或警报
- EventBridge – 自定义事件总线
- SNS / SQS – 消息通知
- API Gateway – HTTP 请求
这些集成使得能够构建完全自动化、事件驱动的架构,而无需专用服务器。