【问题标题】:List of S3 buckets and its lifecycle policies in .csv.csv 中的 S3 存储桶列表及其生命周期策略
【发布时间】:2020-02-07 13:42:06
【问题描述】:
def main():
    with open('S3.csv', 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow([
            'Account Name',
            'Region',
            'Bucket Name',
            'Policy'

        ])
        with open('role.json') as ec2_file:
            ec2_data = json.load(ec2_file)
        region_list = ['eu-west-1']
        for region in region_list:
            for index in range(len(ec2_data['Items'])):
                Account_Number = ec2_data['Items'][index]['Aws_Account_Number']
                Account_Name = ec2_data['Items'][index]['Acc_Name']
                ARN = ec2_data['Items'][index]['ARN']
                b = get_assume_arn_to_keys(Account_Number,Account_Name,ARN)
                ds_client = boto3.client('s3',region_name=region,aws_access_key_id=``,aws_secret_access_key=``,aws_session_token=``)


                s3 = boto3.resource('s3')

                for bucket in s3.buckets.all():
                    writer.writerow([
                        Account_Name,
                        region,
                        bucket.name,
                        ds_client.get_bucket_lifecycle(Bucket=bucket.name)

main()

我想在 .csv 中列出 s3 存储桶及其生命周期策略。我可以列出所有存储桶。

但是,列出生命周期策略给我带来了问题。我无法列出所有存储桶。可能,它只是给了我第一个桶的策略。

如果我提供存储桶名称,我可以获得生命周期策略。 单个存储桶“k”策略在所有存储桶中列出。

ds_client.get_bucket_lifecycle(Bucket='k')

但是,如果我想获得所有存储桶,我尝试了这个

ds_client.get_bucket_lifecycle(Bucket=bucket.name)

编辑::: 新尝试列出日志记录、区域和版本控制。

import boto3
s3_client = boto3.client('s3')

bucket_list = ds_client.list_buckets()

for bucket in bucket_list['Buckets']:
    try:
        lifecycle = ds_client.get_bucket_lifecycle(Bucket=bucket['Name'])
        rules = lifecycle['Rules']
    except:
        rules = 'No Policy'                 
    versioning = ds_client.get_bucket_versioning(Bucket=bucket['Name'])
    logging = ds_client.get_bucket_logging(Bucket=bucket['Name'])
    print(bucket['Name'], rules, versioning, logging)

但无法得到它。 好心劝告。 谢谢

【问题讨论】:

  • “但是,列出生命周期策略给了我错误。”您能否提及您遇到的错误?
  • @ArunNalla 但是,列出生命周期策略给我带来了问题。我无法列出所有存储桶。可能,它只是给了我第一个存储桶的策略。
  • 对不起,我认为我没有正确理解这个问题。运行此程序时是否遇到任何异常/错误,或者输出文件中的所有生命周期策略都相同的问题?
  • @ArunNalla 如果我直接给出存储桶名称,它会正确地为我提供生命周期策略。如果我给出(Bucket=bucket.name),它不会列出所有存储桶的存储桶策略(仅列出第一个存储桶)。没有具体错误。
  • 看来,如果bucket没有Lifecycle配置,调用get_bucket_lifecycle()get_bucket_lifecycle_configuration()会导致Error。您确定有问题的存储桶附加了生命周期吗?

标签: python amazon-web-services amazon-s3


【解决方案1】:

尝试针对没有具有策略的存储桶检索生命周期策略将导致异常。

因此,您需要像这样使用try/except

import boto3

s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
    try:
        rules = bucket.Lifecycle().rules
    except:
        rules = 'No Policy'
    print(bucket.name, rules)

或客户端版本:

import boto3

s3_client = boto3.client('s3')

bucket_list = s3_client.list_buckets()

for bucket in bucket_list['Buckets']:

    try:
        lifecycle = s3_client.get_bucket_lifecycle(Bucket=bucket['Name'])
        rules = lifecycle['Rules']
    except:
        rules = 'No Policy'
    print(bucket['Name'], rules)

【讨论】:

  • 有没有办法可以用 s3 = boto3.client('s3') 来做到这一点。使用客户端而不是资源。谢谢
  • 我添加了客户端版本。
  • 太好了。谢谢..我也在尝试获取存储桶日志记录、版本控制等详细信息等属性。我在最初的帖子中编辑了代码。请检查。但是给了我一些元数据而不是预期的数据。请提出建议。
  • 您可以忽略元数据。 boto3 文档中列出了您想要的字段。对于版本控制,您想查看是否定义了Status 字段。对于日志记录,您想查看是否提供了LoggingEnabled。我建议您针对启用了属性(日志记录、版本控制)的存储桶和启用了属性(日志记录、版本控制)的存储桶运行代码,并查看发回的响应的差异。您可能需要使用类似:if 'Status' in response:
  • 这是我得到的.....{'ResponseMetadata': {'RequestId': '6EA0C4BD25AB399B', 'HostId': 'bRA0gV6lgzvVD7WGVxZ0I0s95hzTN6uIsPMQ50D0xmTHDox9+ibl+k6asFxQkild6tZytW+fJ7Q=',' : 200, 'HTTPHeaders': {'x-amz-id-2': 'bRA0gV6lgzvVD7WGVxZ0I0s95hzTN6uIsPMQ50D0xmTHDox9+ibl+k6asFxQkild6tZytW+fJ7Q=', 'x-amz-request-id': '6EA0C4BD25AB399B','Fri 2020 年 2 月 7 日 05:17:43 GMT','content-type':'application/xml','content-length':'289','server':'AmazonS3'},'RetryAttempts':1}}
猜你喜欢
  • 1970-01-01
  • 2023-01-02
  • 2023-03-17
  • 2022-01-23
  • 2021-06-29
  • 2021-01-19
  • 2019-12-13
  • 2021-06-14
  • 2021-12-07
相关资源
最近更新 更多