MSK 연결이 되지 않는 이슈
원인
- EC2 Producer 인스턴스에, Kafka Client 설치 후, 연결 테스트 진행.
kafka_2.13-3.5.1/bin/kafka-topics.sh --create --bootstrap-server b-2.tmomicluster.aoe4ts.c3.kafka.ap-northeast-2.amazonaws.com:9098
--replication-factor 3 --partitions 1 --topic MyTopic
- 위의 명령어를 통해 Topic을 생성했을 때 java.lang.OutOfMemoryError: 자바 힙 스페이스 오류 발생.
분석
- 위의 명령어는 IAM 인증 포트를 사용하는 명령어로, 명령어에는 인증을 읽고 사용하는 명령어가 없는 것으로 분석.
- 아래와 같은 명령어로 변경.
kafka_2.13-3.5.1/bin/kafka-topics.sh --create --bootstrap-server b-1.tmomicluster.aoe4ts.c3.kafka.ap-northeast-2.amazonaws.com:9098 --command-config /root/kafka_2.13-3.5.1/bin/client.properties --replication-factor 3 --partitions 1 --topic TestTopic
- 위의 명령어를 보면 —command-config라는 명령어를 통해 다음 client.properties 를 실행함.
- client.properties 에는 인증 설정이 포함되어 있음.
- 하지만 위의 명령어를 통해 Topic을 생성 했을 때 또한 아래와 같은 오류 발생.
Exception in thread "main" org.apache.kafka.common.config.ConfigException: Invalid value software.amazon.msk.auth.iam.IAMClientCallbackHandlersecurit for configuration sasl.client.callback.handler.class: Class software.amazon.msk.auth.iam.IAMClientCallbackHandlersecurit could not be found.
at org.apache.kafka.common.config.ConfigDef.parseType(ConfigDef.java:744)
at org.apache.kafka.common.config.ConfigDef.parseValue(ConfigDef.java:490)
at org.apache.kafka.common.config.ConfigDef.parse(ConfigDef.java:483)
at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:112)
at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:145)
at org.apache.kafka.clients.admin.AdminClientConfig.<init>(AdminClientConfig.java:245)
at org.apache.kafka.clients.admin.Admin.create(Admin.java:134)
at kafka.admin.TopicCommand$TopicService$.createAdminClient(TopicCommand.scala:203)
at kafka.admin.TopicCommand$TopicService$.apply(TopicCommand.scala:207)
at kafka.admin.TopicCommand$.main(TopicCommand.scala:51)
at kafka.admin.TopicCommand.main(TopicCommand.scala)
- 오류를 분석 했을 때, IAM 관련 권한을 찾을 수 없는 것으로 분석.
해결
- AWS IAM EC2 역할 부여.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kafka-cluster:*"
],
"Resource": "arn:aws:kafka:ap-northeast-2:178407589117:cluster/tmomi-cluster/0459436c-445a-41cf-b048-8b6c3a4b8f59-3"
},
{
"Effect": "Allow",
"Action": [
"kafka-cluster:*"
],
"Resource": "arn:aws:kafka:ap-northeast-2:178407589117:topic/tmomi-cluster/0459436c-445a-41cf-b048-8b6c3a4b8f59-3/reservation"
},
{
"Effect": "Allow",
"Action": [
"kafka-cluster:*"
],
"Resource": "arn:aws:kafka:ap-northeast-2:178407589117:group/tmomi-cluster/0459436c-445a-41cf-b048-8b6c3a4b8f59-3/group_1"
}
]
}
- 명령어로 테스트 진행 시, 정상 적으로 요청을 주고 받는 것을 확인.
- Kafka Client ← → MSK 각 요청 명령어.
# 토픽 생성
./kafka-topics.sh --create --topic reservation --bootstrap-server b-1.tmomicluster.aoe4ts.c3.kafka.ap-northeast-2.amazonaws.com:9098 --command-config /root/kafka_2.13-3.5.1/config/client.properties
# 토픽 목록 확인
./kafka-topics.sh --bootstrap-server b-1.tmomicluster.aoe4ts.c3.kafka.ap-northeast-2.amazonaws.com:9098 --command-config /root/kafka_2.13-3.5.1/config/client.properties --list
# 프로듀서
./kafka-console-producer.sh --topic reservation --bootstrap-server b-3.tmomicluster.aoe4ts.c3.kafka.ap-northeast-2.amazonaws.com:9098 --producer.config /root/kafka_2.13-3.5.1/config/client.properties
# 컨슈머
./kafka-console-consumer.sh --bootstrap-server b-3.tmomicluster.aoe4ts.c3.kafka.ap-northeast-2.amazonaws.com:9098 --topic reservation --consumer.config /root/kafka_2.13-3.5.1/config/client.properties --group group_1
참고
IAM 액세스 제어 - Amazon Managed Streaming for Apache Kafka
Amazon MSK 클러스터에 연결할 때 발생하는 문제 해결
원인 Elastic Beanstalk 배포 시 서버가 연결이 되지 않는 이슈
- Elastic Beanstalk로 tmomi-web을 배포 시, Spring boot가 무한으로 빌드를 시도함.
- 원인으로는 여러 오류가 존재함.
분석
[ 첫 번째 오류]
java.sql.SQLException: Access denied for user 'webapp'@'43.203.182.191' (using password: NO)
- ‘webapp’@‘43.203.182.191’ 유저가 접근할 수 없고, password를 사용하지 않는 다는 것으로 해석.
- tmomi-web 서버는 DB에 접근할 수 있는 고유의 계정과 비밀번호가 존재하며 비밀번호도 사용하고 있음.
- 하지만 계정이 다르며, Password를 사용하지 않는 다는 오류.
해결
-
Elastic Beanstalk에서 환경 → 구성 → 업데이트, 모니터링 및 로깅에서 환경 속성 값 설정이 잘못되어 있음.
-
SPRING_DATASOURCE_USERNAME 이 되어야 하는데, SPRING_DATASOURCE_USER 되어 기존 고유 계정 아이디를 인식하지 못한 것으로 분석.
-
SPRING_DATASOURCE_PASSWORD 가 존재하지 않아, 비밀번호를 사용하지 않는 것으로 분석.
-
수정 후 다시 배포 시, 위의 오류는 해결.
분석
[ 두 번째 오류 ]
Caused by: org.redisson.client.RedisTimeoutException: Command execution timeout for command: (PING), params: [], Redis client: [addr=redis:// :6379]
- ElastiCache에 접근하지 못하는 것으로 분석.
- Elastic Beanstalk의 환경 속성 값은 문제 없음.
해결
- 서버리스가 아니라 클러스터 모드를 비활성화 한 AWS 클라우드로 생성.
- 접근이 가능.
- 하지만 서버리스에서 해결이 아닌 방식을 바꾼 것으로, 서버리스 관점에서 해결 방안 필요.
분석
[ 세 번째 오류]
Error creating bean with name 'seatValidateRepository' defined in org.hh99.tmomi.global.redis.SeatValidateRepository defined in @EnableRedisRepositories declared on TmomiApplication: Cannot resolve reference to bean 'redisKeyValueTemplate' while setting bean property 'keyValueOperations’
- seatValidateRepository는 redisTemplate를 사용하여, key를 이용해 좌석의 유효성을 검증하는 기능임.
- Redis를 사용하기 위해, ElastiCache를 선택하였고, 위 오류처럼 bean생성이 되지 못하는 것으로 분석.
- 기존 포트와 연결 부분에서는 문제가 없는 것으로 분석.
해결
**@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)**
-
위 옵션은 Redis 서버에서 key-space notification 이벤트를 사용하도록 설정하는 것으로 이 옵션은 Redis 서버가 해당 이벤트를 지원할 때 사용할 수 있음.
-
그러나 AWS의 ElastiCache 서비스는 보안상의 이유로 Redis key-space notification를 지원하지 않음. 따라서, 이 옵션을 ElastiCache와 함께 사용하려고 하면 동작하지 않는다고함.
따라서, ElastiCache를 사용하는 경우,
EnableKeyspaceEvents.ON_STARTUP
옵션을 사용하지 않고 다른 방법을 사용해야 합니다. 예를 들어, Redis Pub/Sub 기능을 사용하여 필요한 이벤트를 수신하거나, 어플리케이션 로직에서 직접 key의 변화를 체크하는 방법 등이 있습니다. 이러한 대안에 대해서는 개발 요구사항과 환경에 따라 적절한 방법을 선택하면 됩니다.- 개발 및 발표 일정에 따른, 다른 방법을 선택.
-
기존 ElastiCache를 사용하지 않고, EC2 인스턴스에 Docker를 사용하여 Redis를 사용.
- 정상적으로 접근이 및 실행.
분석
[ 네 번째 오류 ]
- 첫 번째 사진에서는 Found 0 Elasticsearch repository interface. 문장을 보아, 찾을 수 없다는 것으로 분석
- 두 번째 사진의 중복되는 오류 한 문장.
2024-02-29T03:45:04.682+09:00 INFO 15253 --- [ main] .RepositoryConfigurationExtensionSupport : Spring Data Reactive Elasticsearch - Could not safely identify store assignment for repository candidate interface org.hh99.tmomi.domain.user.repository.UserRepository; If you want this repository to be a Reactive Elasticsearch repository, consider annotating your entities with one of these annotations: org.springframework.data.elasticsearch.annotations.Document (preferred), or consider extending one of the following types with your repository: org.springframework.data.elasticsearch.repository.ReactiveElasticsearchRepository
- 밑줄 친 부분을 번역하자면 저장소 후보 인터페이스에 대한 안전한 할당을 식별할 수 없다. 라고 분석
- 서비스에서 사용하고 있는 것은 Elastic Search인데, Reactive Elasticsearch를 찾는 것으로 분석.
해결
Disable reactive Elasticsearch client
data:
redis:
host: localhost
port: 6379
elasticsearch:
server: localhost:9200
autoconfigure:
exclude: org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration
- application.yml에 부분 추가
- Bootstrapping Spring Data Reactive Elasticsearch repositories in DEFAULT mode 에서 예외처리로 아예 AutoConfiguration 가져오지 않게 설정.
'항해99' 카테고리의 다른 글
항해99 실전 프로젝트 (28일차) (0) | 2024.03.02 |
---|---|
항해99 실전 프로젝트 (27일차) (0) | 2024.03.01 |
항해99 실전 프로젝트 (25일차) (0) | 2024.02.27 |
항해99 실전 프로젝트 (24일차) (0) | 2024.02.26 |
항해99 실전 프로젝트 (23일차) (0) | 2024.02.26 |