Heroku Redisに接続できなくなって色々調べてました。原因はまだよく分かってませんがローカルからHeroku Redisには接続できるようになりました。
ただ、Heroku上のアプリからは接続できない状態が続いています…。
まぁ、おそらく原因はRedisのバージョンアップでSSL/TLSの認証が必須になってRedisの認証が上手くいかなくなってるんじゃないかなと思っていますが、なんかバージョンアップしたタイミングと事象が発生したタイミングが合わないような気がしてなんだかよく分からないです…。
Herokuで2024/10/15くらいから色々issueが上がっているようで、同じ現象が起こっているのは私だけではないのかもしれません…。
追記:
Herokuでissueとして挙がってますね。言われたとおりに対応してもうまくいってないのがよく分かってませんが…。
https://help.heroku.com/HC0F8CUS/heroku-key-value-store-connection-issues
エラー内容
スタックとレースはこんな感じ
「Redisに接続できないよ」って言われてますが、Redisに一番最初にgetなりkeysなりのリクエストを送信したタイミングでこのエラーが発生します。
私のアプリケーションの場合はSpring起動時にエラーが出ないので、なんかうまくいっている気がしちゃうんですよね。
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1795)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.getConnection(LettuceConnectionFactory.java:1726)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getNativeConnection(LettuceConnectionFactory.java:1528)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.lambda$getConnection$0(LettuceConnectionFactory.java:1508)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.doInLock(LettuceConnectionFactory.java:1469)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$SharedConnection.getConnection(LettuceConnectionFactory.java:1505)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getSharedConnection(LettuceConnectionFactory.java:1191)
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.getConnection(LettuceConnectionFactory.java:997)
at org.springframework.data.redis.core.RedisConnectionUtils.fetchConnection(RedisConnectionUtils.java:195)
at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:144)
at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:105)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:383)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:363)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:350)
コネクション作成のソース
エラーが発生したときに使用していたConnectionFactory生成するソースです。
@Bean
LettuceConnectionFactory redisConnectionFactory() throws URISyntaxException {
URI uri = new URI(envUrl);String host = uri.getHost();
int port = uri.getPort();String userInfo = uri.getUserInfo();RedisStandaloneConfiguration conf = new RedisStandaloneConfiguration();
conf.setHostName(host);
conf.setPort(port);
if (!StringUtils.isEmpty(userInfo)) {
String[] userInfoArr = userInfo.split(“:”, 2);
String username = userInfoArr[0];
if (!”h”.equals(username)) {
conf.setUsername(username);
} String password = userInfoArr[1];
conf.setPassword(password);
}
return new LettuceConnectionFactory(conf);
}
修正後のソース
なんかすごいシンプルになりました。
依存関係は特に追加していません。Spring Bootのバージョンは3.2.10です。
LettuceClientConfigurationBuilderCustomizerがspring-boot-autoconfigureに含まれているのでこの辺追加すればとりあえず実装は可能かと。
環境変数にREDIS_URLとかREDIS_TLS_URLで設定したURLをいい感じに読み込んでくれるらしいです。
これでローカルからのアクセスは可能になりました。
@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer() {
return clientConfigurationBuilder -> {
if (clientConfigurationBuilder.build().isUseSsl()) {
clientConfigurationBuilder.useSsl().disablePeerVerification();
}
};
}
Heroku上のアプリケーションからはまだ接続できていないので続報があれば追記しておきます…。
https://devcenter.heroku.com/ja/articles/connecting-heroku-redis
https://devcenter.heroku.com/changelog-items/1932
The following two tabs change content below.