如何通过 boto3 解析策略文档响应

Posted

技术标签:

【中文标题】如何通过 boto3 解析策略文档响应【英文标题】:How to parse the policy document response by boto3 【发布时间】:2017-08-11 12:27:07 【问题描述】:

我正在编写一个扫描所有 S3 存储桶和文件的 Python 脚本。我希望脚本记录策略文档中公开的每个文件,我的意思是它有:"Effect": "Allow""Principal" : "*"。所以我的代码中有这一行:

bucket_policy = storageClient.get_bucket_policy(Bucket='mybucket-documents-2017')
print(bucket_policy)

它返回一个字符串:


'Policy':
 u'
 "Version":"2012-10-17",
 "Statement":[
 
 "Sid":"",
 "Effect":"Allow",
 "Principal":
 "AWS":"arn:aws:iam::000000000000:user/myuser",
 "Action":"s3:GetObject",
 "Resource":"arn:aws:s3:::mybucket-documents-2017/*"
 ,
 
 "Sid":"",
 "Effect":"Allow",
 "Principal":"AWS":"arn:aws:iam::0000000000000:user/myuser",
 "Action":"s3:PutObject",
 "Resource":"arn:aws:s3:::mybucket-documents-2017/*"
 ]
 ', 
 'ResponseMetadata': 
 'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': '0EkHM/G1rnRjZH3lhTim1uaDG+5dCJmbJAhSVTnniGsNZIAl6SOMlYgbJOR0XAJOtzmXuu/CSd0=', 'RequestId': '037CADEB6342E9C
2', 'HTTPHeaders': 'x-amz-id-2': '0EkHM/G1rnRjZH3lhTim1uaDG+5dCJmbJAhSVTnniGsNZIAl6SOMlYgbJOR0XAJOtzmXuu/CSd0=', 'server': 'AmazonS3', 'transfer-encoding': 'chunked', 'x-amz-request-id': '037CADEB634
2E9C2', 'date': 'Fri, 11 Aug 2017 10:03:21 GMT', 'content-type': 'application/json'



当我做类似的事情时:

 for policy in bucket_policy:
        print(policy[0])

for policy in bucket_policy['Policy']:
        print(policy[0])

我什么都没有。

如何通过解析策略文档得到EffectPrincipal的值?

【问题讨论】:

【参考方案1】:

您可能希望首先将该字符串加载到本机数据类型中:

import json
policy = json.loads(bucket_policy['Policy'])

这将允许您循环遍历 Statement 数组。

for statement in policy['statement']:
    print(statement['Effect'])

【讨论】:

我对此进行了测试,但它不起作用,我在 JSON 导入时收到类型错误。 Traceback(最近一次调用最后一次):文件“json_test.py”,第 34 行,在 pol = json.loads(data['Policy']) 类型错误:字符串索引必须是整数 假设 bucket_policy = storageClient.get_bucket_policy(Bucket='mybucket-documents-2017') 实际上返回一个字符串,这就是我的代码所做的。我怀疑它上面的__str__ 方法可能会从print 函数中生成该字符串。 确实我误解了get_bucket_policy 的返回类型,它是dict。我试图将整个内容加载为字符串。这确实有效。

以上是关于如何通过 boto3 解析策略文档响应的主要内容,如果未能解决你的问题,请参考以下文章

json Boto3 DynamoDB更新响应

如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?

SQS 接收消息的正确解析是啥?

如何通过改造解析 JSON 响应

如何使用 JSON 格式解析通过 AFNetworking 1.0 获得的响应

如何将请求中的值复制到 Azure API 管理策略中的响应中