AWS lambda, чтобы взять на себя роль в той же учетной записи aws для доступа к S3

Я создал роль для получения объектов из ведра s3, как показано ниже:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3GetObjects",
            "Effect": "Allow",
            "Action": [
                "s3:Get*"
            ],
            "Resource": [
                "arn:aws:s3:::cat-pics",
                "arn:aws:s3:::cat-pics/"
            ]
        }
    ]
}

Затем создал лямбда-функцию, которая берет на себя эту роль. Для этого добавлен следующий оператор к основной роли выполнения лямбда, которая прикреплена к лямбда:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::same-account-id:role/AssumeS3RoleDemo"
        }
    ]
}

Однако следующий код

import json
import boto3

def lambda_handler(event, context):
    print("this test should be printed")
    # create an STS client object that represents a live connection to the 
    # STS service
    sts_client = boto3.client('sts')

    # Call the assume_role method of the STSConnection object and pass the role
    # ARN and a role session name.
    assumed_role_object=sts_client.assume_role(
        RoleArn="arn:aws:iam::same-account-id:role/AssumeS3RoleDemo",
        RoleSessionName="AssumeRoleSession"
    )

    # From the response that contains the assumed role, get the temporary 
    # credentials that can be used to make subsequent API calls
    credentials=assumed_role_object['Credentials']

    print("credentials are")
    print(credentials)

не работает. Я получаю следующую ошибку:

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:sts::same-account-id:assumed-role/lambda_basic_execution_new/AssumeRoleDemo is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::same-account-id:role/AssumeS3RoleDemo: ClientError

Здесь AssumeRoleDemo - это имя лямбда-функции, а AssumeS3RoleDemo - это имя роли, которая имеет доступ к S3.

Можно ли взять на себя роль в той же учетной записи? Итак, какой шаг мне здесь не хватает? Пожалуйста, дай мне знать.

Благодарность


person Ashy Ashcsi    schedule 02.01.2021    source источник


Ответы (2)


Вам не нужно использовать STS и AssumeRole в вашем лямбда-коде для доступа к S3, если оба находятся в одной учетной записи, если роль, привязанная к лямбда, имеет политику, разрешающую доступ на S3, она будет работать нормально.

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

Ниже приведена ссылка на один пример, использующий две разные учетные записи, но механизм тот же, с использованием только одной учетной записи:
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-accept-iam-role/#:%7E:text=1.,%20role%20in%20account%20B%3A&text=Обновить%20your%20Lambda%20function%20code,чтобы%20create%20a%20service%20client.

person Azize    schedule 02.01.2021

Вам необходимо изменить роль с помощью политики доверия

        {
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
    }

В дополнение к этому убедитесь, что в вашей корзине S3 нет правила корзины. Поскольку политика на основе ресурсов и политика на основе IAM должны быть разрешены.

person samtoddler    schedule 02.01.2021
comment
Вы уверены, что lambda.amazonaws.com должен быть здесь главным? Я бы подумал, что принципалом должна быть роль, которую использует лямбда-функция. В этом случае роль, которую использует служба Lambda, пытается принять AssumeS3RoleDemo, а не саму службу Lambda. Показанная вами политика доверия требуется для роли выполнения лямбда-выражения. - person Maurice; 02.01.2021
comment
В вопросе виден ... человек, пытающийся аутентифицировать лямбда для разрешений s3, которые уже присутствуют в роли IAM, созданной пользователем. Поэтому вместо того, чтобы вручную добавлять разрешения к роли или политике IAM, здесь все, что нам нужно, - это привязать политику доверия к роли с разрешениями s3, потому что это рекомендуемый способ от AWS. - person samtoddler; 02.01.2021
comment
Судя по названию ролей, я предполагаю, что основная цель этой настройки - создать демонстрацию, которая показывает, как принять роль через python, поэтому не особенно полезно предоставлять исходной роли разрешения для получения доступа к ведро, которое сделало бы демо устаревшим ;-) - Возможно, @Ashy Ashcsi может пролить свет на это. - person Maurice; 02.01.2021