

# Tutorial: Creación e invocación de un nombre de dominio personalizado para API privadas
<a name="apigateway-private-custom-domains-tutorial"></a>

En este tutorial, creará un nombre de dominio personalizado privado que podrá invocar en una VPC en su propia cuenta. Para ello, usted es tanto proveedor de API como consumidor de API. Necesita una API privada y un punto de conexión de VPC existentes para completar este tutorial. Si tiene un punto de conexión de VPC que utiliza para acceder a un nombre de dominio personalizado público, no lo utilice para este tutorial ni para crear asociaciones de acceso a nombres de dominio.

## Paso 1: creación de un nombre de dominio personalizado privado
<a name="apigateway-private-custom-domains-provider-create-domain"></a>

El nombre de dominio personalizado privado se crea especificando el nombre de dominio, el certificado de ACM y la política del servicio `execute-api` para controlar qué puntos de conexión de VPC pueden invocarlo.

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

**Para crear un nombre de dominio personalizado privado**

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

1. En el panel de navegación principal, elija **Nombres de dominio personalizados**.

1. Elija **Agregar nombre de dominio**.

1. En **Nombre de dominio**, escriba un nombre de dominio. 

   Su certificado de ACM debe cubrir este nombre de dominio, pero no es necesario que el nombre de dominio sea exclusivo.

1. Seleccione **Privado**.

1. En **Modo de enrutamiento**, elija **Solo asignaciones de la API**.

1. En **Certificado de ACM**, seleccione un certificado.

1. Elija **Agregar nombre de dominio**.

API Gateway proporciona un nombre de dominio con una política de `deny` de todos los recursos. Esta es la política de recursos del servicio `execute-api`. Debe actualizar esta política de recursos para conceder acceso a sus puntos de conexión de VPC para invocar su nombre de dominio personalizado privado.

**Para actualizar la política de recursos**

1. Elija la pestaña **Política de recursos** y, a continuación, seleccione **Editar política de recursos**.

1. Especifique la siguiente política de recursos en el editor de código. Sustituya el punto de conexión de VPC *vpce-abcd1234efg* por el ID de su propio punto de conexión de VPC.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": [
                   "execute-api:/*"
               ]
           },
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": [
                   "execute-api:/*"
               ],
               "Condition" : {
                   "StringNotEquals": {
                       "aws:SourceVpce": "vpce-abcd1234"
                   }
               }
           }
       ]
   }
   ```

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

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

Cuando crea un nombre de dominio personalizado privado con la AWS CLI, proporciona una política de recursos para que el servicio `execute-api` conceda acceso a los puntos de conexión de VPC para invocar su nombre de dominio personalizado privado mediante el parámetro `--policy file://policy.json`. Podrá modificar esta política más tarde.

En este ejemplo, asociará la siguiente política de recursos como `policy` al cargar parámetros desde un archivo. Copie y guarde este archivo como `policy.json`. Esta política solo permite el tráfico entrante a un nombre de dominio personalizado privado desde el punto de conexión de VPC * `vpce-abcd1234efg`*:

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-abcd1234"
                }
            }
        }
    ]
}
```

El siguiente comando [create-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-domain-name.html) permite crear un nombre de dominio personalizado privado:

```
aws apigateway create-domain-name \
    --domain-name 'private.example.com' \
    --certificate-arn 'arn:aws:acm:us-west-2:111122223333:certificate/a1b2c3d4-5678-90ab-cdef' \
    --security-policy 'TLS_1_2' \
    --endpoint-configuration '{"types":["PRIVATE"]}' \
    --policy file://policy.json
