[AWS/ECS] ECS Fargate(1) - 서비스 시작을 위한 각종 설정 기록(eureka client 등록, health check)
회사에서 EC2를 이용한 서버 운용 비용이 너무 많이 들어 ECS로 전환하기로 했다. 운이 좋게 리소스가 남는 내가 작업하게 되었다.
거의 3주를 ECS 구성하는 데 헤매서.. 까먹지 않기위해 ECS에 관한 것을 최대한 기록하려고 한다.
ECS 배포까지의 작업 순서
- VPC 생성
- 이번에 VPC를 새로 생성하면서 모든 서비스가 한 VPC 안에 있도록 했다.
- Subnet 생성
- 유레카, 게이트웨이, config 서버는 public subnet
- 서비스들은 private subnet에 배치했다.
- Application Load Banlancer 추가
- 로드밸런서를 추가하면서 연결한 target group은 리스너에서 제거한다.
- ecs 서비스를 생성하면서 target group을 생성하기 때문에.
- ECS cluster를 생성한다.
- 네트워킹 전용 선택
- ECS task를 생성한다.
- 배포될 서비스에 대한 설정이다.
- ECR 컨테이너를 연결하고, 컨테이너 환경변수도 여기서 설정한다.
- 작업메모리 0.5GB로 하니까 컨테이너가 실행되지 못하고 죽어서
- 작업메모리 1GB, CPU 0.5로 설정
- ECS service를 생성한다.
- 시작유형 fargate
- 작업 개수는 1(container를 띄우고 싶은 만큼)
- 상태확인 경로는 actuator/health로 설정했다.
- DNS 접속
- 퍼블릭 서브넷에 위치한 서비스의 경우 ALB의 DNS로 접속이 가능하다.
Eureka Client 서비스에 추가해야 할 코드
ECS로 배포된 서비스는 docker 기반이기 때문에 내부 IP를 잘 잡아서 eureka에 등록해줘야 한다.
그래서 추가해줘야 할 코드가 있다.
- EcsConfig.class
@Configuration
@Slf4j
@Profile("dev")
public class EcsConfig {
@Bean
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils){
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
String ip = null;
try {
ip = InetAddress.getLocalHost().getHostAddress();
log.info("ECS Task Container Private Ip address is {}", ip);
} catch (UnknownHostException e) {
e.printStackTrace();
}
config.setIpAddress(ip);
config.setPreferIpAddress(true);
return config;
}
}
docker 내부의 private ip를 찾아주고 preperIdAddress true를 주어 ip로 클라이언트를 찾아가도록 한다.
eureka에 등록될 ip == ecs task private ip == target group에 등록된 ip
- application.yml
eureka:
instance:
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
non-secure-port-enabled: true
non-secure-port: ${server.port}
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: ${internal.eureka.uri}/eureka
non-secure-port-enabled와 non-secure-port 속성을 추가했다.
그러면 유레카에 이렇게 등록된다.(eureka-url/eureka/apps)
게이트웨이는 route53을 적용할 거라서 해당 config 적용하지 않았다.
ECS task 종료 원인 보기
서버가 실행되고 1분 정도 지나면 저절로 shut down 되었다. 그리고 다시 실행되고 죽고,,
ecs 모니터링 하는 법도 몰라서 health check fail인지도 모르고 다른 것만 수정하고 삽질 너무 했다.
- 작업 탭의 중지된 task에서 원인 보기
- 이벤트 탭의 task의 시작, 종료 이벤트 보기
ECS task health check 성공하는 법
health check 실패시 봐야할 것은
1. 보안그룹 포트 허용 되어있는지
- 혹시 모르니 ALB, ECS 서비스 보안그룹 다 확인하기
2. 서비스 target group의 interval 시간 늘리기
- 서비스 생성 시 상태 확인 유예 기간을 주라는 건 효과가 없었음
여기까지 ECS로 어플리케이션을 성공적으로 실행 시키는 법 완료.
다음은 ECS 운영할 때의 각종 설정들 기록하기.
참고
https://yoo11052.tistory.com/142
[AWS] AWS Fargate for ECS 시작하기
AWS Fargate for ECS AWS Fargate란 서버를 관리하지 않고도 컨테이너를 배포하고 관리할 수 있는 서버리스 컴퓨팅 엔진입니다. 기존의 ECS는 Instance 유형을 직접 설정하고, Task Life Cycle을 관리하고, Clu..
yoo11052.tistory.com
Eureka Client Registered with Container IP in ECS Fargate
We deployed Spring Boot services in the ECS Fargate with Eureka Registry Service, Gateway Service and a few business services. In the Eureka registry page all the client services registered were sh...
stackoverflow.com
https://stackoverflow.com/questions/59055771/eureka-discovery-service-on-aws-ecs-fargate
Eureka Discovery service on AWS ECS Fargate
I am trying to deploy microservices via ECS Fargate. I am Using Eureka as Discovery Service. The clients are registered at eureka, but can't comunicate. First I tried to get the IP in this way ...
stackoverflow.com