Отказано в доступе при запросе файлов S3 из AWS Athena в Lambda в другом аккаунте - PullRequest
1 голос
/ 29 февраля 2020

Я пытаюсь запросить Athena View из моего лямбда-кода. Создана таблица Athena для файлов S3, которые находятся в другой учетной записи. Редактор запросов Athena выдает сообщение об ошибке ниже:

Доступ запрещен (Сервис: Amazon S3; Код состояния: 403; Код ошибки: AccessDenied;

Я попытался получить доступ к Athena View из моего лямбда-кода. Создала Lambda Execution Role и разрешила эту роль в Bucket Policy другой корзины S3, а также как показано ниже:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::2222222222:role/BAccountRoleFullAccess"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::s3_bucket/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111111:role/A-Role",
                    "arn:aws:iam::111111111:role/B-Role"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3_bucket",
                "arn:aws:s3:::s3_bucket/*"
            ]
        }
    ]
}

Из Lambda, ошибка ниже:

    'Status': {'State': 'FAILED', 'StateChangeReason': 'com.amazonaws.services.s3.model.AmazonS3Exception: 
        Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 3A8953784EC73B17; 
    S3 Extended Request ID: LfQZdTCj7sSQWcBqVNhtHrDEnJuGxgJQxvillSHznkWIr8t5TVzSaUwNSdSNh+YzDUj+S6aOUyI=), 
    S3 Extended Request ID: LfQZdTCj7sSQWcBqVNhtHrDEnJuGxgJQxvillSHznkWIr8t5TVzSaUwNSdSNh+YzDUj+S6aOUyI=
 (Path: s3://s3_bucket/Input/myTestFile.csv)'

Эта лямбда-функция использует arn:aws:iam::111111111:role/B-Role Роль выполнения, которая имеет полный доступ к Афине и S3.

Кто-то, пожалуйста, направьте меня.

1 Ответ

2 голосов
/ 29 февраля 2020

Чтобы воспроизвести эту ситуацию, я сделал следующее:

  • В Account-A, создал Amazon S3 bucket (Bucket-A) и загрузил файл CSV
  • В Account-B создан Роль IAM (Role-B) с разрешениями S3 и Athena
  • Превратился ВЫКЛ Блок Publi c Доступ на Bucket-A
  • Добавлена ​​политика корзины к Bucket-A, которая ссылается на Role-B:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[ACCOUNT-B]:role/role-b"
            },
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-a",
                "arn:aws:s3:::bucket-a/*"
            ]
        }
    ]
}
  • В Account-B вручную определена таблица в консоли Amazon Athena
  • Выполнен запрос к таблице Athena. Как и ожидалось, получил Access Denied, потому что я использовал пользователя IAM для доступа к консоли, а не роль IAM, определенную в политике Bucket в Bucket-A
  • Создан AWS Лямбда-функция в Account-B, который использует Role-B:
import boto3
import time

def lambda_handler(event, context):

    athena_client = boto3.client('athena')
    query1 = athena_client.start_query_execution(
        QueryString='SELECT * FROM foo',
        ResultConfiguration={'OutputLocation': 's3://my-athena-out-bucket/'}
    )
    time.sleep(10)

    query2 = athena_client.get_query_results(QueryExecutionId=query1['QueryExecutionId'])
    print(query2)
  • Запустил функцию Lambda. Он успешно вернул данные из CSV-файла .

Пожалуйста, сравните ваши конфигурации с вышеуказанными шагами, которые я предпринял. Надеемся, что вы найдете разницу, которая позволит вам получить доступ к нескольким учетным записям Athena.

Ссылка: Доступ к нескольким учетным записям - Amazon Athena

...