Skip to main content
 首页 » 编程设计

python之boto3 给出 AccessDenied,有没有办法查找缺少的权限

2024年10月01日34softidea

我一直在试图弄清楚为什么我的脚本中的这个步骤不起作用,据我所知,我的用户有权在我们的 AWS 账户上执行所有操作,所以我有点困惑。我想知道是否有一种方法可以让您从 botocore 或 boto3 本身获得返回,识别您的用户缺少的 iam 权限,而不是为您需要自己完成的工作找出正确的权限?

最初我配置了 zone_id from here

>>> dns_record = connection.change_resource_record_sets( 
...     HostedZoneId=zone_id, 
...     ChangeBatch={ 
...         'Changes': [ 
...             { 
...                 'Action': action, 
...                 'ResourceRecordSet': { 
...                     'Name': name, 
...                     'Type': record_type, 
...                     'TTL': 60, 
...                     'AliasTarget': { 
...                         'HostedZoneId': zone_id, 
...                         'DNSName': destination, 
...                         'EvaluateTargetHealth': eval_health 
...                     }, 
...                 } 
...             }, 
...         ] 
...     } 
... ) 
 
Traceback (most recent call last): 
  File "<stdin>", line 14, in <module> 
  File "/usr/lib/python2.7/site-packages/botocore/client.py", line 253, in _api_call 
    return self._make_api_call(operation_name, kwargs) 
  File "/usr/lib/python2.7/site-packages/botocore/client.py", line 543, in _make_api_call 
    raise error_class(parsed_response, operation_name) 
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the ChangeResourceRecordSets operation: User: arn:aws:iam::1337:user/rumbles is not authorized to access this resource 
>>>  
>>> print connection, zone_id, action, name, record_type, destination, eval_health 
<botocore.client.Route53 object at 0x7f9049d64590> Z117KPS5GTRQ2G UPSERT test-rumbles.domain.com A some-elb-1337.us-east-1.elb.amazonaws.com False 

如果我将 zone_id 更改为我们 AWS 域的区域,我会得到:

>>> zone_id = "Z2401337RNHANU" 
>>>  
>>> try: 
... 
An error occurred (InvalidInput) when calling the ChangeResourceRecordSets operation: Invalid request 
{'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 400, 'RequestId': '2bfde962-0e81-11e7-b312-53961dec3e91', 'HTTPHeaders': {'x-amzn-requestid': '2bfde962-0e81-11e7-b312-53961dec3e91', 'date': 'Tue, 21 Mar 2017 21:56:00 GMT', 'content-length': '259', 'content-type': 'text/xml', 'connection': 'close'}}, 'Error': {'Message': 'Invalid request', 'Code': 'InvalidInput', 'Type': 'Sender'}} 

我之前不得不研究这些问题,我知道我只需要为这个特定的工作找到正确的 IAM 许可(假设我在正确的道路上),但我想知道是否有某种方法获取从 botocore 返回的信息?与其花时间手动查找,不如我能得到我的 except 以某种方式返回的拒绝我访问的 iam 规则吗?

或者我是在谈论我尚未找到/创建的功能请求?

请您参考如下方法:

您的答案来自无效区域 ID - HostedZoneId=""的第一个 boto3 调用需要是您 url 的托管区域 ID,第二个是引用别名目标的托管区域 ID。

如果它们相同,您将被拒绝访问,因为您正在尝试更改亚马逊拥有的 URL 的记录。

来自文档 http://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Client.change_resource_record_sets

HostedZoneId 的第一个引用 HostedZoneId(字符串)—— [必填]

包含您要更改的资源记录集的托管区域的 ID。

HostedZoneId 的第二个引用 - 嵌套在 AliasTarget 中

-HostedZoneId(字符串)——[必需] 仅限别名资源记录集:使用的值取决于您要将流量路由到的位置: ELB 负载均衡器 为负载均衡器指定托管区域 ID 的值。使用以下方法获取托管区域 ID:

Amazon Web Services 一般引用的“AWS 区域和端点”一章中的弹性负载平衡表:使用与您在其中创建负载均衡器的区域相对应的“Amazon Route 53 托管区域 ID”列中的值. AWS 管理控制台:转到 Amazon EC2 页面,单击导航 Pane 中的 Load Balancers,选择负载均衡器,然后获取 Description 选项卡上 Hosted zone 字段的值。 Elastic Load Balancing API:使用 DescribeLoadBalancers 获取 CanonicalHostedZoneNameId 的值。有关详细信息,请参阅适用的指南: 经典负载均衡器:DescribeLoadBalancer 应用程序负载均衡器:DescribeLoadBalancer AWS CLI:使用 describe-load-balancers 获取 CanonicalHostedZoneNameID 的值。 配置为静态网站的 Amazon S3 存储桶

为您在其中创建存储桶的区域指定托管区域 ID。有关有效值的更多信息,请参阅 Amazon Web Services 一般引用的“AWS 区域和终端节点”一章中的 Amazon Simple Storage Service 网站终端节点表.

你的第二个问题 - 400 来自 zone_id 再次相同 - 所以现在你的第一个 zone_id 是正确的 - 它现在正在你的 url 中寻找 AWS 拥有的 URL...

试着把它分成这样

dns_record = connection.change_resource_record_sets( 
HostedZoneId=my_url_zone_id, 
ChangeBatch={ 
    'Changes': [ 
        { 
            'Action': action, 
            'ResourceRecordSet': { 
                'Name': name, 
                'Type': record_type, 
                'AliasTarget': { 
                    'HostedZoneId': elb_zone_id, 
                    'DNSName': destination, 
                    'EvaluateTargetHealth': eval_health 
                }, 
            } 
        }, 
    ] 
} 

其中 elb_zone_id = elb 的 zone_id 和 其中 my_url_zone_id = 您特定 URL 的 zone_id