Lambda용 자체 관리형 Apache Kafka 이벤트 소스 구성
자체 관리형 Apache Kafka 클러스터에 대한 이벤트 소스 매핑을 생성하기 전에 클러스터와 클러스터가 위치한 VPC가 올바르게 구성되었는지 확인해야 합니다. 또한 Lambda 함수의 실행역할에 필요한 IAM 권한이 있는지 확인해야 합니다.
다음 섹션의 지침에 따라 자체 관리형 Apache Kafka 클러스터 및 Lambda 함수를 구성합니다. 이벤트 소스 매핑을 생성하는 방법에 대한 자세한 내용은 Kafka 클러스터를 이벤트 소스로 추가 섹션을 참조하세요.
Kafka 클러스터 인증
Lambda는 자체 관리형 Apache Kafka 클러스터를 통해 인증하는 여러 가지 방법을 지원합니다. 지원되는 인증 방법 중 하나를 사용하도록 Kafka 클러스터를 구성해야 합니다. Kafka 보안에 대한 자세한 내용은 Kafka 설명서의 보안
SASL/SCRAM 인증
Lambda는 전송 계층 보안(TLS) 암호화(SASL_SSL
)를 통해 Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism(SASL/SCRAM) 인증을 지원합니다. Lambda는 암호화된 자격 증명을 전송하여 클러스터에서 인증합니다. Lambda는 일반 텍스트(SASL_PLAINTEXT
)가 포함된 SASL/SCRAM을 지원하지 않습니다. SASL/SCRAM 인증에 관한 자세한 내용은 RFC 5802
Lambda는 SASL/PLAIN 인증도 지원합니다. 이 메커니즘은 일반 텍스트 보안 인증을 사용하므로, 서버에 연결할 때 TLS 암호화를 사용하여 보안 인증 정보를 보호해야 합니다.
SASL 인증의 경우 로그인 자격 증명을 AWS Secrets Manager에 보안 암호로 저장합니다. Secrets Manager 사용에 대한 자세한 내용은 AWS Secrets Manager사용 설명서의 자습서: 비밀 정보 생성 및 검색을 참조하세요.
중요
인증에 Secrets Manager를 사용하려면 Lambda 함수와 동일한 AWS 리전에 보안 암호를 저장해야 합니다.
상호 TLS 인증
상호 TLS(mTLS)는 클라이언트와 서버 간의 양방향 인증을 제공합니다. 클라이언트는 서버가 클라이언트를 확인할 수 있도록 서버에 인증서를 보내고, 서버는 클라이언트가 서버를 확인할 수 있도록 클라이언트에 인증서를 보냅니다.
자체 관리형 Apache Kafka에서 Lambda는 클라이언트 역할을 수행합니다. 클라이언트 인증서(Secrets Manager의 비밀 정보)를 구성하여 Kafka 브로커로 Lambda를 인증합니다. 클라이언트 인증서는 서버의 신뢰 저장소에 있는 CA에서 서명해야 합니다.
Kafka 클러스터는 서버 인증서를 Lambda로 전송하여 Lambda로 Kafka 브로커를 인증합니다. 서버 인증서는 퍼블릭 CA 인증서 또는 프라이빗 CA/자체 서명 인증서일 수 있습니다. 퍼블릭 CA 인증서는 Lambda 신뢰 저장소에 있는 인증 기관(CA)에서 서명해야 합니다. 프라이빗 CA/자체 서명 인증서의 경우 서버 루트 CA 인증서(Secrets Manager의 비밀 정보로)를 구성합니다. Lambda는 루트 인증서를 사용하여 Kafka 브로커를 확인합니다.
mTLS에 대한 자세한 내용은 이벤트 소스로 Amazon MSK에 대한 상호 TLS 인증 도입
클라이언트 인증서 비밀 정보 구성
CLIENT_CERTIFICATE_TLS_AUTH 비밀 정보에 인증서 필드와 프라이빗 키 필드가 필요합니다. 암호화된 프라이빗 키의 경우 비밀 정보에 프라이빗 키 암호가 필요합니다. 인증서와 프라이빗 키는 모두 PEM 형식이어야 합니다.
참고
Lambda는 PBES1
인증서 필드에는 클라이언트 인증서부터 시작하여 중간 인증서가 이어지고 루트 인증서로 끝나는 인증서 목록이 포함되어야 합니다. 각 인증서는 다음 구조의 새 줄에서 시작해야 합니다.
-----BEGIN CERTIFICATE----- <certificate contents> -----END CERTIFICATE-----
Secrets Manager는 최대 65,536바이트의 보안 정보를 지원하므로 긴 인증서 체인을 위한 충분한 공간입니다.
프라이빗 키는 다음 구조의 PKCS #8
-----BEGIN PRIVATE KEY----- <private key contents> -----END PRIVATE KEY-----
암호화된 프라이빗 키의 경우 다음 구조를 사용합니다.
-----BEGIN ENCRYPTED PRIVATE KEY----- <private key contents> -----END ENCRYPTED PRIVATE KEY-----
다음 예제에서는 암호화된 프라이빗 키를 사용한 mTLS 인증용 비밀 정보 콘텐츠를 표시합니다. 암호화된 프라이빗 키의 경우 비밀 정보에 프라이빗 키 암호를 포함합니다.
{"privateKeyPassword":"testpassword", "certificate":"-----BEGIN CERTIFICATE----- MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw ... j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk cmUuiAii9R0= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb ... rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg== -----END CERTIFICATE-----", "privateKey":"-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp ... QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA== -----END ENCRYPTED PRIVATE KEY-----" }
서버 루트 CA 인증서 비밀 정보 구성
Kafka 브로커가 프라이빗 CA에서 서명한 인증서로 TLS 암호화를 사용하는 경우 이 비밀 정보를 생성합니다. VPC, SASL/SCRAM, SASL/PLAIN 또는 mTLS 인증에 TLS 암호화를 사용할 수 있습니다.
서버 루트 CA 인증서 비밀 정보에는 PEM 형식의 Kafka 브로커의 루트 CA 인증서가 포함된 필드가 필요합니다. 다음 예제는 비밀 정보의 구조를 보여줍니다.
{"certificate":"-----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dG... -----END CERTIFICATE-----" }
API 액세스 및 Lambda 함수 권한
자체 관리형 Kafka 클러스터에 액세스하는 것 외에도 Lambda 함수에는 다양한 API 작업을 수행할 수 있는 권한이 필요합니다. 함수의 실행 역할에 이러한 권한을 추가합니다. 사용자가 API 작업에 액세스해야 하는 경우 AWS Identity and Access Management(IAM) 사용자 또는 역할에 자격 증명 정책에 필요한 권한을 추가합니다.
필요한 Lambda 함수 권한
Amazon CloudWatch Logs의 로그 그룹에 로그를 생성하고 저장하려면 Lambda 함수의 실행 역할에 다음 권한이 있어야 합니다.
선택적 Lambda 함수 권한
Lambda 함수에 또한 다음 권한이 필요할 수 있습니다.
-
Secrets Manager 비밀 정보를 설명합니다.
-
AWS Key Management Service(AWS KMS) 고객 관리형 키에 액세스합니다.
-
Amazon VPC에 액세스합니다.
-
실패한 간접 호출 기록을 대상으로 전송합니다.
Secrets Manager 및 AWS KMS 권한
Kafka 브로커에 대해 구성하는 액세스 제어 유형에 따라 Lambda 함수에는 Secrets Manager 비밀 정보에 액세스하거나 AWS KMS 고객 관리형 키를 복호화할 수 있는 권한이 필요할 수 있습니다. 리소스에 액세스하려면 함수의 실행 역할에 다음 권한이 주어져야 합니다.
VPC 권한
VPC 내의 사용자만 자체 관리형 Apache Kafka 클러스터에 액세스할 수 있는 경우 Lambda 함수에 Amazon VPC 리소스에 액세스할 수 있는 권한이 있어야 합니다. 이러한 리소스에는 VPC, 서브넷, 보안 그룹 및 네트워크 인터페이스가 있습니다. 리소스에 액세스하려면 함수의 실행 역할에 다음 권한이 주어져야 합니다.
실행 역할에 권한 추가
자체 관리형 Apache Kafka 클러스터가 사용하는 다른 AWS 서비스에 액세스하기 위해 Lambda는 함수의 실행 역할에 정의된 권한 정책을 사용합니다.
기본적으로 Lambda는 자체 관리형 Apache Kafka 클러스터에 대한 필수 또는 선택적 작업을 수행할 수 없습니다. 실행 역할에 대한 IAM 신뢰 정책에서 이러한 작업을 생성하고 정의해야 합니다. 이 예제에서는 Lambda가 Amazon VPC 리소스에 액세스하도록 허용하는 정책을 생성하는 방법을 보여줍니다.
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcs", "ec2:DeleteNetworkInterface", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ], "Resource":"*" } ] }
IAM 정책을 사용하여 사용자에게 액세스 권한 부여
기본적으로 사용자 및 역할에는 이벤트 소스 API 작업을 수행할 수 있는 권한이 없습니다. 조직 또는 계정의 사용자에게 액세스 권한을 부여하려면 자격 증명 기반 정책을 생성 혹은 업데이트합니다. 자세한 내용은 IAM 사용 설명서의 정책을 사용하여 AWS 리소스에 대한 액세스 제어를 참조하세요.
네트워크 보안 구성
이벤트 소스 매핑을 통해 Lambda가 자체 관리형 Apache Kafka에 대한 전체 액세스 권한을 부여하려면 클러스터에서 퍼블릭 엔드포인트(퍼블릭 IP 주소)를 사용하거나 클러스터를 생성한 Amazon VPC에 대한 액세스 권한을 제공해야 합니다.
Lambda에서 자체 관리형 Apache Kafka를 사용하는 경우 함수에 Amazon VPC의 리소스에 대한 액세스 권한을 제공하는 AWS PrivateLink VPC 엔드포인트를 생성합니다.
참고
이벤트 폴러에 기본(온디맨드) 모드를 사용하는 이벤트 소스 매핑을 포함하는 함수에 대해 AWS PrivateLink VPC 엔드포인트가 필요합니다. 이벤트 소스 매핑에서 프로비저닝된 모드를 사용하는 경우 AWS PrivateLink VPC 엔드포인트를 구성하지 않아도 됩니다.
다음 리소스에 대한 액세스를 제공하는 엔드포인트를 생성합니다.
-
Lambda - Lambda 서비스 위탁자에 대한 엔드포인트를 생성합니다.
-
AWS STS - 서비스 위탁자가 사용자를 대신하여 역할을 맡을 수 있도록 AWS STS에 대한 엔드포인트를 생성합니다.
-
Secrets Manager - 클러스터에서 Secrets Manager를 사용하여 자격 증명을 저장하는 경우 Secrets Manager를 위한 엔드포인트를 생성합니다.
또는 Amazon VPC의 각 퍼블릭 서브넷에 NAT 게이트웨이를 구성합니다. 자세한 내용은 VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화 단원을 참조하십시오.
자체 관리형 Apache Kafka에 대한 이벤트 소스 매핑을 생성하면 Lambda는 Amazon VPC에 대해 구성된 서브넷과 보안 그룹을 위한 탄력적 네트워크 인터페이스(ENI)가 이미 존재하는지 확인합니다. Lambda가 기존 ENI를 찾으면 이를 재사용하려고 시도합니다. 그렇지 않으면 Lambda가 이벤트 소스에 연결하고 함수를 간접 호출하기 위해 새 ENI를 생성합니다.
참고
Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행됩니다. 함수의 VPC 구성은 이벤트 소스 매핑에 영향을 미치지 않습니다. 이벤트 소스의 네트워킹 구성에 따라 Lambda가 이벤트 소스에 연결하는 방식이 결정됩니다.
클러스터가 포함된 Amazon VPC에 대한 보안 그룹을 구성합니다. 기본적으로 자체 관리형 Apache Kafka는 9092
포트를 사용합니다.
-
인바운드 규칙 – 이벤트 소스와 연결된 보안 그룹에 대한 기본 클러스터 포트의 모든 트래픽을 허용합니다.
-
아웃바운드 규칙 – 모든 대상에 대해
443
포트의 모든 트래픽을 허용합니다. 이벤트 소스와 연결된 보안 그룹의 기본 클러스터 포트에서 모든 트래픽을 허용합니다. -
Amazon VPC 엔드포인트 인바운드 규칙 - Amazon VPC 엔드포인트를 사용하는 경우 Amazon VPC 엔드포인트와 연결된 보안 그룹이 클러스터 보안 그룹에서
443
포트의 인바운드 트래픽을 허용해야 합니다.
클러스터가 인증을 사용하는 경우 Secrets Manager 엔드포인트에 대한 엔드포인트 정책을 제한할 수도 있습니다. Secrets Manager API를 호출하기 위해 Lambda는 Lambda 서비스 보안 주체가 아닌 함수 역할을 사용합니다.
예 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
" } ] }
Amazon VPC 엔드포인트를 사용하는 경우 AWS에서는 엔드포인트의 탄력적 네트워크 인터페이스(ENI)를 사용하여 함수를 간접 호출하도록 API 직접 호출을 라우팅합니다. Lambda 서비스 위탁자는 해당 ENI를 사용하는 모든 역할과 함수에서 lambda:InvokeFunction
을 직접 호출해야 합니다.
기본적으로 Amazon VPC 엔드포인트에는 리소스에 대한 광범위한 액세스를 허용하는 개방형 IAM 정책이 있습니다. 모범 사례는 해당 엔드포인트를 사용하여 필요한 작업을 수행하도록 이러한 정책을 제한하는 것입니다. 이벤트 소스 매핑이 Lambda 함수를 간접 호출할 수 있도록 하려면 VPC 엔드포인트 정책에서 Lambda 서비스 위탁자가 sts:AssumeRole
및 lambda:InvokeFunction
을 직접 호출할 수 있도록 허용해야 합니다. 조직 내에서 발생하는 API 직접 호출만 허용하도록 VPC 엔드포인트 정책을 제한하면 이벤트 소스 매핑이 제대로 작동하지 않으므로 이 정책에는 "Resource": "*"
가 필요합니다.
다음 예제 VPC 엔드포인트 정책은 AWS STS 및 Lambda 엔드포인트에 대해 Lambda 서비스 보안 주체에 필요한 액세스 권한을 부여하는 방법을 안내합니다.
예 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": "*" } ] }