Administrar la autenticación de IAM

En esta página, se proporcionan instrucciones sobre las tareas comunes de la función de autenticación de IAM para el clúster de Memorystore para Redis. Para obtener más detalles sobre la función, consulta Acerca de la autenticación de IAM.

Crear una instancia con autenticación de IAM

Para crear una instancia de clúster de Memorystore para Redis que use la autenticación de IAM, ejecuta el comando create:

gcloud beta redis clusters create INSTANCE_ID --region=REGION_ID --network=NETWORK --shard-count=SHARD_COUNT --auth-mode=iam-auth

Reemplaza lo siguiente:

  • INSTANCE_ID es el ID de la instancia del clúster de Memorystore para Redis que estás creando. El ID de la instancia debe tener entre 1 y 63 caracteres y solo contener letras minúsculas, números o guiones. Debe comenzar con una letra minúscula y terminar con una letra minúscula o un número.

  • REGION_ID es la región en la que deseas colocar la instancia.

  • NETWORK es la red que se usa para crear tu instancia. Debe usar el siguiente formato: projects/NETWORK_PROJECT_ID/global/networks/NETWORK_ID. El ID de red que se usa aquí debe coincidir con el ID de red que usa la política de conexión de servicios. De lo contrario, la operación create falla. Para obtener más detalles, consulta Herramientas de redes.

  • SHARD_COUNT determina la cantidad de fragmentos de 13 GB en la instancia. El recuento de fragmentos determina la capacidad de memoria total para almacenar datos de la instancia. Para obtener más detalles sobre las especificaciones de las instancias, consulta Especificación de clústeres y fragmentos.

Administrar los permisos para la autenticación de IAM

Crea un rol de administrador de IAM limitado para una instancia

Se recomienda crear una función que pueda modificar los permisos de IAM de conexión de instancias sin otorgar acceso de administrador de IAM completo. Esto se puede hacer mediante la creación de un administrador de IAM limitado para la función “roles/redis.dbConnectionUser”. Para obtener más información, consulta Crea administradores de IAM limitados.

Otorga acceso a tu instancia con IAM

De forma predeterminada, si otorgas a una principal la función roles/redis.dbConnectionUser, la principal podrá acceder a todas las instancias del proyecto. Para otorgar acceso a un subconjunto de recursos en tu proyecto, configura el acceso basado en recursos de IAM para la función roles/redis.dbConnectionUser. Para obtener más información, consulta Configura el acceso basado en recursos.

Conéctate a una instancia que use la autenticación de IAM

  1. Si aún no tienes una VM de Compute Engine que use la misma red autorizada que tu clúster de Redis, crea una y conéctate a ella siguiendo la Guía de inicio rápido sobre el uso de una VM de Linux.

  2. Ejecuta el siguiente comando desde la terminal SSH de Compute Engine para instalar redis-cli en la VM de Compute Engine:

    sudo apt-get install redis-tools
    
  3. Ejecuta el siguiente comando a fin de obtener un token de acceso para tu usuario de IAM:

    gcloud auth print-access-token
    
  4. Conéctate al extremo de descubrimiento de tu instancia:

    redis-cli -h NETWORK_ADDRESS -p PORT -a ACCESS_TOKEN -c
    

    Reemplaza lo siguiente:

    • NETWORK_ADDRESS es la dirección de red de la instancia. Para ver la dirección de red, consulta Ver información de la instancia.

    • PORT es el número de puerto de las instancias. Para ver el número de puerto, consulta Ver información de la instancia.

    • ACCESS_TOKEN es el token de acceso de IAM recuperado en los pasos anteriores.

  5. Ejecuta el comando CLUSTER SHARDS para ver la topología de tu clúster. Anota una de las direcciones IP y los números de puerto del nodo.

  6. Conéctate al nodo que quieras ejecutando el siguiente comando:

    redis-cli -h NODE_IP_ADDRESS -p NODE_PORT -a ACCESS_TOKEN -c
    

    Reemplaza lo siguiente:

    • NODE_IP_ADDRESS es la dirección IP del nodo que encontraste en el paso anterior.
    • NODE_PORT es el número de puerto del nodo que encontraste en el paso anterior.
  7. Ejecuta un comando SET y GET de Redis para verificar que estableciste una conexión autenticada al nodo del clúster.

  8. Una vez que termines de probar tu conexión a la instancia de Redis, debes considerar borrar la VM de Compute Engine que usaste para conectarte al clúster de Redis. Esto te ayuda a evitar que se apliquen cargos a tu cuenta de Facturación de Cloud.

  9. Ejecuta el siguiente comando para usar redis-cli a fin de autenticar y conectarte a tu instancia, y reemplaza las variables con valores adecuados:

    redis-cli -h NETWORK_ADDRESS -p PORT -a ACCESS_TOKEN -c
    

    Reemplaza lo siguiente:

    • NETWORK_ADDRESS es la dirección de red de la instancia. Para ver la dirección de red, consulta Ver información de la instancia.

    • PORT es el número de puerto de las instancias. Para ver el número de puerto, consulta Ver información de la instancia.

    • ACCESS_TOKEN es el token de acceso de IAM recuperado en los pasos anteriores.

  10. Ejecuta un comando SET y GET de Redis para verificar que estableciste una conexión autenticada a tu instancia.

  11. Una vez que termines de probar tu conexión al clúster de Redis, debes considerar borrar la VM de Compute Engine que usaste para conectarte al clúster de Redis. Esto te ayuda a evitar que se apliquen cargos a tu cuenta de Facturación de Cloud.

