🔐

Memorystore for Redis Cluster で IAM 認証を試してみた

2023/12/22に公開

この記事は Google Cloud Japan Advent Calendar 2023 (入門編) の 22 日目の記事です。

皆さんこんにちは! Google Cloud Japan で Customer Engineer をやっている水野です。
この記事では、最近 GA となった Memorystore for Redis Cluster (以下、MRC) での IAM を使った認証の設定方法について解説します。

フルマネージドでセキュアな Redis Cluster を簡単に Google Cloud 上にデプロイできるので、ぜひお試しください!

tl;dr

  • MRC が 2023/11/14 に GA になった
  • MRC では IAM 認証によるアクセス制限機能が利用可能になった
  • IAM 認証を利用する際はデータ転送中の暗号化機能も有効化することが推奨される

Memorystore for Redis Cluster (MRC) とは?

Google Cloud ではフルマネージドのインメモリサービスである Memorystore シリーズを展開しており、アプリケーションのキャッシュレイヤーソリューションとして多くのお客様にご利用いただいています。
https://cloud.google.com/memorystore?hl=ja

Redis 互換のプロダクトを使いたい場合、これまでは Memorystore for Redis (以下、MR) 一択という状況でしたが、2023/11/14 に Memorystore for Redis Cluster が GA したことにより、Google Cloud の Redis サービスの選択肢の一つとして新たにご検討いただけるようになりました!
https://cloud.google.com/memorystore/docs/cluster/overview

簡単な概要については、Google Cloud CE の Suwa による記事があるため、こちらも併せてご確認ください!
https://zenn.dev/google_cloud_jp/articles/cloudrun-itg-redis#memorystore-for-redis-クラスタが-ga

IAM 認証

MRC はパブリック IP を持たずにプライベート IP を使って通信するため、内部ネットワーク経由の通信に限定できるというメリットがあります。一方で多層防御の観点から、内部ネットワークであっても特定のクライアントからのみ接続を許可したいといったユースケースをお持ちの方が多いのではないかと思います。

そこで今回の本題となりますが、MRC では IAM による認証機能[1]が新たに追加されました。これにより、Redis AUTH コマンドと Google Cloud の IAM アクセストークンを使って MRC へのアクセス制御を実現できるようになりました!
https://cloud.google.com/memorystore/docs/cluster/about-iam-auth

また MRC においても、TLS プロトコルによる転送中のデータ暗号化機能があります。本機能を有効化せずに IAM 認証機能を利用する場合、アクセストークンが暗号化されない状態で通信が行われるため、特別な事情がない限りは本機能も有効化しておくことを強く推奨します。
https://cloud.google.com/memorystore/docs/cluster/about-in-transit-encryption

MRC を起動して IAM 認証を試す

実際に MRC を起動するところから IAM 認証を使ってアクセスするところまでの手順を記載します。接続元として GCE インスタンスと GCE のデフォルトのサービスアカウントを利用しますが、本記事では GCE 関連のリソースは事前に準備されていることを前提とし、起動手順等については割愛させていただきます。

MRC を起動する

早速 MRC を起動してみましょう。まずは Memorystore のコンソールへアクセスします。まだクラスタを作成していない場合、スクリーンショットのような画面が表示されるはずなので [クラスタを作成] を選択します。
もし API 有効化の画面が出た方は、画面の指示に従って Redis の API を有効化してください。

[クラスタ ID] には任意の名前を入力、[リージョン] は [asia-northeast1]、[シャード] はデフォルトの [10] を設定します。

[レプリカ] にはデフォルトの [1]、[ネットワーク] には接続元の GCE インスタンスが存在する VPC を選択します。
なお、当該 VPC でプライベートサービスコネクトを使ったことがない方は、スクリーンショットでエラーが出ているように先にサービス接続ポリシーを設定する必要があります。その場合は [サービス接続ポリシーを設定する] を選択して設定を行いましょう。

[IAM AUTH を有効にする] と [転送中の暗号化(TLS)を有効にする] の両方にチェックを入れてから [クラスタを作成] を選択します。完了するまでに少し時間がかかります。

MRC の起動が完了すると、Memorystore コンソールの最初の画面で [検出エンドポイント] を確認できます。ここに記載されている IP アドレスは後ほど GCE インスタンスから接続する際に使用するので、メモに残しておきましょう!

次に、作成した MRC の [概要] ページから redis-cli の TLS 接続に必要な CA 情報をダウンロードし、GCE インスタンス上にアップロードしておきます。アップロードの方法自体はいくつかありますが、どれを選択いただいても構いません。

最後に IAM コンソールへ移動し、GCE で使用するデフォルトのサービスアカウントに Cloud Memorystore Redis データベース接続ユーザー の IAM ロールを付与します。

GCE インスタンスから MRC に接続する

GCE インスタンスから MRC へ IAM 認証を使ってアクセスできるか確認してみましょう。
ここからの作業は、GCE インスタンスへ SSH でアクセスしていることを前提に CLI ベースで記載していきます。

まず初めに、パッケージのアップデートと redis-cli のインストールを行います。

sudo apt-get update -y && sudo apt-get install redis-tools -y

redis-cli コマンドを使って MRC への接続を試みますが、おそらく NOAUTH Authentication required. というエラーが出るはずです。IAM のアクセストークンの情報を input していないので、想定通りの挙動ですね。

redis-cli -h <メモした MRC の IP アドレス> -c --tls --cacert <アップロードした CA 情報の PATH>

それでは以下のコマンドを実行し、GCE サービスアカウントのアクセストークンを取得してから redis-cli で再度接続してみましょう。今回は問題なく接続できるはずです!

ACCESS_TOKEN=$(gcloud auth print-access-token)
redis-cli -h <メモした MRC の IP アドレス> -a $ACCESS_TOKEN -c --tls --cacert <アップロードした CA 情報の PATH>

なお、GCE のサービスアカウントから IAM ロールを外して再度コマンドを実行すると NOAUTH Authentication required. のエラーが再度発生します。このことからも、IAM によるアクセス制御が実現できていることを確認できますね!

まとめ

本記事では、Memorystore for Redis Cluster における IAM 認証の設定手順を紹介しました。もちろん認証機能だけでなくパフォーマンスや可用性も Memorystore for Redis より強化されているので、今後のキャッシュレイヤーソリューションの選択肢の一つとして皆様にご検討いただけると嬉しいです!

脚注
  1. これまでの MR でも Redis AUTH による認証は利用できますが、IAM アクセストークンを組み込むことはできませんでした。 ↩︎

Google Cloud Japan

Discussion