

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Configuración de un método de Amazon API Gateway como proveedor de identidad personalizado
<a name="gateway-api-tutorial"></a>

En este tutorial se muestra cómo configurar un método de Amazon API Gateway y utilizarlo como proveedor de identidad personalizado para cargar archivos en un AWS Transfer Family servidor. En este tutorial solo se utiliza la [plantilla de pila básica](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml) y otras funciones básicas como ejemplo. 

**Topics**
+ [Requisitos previos](#prereq-api-gateway-tutorial)
+ [Paso 1: Crear una CloudFormation pila](#create-cf-stack)
+ [Paso 2: verificación de la configuración del método API Gateway para su servidor](#deploy-api-gateway)
+ [Paso 3: visualización de los detalles del servidor de Transfer Family](#create-transfer-server)
+ [Paso 4: comprobación de que el usuario puede conectarse al servidor](#test-user-server-connect)
+ [Paso 5: prueba de la conexión SFTP y la transferencia de archivos](#test-sftp-connection)
+ [Paso 6: limitación del acceso al bucket](#example-bucket)
+ [Actualice Lambda si utiliza Amazon EFS](#lambda-posix)

## Requisitos previos
<a name="prereq-api-gateway-tutorial"></a>

Antes de crear los recursos de Transfer Family en CloudFormation, cree su almacenamiento y su rol de usuario.

**Cómo especificar el almacenamiento y crear un rol de usuario**

1. Según el almacenamiento que utilice, consulte la siguiente documentación:
   + Para crear un bucket de Amazon S3, consulte [¿Cómo se crea un bucket de S3?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket-overview.html) en la *Guía del usuario de la consola de Amazon Simple Storage Service*.
   + Para crear un sistema de archivos Amazon EFS, consulte[Configuración de un sistema de archivos Amazon EFS](configure-storage.md#requirements-efs).

1. Para crear un rol de usuario, consulte [Creación de una política y un rol de IAM](requirements-roles.md)

Introduzca los detalles de su almacenamiento y su rol de usuario al crear su pila CloudFormation en la siguiente sección.

## Paso 1: Crear una CloudFormation pila
<a name="create-cf-stack"></a>

**Para crear una AWS CloudFormation pila a partir de la plantilla proporcionada**

1. Abre la CloudFormation consola en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Seleccione **Crear pila** y seleccione **Con recursos nuevos (estándar)**. 

1. En el panel **Requisitos previos: preparar plantilla**, **elija Elegir una plantilla existente**. 

1. Copie este enlace, [plantilla de pila básica](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-apig.template.yml), y péguelo en el campo **URL de Amazon S3**. 

1. Haga clic en **Next (Siguiente)**. 

1. Especifique los parámetros, incluido un nombre para la pila. Asegúrese de hacer lo siguiente: 
   + Sustituya los valores predeterminados por **UserName**y **UserPassword**.
   + Para **UserHomeDirectory**ello, introduzca los detalles del almacenamiento (ya sea un bucket de Amazon S3 o un sistema de archivos Amazon EFS) que creó anteriormente.
   + Sustituya la función **UserRoleArn**de usuario predeterminada por la que creó anteriormente. El rol AWS Identity and Access Management (IAM) debe tener los permisos adecuados. Para ver una política de bucket y de rol de IAM de ejemplo, consulte [Paso 6: limitación del acceso al bucket](#example-bucket). 
   + Si desea autenticarse con una clave pública en lugar de una contraseña, introduzca la clave pública en el **UserPublicKey1**campo. La primera vez que se conecta al servidor mediante SFTP, proporciona la clave privada en lugar de una contraseña. 

1. Seleccione **Siguiente** y, a continuación, vuelva a seleccionar **Siguiente** en la página **Configurar opciones de pila**. 

1. Revise los detalles de la pila que esté creando y, a continuación, seleccione **Crear pila**. 
**nota**  
En la parte inferior de la página, en **Capacidades**, debe reconocer que CloudFormation podría crear recursos de IAM. 

## Paso 2: verificación de la configuración del método API Gateway para su servidor
<a name="deploy-api-gateway"></a>

**nota**  
Para mejorar la seguridad, puede configurar un firewall de aplicaciones web. AWS WAF es un firewall de aplicaciones web que permite monitorizar las solicitudes HTTP y HTTPS que se reenvían a una Amazon API Gateway. Para obtener más información, consulte [Agregue un cortafuegos de aplicaciones web](web-application-firewall.md).

**No habilite el almacenamiento en caché de API Gateway**  
No habilites el almacenamiento en caché para tu método API Gateway cuando lo utilices como proveedor de identidad personalizado para Transfer Family. El almacenamiento en caché es inapropiado e inválido para las solicitudes de autenticación porque:  
Cada solicitud de autenticación es única y requiere una respuesta en tiempo real, no una respuesta en caché
El almacenamiento en caché no ofrece ningún beneficio, ya que Transfer Family nunca envía solicitudes duplicadas o repetidas a la API Gateway.
Al habilitar el almacenamiento en caché, la API Gateway responderá con datos no coincidentes, lo que provocará que las respuestas a las solicitudes de autenticación no sean válidas

**Comprobación de la configuración del método API Gateway para su servidor e implementación**

1. <a name="step_invoke_url"></a>

   Abra la consola de API Gateway en [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/). 

1. Elija la **API de plantilla básica Transfer Custom Identity Provider** que generó la CloudFormation plantilla.

1. En el panel **Recursos**, seleccione **GET** y, a continuación, **Solicitud de método**.

1. Para **Acciones**, elija **Implementar API**. Para la **Etapa de implementación**, elija **prod** y, a continuación, elija **Implementar**.

   Una vez que el método API Gateway se haya implementado correctamente, consulte su rendimiento en la sección **Stage Editor**.
**nota**  
Copie la dirección **URL de invocación** que aparece en la parte superior de la página. Lo necesitará para el siguiente paso.

## Paso 3: visualización de los detalles del servidor de Transfer Family
<a name="create-transfer-server"></a>

Al utilizar la plantilla para crear una CloudFormation pila, se crea automáticamente un servidor Transfer Family.

**Visualización de los detalles del servidor de Transfer Family**

1. Abra la CloudFormation consola en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Elija la pila que ha creado.

1. Elija la pestaña **Recursos**.  
![Pantalla que muestra la lista de recursos creados durante la creación de la CloudFormation pila, con los detalles del servidor Transfer Family resaltados.](http://docs.aws.amazon.com/es_es/transfer/latest/userguide/images/apig-find-server-id.png)

   El ARN del servidor se muestra en la columna **ID física** de la **TransferServer**fila. El ID del servidor está contenido en el ARN, por ejemplo, **s-11112222333344445.**

1. Abra la AWS Transfer Family consola en y [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/), en la página **Servidores**, elija el nuevo servidor.

   El ID del servidor coincide con el ID que se muestra para el **TransferServer**recurso en CloudFormation.

## Paso 4: comprobación de que el usuario puede conectarse al servidor
<a name="test-user-server-connect"></a>

**Comprobación de que el usuario puede conectarse al servidor, mediante la consola Transfer Family**

1. Abra la AWS Transfer Family consola en [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/).

1. En la página **Servidores**, elija su nuevo servidor, elija **Acciones** y, a continuación, elija **Probar**.

1. Introduzca el texto de sus credenciales de inicio de sesión en el campo **Nombre de usuario** y en el campo **Contraseña**. Estos son los valores que estableció al implementar la CloudFormation pila.

1. Para **Protocolo de servidor**, seleccione **SFTP** y, para **IP de origen**, introduzca**127.0.0.1**. 

1. Seleccione **Probar**

   Si la autenticación del usuario se realiza correctamente, la prueba devuelve una respuesta `StatusCode: 200` HTML y un objeto JSON que contiene los detalles de los roles y los permisos del usuario. Por ejemplo:

   ```
   {
       "Response": "{\"Role\": \"arn:aws:iam::{{123456789012}}:role/{{my-user-role}}\",\"HomeDirectory\": \"/${transfer:HomeBucket}/\"}",
       "StatusCode": 200,
       "Message": "",
       "Url": "https://{{1a2b3c4d5e}}.execute-api.{{us-east-2}}.amazonaws.com/prod/servers/s-{{1234abcd5678efgh0}}/users/{{myuser}}/config"
   }
   ```

   Si la prueba falla, agrega una de las políticas AWS administradas por API Gateway al rol que estás usando para tu API. 

## Paso 5: prueba de la conexión SFTP y la transferencia de archivos
<a name="test-sftp-connection"></a>

**Prueba de la conexión SFTP**

1. En Linux o macOS, abra un terminal de comandos. 

1. Ingrese uno de los siguientes comandos en función de si utiliza una contraseña o un par de claves para la autenticación. 
   + Si utiliza una contraseña, introduzca este comando:

      ` sftp -o PubkeyAuthentication=no {{myuser}}@{{server-ID}}.server.transfer.{{region-code}}.amazonaws.com ` 

     Escriba la contraseña cuando se le solicite.
   +  Si utiliza un par de claves, introduzca este comando: 

     ` sftp -i {{private-key-file}} {{myuser}}@{{server-ID}}.server.transfer.{{region-code}}.amazonaws.com `
**nota**  
Para estos comandos `sftp`, inserte el código de la Región de AWS donde está ubicado su servidor de Transfer Family. Por ejemplo, si su servidor está en el este de EE. UU. (Ohio), introduzca**us-east-2**.

1.  Cuando aparezca `sftp>`, asegúrese de que puede cargar (`put`), descargar (`get`) y ver directorios y archivos (`pwd` y `ls`). 

## Paso 6: limitación del acceso al bucket
<a name="example-bucket"></a>

Puede limitar quién accede a un bucket específico de Amazon S3. En el siguiente ejemplo, se muestran los ajustes que se deben utilizar en la CloudFormation pila y en la política que se seleccione para el usuario. 

En este ejemplo, configuramos los siguientes parámetros para la CloudFormation pila: 
+ **CreateServer**: `true`
+ **UserHomeDirectory**: `/amzn-s3-demo-bucket1`
+ **UserName**: `myuser`
+ **UserPassword**: `MySuperSecretPassword`
**importante**  
Este es un ejemplo de contraseña. Al configurar el método API Gateway, asegúrese de introducir una contraseña segura.
+ **UserPublicKey1**: `{{your-public-key}}`
+ **UserRoleArn**: `arn:aws:iam::{{role-id}}:role/myuser-api-gateway-role`

``**UserPublicKey1**Es una clave pública que ha generado como parte de un public/private key pair.

`{{role-id}}` es exclusivo del rol de usuario que cree. La política asociada a `myuser-api-gateway-role` es la siguiente: 

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:PutObjectAcl",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

 Para conectarse al servidor mediante SFTP, ingrese uno de los comandos siguientes en la ventana. 
+ Si utiliza una contraseña para autenticarse, ejecute el siguiente comando:

   ` sftp -o PubkeyAuthentication=no {{myuser}}@{{transfer-server-ID}}.server.transfer.{{region-id}}.amazonaws.com` 

  Escriba la contraseña cuando se le solicite.
+  Si utiliza un par de claves para autenticarse, ejecute el siguiente comando: 

  ` sftp -i {{private-key-file}} myuser@{{transfer-server-ID}}.server.transfer.{{region-id}}.amazonaws.com `

**nota**  
Para estos `sftp` comandos, utilice el ID de Región de AWS la ubicación del servidor Transfer Family. Por ejemplo, si su servidor está en el este de EE. UU. (Ohio), utilice `us-east-2`. 

 Cuando `sftp` aparezca la línea de comandos, accederá a su directorio de inicio, que podrá ver ejecutando el comando `pwd`. Por ejemplo: 

```
sftp> pwd
Remote working directory: /amzn-s3-demo-bucket1
```

El usuario no puede ver ningún directorio situado por encima del directorio de inicio. Por ejemplo: 

```
sftp> pwd
Remote working directory: /amzn-s3-demo-bucket1
sftp> cd ..
sftp> ls
Couldn't read directory: Permission denied
```

## Actualice Lambda si utiliza Amazon EFS
<a name="lambda-posix"></a>

 Si seleccionó Amazon EFS como la opción de almacenamiento para su servidor de Transfer Family, tendrá que editar la función de lambda de su pila. 

**Para añadir un perfil Posix a la función Lambda**

1. Abra la consola Lambda en. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1.  Elija la función de Lambda que ha creado. La función Lambda tiene el formato **{{stack-name}}- GetUserConfigLambda - {{lambda-identifier}}**, donde {{stack-name}} es el nombre de la CloudFormation pila y {{lambda-identifier}} es el identificador de la función. 

1.  En la pestaña **Código**, seleccione **index.js** para ver el código de la función. 

1.  En `response`, añada la siguiente línea entre `Policy` y `HomeDirectory`: 

    ` PosixProfile: {"Uid": {{uid-value}}, "Gid": {{gid-value}}}, ` 

    Donde {{uid-value}} y {{gid-value}} son números enteros, 0 o mayores, que representan el ID de usuario y el ID de grupo, respectivamente. 

   Por ejemplo, después de agregar el perfil Posix, el campo de respuesta podría tener el siguiente aspecto:

   ```
    response = {
         Role: 'arn:aws:iam::123456789012:role/api-gateway-transfer-efs-role', // The user will be authenticated if and only if the Role field is not blank
         Policy: '', // Optional JSON blob to further restrict this user's permissions
         PosixProfile: {"Gid": 65534, "Uid": 65534},
         HomeDirectory: '/fs-fab2c234' // Not required, defaults to '/'
       };
   ```