IAM 認証を管理する

このページでは、Memorystore for Redis Cluster の IAM 認証機能の一般的なタスクに関する手順について説明します。この機能の詳細については、 IAM 認証についてをご覧ください。

IAM 認証を使用してインスタンスを作成する

IAM 認証を使用する Memorystore for Redis Cluster インスタンスを作成するには、create コマンドを実行します。

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

以下を置き換えます。

  • INSTANCE_ID は、作成する Memorystore for Redis Cluster インスタンスの ID です。インスタンス ID は 1〜63 文字にする必要があり、小文字、数字、ハイフンのみ使用できます。先頭は英小文字に、末尾は英小文字または数字にする必要があります。

  • REGION_ID は、インスタンスを配置するリージョンです。

  • NETWORK は、インスタンスの作成に使用されるネットワークです。projects/NETWORK_PROJECT_ID/global/networks/NETWORK_ID の形式を使用する必要があります。ここで使用するネットワーク ID は、サービス接続ポリシーで使用されるネットワーク ID と一致する必要があります。それ以外の場合、create オペレーションは失敗します。 詳しくは、 ネットワーキングをご覧ください。

  • NODE_TYPE は、ノードタイプ です。

  • SHARD_COUNT によってインスタンス内のシャードの数が決定されます。シャード数は、クラスタデータを保存するための合計メモリ容量を決定します。クラスタ仕様の詳細については、クラスタとノードの仕様をご覧ください。

IAM 認証の権限を付与する

IAM アクセス権を付与するには、IAM ロールを付与するの手順に沿って、プリンシパルに roles/redis.dbConnectionUser ロールを付与します。プリンシパルは 、リソースへのアクセス権を付与できる ID です Google Cloud。たとえば、 プリンシパルは、プロジェクト Google Cloud にアクセスできるサービス アカウントにすることができます。

デフォルトでは、プリンシパルに roles/redis.dbConnectionUser ロールを付与すると、プリンシパルはプロジェクト内のすべてのインスタンスにアクセスできます。

インスタンスに対して制限付き IAM 管理者ロールを作成する

完全な IAM 管理者権限を付与せずに、インスタンス接続の IAM 権限を変更できるロールを作成できます。これを行うには、roles/redis.dbConnectionUser ロールに対して制限付き IAM 管理者を作成します。詳細については、制限付き IAM 管理者を作成するをご覧ください。

IAM 認証を使用するインスタンスに接続する

  1. Redis クラスタと同じ 承認済みネットワークを使用する Compute Engine VM がまだない場合は、作成してから、 Linux VM の使用に関するクイックスタートに沿って接続します。

  2. プロジェクトで gcloud compute instances set-service-account コマンドを使用してサービス アカウントを設定し、 Cloud Platform API スコープを Compute Engine VM に対して有効にします。

    gcloud compute instances set-service-account VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=SCOPE
    

    次のように置き換えます。

    • VM_NAME: Compute Engine VM の名前
    • SERVICE_ACCOUNT_EMAIL: サービス アカウントのメールアドレス
    • SCOPE: VM の Cloud Platform API スコープ(cloud-platform)

    たとえば、次のコマンドは example-VM という VM に my-sa-123@my-project-123.iam.gserviceaccount.com サービス アカウントを割り当て、その VM のアクセス スコープを Cloud Platform API に設定します。

    gcloud compute instances set-service-account example-VM \
    --service-account=my-sa-123@my-project-123.iam.gserviceaccount.com \
    --scopes=cloud-platform
    

    このアクセス スコープを有効にする方法について詳しくは、 サービス アカウントを接続してアクセス スコープを更新するをご覧ください。このスコープのベスト プラクティスについて詳しくは、 スコープのベスト プラクティスをご覧ください。

  3. プロジェクトで Memorystore for Redis API を有効にします。

    Memorystore for Redis API

  4. Compute Engine SSH ターミナルから次のコマンドを実行して、redis-cli を Compute Engine VM にインストールします。

    sudo apt-get install redis-tools
    
  5. 次のコマンドを実行して、IAM ユーザーのアクセス トークンを取得します。

    gcloud auth print-access-token
    

    アクセス トークンの有効期限は 1 時間です。詳細については、IAM アクセス トークンの有効期間をご覧ください。

  6. インスタンスの検出エンドポイントに接続します。

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

    以下を置き換えます。

    • NETWORK_ADDRESS: インスタンスのネットワーク アドレス。ネットワーク アドレスを表示するには、クラスタ情報を表示するをご覧ください。

    • PORT: インスタンスのポート番号。ポート番号を表示するには、 クラスタ情報を表示するをご覧ください。

    • ACCESS_TOKEN:前のステップで取得したアクセス トークン。

    ユーザー名を指定する場合は、default ユーザー名または IAM プリンシパルのメールアドレスを使用する必要があります。また、認証された接続はトークンの有効期限が切れても有効です。詳細については、 IAM アクセス トークンの有効期間をご覧ください。

    クラスタで転送中の暗号化を有効にする場合は、Transport Layer Security(TLS)フラグを追加する必要があります。次に例を示します。

    redis-cli -h NETWORK_ADDRESS -p PORT -a ACCESS_TOKEN -c --tls --cacert /tmp/server_ca.pem
    
  7. CLUSTER SHARDS コマンドを実行して、クラスタ トポロジを表示します。ノードの IP アドレスとポート番号のいずれかをメモします。

  8. redis-cli を使用してノードを認証して接続するには、次のコマンドを使用します。

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

    以下を置き換えます。

    • NODE_IP_ADDRESS: 前のステップでメモしたノードの IP アドレス
    • NODE_PORT: 前の ステップでメモしたノードのポート番号
    • ACCESS_TOKEN: この手順で先に取得した IAM アクセス トークン
  9. ノードへの認証済み接続があることを確認するには、Redis の SET コマンドと GET コマンドを実行します。

  10. クラスタへの接続に使用した Compute Engine VM を削除します。これにより、Cloud 請求先アカウントへの課金を回避できます。

