【发布时间】:2019-09-26 13:04:30
【问题描述】:
我需要通过以下链接创建基于资源的策略。所以我使用了boto3来实现这一点。
下面是python脚本。
import boto3, json
from assume_role import credentials
if __name__ == "__main__":
credentials = credentials("AssumeRoleSessionEBSEncryption")
iam = boto3.client(
'iam',
region_name='eu-central-1',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
)
my_managed_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow",
"Effect": "Allow",
"Principal": {
"Service": [
"mq.amazonaws.com"
]
},
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:log-group:/aws/amazonmq/*"
}
]
}
response = iam.create_policy(
PolicyName='MQPolicy',
PolicyDocument=json.dumps(my_managed_policy)
)
print(response)
执行脚本后出现以下错误。请提出建议。
Traceback (most recent call last):
File "mq_iam_policy.py", line 32, in <module>
PolicyDocument=json.dumps(my_managed_policy)
File "/home/ec2-user/workspace/scripts/venv/lib64/python3.7/site-packages/boto3/resources/factory.py", line 520, in do_action
response = action(self, *args, **kwargs)
File "/home/ec2-user/workspace/scripts/venv/lib64/python3.7/site-packages/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "/home/ec2-user/workspace/scripts/venv/lib64/python3.7/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/home/ec2-user/workspace/scripts/venv/lib64/python3.7/site-packages/botocore/client.py", line 661, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.MalformedPolicyDocumentException: An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Policy document should not specify a principal.
[
最终答案:-
import boto3, json
import os
from assume_role import get_temporary_credentials
AWS_ACCOUNT_ID = os.environ['AWS_ACCOUNT_ID']
AWS_ROLE = os.environ['AWS_ROLE']
if __name__ == "__main__":
credentials = get_temporary_credentials("AssumeRoleSessionEBSEncryption")
client = boto3.client(
'logs',
region_name='eu-central-1',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
)
response = client.put_resource_policy(
policyName='MQPolicy',
policyDocument='{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "mq.amazonaws.com" }, "Action":[ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource" : "arn:aws:logs:*:*:log-group:/aws/amazonmq/*" } ] }'
)
print(response)
【问题讨论】:
-
my_managed_policy已经是我认为的 dict 类型,所以json.dumps可能不需要? -
@Lamanus 我点击了下面的链接。 github.com/awsdocs/aws-doc-sdk-examples/blob/master/python/…
-
您的参考使用 boto3.client 而不是资源。
-
@Lamanus 错误还是一样:(
-
哦,错误提示
Policy document should not specify a principal.但你做到了。
标签: python python-3.x boto3