문제 상황
Elastic Beanstalk을 활용해 웹 서비스를 배포하고 있었는데, 환경 속성을 통해 API key값을 관리하고자 했습니다. 그러나 모종의 이유로 환경변수를 등록해도 환경변수가 적용이 되지 않아 어려움을 겪었습니다. 그렇다고 공개된 코드에 API key값을 노출시킬 수는 없는 노릇이고, 어떻게 해야할 지 고민하던 중 AWS Systems Manager내의 Parameter Store를 알게 되어 적용해보기로 했습니다.
ParameterStore 내에서 파라미터 생성
AWS 콘솔에 로그인을 한 이후, AWS Systems Manager 내의 Parameter Store에 접근하여 파라미터 생성을 클릭합니다.
계층 구조로 파라미터 이름을 설정해줍니다.
유형은 보안 문자열을 선택해주고, 암호화할 KMS키를 지정해줍니다. 그리고 값에 API key를 넣어줍니다.
스프링부트 gradle 의존성 추가
dependencies {
// parameter store
implementation(platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.0.0"))
implementation("io.awspring.cloud:spring-cloud-aws-starter-parameter-store")
}
이러한 스타터 패키지에 대한 의존성을 추가함으로써 간결하게 스프링 부트 프로퍼티 설정과 통합할 수 있습니다.
Reference
https://docs.awspring.io/spring-cloud-aws/docs/3.0.0/reference/html/index.html
AWS 인증 설정
- AWS CLI의 aws configure 명령어를 이용하여 인증정보를 등록할 수 있습니다.
- 로컬에서는 C:\Users\{유저명}\.aws에 저장되어있는 .credentials파일을 통해 인증합니다.
Parameter Store에서 값 가져오기
application.yml파일에 parameter경로를 import해옵니다.
spring:
config:
import: optional:aws-parameterstore:/config/tarotmate
- optional을 접두어로 붙여주면, api key값을 불러오지 못했을 경우에도 서버가 중단되지 않습니다.
서비스 파일에서 사용
@Value("${openai-api-key:defaultValue}")
private String apiKey;
테스트
배포환경에서 파라미터 적용하기
Elastic Beanstalk에서 EC2 인스턴스 프로파일로 부여했던 역할 aws-elasticbeanstalk-ec2-role에 아래와 같은 정책들을 추가해줍니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"ssm:GetParametersByPath",
"ssm:GetParameters",
"ssm:GetParameter"
],
"Resource": [
파라미터와 key값 리소스
]
}
]
}
"kms:Decrypt"은 암호화된 API key값을 복호화시키는데 사용되고, "ssm:GetParametersByPath"은 EC2에서 매개변수에 접근할 수 있도록 해줍니다.
테스트
'웹개발' 카테고리의 다른 글
MapStruct을 통한 오브젝트 매핑 (0) | 2024.01.19 |
---|---|
스프링부트 프로젝트에 Spotless 적용하기 (0) | 2023.10.16 |
TDD (0) | 2023.09.26 |
사용자 인증 (0) | 2023.09.22 |
@ResponseStatus를 이용하여 커스텀 예외를 만드는 방법 (0) | 2023.09.02 |