【问题标题】:Getting latest updated object on each S3 bucket在每个 S3 存储桶上获取最新更新的对象
【发布时间】:2022-02-01 11:51:38
【问题描述】:

我正在尝试获取未使用的 S3 存储桶列表。为此,我在每个存储桶上获取最新更新的对象,并将最后修改日期与给定日期进行比较。我收到有关内容的关键错误。这是我的代码。

import json
import boto3
from datetime import datetime
import csv
def lambda_handler(event, context):
    # connect to S3
    s3 = boto3.client(service_name='s3',
                      region_name='my region')
    # Declaring required variables
    column_list = ["Bucket_Name", "Object_Name", "Last_Modified_Date"]
    result_list = []
    date_to_compare = datetime(2021, 12, 24).strftime('%Y-%m-%d')
    # Last modified object for each s3 bucket
    Bucket_list = s3.list_buckets()
    for bucket in Bucket_list['Buckets']:
        objectlist = s3.list_objects_v2(Bucket=bucket["Name"])
        latest_updated = max(objectlist["Contents"],key=lambda x: x['LastModified'])
        if(latest_updated['LastModified'].strftime('%Y-%m-%d') < date_to_compare):
            values = [bucket["Name"], latest_updated["Key"],latest_updated["LastModified"].strftime('%Y-%m-%d')]
            result_list.append(values)
            
    file = open('s3_buckets_unused.csv', 'w+', newline='')
    # writing the data into the file
    with file:
        write = csv.writer(file)
        write.writerow(column_list)
        write.writerows(result_list)

这在我的本地系统上运行良好,但在 AWS Lambda 上却不行。我收到以下错误。有什么见解吗?

响应 { "errorMessage": "'内容'", "errorType": "KeyError", "requestId": "e981bffb-61da-4bc3-8078-29c13018e659", “堆栈跟踪”: [ " 文件 "/var/task/lambda_function.py",第 17 行,在 lambda_handler\n latest_updated = max(objectlist["Contents"],key=lambda x: x['LastModified'])\n" ] }

【问题讨论】:

  • 旁注:如果存储桶中有超过 1000 个对象,则需要使用paginator

标签: python amazon-web-services amazon-s3 aws-lambda boto3


【解决方案1】:

如果一个桶是空的,它将没有Contents。你必须检查一下:

import json
import boto3
from datetime import datetime
import csv
def lambda_handler(event, context):
    # connect to S3
    s3 = boto3.client(service_name='s3',
                      region_name='my region')
    # Declaring required variables
    column_list = ["Bucket_Name", "Object_Name", "Last_Modified_Date"]
    result_list = []
    date_to_compare = datetime(2021, 12, 24).strftime('%Y-%m-%d')
    # Last modified object for each s3 bucket
    Bucket_list = s3.list_buckets()
    for bucket in Bucket_list['Buckets']:
        objectlist = s3.list_objects_v2(Bucket=bucket["Name"])



        if 'Contents' not in objectlist: continue



        latest_updated = max(objectlist["Contents"],key=lambda x: x['LastModified'])
        if(latest_updated['LastModified'].strftime('%Y-%m-%d') < date_to_compare):
            values = [bucket["Name"], latest_updated["Key"],latest_updated["LastModified"].strftime('%Y-%m-%d')]
            result_list.append(values)
            
    file = open('s3_buckets_unused.csv', 'w+', newline='')
    # writing the data into the file
    with file:
        write = csv.writer(file)
        write.writerow(column_list)
        write.writerows(result_list)

【讨论】:

  • 这行得通。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多