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 de Lambda escriba en S3 y para permitir que Athena lea desde S3.

Por ejemplo, la siguiente política 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:::amzn-s3-demo-bucket/spill" ] } ] }

Siempre que utilice políticas de IAM, asegúrese de seguir las prácticas recomendadas de IAM. Para más información, consulte Prácticas recomendadas de seguridad en 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.

Configuración de permisos para el registro del catálogo y las operaciones de la API de metadatos

Para el acceso a la API para el registro del catálogo y las operaciones de metadatos, puede usar la política administrada AmazonAthenaFullAccess. Si no utiliza la política AmazonAthenaFullAccess, agregue las siguientes operaciones de la 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": [ "*" ] } ] }

Llamada a una función de Lambda en todas las regiones

De forma predeterminada, Athena invoca funciones de Lambda definidas en la misma región. Para invocar una función de Lambda en una Región de AWS diferente a la región en la que está ejecutando las consultas de Athena, utilice el ARN completo de la función de Lambda.

En el siguiente ejemplo, se muestra cómo un catálogo en la región de Europa (Fráncfort) puede especificar una función de Lambda en la región Este de EE. UU. (Norte de Virginia) para obtener datos del metastore de Hive en la región de Europa (Fráncfort).

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 debe estar registrado en la misma Región de AWS que utiliza para ejecutar las consultas de Athena.

Llamada a una funció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 metastore de Hive, podría usar una cuenta diferente 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 siguiente ejemplo. 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 de 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 Llamada a una función de Lambda en todas las regiones anteriormente en este tema.

Concesión de acceso entre cuentas a los datos

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 siguiente política 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 siguiente ejemplo, 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.