본문 바로가기

개발

ECS with ALB

CDK로 ECS를 구현하다보면 AWS 서비스들과 상당부분 유기적으로 연계가 되어 있다는 것을 알 수 있다.

단순히 ECS를 활용해서 AutoScale을 해볼려고 코드 몇 줄만 추가했는데, SNS와 Lambda를 이용하여 Count를 조절하는 함수를 생성하기도 하고... 전반적으로 AWS에서 제공한 메뉴얼이나, API Doc을 읽어도 잘 나와있지 않는 경우들이 있다.

 

오늘은 이런 것중 하나를 소개하고자 한다.

CDK를 살펴보면 ECS에서는 기본적인 패턴들을 제공하고 있다. (ecs_pattern)

거기에는 ApplicationLoadBalancer를 이용하여 EC2 Instance나  Fargate로 배포하는 것이 어느정도 구성되어 있다.

 

생각해보자.

ECS를 쓰는 이유는 여러가지가 있겠지만, 나의 경우에는 Auto scaling, Scale out이였다. 

서비스의 특정 호출에 응답하는 메인 서버를 EC2 Instance로 두고, 요청량이 늘어나거나 조건에 따라 Fargate로 Autoscaling하면 비용도 상당히 절감되지 않을까?

 

CDK에서 제공하는 패턴을 살펴보니, Fargate를 ALB에 붙여서 여러대로 늘렸다가 줄였다 하는것을 해보니 helath check와 drain time에 따라 잘 동작하는 것을 확인할 수 있었다. 

마찬가지로 EC2 Spot Instance(ECS Optimized AMI)로 생성하고 ALB로 연결하니 역시나 잘 동작했다.

 

그런데 아무리 봐도 EC2와 Fargate를 묶어서 사용하는 패턴은 없었다. 내가 생각한것처럼 쓰는 사람이 없어서였을까? (아니면 애초에 AWS에서 생각한 방향이 아니였을까?)

그래서 ecs_pattern을 사용하지 않고, 직접 CDK로 ALB를 만들고 ECS에 Fargate Task와 EC2 Task를 각각 만들어서 별도의 서비스로 만들고 이를 한 ALB로 묶어서 넣으려고 시도했는데, CDK 배포 단계에서 에러가 발생했다. 

 

이유는 EC2 Task는 ALB에 Target Type이 Instance로만 고정되어있고, Fargate는 Target Type이 IP로 되어있기 때문이다. ALB는 Target Type이 같아야 하나의 Target Group으로 묶어서 넣을수 있고 그 정책에 의해 위와 같은 상황이 막히는 것이다.

 

물론 cfn을 이용해서 Instance의 IP를 얻어서 IP로 Target group에 넣어주거나, 이에 준하는 다른 방법(cli, console, sdk등)들을 사용해서 넣어줘도 동작하는데에는 문제가 없지만, 이러면 가장 기본이 되는 Instance가 변경되는 경우에는 ALB에서 자동으로 처리되지 않기 때문에 다른 방법을 사용해서 컨트롤 해줘야한다. 

 

 

일부 코드를 발췌하면 다음과 같다.

## EC2 Instance
const service = new ecs.Ec2Service(this, 'CDK-ECS-EC2SERVICE', {
            cluster,
            taskDefinition,
})

## Fargate 
const farservice = new ecs.FargateService(this, "CDK-FARGATE-SERVICE", {
	cluster,
    taskDefinition: fargateTaskDefinition,
    assignPublicIp: true
})

## ALB 타겟 선언
const httpsTarget = new elb.ApplicationTargetGroup(this, "CDK-ALB-TG-HTTPS", {
	port: 80,
	protocol: elb.ApplicationProtocol.HTTP,
    vpc,
    targetType: elb.TargetType.IP, ## target Type이 같아야만 
    targets: [farservice, service], ## 이렇게 두개를 넣어줄 수 있다. (실제로는 에러나는 코드!)
    healthCheck: {
    	interval: cdk.Duration.seconds(30),
        path: "/health",
        timeout: cdk.Duration.seconds(5),
    }
})

'개발' 카테고리의 다른 글

Cloudfront Serving. 그런데, CORS?  (0) 2021.08.29
AWS에서 Serverless 배포 생각정리  (0) 2021.07.25
EC2, Fargate, Lambda. 뭐쓰지?  (0) 2021.07.10
Gitlab CI/CD 사용하기  (0) 2021.07.05
AWS CDK - API Gateway, Lambda (1)  (0) 2021.06.06