boto3 дает AccessDenied, есть ли способ найти отсутствующие разрешения?

Я пытался понять, почему этот шаг в моем скрипте не работает, насколько я знаю, у моего пользователя есть разрешения делать все в нашей учетной записи AWS, поэтому я немного запутался. Мне было интересно, есть ли способ получить ответ от botocore или самого boto3 с указанием отсутствующего разрешения iam для вашего пользователя, а не выяснять точные разрешения для работы, которая вам нужна, чтобы сделать это самостоятельно?

Первоначально у меня был настроен zone_id здесь

>>> 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? Вместо того, чтобы тратить свое время на поиск вручную, могу ли я получить правило iam, которое отказало мне в доступе, возвращенное моим, кроме как каким-то образом?

Или я говорю о запросе функции, который я еще не нашел/не создал?


person Rumbles    schedule 21.03.2017    source источник
comment
Вы можете попробовать сделать то же самое из консоли AWS, обычно консоль возвращает требуемое разрешение.   -  person mootmoot    schedule 22.03.2017
comment
Мой пользователь (тот же пользователь) может делать что угодно в консоли AWS   -  person Rumbles    schedule 22.03.2017
comment
Просто чтобы убедиться, используете ли вы root/admin для выполнения этих работ или входите в систему как этот конкретный пользователь?   -  person mootmoot    schedule 22.03.2017
comment
Это не учетная запись root, а учетная запись администратора. Я не думаю, что мне не хватает каких-либо разрешений, но мне нужен способ узнать, какие разрешения, по мнению AWS, мне не хватает   -  person Rumbles    schedule 22.03.2017


Ответы (1)


Ваш ответ исходит от недопустимого идентификатора зоны - первый вызов boto3 HostedZoneId="" должен быть идентификатором размещенной зоны ВАШЕГО URL-адреса, а второй - ссылаться на идентификатор размещенной зоны цели псевдонима.

Вам будет отказано в доступе, если они совпадают, поскольку вы пытаетесь изменить записи для URL-адреса, принадлежащего Amazon.

Из документов http://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Client.change_resource_record_sets

Первое упоминание HostedZoneId HostedZoneId (строка) -- [ОБЯЗАТЕЛЬНО]

Идентификатор размещенной зоны, содержащей наборы записей ресурсов, которые вы хотите изменить.

Вторая ссылка HostedZoneId — вложенная в AliasTarget

-HostedZoneId (string) -- [ОБЯЗАТЕЛЬНО] Только наборы записей ресурсов псевдонимов: Используемое значение зависит от того, куда вы хотите направить трафик: Балансировщик нагрузки ELB Укажите значение идентификатора размещенной зоны для балансировщика нагрузки. Используйте следующие методы, чтобы получить идентификатор размещенной зоны:

Таблица Elastic Load Balancing в главе «Регионы и конечные точки AWS» Общего справочника по Amazon Web Services: используйте значение в столбце «Идентификатор размещенной зоны Amazon Route 53», соответствующее региону, в котором вы создали свой балансировщик нагрузки. Управление AWS Консоль: перейдите на страницу Amazon EC2, нажмите «Балансировщики нагрузки» на панели навигации, выберите балансировщик нагрузки и получите значение поля «Размещенная зона» на вкладке «Описание». API Elastic Load Balancing: используйте DescribeLoadBalancers, чтобы получить значение CanonicalHostedZoneNameId. Дополнительные сведения см. в соответствующем руководстве: Классический балансировщик нагрузки: DescribeLoadBalancers Балансировщик нагрузки приложений: DescribeLoadBalancers Интерфейс командной строки AWS: используйте describe-load-balancers, чтобы получить значение CanonicalHostedZoneNameID. Корзина Amazon S3, настроенная как статический веб-сайт

Укажите идентификатор размещенной зоны для региона, в котором вы создали корзину. Дополнительные сведения о допустимых значениях см. в таблице «Конечные точки веб-сайта Amazon Simple Storage Service» в главе «Регионы и конечные точки AWS» Общего справочника по Amazon Web Services .

Ваша вторая проблема - 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 и где my_url_zone_id = идентификатор зоны вашего конкретного URL-адреса

person Karl Girthofer    schedule 22.03.2017