

# Permitir a la función de Lambda el acceso a los almacenes de metadatos externos de Hive
<a name="hive-metastore-iam-access-lambda"></a>

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](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) 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](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 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`.

------
#### [ JSON ]

****  

```
{ "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](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) en la *Guía del usuario de IAM*.

## Creación de funciones de Lambda
<a name="hive-metastore-iam-access-lambda-creating-lambda-functions"></a>

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](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html).

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](federated-query-iam-access.md).

## Configuración de permisos para el registro del catálogo y las operaciones de la API de metadatos
<a name="hive-metastore-iam-access-lambda-catalog-registration-and-metadata-api-operations"></a>

Para el acceso a la API para el registro del catálogo y las operaciones de metadatos, puede usar la [política administrada AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy). Si no utiliza la política `AmazonAthenaFullAccess`, agregue las siguientes operaciones de la API a sus políticas de Athena:

------
#### [ JSON ]

****  

```
{
    "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
<a name="hive-metastore-iam-access-lambda-cross-region-invocation"></a>

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 name="hive-metastore-iam-access-lambda-cross-account-invocation"></a>

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](https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/) 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](#hive-metastore-iam-access-lambda-cross-region-invocation) anteriormente en este tema.

### Concesión de acceso entre cuentas a los datos
<a name="hive-metastore-iam-access-lambda-granting-cross-account-access-to-data"></a>

Antes de poder ejecutar consultas de Athena, debe conceder acceso entre cuentas a los datos de Amazon S3. Puedes 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](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html).
+ 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.

------
#### [ JSON ]

****  

```
{ "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.\]](http://docs.aws.amazon.com/es_es/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)
