Permitir a la función de Lambda el acceso a los almacenes de metadatos externos de Hive - Amazon Athena

Permitir a la función de Lambda el acceso a los almacenes de metadatos externos de Hive

Para invocar una función de Lambda en su cuenta, debe crear un rol que tenga los siguientes permisos:

  • AWSLambdaVPCAccessExecutionRole: un permiso de rol de ejecución de AWS Lambda para administrar interfaces de red elásticas que conectan la función a una VPC. Asegúrese de disponer de un número suficiente de interfaces de red y direcciones IP disponibles.

  • AmazonAthenaFullAccess: la política administrada AmazonAthenaFullAccess concede acceso total a Athena.

  • Una política de Amazon S3 para permitir que la función Lambda escriba en S3 y para permitir que Athena lea desde S3.

Por ejemplo, la política siguiente define el permiso para la ubicación del desbordamiento s3:\\mybucket\spill.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::mybucket/spill" ] } ] }

Siempre que utilice políticas de IAM, asegúrese de seguir las prácticas recomendadas de IAM. Para obtener más información, consulte la sección Prácticas recomendadas de seguridad de IAM en la Guía del usuario de IAM.

Creación de funciones de Lambda

Para crear una función de Lambda en su cuenta, se requieren permisos de desarrollo de funciones o el rol AWSLambdaFullAccess. Para obtener más información, consulte Políticas de IAM basadas en identidades para AWS Lambda.

Dado que Athena utiliza el AWS Serverless Application Repository para crear funciones de Lambda, el superusuario o administrador que crea funciones de Lambda también debe tener políticas de IAM para permitir consultas federadas de Athena.

Operaciones de API de registro de catálogos y API de metadatos

Para acceder a las operaciones de API de registro de catálogos y API de metadatos, utilice la política administrada de AmazonAthenaFullAccess. Si no utiliza esta política, agregue las siguientes operaciones de API a sus políticas de Athena:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "athena:ListDataCatalogs", "athena:GetDataCatalog", "athena:CreateDataCatalog", "athena:UpdateDataCatalog", "athena:DeleteDataCatalog", "athena:GetDatabase", "athena:ListDatabases", "athena:GetTableMetadata", "athena:ListTableMetadata" ], "Resource": [ "*" ] } ] }

Invocación de Lambda entre regiones

Para invocar una función de Lambda en una región distinta de la región en la que está ejecutando consultas de Athena, utilice el ARN completo de la función de Lambda. De forma predeterminada, Athena invoca funciones de Lambda definidas en la misma región. Si necesita invocar una función de Lambda para acceder a un metaalmacén de Hive en una región distinta de la región en la que ejecuta consultas de Athena, debe proporcionar el ARN completo de la función de Lambda.

Por ejemplo, supongamos que define el catálogo ehms en la región Europa (Fráncfort) eu-central-1 para utilizar la siguiente función de Lambda en EE. UU. Este (Norte de Virginia).

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

Cuando se especifica el ARN completo de esta manera, Athena puede llamar a la función de Lambda external-hms-service-new en us-east-1 para obtener los datos de metaalmacén de Hive de eu-central-1.

nota

El catálogo ehms debe estar registrado en la misma región en la que se ejecutan las consultas de Athena.

Invocación de Lambda entre cuentas

A veces es posible que necesite acceso a una metaalmacén de Hive desde una cuenta diferente. Por ejemplo, para ejecutar un metaalmacén de Hive, podría lanzar un clúster de EMR desde una cuenta distinta de la que utiliza para las consultas de Athena. Diferentes grupos o equipos pueden ejecutar el metaalmacén de Hive con distintas cuentas dentro de su VPC. O es posible que desee acceder a metadatos de distintos metaalmacenes de Hive de distintos grupos o equipos.

Athena utiliza el soporte de AWS Lambda para el acceso entre cuentas para habilitar el acceso entre cuentas para metaalmacenes de Hive.

nota

Tenga en cuenta que el acceso entre cuentas para Athena normalmente implica el acceso entre cuentas tanto para metadatos como para datos en Amazon S3.

Imagine la siguiente situación:

  • La cuenta 111122223333 configura la función de Lambda external-hms-service-new en us-east-1 en Athena para acceder a un metaalmacén de Hive que se ejecuta en un clúster de EMR.

  • La cuenta 111122223333 quiere permitir que la cuenta 444455556666 acceda a los datos del metaalmacén de Hive.

Para conceder a la cuenta 444455556666 acceso a la función de Lambda external-hms-service-new, la cuenta 111122223333 utiliza el siguiente comando AWS CLI de add-permission. El comando se ha formateado para fines de legibilidad.

$ aws --profile perf-test lambda add-permission --function-name external-hms-service-new --region us-east-1 --statement-id Id-ehms-invocation2 --action "lambda:InvokeFunction" --principal arn:aws:iam::444455556666:user/perf1-test { "Statement": "{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}" }

Para verificar el permiso de Lambda, utilice el comando get-policy, como en el ejemplo siguiente. El comando se ha formateado para fines de legibilidad.

$ aws --profile perf-test lambda get-policy --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new --region us-east-1 { "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f", "Policy": "{\"Version\":\"2012-10-17\", \"Id\":\"default\", \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}" }

Después de agregar el permiso, puede usar un ARN completo de la función Lambda de us-east-1 como el siguiente al definir el catálogo ehms:

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

Para obtener información acerca de la invocación entre regiones, consulte Invocación de Lambda entre regiones anteriormente en este tema.

Concesión de acceso a datos entre cuentas

Antes de poder ejecutar consultas de Athena, debe conceder acceso entre cuentas a los datos de Amazon S3. Puede hacerlo de una de las siguientes formas:

  • Actualice la política de lista de control de acceso del bucket de Amazon S3 con un ID de usuario canónico.

  • Agregue acceso entre cuentas a la política de bucket de Amazon S3.

Por ejemplo, agregue la política siguiente a la política de bucket de Amazon S3 en la cuenta 111122223333 para permitir que la cuenta 444455556666 lea datos de la ubicación de Amazon S3 especificada.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:user/perf1-test" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ] }
nota

Es posible que tenga que conceder acceso entre cuentas a Amazon S3 no solo a sus datos, sino también a su ubicación de desbordamiento de Amazon S3. Su función de Lambda desborda datos adicionales a la ubicación de desbordamiento cuando el tamaño del objeto de respuesta supera un umbral determinado. Consulte al principio de este tema para obtener una política de ejemplo.

En el ejemplo actual, después de conceder acceso entre cuentas a 444455556666, 444455556666 puede utilizar el catálogo ehms en su propia account para consultar tablas definidas en la cuenta 111122223333.

En el ejemplo siguiente, el perfil de SQL Workbench perf-test-1 es para la cuenta 444455556666. La consulta utiliza el catálogo ehms para acceder al metaalmacén de Hive y a los datos de Amazon S3 en la cuenta 111122223333.


                    Acceso al metaalmacén de Hive y a datos de Amazon S3 a través de cuentas en SQL Workbench.