AWS Elastic Beanstalk 시작하기 - 2. RDS 연동하기

우리는 앞에서 다음과 같이 두 가지 AWS에 관련된 글을 살펴보았다.

이 두가지 설치 방법은 각각 웹 서비스를 운영하는데 가장 기초가 되는 방법이다. 이제 AWS Beanstalk에서 AWS RDS를 연동하여 사용하는 방법을 살펴보자.

RDS DB 인스턴스 연결

우리는 RDS 생성에 관련된 문서에서 Endpoint라는 것을 다루었다. 이 Endpoint를 사용하여 어플리케이션이나 소스코드에서 RDS DB 인스턴스에 연결할 수 있다. MySQL 데이터베이스 엔진 기반 DB 인스턴스에 연결하기3 에서 자세한 내용을 참조하면 된다.

RDS에 커넥션 테스트를 해보자. IntlliJ에서는 Data Source and Drivers라는 다이얼로그에서 간편하게 데이터베이스 커넥션 정보를 가지고 엑세스 테스트를 진행할 수 있다.

  • Host : RDS 인스턴스 Endpoint
  • Port : RDS 인스턴스 포트번호
  • Database : RDS 인스턴스의 데이터베이스, 우리는 앞에서 hbn_demo_database로 지정하였다.
  • User : RDS 인스턴스의 Master username
  • Password : RDS 인스턴스의 Master password

Security Group 설정

우리는 앞서 Security Group 에 대한 이야기를 나누지 않았다. 이 부부는 여러가지 깊은 내용을 다룰 수 있는 부분이라 여기서는 간단하게 외부에서 RDS에 접근할 수 있는 방법과 제한하는 방법만 소개한다. RDS Dashboard에서 우리가 생성한 RDS 인스턴스를 클릭하면 상세내용이 나오는데 항목중에 Security Group 이라는 것을 확인할 수 있다.

링크를 클릭하면 다음과 같이 Security Group을 수정하는 화면이 나타난다. 여기서는 우리가 살펴볼 것은 Inbound 항목이다. 이 것은 특정 외부에서 들어오는 네트워크를 허용하는 것을 말한다. Edit 버튼을 클릭하면 유명한 서비스들의 목록이 나오는데 MySQL/Aurora 항목을 선택하면 자동으로 TCP, Port Range가 선택이 되어지고 Source 에 입력박스가 생기는데 이 곳에 접근을 허용할 IP를 입력하면 된다.

프로그램에서 RDS 연결

클라이언트 툴에서 RDS MySQL에 커넥션을 한 것과 같이 소스코드에서도 Endpoint를 가지고 연결해서 사용하면 된다.

Spring Boot를 사용한다고 가정을 한다. 이 때 RDS MySQL연결은 다음과 같이 설정한다.

spring.datasource.url=jdbc:mysql://RDS엔드포인트:3306/RDS데이터베이스명  
spring.datasource.username=RDS유저명  
spring.datasource.password=RDS비밀번호  
spring.datasource.driver-class-name=com.mysql.jdbc.Driver  

예를 들어 다음과 같이 할 수 있다.

spring.datasource.url=jdbc:mysql://hbn-rds-demo-mysql.abcdefg.ap-northeast-2.rds.amazonaws.com:3306/hbn_demo_database  
spring.datasource.username=admin  
spring.datasource.password=password  
spring.datasource.driver-class-name=com.mysql.jdbc.Driver  

MyBatis 와 RDS 연동

만약 Spring 프로젝트에서 MyBatis를 사용하고 있다면 다음과 같이 사용할 수 있다.

우선 RDS MySQL 데이터베이스의 정보를 가진 Data Source를 위에서 정의한것과 동일하다고 가정한다. 이 데이터베이스에는 Users라는 테이블이 존재하고 이 테이블 안에는 name 이라는 컬럼이 있다. 그리고 데이터로 saltfactory를 저장하고 있다고 가정한다.

create table users (  
  name VARCHAR(20)
);
insert into users VALUES ('saltfactory');  

Spring Boot에서는 application의 설정을 classpath://application.properties 파일에 저장을 한다.

이 파일을 열어서 위에서 정의한 DataSource의 내용을 저장한다.

spring.datasource.url=jdbc:mysql://hbn-rds-demo-mysql.abcdefg.ap-northeast-2.rds.amazonaws.com:3306/hbn_demo_database  
spring.datasource.username=admin  
spring.datasource.password=password  
spring.datasource.driver-class-name=com.mysql.jdbc.Driver  

