

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 los puntos finales del cliente en el AWS SDK para Rust
<a name="endpoints"></a>

Cuando AWS SDK para Rust llama a una Servicio de AWS, uno de sus primeros pasos es determinar dónde enrutar la solicitud. Este proceso se conoce como resolución de puntos de conexión.

Puede configurar la resolución de puntos de conexión para el SDK cuando cree un cliente de servicio. La configuración predeterminada para la resolución de puntos de conexión suele ser adecuada, pero hay varios motivos por los que puede desear modificarla. Dos motivos a modo de ejemplo son los siguientes:
+ Para realizar solicitudes a una versión preliminar o a una implementación local de un servicio.
+ Para acceder a características de servicio específicas que aún no se han modelado en el SDK.

**aviso**  
La resolución de puntos de conexión es un tema complejo del SDK. Si cambia la configuración predeterminada, corre el riesgo de invalidar el código. La configuración predeterminada se aplica a la mayoría de los usuarios en entornos de producción.

Los puntos de enlace personalizados se pueden configurar de forma global para que se usen en todas las solicitudes de servicio, o se puede configurar un punto final personalizado para uno específico Servicio de AWS.

Los puntos finales personalizados se pueden configurar mediante variables de entorno o ajustes del archivo compartido AWS `config`. Para obtener información sobre este enfoque, consulte los [puntos finales específicos del servicio](https://docs.aws.amazon.com/sdkref/latest/guide/feature-ss-endpoints.html) en la Guía de referencia de herramientas *AWS SDKs y* herramientas. Para obtener una lista completa de las configuraciones de `config` archivos compartidos y las variables de entorno para todos Servicios de AWS, consulte [Identificadores](https://docs.aws.amazon.com/sdkref/latest/guide/ss-endpoints-table.html) para puntos finales específicos del servicio.

 Como alternativa, esta personalización también se puede configurar en el código, tal y como se muestra en las siguientes secciones.

## Configuración personalizada
<a name="custom-configuration"></a>

Puede personalizar la resolución de puntos de conexión de un cliente de servicio con dos métodos que están disponibles al crear el cliente:

1. `endpoint_url(url: Into<String>)`

1. `endpoint_resolver(resolver: impl crate::config::endpoint::ResolveEndpoint + `static)`

Puede configurar ambas propiedades. Sin embargo, lo más habitual es proporcionar solo una. Para un uso general, lo más frecuente es personalizar `endpoint_url`.

### Configuración de URL de punto de conexión
<a name="set-endpoint-url"></a>

Puede establecer un valor para `endpoint_url` que indique un nombre de host “básico” para el servicio. Sin embargo, este valor no es definitivo, ya que se pasa como parámetro a la instancia `ResolveEndpoint` del cliente. La implementación de `ResolveEndpoint` puede inspeccionar y, posiblemente, modificar ese valor para determinar el punto de conexión final.

### Configuración de punto de conexión de solucionador
<a name="set-endpoint-resolver"></a>

La implementación de `ResolveEndpoint` de un cliente de servicio determina el punto de conexión final resuelto que el SDK utiliza para todas las solicitudes. Un cliente de servicio llama al método `resolve_endpoint` para cada solicitud y utiliza el valor de [https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/endpoint/struct.EndpointFuture.html](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/endpoint/struct.EndpointFuture.html) que devuelve el solucionador sin ningún cambio adicional.

El siguiente ejemplo muestra cómo proporcionar una implementación del solucionador de puntos de conexión personalizada para un cliente de Amazon S3 que resuelve un punto de conexión distinto por etapa, como la preparación y la producción:

```
use aws_sdk_s3::config::endpoint::{ResolveEndpoint, EndpointFuture, Params, Endpoint};

#[derive(Debug)]
struct StageResolver { stage: String }
impl ResolveEndpoint for StageResolver {
    fn resolve_endpoint(&self, params: &Params) -> EndpointFuture<'_> {
        let stage = &self.stage;
        EndpointFuture::ready(Ok(Endpoint::builder().url(format!("{stage}.myservice.com")).build()))
    }
}


let config = aws_config::defaults(BehaviorVersion::latest())
    .load()
    .await;

let resolver = StageResolver { stage: std::env::var("STAGE").unwrap() };

let s3_config = aws_sdk_s3::config::Builder::from(&config)
    .endpoint_resolver(resolver)
    .build();