```

El resultado será similar al siguiente:

```
{
    "domainName": "private.example.com",
    "domainNameId": "abcd1234",
    "domainNameArn": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
    "certificateArn": "arn:aws:acm:us-west-2:111122223333:certificate/a1b2c3d4-5678-90ab-cdef",
    "certificateUploadDate": "2024-09-10T10:31:20-07:00",
    "endpointConfiguration": {
        "types": [
            "PRIVATE"
        ]
    },
    "domainNameStatus": "AVAILABLE",
    "securityPolicy": "TLS_1_2",
    "routingMode" : "API_MAPPING_ONLY",
    "policy": "..."
}
```

------

## Paso 2: creación de una asignación de ruta base para asignar la API privada al nombre de dominio personalizado privado
<a name="apigateway-private-custom-domains-base-path-mapping"></a>

Después de crear el nombre de dominio personalizado privado, debe asignarle una API privada. Una asignación de ruta base hace que se pueda acceder a la API a través de una combinación de nombre de dominio personalizado privado y una ruta base asociada. Le recomendamos que utilice un único nombre de dominio personalizado privado como nombre de host de varias API privadas.

Todos los proveedores de API deben crear una asignación de ruta base, incluso si no tienen previsto invocar su propia API. También debe conceder acceso a los puntos de conexión de VPC para invocar cualquier API privada que asigne a su nombre de dominio personalizado privado.

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

**Para crear una asignación de ruta base**

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

1. En el panel de navegación principal, elija **Nombres de dominio personalizados**.

1. Elija un nombre de dominio personalizado privado.

1. En la pestaña **Asignaciones de API**, elija **Configurar asignaciones**.

1. Seleccione **Agregar nueva asignación**.

1. Introduzca una **API**, una **Etapa** y, de forma opcional, una **Ruta**.

1. Seleccione **Save**.

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

El siguiente comando [create-base-path-mapping](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-base-path-mapping.html) permite crear una asignación entre una API privada y un nombre de dominio personalizado privado:

```
aws apigateway create-base-path-mapping \
    --domain-name-id abcd1234 \
    --domain-name 'private.example.com' \
    --rest-api-id a1b2c3 \
    --stage prod \
    --base-path v1
```

El resultado será similar al siguiente.

```
{
    "basePath": "v1",
    "restApiId": "a1b2c3",
    "stage": "prod"
}
```

------

Para obtener mayor flexibilidad sobre cómo enrutar el tráfico a las API, puede cambiar el modo de enrutamiento a `ROUTING_RULE_ONLY` o `ROUTING_RULE_THEN_API_MAPPING` y crear una regla de enrutamiento. Para obtener más información, consulte [Envío de tráfico a las API a través del nombre de dominio personalizado en API Gateway](rest-api-routing-mode.md).

**nota**  
Si desea que otras Cuentas de AWS invoquen su nombre de dominio personalizado privado, una vez que haya completado este tutorial, siga los pasos que se describen en [Proveedor de API: compartir su nombre de dominio personalizado privado mediante AWS RAM](apigateway-private-custom-domains-provider-share.md).

## Paso 3: creación de una asociación de acceso a nombres de dominio entre su nombre de dominio personalizado y un punto de conexión de VPC
<a name="apigateway-private-custom-domains-provider-associate-with-vpce"></a>

A continuación, debe crear una asociación de acceso a nombres de dominio entre su nombre de dominio personalizado privado y su punto de conexión de VPC. El punto de conexión de VPC utiliza la asociación de acceso a nombres de dominio para invocar su nombre de dominio personalizado privado mientras está aislado de la Internet pública.

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

**Para crear una asociación de acceso a nombres de dominio**

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

1. En el panel de navegación principal, elija **Nombres de dominio personalizados**.

1. Elija un nombre de dominio personalizado privado.

1. En la pestaña **Uso compartido de recursos**, en **Asociaciones de acceso a nombres de dominio**, seleccione **Crear asociación de acceso a nombres de dominio**.

1. En **ARN del nombre de dominio**, seleccione el nombre de dominio.

1. En **ID del punto de conexión de VPC**, seleccione el ID del punto de conexión de VPC al que proporcionó acceso en el paso 1.

1. Elija **Asociación de acceso a nombres de dominio**.

También puede crear su asociación de acceso a nombres de dominio desde la página **Asociaciones de acceso a nombres de dominio** de la consola.

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

El siguiente comando `create-domain-name-access-association` permite crear una asociación de acceso a nombres de dominio entre su nombre de dominio personalizado privado y su punto de conexión de VPC.

```
aws apigateway create-domain-name-access-association \
    --domain-name-arn arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234 \
    --access-association-source vpce-abcd1234efg \
    --access-association-source-type VPCE \
    --region us-west-2
