Невозможно проверить учетные данные для доступа при создании / использовании предварительно назначенных URL-адресов в boto3 - PullRequest
0 голосов
/ 04 декабря 2018

Я использую boto3 для копирования зашифрованных снимков EBS из одного региона в другой, но при попытке скопировать я получаю Invalid presigned URL сообщения.Я генерирую предварительно назначенный URL-адрес, используя клиентский метод boto3 generate_presigned_url в исходной области, и вызываю функцию копирования в целевой области следующим образом:

uw2_client = non_prod.client(
    'ec2', 
    region_name="us-west-2", 
    config=Config(signature_version='s3v4')
)
presigned_url = uw2_client.generate_presigned_url(
    ClientMethod='copy_snapshot',
    Params={
        'SourceSnapshotId': og_snapshot_id,   # Original snapshot ID
        'SourceRegion': 'us-west-2',
        'DestinationRegion': 'us-east-1'
        # I also tried include all parameters from copy_snapshot.
        # It didn't make a difference.
        # 'Description': desc,
        # 'KmsKeyId': 'alias/xva-nonprod-all-amicopykey',
        # 'Encrypted': True,
    }
)

Вот мой код для создания копии.

ue1_client = non_prod.client(
    'ec2', 
    region_name="us-east-1", 
    config=Config(signature_version='s3v4')
)
response = ue1_client.copy_snapshot(
    Description=desc,
    KmsKeyId='alias/xva-nonprod-all-amicopykey',   # Exists in us-east-1
    Encrypted=True,
    SourceSnapshotId=og_snapshot_id,
    SourceRegion='us-west-2',
    DestinationRegion='us-east-1',
    PresignedUrl=pre_signed_url
)

Успешно возвращает заданный URL-адрес.Но если я попытаюсь использовать этот заранее заданный URL-адрес для копирования снимка, я получу ошибку неверного URL-адреса.Если я попытаюсь подтвердить URL:

r = requests.post(presigned_url)
print(r.status_code)
print(r.text)

, я получу:

<Response>
    <Errors>
        <Error>
            <Code>AuthFailure</Code>
            <Message>AWS was not able to validate the provided access credentials</Message>
        </Error>
    </Errors>
    <RequestID>3189bb5b-54c9-4d11-ab4c-762cbea32d9a</RequestID>
</Response>

Вы могли бы подумать, что это повлечет за собой проблемы с моими учетными данными, но я не уверен, как... Это те же учетные данные, которые я использую для создания предварительно подписанного URL.И мой пользователь IAM имеет беспрепятственный доступ к EC2.

Я, очевидно, что-то здесь не так, но не могу понять, что это такое.Любое понимание будет оценено.

РЕДАКТИРОВАТЬ

Просто чтобы подтвердить, что это не проблема с разрешениями, я попробовал это с моей личной учетной записью, которая имеет доступ ко всему.По-прежнему появляется то же сообщение об ошибке.

1 Ответ

0 голосов
/ 12 декабря 2018

Как оказалось, документация неверна ... Подписанный URL-адрес НЕ требуется при копировании зашифрованных снимков в пределах одной учетной записи (согласно поддержке AWS).

Из поддержки AWS:

... на самом деле нет необходимости создавать предварительно подписанный URL-адрес для копирования зашифрованного снимка из одного региона в другой (в пределах одной учетной записи AWS).

Однако, согласнов их документацию также невозможно скопировать зашифрованные снимки в другую учетную запись ... ¯ \ _ (ツ) _ / ¯

Текущая boto3.EC2.Client.copy_snapshot документация по функциямговорит:

PresignedUrl (строка) -

При копировании зашифрованного исходного снимка с помощью API запросов Amazon EC2 необходимо предоставить предварительно подписанныйURL.Этот параметр является необязательным для незашифрованных снимков.

Вместо этого его можно просто выполнить, создав объект клиента в области назначения и вызвав метод copy_snapshot(), например, так:

try:
    ec2 = boto3.client(
        service_name='ec2',
        region_name='us-east-1'
    )

    ec2.copy_snapshot(
        SourceSnapshotId='snap-xxxxxxxxxxxx',
        SourceRegion='us-west-2',
        Encrypted=True,
        KmsKeyId='DestinationRegionKeyId'
    )
except Exception as e:
    print(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...