AWS

Lambda Java DB 연결 변수 관리

devfinger 2024. 11. 18. 20:22

1. 환경 변수로 관리하기

AWS Lambda는 환경 변수를 제공하며, 이를 통해 환경별로 설정을 관리할 수 있습니다.

Java 코드에서 환경 변수 사용

package example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnector {

    public Connection getConnection() throws SQLException {
        // 환경 변수에서 DB 연결 정보 가져오기
        String dbUrl = System.getenv("DB_URL");
        String dbUser = System.getenv("DB_USER");
        String dbPassword = System.getenv("DB_PASSWORD");

        return DriverManager.getConnection(dbUrl, dbUser, dbPassword);
    }
}

 

Terraform에서 환경 변수 설정

resource "aws_lambda_function" "lambda_function" {
  function_name   = "lambda_with_db"
  s3_bucket       = aws_s3_bucket.lambda_code_bucket.bucket
  s3_key          = aws_s3_object.lambda_function_jar.key
  handler         = "example.MainLambdaHandler::handleRequest"
  runtime         = "java11"
  role            = aws_iam_role.lambda_exec_role.arn

  environment {
    variables = {
      DB_URL      = "jdbc:mysql://test-db.local:3306/mydb" # 로컬 테스트 환경
      DB_USER     = "test_user"
      DB_PASSWORD = "test_password"
    }
  }

  vpc_config {
    subnet_ids         = [aws_subnet.private_subnet_1.id, aws_subnet.private_subnet_2.id]
    security_group_ids = [aws_security_group.lambda_sg.id]
  }
}

resource "aws_lambda_function" "lambda_function_prod" {
  function_name   = "lambda_with_db_prod"
  s3_bucket       = aws_s3_bucket.lambda_code_bucket.bucket
  s3_key          = aws_s3_object.lambda_function_jar.key
  handler         = "example.MainLambdaHandler::handleRequest"
  runtime         = "java11"
  role            = aws_iam_role.lambda_exec_role.arn

  environment {
    variables = {
      DB_URL      = "jdbc:mysql://aurora-prod.cluster-1234567890.ap-northeast-2.rds.amazonaws.com:3306/mydb"
      DB_USER     = "prod_user"
      DB_PASSWORD = "prod_password"
    }
  }

  vpc_config {
    subnet_ids         = [aws_subnet.private_subnet_1.id, aws_subnet.private_subnet_2.id]
    security_group_ids = [aws_security_group.lambda_sg.id]
  }
}

 

  • 테스트 환경과 운영 환경을 별도로 구성하여 관리합니다.
  • 운영 환경에서는 Aurora Serverless DB 연결 정보를 사용하고, 로컬 테스트 환경에서는 로컬 DB 정보를 사용합니다.

2. AWS Systems Manager Parameter Store 또는 Secrets Manager 사용

DB 연결 정보를 더 안전하고 중앙화된 방식으로 관리하려면 AWS Systems Manager Parameter Store 또는 AWS Secrets Manager를 사용하는 것이 좋습니다.

AWS Systems Manager Parameter Store

  1. DB 연결 정보를 Parameter Store에 저장:
    • 예: DB_URL, DB_USER, DB_PASSWORD.
  2. Lambda 함수가 Parameter Store에서 값을 가져오도록 코드 작성:
import com.amazonaws.services.ssm.*;
import com.amazonaws.services.ssm.model.*;

public class DatabaseConnector {

    private String getParameter(String name) {
        AWSSimpleSystemsManagement ssm = AWSSimpleSystemsManagementClientBuilder.defaultClient();
        GetParameterRequest request = new GetParameterRequest().withName(name).withWithDecryption(true);
        return ssm.getParameter(request).getParameter().getValue();
    }

    public Connection getConnection() throws SQLException {
        String dbUrl = getParameter("DB_URL");
        String dbUser = getParameter("DB_USER");
        String dbPassword = getParameter("DB_PASSWORD");

        return DriverManager.getConnection(dbUrl, dbUser, dbPassword);
    }
}

 

 

     3. Lambda에 적절한 IAM 권한 추가:

resource "aws_iam_policy" "ssm_policy" {
  name   = "AllowSSMParameterAccess"
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action   = ["ssm:GetParameter"],
        Effect   = "Allow",
        Resource = "arn:aws:ssm:ap-northeast-2:123456789012:parameter/*"
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "attach_ssm_policy" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = aws_iam_policy.ssm_policy.arn
}

 

3. 환경 변수와 Parameter Store 결합

Terraform에서 Parameter Store를 직접 참조하여 Lambda의 환경 변수로 설정할 수도 있습니다:

data "aws_ssm_parameter" "db_url" {
  name = "DB_URL"
}

resource "aws_lambda_function" "lambda_function" {
  function_name   = "lambda_with_db"
  s3_bucket       = aws_s3_bucket.lambda_code_bucket.bucket
  s3_key          = aws_s3_object.lambda_function_jar.key
  handler         = "example.MainLambdaHandler::handleRequest"
  runtime         = "java11"
  role            = aws_iam_role.lambda_exec_role.arn

  environment {
    variables = {
      DB_URL      = data.aws_ssm_parameter.db_url.value
      DB_USER     = "prod_user"
      DB_PASSWORD = "prod_password"
    }
  }

  vpc_config {
    subnet_ids         = [aws_subnet.private_subnet_1.id, aws_subnet.private_subnet_2.id]
    security_group_ids = [aws_security_group.lambda_sg.id]
  }
}

 

4. 빌드 시 적용하도록 설정

테스트/운영 환경에 따라 빌드 파일을 다르게 구성하려면 Maven 또는 Gradle에서 프로파일을 사용하는 방법이 있습니다.

Maven 프로파일 예시

<profiles>
    <profile>
        <id>local</id>
        <properties>
            <db.url>jdbc:mysql://test-db.local:3306/mydb</db.url>
            <db.user>test_user</db.user>
            <db.password>test_password</db.password>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <db.url>jdbc:mysql://aurora-prod.cluster-1234567890.ap-northeast-2.rds.amazonaws.com:3306/mydb</db.url>
            <db.user>prod_user</db.user>
            <db.password>prod_password</db.password>
        </properties>
    </profile>
</profiles>

 

추천 접근 방법

  1. 환경 변수 방식: 간단하고 빠르게 구현 가능.
  2. Parameter Store/Secrets Manager 방식: 보안과 유지보수 측면에서 더 우수.
  3. 빌드 프로파일 방식: 빌드 도구와 CI/CD 파이프라인에 익숙하다면 사용.

테스트와 운영 환경의 DB 설정을 쉽게 전환하려면 환경 변수와 Parameter Store를 조합하여 사용하는 것을 추천합니다.

 
4o

'AWS' 카테고리의 다른 글

vpc flow logs, cloudwatch, cloudtrail  (0) 2024.11.28
Java Lambda template.yaml 관리  (0) 2024.11.18
Endpoint 서비스 범주  (0) 2024.11.11
Lambda 대상 추가  (0) 2024.11.11
AWS terraform data 사용법  (0) 2024.10.25