티스토리 뷰
개요
새로운 서비스가 시작하면서 AWS관리부터 devOps, BE 개발을 전반적으로 다 관리하고 있다.
그러다보니 서버 설정을 만질때가 많은데, 그중에서 관리가 특히 필요한 것들이 외부 API 키나 DB 커넥션 관련 정보다.
1. 누출되면 데이터를 싹 털릴 수도 있고, 무분별한 사용으로 비용이 치솟을 수 있는 것들.
2. 기간 만료/갱신 등으로 인해 수시로 변경되고, 서버 프로필 별로 따로 관리가 필요한 것들.
이런 것들을 한번에 관리할 수 있도록 서비스를 지원하는게 AWS Parameter Store다.
이번 포스팅에는 아래와 같이 사용법을 정리해보려고 한다.
1. Terraform으로 db관련 간단한 파라미터를 등록
2. ECS Task의 IAM 정책에 ssm 작업 추가
3. SpringBoot 3.0에서 사용하는 법
Terraform으로 정의하기
프로바이더나 기본 정의는 생략하고 들어간다.
스프링부트에서 DB를 사용하기 위한 세가지 정보를 파라미터 스토어에 등록했다.
resource "aws_ssm_parameter" "db_url" {
name = "/[앱이름]/datasource/url"
type = "String"
value = "jdbc:[내 DB URL]"
}
resource "aws_ssm_parameter" "user_name" {
name = "/[앱이름]/datasource/user_name"
type = "String"
value = "[유저 이름]"
}
resource "aws_ssm_parameter" "db_password" {
name = "/[앱이름]/datasource/password"
type = "SecureString"
value = "[비밀번호]"
key_id = "alias/aws/ssm"
}
비밀번호는 SecureString 타입을 사용했고, key_id는 ssm에서 제공하는 기본 id이다.
kms에서 추가로 키를 만들어서 사용할 수 도 있는데, 이 때는 별도의 IAM 지정이 필요하다.
이렇게 만들고 파라미터 스토어에 들어가보면 파라미터들이 잘 생성된 것을 확인할 수 있다.
ECS Task에 IAM 지정하기
가장 많이 놓치는 부분이 내가 사용할 서버에 SSM의 paramter 접근 권한을 주는 것이다.
이번 프로젝트에서는 ECS Fargate를 사용해서 Task에 권한을 줬다.
ECS 말고 다른 AWS 리소스를 사용한다고해도 IAM 정책은 반드시 등록해줘야한다.
resource "aws_iam_policy" "ecs_task_policy" {
name = "ecs-task-policy"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
...,
{
Action = [
"ssm:GetParameter",
"ssm:GetParameters",
"ssm:GetParametersByPath"
],
Effect = "Allow",
"Resource": "*" // 최소 권한을 주는 것을 권장, 내가 사용할 리소스의 arn
}
]
})
}
이렇게 사용하면 ECS fargate 컨테이너에서 파라미터 스토어의 데이터에 접근할 수 있는 권한이 생긴다.
SpringBoot에서 사용하기
SpringBoot 3.2.2 버전 이상 기준이다.
2.0대 버전은 사용법이 다르니 버전확인을 꼭 해야한다.
gradle 의존성 추가
implementation(platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.1.1"))
implementation("io.awspring.cloud:spring-cloud-aws-starter-parameter-store")
application.yaml 설정
사용법은 진짜 간단하다.
spring:
config:
import: aws-parameterstore:/[앱이름]/datasource/
activate:
on-profile: dev
datasource:
url: ${url}
username: ${user_name}
password: ${password}
이렇게 application.yaml에 파라미터 스토어에서 가져온 값이 정의되면
@Value를 통해서나 생성자를 통한 데이터 주입을 통해서 어플리케이션 내부에서도 사용 가능하다.
하기 쉬운 실수
설정을 잘 했음에도 아래와 같은 에러가 나는 경우가 있다.
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is java.lang.RuntimeException: Driver org.postgresql.Driver claims to not accept jdbcUrl, ${datasource/url}
이 문제는 아래와 같이 정의해서이다.
spring:
config:
import: aws-parameterstore:/[앱이름]/
activate:
on-profile: dev
datasource:
url: ${datasource/url}
username: ${datasource/user_name}
password: ${datasource/password}
파라미터 스토어에서 값을 가져올 때 최종 뎁스의 경로만 가져오게 해야한다.
위와같이 한 뎁스 위의 값을 가져올 수 없어서 값이 없다고 하는 것 같다.
이정돈 지원해 줄 수 있지 않나...?
마치며
써봐야지 써봐야지 하다가 이번에 도입했다.
조금 더 세부적, 보안적으로 안전하길 원한다면 Secret Manager를 알아보는게 좋을 것 같다.
DevOps를 하다보면 개발자가 굳이 알 필요가 있을까 싶은 것들이 있는데
외부에서 주입할 수 있는 파라미터들이 대표적인 예이지 않을까 싶다.
나도 DevOps 보다 개발자에 가깝긴하지만... 하고 있는 일들이 이런 것들을 관리해야한다.ㅠ
'개발 > AWS' 카테고리의 다른 글
AWS ECS 기초부터 파악해보기 (0) | 2025.01.31 |
---|---|
CloudFront 403 에러 원인을 찾아가는 여정 feat. WAF (1) | 2024.11.02 |
Spot 인스턴스로 운영 되던 서버 문제 해결하기 (0) | 2024.08.26 |
한 눈에 알아보는 AWS VPC(Virtual Private Cloud) 정리 (0) | 2024.04.16 |
AWS S3 파일 주기적으로 삭제하기 : SpringBoot에서 미리 서명된 URL(pre-signed URL) 써보기 (0) | 2024.03.28 |
- Total
- Today
- Yesterday
- JWT
- EKS
- openAI API
- 티스토리챌린지
- S3
- GIT
- AWS
- MySQL
- springboot
- Spring
- Kotlin
- lambda
- elasticsearch
- 오블완
- Log
- ChatGPT
- docker
- java
- serverless
- 스프링부트
- object
- AWS EC2
- AOP
- 람다
- cache
- Elastic cloud
- 후쿠오카
- CloudFront
- terraform
- OpenAI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |