如何使用Lambda函数为多个S3存储桶开启版本控制?
Lambda实现批量开启S3存储桶版本控制操作指南
1. 前置IAM权限配置
首先需要为Lambda执行角色配置对应权限,最小权限示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:PutBucketVersioning" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
如果只需要对指定存储桶操作,可以把s3:ListAllMyBuckets权限移除,并且将s3:PutBucketVersioning的Resource限定为对应桶的ARN即可
2. Lambda函数代码示例(Python运行时)
以下代码支持两种使用模式:指定固定桶列表批量操作,或遍历账号下所有存储桶操作:
import boto3 s3_client = boto3.client('s3') # 模式1:指定需要开启版本控制的桶列表,不需要全量操作的话用这个 TARGET_BUCKETS = ['bucket-1', 'bucket-2', 'bucket-3'] # 模式2:如果要全量开启所有桶的版本控制,把上面的TARGET_BUCKETS设为[]即可 def lambda_handler(event, context): processed_buckets = [] failed_buckets = [] # 如果没有指定目标桶,拉取账号下所有存储桶 target_buckets = TARGET_BUCKETS if not target_buckets: all_buckets_resp = s3_client.list_buckets() target_buckets = [bucket['Name'] for bucket in all_buckets_resp['Buckets']] for bucket_name in target_buckets: try: # 开启版本控制 s3_client.put_bucket_versioning( Bucket=bucket_name, VersioningConfiguration={ 'Status': 'Enabled' } ) processed_buckets.append(bucket_name) print(f"成功为桶{bucket_name}开启版本控制") except Exception as e: failed_buckets.append(f"{bucket_name}: {str(e)}") print(f"为桶{bucket_name}开启版本控制失败: {str(e)}") return { 'statusCode': 200, 'processed_buckets': processed_buckets, 'failed_buckets': failed_buckets }
3. 配置与注意事项
- Lambda运行时选择Python 3.9及以上版本即可,内存配置128MB完全满足需求,超时时间建议设置为30秒,如果存储桶数量超过100个可以适当调长超时时间
- 已经开启版本控制的存储桶重复调用该接口不会产生副作用,状态不会被修改
- 如果需要排除特定存储桶,可以在遍历
target_buckets的时候加过滤逻辑跳过对应桶名 - 首次运行建议先指定1-2个测试桶验证逻辑正常后,再进行全量操作
内容的提问来源于stack exchange,提问作者user15927821
相关产品推荐
相关产品推荐

