home
Ecs: chapter3
컨테이너를 이용한 AWS 아키텍처
- AWS well architected
- 운영 우수성
- 보안
- 안정성
- 성능 효율
- 비용 최적화
- 지속 가능성
- 설계 아키텍처
- Ingress용 public ALB
- 애플리케이션용 private subnet
- Aurora용 private subnet
- 옵저버빌리티(가관측성): 시스템 전체를 살펴보며 내부 상태까지 깊이 파고들 수 있는 상태
- 탐지 -> 파악 -> 특정
로깅 설계
- Cloudwatch logs 구독필터를 사용해서 로그 내에서 특정 문자열이 포함된 경우의 로그만을 추출 가능
- 이 로그를 lambda -> SNS로 장애 통보 가능
- Firelens
- SaaS에도 로그를 전송 가능, firehose로 S3나 Redshift, OpenSearch Service에도 로그 전송 가능
- 로그 라우팅 담당하는
Fluentd
orFluent Bit
선택 가능 Fluent bit
는Fluentd
에 비해서 플러그온이 적지만 자원 효율이 좋아서 추천- 게다가
Fluent bit
는 ECS 태스크 정의에서 AWS의 공식 컨테이너를 사용 가능 - S3에는 Firehose를 경유하지 않고 직접 S3에 출력 가능하다
- 심지어 cloudwatch에도 동시에 로그를 전송할 수 있다.
- 게다가
- 로그 장기 보관을 위해서 애플리케이션 접속 로그는 S3, 에러 로그만 CloudWatch Logs에 전송하려면?
Fluent bit
를 사용해라.- 기본 제공
Fluent bit
컨테이너로는 이것을 하지 못하기 때문에 설정파일을 S3 버킷에 넣어두거나, 직접 이미지를 만들어라
지표 설계
- 지표는 정기적으로 계측되고 수집되는 시스템 내부의 정량적인 동작 데이터
- CloudWatch 지표, CloudWatch Container Insights
- CloudWatch Container Insights를 사용하면 ECS의 테스크 수준의 정보를 파악 가능
- task수가 많아지면 그만큼 비용이 늘어난다.
- ECS 클러스터 단위로 명시적인 옵트인이 필요
- X ray를 사용하면 서비스 맵 대시보드도 제공해서 시스템 전체를 시각적으로 표시
- 사이드카 형태로 x-ray 배포
- VPC 밖에 서비스 엔드포인트가 있어서 애플리케이션이 VPC 내부에 있다면 따로 VPC 엔드포인트를 만들어줘야함
CICD
- ECR 팁
- 개발서버나 스테이징, 프로덕션 이미지에 태그를 달아서 수명 주기 정책을 유연하게 사용
- 그리고 이미지 만들 때
운영환경_소스코드저장소 커밋 ID
로 만들면 더 좋다
배스천
- 퍼블릭 서브넷에 EC2를 배포하고, 프라이빗 서버와 연결하기 위한 점프 서버
- 내부 작업에 대한 작업 기록도 취득 가능
- 그런데 퍼블릭 서브넷임으로 좀 위험하다
- 대안으로 배스천서버도 프라이빗으로 넣고, Session manager나 요즘 나온 EC2 Instance connect endpoint 사용
보안 설계
- AWS의 보안은 공동 책임 모델
- 이미지에 대한 보안 대책
- ECR 이미지 스캔
- 푸시 시 스캔
- 수동 스캔
- Trivy를 이용한 취약점 스캔
- pip, yarn, npm등의 애플리케이션 종속성도 스캔 대상
- codebuild 워크플로 파일에 기입하는 것으로 쉽게 통합
- 즉, CICD 때 Trivy를 사용하고, ECR에 푸시 됐을 때 ECR 스캔을 진행한다.
- 그러나 이미지는 정적이기 때문에 Lambda를 활용해서 주기적으로 스캔을 돌린다.
- 이미지 설정 문제 대책: Dockle
- 또한 docker나 AWS에서 공식으로 인증된 신뢰할 수 있는 이미지를 사용
- Guardduty로 악성코드 탐지
- 평문 기밀: Secret manager, System Manager Paramater Store 사용
- secret manager는 각 정보(예 DB_USER: 1234)에 하나의 ARN이 생성되어, 해당 ARN을 ECS 태스크 정의 내에서 지정하면 된다.
- System Manager Paramater Store는 secure string을 사용해야 암호화가 된다.
- CICD 때 DCT를 활성화하면 서명된 기본 이미지의 변조 여부를 알 수 있다.
- ECR 이미지 스캔
- 레지스트리에 대한 보안 대책
- 오래된 이미지는 수명주기 정책을 사용. 이 때 이미지 태그 덮어쓰기 금지하는 설정도 있다.
- 불충분한 인증, 인가 제한 대첵
- IAM 사용, 프라이빗 리포지토리 생성
- 리포지토리 정책에서 push는 CI인 코드빌드, pull은 ecs만 가능하게 바꾸면 수동 푸시를 막을 수 있다.
- 오케스트레이터에 대한 보안 대책
- 모든 ECS 태스크는
awsvpc
라는 네트워크 모드가 선택 - 각 태스크에 고유한 ENI가 할당, 그 ENI에 프라이빗 IPv4주소가 할당
- 퍼블릭 IP주소를 태스크에 할당해 internet gateway로 퍼블릭 네트워크와 통신 가능
- WAF를 사용하면 되는데 ALB, API Gateway, Cloudfront만 가능
- 그래서 앞에 퍼블릭 서브넷의 ALB를 두고 WAF를 연결시키고, 보안그룹 설정으로 태스크는 ALB의 inbound만 허용한다.
- 또한 AWS Shield Standard를 무료로 사용할 수 있다.
- VPC -> 퍼블릭 네트워크 통신이 필요할 때(리전 서비스 접근한다거나) 그냥 태스크 ENI에 퍼블릭 IP주면 간편하긴 하다.
- 근데 이는 권장 사항이 아님으로 프라이빗 서브넷에 태스크를 두고 NAT 게이트웨이를 퍼블릭에 배치한다.
- NAT 게이트웨이도 퍼블릭 네트워크를 경유한다.
- 이를 원치 않으면 VPC 엔드포인트를 사용한다.
- 게이트웨이 엔드포인트, 인터페이스 엔드포인트 사용
- 인터페이스 엔드포인트는 시간 + 데이터 양에 따라 비용이 든다. 거기다가 고가용성 보장하려면 엔드포인트 별로 추가해야함
- 근데 그냥 NAT 게이트웨이 사용하면 다중 AZ해도 10만원이다. 이게 더 저렴함, 그리고 어차피 인터넷 서비스랑 통신하려면 NAT 게이트웨이를 이용해야 함
- 모든 ECS 태스크는
안정성 설계
장애
,복구
,가용성
,자동
이 키워드- 다중 AZ로 ECS 태스크를 배치
- 이는 ECS 서비스 스케줄러가 알아서 태스크를 AZ에 배치해준다.
- CloudWatch를 활용한 ECS 태스크 장애 탐지
TaskCount
: ECS 클러스터에서 실행 중인 태스크 수 (서비스에 속하지 않은 태스크도 포함)RunningTaskCount
: ECS 서비스에서 실행 중니 태스크 수- ECS 태스크에 장애가 발생했을 때 알람을 보낼 것인지는 비지니스에 강하게 의존
- ALB와 연계한 ECS 태스크의 제거 및 자동 복구
- ECS 태스크 장애 발생시 ALB가 자동으로 해당 태스크 제외
- Fargate 작업 유지 관리로 인한 ECS 태스크 정지
- 태스크 사용 중단 알림을 보낸다
- 해당 태스크에 SIGTERM 시그널을 전송
- 응답하지 않은 경우 SIGKILL을 보내서 강제종료. 그래서 애플리케이션에서 SIGTERM에 대한 핸들링 필요
- 점검시 서비스 정지
- ALB 리스너 규칙 정의에서 점검 중 페이지를 설정
- 503고정 응답하는 Listener Rule에 우선도를 높인다.
성능 설계
- Auto Scaling 활용
- 단계 조정 정책
- 스케일 아웃 및 스케일 인 조건에 단계를 설정해 단계적으로 확장 할 수 있도록 하는 정책
- 70면 한 개늘리고, 30퍼면 한 개 줄이고..
- 대상 추적 조정 정책
- 지정한 지표의 설정 값이 유지되도록 스케일 아웃 또는 스케일 인을 수행하는 정책
- 스케일 아웃은 고속, 스케일인은 천천히 실행
- 스케일 아웃은 어느 하나의 지표의 목푯값을 초과하면 하지만, 스케일인은 모든 지표를 만족시켜야 한다.
- 대상 추적 조정 정책 추천
- 다양한 실험(locust 활용 등)을 통해서 최적의 비용과 성능을 찾아낸다.
- 적은 수의 IP주소를 갖는 서브넷을 ECS 서비스에 설정했다면 급격한 스케일아웃으로 인해 IP주소가 부족해 질 수 있다.
- 단계 조정 정책
비용 최적화 설계
- 용량 공급자 개요를 활용
- 온디맨드는
FARGATE
, 스팟은FARGATE_SPOT
라는 이름으로 용량 공급자가 미리 정의 - ECS 서비스에서 기본 값 2, 가중치 4로해서 기본 값은 온디맨드, 가중치는 스팟으로 운영
- spot은 중단된다. 태스크 종료 2분 전에 종료되는데 이 역시 SIGTERM을 발생시킨다.
- 온디맨드는