

# Creación de una API privada
<a name="apigateway-private-api-create"></a>

Antes de crear una API privada, debe crear un punto de conexión de VPC para API Gateway. A continuación, debe crear la API privada y adjuntarle una política de recursos. Si lo desea, puede asociar el punto de conexión de VPC a la API privada para simplificar la forma de invocar la API. Por último, debe implementar la API.

En los procedimientos siguientes se describe cómo realizar esto. Puede crear una API de REST privada mediante la Consola de administración de AWS, la AWS CLI o un AWS SDK. 

## Requisitos previos
<a name="apigateway-private-api-create-interface-vpc-prerequisites"></a>

Para seguir estos pasos, debe tener una VPC completamente configurada. Para obtener información sobre cómo crear una VPC, consulte [Crear solo una VPC](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html#create-vpc-only) en la *Guía del usuario de Amazon VPC*. Para seguir todos los pasos recomendados al crear la VPC, habilite el DNS privado. De esta forma, puede invocar la API dentro de una VPC sin tener que pasar el host o el encabezado `x-apigw-api-id`.

Para habilitar el DNS privado, los atributos `enableDnsSupport` y `enableDnsHostnames` de la VPC deben estar establecidos en `true`. Para obtener más información, consulte [Compatibilidad de DNS en la VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support) y [Actualización de la compatibilidad de DNS para la VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating).

## Paso 1: Creación de un punto de conexión de VPC para API Gateway en la VPC
<a name="apigateway-private-api-create-interface-vpc-endpoint"></a>

En el siguiente procedimiento, se muestra cómo crear un punto de conexión de VPC para API Gateway. Para crear un punto de conexión de VPC para API Gateway, debe especificar el dominio `execute-api` para la Región de AWS donde crea la API privada. El dominio `execute-api` es el componente de servicio de API Gateway para la ejecución de la API.

Cuando crea el punto de conexión de VPC para API Gateway, debe especificar la configuración de DNS. Si desactiva el DNS privado, solo podrá acceder a la API mediante un DNS público. Para obtener más información, consulte [Problema: No puedo conectarme a mi API pública desde un punto de conexión de VPC de API Gateway](#apigateway-private-api-troubleshooting-public-access).

------
#### [ Consola de administración de AWS ]

**Creación de un punto de conexión de VPC de la interfaz para API Gateway**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon VPC en [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/).

1. En el panel de navegación, en **Nube virtual privada**, seleccione **Puntos de conexión**.

1. Seleccione **Crear punto de conexión**.

1. (Opcional) Para **Etiqueta de nombre**, ingrese un nombre que ayude a identificar el punto de conexión de VPC.

1. En **Service category** (Categoría de servicios), elija ** AWSServices** (Servicios de AWC).

1. En **Servicios**, en la barra de búsqueda, ingrese **execute-api**. A continuación, elija el punto de conexión del servicio de API Gateway en la Región de AWS en la que creará la API. El nombre del servicio debe tener el mismo aspecto que `com.amazonaws.us-east-1.execute-api` y el **Tipo** debe ser **Interfaz**.

1. Para **VPC**, elija la VPC en la que desea crear el punto de conexión.

1. (Opcional) Para desactivar la opción **Habilitar el nombre de DNS privado**, elija **Configuración adicional** y, a continuación, desactive **Habilitar el nombre de DNS privado**.

1. En **Subredes**, elija las zonas de disponibilidad en las que creó las interfaces de red de punto de conexión. Para mejorar la disponibilidad de la API, elija varias subredes.

1. En **Security group (Grupo de seguridad)**, seleccione el grupo de seguridad que se va a asociar con las interfaces de red de punto de conexión de VPC.

   El grupo de seguridad que elija debe configurarse de modo que permita el tráfico HTTPS de entrada en el puerto 443 TCP desde un intervalo de direcciones IP de la VPC o desde otro grupo de seguridad de la VPC.

1. Para **Política**, realice una de las siguientes operaciones:
   + Si no ha creado la API privada o no quiere configurar una política de punto de conexión de VPC personalizada, elija **Acceso total**.
   + Si ya ha creado una API privada y desea configurar una política de punto de conexión de VPC personalizada, puede ingresar una política de punto de conexión de VPC personalizada. Para obtener más información, consulte [Uso de políticas de punto de conexión de VPC para API privadas en API Gateway](apigateway-vpc-endpoint-policies.md).

   Puede actualizar la política de punto de conexión de VPC después de crear el punto de conexión de VPC. Para obtener más información, consulte [Actualizar una política de punto de conexión de VPC](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#update-vpc-endpoint-policy).

1. Seleccione **Crear punto de conexión**.

1. Copie el ID de punto de conexión de VPC resultante, ya que es posible que lo use en futuros pasos.

------
#### [ AWS CLI ]

El siguiente comando [create-vpc-endpoint](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-vpc-endpoint.html) permite crear un punto de conexión de VPC:

```
aws ec2 create-vpc-endpoint \
    --vpc-id vpc-1a2b3c4d \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.us-east-1.execute-api \
    --subnet-ids subnet-7b16de0c \
    --security-group-id sg-1a2b3c4d
```

Copie el ID de punto de conexión de VPC resultante, ya que es posible que lo use en futuros pasos.

------

## Paso 2: crear una API privada
<a name="apigateway-private-api-create-using-console"></a>

Después de crear el punto de conexión de VPC, se crea una API de REST privada. El siguiente procedimiento muestra cómo crear una API privada. 

------
#### [ Consola de administración de AWS ]

**Creación de una API privada**

1. Inicie sesión en la consola de API Gateway en [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Seleccione **Create API (Crear API)**.

1. En **REST API**, elija **Build (Compilación)**.

1. En **Nombre**, ingrese un nombre.

1.  (Opcional) En **Description (Descripción)**, introduzca una descripción. 

1. En **Tipo de punto de conexión de la API**, seleccione **Privado**.

1. (Opcional) Para los **ID de punto de conexión de VPC**, ingrese un ID de punto de conexión de VPC.

   Si asocia un ID de punto de conexión de VPC a la API privada, puede invocar la API desde dentro de la VPC sin anular un encabezado `Host` ni pasar un `x-apigw-api-id header`. Para obtener más información, consulte [(Opcional) Asociación o desasociación de un punto de conexión de VPC con una API privada](#associate-private-api-with-vpc-endpoint).

1. Para **Tipo de dirección IP**, elija **Dualstack**.

1. Seleccione **Crear API**.

 Una vez realizados los pasos anteriores, puede seguir las instrucciones en [Introducción a la consola de la API de REST](getting-started-rest-new-console.md) para configurar métodos e integraciones para esta API, pero no puede implementar la API. Para implementar la API, siga el paso 3 y adjunte una política de recursos a la API. 

------
#### [ AWS CLI ]

El siguiente comando [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) permite crear una API privada:

```
aws apigateway create-rest-api \
        --name 'Simple PetStore (AWS CLI, Private)' \
        --description 'Simple private PetStore API' \
        --region us-west-2 \
        --endpoint-configuration '{ "types": ["PRIVATE"], "ipAddressType": "dualstack" }'
```

Una llamada correcta devuelve un resultado similar al siguiente:

```
{
    "createdDate": "2017-10-13T18:41:39Z",
    "description": "Simple private PetStore API",
    "endpointConfiguration": {
        "types": [
            "PRIVATE"
        ],
        "ipAddressType": "dualstack"
    },
    "id": "0qzs2sy7bh",
    "name": "Simple PetStore (AWS CLI, Private)"
}
```

 Una vez realizados los pasos anteriores, puede seguir las instrucciones en [Tutorial: Creación de una API de REST mediante SDK de AWS o la AWS CLI](api-gateway-create-api-cli-sdk.md) para configurar métodos e integraciones para esta API, pero no puede implementar la API. Para implementar la API, siga el paso 3 y adjunte una política de recursos a la API. 

------
#### [ SDK JavaScript v3 ]

El siguiente ejemplo muestra cómo crear una API privada mediante AWS SDK para JavaScript v3:

```
import {APIGatewayClient, CreateRestApiCommand} from "@aws-sdk/client-api-gateway";
const apig = new APIGatewayClient({region:"us-east-1"});

const input = { // CreateRestApiRequest
  name: "Simple PetStore (JavaScript v3 SDK, private)", // required
  description: "Demo private API created using the AWS SDK for JavaScript v3",
  version: "0.00.001",
  endpointConfiguration: { // EndpointConfiguration
    types: [ "PRIVATE"],
  },  
};

export const handler = async (event) => {
const command = new CreateRestApiCommand(input);
try {
  const result = await apig.send(command);
  console.log(result);
} catch (err){
  console.error(err)
 }
};
```

Una llamada correcta devuelve un resultado similar al siguiente:

```
{
  apiKeySource: 'HEADER',
  createdDate: 2024-04-03T17:56:36.000Z,
  description: 'Demo private API created using the AWS SDK for JavaScript v3',
  disableExecuteApiEndpoint: false,
  endpointConfiguration: { types: [ 'PRIVATE' ] },
  id: 'abcd1234',
  name: 'Simple PetStore (JavaScript v3 SDK, private)',
  rootResourceId: 'efg567',
  version: '0.00.001'
}
```

 Una vez realizados los pasos anteriores, puede seguir las instrucciones en [Tutorial: Creación de una API de REST mediante SDK de AWS o la AWS CLI](api-gateway-create-api-cli-sdk.md) para configurar métodos e integraciones para esta API, pero no puede implementar la API. Para implementar la API, siga el paso 3 y adjunte una política de recursos a la API. 

------
#### [ Python SDK ]

El siguiente ejemplo muestra cómo crear una API privada mediante AWS SDK para Python:

```
import json
import boto3
import logging

logger = logging.getLogger()
apig = boto3.client('apigateway')

def lambda_handler(event, context):
    try:
      result = apig.create_rest_api(
      name='Simple PetStore (Python SDK, private)',
      description='Demo private API created using the AWS SDK for Python',
      version='0.00.001',
      endpointConfiguration={
          'types': [
             'PRIVATE',
          ],
      },
      )
    except botocore.exceptions.ClientError as error:
            logger.exception("Couldn't create private API %s.", error)
            raise
    attribute=["id", "name", "description", "createdDate", "version", "apiKeySource", "endpointConfiguration"]
    filtered_data ={key:result[key] for key in attribute}
    result = json.dumps(filtered_data, default=str, sort_keys='true')
    return result
```

Una llamada correcta devuelve un resultado similar al siguiente:

```
"{\"apiKeySource\": \"HEADER\", \"createdDate\": \"2024-04-03 17:27:05+00:00\", \"description\": \"Demo private API created using the AWS SDK for \", \"endpointConfiguration\": {\"types\": [\"PRIVATE\"]}, \"id\": \"abcd1234\", \"name\": \"Simple PetStore (Python SDK, private)\", \"version\": \"0.00.001\"}"
```

 Una vez realizados los pasos anteriores, puede seguir las instrucciones en [Tutorial: Creación de una API de REST mediante SDK de AWS o la AWS CLI](api-gateway-create-api-cli-sdk.md) para configurar métodos e integraciones para esta API, pero no puede implementar la API. Para implementar la API, siga el paso 3 y adjunte una política de recursos a la API. 

------

## Paso 3: Configuración de una política de recursos para una API privada
<a name="apigateway-private-api-set-up-resource-policy"></a>

La API privada actual es inaccesible para todas las VPC. Utilice una política de recursos para conceder a las VPC y puntos de conexión de VPC acceso a las API privadas. Puede conceder acceso a un punto de conexión de VPC en cualquier cuenta de AWS.

La política de recursos debe contener condiciones `aws:SourceVpc` o `aws:SourceVpce` para restringir el acceso. Le recomendamos que identifique VPC y puntos de conexión de VPC específicos y no cree una política de recursos que permita el acceso a todas las VPC y puntos de conexión de VPC.

El siguiente procedimiento muestra cómo asociar una política de recursos a la API.

------
#### [ Consola de administración de AWS ]

1. Inicie sesión en la consola de API Gateway en [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Elija una API de REST.

1. En el panel de navegación principal, elija **Política de recursos**.

1. Seleccione **Crear política**.

1. Elija **Seleccionar una plantilla** y, a continuación, elija **VPC de origen**.

1. Sustituya `{{vpcID}}` (incluidas las llaves) por el ID de la VPC.

1. Seleccione **Save changes (Guardar cambios)**.

------
#### [ AWS CLI ]

El siguiente comando [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) permite asociar una política de recursos a una API existente:

```
aws apigateway update-rest-api \
    --rest-api-id a1b2c3 \
    --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'
```

------

Es posible que también desee controlar qué recursos tienen acceso al punto de conexión de VPC. Para controlar qué recursos tienen acceso al punto de conexión de VPC, adjunte una política de punto de conexión al punto de conexión de VPC. Para obtener más información, consulte [Uso de políticas de punto de conexión de VPC para API privadas en API Gateway](apigateway-vpc-endpoint-policies.md).

## (Opcional) Asociación o desasociación de un punto de conexión de VPC con una API privada
<a name="associate-private-api-with-vpc-endpoint"></a>

Cuando asocia un punto de conexión de VPC con la API privada, API Gateway genera un nuevo registro de DNS de alias de Route 53. Puede usar este registro para invocar las API privadas del mismo modo que las API públicas sin anular un encabezado `Host` o pasar un encabezado `x-apigw-api-id`.

La URL base generada tiene el siguiente formato:

```
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
```

------
#### [ Associate a VPC endpoint (Consola de administración de AWS) ]

Puede asociar un punto de conexión de VPC con la API privada cuando la cree o después de crearla. En el siguiente procedimiento, se muestra cómo asociar un punto de conexión de VPC con una API creada anteriormente. 

**Asociación de un punto de conexión de VPC con una API privada**

1. Inicie sesión en la consola de API Gateway, en [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Elija la API privada.

1. En el panel de navegación principal, elija **Política de recursos**.

1. Edite su política de recursos para permitir las llamadas desde su punto de conexión de VPC adicional.

1. En el panel de navegación principal, elija **Configuración de la API**.

1. En la sección **Detalles de la API**, elija **Editar**.

1. En **ID de punto de conexión de VPC**, seleccione ID de punto de conexión de VPC adicionales.

1. Seleccione **Save**.

1. Vuelva a implementar la API para que los cambios se apliquen.

------
#### [ Dissociate a VPC endpoint (Consola de administración de AWS) ]

**Para desasociar un punto de conexión de VPC de una API de REST privada**

1. Inicie sesión en la consola de API Gateway, en [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Elija la API privada.

1. En el panel de navegación principal, elija **Política de recursos**.

1. Edite su política de recursos para eliminar las menciones del punto de conexión de VPC que quiere desasociar de su API privada.

1. En el panel de navegación principal, elija **Configuración de la API**.

1. En la sección **Detalles de la API**, elija **Editar**.

1. Para los **ID de punto de conexión de VPC**, elija la **X** para desasociar el punto de conexión de VPC.

1. Seleccione **Save**.

1. Vuelva a implementar la API para que los cambios se apliquen.

------
#### [ Associate a VPC endpoint (AWS CLI) ]

El siguiente comando [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) permite asociar puntos de conexión de VPC en el momento de creación de la API:

```
aws apigateway create-rest-api \
    --name Petstore \
    --endpoint-configuration '{ "types": ["PRIVATE"], "vpcEndpointIds" : ["vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee"] }' \
    --region us-west-2
```

El resultado será similar al siguiente:

```
{
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "PRIVATE"
        ],
        "vpcEndpointIds": [
            "vpce-0212a4ababd5b8c3e",
            "vpce-0393a628149c867ee"
        ]
    },
    "id": "u67n3ov968",
    "createdDate": 1565718256,
    "name": "Petstore"
}
```

El siguiente comando [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) permite asociar puntos de conexión de VPC a una API ya creada:

```
aws apigateway update-rest-api \
    --rest-api-id u67n3ov968 \
    --patch-operations "op='add',path='/endpointConfiguration/vpcEndpointIds',value='vpce-01d622316a7df47f9'" \
    --region us-west-2
```

El resultado será similar al siguiente:

```
{
    "name": "Petstore",
    "apiKeySource": "1565718256",
    "tags": {},
    "createdDate": 1565718256,
    "endpointConfiguration": {
        "vpcEndpointIds": [
            "vpce-0212a4ababd5b8c3e",
            "vpce-0393a628149c867ee",
            "vpce-01d622316a7df47f9"
        ],
        "types": [
            "PRIVATE"
        ]
    },
    "id": "u67n3ov968"
}
```

Vuelva a implementar la API para que los cambios se apliquen.

------
#### [ Disassociate a VPC endpoint (AWS CLI) ]

El siguiente comando [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) permite desasociar un punto de conexión de VPC de una API privada:

```
aws apigateway update-rest-api \
    --rest-api-id u67n3ov968 \
    --patch-operations "op='remove',path='/endpointConfiguration/vpcEndpointIds',value='vpce-0393a628149c867ee'" \
    --region us-west-2
```

El resultado será similar al siguiente:

```
{
    "name": "Petstore",
    "apiKeySource": "1565718256",
    "tags": {},
    "createdDate": 1565718256,
    "endpointConfiguration": {
        "vpcEndpointIds": [
            "vpce-0212a4ababd5b8c3e",
            "vpce-01d622316a7df47f9"
        ],
        "types": [
            "PRIVATE"
        ]
    },
    "id": "u67n3ov968"
}
```

Vuelva a implementar la API para que los cambios se apliquen.

------

## Paso 4: Implementación de una API privada
<a name="apigateway-private-api-deploy-using-console"></a>

Para implementar la API, debe crear una implementación de API y asociarla con una etapa. El siguiente procedimiento muestra cómo implementar la API privada.

------
#### [ Consola de administración de AWS ]

**Implementación de una API privada**

1. Elija la API.

1. Elija **Implementar API**.

1. En **Etapa**, seleccione **Nueva etapa**.

1. En **Nombre de etapa**, ingrese un nombre de etapa.

1. (Opcional) En **Description (Descripción)**, introduzca una descripción.

1. Elija **Implementar**.

------
#### [ AWS CLI ]

El siguiente comando [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) permite implementar una API privada:

```
aws apigateway create-deployment --rest-api-id a1b2c3 \ 
  --stage-name test \
  --stage-description 'Private API test stage' \
  --description 'First deployment'
```

------

## Solución de problemas de la API privada
<a name="apigateway-private-api-troubleshooting"></a>

A continuación, se le proporcionan consejos para solucionar errores y problemas que es posible que se encuentre al crear una API privada.

### Problema: No puedo conectarme a mi API pública desde un punto de conexión de VPC de API Gateway
<a name="apigateway-private-api-troubleshooting-public-access"></a>

Al crear la VPC, puede configurar los ajustes de DNS. Le recomendamos que active el DNS privado para la VPC. Si elige desactivar el DNS privado, solo puede acceder a la API a través de DNS público.

Si habilita DNS privado, no puede acceder al punto de conexión predeterminado de una API de API Gateway pública desde el punto de conexión de VPC. Puede acceder a una API con un nombre de dominio personalizado.

Si crea un nombre de dominio personalizado regional, utilice un registro de alias de tipo A. Si crea un nombre de dominio personalizado optimizado para sistemas perimetrales, no hay restricciones para el tipo de registro. Puede acceder a estas API públicas con el DNS privado habilitado. Para obtener más información, consulte [Problema: Me conecto a mi API pública desde un punto de conexión de VPC de API Gateway](https://repost.aws/knowledge-center/api-gateway-vpc-connections).

### Problema: mi API devuelve `{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"}`
<a name="apigateway-private-api-troubleshooting-principal"></a>

En la política de recursos, si establece la entidad principal en una entidad principal de AWS, por ejemplo:

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/developer",
                    "arn:aws:iam::111122223333:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

Debe usar la autorización de `AWS_IAM` para todos los métodos de la API o, de lo contrario, la API devolverá el mensaje de error anterior. Para obtener más instrucciones sobre cómo activar la autorización de `AWS_IAM` para un método, consulte [Métodos de API de REST en API Gateway](how-to-method-settings.md).

### Problema: No puedo saber si mi punto de conexión de VPC está asociado a mi API
<a name="apigateway-private-api-troubleshooting-associate-wait-time"></a>

Si asocia o desasocia un punto de conexión de VPC con la API privada, tendrá que volver a implementar la API. Es posible que la operación de actualización tarde unos minutos en completarse debido a la propagación de DNS. Durante este tiempo la API esta disponible, pero es posible que mientras se esté realizando la propagación de DNS para las URL de DNS recién generadas. Si, después de varios minutos, las nuevas URL siguen sin resolverse en DNS, le recomendamos que vuelva a implementar la API.