let s3 = aws_sdk_s3::Client::from_conf(s3_config);
```

**nota**  
Los solucionadores de puntos de conexión y, por extensión el indicador `ResolveEndpoint`, son específicos de cada servicio y, por lo tanto, solo se pueden configurar en la configuración del cliente del servicio. La URL del punto de conexión, por otro lado, se puede configurar mediante una configuración compartida (que se aplica a todos los servicios derivados de ella) o para un servicio específico.

#### ResolveEndpoint parámetros
<a name="resolveendpoint-parameters"></a>

El método `resolve_endpoint` acepta parámetros específicos del servicio que contienen propiedades utilizadas en la resolución de puntos de conexión.

Cada servicio incluye las siguientes propiedades básicas:


| Name | Tipo | Description (Descripción) | 
| --- | --- | --- | 
| region | Cadena | El del cliente Región de AWS | 
| endpoint | Cadena | Representación de cadena del conjunto de valores de endpointUrl. | 
| use\_fips | Booleano | Indica si los puntos de conexión de FIPS están habilitados en la configuración del cliente. | 
| use\_dual\_stack | Booleano | Indica si los puntos de conexión de doble pila están habilitados en la configuración del cliente. | 

Servicios de AWS puede especificar las propiedades adicionales necesarias para la resolución. Por ejemplo, los [parámetros de punto de conexión](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/config/endpoint/struct.Params.html) de Amazon S3 incluyen el nombre de bucket y también varios ajustes de características específicas de Amazon S3. Por ejemplo, la propiedad `force_path_style` determina si se puede utilizar el direccionamiento de host virtual.

Si implementa su propio proveedor, no debería ser necesario que cree su propia instancia de parámetros de punto de conexión. El SDK proporciona las propiedades de cada solicitud y las pasa a su implementación de `resolve_endpoint`.

### Comparación entre el uso de`endpoint_url` y el uso de `endpoint_resolver`
<a name="endpoint-url-or-endpoint-resolver"></a>

Es importante entender que las dos configuraciones siguientes, una que usa `endpoint_url` y otra que usa `endpoint_resolver`, NO producen clientes con un comportamiento de resolución de puntos de conexión equivalente.

```
use aws_sdk_s3::config::endpoint::{ResolveEndpoint, EndpointFuture, Params, Endpoint};

#[derive(Debug, Default)]
struct CustomResolver;
impl ResolveEndpoint for CustomResolver {
    fn resolve_endpoint(&self, _params: &Params) -> EndpointFuture<'_> {
        EndpointFuture::ready(Ok(Endpoint::builder().url("https://endpoint.example").build()))
    }
}

let config = aws_config::defaults(BehaviorVersion::latest())
    .load()
    .await;

// use endpoint url
aws_sdk_s3::config::Builder::from(&config)
    .endpoint_url("https://endpoint.example")
    .build();
    
// Use endpoint resolver
aws_sdk_s3::config::Builder::from(&config)
    .endpoint_resolver(CustomResolver::default())
    .build();
```

El cliente que establece la `endpoint_url` especifica una URL *base* que se pasa al proveedor (predeterminado) y que se puede modificar como parte de la resolución de puntos de conexión.

El cliente que establece el `endpoint_resolver` especifica la URL *final* que utilizará el cliente de Amazon S3.

## Ejemplos
<a name="endpointsExamples"></a>

Los puntos de conexión personalizados se utilizan a menudo para la realización de pruebas. En lugar de realizar llamadas al servicio basado en la nube, las llamadas se enrutan a un servicio simulado alojado de manera local. Dos de estas opciones son las que se indican a continuación.
+ [DynamoDB local](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html): una versión local del servicio Amazon DynamoDB.
+ [LocalStack](https://github.com/localstack/localstack)— un emulador de servicios en la nube que se ejecuta en un contenedor de tu máquina local.

 Los siguientes ejemplos ilustran dos formas diferentes de especificar un punto de conexión personalizado para usar estas dos opciones de prueba.

### Uso de DynamoDB local directamente en el código
<a name="endpointsExamplesddb"></a>

Como se ha descrito en las secciones anteriores, puede establecer la `endpoint_url` directamente en el código para anular el punto de conexión base para que apunte al servidor DynamoDB local. En el código:

```
    let config = aws_config::defaults(aws_config::BehaviorVersion::latest())
        .test_credentials()
        // DynamoDB run locally uses port 8000 by default.
        .endpoint_url("http://localhost:8000")
        .load()
        .await;
    let dynamodb_local_config = aws_sdk_dynamodb::config::Builder::from(&config).build();

    let client = aws_sdk_dynamodb::Client::from_conf(dynamodb_local_config);
```

El [ejemplo completo](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/dynamodb/src/bin/list-tables-local.rs) está disponible en GitHub.

### LocalStack Úselo utilizando el `config` archivo
<a name="endpointsExamplesLs"></a>

Puede configurar [puntos finales específicos del servicio](https://docs.aws.amazon.com/sdkref/latest/guide/feature-ss-endpoints.html) en el archivo compartido. AWS `config` El siguiente perfil de configuración establece la `endpoint_url` para conectarse a `localhost` en el puerto `4566`. *Para obtener más información sobre la LocalStack configuración, consulta [Acceder a LocalStack través de la URL del punto de conexión en el sitio web](https://docs.localstack.cloud/references/network-troubleshooting/endpoint-url/) de la LocalStack documentación.*

```
[profile {{localstack}}]
region=us-east-1
endpoint_url = http://localhost:4566
```

El SDK recopilará los cambios en el archivo `config` compartido y los aplicará a sus clientes del SDK cuando utilice el perfil de `localstack`. Con este enfoque, el código no necesita incluir ninguna referencia a los puntos de conexión y tendría el siguiente aspecto:

```
    // set the environment variable `AWS_PROFILE=localstack` when running
    // the application to source `endpoint_url` and point the SDK at the
    // localstack instance
    let config = aws_config::defaults(BehaviorVersion::latest()).load().await;

    let s3_config = aws_sdk_s3::config::Builder::from(&config)
        .force_path_style(true)
        .build();

    let s3 = aws_sdk_s3::Client::from_conf(s3_config);
```

El [ejemplo completo](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/localstack) está disponible en GitHub.