**Amazon Managed Streaming for Apache Kafka (Amazon MSK)**는 Apache Kafka를 통해 스트리밍 데이터를 처리하는 애플리케이션의 개발과 실행을 완전히 관리하는 서비스입니다. Amazon MSK는 클러스터의 생성, 업데이트 및 삭제를 포함한 제어 평면 작업을 제공합니다. 이 서비스는 데이터 생성 및 소비를 포함한 Apache Kafka 데이터 평면 작업의 활용을 허용합니다. 이는 오픈 소스 버전의 Apache Kafka에서 작동하므로 기존 애플리케이션, 도구 및 플러그인과의 호환성을 보장하며, 파트너 및 Apache Kafka 커뮤니티의 플러그인을 통해 응용 프로그램 코드를 수정할 필요가 없습니다.
신뢰성 측면에서 Amazon MSK는 일반적인 클러스터 장애 시나리오를 자동으로 감지하고 복구하여 생산자 및 소비자 애플리케이션이 최소한의 중단으로 데이터 쓰기 및 읽기 작업을 계속할 수 있도록 설계되었습니다. 또한, Apache Kafka가 복제해야 하는 데이터 양을 최소화하기 위해 대체 브로커의 저장소를 재사용하려고 시도하여 데이터 복제 프로세스를 최적화하려고 합니다.
유형
AWS에서 생성할 수 있는 Kafka 클러스터에는 2가지 유형이 있습니다: Provisioned와 Serverless.
공격자의 관점에서 알아야 할 사항은 다음과 같습니다:
Serverless는 직접 공개될 수 없습니다 (공개적으로 노출된 IP가 없는 VPN에서만 실행 가능). 그러나 Provisioned는 공개 IP를 구성할 수 있습니다 (기본적으로는 그렇지 않음) 및 보안 그룹을 구성하여 관련 포트를 노출할 수 있습니다.
Serverless는 인증 방법으로 IAM만 지원합니다. Provisioned는 SASL/SCRAM (비밀번호) 인증, IAM 인증, AWS Certificate Manager (ACM) 인증 및 인증되지 않은 액세스를 지원합니다.
인증되지 않은 액세스가 활성화된 경우 Provisioned Kafka를 공개적으로 노출할 수 없습니다.
열거
#Get clustersawskafkalist-clustersawskafkalist-clusters-v2# Check the supported authenticationawskafkalist-clusters|jq-r".ClusterInfoList[].ClientAuthentication"# Get Zookeeper endpointsaws kafka list-clusters | jq -r ".ClusterInfoList[].ZookeeperConnectString, .ClusterInfoList[].ZookeeperConnectStringTls"
# Get nodes and node enspointsawskafkakafkalist-nodes--cluster-arn<cluster-arn>aws kafka kafka list-nodes --cluster-arn <cluster-arn> | jq -r ".NodeInfoList[].BrokerNodeInfo.Endpoints" # Get endpoints
# Get used kafka configsawskafkalist-configurations#Get Kafka config fileawskafkadescribe-configuration--arn<config-arn># Get version of configawskafkadescribe-configuration-revision--arn<config-arn>--revision<version># Get content of config version# If using SCRAN authentication, get used AWS secret name (not secret value)awskafkalist-scram-secrets--cluster-arn<cluster-arn>
Kafka IAM 액세스 (서버리스 환경에서)
AWS Managed Streaming for Apache Kafka (MSK)는 서버리스 환경에서 실행되는 Apache Kafka 클러스터를 제공합니다. 이를 통해 사용자는 서버 관리에 대한 부담 없이 Kafka를 사용할 수 있습니다. 그러나 이러한 서버리스 환경에서도 적절한 IAM 액세스 제어를 구성하는 것이 중요합니다.
IAM 역할 생성
AWS Management Console에 로그인합니다.
IAM 콘솔로 이동합니다.
"역할 만들기"를 선택합니다.
"서비스를 선택하여 역할을 만드십시오."란에서 "MSK"를 선택합니다.
"다음: 권한"을 선택합니다.
필요한 권한을 선택하고 "다음: 태그"를 선택합니다.
필요한 경우 역할에 태그를 추가하고 "다음: 검토"를 선택합니다.
역할에 적절한 이름을 지정하고 "역할 만들기"를 선택합니다.
IAM 역할 연결
AWS Management Console에 로그인합니다.
MSK 클러스터가 있는 AWS 콘솔로 이동합니다.
클러스터를 선택하고 "작업" 메뉴에서 "IAM 역할 연결"을 선택합니다.
"IAM 역할 연결" 대화 상자에서 "IAM 역할 연결"을 선택합니다.
"IAM 역할" 드롭다운 메뉴에서 이전에 생성한 IAM 역할을 선택합니다.
"업데이트"를 선택하여 변경 사항을 저장합니다.
이제 서버리스 환경에서 Kafka에 대한 적절한 IAM 액세스 제어가 설정되었습니다. 이를 통해 보안을 강화하고 불필요한 액세스를 방지할 수 있습니다.
# Guide from https://docs.aws.amazon.com/msk/latest/developerguide/create-serverless-cluster.html# Download Kafkawgethttps://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgztar-xzfkafka_2.12-2.8.1.tgz# In kafka_2.12-2.8.1/libs download the MSK IAM JAR file.cdkafka_2.12-2.8.1/libswgethttps://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar# Create file client.properties in kafka_2.12-2.8.1/binsecurity.protocol=SASL_SSLsasl.mechanism=AWS_MSK_IAMsasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler# Export endpoints addressexport BS=boot-ok2ngypz.c2.kafka-serverless.us-east-1.amazonaws.com:9098## Make sure you will be able to access the port 9098 from the EC2 instance (check VPS, subnets and SG)# Create a topic called msk-serverless-tutorialkafka_2.12-2.8.1/bin/kafka-topics.sh --bootstrap-server $BS --command-config client.properties --create --topic msk-serverless-tutorial --partitions 6
# Send message of every new linekafka_2.12-2.8.1/bin/kafka-console-producer.sh --broker-list $BS --producer.config client.properties --topic msk-serverless-tutorial
# Read messageskafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server $BS --consumer.config client.properties --topic msk-serverless-tutorial --from-beginning
만약 Provisioned Kafka가 있는 VPC에 액세스할 수 있다면, 인증되지 않은 액세스를 활성화할 수 있습니다. 만약 SASL/SCRAM 인증이 사용된다면, 비밀번호를 비밀에서 읽어들이고, 일부 다른 제어된 사용자 IAM 권한을 부여하거나 (IAM 또는 서버리스 사용 시) 인증서로 지속성을 유지할 수 있습니다.