我所拥有的:几个旧的s3存储桶,每个存储桶中有1M个对象,并且服务器端加密已打开。
问题:旧文件未加密。而且我不能说加密何时开启。 因此,我需要找到所有未加密的文件。
我已经尝试使用awscli
解决方案,但是速度非常慢-2秒内有1个请求。
我的解决方案:
s3_buckets="uploads tmp logs whatever "
for s3_bucket in $s3_buckets;
do
aws s3 ls s3://$s3_bucket --recursive \
| awk '{print $NF}' \
| ( while read object ;
do
object_status=$(aws s3api head-object --bucket $s3_bucket --key $object --query ServerSideEncryption --output text 2>&1)
if [ "$object_status" != "AES256" ]; then
echo "Unencrypted object $object in s3://$s3_bucket"; >> /tmp/body.tmp
objects_unencrypted=$((objects_unencrypted + 1))
fi
objects_count=$((objects_count + 1))
done
echo "Bucket $s3_bucket has $objects_count, where unencrypted $objects_unencrypted." >> /tmp/body.tmp )
done
那么,也许有更好的解决方案?
是否可以创建Cloudwatch
指标以显示未加密的字段?或其他任何人?
答案 0 :(得分:2)
清单列表包含S3存储桶中的对象列表,并且每个列出的对象的元数据包括:
答案 1 :(得分:1)
恐怕没有比列出所有文件并一步一步检查加密更好的解决方案了。 (另请参见https://github.com/aws/aws-sdk-js/issues/1778)
没有关于加密的cloudwatch指标。指标列表在https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html
中给出话虽如此,您可以通过编写python或节点脚本来为您完成此操作,从而稍微加快该过程。它的运行速度比上面的shell脚本快,因为它不需要为每个对象生成一个进程(和完整的python运行时)。
上面的URL在Node中给出了一个示例。同样适用于Python。
另一种加快处理速度的方法是并行运行多个脚本,每个脚本处理名称空间的一部分。假设您的对象键名称分布均匀(对象键的第一个字母为[az],并且对象键的第一个字母分布为统一):您可以创建26个脚本,每个脚本列出一个字母(所有键均以'a'开头,所有键(以'b'等开头)并并行运行这些脚本。这将利用S3的大规模并行性。可以用更适合您的用例的方式替换字母示例。
为了最大程度地减少脚本和S3之间的延迟,我将在与存储桶位于同一区域的小型EC2实例上运行脚本。