aws fargate는 ec2 인프라를 신경 쓸 필요 없이 container 배포 관리를 해준다. 따라서 기존 ECS와 달리 cluster의 리소스 관리를 안 해도 된다. 이런 serverless 특성으로 ECS와 lambda 중간쯤 위치한 서비스다.
요금도 lambda와 같이 초 단위로 사용한 만큼 과금한다.
기본 hello server
const Koa = require('koa');
const app = new Koa();
app.use(ctx => {
ctx.body = 'Hello';
});
app.listen(4000, () => {
console.log('listening to port 4000');
});
node로 "Hello"만 응답하는 간단한 서버를 만들었다.
FROM node:12
WORKDIR /app
COPY package*.json index.js ./
RUN yarn install
EXPOSE 4000
CMD node index.js
fargate는 docker container를 ec2와 상관없이 오케스트레이션 해주는 서비스다. 따라서 Dockerfile을 만들어 image를 생성한다.
$ docker build -t helloServer .
$ docker run -itd -p 4000:4000 helloServer
$ curl localhost:4000
Hello
잘 동작하는 것을 확인하고, 이제 aws 작업을 시작한다.
ECR 등록
ECR에 hello-server repository를 생성하고 docker image를 push 한다. 이 ECR에 등록된 이미지를 사용해서 fargate에서 container를 띄운다.
$ aws ecr get-login-password --region {region_id} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region_id}.amazonaws.com
Login Succeeded
$ docker push {account_id}.dkr.ecr.{region_id}.amazonaws.com/hello-server:latest
Task Definition 생성
방금 생성한 ECR repository의 image를 참조하는 Task Definition을 생성한다.
network mode를 awsvpc로 설정하면 host mode와 마찬가지로 port mapping을 설정할 필요가 없다. host는 호스트의 포트에 직접 매핑이 되고 awsvpc는 ENI를 할당받기 때문이다.
ALB, ECS Cluster, ECS Service 생성
ECS Service 생성할 때 load balancer가 필요하므로 먼저 alb를 생성해둔다.
alb 생성 시 target group이 같이 생성되지만, 이따 service 생성할 때 target group도 생성된다. alb 생성 시 따라서 생성된 target group은 지워둔다.
alb 생성 후 ECS Cluster, Service까지 생성한다.
ECS Service를 생성하면 총 3개의 서비스가 생성된다. ECS Service와 같이 자동으로 등록되는 alb의 target group, listener도 생성된다.
alb의 dns name으로 접속해보면 처음에 작성한 hello가 출력된다.
504 Gateway Time-out이 뜨는 경우
service에서 설정한 security group이 해당 port를 inbound로 열어주고 있는지 확인한다. security group으로 차단된 경우는 이런 time-out 에러가 발생한다.
503 Service Temporaily Unavailable이 뜨는 경우
target group에서 task의 health check가 잘 동작하는지 확인한다. health check에 실패하면 task가 계속 죽었다가 살아나는 걸 반복한다.
'aws' 카테고리의 다른 글
Serverless Application Model(SAM) 기본 (0) | 2020.08.25 |
---|---|
AWS CodePipeline으로 CI/CD 구축하기 (0) | 2020.05.12 |
AWS X-Ray (0) | 2020.05.05 |
AWS API Gateway (0) | 2020.05.02 |
AWS Lambda (0) | 2020.04.27 |
댓글