Amazon RDS DB 인스턴스를 Java 애플리케이션 환경에 추가 - AWS Elastic Beanstalk

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon RDS DB 인스턴스를 Java 애플리케이션 환경에 추가

Amazon Relational Database Service(Amazon RDS) DB 인스턴스를 사용하여 애플리케이션이 수집하고 수정하는 데이터를 저장할 수 있습니다. 데이터베이스를 환경에 연결하고 Elastic Beanstalk에서 관리하도록 하거나 외부에서 만들고 관리할 수 있습니다.

Amazon RDS를 처음 사용하는 경우 Elastic Beanstalk 콘솔을 사용하여 테스트 환경에 DB 인스턴스를 추가하고 애플리케이션을 인스턴스에 연결할 수 있는지 확인합니다.

환경에 DB 인스턴스를 추가하려면
  1. Elastic Beanstalk 콘솔을 연 다음 리전 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경 이름을 선택합니다.

    참고

    여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.

  3. 탐색 창에서 구성을 선택합니다.

  4. 데이터베이스 구성 범주에서 편집을 선택합니다.

  5. DB 엔진을 선택하고 사용자 이름과 암호를 입력합니다.

  6. 변경 사항을 저장하려면 페이지 하단에서 적용을 선택합니다.

DB 인스턴스를 추가하는 데 약 10분 정도 소요됩니다. 환경 업데이트가 완료되면 애플리케이션에서 다음 환경 속성을 통해 DB 인스턴스 호스트 이름과 기타 연결 정보를 사용할 수 있습니다:

속성 이름 설명 속성 값

RDS_HOSTNAME

DB 인스턴스의 호스트 이름입니다.

Amazon RDS 콘솔 연결 및 보안 탭의 엔드포인트입니다.

RDS_PORT

DB 인스턴스가 연결을 허용하는 포트입니다. DB 엔진마다 기본값이 다릅니다.

Amazon RDS 콘솔 연결 및 보안 탭의 포트입니다.

RDS_DB_NAME

데이터베이스 이름은 ebdb입니다.

Amazon RDS 콘솔 구성 탭의 DB 이름입니다.

RDS_USERNAME

데이터베이스에 구성된 사용자 이름입니다.

Amazon RDS 콘솔 구성 탭의 마스터 사용자 이름입니다.

RDS_PASSWORD

데이터베이스에 구성된 암호입니다.

Amazon RDS 콘솔에서는 참조용으로 사용할 수 없습니다.

내부 DB 인스턴스 구성에 대한 자세한 내용은 Elastic Beanstalk 환경에 데이터베이스 추가를 참조하세요. Elastic Beanstalk에서 사용하도록 외부 데이터베이스를 구성하는 방법은 Amazon RDS와 함께 Elastic Beanstalk 사용 단원을 참조하십시오.

데이터베이스에 연결하려면 애플리케이션에 적절한 드라이버 JAR 파일을 추가하고, 드라이버 클래스를 코드에 로드한 후, Elastic Beanstalk에서 제공하는 환경 속성으로 연결 객체를 생성합니다.

JDBC 드라이버 다운로드

선택한 DB 엔진에 JDBC 드라이버의 JAR 파일이 필요합니다. JAR 파일을 소스 코드에 저장하고, 데이터베이스에 대한 연결을 생성하는 클래스를 컴파일할 때 이를 클래스 경로에 포함시킵니다.

다음 위치에서 DB 엔진의 최신 드라이버를 찾을 수 있습니다.

JDBC 드라이버를 사용하려면 코드에서 Class.forName()와 연결을 생성하기 전에 DriverManager.getConnection()을 호출하여 이를 로드합니다.

JDBC는 다음 형식의 연결 문자열을 사용합니다.

jdbc:driver://hostname:port/dbName?user=userName&password=password

Elastic Beanstalk가 애플리케이션에 제공하는 환경 변수에서 호스트 이름, 포트, 데이터베이스 이름, 사용자 이름 및 암호를 검색할 수 있습니다. 드라이버 이름은 데이터베이스 유형 및 드라이버 버전별로 다릅니다. 다음은 드라이버 이름 예입니다.

  • mysqlMySQL의 경우

  • postgresql PostgreSQL용

  • oracle:thinOracle Thin의 경우

  • oracle:ociOracle OCI의 경우

  • oracle:oci8Oracle OCI 8의 경우

  • oracle:kprbOracle KPRB의 경우

  • sqlserverSQL Server의 경우

데이터베이스에 연결(Java SE 플랫폼)