```

El resultado será similar al siguiente.

```
{
    "domainNameAccessAssociationARN": "arn:aws:apigateway:us-west-2:111122223333:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg",
    "accessAssociationSource": "vpce-abcd1234efg",
    "accessAssociationSourceType": "VPCE",
    "domainNameARN" : "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234"
}
```

------

Tras crear la asociación de acceso a nombres de dominio, esta tardará unos 15 minutos en estar lista. Mientras espera, puede continuar con los siguientes pasos.

## Paso 4: creación de una zona alojada en Route 53
<a name="apigateway-private-custom-domains-provider-create-route-53-private-hosted-zone"></a>

Tras actualizar la política de recursos y asociar el nombre de dominio personalizado privado al punto de conexión de VPC, debe crear una zona alojada privada en Route 53 para resolver el nombre de dominio personalizado. Una zona alojada es un contenedor que incluye información acerca de cómo se desea dirigir el tráfico de un dominio dentro de una o varias VPC sin tener que exponer sus recursos en Internet. Para obtener más información, consulte [Uso de zonas alojadas privadas](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html).

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

Para usar la Consola de administración de AWS, consulte [Creación de una zona alojada privada](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html) en la *Guía para desarrolladores de Amazon Route 53*.

En **Nombre**, escriba el nombre de su nombre de dominio personalizado privado. En **ID de VPC**, utilice la VPC que contiene el punto de conexión de VPC que utilizó en los pasos anteriores.

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

El siguiente comando [create-hosted-zone](https://docs.aws.amazon.com/cli/latest/reference/route53/create-hosted-zone.html) permite crear una zona alojada privada:

```
aws route53 create-hosted-zone --name private.example.com \
    --caller-reference 2014-04-01-18:47 \
    --hosted-zone-config Comment="command-line version",PrivateZone=true \
    --vpc VPCRegion=us-west-2,VPCId=vpc-abcd1234
