我有一个 S3 存储桶读取策略:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"]
}
]
}
根据创建新存储桶时的云跟踪日志,我正在创建一个将调用 Lambda 函数的事件。
能够读取策略的 json 并向同一策略添加新资源(存储桶(。是否有要调用的直接python API,它将使用新资源更新现有IAM策略?
我找到了正确的方法:
您必须创建现有策略的策略版本(包括策略更改(,并将其标记为默认版本。因此,新版本将替换现有策略。
获取现有策略:
policy = iam.Policy('arn:aws:iam::' + ACCOUNT_ID + ':policy/' + POLICY_NAME)
从此策略获取 JSON:
policyJson = policy.default_version.document
根据需要更改它:
policyJson['Statement'].append({
'Action': '*',
'Resource': 'arn:aws:ec2:::*/*',
'Effect': 'Allow'
})
使用新的 JSON 和选项SetAsDefault创建策略版本
response = client.create_policy_version(
PolicyArn= 'arn:aws:iam::' + ACCOUNT_ID + ':policy/' + POLICY_NAME,
PolicyDocument= json.dumps(policyJson),
SetAsDefault= True
)
删除以前的版本(可选,但建议最多 5 个版本(:
response = client.delete_policy_version(
PolicyArn= 'arn:aws:iam::' + ACCOUNT_ID + ':policy/' + POLICY_NAME,
VersionId= version.version_id
)
你很好去!
托马斯。
参考: IAM DOC
您必须获取 IAM 策略,然后删除并最终使用之前建议的修改后的 JSON 再次创建它。
代码片段
import boto3, json
# Create IAM client
iam = boto3.resource('iam')
policy = iam.Policy('arn:aws:iam::ACCCOUNT_ID:policy/CustomS3Policy')
version = policy.default_version
policyJson = version.document
policyJson['Statement'][0]['Resource'].append('arn:aws:s3:::anotherbucket/*')
print(policyJson)
client = boto3.client('iam')
response = client.delete_policy(
PolicyArn='arn:aws:iam::ACCCOUNT_ID:policy/CustomS3Policy'
)
print(response)
response = client.create_policy(
PolicyName='CustomS3Policy',
PolicyDocument=json.dumps(policyJson)
)
print(response)
参考资料:
http://boto3.readthedocs.io/en/latest/guide/iam-example-policies.html https://boto3.readthedocs.io/en/latest/reference/services/iam.html#IAM.Client.delete_policy https://gist.github.com/alexcasalboni/07414d62290828ea03a14b4bf2157fd1