AWS 기술 블로그
Amazon Aurora를 위한 Advanced JDBC Wrapper Driver 소개
이 글은 AWS Database Blog에 게시된 Introducing the Advanced JDBC Wrapper Driver for Amazon Aurora by Dave Cramer을 한국어 번역 및 편집하였습니다.
현대의 애플리케이션은 확장성과 복원력을 필수적으로 갖추어야 합니다. 특히 확장성이 가장 중요한데, 이는 애플리케이션이 워크로드 규모에 따라 수백만 사용자의 요청을 즉시 처리할 수 있는 능력을 의미합니다. 전자상거래, 금융 서비스, 게임과 같이 상태를 유지해야 하는(Stateful) 애플리케이션의 경우, 반드시 고가용성 데이터베이스를 구축해야 합니다.
2015년 Amazon Aurora가 출시되어 고객들은 하나의 Writer와 최대 15개의 저지연 Reader로 구성된 Aurora 클러스터에서 관계형 데이터베이스를 운영할 수 있게 되었습니다. 이를 통해 애플리케이션의 읽기 작업을 대규모로 확장할 수 있게 되었습니다. 그러나 다중 인스턴스를 지원하는 다른 데이터베이스들과 마찬가지로, 개발자들은 쓰기 전환(switchover)이나 장애 조치(failover)와 같은 특수한 상황을 처리하기 위해 복잡한 애플리케이션 로직을 구현해야 했습니다.
이제는 복잡한 엔드포인트 로직을 애플리케이션에 직접 구현할 필요 없이, Advanced JDBC (Java Database Connectivity) Wrapper Driver를 통해 전환이나 장애 조치를 처리할 수 있습니다. 이 드라이버는 AWS Secrets Manager 또는 AWS Identity and Access Management(IAM) 를 활용한 인증 처리 기능도 함께 제공합니다. Advanced JDBC Wrapper Driver는 Apache 2.0 라이선스로 제공되는 오픈 소스 프로젝트이며, GitHub에서 소스코드를 확인할 수 있습니다.
이 게시물에서는 Advanced JDBC Wrapper Driver의 일부 기능을 사용하는 방법에 대한 자세한 내용을 제공합니다.
Advanced JDBC Wrapper Driver의 기능
Advanced JDBC Wrapper Driver는 기본 PostgreSQL 또는 MySQL JDBC 드라이버를 “감싸서(wraps)”하여 함수 호출을 기본 드라이버에 위임하기 전에 장애조치 및 인증 기능을 추가합니다. 기본 드라이버를 사용하여 API를 실행하면 코드 복잡성이 줄어들고 추가 기능에만 초점을 맞출 수 있습니다.
Aurora는 단일 인스턴스 대신 DB 인스턴스 클러스터를 제공합니다. 각 연결은 특정 DB 인스턴스에서 처리됩니다. Aurora 클러스터에 연결할 때 지정하는 호스트 이름과 포트는 엔드페인트라고 하는 중간 처리기를 가리킵니다. Aurora는 이러한 연결을 추상화 하기 위해 엔드포인트 메커니즘을 사용합니다
다음 섹션에서는 이 드라이버를 통해 해결할 수 있는 주요 문제점들을 살펴보도록 하겠습니다.
전환
전환이란 읽기 전용 인스턴스(Reader)가 쓰기 가능 인스턴스(Writer)로 승격되는 것을 말합니다. 이 과정에서 Writer 구성이 변경되면서 Writer 인스턴스가 재시작 될 수 있습니다.
클라이언트는 Writer 또는 Reader 엔드포인트 중 하나에 연결할 수 있으며, 일반적으로 Writer 엔드포인트에 연결됩니다. 이 엔드포인트는 현재 Writer 인스턴스와 연결됩니다. 클러스터 매개 변수 변경이나 장애 조치로 인해 클러스터가 재시작될 때, Reader 중 하나가 새로운 Writer로 승격됩니다. 이때 DNS는 인스턴스 엔드포인트를 업데이트하여 Writer 엔드포인트가 새로운 Writer를 가리키도록 합니다. DNS 전파 지연으로 인해 이 과정은 최대 30초가 소요될 수 있습니다. 일반적으로 애플리케이션은 데이터베이스를 일시적으로 사용할 수 없는 상황 이후의 재연결 로직이 필요합니다. Advanced JDBC Wrapper Driver는 이러한 상황을 자동으로 감지하고 새로운 Writer로 전환하는 기능이 내장되어 있습니다. 이 드라이버는 Aurora 데이터베이스의 토폴로지 정보를 활용하여 약 6초 만에 연결을 전환할 수 있습니다.
IAM 통합
IAM을 사용하면 AWS 서비스와 리소스에 대한 사용자 접근 권한을 지정하고, 세부적인 권한을 중앙에서 관리하며, 접근 권한을 분석하여 AWS 전반의 권한을 세분화할 수 있습니다. IAM은 보안 강화를 위해 토큰(비밀번호)을 주기적으로 자동 변경합니다. 애플리케이션에서 IAM 토큰을 획득하고 사용하는 로직을 직접 구현할 수는 있지만, 토큰의 획득과 캐싱 처리로 인해 애플리케이션이 복잡해질 수 있습니다. 드라이버에 이러한 기능이 내장되어 있어 전환 과정에서 애플리케이션이 이러한 복잡한 처리를 할 필요가 없습니다. IAM 정책 생성에 대한 자세한 내용은 IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용 — Amazon Aurora를 참조하십시오.
Secrets Manager 통합
Secrets Manager를 사용하면 자격 증명을 중앙에서 저장하고 관리할 수 있습니다. 자격 증명을 중앙에 저장하면 보안 요구 사항에 따라 자격 증명을 교체할 수 있습니다. Secrets Manager는 연결 인증을 위한 사용자 이름과 암호를 저장하는 데 사용할 수 있습니다. 이 기능이을 활성화하면 드라이버가 Secrets Manager에서 자격 증명을 가져와 연결 인증에 사용합니다.
솔루션 개요
Advanced JDBC Wrapper가 없으면 데이터베이스를 연결하고 조회하는 일반적인 자바 코드는 다음과 같습니다.
전환으로 인해 연결이 실패하면 새로운 Writer가 정상 작동할 때까지 연결 시도는 계속 실패합니다. Advanced JDBC Wrapper Driver 없이는 DNS 전파가 완료될 때까지 기다려야 하므로, 애플리케이션이 30초 이상 오프라인 상태가 될 수 있습니다. Advanced Driver를 사용하면 재연결이 자동으로 처리됩니다. 드라이버는 초기 연결 시 클러스터의 토폴로지를 읽고 인스턴스 엔드포인트를 가져옵니다. 이를 통해 연결 실패 시 클러스터 내 모든 인스턴스의 IP 주소를 확인할 수 있습니다. 사용자 애플리케이션에서 연결이 실패하면 드라이버는 연결 복구를 위해 인스턴스들을 주기적으로 확인합니다. 연결이 설정되면 즉시 새로운 토폴로지를 읽어 새 Writer의 IP 주소를 확인하고 연결합니다. 이 모든 과정은 드라이버 내부에서 처리되므로 사용자 애플리케이션은 연결 끊김이나 실패를 감지하지 못합니다.
드라이버는 새로운 서버로 연결이 전환되었을 때 이를 애플리케이션에 알리기 위해 예외를 발생시킵니다. 또한 진행 중인 트랜잭션에서 오류가 발생했을 경우에는 트랜잭션이 실패했으며 재시도가 필요하다는 것을 알리는 예외를 발생시킵니다. 이러한 예외들을 적절히 식별하고 처리하기 위해서는 사용자 애플리케이션의 일부 수정이 필요합니다.
URL 구성은 PostgreSQL JDBC 드라이버의 경우 jdbc:aws-wrapper:postgreSQL이고 MySQL JDBC 드라이버의 경우 jdbc:aws-wrapper:mysql입니다. aws-advanced-wrapper 드라이버는 jdbc:aws-wrapper로 시작하는 모든 것을 허용하고, 구성의 다음 부분을 사용하여 래핑할 기본 드라이버를 결정합니다.
다음 코드는 Aurora PostgreSQL 클러스터에 연결하고 장애조치를 구성하는 방법을 보여줍니다.
드라이버는 DNS 캐시에 의존하지 않고 인스턴스 엔드포인트를 통해 새로운 Writer를 직접 찾기 때문에 더 빠른 재연결이 가능합니다. 일반적으로 연결 실패를 감지한 후 약 6초 이내에 재연결이 완료됩니다.
전제조건
AWS Advanced JDBC Wrapper는 JAVA Proxy 패턴을 사용하여 구현됩니다. 즉, 기존 PostgreSQL이나 MySQL 드라이버를 종속성으로 추가해야 합니다.
AWS Advanced JDBC Wrapper Driver를 사용하는 애플리케이션 만들기
다음 섹션에서는 AWS Advanced JDBC Wrapper Driver를 사용하는 애플리케이션을 만드는 데 필요한 단계를 간략하게 설명합니다.
Maven 의존성 주입
Maven을 사용하여 빌드하는 경우 pom.xml 파일에 다음 Maven 종속성을 추가합니다.
IAM 플러그인을 사용하려면 다음 사항이 필요합니다.
Secrets Manager 플러그인을 사용하려면 다음 사항이 필요합니다.
Code 업데이트
올바른 종속성을 설정한 후, AWS Advanced JDBC Wrapper를 사용하려면 애플리케이션에 몇 가지 변경 사항이 필요합니다. 연결 URL은 PostgreSQL의 경우 jdbc:aws-wrapper:postgreSQL이고 MySQL의 경우 jdbc:aws-wrapper:mysql이어야 합니다. URL의 첫 번째 부분은 AWS Advanced JDBC Wrapper를 로드하고, 두 번째 부분은 어떠한 기본 드라이버를 로드하고 중계(proxy)할지 알려줍니다 (Java Proxy 패턴).
드라이버 기능 지정
사용하려는 드라이버의 기능을 결정합니다. AWS JDBC Driver는 플러그인을 사용하여 JDBC 함수를 실행합니다. 플러그인은 모든 JDBC 메서드 호출에 추가 로직을 덧붙일 수 있는 확장 가능한 코드 모듈이라고 생각할 수 있습니다. AWS Advanced JDBC Wrapper Driver에는 여러 가지 내장 플러그인이 있습니다. 이는 wrapperPlugins 드라이버 속성에서 구성됩니다. 자세한 내용은 Connection Plugin Manager Parameters를 참조합니다. 기본 설정은 auroraConnectionTracker,failover,efm입니다. auroraConnectionTracker 플러그인은 장애조치 시 장애가 발생한 노드에 열려 있는 모든 연결이 닫히도록 합니다. 장애 조치 플러그인은 실제 장애조치 감지 및 재연결을 처리합니다. efm 플러그인이 호스트를 적극적으로 모니터링하여 장애조치 시 재접속 시간을 단축합니다.
Secrets Manager 통합
AWS는 보안 정보를 저장할 수 있는 Secrets Manager 서비스를 제공합니다. AWS Advanced JDBC Wrapper Driver는 이 서비스와 연동되는 플러그인을 제공하여, 사용자 이름과 비밀번호를 Secrets Manager에 안전하게 저장하고 인증에 필요한 정보를 자동으로 가져올 수 있습니다.
필수 속성은 REGION_PROPERTY, SECRET_ID_PROPERTY, PLUGINS 세 개입니다.
다음 코드 블록은 예시를 보여줍니다.
IAM 인증 통합
Advanced JDBC Wrapper는 IAM 인증을 지원합니다. IAM 데이터베이스 인증을 사용할 때 호스트 URL은 유효한 Amazon 엔드포인트여야 하며, 사용자 지정 도메인이나 IP 주소가 아니어야 합니다. 예: DB-Identier.cluster-xyz.US-East-2.rds.Amazonaws.com.
IAM 인증을 하려면 AWS Java SDK RDS v2.x를 CLASSPATH에 별도로 포함해야 합니다. AWS Java SDK RDS는 런타임 종속성이므로 해결되어야 합니다. AWS SDK의 경우, 인증을 위해 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY를 설정해야합니다.
IAM 데이터베이스 인증은 특정 데이터베이스 엔진으로 제한됩니다. 제한 사항 및 권장 사항에 대한 자세한 내용은 MariaDB, MySQL 및 PostgreSQL IAM 데이터베이스 인증을 참조합니다.
IAM 인증 구성
IAM 인증을 설정하려면 다음 단계를 완료합니다.
- Amazon RDS 콘솔에서 기존 데이터베이스에서 IAM 데이터베이스 인증을 활성화하거나 IAM 데이터베이스 인증이 설정된 새 데이터베이스를 생성합니다.
- IAM 데이터베이스 인증을 위한 IAM 정책을 설정합니다.
- IAM 데이터베이스 인증을 사용하여 데이터베이스 계정을 생성합니다. 기본 로그인으로 선택한 데이터베이스에 연결합니다:
-
- MySQL 데이터베이스의 경우, 다음 명령으로 새 사용자를 생성합니다.
CREATE USER example_user_name IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; - PostgreSQL 데이터베이스의 경우, 다음 명령으로 새 사용자를 생성합니다.
CREATE USER db_userx; GRANT rds_iam TO db_userx;
- MySQL 데이터베이스의 경우, 다음 명령으로 새 사용자를 생성합니다.
Advanced JDBC Wrapper Driver로 IAM 인증을 사용
다음 코드는 드라이버와 함께 IAM 인증을 사용하는 방법의 예를 보여줍니다.
정리
이 블로그에서 실습하면서 생성한 Aurora 클러스터의 IAM 자격 증명과 Secrets Manager의 보안 정보는 실습 완료 후 반드시 삭제하시기 바랍니다.
요약
AWS Advanced JDBC Wrapper는 AWS의 IAM과 Secrets Manager, 그리고 Aurora의 클러스터 구성을 활용하여 인증 및 장애 조치를 위한 통합 솔루션을 제공합니다. 특히 Aurora의 기능을 활용하여 장애 조치 시간을 대폭 단축시킬 수 있습니다.
이외에도 드라이버가 제공하는 다양한 기능들은 향후 게시물에서 자세히 다룰 예정입니다. 그때까지 이 게시물에 대한 여러분의 의견을 댓글로 공유해 주시기 바랍니다. 더 자세한 내용과 예시는 GitHub 프로젝트에서 확인하실 수 있습니다..