MyBatis는 Mapper를 사용하여 데이이터베이스에서 데이터를 조회하여 POJO 객체로 데이터를 매핑을 한다. 이때 Mapper XML4 을 사용하거나 @annotation5 을 사용할 수 있다.

우리는 @annotation을 사용할 것이다. 우선 Users 테이블에 있는 데이터를 객체로 매핑할 User.java 파일을 생성한다.

package net.saltfactory.demo.springboot.models;

/**
 * Created by saltfactory on 26/01/2017.
 */
public class User {  
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

다음은 데이터베이스에서 SQL을 실행시켜 데이터를 조회해서 객체로 매핑할 Mapper 클래스 UserMapper.java를 생성한다.

package net.saltfactory.demo.springboot.models;

import org.apache.ibatis.annotations.Mapper;  
import org.apache.ibatis.annotations.Param;  
import org.apache.ibatis.annotations.Select;

/**
 * Created by saltfactory on 26/01/2017.
 */
@Mapper
public interface UserMapper {  
    @Select("SELECT * FROM users WHERE name = #{name}")
    public User findUser(@Param("name") String name);
}

간단하게 브라우저에서 /hello/{name}을 요청하면 이 name을 데이터베이스에서 조회해서 뷰 화면에 출력하는 GreetingController.java를 생성한다.

package net.saltfactory.demo.springboot.controllers;


import net.saltfactory.demo.springboot.models.User;  
import net.saltfactory.demo.springboot.models.UserMapper;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by saltfactory on 26/01/2017.
 */
@RestController
public class GreetingController {  
    @Autowired
    UserMapper userMapper;

    @RequestMapping("/hello/{name}")
    String hello(@PathVariable String name) {
        User user = userMapper.findUser(name);
        return "Hello, " + user.getName() + "!";
    }
}

이제 모든 설정을 완료했다. SpringBoot를 실행해서 브라우저에서 http://localhost:8080/hello/saltfactory 라고 입력해보자. MyBatis를 통해 RDS에서 MySQL에서 saltfactory 라는 이름을 조회해서 뷰에 출력해준 것을 확인할 수 있다.

Elastic Beanstalk 와 RDS 연동

Spring 기반 프로젝트는 application.properties에서 환경변수를 읽어와서 적용할 수 있는데 다음과 같이 수정한다.

spring.datasource.url=jdbc:mysql://${RDS_MYSQL_HOST}:${RDS_MYSQL_PORT}/${RDS_MYSQL_DATABASE}  
spring.datasource.username=${RDS_MYSQL_USERNAME}  
spring.datasource.password=${RDS_MYSQL_PASSWORD}  
spring.datasource.driver-class-name=com.mysql.jdbc.Driver  
  • RDS_MYSQL_HOST : EBS에서 RDS의 endpoint를 저장할 환경변수
  • RDS_MYSQL_PORT : EBS에서 RDS의 port를 저장할 환경변수
  • RDS_MYSQL_DATABASE : EBS에서 RDS의 데이터베이스 이름을 저장할 환경변수
  • RDS_MYSQL_USERNAME : EBS에서 RDS의 유저네임을 저장할 환경변수
  • RDS_MYSQL_PASSWORD : EBS에서 RDS의 비빌번호를 저장할 환경변수

이제 EBS Dashboard를 열어보자. Configuration 메뉴를 클릭한다.

Configuration 메뉴에서는 EBS의 고급설정을 변경할 수 있다. Software Configuration 메뉴를 클릭한다.

Software Configuration 에서 스크롤을 내려보면 Environment Properties 항목이 나타난다. 여기에서 앞에서 application.properties에 사용하는 환경변수 항목을 입력하고 값을 저장한다.

마지막으로 수정한 소스코드를 .war로 압축해서 새로운 버전으로 0.0.2을 입력하고 deploy 시킨다.

성공적으로 deploy 가 완료되면 버전정보가 0.0.2 로 업데이트된 것을 확인할 수 있다.

deploy가 성공적으로 완료되었으면 브라우저에서 접근해서 EBS가 RDS에 정상적으로 접근해서 데이터를 조회하는지 확인해보자.

http://hbn-ebs-env-demo-spring-release.ap-northeast-2.elasticbeanstalk.com/hello/saltfactory

이 포스팅에서 소개한 AWS Elastic Beanstalk + RDS MySQL + MyBatis 의 예제 소스는 https://github.com/saltfactory/saltfactory-demo-springboot/releases/tag/rds-mysql-mybatis 2 에서 다운로드 받을 수 있다.

참조