IAM-Authentifizierung verwalten

Auf dieser Seite finden Sie Anleitungen für gängige Aufgaben zur IAM-Authentifizierung für Memorystore for Redis-Cluster. Weitere Informationen zu diesem Feature finden Sie unter IAM-Authentifizierung.

Instanz mit IAM-Authentifizierung erstellen

Führen Sie den Befehl create aus, um eine Memorystore for Redis-Clusterinstanz zu erstellen, die die IAM-Authentifizierung verwendet:

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

Ersetzen Sie Folgendes:

  • INSTANCE_ID ist die ID der Memorystore for Redis-Clusterinstanz, die Sie erstellen. Die Instanz-ID muss zwischen 1 und 63 Zeichen lang sein und darf nur Kleinbuchstaben, Ziffern oder Bindestriche enthalten. Sie muss mit einem Kleinbuchstaben beginnen und mit einem Kleinbuchstaben oder einer Ziffer enden.

  • REGION_ID ist die Region, in der die Instanz platziert werden soll.

  • NETWORK ist das Netzwerk, mit dem Ihre Instanz erstellt wird. Er muss das Format projects/NETWORK_PROJECT_ID/global/networks/NETWORK_ID haben. Die hier verwendete Netzwerk-ID muss mit der Netzwerk-ID übereinstimmen, die in der Dienstverbindungsrichtlinie verwendet wird. Andernfalls schlägt der Vorgang create fehl. Weitere Informationen finden Sie unter Netzwerke.

  • SHARD_COUNT bestimmt die Anzahl von 13 GB-Shards in Ihrer Instanz. Die Shard-Anzahl bestimmt die Gesamtspeicherkapazität zum Speichern von Instanzdaten. Weitere Informationen zu Instanzspezifikationen finden Sie unter Cluster- und Shard-Spezifikation.

Berechtigungen für IAM-Authentifizierung verwalten

Begrenzte IAM-Administratorrolle für eine Instanz erstellen

Sie sollten eine Rolle erstellen, mit der IAM-Berechtigungen für Instanzverbindungen geändert werden können, ohne vollständigen IAM-Administratorzugriff zu gewähren. Erstellen Sie dazu einen eingeschränkten IAM-Administrator für die Rolle „roles/redis.dbConnectionUser“. Weitere Informationen finden Sie im Hilfeartikel Eingeschränkte IAM-Administratoren erstellen.

Zugriff auf die Instanz mit IAM gewähren

Wenn Sie dem Hauptkonto die Rolle roles/redis.dbConnectionUser zuweisen, kann das Hauptkonto standardmäßig auf alle Instanzen in Ihrem Projekt zugreifen. Wenn Sie einer Teilmenge von Ressourcen in Ihrem Projekt Zugriff gewähren möchten, richten Sie den ressourcenbasierten IAM-Zugriff für die Rolle roles/redis.dbConnectionUser ein. Weitere Informationen finden Sie unter Ressourcenbasierten Zugriff konfigurieren.

