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 на Zone нашего домена 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 для этой конкретной работы (при условии, что я на правильном пути), но мне было интересно, есть ли какой-то способ получить это информация вернулась из ботокора? Вместо того, чтобы тратить свое время на ручные поиски, могу ли я получить правило iam, которое запрещает мне доступ, возвращенное моим, кроме как-нибудь?

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

1 ответ

Решение

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

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

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

Первая ссылка на HostedZoneId HostedZoneId (строка) - [ТРЕБУЕТСЯ]

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

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

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

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

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

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

Другие вопросы по тегам