```

El resultado contiene el ID de la zona alojada. El ID de la zona alojada se utiliza en los pasos siguientes.

------

## Paso 5: creación de un registro de DNS de Route 53
<a name="apigateway-private-custom-domains-provider-create-route-53-record"></a>

Después de crear la zona alojada, debe crear un registro para resolver el nombre de dominio personalizado privado. Debe utilizar el ID de zona alojada que creó en el paso anterior. En este ejemplo, se crea un tipo de registro A. Si está utilizando IPv6 para el punto de conexión de VPC, cree un tipo de registro AAAA. Si utiliza la pila doble para el punto de conexión de VPC, cree un tipo de registro AAAA y un tipo de registro A.

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

Para usar la Consola de administración de AWS, consulte [Enrutamiento del tráfico a una API de Amazon API Gateway mediante su nombre de dominio](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-api-gateway.html).

Utilice **Creación rápida** y active la opción **Alias**. Para el punto de conexión, utilice el nombre de DNS del punto de conexión de VPC.

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

Para configurar sus registros de DNS para asignar el nombre de dominio personalizado privado al nombre de host del ID de zona alojada designado, cree un archivo JSON que contenga la configuración a fin de establecer un registro de DNS para el nombre de dominio privado.

El siguiente `setup-dns-record.json` muestra cómo crear un registro `A` de DNS para asignar un nombre de dominio personalizado privado a su nombre de host privado. Debe proporcionar el `DNSName` de su ID de DNS de VPC y el ID de la zona alojada que creó en el paso anterior.

```
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "private.example.com",
        "Type": "A",
        "AliasTarget": {
          "DNSName": "vpce-abcd1234.execute-api.us-west-2.vpce.amazonaws.com",
          "HostedZoneId": "Z2OJLYMUO9EFXC",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
```

El siguiente comando [change-resource-record-sets](https://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html) permite crear un registro de DNS para su nombre de dominio personalizado privado:

```
aws route53 change-resource-record-sets \
    --hosted-zone-id ZABCDEFG1234 \
    --change-batch file://path/to/your/setup-dns-record.json
```

Reemplace `hosted-zone-id` por el ID de zona alojada de Route 53 del conjunto de registros de DNS de la cuenta. El valor del parámetro `change-batch` apunta al archivo JSON.

------

Si no tiene previsto invocar su propio nombre de dominio personalizado privado, una vez que haya confirmado que el nombre de dominio personalizado privado funciona, puede eliminar estos recursos.

## Paso 6: invocación del nombre de dominio personalizado privado
<a name="apigateway-private-custom-domains-tutorial-invoke"></a>

Ahora puede invocar su nombre de dominio personalizado privado en su propia Cuenta de AWS. En su VPC, utilice el siguiente comando curl para acceder a su nombre de dominio personalizado privado.

```
curl https://private.example.com/v1
```

Para obtener más información sobre otras formas de invocar sus API privadas, consulte [Invocación de una API privada con un nombre de dominio personalizado](apigateway-private-api-test-invoke-url.md#apigateway-private-custom-domains-provider-invoke).

## Paso 7: limpiar
<a name="apigateway-private-custom-domains-cleanup"></a>

Para evitar costos innecesarios, elimine la asociación entre el punto de conexión de VPC y el nombre de dominio personalizado privado y, a continuación, elimine el nombre de dominio personalizado privado.

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

**Para eliminar la asociación de acceso a nombres de dominio**

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

1. En el panel de navegación principal, elija **Asociaciones de acceso a nombres de dominio**.

1. Seleccione la asociación de acceso a nombres de dominio y, a continuación, elija **Eliminar**.

1. Confirme la selección y, a continuación, elija **Eliminar**.

Después de eliminar la asociación de acceso a nombres de dominio, puede eliminar el nombre de dominio personalizado privado.

**Para eliminar un nombre de dominio personalizado privado**

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

1. En el panel de navegación principal, elija **Nombres de dominio personalizados**.

1. Elija el nombre de dominio personalizado privado.

1. Elija **Eliminar**.

1. Confirme la selección y, a continuación, elija **Eliminar**.

Si es necesario, también puede eliminar el punto de conexión de VPC. Para obtener más información, consulte [Eliminación de un punto de conexión de interfaz](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-interface-endpoint.html).

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

**Eliminación**

1. El siguiente comando `delete-access-association` permite eliminar la asociación de acceso a nombres de dominio:

   ```
   aws apigateway delete-domain-name-access-association \
       --domain-name-access-association-arn 'arn:aws:apigateway:us-west-2:111122223333:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234efg' \
       --region us-west-2
   ```

1. El siguiente comando `delete-domain-name` permite eliminar el nombre de dominio personalizado privado. Este comando también elimina todas las asignaciones de ruta base.

   ```
   aws apigateway delete-domain-name \
       --domain-name test.private.com \
       --domain-name-id abcd1234
   ```

Si es necesario, también puede eliminar el punto de conexión de VPC. Para obtener más información, consulte [Eliminación de un punto de conexión de interfaz](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-interface-endpoint.html).

------

## Prácticas recomendadas
<a name="apigateway-private-custom-domains-best-practices"></a>

Le recomendamos que utilice las siguientes prácticas recomendadas al crear el nombre de dominio personalizado privado:
+ Utilice la asignación de rutas base o las reglas de enrutamiento para enviar tráfico desde un nombre de dominio personalizado privado a varias API privadas.
+ Cuando un punto de conexión de VPC ya no necesite acceder a un nombre de dominio personalizado privado, elimine la asociación. Además, elimine el punto de conexión de VPC de la `policy` del servicio `execute-api` para el dominio personalizado privado. 
+ Configure al menos dos zonas de disponibilidad por punto de conexión de VPC.
+ Deshabilite el punto de conexión predeterminado. Le recomendamos que deshabilite el punto de conexión predeterminado para permitir que los consumidores de API solo puedan llamar a su API desde el nombre de dominio personalizado. Para obtener más información, consulte [Deshabilitación del punto de conexión predeterminado para las API de REST](rest-api-disable-default-endpoint.md).
+ Le recomendamos que aprovisione una zona alojada privada de Route 53 y un registro de tipo A cuando configure su nombre de dominio personalizado privado. Si no tiene previsto invocar su propio nombre de dominio personalizado privado, puede eliminar estos recursos más tarde.