一般社団法人 全国個人事業主支援協会

COLUMN コラム

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

 

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア