ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot와 함께하는 AWS RDS IAM Auth 활용법(2)
    Dev&Ops 2025. 12. 31. 22:33

    안녕하세요! 

     

    AWS Community Builder이자 DevOps Engineer인 zerone-code입니다.

     

    이전 글에서는 RDS에 접근할 때, IAM을 설정하는 방법과 더불어 Lambda를 활용해서 MySQL RDS에 접근하는 방법에 대해 알아봤습니다.

     

    이번 글에서는 Springboot에서 이 방법을 적용한 코드 수준의 적용법을 알아보도록 하겠습니다.

     

    궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해 드리도록 하겠습니다.

    잘 읽으셨다면 많은 공감과 구독 부탁드립니다!


     

    이전에 다뤘던 IAM Auth를 사용해서 RDS에 접근하는 Flow를 다시 확인하고 시작하도록 하겠습니다.

                    +--------------------+
                    |      AWS IAM       |
                    |--------------------|
                    | rds-db:connect     |
                    | STS Token (15min)  |
                    +--------------------+
                              ▲
                              |
            (3) Validate Token|
                              |
       +--------------------------------------+
       |           AWS RDS (MySQL/Postgres)  |
       +--------------------------------------+
              ▲                         ▲
              | (2) Auth Token          |
              |                         |
    +-------------------+      +-------------------+
    | Lambda / EC2 /   |      | Local Developer   |
    | ECS Task / App   |      | Environment       |
    +-------------------+      +-------------------+
              │
              │ (1) Assume Role / Generate Token
              ▼
       +-------------------+
       | AWS SDK or CLI    |
       +-------------------+
    

    요약 흐름

    1. 애플리케이션이 IAM Role을 이용해 토큰 발급 요청
    2. AWS RDS Auth Token 생성 (15분 유효)
    3. 애플리케이션이 이 토큰으로 RDS 로그인
    4. RDS가 AWS IAM에 토큰 검증 → OK 시 접속 허용

     

    자, 이제 흐름을 머릿 속에 생각하면서 아래 코드를 살펴보도록 하겠습니다.

    https://github.com/YoungJinJung/springboot-sample

     

    GitHub - YoungJinJung/springboot-sample

    Contribute to YoungJinJung/springboot-sample development by creating an account on GitHub.

    github.com

     

    위 코드는 Writer와 Reader Datasource를 분리해서 적용하는 Multi Datasource를 적용한 코드입니다. 

     

    크게 보셔야 할 파일을 먼저 library dependency 설정파일인 build.gradle, application 설정파일인 src/main/resources/application-dev.yml 과 Datasouce를 설정한 main 하위의 configuration/datasource 경로의 Java 파일들을 자세히 봐주시면 되겠습니다.

    1️⃣ build.gradle

    먼저 제일 위에 부분의 aws-advanced-jdbc-wrapper은 aws에서 만든 jdbc connector를 사용하기 위한 library 입니다. 그리고 사용할 DB에 따른 library도 지정해줘야합니다. 샘플 코드에서는 postgesql을 사용합니다.

     

    애플리케이션AWS Advanced JDBC Wrapper표준 JDBC 드라이버AWS RDS/Aurora

     

    그리고 그 아래 는 각각 IAM Auth를 RDS에 사용하기 위해 필요한 것들입니다. sts를 사용해서 IAM Role로 RDS접근하는 것이기 때문에 세 가지 library가 모두 필요합니다.

    2️⃣ application-dev.yml

    이 설정을 보시면 import 부분은 AWS SecretsManager를 통해서 가져올 값을 지정하는 부분입니다. 예제에서는 /secret/sample_dev라는 이름을 가지 SecretsManager리소스를 가져와서 사용하게 됩니다.

     

    그리고 그 아래 writer 설정과 reader 설정을 보시면 비슷하지만 약간 다른데요, url과 username이 약간 다릅니다. driver-class-name에는 aws jdbc wrapper를 사용하기 위해 클래스를 지정해주고, 그 아래는 url과 username을 지정하게 됩니다. 

    url의 경우에는 아래와 같은 형태로 지정해주시면 됩니다.

    jdbc:aws-wrapper:postgresql://<cluster-writer|reader>:<port>/<db>?wrapperPlugins=iam&iamRegion=<region>&sslMode=require

    3️⃣ Multi datasource configuration 

    먼저 위에 Qualifier가 붙은 객체를 보면, 해당 객체는 2번 과정의 application-dev.yml에서 설정했던 writer관련 설정을 가진 객체입니다. 해당 객체의 값 중 url, username을 가지고 getAuthToken 함수의 매개변수로 넘겨서 Auth 토큰을 생성하는데 넘겨줍니다.

    getAuthToken 함수를 확인해보면 매개변수로 받은 url을 가지고 먼저 host와 port를 parsing하는 과정을 거칩니다. 이 과정을 거치는 이유는 GenerateAuthenticationTokenRequest를 보낼 때, parameter로 설정하는데 사용하기 위해서 분리하게 됩니다. 

     

    그리고 그 아래에서 보면 username, 그리고 parsing된 url 정보인 endpoint 배열의 요소를 각각 설정에 넣고 token을 요청하고 성공적으로 값이 생성되면 이를 반환하고, 아닌 경우에는 excpetion을 출력하는 과정을 거치게 됩니다.

     

    4️⃣  적용 후 Appliation 확인

    EC2에 Sample용 Application을 구성해서, dev profile로 기동을 해보면 빨간 부분 처럼 Cluster Endpoint 중 writer와 reader의 endpoint에 각각 연결된 것을 확인해 보실 수 있습니다.

    이렇게 AWS RDS IAM Auth를 Springboot 에 적용하는 부분을 코드 수준에서 살펴봤습니다. 

     

    이전 블로그와 이번 블로그에서 했던 과정을 총 정리해보도록 하겠습니다.

    크게 3가지 부분으로 나눠보면 DB에서 설정해야하는 부분, IAM에서 설정해야하는 부분, SpringBoot App에서 설정해야하는 부분으로 나눠볼 수 있습니다

     

    DB에서 설정해야하는 부분으로는 IAM Role로 제어할 DB용 User를 생성해주는 것이 필요합니다. 이 때 Password는 필요 없다는 점을 기억해주시면 됩니다.

     

    IAM에서 설정해야하는 부분으로는 rds-connect policy로 앞에서 생성한 Aurora Cluster에 해당하는 DB User를 resource로 지정해주는 것이 필요합니다.

     

    SpringBoot App에서 설정해야하는 부분으로는 1️⃣ 처럼 build.gradle에서 library 의존성을 맞춰서 설정해주고 2️⃣ 3️⃣부분에 대한 설정을 적용하려는 환경에 맞춰서 적절히 수정해주시면 됩니다. writer만 사용하는 경우에는 multi datasource가 필요 없겠죠?

     

    이렇게 세가지 부분을 설정해서 적용하면 ID/Password기반보다 안전한 Application 보안을 챙길 수 있습니다. 막상 해보시면 쉽게 적용할 수 있습니다.(운영까지 적용하는데 3일도 걸리지 않았습니다)

     

    기존에 username/password 방식이었던 방식을 이번 기회에 한번 바꿔보시는 건 어떨까요?

     

    궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해 드리도록 하겠습니다.

    잘 읽으셨다면 많은 공감과 구독 부탁드립니다!

     

    연말 마지막 글이 되겠네요! 모두들 새해 복 많이 받으시길 바랍니다!

    Reference

    https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.Java.html

     

    Connecting to your DB instance using IAM authentication and the AWS SDK for Java - Amazon Relational Database Service

    Connecting to your DB instance using IAM authentication and the AWS SDK for Java You can connect to an RDS for MariaDB, MySQL, or PostgreSQL DB instance with the AWS SDK for Java as described following. Prerequisites The following are prerequisites for con

    docs.aws.amazon.com

     

    https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java_rds_code_examples.html

     

    Amazon RDS examples using SDK for Java 2.x - AWS SDK for Java 2.x

    Amazon RDS examples using SDK for Java 2.x The following code examples show you how to perform actions and implement common scenarios by using the AWS SDK for Java 2.x with Amazon RDS. Basics are code examples that show you how to perform the essential ope

    docs.aws.amazon.com

     

    'Dev&Ops' 카테고리의 다른 글

    Why blog?  (4) 2022.01.29
Designed by Tistory.