Gérer l'authentification IAM

Cette page fournit des instructions sur les tâches courantes liées à la fonctionnalité d'authentification IAM pour le cluster Memorystore pour Redis. Pour en savoir plus sur cette fonctionnalité, consultez À propos de l'authentification IAM.

Créer une instance avec authentification IAM

Pour créer une instance de cluster Memorystore pour Redis qui utilise l'authentification IAM, exécutez la commande create:

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

Remplacez les éléments suivants :

  • INSTANCE_ID est l'ID de l'instance de cluster Memorystore pour Redis que vous créez. Votre ID d'instance doit comporter entre 1 et 63 caractères. Il ne doit être composé que de lettres minuscules, de chiffres ou de traits d'union. Il doit commencer par une lettre minuscule et se terminer par une lettre minuscule ou un chiffre.

  • REGION_ID est la région dans laquelle vous souhaitez placer l'instance.

  • NETWORK est le réseau utilisé pour créer votre instance. Il doit utiliser le format suivant: projects/NETWORK_PROJECT_ID/global/networks/NETWORK_ID. L'ID réseau utilisé ici doit correspondre à celui utilisé par la règle de connexion au service. Sinon, l'opération create échoue. Pour en savoir plus, consultez la section Mise en réseau.

  • SHARD_COUNT détermine le nombre de segments de 13 Go dans votre instance. Le nombre de segments détermine la capacité totale de la mémoire pour le stockage des données d'instance. Pour en savoir plus sur les spécifications des instances, consultez la section Spécifications des clusters et des segments.

Gérer les autorisations pour l'authentification IAM

Créer un rôle d'administrateur IAM limité pour une instance

Vous pouvez créer un rôle permettant de modifier les autorisations IAM de connexion aux instances sans accorder un accès administrateur complet à IAM. Pour ce faire, créez un administrateur IAM limité pour le rôle "roles/redis.dbConnectionUser". Pour en savoir plus, consultez Créer des administrateurs IAM limités.

Accorder l'accès à votre instance avec IAM

Par défaut, l'attribution du rôle roles/redis.dbConnectionUser au compte principal lui permet d'accéder à toutes les instances de votre projet. Pour accorder l'accès à un sous-ensemble de ressources dans votre projet, configurez l'accès IAM pour le rôle roles/redis.dbConnectionUser. Pour en savoir plus, consultez Configurer l'accès basé sur les ressources.

Se connecter à une instance utilisant l'authentification IAM

  1. Si vous ne disposez pas encore d'une VM Compute Engine utilisant le même réseau autorisé que votre cluster Redis, créez-en une et connectez-vous en suivant les instructions de la page Démarrage rapide à l'aide d'une VM Linux.

  2. Installez redis-cli sur la VM Compute Engine en exécutant la commande suivante depuis le terminal SSH de Compute Engine:

    sudo apt-get install redis-tools
    
  3. Exécutez la commande suivante pour obtenir un jeton d'accès pour votre utilisateur IAM:

    gcloud auth print-access-token
    
  4. Connectez-vous au point de terminaison de découverte de votre instance:

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

    Remplacez les éléments suivants :

  5. Exécutez la commande CLUSTER SHARDS pour afficher la topologie de votre cluster. Notez l'une des adresses IP et des numéros de port du nœud.

  6. Connectez-vous au nœud souhaité en exécutant la commande suivante:

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

    Remplacez les éléments suivants :

    • NODE_IP_ADDRESS est l'adresse IP du nœud que vous avez trouvée à l'étape précédente.
    • NODE_PORT est le numéro de port du nœud que vous avez trouvé à l'étape précédente.
  7. Exécutez les commandes Redis SET et GET pour vérifier que vous avez établi une connexion authentifiée à votre nœud de cluster.

  8. Une fois les tests de connexion à l'instance Redis terminés, vous devez envisager de supprimer la VM Compute Engine que vous avez utilisée pour vous connecter au cluster Redis. Vous éviterez ainsi que des frais soient facturés sur votre compte de facturation Cloud.

  9. Exécutez la commande suivante pour utiliser redis-cli pour vous authentifier et vous connecter à votre instance, en remplaçant les variables par les valeurs appropriées:

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

    Remplacez les éléments suivants :

  10. Exécutez une commande Redis SET et GET pour vérifier que vous avez établi une connexion authentifiée à votre instance.

  11. Une fois les tests de connexion au cluster Redis terminés, vous devez envisager de supprimer la VM Compute Engine que vous avez utilisée pour vous connecter au cluster Redis. Vous éviterez ainsi que des frais soient facturés sur votre compte de facturation Cloud.

Automatiser la récupération des jetons d'accès

Nous vous recommandons d'automatiser la récupération des jetons d'accès dans votre application, car ils ne peuvent pas être facilement codés en dur en raison de leur courte durée de vie.

  1. (Facultatif) Si vous ne l'avez pas déjà fait, créez un compte de service pour votre application (consultez Créer et gérer un compte de service).

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

    Remplacez les éléments suivants :

    • SA_NAME correspond au nom du compte de service.
    • DESCRIPTION est une description facultative du compte de service.
    • DISPLAY_NAME est un nom de compte de service à afficher dans la console Google Cloud.
  2. Accordez à votre compte de service l'autorisation redis.dbConnectionUser sur votre projet.

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

    Remplacez les éléments suivants :

    • PROJECT_ID est l'ID de projet.
    • SA_NAME correspond au nom du compte de service.
    • ROLE_NAME est un nom de rôle, par exemple roles/compute.osLogin.
  3. Authentifier votre application en tant que compte de service donné Pour en savoir plus, consultez la section Comptes de service.

    Pour obtenir des exemples de code qui montrent comment authentifier votre application à l'aide de bibliothèques clientes courantes, consultez Exemples de code pour les bibliothèques clientes d'authentification IAM.

Exemples de code de la bibliothèque cliente d'authentification IAM

Cette section fournit des exemples généraux de code client pour l'authentification avec l'authentification IAM pour votre cluster Memorystore avec la bibliothèque cliente Lettuce.

Laitue


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();
}