깃허브와 같은 원격 저장소에 프로젝트를 올리는 경우 코드에 데이터베이스 암호 등 민감한 정보가 담기면 위험하다.
따라서 민감한 정보가 담긴 변수를 암호화하거나, 다른 공간에 저장해놓고 불러오는 방식을 사용할 수 있다.
여기서는 AWS Parameter Store에 변수를 저장하고, 이를 Spring에서 불러오는 방법을 소개하겠다.
AWS 설정
Parameter Store에 변수 저장
AWS 관리 콘솔에서 System Manager -> Parameter Store를 클릭한다.
다음과 같은 화면이 나오면, '파라미터 생성' 버튼을 클릭한다.
이제 원하는 파라미터를 생성한다.
파라미터 이름은 /aaa/bbb/password로 3계층으로 생성했다. 이 형식을 꼭 지킬 필요는 없지만, 꼭 다르게 이름을 설정해야 하는 경우를 제외하고는 형식을 맞춰주는 것이 좋다.
파라미터 유형은 문자열, 보안 문자열을 제공한다. 특히 보안 문자열은 해당 파라미터를 암호화해서 관리한다.
파라미터 값에 변수에 들어갈 원하는 데이터 값을 넣고 저장한다.
이제 파라미터 변수가 생성되었다. 해당 값을 스프링에서 불러와 사용할 것이다.
IAM 유저 권한 설정
AWS 파라미터를 불러오기 위해서는 IAM 유저에 SSM 권한 설정이 필요하다.
기존 유저가 있다면 SSM 정책만 추가해서 access key를 발급하면 되고,
유저를 새로 만들고 싶다면 AWS IAM에 접속해 사용자 추가를 선택한다.
원하는 이름을 입력하고,
AWS 자격 증명 유형 선택에서 엑세스 키를 선택한다. AWS 콘솔에 접속할 필요가 있다면 암호 역시 선택해도 된다.
그러나 액세스 키는 반드시 선택해야 한다.
이제 정책을 연결한다. 조회에만 사용할 Key를 발급 받는다면 ReadOnlyAccess를, 조회 외에 여러가지를 다 제어하고 싶다면 FullAccess 를 체크하면 된다.
사용자를 추가했다면 해당 사용자의 access key와 secret key를 각자 저장소에 보관해 두어야 한다.
해당 key는 스프링에서 파라미터를 불러올 때 사용한다.
스프링 설정
라이브러리 추가
다음 라이브러리를 추가한다.
implementation 'com.coveo:spring-boot-parameter-store-integration:1.1.2'
설정 파일에 변수 등록
먼저, AWS Parameter Store에 접근하기 위해 다음 설정을 추가한다.
awsParameterStorePropertySource:
enabled: true
그리고 다음과 같이 변수를 추가한다.
my:
password: ${/aaa/bbb/password}
이제 실제 코드에서 다음과 같이 입력하면, AWS Parameter Store에서 변수를 조회할 수 있다.
@Value("${my.password}")
private String password;
물론 아직 끝난 것이 아니다. AWS 자체에 접근하기 위해서는 이전에 발급한 access key 값이 필요하다.
스프링에 직접 aws key 값 등록
스프링에서 AWS로 접근하는 간단한 방법은 메인 함수에 key값을 넣으면 된다.
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
System.setProperty("aws.accessKeyId", "{accessKeyId}");
System.setProperty("aws.secretKey", "{secretKey}");
System.setProperty("aws.region", "ap-northeast-2"); // 파라미터 스토어와 같은 위치의 리전
SpringApplication.run(ExampleApplication.class, args);
}
}
이렇게 해도 접근은 가능한데, 이 역시 깃허브에 올리면 secret key 값이 유출되는 것이므로 parameter store를 쓰는 취지에 맞지 않다.
따라서 secret key를 암호화하거나, key를 콘솔에 직접 등록하는 방법이 좋다.
콘솔에 key 값 등록
각자 터미널에 아래 명령어로 설정 파일을 연다.
vim ~/.aws/credentials
key 값들을 아래 양식으로 등록하고 저장한다.
[default]
aws_access_key_id=생성된 access_key_id
aws_secret_access_key=생성된 secret_access_key
Key 이외에 추가정보들은 아래 설정 파일에서 등록한다.
vim ~/.aws/config
각 사용자 별 해당하는 리전에 따라 아래와 같이 등록한다. 여기서는 서울 리전(ap-northeast-2)를 입력했다.
[default]
region=ap-northeast-2
output=json
이제 스프링에서 AWS 접근이 가능하기 때문에, AWS Parameter Store의 변수를 조회할 수 있다.
@Value("${my.password}")
private String password;
콘솔에서 AWS 파라미터 불러오기
추가로 AWS 파라미터는 콘솔에서도 조회할 수 있다.
$(aws ssm get-parameters —name /aaa/bbb/password —with-decryption —query Parameters[0].Value)
만약 보안 문자열이 아니라면 -with-decryption 옵션을 빼면 된다.
+) 참고로 AWS 파라미터 스토어에서 값을 조회할 때는 " "가 붙은 문자열로 조회되는데, " " 없이 값을 조회하고 싶다면 다음 문법을 사용하자.
$(echo “$(aws ssm get-parameters —name /aaa/bbb/password —with-decryption —query Parameters[0].Value)” | sed -e ’s/^”//‘ -e ’s/“$//‘)
참고자료
https://jojoldu.tistory.com/509
https://jsonobject.tistory.com/481
'java > spring' 카테고리의 다른 글
[Spring] Spring Security + JWT 토큰을 통한 로그인 (57) | 2022.07.16 |
---|---|
[Spring] Controller에서 pathvariable로 path(/aaa/bbb) 값 받는 법 (0) | 2022.07.15 |
[Spring] 개발, 운영 환경 별 profile 설정 (0) | 2022.01.09 |
[Spring] FCM 서버 구축하기 (특정 시간대에 알림 보내기) (4) | 2021.12.10 |
[Spring] Spring Jdbc - batchUpdate()를 사용한 bulk Insert 최적화 (0) | 2021.08.06 |