获取存储桶大小需要 S3 权限? [英] S3 permissions required to get bucket size?

查看:27
本文介绍了获取存储桶大小需要 S3 权限?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 boto3 获取 S3 中所有对象的大小并已授予以下权限:

s3:ListAllMyBucketss3:ListObjectss3:获取对象

但是 boto 一直抛出这个错误:

调用 ListObjects 操作时发生错误 (AccessDenied):拒绝访问

我无法在文档中或通过查看 boto 的源代码找到任何详细信息...是否有人知道获取 S3 存储桶中所有对象的大小所需的最低权限?

解决方案

我创建了以下 lambda,它打印每个对象的大小并总结总存储桶大小.

我使用

如果在尝试上述解决方案后仍然发现问题,请查看此线程.

I'm using boto3 to get the size of all objects in S3 and have granted the following permissions:

s3:ListAllMyBuckets
s3:ListObjects
s3:GetObject

However boto keeps throwing this error:

An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

I couldn't find any details in the docs or by looking at the source code for boto... does anyone know th e minimum permissions necessary just to get the size of all objects in an S3 bucket?

解决方案

I created the following lambda which prints each object size and sums up the total bucket size.

I use convert_size function from here. Credit to @James Sapam.

Code snippet :

import boto3
import math

def convert_size(size_bytes):
   if size_bytes == 0:
       return "0B"
   size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
   i = int(math.floor(math.log(size_bytes, 1024)))
   p = math.pow(1024, i)
   s = round(size_bytes / p, 2)
   return "%s %s" % (s, size_name[i])

bucket_name = 'BUCKET_NAME'
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)

def lambda_handler(event, context):
    all_objects = bucket.objects.all()
    total_size = 0
    for obj in all_objects:
        if obj.key.split('/')[-1]:
            file_name = obj.key
            file_size = convert_size(obj.size)
            total_size += obj.size
            print("File Name: %s File Size: %s" % (file_name,file_size) ) 
    print("%s bucket size : %s" % (bucket_name,convert_size(total_size)) )

Policy summary JSON :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::${BUCKET_NAME}"
        }
    ]
}

Output :

If after trying the above solution you still find issues, take a look at this thread.

这篇关于获取存储桶大小需要 S3 权限?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