【问题标题】:How do I create a resource based policy?如何创建基于资源的策略?
【发布时间】:2019-09-26 13:04:30
【问题描述】:

我需要通过以下链接创建基于资源的策略。所以我使用了boto3来实现这一点。

https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-configuring-cloudwatch-logs.html

下面是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


【解决方案1】:

Amazon MQ 不支持以下 AWS 文章中所述的基于资源的策略:

Amazon MQ - Working with IAM

此外,根据为 Amazon MQ 配置基于资源的策略的 AWS 文档,使用 AWS CloudWatchLogs 服务的 put_resource_policy 操作。

参考资料:

Configure resource based policy for Amazon MQ

Boto3 documentation for CloudWatchLogs put_resource_policy

AWS CLI 示例:

aws --region us-east-1 logs put-resource-policy --policy-name AmazonMQ-logs \
        --policy-document '{ "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/*" } ] }'

【讨论】:

  • 在数组中传递主体后,我仍然遇到类似的错误。编辑了我的问题。
  • 更新了答案。看起来 Amazon MQ 不适用于基于资源的策略。
  • 谢谢。我应该如何继续?
  • @Kally,更新了答案:-)
  • 我已经用答案更新了问题。你能确认一下吗?
【解决方案2】:

正如我告诉你的,你不能在这种情况下使用委托人。请参阅documentation

为了使用主体,策略应该是基于资源的。

基于资源的策略 – 您可以将基于资源的策略附加到服务中的资源。基于资源的策略包含一个 Principal 元素,以指定哪些 IAM 身份可以访问该资源。有关详细信息,请参阅基于身份的策略和基于资源的策略。

但是,MQ 不支持文档中提到的基于资源的策略。

【讨论】:

  • 谢谢。我应该如何继续?
【解决方案3】:

亲爱的……

安装适用于 Windows 的 AWS CLI 代理并配置您的凭证https://docs.aws.amazon.com/cli/latest/userguide/install-windows.html

"C:\Users\YOUR-USER\" 中创建一个包含您的策略的 JSON 文件。例如:C:\Users\YOUR-USER\policy.json。你可以简单地复制这个并粘贴到你的 .json 文件中:

{"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/*"}]}

打开你的 CMD 并输入:

aws --region eu-central-1 logs put-resource-policy --policy-name amazonmq_to_cloudwatch --policy-document file://policy.json

干得好!这将创建一个 AWS RESOURCE POLICY,有时无法在 IAM 控制台中创建。

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2022-01-08
    • 2021-08-17
    • 2017-03-13
    • 2022-12-21
    • 2023-01-20
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多