Heroku Data for Redis への接続
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年11月17日(木)
Heroku Data for Redis には、Heroku によってサポートされているすべての言語およびフレームワークを含むすべての言語から、Redis ドライバーでアクセスできます。また、独自の環境で実行されているクライアントから、Mini プランまたは Premium プランでホストされている Heroku Data for Redis にアクセスすることもできます。
接続のアクセス許可
すべての Heroku Data for Redis ユーザーに、CONFIG
、SHUTDOWN
、BGREWRITEAOF
、BGSAVE
、SAVE
、MOVE
、MIGRATE
、SLAVEOF
、DEBUG
を除く Redis 内のすべてのコマンドへのアクセス権限が付与されます。
外部接続
Heroku ランタイムから使用できることに加えて、Heroku Data for Redis の Mini プランと Premium プランのインスタンスには、ローカルコンピューターやその他の場所で実行されているクライアントからアクセスできます。
バージョン 6 より前の Redis では、SSL または他のメカニズムを使用してネットワーク経由でデータを暗号化することができません。Heroku Data for Redis にネイティブに、または stunnel
を使用して安全に接続するための方法についての詳細は、「Heroku Data for Redis バージョン 4 と 5 のセキュリティ保護」を参照してください。
外部システムまたはクライアントから接続するには、次のいずれかの方法を使用して Redis 接続文字列を取得します。
heroku redis:credentials
CLI コマンドを実行する (詳細は、「redis:credentials)」を参照)。- コマンド
heroku config:get REDIS_URL -a example-app
を実行して、アプリの環境設定を検査する
Java での接続
Heroku Data for Redis に接続するにはさまざまな方法がありますが、個々の方法は使用中の Java フレームワークに依存します。すべての接続方法では REDIS_URL
環境変数を使用して接続情報を調べます。
Spring Boot
Spring Boot の Redis に対するサポートでは、REDIS_URL
などのすべての Redis 設定が自動的に選択されます。TLS ピアの確認を無効にするには、LettuceClientConfigurationBuilderCustomizer
Bean を定義します。
@Configuration
class AppConfig {
@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer() {
return clientConfigurationBuilder -> {
if (clientConfigurationBuilder.build().isUseSsl()) {
clientConfigurationBuilder.useSsl().disablePeerVerification();
}
};
}
}
Lettuce
このスニペットでは、REDIS_URL
環境変数を使用して、Lettuce を経由した Redis への接続を作成します。StatefulRedisConnection
はスレッドセーフであるため、マルチスレッド環境で安全に使用できます。
public static StatefulRedisConnection<String, String> connect() {
RedisURI redisURI = RedisURI.create(System.getenv("REDIS_URL"));
redisURI.setVerifyPeer(false);
RedisClient redisClient = RedisClient.create(redisURI);
return redisClient.connect();
}
Jedis
このスニペットでは、REDIS_URL
環境変数を使用して URI を作成します。この新しい URI は、Jedis を経由した Redis への接続を作成するために使用されます。この例では、Redis への 1 つの接続を作成します。
private static Jedis getConnection() {
try {
TrustManager bogusTrustManager = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{bogusTrustManager}, new java.security.SecureRandom());
HostnameVerifier bogusHostnameVerifier = (hostname, session) -> true;
return new Jedis(URI.create(System.getenv("REDIS_URL")),
sslContext.getSocketFactory(),
sslContext.getDefaultSSLParameters(),
bogusHostnameVerifier);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
throw new RuntimeException("Cannot obtain Redis connection!", e);
}
}
マルチスレッド環境 (Web サーバーなど) で Jedis を実行している場合は、同じ Jedis インスタンスを使用して Redis を操作しないでください。そうではなく、Jedis Pool を作成して、アプリケーションコードが Redis 接続をチェックアウトし、操作が終了したら接続をプールに返すようにしてください。
// The assumption with this method is that it's been called when the application
// is booting up so that a static pool has been created for all threads to use.
// e.g. pool = getPool()
public static JedisPool getPool() {
try {
TrustManager bogusTrustManager = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{bogusTrustManager}, new java.security.SecureRandom());
HostnameVerifier bogusHostnameVerifier = (hostname, session) -> true;
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10);
poolConfig.setMaxIdle(5);
poolConfig.setMinIdle(1);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setTestWhileIdle(true);
return new JedisPool(poolConfig,
URI.create(System.getenv("REDIS_URL")),
sslContext.getSocketFactory(),
sslContext.getDefaultSSLParameters(),
bogusHostnameVerifier);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
throw new RuntimeException("Cannot obtain Redis connection!", e);
}
}
// In your multithreaded code this is where you'd checkout a connection
// and then return it to the pool
try (Jedis jedis = pool.getResource()){
jedis.set("foo", "bar");
}
Ruby での接続
Ruby アプリケーションで Redis を使用するには、Gemfile
に redis
gem を含める必要があります。
gem 'redis'
bundle install
を実行して、すべての依存関係をダウンロードして解決します。
Rails での接続
次のコードを含む config/initializers/redis.rb
という名前のイニシャライザファイルを作成します。
$redis = Redis.new(url: ENV["REDIS_URL"], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
Sidekiq からの接続
次のコードを含む config/initializers/sidekiq.rb
という名前のイニシャライザファイルを作成します。
Sidekiq.configure_server do |config|
config.redis = {
url: ENV["REDIS_URL"],
ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }
}
end
Sidekiq.configure_client do |config|
config.redis = {
url: ENV["REDIS_URL"],
ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }
}
end
Python での接続
Python アプリケーションで Redis を使用するには、redis
パッケージを使用する必要があります。
$ pip install redis
$ pip freeze > requirements.txt
コード内でこのパッケージを使用して REDIS_URL
に接続します。
import os
import redis
r = redis.from_url(os.environ.get("REDIS_URL"))
Redis に TLS が必要な場合
import os
from urllib.parse import urlparse
import redis
url = urlparse(os.environ.get("REDIS_URL"))
r = redis.Redis(host=url.hostname, port=url.port, username=url.username, password=url.password, ssl=True, ssl_cert_reqs=None)
Django での接続
Django アプリケーションで Redis を使用するには、django-redis を使用する必要があります。
$ pip install django-redis
$ pip freeze > requirements.txt
settings.py
で、CACHES
を次のように設定します。
import os
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": os.environ.get('REDIS_URL'),
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
Redis に TLS が必要な場合
import os
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": os.environ.get('REDIS_URL'),
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {
"ssl_cert_reqs": None
},
}
}
}
Node.js での接続
redis
モジュール
redis
NPM モジュールを依存関係に追加します。
npm install redis
そして、このモジュールを使用して REDIS_URL
に接続します。
const redis = require("redis");
const client = redis.createClient({url: process.env.REDIS_URL});
さらに、TLS を使用するように redis
を設定します。
const redis = require("redis");
const client = redis.createClient({
url: process.env.REDIS_URL,
socket: {
tls: true,
rejectUnauthorized: false
}
});
ioredis
モジュール
ioredis
NPM モジュールを依存関係に追加します。
npm install ioredis
そして、このモジュールを使用して REDIS_URL
に接続します。
const Redis = require("ioredis");
const client = new Redis(process.env.REDIS_URL);
TLS を使用してクライアントを設定する場合は、次を使用できます。
const Redis = require("ioredis");
const client = new Redis(process.env.REDIS_URL, {
tls: {
rejectUnauthorized: false
}
});
PHP での接続
redis 拡張機能を使用した接続
composer.json
内の要件に ext-redis
を追加します。
"require": {
…
"ext-redis": "*",
…
}
環境の REDIS_TLS_URL
環境設定を解析した後、Redis に接続します。
$url = parse_url(getenv("REDIS_TLS_URL"));
$redis = new Redis();
$redis->connect("tls://".$url["host"], $url["port"], 0, NULL, 0, 0, [
"auth" => $url["pass"],
"stream" => ["verify_peer" => false, "verify_peer_name" => false],
]);
Predis を使用した接続
composer.json
で、predis
パッケージを要件に追加します。
"require": {
...
"predis/predis": "^1.1",
...
}
環境の REDIS_TLS_URL
環境設定を使用して Redis に接続します。
$redis = new Predis\Client(getenv('REDIS_TLS_URL') . "?ssl[verify_peer_name]=0&ssl[verify_peer]=0");
Go での接続
アプリケーションに Redigo パッケージを追加します。
$ go get github.com/gomodule/redigo/redis
パッケージをインポートします。
import "github.com/gomodule/redigo/redis"
REDIS_URL
設定変数を使用して Redis に接続します。
c, err := redis.DialURL(os.Getenv("REDIS_URL"), redis.DialTLSSkipVerify(true))
if err != nil {
// Handle error
}
defer c.Close()