인프런 커뮤니티 질문&답변

huk님의 프로필 이미지
huk

작성한 질문수

AWS 배포 완벽가이드 (feat. Lightsail, Docker, ECS)

ECS Deployment Circuit Breaker was triggered

해결된 질문

작성

·

2.5K

1

안녕하세요 계속 질문만남기는 것 같아 죄송합니다.

섹션 10. AWS Elastic Container Service (ECS) 자세히 알아보기!

에서

ECR private repository 이미지로 AWS ECS service 생성하기 강좌를 따라하고 있는데요

앞강좌에서 local 에서 도커 이미지 push 까지 완료하고

 

해당 강좌도

Task definition 까지 생성을 잘 완료 하였습니다.

하지만

서비스 생성중에

강좌대로 똑같이 서비스를 생성후 서비스 생성 클릭을 눌렀는데요

해당 에러가 나와서 CloundFormation 에서 보기 버튼을 눌러서 확인해보니깐

Resource handler returned message: "Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'." (RequestToken: c1e2037e-83e2-33f1-1337-2b3ffd4347aa, HandlerErrorCode: GeneralServiceException)

 

검색을 해봐도 정확히 나오지가 않아서

다시 서비스 생성해도 동일한 에러가 나오네요

혹시 더 디테일한 로그를 보는방법이나

해결방법을 알 수 있을까요?

 

 

 

답변 2

1

김시훈님의 프로필 이미지
김시훈
지식공유자

AI가 답변을 해줬네요 ㅎㅎ

혹시 AI가 말해준 이 부분을 확인하셨을까요?
- AWS Management Console에 로그인한 후, ECS 서비스로 이동합니다.
- 문제가 발생한 클러스터와 서비스를 선택합니다.
- 로그 탭에서 해당 서비스에 대한 상세 로그를 확인할 수 있습니다.
- 또한 AWS CloudWatch에서 로그 그룹을 확인하여 서비스 로그를 살펴볼 수 있습니다.

만약 여기서 오류가 확인이 안된다면 해당 서비스에서 Deployments탭을 선택해주세요.

그러면 이런 Event가 있을거에요 [서비스 이름] has started 1 tasks: task 912db14ec1b74d139b9891d49da74f7c. 배포를 시도하면서 새로운 태스크를 만들려고 하는거죠. 이 태스크를 클릭하면 해당 테스크의 Logs탭에 들어갈 수 있습니다. 거기에 들어가면 컨테이너 안에서 발생된 로그를 확인할 수 있습니다. 컨테이너 자체가 문제였다면 여기서 원인을 확인하실 수 있을거애요

huk님의 프로필 이미지
huk
질문자

답변감사합니다.

말씀하신대로 현재 다시 서비스를 추가해서

로그를 보고 있는데요

 

image

build/index.js 경로를 못찾아서 에러가 나는것 같아서

 

혹시나 해서 소스를 살펴보았는데

tsconfig.json 에도 outDir 로 ./build 잘 설정이 되어있고

{
    "compilerOptions": {
        "target": "ES2016",
        "module": "CommonJS",
        "outDir": "./build",
        "esModuleInterop": true,
        "forceConsistentCasingInFileNames": true,
        "strict": true
    },
    "include": ["app/**/*.ts"],
    "exclude": ["app/**/**.test.ts"]
}

 

Dockerfile 에도

 

# Build stage
FROM node:20 as build

WORKDIR /usr/src/my-app

COPY package*.json .

RUN npm install

COPY . .

RUN npm run build

# Production state

FROM node:20 as production

WORKDIR /usr/src/my-app

COPY --from=build ./usr/src/my-app/build ./build
COPY --from=build ./usr/src/my-app/package.json ./package.json
COPY --from=build ./usr/src/my-app/package-lock.json ./package-lock.json

RUN npm install --only=production

CMD ["npm" , "build/index.js"]

CMD 에 build/index.js 로

잘 설정이 되어있는데....

혹시 다른부분을 살펴봐야 될까요? ㅜㅜ

huk님의 프로필 이미지
huk
질문자

아..찾았습니다. ㅜㅜ

Dockerfile 에서

CMD ["npm" , "build/index.js"]

이부분을

CMD ["node" , "build/index.js"]

로 수정했습니다..........휴..

 

로그를 볼 수 있어서 그나마 찾았네요

 

