Lambda용 Amazon MSK 클러스터 및 Amazon VPC 네트워크 구성
Lambda용 Amazon MSK 클러스터 및 Amazon VPC 네트워크 구성
AWS Lambda 함수를 Amazon MSK 클러스터에 연결하려면 클러스터와 클러스터가 있는 Amazon Virtual Private Cloud(VPC)를 올바르게 구성해야 해요. 이 페이지에서는 클러스터와 VPC를 구성하는 방법을 설명해요. 클러스터와 VPC가 이미 올바르게 구성되어 있다면 Lambda용 Amazon MSK 이벤트 소스 구성을 참고해서 이벤트 소스 매핑을 구성하세요.
본문
주제(Topics)
Lambda와 MSK 통합의 네트워크 구성 요구 사항 개요
Lambda와 MSK 통합에 필요한 네트워킹 구성은 애플리케이션의 네트워크 아키텍처에 따라 달라져요. 이 통합에는 세 가지 주요 리소스가 관련돼요. Amazon MSK 클러스터, Lambda 함수, Lambda 이벤트 소스 매핑이에요. 각 리소스는 서로 다른 VPC에 있어요.
- Amazon MSK 클러스터는 일반적으로 사용자가 관리하는 VPC의 프라이빗 서브넷에 있어요.
- Lambda 함수는 Lambda가 소유한 AWS 관리형 VPC에 있어요.
- Lambda 이벤트 소스 매핑은 함수가 있는 VPC와 분리된, Lambda가 소유한 또 다른 AWS 관리형 VPC에 있어요.
이벤트 소스 매핑은 MSK 클러스터와 Lambda 함수 사이의 중간 리소스예요. 이벤트 소스 매핑에는 두 가지 주요 작업이 있어요. 먼저 MSK 클러스터에서 새 메시지를 폴링해요. 그런 다음 그 메시지로 Lambda 함수를 호출해요. 세 리소스가 서로 다른 VPC에 있으므로 폴링과 호출 작업 모두 크로스 VPC 네트워크 호출이 필요해요.
이벤트 소스 매핑의 네트워크 구성 요구 사항은 프로비저닝 모드를 사용하는지 온디맨드 모드를 사용하는지에 따라 달라지며, 다음 다이어그램에 나와 있어요.
Lambda 이벤트 소스 매핑이 MSK 클러스터에서 새 메시지를 폴링하는 방식은 두 모드에서 동일해요. 이벤트 소스 매핑과 MSK 클러스터 간의 연결을 설정하기 위해 Lambda는 안전한 연결을 설정하기 위해 프라이빗 서브넷에 hyperplane ENI를 만들거나(이미 있으면 재사용)해요. 다이어그램에 나와 있듯이 이 hyperplane ENI는 Lambda 함수가 아니라 MSK 클러스터의 서브넷과 보안 그룹 구성을 사용해요.
클러스터에서 메시지를 폴링한 후 Lambda가 함수를 호출하는 방식은 각 모드에서 달라요.
- 프로비저닝 모드에서 Lambda는 이벤트 소스 매핑 VPC와 함수 VPC 사이의 연결을 자동으로 처리해요. 따라서 함수를 성공적으로 호출하기 위한 추가 네트워킹 구성 요소가 필요 없어요.
- 온디맨드 모드에서 Lambda 이벤트 소스 매핑은 고객 관리형 VPC를 통과하는 경로로 함수를 호출해요. 따라서 VPC의 퍼블릭 서브넷에 NAT 게이트웨이를 구성하거나, Lambda와 AWS Security Token Service(STS) 및 선택적으로 AWS Secrets Manager에 대한 접근을 제공하는 VPC의 프라이빗 서브넷에 AWS PrivateLink 엔드포인트를 구성해야 해요. 이 두 옵션 중 하나를 올바르게 구성하면 VPC와 Lambda 관리형 런타임 VPC 사이에 연결이 생겨 함수를 호출하는 데 필요해요.
NAT 게이트웨이는 프라이빗 서브넷의 리소스가 공개 인터넷에 접근할 수 있게 해줘요. 이 구성을 사용하면 트래픽이 Lambda 함수를 호출하기 전에 인터넷을 통과해요. AWS PrivateLink 엔드포인트는 프라이빗 서브넷이 공개 인터넷을 통과하지 않고 AWS 서비스나 다른 프라이빗 VPC 리소스에 안전하게 연결할 수 있게 해줘요. 이러한 리소스 구성 방법에 대한 자세한 내용은 MSK 이벤트 소스용 NAT 게이트웨이 구성 또는 MSK 이벤트 소스용 AWS PrivateLink 엔드포인트 구성을 참고하세요.
지금까지 MSK 클러스터가 VPC 내 프라이빗 서브넷에 있다고 가정했는데, 이는 더 일반적인 경우예요. 하지만 MSK 클러스터가 VPC 내 퍼블릭 서브넷에 있더라도 안전한 연결을 위해 AWS PrivateLink 엔드포인트를 구성해야 해요. 다음 표는 MSK 클러스터와 Lambda 이벤트 소스 매핑 구성 방식에 따른 네트워킹 구성 요구 사항을 요약해요.
| MSK 클러스터 위치(고객 관리형 VPC) | Lambda 이벤트 소스 매핑 확장 모드 | 필요한 네트워킹 구성 |
|---|---|---|
| 프라이빗 서브넷 | 온디맨드 모드 | VPC의 퍼블릭 서브넷에 NAT 게이트웨이, 또는 VPC의 프라이빗 서브넷에 AWS PrivateLink 엔드포인트를 구성해서 Lambda, AWS STS, 선택적으로 Secrets Manager에 대한 접근을 활성화 |
| 퍼블릭 서브넷 | 온디맨드 모드 | VPC의 퍼블릭 서브넷에 AWS PrivateLink 엔드포인트를 구성해서 Lambda, AWS STS, 선택적으로 Secrets Manager에 대한 접근을 활성화 |
| 프라이빗 서브넷 | 프로비저닝 모드 | 없음 |
| 퍼블릭 서브넷 | 프로비저닝 모드 | 없음 |
또한 MSK 클러스터와 연결된 보안 그룹은 올바른 포트의 트래픽을 허용해야 해요. 다음 보안 그룹 규칙을 구성했는지 확인하세요.
- 인바운드 규칙 – 기본 브로커 포트의 모든 트래픽을 허용해요. MSK가 사용하는 포트는 클러스터의 인증 유형에 따라 달라져요. IAM 인증은
9098, SASL/SCRAM은9096, TLS는9094예요. 또는 자체 참조 보안 그룹 규칙을 사용해서 같은 보안 그룹 내 인스턴스의 접근을 허용할 수 있어요. - 아웃바운드 규칙 – 함수가 다른 AWS 서비스와 통신해야 한다면 외부 대상에 대한 포트
443의 모든 트래픽을 허용해요. 또는 다른 AWS 서비스와 통신할 필요가 없으면 자체 참조 보안 그룹 규칙을 사용해서 브로커에 대한 접근을 제한할 수 있어요. - Amazon VPC 엔드포인트 인바운드 규칙 – Amazon VPC 엔드포인트를 사용하는 경우 엔드포인트와 연결된 보안 그룹은 클러스터의 보안 그룹에서 포트
443의 인바운드 트래픽을 허용해야 해요.
MSK 이벤트 소스용 NAT 게이트웨이 구성
NAT 게이트웨이를 구성해서 이벤트 소스 매핑이 클러스터에서 메시지를 폴링하고 VPC를 통과하는 경로로 함수를 호출하게 할 수 있어요. 이는 이벤트 소스 매핑이 온디맨드 모드를 사용하고 클러스터가 VPC의 프라이빗 서브넷에 있을 때만 필요해요. 클러스터가 VPC의 퍼블릭 서브넷에 있거나 이벤트 소스 매핑이 프로비저닝 모드를 사용한다면 NAT 게이트웨이를 구성할 필요가 없어요.
NAT 게이트웨이는 프라이빗 서브넷의 리소스가 공개 인터넷에 접근할 수 있게 해줘요. Lambda에 대한 프라이빗 연결이 필요하다면 MSK 이벤트 소스용 AWS PrivateLink 엔드포인트 구성을 대신 참고하세요.
NAT 게이트웨이를 구성한 후에는 적절한 라우팅 테이블을 구성해야 해요. 이렇게 하면 프라이빗 서브넷의 트래픽이 NAT 게이트웨이를 통해 공개 인터넷으로 라우팅될 수 있어요.
다음 단계는 콘솔을 사용해 NAT 게이트웨이를 구성하는 방법을 안내해요. 각 가용 영역(AZ)에 대해 필요에 따라 이 단계를 반복하세요.
NAT 게이트웨이와 올바른 라우팅 구성(콘솔)
-
NAT 게이트웨이 만들기의 단계를 따르되 다음을 참고해요.
- NAT 게이트웨이는 항상 퍼블릭 서브넷에 있어야 해요. 퍼블릭 연결로 NAT 게이트웨이를 만들어요.
- MSK 클러스터가 여러 AZ에 복제되어 있다면 AZ마다 NAT 게이트웨이 하나를 만들어요. 예를 들어 각 AZ에서 VPC에는 클러스터가 있는 프라이빗 서브넷 하나와 NAT 게이트웨이가 있는 퍼블릭 서브넷 하나가 있어야 해요. 세 개의 AZ로 구성하면 프라이빗 서브넷 3개, 퍼블릭 서브넷 3개, NAT 게이트웨이 3개가 생겨요.
-
NAT 게이트웨이를 만든 후 Amazon VPC 콘솔을 열고 왼쪽 메뉴에서 Route tables을 선택해요.
-
Create route table을 선택해요.
-
이 라우팅 테이블을 MSK 클러스터가 있는 VPC와 연결해요. 선택적으로 라우팅 테이블의 이름을 입력해요.
-
Create route table을 선택해요.
-
방금 만든 라우팅 테이블을 선택해요.
-
Subnet associations 탭에서 Edit subnet associations을 선택해요.
- 이 라우팅 테이블을 MSK 클러스터가 있는 프라이빗 서브넷과 연결해요.
-
Edit routes를 선택해요.
-
Add route를 선택해요.
-
Destination에 대해
0.0.0.0/0을 선택해요. -
Target에 대해 NAT gateway를 선택해요.
-
검색 상자에서 1단계에서 만든 NAT 게이트웨이를 선택해요. 이는 6단계에서 이 라우팅 테이블과 연결한 프라이빗 서브넷(MSK 클러스터가 있는 서브넷)과 같은 AZ에 있는 NAT 게이트웨이여야 해요.
-
-
Save changes를 선택해요.
MSK 이벤트 소스용 AWS PrivateLink 엔드포인트 구성
AWS PrivateLink 엔드포인트를 구성해서 클러스터에서 메시지를 폴링하고 VPC를 통과하는 경로로 함수를 호출할 수 있어요. 이러한 엔드포인트는 MSK 클러스터가 다음에 접근할 수 있게 해야 해요.
- Lambda 서비스
- AWS Security Token Service(STS)
- 선택적으로 AWS Secrets Manager 서비스. 클러스터 인증에 필요한 시크릿이 Secrets Manager에 저장된 경우 필요해요.
PrivateLink 엔드포인트 구성은 이벤트 소스 매핑이 온디맨드 모드를 사용할 때만 필요해요. 이벤트 소스 매핑이 프로비저닝 모드를 사용한다면 Lambda가 필요한 연결을 직접 설정해요.
PrivateLink 엔드포인트는 AWS PrivateLink를 통해 AWS 서비스에 대한 안전하고 프라이빗한 접근을 허용해요. 또는 NAT 게이트웨이를 구성해서 MSK 클러스터에 공개 인터넷 접근을 주려면 MSK 이벤트 소스용 NAT 게이트웨이 구성을 참고하세요.
VPC 엔드포인트를 구성한 후 MSK 클러스터는 Lambda, STS, 선택적으로 Secrets Manager에 대한 직접적이고 프라이빗한 접근을 가져야 해요.
다음 단계는 콘솔을 사용해 PrivateLink 엔드포인트를 구성하는 방법을 안내해요. 각 엔드포인트(Lambda, STS, Secrets Manager)에 대해 필요에 따라 이 단계를 반복하세요.
VPC PrivateLink 엔드포인트 구성(콘솔)
-
Amazon VPC 콘솔을 열고 왼쪽 메뉴에서 Endpoints을 선택해요.
-
Create endpoint를 선택해요.
-
선택적으로 엔드포인트의 이름을 입력해요.
-
Type에 대해 AWS services를 선택해요.
-
Services 아래에서 서비스 이름 입력을 시작해요. 예를 들어 Lambda에 연결하는 엔드포인트를 만들려면 검색 상자에
lambda를 입력해요. -
결과에서 현재 리전의 서비스 엔드포인트가 보일 거예요. 예를 들어 미국 동부(버지니아 북부) 리전에서는
com.amazonaws.us-east-2.lambda가 보일 거예요. 이 서비스를 선택해요. -
Network settings 아래에서 MSK 클러스터가 있는 VPC를 선택해요.
-
Subnets 아래에서 MSK 클러스터가 있는 AZ를 선택해요.
- 각 AZ에 대해 Subnet ID 아래에서 MSK 클러스터가 있는 프라이빗 서브넷을 선택해요.
-
Security groups 아래에서 MSK 클러스터와 연결된 보안 그룹을 선택해요.
-
Create endpoint를 선택해요.
기본적으로 Amazon VPC 엔드포인트는 리소스에 대한 광범위한 접근을 허용하는 개방형 IAM 정책을 가져요. 모범 사례는 이 정책을 제한해서 해당 엔드포인트를 사용해서 필요한 작업만 수행하도록 하는 것이에요. 예를 들어 Secrets Manager 엔드포인트의 정책을 수정해서 함수의 실행 역할만 시크릿에 접근할 수 있게 할 수 있어요.
예시 VPC 엔드포인트 정책 – Secrets Manager 엔드포인트
{
"Statement": [
{
"Action": "secretsmanager:GetSecretValue",
"Effect": "Allow",
"Principal": {
"AWS": [
{{"arn:aws::iam::123456789012:role/my-role"}}
]
},
"Resource": {{"arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"}}
}
]
}
AWS STS와 Lambda 엔드포인트의 경우 호출 보안 주체를 Lambda 서비스 보안 주체로 제한할 수 있어요. 다만 이러한 정책에서는 "Resource": "*"를 사용해야 해요.
예시 VPC 엔드포인트 정책 – AWS STS 엔드포인트
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Resource": "*"
}
]
}
예시 VPC 엔드포인트 정책 – Lambda 엔드포인트
{
"Statement": [
{
"Action": "lambda:InvokeFunction",
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Resource": "*"
}
]
}
더 알아보기 (Learn more)
Lambda용 Amazon MSK 이벤트 소스 구성에 대한 자세한 내용은 Lambda용 Amazon MSK 이벤트 소스 구성을 참고하세요.