Heroku Redisに接続できなくなって色々調べてました。原因はまだよく分かってませんがローカルからHeroku Redisには接続できるようになりました。
ただ、Heroku上のアプリからは接続できない状態が続いています…。
追記(2024/11/02):以下、続報の記事です。状況はまだ好転してません…。
【Redis】Spring Boot + Lettuceで接続先を指定しない場合localhost:6379に接続しにいくらしい
まぁ、おそらく原因はRedisのバージョンアップでRedisの認証が上手くいってないんじゃないかなと思っていますが、なんかバージョンアップしたタイミングと事象が発生したタイミングが合わないような気がしてなんだかよく分からないです…。
追記(2024/10/31):
Herokuでissueとして挙がってますね。言われたとおりに対応してるつもりですがうまくいきません…。
https://help.heroku.com/HC0F8CUS/heroku-key-value-store-connection-issues
エラー内容
スタックとレースはこんな感じ
「Redisに接続できないよ」って言われてますが、Redisの仕様上、サーバ起動後の一番最初のリクエストを送信したタイミングでこのエラーが発生します。
私のアプリケーションの場合は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をいい感じに読み込んでくれるらしいです。
追記(2024/11/02):いい感じに読み込んでくれるなんてことはありませんでした…。
これでローカルからのアクセスは可能になりました。
追記(2024/11/02):なってません!
@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.