가시다님의 AEWS3기 12주차 마무리가 되었습니다.
정말 이번에는 극도로 쉽지 않았습니다.
해를 거듭할수록 분명 제 실력은 성장해가는데 스터디 내용은 2배 더 성장하는 느낌입니다.
이제 나 AWS랑 K8S 좀 알아 하고 시작했다가 겸손해졌고, 조금은 지쳐서 이번 스터디를 기점으로 좀 쉬려고합니다..ㅎㅋㅋ
(istio 너무 학습하고싶었으나 다음 기회에 ㅋㅋㅋ)
엄청나게 방대한 자료와 방대한 내용을 1주마다 학습하는게 직장인으로써 정말 쉽지않은데
이런 스터디를 꾸준히 열어가시는 가시다님은 정말 갓... 항상 감사하다는 말씀드립니다.
이 블로그를 우연히 접하시는 인프라엔지니어 분들도 스터디 시간되시면 꼭 참가하십쇼.
그런데 각오하고 하셔야한다는거..!

무튼 12주차는 방신철님께서 진행해주셨고, VPC Lattice라는 서비스를 소개해주셨습니다.
처음 들어보는 서비스고 사실 스터디 안하면 이용해볼 경험이 없는 서비스라서 조사가 많이 필요했습니다.
그래서 번외로 해당 블로그 글을 추가 작성해봅니다.
VPC Lattice란?
VPC Lattice 워크샵 내용을 가지고 시작해보겠습니다.
https://catalog.workshops.aws/handsonwithvpclattice/ko-KR
Amazon VPC Lattice Workshop
This workshop provides setup instruction and several labs for Amazon VPC Lattice. Provisioning each account will take up to 35 minutes. Please provision your event well in advance. For support/comments - join #vpclattice-workshop-interest
catalog.workshops.aws
워크샵 표현을 빌려 Amazon VPC Lattice는 여러 계정 및 Amazon Virtual Private Cloud(VPC) 에서 모든 서비스를 연결, 보호 및 모니터링하는 데 사용하는 완전 관리형 애플리케이션 네트워킹 서비스 라고 합니다.
조금 더 간단히 말하면 여러 계정이나 여러 VPC로 산재되어 있는 복잡하고 다양한 네트워크 상황에서 하나로 통합시켜줄 수 있는 서비스라고 볼 수 있겠습니다.
더 읽어보면 Amazon VPC Lattice는 마이크로서비스와 레거시 서비스를 논리적 경계 내에서 상호 연결하여 마이크로서비스와 레거시 서비스를 보다 효율적으로 검색하고 관리할 수 있도록 도와줍니다. Amazon VPC Lattice에서는 마이크로서비스를 “서비스”라고 합니다. 워크샵 내내 이 문구가 같은 의미로 사용되는 것을 볼 수 있을 것입니다.
즉, Amazon VPC Lattice는 여러 개의 VPC 혹은 네트워크 환경에 분산되어 있는 마이크로서비스나 컴퓨팅 환경(이하"서비스")를 하나로 통합하는 네트워킹 서비스라고 보면 됩니다.
Amazon VPC Lattice의 장점
- 여러 VPC, EC2 인스턴스, 컨테이너, 서버리스로 구성한 다양한 애플리케이션의 네트워크 구성을 중앙 집중화 할 수 있습니다.
- 별도의 사이드카 프록시를 구성할 필요가 없습니다. (+ 완전 관리형 서비스)
- 복잡한 네트워크 구성을 단순화 해서 쉽게 사용할 수 있습니다.
- IAM 및 SigV4를 통해 각 애플리케이션으로의 보안 구성을 손쉽게 적용 할 수 있습니다.
- CloudWatch, S3, Kinesis Data Firehose를 통해 쉽게 로깅, 트래픽 패턴 분석 등을 수행할 수 있습니다.
구성요소
서비스 : 특정 작업이나 기능을 수행하는 소프트웨어 단위. 서비스는 대상그룹, 리스너, 규칙을 가집니다.
- 대상그룹 : 애플리케이션이나 서비스를 실행하는 리소스 집합
- 리스너 : 서비스가 트래픽을 받아들일 포트와 프로토콜
- 규칙 : 리스너 규칙으로 요청을 대상 그룹 내 대상으로 전달 (LB 리스너 규칙처럼 우선순위, 작업, 라우팅 조건 등을 설정합니다)
리소스 : 각좀 컴퓨팅 리소스 등, 리소스가 대상임
리소스 게이트웨이 : 리소스가 위치한 VPC의 진입점
리소스 설정 : 단일 리소스, 리소스 그룹을 나타내는 논리적 객체
서비스 네트워크 : 서비스 검색과 서비스간 연결을 자동으로 구현하고, 서비스 모음에 대한 공통 접근, 모니터링 정책 등 다양한 서비스 설정
역할과 책임
- 서비스 네트워크 소유자와 서비스 소유자가 있음 (중복가능)
서비스 네트워크 소유자 : 관리자로 서비스 네트워크 생성, 공유, 프로비저닝 할 수 있다.
서비스 소유자 : 소프트웨어 개발자. 서비스 생성, 라우팅 규칙 설정, 서비스 네트워크와 연결
리소스 소유자 : 리소스 구성, 리소스 접근 방식 설정, 리소스 구성을 서비스 네트워크와 연결
텍스트보다는 실제로 생성하면서 확인해보도록 하겠습니다.
Lab 1 - Service-to-Service 연결
대상그룹
VPC Lattice의 가장 말단 엔드포인트인 대상그룹을 먼저 확인합니다.
대상그룹은 LB의 대상그룹과 동일하게 엔드포인트가되는 애플리케이션입니다. 하나 이상의 등록된 대상으로 요청을 라우팅할 때 사용합니다.
실습에서는 아래 4개의 각기 다른 타입을 대상그룹으로 생성하겠습니다.
- rates-tg : Instance
- ecs-lattice-target-group (for reservations) : IP
- payments-tg : ALB
- consumer-tg : Lambda
대상그룹 등록 - lambda
VPC > VPC Lattice > 대상그룹 > [대상 그룹 생성] 버튼을 클릭합니다.
람다 부터 진행해보겠습니다. Lambda 함수를 선택하고 대상그룹이름을 consumer-tg으로 지정한 뒤 다음을 누릅니다.
ConsumerLambda 함수를 클릭하고 다음버튼을 누릅니다.
아주 간편하게 대상그룹이 등록된것을 확인할 수 있습니다.
대상그룹 등록 - EC2 (Auto Scaling Group)
같은 방식으로 이제는 EC2 instance를 등록해보겠습니다.
- /rates 대상은 AutoScaling group내 EC2 인스턴스에서 동작합니다.
먼저 rates-tg를 다음과 같이 등록합니다.
- 대상 유형 선택 : 인스턴스
- 대상 그룹 이름 : rates-tg
- 프로토콜 : HTTP
- 포트 : 80
- VPC : ECSEC2ServiceVPC
- 프로토콜 버전 : HTTP1
이렇게 설정하고 그냥 생성만 누릅니다. EC2 auto scaling group을 VPC Lattice 대상그룹에 연결할 예정이기 때문에 인스턴스를 대상그룹에 현재 포함하지 않습니다.
EC2 > Auto Scaling 그룹에 들어가서 그룹을 선택한뒤 편집 버튼을 누릅니다.
중간 쯤 스크롤을 내리다보면 VPC Lattice 통합 옵션이 있습니다. 여기서 연결 버튼을 누른 뒤 아까 생성한 rates-tg를 연결합니다.
update버튼을 누르고 다시 vpc Lattice의 대상그룹으로 돌아오면 아까 등록되지 않았던 인스턴스가 등록된것을 확인할 수 있습니다.
대상그룹 등록 - ALB
/payments 대상은 다른 VPC에 있는 ALB의 뒤에 위치한 EC2 인스턴스에서 동작합니다.
다음과 같이 등록합니다.
- 대상 유형 선택 : Application Load Balancer
- 대상 그룹 이름 : payments-tg
- 프로토콜 : HTTP
- 포트 : 80
- VPC : ECSEC2ServiceVPC
- 프로토콜 버전 : HTTP1
다음 버튼을 누르고 대상등록에서 지금등록, ec2-web-services-alb를 누르고 기본 포트를 사용해서 등록합니다.
대상그룹 등록 - Fargate ECS
마지막 FargateECS는 ECS로 들어갑니다. 대상그룹으로 등록할 클러스터의 서비스로 접근합니다.
WebServices 클러스터에 web-service 라는 서비스를 누르고 업데이트 버튼을 누릅니다.
내리다보면 VPC Lattice 탭을 열고 사용버튼을 누릅니다. 설정을 마치고 update를 합니다.
- 인프라 역할 : latticebaseinfra2-ECSLatticeRole
- 타겟 그룹 이름 : ecs-lattice-target-group
- 포트 이름 : ecslattice (사전 생성한 내용)
- 프로토콜 : HTTP
- 포트 : 80
그럼 이제 대상그룹에 이렇게 총 4개의 리소스가 다양하게 등록된것을 확인할 수 있습니다.
서비스, 리소스 게이트웨이와 리소스 구성 생성
자 그럼 이제부터는 이러한 대상그룹에 라우팅되기 위해 상단에 서비스를 두고, 해당 서비스에 대한 라우팅 설정을 합니다.
마치 LB를 구성하는 것과 매우 동일하다고 생각하면 됩니다.
서비스는 마치 호출 엔드포인트이며, 해당 호출은 리스너 규칙에 따라서 라우팅됩니다.
이러한 서비스를 통한 호출이 AWS 환경 내에서 여러 네트워크 간에 더 간단하고 안전한 연결을 제공하게 됩니다.
서비스 생성 1 - parking 서비스
세 가지 서비스를 만들 예정입니다. 또한 RDS MySQL에 액세스하기 위한 하나의 리소스 게이트웨이와 구성을 만들 것입니다.
VPC > Lattice 서비스에 들어가 서비스 생성 버튼을 누릅니다.
식별자에 이름을 parking으로 설정하고 바로 다음으로 넘어갑니다.
라우팅 정의에서 리스너 추가버튼을 누릅니다.
리스너에는 리스너 이름으로 parking-listener로 지정하고 HTTP 80포트를 사용합니다.
이제 이 리스너에 대한 리스너 규칙을 생성합니다. 규칙 추가 버튼을 누릅니다.
다음과 같이 설정값을 입력해 2개의 리스너 룰을 추가해주세요.
이렇게 리스너 규칙을 2개 추가한 것을 확인합니다.
리스너 기본 작업은 rates-tg로 연결시켜주고 다음버튼을 누릅니다.
네트워크 연결 생성은 추후에 연결하도록 하고 설정확인을 한뒤 생성합니다.
서비스 생성 2 - consumer 서비스
- 서비스 이름: consumer
- 리스너 이름: 리스너 이름을 지정을 선택하고 consumer-listener를 입력
- 프로토콜: HTTPS
- 포트: 443
- 리스너 규칙은 필요하지 않습니다.
- 리스너 기본 동작: consumer-tg (Lambda)
서비스 생성 3 - Reservation 서비스
- 서비스 이름: reservation
- 리스너 이름: 리스너 이름을 지정을 선택하고 reservation을 입력
- 프로토콜: HTTP
- 포트: 80
- 리스너 규칙은 필요하지 않습니다.
- 리스너 기본 동작: ecs-lattice-target-group
- Parking - 요금(/rates)과 비용(/payments) 대상으로 구성
- Reservation - 기본 리스너 규칙을 사용한 Reservation 대상으로 구성
- Consumer - 기본 리스너 규칙을 사용한 소비자를 바라보는 Lambda 대상으로 구성
- rds-gw - RDS 인스턴스가 배포된 VPC에 위치한 리소스 게이트웨이
- rds-cfg - 필요한 VPC에서 엔드포인트를 생성하고 RDS를 서비스 네트워크와 연결하는 데 사용되는 리소스 구성
RDS Gateway 생성
RDS 리소스 게이트웨이의 경우 다른 VPC 나 계정에서 리소스를 사용하고 싶다면 이 게이트웨이로 구성하면됩니다.
이를 통해서 다른 계정이나 다른 VPC에서 해당 엔드포인트를 통해 리소스로 접근할 수 있습니다.
VPC Lattice에서 리소스 게이트웨이를 생성합니다.
리소스 게이트웨이 생성시 이름은 rds-gw라고 하고, RDS가 속한 VPC를 지정합니다.
그리고 서브넷은 모든 AZ에 대해서 전부다 사용합니다. 보안그룹은 RDSSecurityGroup라는 이름이 포함된것을 사용하고 생성버튼을 누릅니다.
이제 리소스 구성으로 넘어가 리소스를 구성하겠습니다.
다음 구성대로 하나씩 따라하면서 만들면 됩니다.
- 이름: rds-cfg
- 구성 유형: Resource
- 유형: ARN
- 리소스 게이트웨이: rds-gw
- ARN 리소스 정의 > 리소스 유형: Amazon Relational Database Service
- RDS Database: 'latticebaseinfra2-rdsinstance-' 가 포함된 것을 선택합니다.
서비스 네트워크
서비스 네트워크는 여러 서비스를 묶어주는 논리적 공간입니다. 이 네트워크 서비스를 사용하려면, 클라이언트나 서비스가 이 네트워크와 연결된 VPC 안에 있어야합니다.
서비스는 접근제어 권한 정책을 설정할 수 있습니다. 여러 VPC를 하나의 서비스 네트워크에 연결할 수 있지만, VPC는 오직 하나의 서비스 네트워크와만 연결할 수 있습니다.(포함관계를 잘 파악해야합니다)
서비스와 클라이언트가 서로 통신하려면 모두 같은 서비스 네트워크에 연결되어야 합니다.
서비스 네트워크 생성
이제 만든 서비스를 서비스 네트워크에 편입시켜봅니다. VPC > Lattice > 서비스 네트워크 에 들어가서 생성버튼을 누릅니다.
다음과 같이 입력하여 서비스 네트워크를 생성하겠습니다.
- 서비스 네트워크 이름: superappsvcnetwork
- 서비스: Parking , Reservation , Consumer 세 개를 모두 클릭합니다.
- 리소스 구성 연결 > 리소스 구성: 드롭다운 메뉴에서 'rds-cfg'
- VPC 연결: 드롭다운 메뉴에서 'Ingress-VPC'를 고르고 보안그룹은 'IngressVPCSNESecurityGroup' 가 포함된 것을 선택
이제 서비스 네트워크와 VPC 연결 및 리소스 구성연결을 마쳤습니다.
서비스 네트워크 엔드포인트와 리소스 엔드포인트를 생성
아까 실제로 만든 서비스에 대해서 엔드포인트를 생성합니다.
해당 서비스 네트워크 엔드포인트를 통해서 VPC에서 서비스 네트워크의 여러 리소스로 비공개 접근이 가능합니다. 하나의 엔드포인트 만으로도 다수의 서비스 호출이 가능해집니다. 다만 여러 서비스 네트워크를 연결하려면 각각 엔드포인트를 가져야합니다.
리소스 엔드포인트는 말그대로 각각의 리소스에 대한 개별 VPC 리소스를 비공개로 접근하게 됩니다. 다른 VPC나 온프레미스도 해당 엔드포인트를 통해서 리소스 접근이 가능합니다. 인터넷 게이트웨이나 로드밸런서 없이도 리소스 접근이 가능하기에 매우 유리합니다.
해당 엔드포인트는 리소스 게이트웨이랑 연결됩니다.
서비스 네트워크 엔드포인트 생성
VPC > Lattice > 엔드포인트로 접근합니다. 엔드포인트 생성을 누릅니다.
다음 내용으로 생성하겠습니다.
- 이름 태그: IngressSNE
- 유형: 서비스 네트워크 - 신규
- 서비스 네트워크: superappsvcnetwork 선택
- VPC: Ingress-VPC
- Subnets: 드롭다운 메뉴에서 'Private subnets' 두개를 모두 선택
- Security groups: IngressVPCSNESecurityGroup 가 이름에 포함된 것을 선택
- 엔드포인트 생성을 클릭
리소스 엔드포인트 생성
Consumer VPC에서 RDS에 접근하기위한 엔드포인트를 생성하겠습니다.
- 이름 태그: LambdaRDSEndpoint
- 유형: 리소스 - 신규
- 리소스 구성: rds-cfg
- VPC: LambdaServiceVPC
- Subnets: 드롭다운 메뉴에서 'Private subnets' 두개를 모두 선택
- Security groups: LambdaSNESecurityGroup 가 이름에 있는 것을 선택
Endpoint 생성시 다음과 같이 DNS 이름을 기록해두기 바랍니다. 해당 DNS로 호출할 예정입니다.
동일한 방식으로 EC2ECS VPC에서 RDS용 리소스 엔드포인트도 생성해줍니다.
- 이름 태그: EC2ECSRDSEndpoint
- 유형: 리소스 -신규
- 리소스 구성: rds-cfg
- VPC: ECSEC2ServicesVPC
- Subnets: 드롭다운 메뉴에서 'Private subnets' 두개를 모두 선택
- Security groups: ECSSNESecurityGroup 가 이름에 있는 것을 선택
Route53 DNS 설정
이런 Private 통신의 경우 Route53의 프라이빗 호스트존을 사용해서 호출하게합니다.
Private Hosted Zone에서는 VPC를 연결할 수 있습니다.
워크샵에서 이미 만들어진 설정에 따라 lambda.local 호스팅 영역으로 들어갑니다. 레코드 생성버튼을 누릅니다.
db레코드를 CNAME으로 등록하고 앞서 만든 Consumer VPC에 있는 RDS 엔드포인트용 DNS를 입력하고 생성합니다.
동일한 방식으로 ec2ecs.local에서는 기존 db.ec2ecs.local 레코드를 편집하고 다음 내용을 넣습니다.
여기에는 EC2ECSRDSEndpoint 프라이빗엔드포인트 정보를 넣어줍니다.
이제 RDS(TCP)용 대상 그룹, 서비스 및 VPC 연결이 있는 서비스 네트워크 엔드포인트 및 리소스 엔드포인트가 포함된 서비스를 생성했습니다. 해당 엔드포인트를 통해서 온프레미스 VPC에서도 연결된 모든 리소스에 대해서 private 접근이 가능합니다.
실제 연결테스트
이제 AWs (IngressVPC) 내에서 Reservation, Parking, Consumer 서비스를 연결해보겠습니다.
최초 VPC Lattice 서비스로 이동하여 Reservation의 도메인이름을 확인합니다.
클라이언트 인스턴스 연결
EC2에서 Ingress-VPC-Instance1를 선택해 SSM으로 접속합니다. (동일 내용을 Ingress-VPC-Instance2에서도 해보세요)
도메인이름을 호출해보겠습니다.
curl http://reservation-07a33f08ab7493c81.7d67968.vpc-lattice-svcs.us-west-2.on.aws
curl http://reservation-07a33f08ab7493c81.7d67968.vpc-lattice-svcs.us-west-2.on.aws/database
/database를 붙여서 호출하면 데이터베이스와 연결성 테스트가 가능합니다. 호출시 count가 증가되는게 보입니다.
이번에는 클라이언트에서 Consumer 서비스를 호출해보겠습니다.
Consumer 서비스는 https로 호출해야하며, consumer이라는 이름의 vpc lattice 서비스에서 도메인을 받아서 호출합니다.
curl https://consumer-0b625eac71b2d2ce3.7d67968.vpc-lattice-svcs.us-west-2.on.aws
마지막 parking 까지 잘 호출되는게 보입니다. 각각 만들었던 EC2, ALB 분기들도 잘 호출되는 모습입니다.
curl http://parking-0bc20b63c15cf00fb.7d67968.vpc-lattice-svcs.us-west-2.on.aws
curl http://parking-0bc20b63c15cf00fb.7d67968.vpc-lattice-svcs.us-west-2.on.aws/rates
curl http://parking-0bc20b63c15cf00fb.7d67968.vpc-lattice-svcs.us-west-2.on.aws/payments
Ingress-VPC-Instance2에서도 동일한 응답을 받을 수 있었습니다.
온프레미스(특정 VPC)에서 각 서비스에 대한 연결 테스트
이번 테스트에서는 온프레미스 혹은 특정 VPCdㅔ서 Lattice 서비스에 도달하기 위해 서비스 네트워크 엔드포인트 SNE를 사용해보도록 합니다. Private Link 서비스는 SNE를 생성할 때 시스템에서 생성한 도메인 이름을 각 엔드포인트에 할당합니다.
먼저 각 서비스 ID를 확인합니다. 각 서비스별 서비스 ID를 확인하겠습니다.
해당 서비스ID는 엔드포인트 탭의 IngressSNE에서 연결정보와 매칭합니다. 예를들어 reservation의 서비스 ID를 조회해봅니다.
Reservation의 DNS 이름은 http://vpce-01d435ca6126022c7-snsa-0ca7dc5c118fe0271.7d67968.vpc-lattice-svcs.us-west-2.on.aws/ 임을 확인할 수 있었습니다.
따라서 온프라미스라고 가정하고 만든 VPC의 EC2에서 해당 도메인을 호출해보겠습니다.
먼저 기존의 reservation 서비스를 동일하게 호출해보겠습니다.
curl http://vpce-01d435ca6126022c7-snsa-0ca7dc5c118fe0271.7d67968.vpc-lattice-svcs.us-west-2.on.aws
curl http://vpce-01d435ca6126022c7-snsa-0ca7dc5c118fe0271.7d67968.vpc-lattice-svcs.us-west-2.on.aws/database
잘 되는것을 확인할 수 있습니다.
mysql을 통해서 리소스 엔드포인트 접근도 가능한지 확인해보겠습니다.
참고로 비밀번호는 Amzn1234! 입니다. 엔드포인트 정보는 rsc가 포함된 엔드포인트 정보를 찾아서 사용하면됩니다.
mysql -h vpce-01d435ca6126022c7-snra-0789f1d7e3348dc5a.rcfg-0745ad12d081fe6d9.4232ccc.vpc-lattice-rsc.us-west-2.on.aws -u admin -p
리소스 접속까지 잘되는 것도 확인할 수 있었습니다.
이상으로 VPC Lattice를 통한 다중 리소스 연결을 확인해보았습니다.