본문 바로가기

AWS

Secret Manager를 사용해서 Spring Boot 프로젝트의 property값 관리하기(2) - EC2

🔐 들어가며

Secret Manager란?

Secret Manager는 AWS에서 제공해주는 비밀 값 관리 서비스로, 기존에 자바 환경설정 파일에 직접 하드 코딩해서 관리하는 방식을 벗어나 AWS에서 관리하는 방식입니다. 보안 정보당 월 0.4$의 저렴한 가격으로 이용이 가능합니다.

위의 사진에 있는 예시처럼 DB 정보를 저장할 수도 있고, 인증 정보를 저장할 수도 있고, API 키를 저장할 수도 있습니다.

이번 포스팅은 2가지 단계로 진행될 예정입니다. 저번 포스팅에서는 로컬에서 Secret Manager로 접근하는 방법에 대해 다룰 예정이며, 이번 포스팅에서는 서버에서 Secret Manager를 접근하는 방법에 대해 다룰 예정입니다! 이번 포스팅에서는 저번 포스팅에서 작성했던 코드에 대해서는 다루지 않습니다.

직접 사용한 코드는 Github에서 확인할 수 있습니다.


🔑 AWS Secret Manager 만들기

Secret Manager 만들기

Secret Manager에 들어간 뒤에 새 보안 암호 저장 버튼을 눌러줍니다.

 

키의 종류는 '다른 유형의 보안 암호'를 선택한 뒤에, 설정 파일에 넣을 민감한 키값을 넣어줍니다.

 

보안 암호 이름의 prefix는 /secret/으로 하고, 프로젝트의 이름_프로필의 형식으로 작성해준 뒤에 저장해줍니다.


🍂 AWS Configuration

EC2 IAM 역할 수정

Secret Manager를 사용할 인스턴스를 클릭하고, 보안 - IAM 역할을 눌러줍니다.

 

해당 IAM 역할에 SecreatManagerReadWrite 정책을 추가해줍니다.


🌱 Spring Boot 연결하기

테스트 메서드 추가

@RestController
public class TestApi {

  @Value("${spring.datasource.username}")
  private String userName;

  @GetMapping("/test")
  public String test() {
    return userName;
  }
}

실제로 잘 적용되었는지를 확인하기 위해 테스트 메서드를 추가해줍니다.

 

아래 내용부터는 CI/CD를 어떻게 구성했냐에 따라 설정 방법이 달라질 수 있습니다. 이 포스팅에서는 Github Action + Code Deploy 조합으로 사용했을 때의 설정 방법에 대해 다루고 있습니다.

 

Github Action workflow 수정

Secret Manager를 추가한 뒤에 Guthub Action CI를 돌리게 되면 에러가 나게 됩니다. Github Action에 권한이 없기 때문인데요. 스크립트를 수정해주도록 하겠습니다.

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      ...

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.ACCESS_KEY_SECRET }}
          aws-region: ap-northeast-2

      - name: Read secrets from AWS Secrets Manager into environment variables
        uses: abhilash1in/aws-secrets-manager-action@v1.1.0
        with:
          aws-access-key-id: ${{ secrets.ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.ACCESS_KEY_SECRET }}
          aws-region: ap-northeast-2
          secrets: |
            /secret/clelab
          parse-json: false

      ...

AWS의 권한을 가져와서 설정해주고 Secret Manager의 값을 읽어 환경 변수로 넣어주는 flow를 추가해줍니다. 이때 secrets.ACCESS_KEY_IDsecrets.ACCESS_KEY_SECRET는 Github의 Secrets을 통해 넣어준 값이며, 해당 IAM Role에는 아까와 똑같이 SecreatManagerReadWrite 권한이 존재해야합니다.

 

Deploy Script 수정

nohup java -jar /home/ec2-user/app/build/libs/curriculum-1.0.jar --spring.profiles.active=qa  > /dev/null 2> /dev/null < /dev/null &

배포 시 설정할 수 있는 active profile을 방금 설정했던 프로필로 설정해줍니다.

그 이후에 배포를 한 뒤에 들어가게 되면

Secret Manager에 설정해두었던 내용이 잘 나오는 것을 확인할 수 있습니다! 🙂


💛 맺으며

서버에서도 크게 설정을 건드릴 필요 없이 해당 설정만 해주면 Secret Manager를 사용할 수 있습니다. Secret Manager는 민감한 값을 관리하기에 좋은 서비스이기 때문에 민감한 값을 관리할 때 사용하는 것이 좋습니다!

혹시 글을 읽으면서 잘못된 내용이 있으면 댓글로 알려주시면 감사하겠습니다! 읽어주셔서 감사합니다! 😊


👏 참고