AWS MSK Kafka开启公共访问权限(Public Access)

AWS MSK Kafka是AWS推出的一种托管式Kafka服务,它提供了一个完全托管的Kafka集群,无需管理Kafka集群的基础设施。在使用AWS MSK Kafka的过程中,有时候我们需要开启公共访问权限,以便外部服务可以访问到我们的Kafka集群。本文将介绍如何在AWS MSK Kafka上开启公共访问权限。

创建集群

创建集群的步骤和配置选项都比较复杂,这里推荐使用terraform来创建,下面是一个简单的例子:

resource "aws_msk_cluster" "space_kafka_test" {
  cluster_name           = var.cluster_name
  kafka_version          = var.kafka_version
  number_of_broker_nodes = var.number_of_broker_nodes

  broker_node_group_info {
    instance_type = var.instance_type
    client_subnets = var.client_subnets
    security_groups = [aws_security_group.sg.id]
    storage_info {
      ebs_storage_info {
        volume_size = 10
      }
    }
    connectivity_info {
      public_access {
        type = "SERVICE_PROVIDED_EIPS"
      }
    }
  }

  encryption_info {
    encryption_at_rest_kms_key_arn = aws_kms_key.kms.arn
  }

  client_authentication {
    unauthenticated = false
    sasl {
      iam = true
      scram = true
    }
  }

  configuration_info {
    arn      = aws_msk_configuration.config[0].arn
    revision = aws_msk_configuration.config[0].latest_revision
  }

  tags = {}
}

这里面整个的核心还是sasl.iamsasl.scram的配置,iam是指使用AWS IAM来进行认证,scram是指使用用户名密码来进行认证。iam这边我需要用来配置zookeeper,创建主题等操作,scram这边我需要用来配置访问kafka集群。

Kafka ACL授权

由于我们开启了公共访问权限,所以我们需要对Kafka集群进行ACL授权,以便控制访问权限。请根据实际的情况修改zookeeper.connect--allow-principal--topic参数。

添加读权限:

./kafka-acls.sh --authorizer-properties zookeeper.connect=z-3.xxx.xxx.c2.kafka.cn-north-1.amazonaws.com.cn:2181 --add --allow-principal "User:testusername" --operation Read --group="*" --topic test-topic

添加写权限:

./kafka-acls.sh --authorizer-properties zookeeper.connect=z-3.xxx.xxx.c2.kafka.cn-north-1.amazonaws.com.cn:2181 --add --allow-principal "User:testusername" --operation Write --group="*" --topic test-topic

然后就可以开始用用户名密码来访问Kafka集群了。

总结

AWS和Kafka对于我来说是一个默认的东西,只是因为公司有需要才开始接触。目前在以下两个地方吃过亏:

  1. Kafka集群的工作原理。 Kafka的启动端点配置就真的只是连接时候的启动配置,具体通信还是需要通过zookeeper下发的配置来进行的。所以这块千万不能使用frps之类的内网穿透工具来进行访问,否则明明你可以看起来端口都能通,但是会发现无法正常通信,因为下发的连接配置还是之前的内网配置。
  2. Kafka集群的ACL授权。这块我之前一直以为是通过IAM来控制的,但是实际上是通过Kafka自己的ACL来控制的。官网上的授权方式是给Bootstrap Servers授权,但是对于我使用SCRAM的方式来说是不生效的,所以需要把授权的对象改成User:testusername

最后再吐槽一句,为啥AWS MSK Kafka启动集群和变更集群配置那么的漫长,5分钟算是最快的,10、20、30分钟的也是常有的事情。这个时间真的是太长了,为了一个集群的配置变更,我都可以去喝杯咖啡了。