Доступ AWS Афина из Python Лямбда в другой аккаунт - PullRequest
0 голосов
/ 03 марта 2020

У меня есть две учетные записи A и B. S3 Buckets и Athena View находятся в учетной записи A, а Lambda - в учетной записи B. Я хочу позвонить в Athena из моей Lambda. Я также разрешил роль лямбда-исполнения в S3 Bucket Policy. Когда я пытаюсь вызвать базу данных из Lambda, она выдает ошибку: 'Status': {'State': 'FAILED', 'StateChangeReason': 'SYNTAX_ERROR: line 1:15: Schema db_name does not exist'

Ниже приведен мой лямбда-код:

import boto3
import time

def lambda_handler(event, context):

    athena_client = boto3.client('athena')
    client_exc = athena_client.start_query_execution(
        QueryString='SELECT * FROM db_name.athena_view',
        ResultConfiguration={'OutputLocation': 's3://my-athena-out-bucket/'}
    )

    resp= athena_client.get_query_results(QueryExecutionId=client_exc['QueryExecutionId'])

Пожалуйста, руководство.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

У вас есть:

  • Корзина Amazon S3 в Account-A
  • Amazon Athena в Account-A
  • AWS Функция лямбда в Account-B

(Это отличается от вашего предыдущего вопроса , где у вас была Афина в Account-B, доступ к S3 в Account-A. В этом сценарии политики Bucket в Account-A было достаточно предоставить доступ к S3 для Athena, работающей в Account-B.)

Amazon Athena работает с разрешениями пользователя IAM или роли IAM, которая его вызывает. Поэтому пользователю или роли, которые используют Athena, требуется разрешение для доступа к данным в Amazon S3. В вашем предыдущем вопросе это было выполнено с помощью политики Bucket, которая предоставляла Lambda разрешение на доступ к корзине в другой учетной записи.

Однако в этом вопросе у вас есть Lambda в одной учетной записи, желающей использовать Amazon Athena, в другой учетной записи . Нет возможности предоставить Athena доступ пользователям в другой учетной записи. Следовательно, вашей лямбда-функции потребуется роль в учетной записи Athena .

Следовательно:

  • Создание роли IAM в Account-A (с Athena ) который предоставляет доступ к использованию Athena и соответствующих корзин Amazon S3
  • Функция Lambda в Account-B:
    • должна вызвать AssumeRole(), чтобы «стать» вышеупомянутым роль
    • Следует использовать предоставленные учетные данные для создания нового Session, который используется для создания клиента boto3 для Athena

Это приведет к Лямбда, имеющая доступ к Athena в Account-A, включая любые уже созданные таблицы и представления.

Если вам не требуются существующие таблицы и представления, определенные в Athena, то вы можете использовать Athena в том же 1056 * учетная запись как Lambda, но исходная корзина S3 должна была бы предоставить доступ к роли IAM Lambda в соответствии с вашим предыдущим вопросом .

0 голосов
/ 03 марта 2020

Выполните следующие действия -

Учетная запись (A) Создайте IAM-роль, у которой есть доступ к Athena и S3 bucket, а также добавьте разрешения для роли в учетной записи B для вызова Assume Role для этой роли.

Учетная запись (B) Создайте роль IAM и назначьте ее для Lambda, которая будет выполнять роль учетной записи A, которая имеет временный доступ к Афине и S3.

См. Следующую ссылку - https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html

...