반응형
지난번에는 ECS의 태스크 정의를 생성했다. 이번에는 이 태스크를 사용해서 ECS의 서비스를 만들어 보도록 하자 태스크의 컨테이너에는 내가 주입해 준 환경변수가 들어갈 테니 springboot는 이 내용을 db연결할 때 잘 가져다 사용할 것이다.
1. ECS 클러스터 업데이트하기
1-1. ECS 클러스터 업데이트
- 이제 방금 생성한 태스크 정의를 적용시켜 보도록 하자 ECS 클러스터로 들어온 다음 우측의 "서비스 업데이트"를 클릭한다.
1-2. 패밀리(태스크 정의) 변경하기
- 아래와 같이 "패밀리" 구성을 클릭해서 이전 포스트에서 만든 "태스크 정의"를 선택해 준다.
- 맨 하단으로 가서 "업데이트" 버튼을 클릭한다.
2. SpringBoot에서 application.yaml 설정하고 ECS 배포하기
2-1. application.yml 수정하기
- 아래 첨부한 코드와 같이 application.yml을 수정하고 github에 push 한다.(배포 환경을 기준으로 설명) value인 {} 안에 들어가는 변수명은 "태스크 정의"에 key로 넣어준 값을 적어주면 된다. (secrets manager에 secret을 만들 때 작성한 key값과도 같다.)
- 예를 들어 아래처럼 {url}로 작성해서 push 했다면 ECS 컨테이너의 환경변수에서 "url"이라는 key값에 해당하는 환경 변수값을 찾은 다음 그 key가 가진 value를 {url}에 대입해 준다. 만약 태스크 정의에 url : jinan이라고 환경변수를 넣었다면 yml에 대입되는 값은 "{url} = jinan" 일 것이다.
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: {url}
username: {username}
password: {password}
- 아래와 같이 application.yml 파일 안에 작성하게 될 것이다.
2-2. github에 push 하고 ECS 배포하기
- 위에서도 말했지만 이건 배포환경을 기준으로 설명하고 있기 때문에 github에 코드를 넣고 AWS CodePipeline을 통해서 CI/CD를 구현해서 배포를 실시하는 환경을 기준으로 설명하고 있다. (SpringBoot를 docker 이미지화시켜서 배포하는 중이다.)
- 만약 CodePipeline을 통한 배포를 모르겠다면 아래의 포스트를 확인하고 오자 (완전 처음부터는 ECR부터 만드는 포스트부터 봐야 한다.)
2023.10.29 - [AWS] - AWS - CodePipeline을 통한 CI/CD구현기 1편 (Step1: 파이프라인 설정, Step2: 소스 스테이지 추가하기)
- 배포를 시도했는데 아래와 같이 서비스 배포에 실패했다고 나왔다.
3. ECS 배포 오류 파악하기
3-1. 오류상황 파악하기 (로그 확인)
- 태스크가 동작중에 남긴 로그를 확인해 봤더니 아래와 같은 오류가 발생했다.
- 로그의 내용은 아래와 같다. (url에 관련해서 db연결에 문제가 생겼다.)
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine suitable jdbc url
3-2. ECS 배포 실패를 확인하다 배운 점
이 배포 실패를 하고 다시 ECS 서비스를 확인해 봤더니 이상하게 문제없이 동작을 하고 있었다. 분명 실패했는데 왜??? 이에 궁금증이 생겨서 알아봤더니 이유는 다음과 같았다.
- AWS의 ECS는 업데이트 중 발생한 문제로 인해 새 배포가 실패하는 경우 기존의 동작 중인 서비스 버전을 유지하는 롤링 업데이트 방식을 사용한다. 이는 서비스의 안정성을 보장하기 위한 중요한 기능이다.
- ECS 배포 프로세스
- ECS는 새로운 태스크 정의에 따라서 새 태스크를 시작한다.
- 새로운 태스크가 health check를 통과하면, 서비스는 minimumHealthyPercent 및 maximumPercent 설정에 따라 새 태스크와 기존 태스크의 균형을 조정한다.
- 새 태스크의 배포가 성공하면, ECS는 점진적으로 기존 태스크를 새 태스크로 교체한다.
- ECS는 새로운 태스크 정의에 따라서 새 태스크를 시작한다.
- ECS 배포 실패 시 처리방식
- 새 태스크의 배포를 중지하고, minimumHealthyPercent에 정의된 바에 따라 동작 중인 기존 태스크를 유지한다.
- 설정에 따라, 배포 프로세스가 자동으로 롤백되거나 수동으로 이전 버전으로 롤백할 수 있다.
- 새 태스크의 배포를 중지하고, minimumHealthyPercent에 정의된 바에 따라 동작 중인 기존 태스크를 유지한다.
새로운 태스크의 배포에 문제가 있다면 , ECS는 안정적인 서비스 제공을 위해 기존에 정상 작동하고 있는 태스크를 계속 운영한다.
이제 배포 오류를 해결해 보도록 하자
4. ECS 배포 오류 파악하기 (환경 변수 오류)
4-1. 실행 중인 ECS의 컨테이너 정보 확인
- 컨테이너 설정을 보기 위해 ECS의 "태스크 정의"로 들어간다. 이후 아래 사진과 같은 페이지가 나오면 "태스크 정의:개정" 하단의 이름을 클릭해서 들어가도록 하자
- 들어왔다면 하단과 같은 "개요" 페이지가 나올 텐데 여기서도 아래로 가서 "컨테이너 이름"을 클릭한다.
- 그럼 다음과 같은 "컨테이너 세부 정보" 팝업창이 나올 텐데 여기서 아래쪽의 "환경" 부분을 확인한다.
- 환경에는 아래와 같이 내가 "태스크 정의"를 생성할 때 컨테이너에 추가해 줬던 환경변수들이 적혀있다.
4-2. 환경변수의 값(value) 변경 시도
- 컨테이너 환경변수의 값(value)에 arn을 잘못 입력해서 오류가 발생했다고 생각해서 value를 변경해 보고 다시 ECS를 배포했다.
- 아래와 같이 arn 맨 뒤에 ":url" 이런 식으로 secret의 key를 적어봤다.
"arn:aws:secretsmanager:region:account-id:secret:secret-name-AbCdEf:url"
- 배포 시에 아래와 같이 오류가 발생하면서 아예 "태스크"가 실행조차 안되었다. 그래서 태스크의 자체적인 실행 로그가 없으니 확인하기가 힘들었는데 태스크로 들어가서 실행 관련 상태를 보는 법을 알아냈다.
- 하단의 "태스크"를 클릭하고 원하는 상태 필터링에서 "모든 원하는 상태"를 선택해서 지금까지 동작한 모든 태스크를 확인한다.
- 여기서 아래와 같은 태스크명을 클릭하면 되는데 오류를 찾아야 하니 "내가 방금 동작시킨 태스크명"을 찾아서 클릭해서 들어가면 된다. (여러 개가 있으니 태스크 정의를 보고 이름이 같은 걸로 들어가라)
4-3. 오류 파악
- 아래와 같은 오류가 발생해 있었다. 오류 내용은 username, url, password라는 값을 통해 secrets manager의 데이터를 받아오지 못했다는 의미였다.
username resulted in error: an invalid ARN format for the AWS Secrets Manager secret was specified. Specify a valid ARN and try again.;
5. 배포 오류 파악하기 (환경 변수 Secrets Manager 말고 직접 넣어보기)
5-1. 직접 환경변수 넣기 (태스크 정의 새롭게 생성)
- 발생한 문제가 key값을 제대로 불러오는데 value에 오류가 있어서 가져오지 못하는 건지 확실하게 검증하기로 했다.
- key는 그대로 작성하고 value를 선택한 후 값은 제대로 된 값을 바로 적어줬다. (Secret Manager에 연결하는 방식 X)
5-2. 배포 확인
- 배포에 성공했다! 진짜 성공한 건지 SpringBoot에 만들어 놓은 GetMapping API에 요청을 던져봤는데 문제없이 동작했다.
5-3. 결론
- 이 실험으로 지금 ECS에 환경변수를 주입하는 것에는 문제가 없다는 것이 증명되었다. 그럼 문제점은 value를 받아오는 것인데 아무래도 컨테이너를 만들 때 value에 arn을 넣었던 부분에 오류가 있는 것 같다. 기존 arn만 적었던 방식과 수정해서 작성한 방식인 arn의 맨 뒤에 "arn:url" 이런 식으로 붙여서 작성하는 방식을 다른 방법으로 변경해서 작성하는 방법을 찾아서 다시 시도해야겠다.
이번 포스트는 여기서 마무리하고 다음 시리즈에서 이어서 고쳐보도록 하겠다.
과정들을 검증하면서 진행하니 확실히 뭐가 문제인지는 파악이 되고 있다. 이게 간단해 보였지만 실제로 적용하려니 만만치 않은 것 같다.
CodePipe도 git에 코드를 계속 push하니까 고쳐지지 않은 ECS를 배포단계에서 무한로딩하는 오류가 발생해서 중간중간 Deploy 단계를 꺼주느라 애먹었던 부분도 있었다.
2023.11.03 - [AWS] - AWS Secrets & ECS SpringBoot 설정 (3-2): 성공적인 배포 완료
2023.11.03 - [AWS] - AWS Secrets & ECS SpringBoot 설정 (2): ECS 연동
반응형
'AWS > ECS, ECR' 카테고리의 다른 글
[AWS ECS] ECS로 MSA 구현하기 (0) | 2023.11.07 |
---|---|
AWS Secrets & ECS SpringBoot 설정 (3-2): 성공적인 배포 완료 (1) | 2023.11.03 |
AWS Secrets & ECS SpringBoot 설정 (2): ECS 연동 (0) | 2023.11.03 |
AWS Secrets & ECS SpringBoot 설정 (1): Secret 생성 (0) | 2023.11.03 |
AWS ECS와 ALB: 동적 포트 vs 명시적 포트 설정의 EC2 DNS 접속 이슈 (1) | 2023.10.31 |