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
- DB 연결 정보를 Parameter Store에 저장:
- 예: DB_URL, DB_USER, DB_PASSWORD.
- 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>
추천 접근 방법
- 환경 변수 방식: 간단하고 빠르게 구현 가능.
- Parameter Store/Secrets Manager 방식: 보안과 유지보수 측면에서 더 우수.
- 빌드 프로파일 방식: 빌드 도구와 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 |