Verbindung zu einer Instanz herstellen, die IAM-Authentifizierung verwendet

  1. Wenn Sie noch keine Compute Engine-VM haben, die dasselbe autorisierte Netzwerk wie Ihr Redis-Cluster verwendet, erstellen Sie eine VM und stellen Sie eine Verbindung zu ihr her. Folgen Sie dazu der Kurzanleitung: Linux-VM verwenden.

  2. Installieren Sie redis-cli auf der Compute Engine-VM. Führen Sie dazu den folgenden Befehl über das Compute Engine-SSH-Terminal aus:

    sudo apt-get install redis-tools
    
  3. Führen Sie den folgenden Befehl aus, um ein Zugriffstoken für Ihren IAM-Nutzer abzurufen:

    gcloud auth print-access-token
    
  4. Stellen Sie eine Verbindung zum Discovery-Endpunkt Ihrer Instanz her:

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

    Ersetzen Sie Folgendes:

    • NETWORK_ADDRESS ist die Netzwerkadresse der Instanz. Wie Sie die Netzwerkadresse aufrufen, erfahren Sie unter Instanzinformationen aufrufen.

    • PORT ist die Portnummer der Instanzen. Informationen zum Anzeigen der Portnummer finden Sie unter Instanzinformationen aufrufen.

    • ACCESS_TOKEN ist das IAM-Zugriffstoken, das in den vorherigen Schritten abgerufen wurde.

  5. Führen Sie den Befehl CLUSTER SHARDS aus, um die Clustertopologie anzusehen. Notieren Sie sich die IP-Adresse und die Portnummer des Knotens.

  6. Stellen Sie mit dem folgenden Befehl eine Verbindung zum gewünschten Knoten her:

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

    Ersetzen Sie Folgendes:

    • NODE_IP_ADDRESS ist die IP-Adresse des Knotens, die Sie im vorherigen Schritt gefunden haben.
    • NODE_PORT ist die Portnummer des Knotens, die Sie im vorherigen Schritt gefunden haben.
  7. Führen Sie einen Redis-Befehl SET und GET aus, um zu prüfen, ob eine authentifizierte Verbindung zu Ihrem Clusterknoten hergestellt wurde.

  8. Nachdem Sie die Verbindung zur Redis-Instanz getestet haben, sollten Sie die Compute Engine-VM löschen, die Sie zum Herstellen einer Verbindung zum Redis-Cluster verwendet haben. Dadurch vermeiden Sie, dass Ihrem Cloud-Rechnungskonto Gebühren berechnet werden.

  9. Führen Sie den folgenden Befehl aus, um sich mit „redis-cli“ zu authentifizieren und eine Verbindung zu Ihrer Instanz herzustellen: Ersetzen Sie Variablen durch entsprechende Werte:

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

    Ersetzen Sie Folgendes:

    • NETWORK_ADDRESS ist die Netzwerkadresse der Instanz. Wie Sie die Netzwerkadresse aufrufen, erfahren Sie unter Instanzinformationen aufrufen.

    • PORT ist die Portnummer der Instanzen. Informationen zum Anzeigen der Portnummer finden Sie unter Instanzinformationen aufrufen.

    • ACCESS_TOKEN ist das IAM-Zugriffstoken, das in den vorherigen Schritten abgerufen wurde.

  10. Führen Sie einen Redis-Befehl SET und GET aus, um zu prüfen, ob eine authentifizierte Verbindung zu Ihrer Instanz hergestellt wurde.

  11. Nachdem Sie die Verbindung zum Redis-Cluster getestet haben, sollten Sie die Compute Engine-VM löschen, die Sie zum Herstellen einer Verbindung zum Redis-Cluster verwendet haben. Dadurch vermeiden Sie, dass Ihrem Cloud-Rechnungskonto Gebühren berechnet werden.

Abruf von Zugriffstokens automatisieren

Es wird empfohlen, das Abrufen von Zugriffstokens in Ihrer Anwendung zu automatisieren, da Zugriffstokens aufgrund ihrer kurzen Lebensdauer nicht einfach hartcodiert werden können.

  1. Optional: Erstellen Sie ein Dienstkonto für Ihre Anwendung (siehe Dienstkonto erstellen und verwalten).

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

    Ersetzen Sie Folgendes:

    • SA_NAME ist der Name des Dienstkontos.
    • DESCRIPTION ist eine optionale Beschreibung des Dienstkontos.
    • DISPLAY_NAME ist ein Dienstkontoname, der in der Google Cloud Console angezeigt wird.
  2. Weisen Sie Ihrem Dienstkonto die Berechtigung redis.dbConnectionUser für Ihr Projekt zu.

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID ist die Projekt-ID.
    • SA_NAME ist der Name des Dienstkontos.
    • ROLE_NAME ist ein Rollenname, z. B. roles/compute.osLogin.
  3. Authentifizieren Sie Ihre Anwendung als angegebenes Dienstkonto. Weitere Informationen finden Sie unter Dienstkonten.

    Codebeispiele, die zeigen, wie Sie Ihre Anwendung mit beliebten Clientbibliotheken authentifizieren können, finden Sie unter Codebeispiele für die IAM-Authentifizierungs-Clientbibliothek.

Codebeispiele für die IAM-Authentifizierungs-Clientbibliothek

Dieser Abschnitt enthält allgemeine Beispiele für den Clientcode zur Authentifizierung mit der IAM-Authentifizierung für Ihren Memorystore-Cluster mit der Lettuce-Clientbibliothek.

Salat


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