반응형
이번에는 ECS의 배포 오류(환경 변수 주입 오류)를 해결하는 과정을 설명한다.
이전에는 url, username, password라는 환경변수를 Secrets Manager에서 읽어오지 못하는 문제가 발생했었는데 이번에는 특정 키를 직접 찾아서 참조하는 방식에 대해서 알아본 후에 적용해서 오류를 해결했다.
1. Secrets Manager의 secret에서 특정 키만 참조하는 방식 설명
1-1. secret의 키 참조방식
- 조금 조사를 해본 결과 Secrets Manager에 만든 보안 암호(secret)의 특정 키를 참조하는 방법은 다음과 같다.
- ARN 뒤에 콜론(:)을 추가하고 키 이름을 명시해야 한다. 이후 맨 뒤에::을 붙여준다.
- 예시: arn:aws:secretsmanager:region:account-id:secret:secret-name-abc123:username::
1-2. 실제 예시
- 예를 들어, "prod/member/postgre/credentials"라는 이름의 보안 암호(secret)명이 있고, 이 안에 다음과 같은 JSON 객체가 저장되어 있다고 가정해 보자
{
"url": "jdbc:postgresql://database-url:5432/database-name",
"username": "your-username",
"password": "your-password"
}
- 이 보안 암호의 ARN이 만약 "arn:aws:secretsmanager:ap-northeast-2:123456789876:secret:prod/member/postgre/credentials-NSko92s" 이라면, ECS 태스크 정의 내에서 이 비밀을 참조하는 방법은 다음과 같다.
{
"name": "url",
"valueFrom": "arn:aws:secretsmanager:ap-northeast-2:123456789876:secret:prod/member/postgre/credentials-NSko92s:url::"
},
{
"name": "username",
"valueFrom": "arn:aws:secretsmanager:ap-northeast-2:123456789876:secret:prod/member/postgre/credentials-NSko92s:username::"
},
{
"name": "password",
"valueFrom": "arn:aws:secretsmanager:ap-northeast-2:123456789876:secret:prod/member/postgre/credentials-NSko92s:password::"
}
1-3. 주의사항
- 컨테이너의 value에 ARN을 지정할 때, 비밀 이름의 고유 식별자(예: LnHlYv)를 포함해야만 한다.
- ECS는 이러한 참조를 통해서 실시간으로 컨테이너에 환경 변수 값을 주입한다.
- 스프링 부트와 같은 애플리케이션은 이 환경 변수를 사용하여 실제 데이터베이스 연결을 구성해야 하며, 잘못된 URL을 사용하지 않도록 주의해야 한다.
2. "태스크 정의" 수정하고 ECS 다시 배포하기 (성공)
2-1. 태스크 정의에서 컨테이너의 환경변수 값 변경하기
- 원인을 찾았으니 이번에는 위에서 적은 대로 "arn:url::" 이런식으로 ::을 맨 뒤에 붙여보기로 했다.
- 이 방식으로 작성하면서 Java의 메서드 참조가 떠올랐다.
2-2. 다시 ECS 서비스 변경하기
- 이제 다시 배포하기 위해 ECS서비스로 들어왔다. -> 클러스터에 들어와서 하단을 보면 "서비스" 목록이 존재한다.
- 서비스 이름을 클릭해서 들어간 다음 우측 상단의 "서비스 업데이트" 버튼을 클릭한다.
- 하단처럼 배포 구성이 나오는데 여기서 "패밀리"를 클릭해서 방금 새롭게 만든 "태스크 정의"로 변경시켜 준다.
2-3. 서비스 배포하기
- 패밀리를 변경하고 저장하면 자동으로 서비스가 재시작된다. (여기서 제발 성공해라ㅠㅠ 하면서 대기했다.)
- 조금 기다렸더니 위에처럼 태스크도 성공했고 아래처럼 서비스도 배포에 성공했다!
2-4. DNS 접속 검증하기
- 배포에 성공했으니 이번에는 ALB의 DNS로 접속을 시도했다. (배포가 성공했으면 들어가져야 한다.)
- 감동적이게도 접속에 성공했다!!
2-5. 태스크 로그 확인
- 배포성공 후에(사실 배포하는 과정에서 보고 있었다.) 태스크의 로그를 확인했다.
- 검색창에 postgre를 검색했더니 내가 주입했던 환경변수가 잘 들어가서 연결에 성공했다고 나왔다. (Added connection)
결국 Secrets Manager를 사용해서 환경변수를 추가하여 ECS를 배포하는 것에 성공했다.
이제는 yml에 중요한 환경변수를 드러낸 채로 git에 넣어 위험이 발생할 일이 사라졌다. 기존에는 이런 작업들을 하기 위해 yml을 분리하거나 vault를 사용했었는데 클라우드 기능을 사용하니 훨씬 좋은 것 같다. 지금까지 이 시리즈를 봐준 독자에게 감사하다는 말을 남기며 마무리한다.
2023.11.03 - [AWS] - AWS Secret Manager로 ECS SpringBoot 환경변수(DB정보) 설정하기(3) - ECS 서비스 생성 및 배포하기1
반응형
'AWS > ECS, ECR' 카테고리의 다른 글
[AWS] ECS로 MSA인프라 구현하기 (0) | 2023.11.07 |
---|---|
[AWS ECS] ECS로 MSA 구현하기 (0) | 2023.11.07 |
AWS Secrets & ECS SpringBoot 설정 (3-1): ECS배포와 오류 분석 (0) | 2023.11.03 |
AWS Secrets & ECS SpringBoot 설정 (2): ECS 연동 (0) | 2023.11.03 |
AWS Secrets & ECS SpringBoot 설정 (1): Secret 생성 (0) | 2023.11.03 |