アクセス トークンの取得を自動化する

  1. (省略可) まだ作成していない場合は、アプリケーションのサービス アカウントを作成します(サービス アカウントの作成と管理を参照してください)。

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

    以下を置き換えます。

    • SA_NAME はサービス アカウントの名前です。
    • DESCRIPTION は、サービス アカウントの説明です(省略可能)。
    • DISPLAY_NAME は、 Google Cloud コンソールに表示するサービス アカウント名です。
  2. プロジェクトでサービス アカウントに redis.dbConnectionUser ロールを付与します。

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

    以下を置き換えます。

    • PROJECT_ID: プロジェクト ID。
    • SA_NAME: サービス アカウントの名前。
    • ROLE_NAME: ロール名。この例では、redis.dbConnectionUser。
  3. アプリケーションを認証します 指定されたサービス アカウントとして。詳しくは、サービス アカウントをご覧ください。

IAM 認証を使用するインスタンスに接続するためのコードサンプル

一般的なクライアント ライブラリを使用してアプリケーションを認証する方法を示すコードサンプルを表示できます。また、このコードサンプルを使用して IAM 認証を使用するインスタンスに接続する方法も確認できます。

IAM 認証のエラー メッセージのトラブルシューティング

エラー メッセージ 推奨される対応 説明

-WRONGPASS invalid username-password pair or user is disabled

Memorystore for Redis Cluster サーバーに提供されたアクセス トークンを確認し、一致する ACL ユーザーが有効になっていることを確認します。

IAM プリンシパルに必要な権限がないか、提供したアクセス トークンが無効であるか、一致する ACL ユーザーが無効になっています。

アクセス トークンの有効期限が切れていないことと、 IAM 認証を使用するインスタンスに接続する の手順に沿ってトークンを取得したことを確認します。

IAM 権限を最近変更した場合は、権限が反映されるまでに数分かかることがあります。

-NOAUTH Authentication required

アプリケーションが Memorystore for Redis Cluster サーバーに IAM アクセス トークンを提供するように構成されていることを確認します。

アプリケーションが Memorystore for Redis Cluster サーバーにアクセス トークンを提供していません。

アプリケーションがアクセス トークンを提供するように構成されていることと、 IAM 認証を使用するインスタンスに接続するの手順に沿ってアクセス トークンを取得したことを確認します。

-ERR (ERR_IAM_EXHAUSTED) Memorystore IAM authentication backend quota exceeded.

指数バックオフを使用して再試行する。

IAM バックエンドが過負荷になり、Memorystore for Redis Cluster サーバーに割り当て超過エラーが返されました。

接続エラーがさらに発生しないように、アプリケーションで指数バックオフを使用してこのエラーを再試行することをおすすめします。

-ERR (ERR_IAM_OTHER) Memorystore IAM authentication backend error.

ユーザー名を確認するか、指数バックオフを使用して再試行します。

このエラーは、次の理由で発生します。

  • 指定したユーザー名が無効です。 default ユーザー名を使用するか、ユーザー名を省略するか、 IAM プリンシパルのメールアドレスを使用できます。
  • IAM バックエンドが Memorystore for Redis Cluster サーバーに一時的なエラーを返しました。

ユーザー名が有効な場合は、接続エラーがさらに発生しないように、アプリケーションで指数バックオフを使用してこのエラーを再試行することをおすすめします。