Automatiza la recuperación de tokens de acceso

Se recomienda que automatices la recuperación de tokens de acceso en tu aplicación, ya que no es fácil codificar los tokens de acceso debido a su corta duración.

  1. (Opcional) Si aún no lo hiciste, crea una cuenta de servicio para tu aplicación (consulta Crea y administra una cuenta de servicio).

    gcloud iam service-accounts create SA_NAME \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    Reemplaza lo siguiente:

    • SA_NAME es el nombre de la cuenta de servicio.
    • DESCRIPTION es una descripción opcional de la cuenta de servicio.
    • DISPLAY_NAME es un nombre de cuenta de servicio que se mostrará en Google Cloud Console.
  2. Otorga a tu cuenta de servicio el permiso redis.dbConnectionUser en tu proyecto.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
    --role="redis.dbConnectionUser"
    

    Reemplaza lo siguiente:

    • PROJECT_ID es el ID del proyecto.
    • SA_NAME es el nombre de la cuenta de servicio.
    • ROLE_NAME es un nombre de función, como roles/compute.osLogin.
  3. Autentica tu aplicación como la cuenta de servicio determinada. Consulta las cuentas de servicio para obtener más información.

    Para ver muestras de código que muestran cómo puedes autenticar tu aplicación con bibliotecas cliente populares, consulta las muestras de código de biblioteca cliente de autenticación de IAM.

Muestras de código de la biblioteca cliente de autenticación de IAM

En esta sección, se proporcionan ejemplos generales de código de cliente para la autenticación con la autenticación de IAM para tu clúster de Memorystore con la biblioteca cliente de Lettuce.

Lechuga


public void example() {
  String discoveryEndpointIp = "insert discovery endpoint ip"
  String discoveryEndpointPort = "insert discovery endpoint port"
  RedisCredentialsProvider provider =
     () ->
           Mono.just(RedisCredentials.just("default", retrieveAccessToken().toCharArray()));
  RedisURI redisUri =
     RedisURI.Builder.redis(discoveryEndpointIp, discoveryEndpointPort)
           .withAuthentication(provider)
           .build();
  ClientResources resources =
     DefaultClientResources.builder()
           .reconnectDelay(
              Delay.fullJitter(
                 Duration.ofMillis(100),
                 Duration.ofSeconds(5),
                 100,
                 TimeUnit.MILLISECONDS))
           .build();
  ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
     .enablePeriodicRefresh(1, TimeUnit.MINUTES)
     .enableAllAdaptiveRefreshTriggers()
     .dynamicRefreshSources(false)
     .closeStaleConnections(true)
     .build();

  SocketOptions socketOptions = SocketOptions.builder()
     .connectTimeout(Duration.ofSeconds(5))
     .keepAlive(true)
     .build();

  // Create Redis Cluster Client
  RedisClusterClient clusterClient = RedisClusterClient.create(resources, redisUri);
  clusterClient.setOptions(
     ClusterClientOptions.builder()
           .topologyRefreshOptions(topologyRefreshOptions)
           .socketOptions(socketOptions)
           .autoReconnect(true)
           .nodeFilter(
              it ->
                 !(it.is(RedisClusterNode.NodeFlag.FAIL)
                       || it.is(RedisClusterNode.NodeFlag.EVENTUAL_FAIL)
                       || it.is(RedisClusterNode.NodeFlag.NOADDR)))
           .validateClusterNodeMembership(false)
           .build());

  // Establish connection to Redis Cluster
  StatefulRedisClusterConnection connection = clusterClient.connect();
  // Retrieve synchronous Redis Cluster commands
  RedisAdvancedClusterCommands syncCommands = connection.sync();
  // Perform Redis operations
  syncCommands.set("key1", "value1");

  // Close the connection and shutdown the client
  connection.close();
  clusterClient.shutdown();
}