

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 cómo usarlo como proveedor de identidades personalizado para subir archivos a 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 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[Configure 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 un AWS CloudFormation apilar a partir de la plantilla proporcionada**

1. Abra 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 la 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**, introduzca los detalles del almacenamiento (ya sea un bucket de Amazon S3 o un sistema de archivos Amazon EFS) que creó anteriormente.
   + Sustituya el rol ** UserRoleArn ** de usuario predeterminado por el rol de usuario que creó anteriormente. La función 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 su 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 de API Gateway cuando lo utilices como proveedor de identidad personalizado para Transfer Family. El almacenamiento en caché no es adecuado ni vá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 ninguna ventaja, ya que Transfer Family nunca envía solicitudes duplicadas o repetidas a la API Gateway
Si se habilita el almacenamiento en caché, la API Gateway responderá con datos no coincidentes, lo que generará respuestas no válidas a las solicitudes de autenticación

**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 de ** 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>

Cuando usas la plantilla para crear una CloudFormation pila, se crea automáticamente un servidor de 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.](https://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, seleccione 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 de 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. El siguiente ejemplo muestra la configuración que debe usar en su CloudFormation pila y en la política que seleccione para su 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 has generado como parte de un par de public/private claves.

`{{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, usa el ID Región de AWS donde se encuentra tu servidor de 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 agregar un perfil Posix a su 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}} 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 más, 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 '/'
       };
   ```