boto3: Сбой уведомления о событиях в корзине S3 с использованием роли IAM - PullRequest
0 голосов
/ 13 сентября 2018

Я застрял в ситуации, когда пытаюсь использовать роль IAM для настройки уведомления о событии в корзине S3 для SQS.

Работает с aws_access_key_id и aws_secret_key_id, но не с ролевой ARN.

Работает:

client = boto3.client(
    's3',
    aws_access_key_id='XXXXXXXXXXXX',
    aws_secret_access_key='XXXXXXXXXXXXXXX'
)

bucket_notifications_configuration = {
    'QueueConfigurations': [{
        'Events': ['s3:ObjectCreated:*'],
        'Id': 'Test',
        'QueueArn':'<SQS ARN>'
    }]
}

client.put_bucket_notification_configuration(
    Bucket=bucket_name,
    NotificationConfiguration=bucket_notifications_configuration)

Но мы пытаемся достичь тех же результатов, используя роль IAM вместо идентификаторов по соображениям безопасности, я не смог найти ничего, что работает. Пробовал с помощью 'sts', все равно не повезло. Получение ошибок - «не разрешено выполнять: sts: AssumeRole на ресурсе:»

Не работает:

client = boto3.client(
    's3',
    role_arn = <IAM Role ARN>
)

bucket_notifications_configuration = {
    'QueueConfigurations': [{
        'Events': ['s3:ObjectCreated:*'],
        'Id': 'Test',
        'QueueArn':<SQS ARN>
    }]
}

client.put_bucket_notification_configuration(
    Bucket=bucket_name,
    NotificationConfiguration=bucket_notifications_configuration)

Также попытался предоставить полный доступ к s3 для роли, на которой запускается эта лямбда, без предоставления доступа / секретного ключа или роли при инициализации клиента. Но он жалуется на отказ в доступе.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Чтобы получить временные учетные данные, используя роль, вам нужно позвонить assume_role. Это означает, что вам также необходимо пройти проверку подлинности и авторизацию.

Вы не можете вызывать роль принимающего пользователя, используя учетные данные root. Вы должны использовать учетные данные IAM или временные учетные данные. Учетные данные, которые вы используете, должны иметь «доверительные отношения», чтобы принять на себя роль.

Примечание. Поскольку вы используете Lambda, вы неправильно это реализуете. Вам нужно назначить роль IAM для вашей лямбда-функции, тогда при вызове функции boto3.client('s3') произойдет автоматическое определение ваших учетных данных.

Модель разрешений AWS Lambda

Следующий код покажет, как использовать assume_role в вашем примере, игнорируя детали, которые я только что упомянул о Lambda IAM Roles.

client = boto3.client(
    'sts',
    aws_access_key_id='XXXXXXXXXXXX',
    aws_secret_access_key='XXXXXXXXXXXXXXX')

response = client.assume_role(
        RoleArn='arn:aws:iam::012345678901:role/example-role',
        RoleSessionName='ExampleSessionName')

session = boto3.Session(
    aws_access_key_id=response['Credentials']['AccessKeyId'],
    aws_secret_access_key=response['Credentials']['SecretAccessKey'],
    aws_session_token=response['Credentials']['SessionToken'])

s3 = session.client('s3')

bucket_notifications_configuration = {
    'QueueConfigurations': [{
        'Events': ['s3:ObjectCreated:*'],
        'Id': 'Test',
        'QueueArn':<SQS ARN>
    }]
}

s3.put_bucket_notification_configuration(
    Bucket=bucket_name,
    NotificationConfiguration=bucket_notifications_configuration)
0 голосов
/ 20 сентября 2018

Наконец-то все заработало !!Похоже, вам просто нужно дать достаточно разрешений для роли, которая назначается во время выполнения лямбды (Спасибо @ Michael-sqlbot).Это может не сработать, если вы запускаете его с локального компьютера, поскольку вы не можете назначить роль таким образом.

Также убедитесь, что корзина S3 существует в той же среде AWS, которую пытается изменить ваша лямбда.В противном случае вы получите ошибку «Отказано в доступе».И если ваш S3 не имеет разрешений на отправку сообщений в очередь SQS, которую вы пытаетесь добавить для уведомления, он выдаст сообщение об ошибке - Невозможно проверить конфигурацию назначения.

0 голосов
/ 13 сентября 2018

Если вы предоставляете ARN роли IAM, то учетные данные, которые вы используете, чтобы предположить, что эта роль должна иметь разрешение для принятия роли.Так ли это?

Кстати, похоже, вы запускаете этот код в Lambda.Если это правда, то почему вы явно играете роль в своем лямбда-коде?Вы обычно назначаете роль IAM для лямбды, которая уже включает разрешения на установку конфигураций уведомлений сегмента, и тогда вам не нужно ничего предполагать.

И, наконец, кажется странным конфигурировать уведомления о событиях в функции лямбды (что, как правило, часто называют).Вы уверены, что это правильно?

...