답변감사합니다!!

 

huk님의 프로필 이미지
huk
질문자

아. ㅎㅎ 산넘어 산이네요

 

1:C 23 Nov 2023 09:42:35.682 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

 

redis 오버커밋을 처리해야할것 같은데

ECS 에서는 어디서 처리해야되는지 알 수 있을까요?

 

lightsail 에서는 콘솔창에서

/etc/sysctl.conf 파일을 열어서

 

vm.overcommit_memory = 1 추가해주니 됐었는데

ecs 에서는 콘솔? 을 어디서 열어서 수정해야할까요?

 

김시훈님의 프로필 이미지
김시훈
지식공유자

오 디버깅 제대로 해보셨네요!

 

마지막 redis memory문제 관련해서 혹시 동일한 Fargate 환경으로 돌리신걸까요?

방법이 있을 수는 있는데 확실하지는 않아요.

Task Definition -> 컨테이너 설정부분 -> Docker configuration 여기서 entry, command를 이용하면 가능할 수도 있습니다.

entryPoint: sh,-c

command: sysctl vm.overcommit_memory=1 && redis-server

그런데 이 버그는 사실 고치는것보다는 생략해도 되지 않을까 싶기도 해요. 레디스 관련 특수한 오류인데요. 강의에서도 언급했듯이 레디스, 디비 같은 stateful한 "외부" 서비스 (내가 짜지 않은 코드)는 메니지드를 쓰면 되니깐요. ECS를 잘 알아도 왜 이런 경우에는 메니지드를 써야하는지 알 수 있는 좋은 케이스가 아닐까 싶습니다. (레디스 devops 전문가가 아닌 이상!)

0

안녕하세요, 인프런 AI 인턴입니다.

AWS ECS(Elastic Container Service)에서 서비스 생성 중 ‘ECS Deployment Circuit Breaker’ 에러가 발생하여 문제를 겪고 계신 것으로 보입니다. Circuit Breaker는 배포 도중 실패가 반복적으로 일어날 경우, 자동으로 배포를 중단시키고 이전 상태로 롤백하는 기능인데, 이 기능이 작동한 것으로 추정됩니다.

해당 에러와 관련하여, 다음의 조치 사항들을 확인하시길 권장드립니다:

  1. AWS ECS 작업 정의(Task Definition)와 서비스 설정을 다시 확인해 주세요. 설정에 문제가 없는지 점검합니다.
  2. 사용 중인 ECS 클러스터나 ECR 리포지토리의 설정 및 권한이 올바른지 확인해 보세요.
  3. CloudFormation 로그에 나타난 RequestToken을 이용하여 AWS 지원팀에 문의하거나, 자세한 오류 로그를 얻기 위해서 AWS CloudWatch 로그를 확인해 볼 수 있습니다.
  4. 또한 AWS 사용 중 발생하는 일반적인 서비스 오류인 만큼, AWS 공식 문서를 참고하거나, 관련 질문을 AWS 공식 포럼이나 커뮤니티에 올려 보다 상세한 해결책을 얻을 수 있습니다.

디테일한 로그 확인 방법:
- AWS Management Console에 로그인한 후, ECS 서비스로 이동합니다.
- 문제가 발생한 클러스터와 서비스를 선택합니다.
- 로그 탭에서 해당 서비스에 대한 상세 로그를 확인할 수 있습니다.
- 또한 AWS CloudWatch에서 로그 그룹을 확인하여 서비스 로그를 살펴볼 수 있습니다.

아래의 Spring Boot AWS Elastic Beanstalk 관련 블로그 포스트 링크와 Spring Boot 레퍼런스 문서 링크도 도움이 될 수 있으니 참고해보시기 바랍니다.
- Spring Boot AWS Elastic Beanstalk 예제 블로그 포스트
- Spring Boot AWS 문서

추가적으로, 인프런의 ‘AWS 배포 완벽가이드’ 강좌의 Q&A 섹션 또는 AWS에 대한 전문가 커뮤니티에 질문을 남기셔서 더 구체적인 답변을 얻는 것도 좋은 방법입니다.

인프런 서비스 관련 문의는 인프런 고객센터를 이용하시면 더 자세한 안내를 받으실 수 있습니다.

huk님의 프로필 이미지
huk

작성한 질문수

질문하기