Lambda용 Amazon MSK 이벤트 소스 구성
Amazon MSK 클러스터에 대한 이벤트 소스 매핑을 생성하기 전에 클러스터와 클러스터가 위치한 VPC가 올바르게 구성되었는지 확인해야 합니다. 또한 Lambda 함수의 실행역할에 필요한 IAM 권한이 있는지 확인해야 합니다.
다음 섹션의 지침에 따라 Amazon MSK 클러스터, VPC 및 Lambda 함수를 구성합니다. 이벤트 소스 매핑을 생성하는 방법에 대한 자세한 내용은 Amazon MSK를 이벤트 소스로 추가 섹션을 참조하세요.
MSK 클러스터 인증
Lambda는 Amazon MSK 클러스터에 액세스하고 레코드를 검색하고 다른 태스크를 수행할 수 있는 권한이 필요합니다. Amazon MSK는 MSK 클러스터에 대한 클라이언트 액세스를 제어하는 몇 가지 옵션을 지원합니다.
인증되지 않은 액세스
인터넷을 통해 클러스터에 액세스하는 클라이언트가 없는 경우 인증되지 않은 액세스를 사용할 수 있습니다.
SASL/SCRAM 인증
Amazon MSK는 전송 계층 보안(TLS) 암호화를 통해 Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism(SASL/SCRAM) 인증을 지원합니다. Lambda가 클러스터에 연결하려면 인증 자격 증명 (사용자 이름 및 암호)을 AWS Secrets Manager 비밀 정보에 저장합니다.
Secrets Manager 사용에 대한 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 AWS Secrets Manager를 사용한 사용자 이름 및 암호 인증을 참조하세요.
Amazon MSK는 SASL/PLAIN 인증을 지원하지 않습니다.
IAM 역할 기반 인증
IAM을 사용하여 MSK 클러스터에 연결하는 클라이언트의 자격 증명을 인증할 수 있습니다. IAM 인증이 MSK 클러스터에서 활성 상태이고 인증을 위한 암호를 제공하지 않으면 Lambda는 자동으로 IAM 인증을 사용하도록 기본 설정됩니다. 사용자 또는 역할 기반 정책을 생성하고 배포하려면 IAM 콘솔 또는 API를 사용합니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 IAM 액세스 제어를 참조하세요.
Lambda가 MSK 클러스터에 연결하고 레코드를 읽고 기타 필수 작업을 수행할 수 있도록 하려면 함수의 실행 역할에 다음 권한을 추가합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kafka-cluster:Connect", "kafka-cluster:DescribeGroup", "kafka-cluster:AlterGroup", "kafka-cluster:DescribeTopic", "kafka-cluster:ReadData", "kafka-cluster:DescribeClusterDynamicConfiguration" ], "Resource": [ "arn:aws:kafka:
region
:account-id
:cluster/cluster-name
/cluster-uuid
", "arn:aws:kafka:region
:account-id
:topic/cluster-name
/cluster-uuid
/topic-name
", "arn:aws:kafka:region
:account-id
:group/cluster-name
/cluster-uuid
/consumer-group-id
" ] } ] }
이러한 권한의 범위를 특정 클러스터, 주제 및 그룹으로 설정할 수 있습니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 Amazon MSK Kafka 작업을 참조하세요.
상호 TLS 인증
상호 TLS(mTLS)는 클라이언트와 서버 간의 양방향 인증을 제공합니다. 클라이언트는 서버가 클라이언트를 확인할 수 있도록 서버에 인증서를 보내고, 서버는 클라이언트가 서버를 확인할 수 있도록 클라이언트에 인증서를 보냅니다.
Amazon MSK의 경우 Lambda가 클라이언트 역할을 합니다. 클라이언트 인증서(Secrets Manager의 비밀 정보)를 구성하여 MSK 클러스터의 브로커로 Lambda를 인증합니다. 클라이언트 인증서는 서버의 신뢰 저장소에 있는 CA에서 서명해야 합니다. MSK 클러스터는 서버 인증서를 Lambda로 전송하여 Lambda로 브로커를 인증합니다. 서버 인증서는 AWS 신뢰 저장소에 있는 인증 기관(CA)에서 서명해야 합니다.
클라이언트 인증서를 생성하는 방법에 대한 지침은 Introducing mutual TLS authentication for Amazon MSK as an event source
Amazon MSK는 자체 서명된 서버 인증서를 지원하지 않습니다. Amazon MSK의 모든 브로커는 기본적으로 Lambda가 신뢰하는 Amazon Trust Services CA에서 서명한 퍼블릭 인증서
Amazon MSK용 mTLS에 대한 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 상호 TLS 인증을 참조하세요.
mTLS 암호 구성
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-----" }
Lambda이 부트스트랩 브로커를 선택하는 방법
Lambda는 클러스터에서 사용할 수 있는 인증 방법 및 인증을 위한 암호 제공 여부를 기반으로 부트스트랩 브로커를 선택합니다. mTLS 또는 SASL/SCRAM에 대한 암호를 제공하면 Lambda가 자동으로 해당 인증 방법을 선택합니다. 암호를 제공하지 않으면 Lambda가 클러스터에서 활성화된 가장 강력한 인증 방법을 선택합니다. 다음은 Lambda가 가장 강력한 인증부터 가장 약한 인증까지 브로커를 선택하는 우선 순위입니다.
mTLS(MTL에 제공되는 암호)
SASL/SCRAM(SASL/SCRAM에 대해 제공되는 암호)
SASL IAM(암호가 제공되지 않았으며 IAM 인증이 활성화됨)
인증되지 않은 TLS(암호가 제공되지 않고 IAM 인증이 활성화되지 않음)
일반 텍스트(암호가 제공되지 않고 IAM 인증 및 인증되지 않은 TLS가 모두 활성화되지 않음)
참고
Lambda가 가장 안전한 브로커 유형에 연결할 수 없는 경우 Lambda는 다른 (약한) 브로커 유형에 연결을 시도하지 않습니다. Lambda가 더 약한 브로커 유형을 선택하게 하려면 클러스터에서 더 강력한 인증 방법을 모두 비활성화하십시오.
API 액세스 및 권한 관리
Amazon MSK 클러스터에 액세스하는 것 외에도 함수에는 다양한 Amazon MSK API 작업을 수행할 수 있는 권한이 필요합니다. 이러한 권한을 함수의 실행 역할에 추가합니다. 사용자가 Amazon MSK API 작업에 액세스해야 하는 경우 사용자 또는 역할에 대한 자격 증명 정책에 필요한 권한을 추가합니다.
실행 역할에 다음과 같은 권한을 각각 수동으로 추가할 수 있습니다. 또는 AWS 관리형 정책 AWSLambdaMSKExecutionRole을 실행 역할에 연결할 수도 있습니다. AWSLambdaMSKExecutionRole
정책에는 아래 나열된 모든 필수 API 작업 및 VPC 권한이 포함되어 있습니다.
필요한 Lambda 함수 실행 역할 권한
Amazon CloudWatch Logs의 로그 그룹에 로그를 생성하고 저장하려면 Lambda 함수의 실행 역할에 다음 권한이 있어야 합니다.
Lambda가 사용자를 대신하여 Amazon MSK 클러스터에 액세스하기 위해서는 Lambda 함수의 실행 역할에 다음 권한이 있어야 합니다.
-
kafka:DescribeVpcConnection: 계정 간 이벤트 소스 매핑에만 필요합니다.
-
kafka:ListVpcConnections: 실행 역할에는 필요하지 않지만 계정 간 이벤트 소스 매핑을 생성하는 IAM 보안 주체에는 필요합니다.
kafka:DescribeCluster
과 kafka:DescribeClusterV2
중 하나만 추가하면 됩니다. 프로비저닝된 MSK 클러스터의 경우 두 권한 모두 작동합니다. 서버리스 MSK 클러스터의 경우 kafka:DescribeClusterV2
을 사용해야 합니다.
참고
Lambda는 결국 관련된 AWSLambdaMSKExecutionRole
관리 정책에서 kafka:DescribeCluster
권한을 제거할 계획입니다. 이 정책을 사용하면, 대신 kafka:DescribeClusterV2
을 사용하기 위해서는 kafka:DescribeCluster
을 이용하는 애플리케이션을 모두 마이그레이션해야 합니다.
VPC 권한
VPC 내의 사용자만 Amazon MSK 클러스터에 액세스할 수 있는 경우 Lambda 함수에는 Amazon VPC 리소스에 액세스할 수 있는 권한이 있어야 합니다. 이러한 리소스에는 VPC, 서브넷, 보안 그룹 및 네트워크 인터페이스가 있습니다. 리소스에 액세스하려면 함수의 실행 역할에 다음 권한이 주어져야 합니다. 이러한 권한은 AWSLambdaMSKExecutionRole AWS 관리형 정책에 포함됩니다.
선택적 Lambda 함수 권한
Lambda 함수에 또한 다음 권한이 필요할 수 있습니다.
-
SASL/SCRAM 인증을 사용하는 경우 SCRAM 암호에 액세스하십시오.
-
Secrets Manager 비밀 정보를 설명합니다.
-
AWS Key Management Service(AWS KMS) 고객 관리형 키에 액세스합니다.
-
실패한 간접 호출 기록을 대상으로 전송합니다.
Secrets Manager 및 AWS KMS 권한
Amazon MSK 브로커에 대해 구성하는 액세스 제어 유형에 따라 Lambda 함수에는 SCRAM 비밀(SASL/SCRAM 인증 이용 시) 또는 Secrets Manager 암호 정보에 액세스하여 AWS KMS 고객 관리형 키를 복호화할 수 있는 권한이 필요할 수도 있습니다. 리소스에 액세스하려면 함수의 실행 역할에 다음 권한이 주어져야 합니다.
실행 역할에 권한 추가
IAM 콘솔을 사용하여 AWS 관리형 정책 AWSLambdaMSKExecutionRole을 실행 역할에 추가하려면 다음 단계를 따릅니다.
AWS 관리형 정책을 추가하려면
-
IAM 콘솔에서 정책 페이지
를 엽니다. -
검색 상자에 정책 이름(
AWSLambdaMSKExecutionRole
)을 입력합니다. -
목록에서 정책을 선택한 다음 정책 작업(Policy actions), 연결(Attach)을 선택합니다.
-
정책 연결(Attach policy) 페이지의 목록에서 실행 역할을 선택한 다음 정책 연결을 선택합니다.
IAM 정책을 사용하여 사용자에게 액세스 권한 부여
기본적으로 사용자 및 역할은 Amazon MSK API 작업을 수행할 수 있는 권한이 없습니다. 조직 또는 계정의 사용자에게 액세스 권한을 부여하려면 자격 증명 기반 정책을 추가 혹은 업데이트할 수 있습니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 Amazon MSK 자격 증명 기반 정책 예제를 참조하세요.
인증 및 권한 부여 오류
Amazon MSK 클러스터의 데이터를 사용하는 데 필요한 권한이 누락된 경우 Lambda는 LastProcessingResult 아래의 이벤트 소스 매핑에 다음 오류 메시지 중 하나를 표시합니다.
클러스터가 Lambda를 인증하지 못함
SASL/SCRAM 또는 mMTS의 경우 이 오류는 제공된 사용자에게 다음 필수 Kafka 액세스 제어 목록(ACL) 권한이 모두 있지는 않음을 나타냅니다.
DescribeConfigs 클러스터
그룹 설명
그룹 읽기
주제 설명
Thread-Topic
IAM 액세스 제어의 경우 함수의 실행 역할에 그룹 또는 주제에 액세스하는 데 필요한 하나 이상의 권한이 없습니다. IAM 역할 기반 인증에서 필요한 권한 목록을 검토합니다.
필수 Kafka 클러스터 권한이 있는 Kafka ACL 또는 IAM 정책을 생성할 때 주제와 그룹을 리소스로 지정합니다. 주제 이름은 이벤트 소스 매핑의 주제와 일치해야 합니다. 그룹 이름은 이벤트 소스 매핑의 UUID와 일치해야 합니다.
실행 역할에 필요한 권한을 추가한 후 변경 사항이 적용되기까지 몇 분 정도 소요될 수 있습니다.
SASL 인증 실패
SASL/SCRAM의 경우 이 오류는 제공된 사용자 이름과 암호가 유효하지 않음을 나타냅니다.
IAM 액세스 제어의 경우 실행 역할에 MSK 클러스터에 대한 kafka-cluster:Connect
권한이 없습니다. 역할에 이 권한을 추가하고 클러스터의 Amazon 리소스 이름(ARN)을 리소스로 지정합니다.
이 오류가 간헐적으로 발생하는 경우가 있습니다. TCP 연결 수가 Amazon MSK 서비스 할당량을 초과하면 클러스터는 연결을 거부합니다. Lambda는 연결이 성공할 때까지 취소하고 다시 시도합니다. Lambda가 클러스터에 연결하고 레코드를 폴링하면 마지막 처리 결과가 OK
로 변경됩니다.
서버가 Lambda를 인증하지 못함
이 오류는 Amazon MSK Kafka 브로커가 Lambda로 인증하지 못했음을 나타냅니다. 이 오류는 다음과 같은 이유로 발생할 수 있습니다.
mTLS 인증을 위한 클라이언트 인증서를 제공하지 않았습니다.
클라이언트 인증서를 제공했지만 브로커가 mTLS를 사용하도록 구성되지 않았습니다.
브로커가 클라이언트 인증서를 신뢰하지 않습니다.
제공된 인증서 또는 프라이빗 키가 잘못됨
이 오류는 Amazon MSK 소비자가 제공된 인증서 또는 프라이빗 키를 사용할 수 없음을 나타냅니다. 인증서와 키가 PEM 형식을 사용하고 프라이빗 키 암호화가 PBES1 알고리즘을 사용하는지 확인합니다.
네트워크 보안 구성
이벤트 소스 매핑을 통해 Lambda에 Amazon MSK에 대한 전체 액세스 권한을 부여하려면 클러스터에서 퍼블릭 엔드포인트(퍼블릭 IP 주소)를 사용하거나 클러스터를 생성한 Amazon VPC에 대한 액세스 권한을 제공해야 합니다.
Lambda와 함께 Amazon MSK를 사용하는 경우 AWS PrivateLink VPC 엔드포인트를 생성하고 함수에 Amazon VPC의 리소스에 대한 액세스 권한을 제공하는 것이 좋습니다.
다음 리소스에 대한 액세스를 제공하는 엔드포인트를 생성합니다.
-
Lambda - Lambda 서비스 위탁자에 대한 엔드포인트를 생성합니다.
-
AWS STS - 서비스 위탁자가 사용자를 대신하여 역할을 맡을 수 있도록 AWS STS에 대한 엔드포인트를 생성합니다.
-
Secrets Manager - 클러스터에서 Secrets Manager를 사용하여 자격 증명을 저장하는 경우 Secrets Manager를 위한 엔드포인트를 생성합니다.
또는 Amazon VPC의 각 퍼블릭 서브넷에 NAT 게이트웨이를 구성합니다. 자세한 내용은 VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화 단원을 참조하십시오.
Amazon MSK에 대한 이벤트 소스 매핑을 생성하면 Lambda는 Amazon VPC에 대해 구성된 서브넷과 보안 그룹을 위한 탄력적 네트워크 인터페이스(ENI)가 이미 존재하는지 확인합니다. Lambda가 기존 ENI를 찾으면 이를 재사용하려고 시도합니다. 그렇지 않으면 Lambda가 이벤트 소스에 연결하고 함수를 호출하기 위해 새 ENI를 생성합니다.
참고
Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행됩니다. 함수의 VPC 구성은 이벤트 소스 매핑에 영향을 미치지 않습니다. 이벤트 소스의 네트워킹 구성에 따라 Lambda가 이벤트 소스에 연결하는 방식이 결정됩니다.
클러스터가 포함된 Amazon VPC에 대한 보안 그룹을 구성합니다. 기본적으로 Amazon MSK는 일반 텍스트용 9092
, TLS용 9094
, SASL용 9096
, IAM용 9098
포트를 사용합니다.
-
인바운드 규칙 – 이벤트 소스와 연결된 보안 그룹에 대한 기본 클러스터 포트의 모든 트래픽을 허용합니다.
-
아웃바운드 규칙 – 모든 대상에 대해
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와 함께 Amazon MSK를 사용하려면 특정 역할 및 기능에만 특정 위탁자가 액세스할 수 있도록 이러한 정책을 제한할 수 있습니다.
예 엔드포인트 정책 — Lambda 엔드포인트
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "arn:aws::lambda:
us-west-2
:123456789012:function:my-function
" } ] }
또한 Lambda와 통합하려는 리소스가 AWS 계정에 배포된 이벤트 소스 매핑의 경우에는 Lambda 서비스 위탁자가 sts:AssumeRole
을 수행하여 탄력적 네트워크 인터페이스(ENI)를 사용하는 역할을 맡아야 합니다.
예 엔드포인트 정책 - AWS STS 엔드포인트
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "arn:aws::iam::123456789012:role/
my-role
" } ] }
주의
조직 내에서 발생하는 API 직접 호출만 허용하도록 엔드포인트 정책을 제한하면 이벤트 소스 매핑이 제대로 작동하지 않습니다.