Java SE 환경에서는 System.getenv()를 사용하여 환경에서 연결 변수를 읽습니다. 다음 코드 예제에서는 PostgreSQL 데이터베이스에 대한 연결을 생성하는 클래스를 보여 줍니다.

private static Connection getRemoteConnection() { if (System.getenv("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getenv("RDS_DB_NAME"); String userName = System.getenv("RDS_USERNAME"); String password = System.getenv("RDS_PASSWORD"); String hostname = System.getenv("RDS_HOSTNAME"); String port = System.getenv("RDS_PORT"); String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; logger.trace("Getting remote connection with connection string from environment variables."); Connection con = DriverManager.getConnection(jdbcUrl); logger.info("Remote connection successful."); return con; } catch (ClassNotFoundException e) { logger.warn(e.toString());} catch (SQLException e) { logger.warn(e.toString());} } return null; }

데이터베이스에 연결(Tomcat 플랫폼)

Tomcat 환경에서는 환경 속성이 System.getProperty()에 액세스할 수 있는 시스템 속성으로 제공됩니다.

다음 코드 예제에서는 PostgreSQL 데이터베이스에 대한 연결을 생성하는 클래스를 보여 줍니다.

private static Connection getRemoteConnection() { if (System.getProperty("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; logger.trace("Getting remote connection with connection string from environment variables."); Connection con = DriverManager.getConnection(jdbcUrl); logger.info("Remote connection successful."); return con; } catch (ClassNotFoundException e) { logger.warn(e.toString());} catch (SQLException e) { logger.warn(e.toString());} } return null; }

연결을 가져오거나 SQL 문을 실행하는 데 문제가 있는 경우, JSP 파일에 다음 코드를 배치해 봅니다. 이 코드는 DB 인스턴스에 연결하고 테이블을 만들며 여기에 씁니다.

<%@ page import="java.sql.*" %> <% // Read RDS connection information from the environment String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); String jdbcUrl = "jdbc:mysql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; // Load the JDBC driver try { System.out.println("Loading driver..."); Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver loaded!"); } catch (ClassNotFoundException e) { throw new RuntimeException("Cannot find the driver in the classpath!", e); } Connection conn = null; Statement setupStatement = null; Statement readStatement = null; ResultSet resultSet = null; String results = ""; int numresults = 0; String statement = null; try { // Create connection to RDS DB instance conn = DriverManager.getConnection(jdbcUrl); // Create a table and write two rows setupStatement = conn.createStatement(); String createTable = "CREATE TABLE Beanstalk (Resource char(50));"; String insertRow1 = "INSERT INTO Beanstalk (Resource) VALUES ('EC2 Instance');"; String insertRow2 = "INSERT INTO Beanstalk (Resource) VALUES ('RDS Instance');"; setupStatement.addBatch(createTable); setupStatement.addBatch(insertRow1); setupStatement.addBatch(insertRow2); setupStatement.executeBatch(); setupStatement.close(); } catch (SQLException ex) { // Handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } finally { System.out.println("Closing the connection."); if (conn != null) try { conn.close(); } catch (SQLException ignore) {} } try { conn = DriverManager.getConnection(jdbcUrl); readStatement = conn.createStatement(); resultSet = readStatement.executeQuery("SELECT Resource FROM Beanstalk;"); resultSet.first(); results = resultSet.getString("Resource"); resultSet.next(); results += ", " + resultSet.getString("Resource"); resultSet.close(); readStatement.close(); conn.close(); } catch (SQLException ex) { // Handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } finally { System.out.println("Closing the connection."); if (conn != null) try { conn.close(); } catch (SQLException ignore) {} } %>

결과를 표시하려면 JSP 파일의 HTML 부분의 본문에 다음 코드를 배치합니다.

<p>Established connection to RDS. Read first two rows: <%= results %></p>

데이터베이스 연결 문제 해결

애플리케이션 내에서 데이터베이스에 연결하는 중 문제가 발생한 경우, 웹 컨테이너 로그 및 데이터베이스를 검토합니다.

로그 검토

Eclipse 내에서 Elastic Beanstalk 환경의 모든 로그를 볼 수 있습니다. AWS Explorer 보기가 열려 있지 않은 경우, 도구 모음에서 주황색 AWS 아이콘 옆의 화살표를 선택한 후 AWS Explorer 보기 표시를 선택합니다. AWS Elastic Beanstalk와 환경 이름을 확장한 후, 서버의 컨텍스트(오른쪽 클릭) 메뉴를 엽니다. Open in WTP Server Editor를 선택합니다.

서버 보기의 로그 탭을 선택하여 환경의 집계 로그를 봅니다. 최신 로그를 열려면 페이지의 오른쪽 위 모서리의 새로 고침 버튼을 선택합니다.

아래로 스크롤하여 /var/log/tomcat7/catalina.out에서 Tomcat 로그를 찾습니다. 앞의 예제에서 웹 페이지를 여러 번 로드한 경우 다음과 같이 표시될 수 있습니다.

------------------------------------- /var/log/tomcat7/catalina.out ------------------------------------- INFO: Server startup in 9285 ms Loading driver... Driver loaded! SQLException: Table 'Beanstalk' already exists SQLState: 42S01 VendorError: 1050 Closing the connection. Closing the connection.

웹 애플리케이션이 표준 출력에 보내는 모든 정보가 웹 컨테이너 로그에 표시됩니다. 이전 예제에서 애플리케이션은 페이지가 로드될 때마다 테이블을 만들려고 시도합니다. 그 결과 첫 페이지 이후의 모든 페이지 로드에서 SQL 예외가 catch됩니다.

한 예를 들면 앞의 것이 허용됩니다. 그러나 실제 애플리케이션에서는 데이터베이스 정의를 스키마 객체에 보관하고, 모델 클래스 내에서 트랜잭션을 수행하며, 컨트롤러 서블릿으로 요청을 조정하십시오.

RDS DB 인스턴스에 연결

MySQL 클라이언트 애플리케이션을 사용하여 Elastic Beanstalk 환경의 RDS DB 인스턴스에 직접 연결할 수 있습니다.

먼저 RDS DB 인스턴스에 대한 보안 그룹을 열어 컴퓨터에서 오는 트래픽을 허용합니다.

  1. Elastic Beanstalk 콘솔을 연 다음 리전(Regions) 목록에서 해당 AWS 리전을 선택합니다.

  2. 탐색 창에서 환경을 선택한 다음 목록에서 환경 이름을 선택합니다.

    참고

    여러개의 환경을 보유한 경우 검색 창을 통해 환경 목록을 필터링합니다.

  3. 탐색 창에서 구성을 선택합니다.

  4. [데이터베이스] 구성 범주에서 [편집]을 선택합니다.

  5. 엔드포인트 옆에 있는 Amazon RDS 콘솔 링크를 선택합니다.

  6. RDS 대시보드 인스턴스 세부 정보 페이지의 보안 및 네트워크 아래에서 보안 그룹 옆의 rds-로 시작하는 보안 그룹을 선택합니다.

    참고

    데이터베이스에는 보안 그룹이라는 레이블이 지정된 항목이 여러 개 있을 수 있습니다. 기본 Amazon Virtual Private Cloud(Amazon VPC).가 없는 이전 계정이 있는 경우에만 awseb로 시작하는 첫 번째 항목을 사용합니다.

  7. 보안 그룹 세부 정보에서 인바운드 탭을 선택한 후 편집을 선택합니다.

  8. CIDR 형식으로 지정된 IP 주소에서 나가는 트래픽을 허용하는 MySQL(포트 3306)에 대한 규칙을 추가합니다.

  9. 저장(Save)을 선택합니다. 변경 사항이 즉시 적용됩니다.

환경에 대한 Elastic Beanstalk 구성 세부 정보로 돌아가서 엔드포인트를 적어 둡니다. 도메인 이름을 사용하여 RDS DB 인스턴스에 연결합니다.

MySQL 클라이언트를 설치하고 포트 3306에서 데이터베이스와의 연결을 시작합니다. Windows의 경우 MySQL 홈 페이지에서 MySQL Workbench를 설치하고 프롬프트를 따릅니다.

Linux의 경우 배포용 패키지 관리자를 사용하여 MySQL 클라이언트를 설치합니다. 다음 예제는 Ubuntu 및 기타 Ubuntu 계열 시스템에서 작동합니다.

// Install MySQL client $ sudo apt-get install mysql-client-5.5 ... // Connect to database $ mysql -h aas839jo2vwhwb.cnubrrfwfka8.us-west-2.rds.amazonaws.com -u username -ppassword ebdb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 117 Server version: 5.5.40-log Source distribution ...

연결한 후 SQL 명령을 실행하여 데이터베이스의 상태, 테이블과 행이 생성되었는지 여부 및 기타 정보를 볼 수 있습니다.

mysql> SELECT Resource from Beanstalk; +--------------+ | Resource | +--------------+ | EC2 Instance | | RDS Instance | +--------------+ 2 rows in set (0.01 sec)