Secrets Manager 이용해서 환경변수 적용하기
Spring Boot와 RDS를 직접 연동까지는 성공했다. 그리고 나는 모든 소스를 GitHub에 올리기 때문에 직접 데이터베이스 접속 정보가 코드상에 노출되면 안 된다. 이 문제를 해결하기 위해 AWS Secrets Manager 서비스를 이용해 중요한 접속 정보를 코드에 직접 포함시키지 않고 환경 변수를 통해 프로젝트를 실행시켜 보자.
1. Secret 생성하기
1. AWS Secrets Manager 접속하기
2. [새 보안 암호 저장] 버튼을 클릭하면 아래와 같이 4단계로 생성할 수 있는 화면이 나온다.
3. 1단계 "보안 암호 유형 선택"을 설정한다.
3-1. 보안 암호 유형은 "다른 유형의 보안 암호"를 선택한다.
3-2. 키/값 페어에 환경 변수로 지정하고 싶은 데이터를 작성한다.
- 나는 데이터베이스 접속 정보를 적어줬다.
3-3. 암호화 키를 설정한다.
- 기본값으로 그대로 두었다.
4. 2단계 "보안 암호 구성"을 설정한다.
4-1. 보안 암호 이름 및 설명을 작성한다.
- 보안 암호 이름은 이제 내가 생성할 보안의 이름이 될 것이다.
4-2. 태그와 리소스 권한, 보안 암호 복제는 전부 기본값으로 두었다.
5. 3단계 교체 구성을 설정한다.
- 교체 구성은 전부 기본값으로 두었다.
6. 4단계 검토 확인 후 [저장] 버튼을 눌러 생성한다.
7. 생성 완료된 화면이다.
2. 클러스터 인스턴스에 Secret 액세스 권한 부여하기
1. 현재 ECS 클러스터가 돌아가고 있는 인스턴스를 확인해 보자.
- 아래는 EC2 인스턴스 화면이다. 여기서 '인스턴스 ID'를 클릭해 인스턴스 상세 보기로 이동한다.
2. 인스턴스 상세 보기에서 "IAM 역할"에 해당하는 링크를 클릭해서 들어간다.
3. 아래는 ECS 클러스터 인스턴스에 연결된 IAM 역할의 개요 화면이다.
4. 위 화면에서 [권한 추가 > 인라인 정책 생성] 버튼을 클릭한다.
5. 정책 생성 화면에서 [JSON]을 클릭해 JSON 편집기에 Secrets Manager에 접근 권한 내용을 작성한다.
- "Resource" 항목에 적을 Value 값
- region: 이것은 AWS 서비스를 호스팅 하는 지역이다. 예를 들어, 서울 리전은 ap-northeast-2다.
- account-id: 이것은 AWS 계정 ID다. 이 ID는 12자리 숫자로 되어 있으며, AWS Management Console의 우측 상단에 있는 [계정 아이디]를 클릭하면 아래로 펼쳐지는 팝업에서 계정 ID에 대항하는 값이다. 또는 AWS CLI를 사용하여 aws sts get-caller-identity 명령을 실행하여 얻을 수도 있다.
- secret-name: 이것은 Secrets Manager에서 생성한 비밀의 이름다. 비밀을 생성할 때 지정한 이름을 사용해야 하며, Secrets Manager 대시보드에서도 확인할 수 있다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:<region>:<account-id>:secret:<secret-name>"
}
]
}
- 전부 작성했으면 [다음] 버튼을 클릭해 넘어간다.
6. 2단계 검토 후 [정책 생성]을 클릭한다.
7. 그럼 생성이 완료된다.
- 이렇게 완성된 정책은 실행 중인 ECS의 EC2 인스턴스에서 IAM 역할에서 권한 추가를 통해 붙여줬기 때문에 자동으로 ECS 인스턴스에 추가된다.
- 만약에 이런 방법이 아니라 IAM에서 새로운 정책을 만들었다면, 이 정책을 사용하고자 하는 역할에 수동으로 연결해 주는 추가 작업이 필요하다.
8. 이렇게 해서 Secrets Manager와 권한 세팅은 완료되었다.
3. 태스크 정의에 secret 정보 주입하기
1. ECS > 태스크 정의에 [새 태스크 정의 생성]을 클릭한다.
- (만약에 ECS > 태스크 정의를 생성하는 방법을 모르겠다면 아래 링크를 참고하면 좋다!)
[AWS] ECS 생성4 - ECS 생성 및 설정 (w/o ALB)
2. 태스크 정의 생성 부분에서 컨테이너 추가 팝업 화면에서 환경 변수를 작성하는 부분이다.
- key 값에는 secret manager에 저장했던 secret key값
- ValueFrom 선택
- ValueFrom 오른쪽 입력창에는 ‘보안 암호 > 보안 암호 ARN’ 값 복사해서 붙여 넣기
3. 컨테이너 생성을 완료하고 태스크 정의 생성을 하려니 아래와 같은 에러가 떴다.
- 이 에러는 AWS ECS에서 태스크 정의에 비밀(Secrets)을 추가할 때는 해당 태스크가 AWS Secrets Manager에 접근할 수 있도록 "executionRoleArn"을 지정해야 한다.
- 이 역할은 ECS 태스크가 AWS 리소스에 접근할 때 사용하는 IAM 역할이다.
- 에러 메시지는 ECS 태스크가 비밀을 가져올 때 사용할 IAM 실행 역할(Execution Role)이 정의되지 않았다는 것을 나타낸다.
- 위에서 (2. 클러스터 인스턴스에 Secret 액세스 권한 부여하기) 정책 정의했던 건 ecs 서비스에 secrets manager에 접근할 수 있는 권한을 준거고 이제는 ecs의 태스크에 secrets manager에 접근할 수 있는 권한을 줘야 한다.
3-1. 그런데 일단 태스크 정의할 때 '태스크 정의 이름*' 아래 있는 '태스크 역할' 항목에서 원래는 아무것도 선택 안 했는데 'ecsTaskExecutionRole'을 선택해 봤다.
3-2. 그랬더니 생성은 안되는데 에러가 바뀌었다.
4. 마무리
일단,,, 다음 포스팅에 이어서 해당 에러를 수정해 보자...
AWS에서 IAM이 어렵다는 소리는 듣긴 했지만 매번 이렇게 내 발목을 잡을 준 몰랐다,,, ㅎ
다음 포스팅을 꼭 확인해 주길 바란다,,,
[AWS] ECS와 RDS 연동하기 (2) - SpringBoot와 PostgreSQL 연동하기
'AWS' 카테고리의 다른 글
[AWS] ECS 배포 실패해도 서버가 다운 안되는 이유 - ECS 서비스 롤링 업데이트 방식 (1) | 2023.11.04 |
---|---|
[AWS] ECS와 RDS 연동하기 (4) - Secrets Manager 이용해서 환경변수 적용하기(IAM 정책, Spring Boot 코드 수정) (1) | 2023.11.04 |
[AWS] ECS와 RDS 연동하기 (2) - SpringBoot와 PostgreSQL 연동하기 (0) | 2023.11.03 |
[AWS] ECS와 RDS 연동하기 (1) - PostgreSQL 생성하기 (3) | 2023.11.03 |
[AWS] CodePipeline을 이용한 CI/CD (4) - 배포 오류 해결 (S3 거치지 않고 ECR에서 이미지 가져오기) (2) | 2023.11.01 |