Lambda용 자체 관리형 Apache Kafka 이벤트 소스 구성 - AWS Lambda

Lambda용 자체 관리형 Apache Kafka 이벤트 소스 구성

자체 관리형 Apache Kafka 클러스터에 대한 이벤트 소스 매핑을 생성하기 전에 클러스터와 클러스터가 위치한 VPC가 올바르게 구성되었는지 확인해야 합니다. 또한 Lambda 함수의 실행역할에 필요한 IAM 권한이 있는지 확인해야 합니다.

다음 섹션의 지침에 따라 자체 관리형 Apache Kafka 클러스터 및 Lambda 함수를 구성합니다. 이벤트 소스 매핑을 생성하는 방법에 대한 자세한 내용은 Kafka 클러스터를 이벤트 소스로 추가 섹션을 참조하세요.

Kafka 클러스터 인증

Lambda는 자체 관리형 Apache Kafka 클러스터를 통해 인증하는 여러 가지 방법을 지원합니다. 지원되는 인증 방법 중 하나를 사용하도록 Kafka 클러스터를 구성해야 합니다. Kafka 보안에 대한 자세한 내용은 Kafka 설명서의 보안 섹션을 참조하세요.

VPC 액세스

VPC 내의 Kafka 사용자만 Kafka 브로커에 액세스하는 경우 Amazon Virtual Private Cloud(Amazon VPC) 액세스에 대해 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(PBES2가 아님) 프라이빗 키 암호화 알고리즘을 지원합니다.

인증서 필드에는 클라이언트 인증서부터 시작하여 중간 인증서가 이어지고 루트 인증서로 끝나는 인증서 목록이 포함되어야 합니다. 각 인증서는 다음 구조의 새 줄에서 시작해야 합니다.

-----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-----" }

네트워크 구성

Lambda가 Kafka 클러스터를 이벤트 소스로 사용하려면 클러스터가 있는 Amazon VPC에 액세스해야 합니다. Lambda가 VPC에 액세스할 수 있도록 AWS PrivateLink VPC 엔드포인트를 배포하는 것이 좋습니다. Lambda 및 AWS Security Token Service(AWS STS)에 대한 엔드포인트를 배포합니다. 브로커가 인증을 사용하는 경우 Secrets Manager용 VPC 엔드포인트도 배포합니다. 장애 시 대상을 구성한 경우 대상 서비스를 위한 VPC 엔드포인트도 배포합니다.

또는 Kafka 클러스터와 연결된 VPC에 퍼블릭 서브넷당 하나의 NAT 게이트웨이가 포함되는지 확인합니다. 자세한 내용은 VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화 단원을 참조하십시오.

또한 VPC 엔드포인트를 사용하는 경우 프라이빗 DNS 이름을 활성화하도록 구성해야 합니다.

자체 관리형 Apache Kafka 클러스터에 대한 이벤트 소스 매핑을 생성하는 경우 Lambda는 클러스터 VPC의 서브넷 및 보안 그룹에 대해 탄력적 네트워크 인터페이스(ENI)가 이미 존재하는지 확인합니다. Lambda가 기존 ENI를 찾으면 이를 재사용하려고 시도합니다. 그렇지 않으면 Lambda가 이벤트 소스에 연결하고 함수를 호출하기 위해 새 ENI를 생성합니다.

참고

Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행됩니다. 이러한 VPC는 서비스에 의해 자동으로 유지 관리되며 고객에게는 표시되지 않습니다. 또한 함수를 Amazon VPC에 연결할 수도 있습니다. 어느 경우든 함수의 VPC 구성은 이벤트 소스 매핑에 영향을 미치지 않습니다. 이벤트 소스의 VPC 구성에 따라 Lambda가 이벤트 소스에 연결되는 방식이 결정됩니다.

네트워크 구성에 대한 자세한 내용은 AWS 컴퓨팅 블로그의 Setting up AWS Lambda with an Apache Kafka cluster within a VPC를 참조하세요.

VPC 보안 그룹 규칙

최소한 다음 규칙을 사용하여 클러스터가 포함된 Amazon VPC의 보안 그룹을 구성합니다.

  • 인바운드 규칙 – 이벤트 소스에 대해 지정된 보안 그룹에 대해 Kafka 브로커 포트의 모든 트래픽을 허용합니다. Kafka는 기본적으로 포트 9092를 사용합니다.

  • 아웃바운드 규칙 - 모든 대상에 대해 포트 443의 모든 트래픽을 허용합니다. 이벤트 소스에 대해 지정된 보안 그룹에 대해 Kafka 브로커 포트의 모든 트래픽을 허용합니다. Kafka는 기본적으로 포트 9092를 사용합니다.

  • NAT 게이트웨이 대신 VPC 엔드포인트를 사용하는 경우 VPC 엔드포인트와 연결된 보안 그룹은 이벤트 소스의 보안 그룹에서 포트 443의 모든 인바운드 트래픽을 허용해야 합니다.

VPC 엔드포인트 작업

VPC 엔드포인트를 사용하는 경우 함수를 호출하는 API 직접 호출은 ENI를 사용하여 이러한 엔드포인트를 통해 라우팅됩니다. Lambda 서비스 보안 주체는 해당 ENI를 사용하는 모든 역할과 함수에서 sts:AssumeRolelambda:InvokeFunction을 호출해야 합니다.

기본적으로 VPC 엔드포인트에는 개방적인 IAM 정책이 있습니다. 모범 사례는 특정 보안 주체만 해당 엔드포인트를 사용하여 필요한 작업을 수행할 수 있도록 이러한 정책을 제한하는 것입니다. 이벤트 소스 매핑이 Lambda 함수를 호출할 수 있도록 하려면 VPC 엔드포인트 정책에서 Lambda 서비스 원칙이 sts:AssumeRolelambda:InvokeFunction을 호출할 수 있도록 허용해야 합니다. 조직 내에서 발생하는 API 직접 호출만 허용하도록 VPC 엔드포인트 정책을 제한하면 이벤트 소스 매핑이 제대로 작동하지 않습니다.

다음 예제 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": "*" } ] }

Kafka 브로커 클러스터가 인증을 사용하는 경우 Secrets Manager 엔드포인트에 대한 VPC 엔드포인트 정책을 제한할 수도 있습니다. Secrets Manager API를 호출하기 위해 Lambda는 Lambda 서비스 보안 주체가 아닌 함수 역할을 사용합니다. 다음 예제는 Secrets Manager 엔드포인트 정책을 보여줍니다.

예 VPC 엔드포인트 정책 – Secrets Manager 엔드포인트
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

장애 발생 시 대상을 구성한 경우 Lambda는 함수의 역할을 사용하여 Lambda 관리형 ENI를 사용하여 s3:PutObject, sns:Publish 또는 sqs:sendMessage를 호출합니다.

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 콘솔에서 JSON 정책 문서를 생성하는 방법에 대한 자세한 내용은 IAM 사용 설명서의 JSON 탭에서 정책 생성을 참조하세요.

IAM 정책을 사용하여 사용자에게 액세스 권한 부여

기본적으로 사용자 및 역할에는 이벤트 소스 API 작업을 수행할 수 있는 권한이 없습니다. 조직 또는 계정의 사용자에게 액세스 권한을 부여하려면 자격 증명 기반 정책을 생성 혹은 업데이트합니다. 자세한 내용은 IAM 사용 설명서의 정책을 사용하여 AWS 리소스에 대한 액세스 제어를 참조하세요.