エラーの内容
NOAUTH Authentication required
パスワードが設定されているRedisインスタンスで、認証を行わずにコマンドを実行した瞬間にこのエラーが発生します。典型的な例として、redis-cliを開いてSET key valueと入力すると、Redisは即座に拒否します。
発生原因
redis.confにrequirepassを設定すると、Redisはすべてのアクセスをロックします。クライアントは他のコマンドを受け付けてもらう前にAUTH <password>を実行する必要があります。PINGも例外ではありません。
よくある原因:
-aフラグや接続後のAUTHコマンドなしでredis-cliに接続している- アプリの設定にパスワードが設定されていない、またはローテーション後に古いパスワードが残っている
redis.confにrequirepassを追加してRedisを再起動したが、アプリの設定を更新していない- マネージドRedis(Redis Cloud、AWS ElastiCache、Upstash)では認証が必須
修正1:redis-cliで認証する
方法A:接続時にパスワードを指定する
redis-cli -h 127.0.0.1 -p 6379 -a yourpassword
方法B:接続後に認証する
redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> AUTH yourpassword
OK
127.0.0.1:6379> PING
PONG
AUTHがOKを返すと、そのセッション内の後続コマンドはすべて通ります。認証は接続ごとに1回だけ行えば十分です。
修正2:アプリケーションの接続設定を修正する
アプリでNOAUTHが発生している場合、Redisクライアントが認証情報を送信していません。接続設定にパスワードを追加してください:
Python (redis-py)
import redis
r = redis.Redis(
host='127.0.0.1',
port=6379,
password='yourpassword',
decode_responses=True
)
r.ping() # 認証が成功するとTrueを返す
Node.js (ioredis)
const Redis = require('ioredis');
const redis = new Redis({
host: '127.0.0.1',
port: 6379,
password: 'yourpassword',
});
redis.ping().then(result => console.log(result)); // PONG
Node.js (node_redis v4)
import { createClient } from 'redis';
const client = createClient({
url: 'redis://:yourpassword@127.0.0.1:6379'
});
await client.connect();
接続URLを使用する(推奨)
# .env
REDIS_URL=redis://:yourpassword@127.0.0.1:6379
ほとんどのRedisクライアントは、パスワードが埋め込まれた完全なURLを受け入れます。2つのメリットがあります:ソースコードにシークレットを含めずに済み、パスワードのローテーションは環境変数を1つ更新するだけで完了します。
修正3:パスワードを無効化する(開発環境のみ)
ローカル開発環境で認証が不要な場合は、ファイルを変更せずにランタイムで無効化できます:
# 実行中のインスタンスで認証を無効化する(現在のパスワードが必要)
redis-cli -a currentpassword CONFIG SET requirepass ""
# または現在の設定を確認する
redis-cli -a currentpassword CONFIG GET requirepass
ファイルを直接編集する場合は、/etc/redis/redis.confを開いて以下の行をコメントアウトしてください:
# requirepass yourpassword
その後、再起動します:
sudo systemctl restart redis
# または古いシステムの場合
sudo service redis-server restart
本番環境やインターネットに公開されているサーバーでは絶対に行わないでください。
修正4:現在のパスワードがわからない場合
他の人がパスワードを設定した場合は、設定ファイルを確認してください。ほぼ必ず平文で記載されています:
grep requirepass /etc/redis/redis.conf
# またはすべての設定ファイルを検索する
sudo grep requirepass /etc/redis/*.conf
それでも見つからない場合は、起動時にパスワードが渡されていないか確認してください:
ps aux | grep redis-server
# 出力の中に--requirepassがあるか確認する
どうしても回復できない場合は、サーバーにアクセスして新しい設定でRedisを再起動する必要があります。
修正の確認
redis-cli -a yourpassword PING
# 期待される結果: PONG
redis-cli -a yourpassword SET testkey "hello"
# 期待される結果: OK
redis-cli -a yourpassword GET testkey
# 期待される結果: "hello"
# クリーンアップ
redis-cli -a yourpassword DEL testkey
PINGでPONGが返り、SET/GETが正常に動作していれば修正完了です。
ヒント
長いランダムなパスワードを使用する
Redisは1秒あたり数十万の操作を処理できます。AUTHリクエストも同様です。短いパスワードはインターネットに公開されたインスタンスでは深刻なリスクになります。32文字以上の英数字の文字列を生成してください。私はこのためにToolCraftのパスワードジェネレーターを使用しています。英数字のみにしてください:特殊文字はredis-cliにパスワードを渡す際にシェルエスケープの問題を引き起こします。
環境変数でパスワードを設定する
# docker-compose.yml
services:
redis:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
Redis 6+ ACLシステム
requirepassはRedis 6+でも動作しますが、複数のサービスが1つのインスタンスを共有する場合はACLシステムへの移行を検討する価値があります。ユーザーごとのパスワード、詳細なコマンド権限など、より細かい制御が可能です:
# 専用のアプリユーザーを作成する
ACL SETUSER appuser on >yourpassword ~* &* +@all
# そのユーザーで接続する
AUTH appuser yourpassword
マネージドRedisの接続文字列
Redis Cloud、Upstash、ElastiCacheはすべてダッシュボードから接続URLを提供しており、パスワードが既に埋め込まれています。そのままコピーして使用してください:
redis://:password@your-host.example.com:6379
# TLS(Upstash、Redis Cloud)
rediss://:password@your-host.example.com:6380

