관리 메뉴

가끔 보자, 하늘.

AWS로 서비스 구축하기 #02 - Fargate task를 Private subnet 으로 전환하기 본문

개발 이야기/인프라 구축 및 운영

AWS로 서비스 구축하기 #02 - Fargate task를 Private subnet 으로 전환하기

가온아 2022. 4. 7. 12:50

#01에서는 배포 과정과 ECR/ECS를 이용해 서비스 인프라를 구축하는 과정을 간단히(?) 살펴봤습니다.

이 글에서는 public subnet로 설정했던 fargate task(이하 task)를 private vpc로 수정해 외부에서는 alb만을 통해서 접속할 수 있도록 보안을 강화하고 비용을 줄이도록 개선해 보겠습니다.

이번글은 다음과 같은 순서로 진행됩니다.

  1. 기존 ECS 정리하기
  2. Private VPC로 ECS 설정하기

1. 기존 ECS 정리하기

이전에 만들었던 ECS를 우선 정리해보겠습니다. 클러스터는 굳이 지울 필요없습니다. 내부의 서비스와 실행중인 task들만 지우면 됩니다. ECS -> 클러스터 -> "서비스" 탭 -> 삭제할 서비스 선택 -> 삭제 후 실행중인 작업도 종료합니다. 

2. Private VPC로 ECS 재설정하기

클러스터에서 새로운 서비스를 생성합니다. 서비스 구성은 이전과 동일하며 네트워크 구성에서 Private subnet으로 설정, 자동 할당 퍼블릭 IP는 DISABLED로 설정합니다.

ALB는 여전히 public subnet에 머물러있을 것이므로 이전에 설정된 그대로 사용하면 됩니다.

그럼.. 짜 잔.... 하고 task가 pending 하다가 stopped로 전환됩니다. stopped된 task에서는 "ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post https://api.ecr...." 와 같은 메세지를 확인할 수 있습니다. 기존에는 Public subnet에 속해 있어 ECR에 대한 접근 권한만 있으면 docker image를 가져올 수 있었지만 Private subnet에서 task가 실행되므로 ECR의 docker images를 pull할 수 없기 때문에 발생하는 에러입니다.

구글링을 해보면 자동 할당 퍼블릭 IP를 Enabled로 하라는 둥, NAT Gateway 등등의 이야기들이 있는데 그럴 필요없이 VPC에서 ecr과 logs 관련된 Endpoint를 생성해 주는게 가장 저렴하고 확실하게 처리할 수 있는 방법인 듯 합니다. (최상의 솔루션일 거라고 장담은 못하겠네요. ㄷㄷㄷ)

엔드포인트를 위해서는 VPC 속성 중 enableDnsSupport와 enableDnsHostnames이 활성화 되어 있어야 하며, https(443)포트도 오픈되어 있어야 합니다. 우선 443 포트 사용을 위해 sg를 하나 더 추가합니다. source는 VPC의 CIDR를 지정합니다.

그리고 Dns 관련 옵션을 활성화 합니다.

VPC의 엔드포인트화면으로 이동해서 "엔드포인트 생성"을 클릭합니다. 총 세 개의 endpoint를 생성해야 합니다. 서비스 필터링에 ecr.api, ecr.dkr, logs 를 검색하여 서비스 이름을 선택합니다. ecs 서비스가 위치할 private subnet을 설정하면 됩니다.

보안 그룹은 위에서 새로 생성했던 https(443) port를 연 정책을 선택하세요.

이제 클러스터의 작업으로 가서 정상적으로 실행되는지 확인하세요. 정상적으로 실행되었다면 task는 private에서 가동되며 서비스에 접속하기 위해서는 alb를 통해서만 접근할 수 있게 됩니다.

다음은 private 영역에서만 서비스되는 서비스와 cloudfront와 alb 연결 설정을 다뤄보겠습니다. 

반응형