如何对无法向 Amazon MSK 主题发送消息的 AWS IoT 规则进行故障排除?

3 分钟阅读
0

我想对无法向 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 主题发送消息的 AWS IoT Core 规则进行故障排除。

简短描述

当 AWS IoT 规则无法向 Amazon MSK 集群发布消息时,您可能会收到以下错误消息之一:

  • “KafkaAction failed to send a message to the specified bootstrap servers.Topic <topic_name> not present in metadata after 1000 ms.(KafkaAction 未能向指定的引导服务器发送消息。1000 毫秒后元数据中不存在主题 <topic_name>。)”
  • “KafkaAction failed to send a message to the specified bootstrap servers.SSL handshake failed.(KafkaAction 未能向指定的引导服务器发送消息。SSL 握手失败。)”
  • “KafkaAction failed to send a message to the specified bootstrap servers.An unknown error occurred.(KafkaAction 未能向指定的引导服务器发送消息。发生未知错误。)”
  • “KafkaAction failed to send a message to the specified bootstrap servers.No resolvable bootstrap urls given in bootstrap.servers.(KafkaAction 未能向指定的引导服务器发送消息。bootstrap.servers 中没有给出可解析的引导 URL。)”

解决方法

在开始进行故障排除之前,请完成以下步骤:

  1. 在与 AWS IoT 规则相同的 AWS 区域中配置 AWS IoT 日志记录
  2. 验证 AWS IoT 规则和 Amazon MSK 集群的设置。有关详细信息,请参阅步骤 3.在 AWS Cloud9 上设置 Kafka 生产者和使用者以测试设置现场备注: 使用 IoT 规则操作将消息传送到 Amazon Managed Streaming for Apache Kafka)。

根据您收到的 KafkaAction 错误消息进行故障排除

**注意:**确保使用正确的端口号与客户端计算机通信。

错误: KafkaAction failed to send a message to the specified bootstrap servers.Topic not present in metadata after 1000 ms.(KafkaAction 未能向指定的引导服务器发送消息。1000 毫秒后元数据中不存在此主题。)

当 AWS IoT Core 无法访问在 Amazon MSK 集群中定义的主题的元数据时,就会出现此错误。要对此错误进行故障排除,请完成以下步骤:

  1. 检查该主题是否在 Amazon MSK 集群上。 
    **注意:**将 example-topic-name 替换为您的主题名称。

    ./bin/kafka-topics.sh —list —zookeeper $ZOOKEEPER_STRING | grep example-topic-name
  2. 检查 AWS IoT 规则配置中是否有引导服务器和 ZooKeeper 的正确连接字符串。您可以在 Amazon MSK 设置中的Client information(客户端信息)页面上找到引导服务器和 ZooKeeper 连接字符串。

  3. 检查映射到集群的安全组。安全组必须允许从 Amazon Virtual Private Cloud (Amazon VPC) 目标向映射到引导服务器的端口的入站流量。

  4. 检查 ZooKeeper 的端口是否允许入站流量。ZooKeeper 对 PLAINTEXT 使用端口 2181,对 TLS 加密使用端口 2182。

  5. (可选)如果 Amazon VPC 目标和集群不共享相同的 Amazon VPC 和子网,请在您的子网中创建 NAT 网关。这使您可以将消息从 AWS IoT Core 转发到公共 Amazon MSK 集群。有关详细信息,请参阅连接到 Amazon MSK 集群

  6. 在与 Amazon MSK 集群相同的子网中启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

  7. 检查端口是否已打开:
    **注意:**将 example-port-number 替换为端口号。

    引导:

    telnet bootstrap-broker example-port-number

    ZooKeeper:

    telnet Apache-ZooKeeper-node example-port-number
  8. 检查附加到 AWS IoT 规则的 AWS Identity and Access Management (IAM) 角色是否具有正确的权限。IAM 角色必须拥有管理 Amazon VPC 中的弹性网络接口的权限:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateNetworkInterface",
                    "ec2:DescribeNetworkInterfaces",
                    "ec2:CreateNetworkInterfacePermission",
                    "ec2:DeleteNetworkInterface",
                    "ec2:DescribeSubnets",
                    "ec2:DescribeVpcs",
                    "ec2:DescribeVpcAttribute",
                    "ec2:DescribeSecurityGroups"
                ],
                "Resource": "*"
    
             }
        ]
    }
  9. 如果 Amazon MSK 集群配置了用户名和密码,请检查权限是否包含在策略中:

    {
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:GetSecretValue",
                    "secretsmanager:DescribeSecret"
                ],
                "Resource": "arn:aws:secretsmanager:region:account-id:"
            }
  10. 检查信任策略是否允许 AWS IoT Core 代入该角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "iot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  1. (可选)如果您使用客户自主管理型密钥对静态数据进行加密,请确保 IAM 角色拥有正确的权限。IAM 角色必须有权对调用者使用 AWS Key Management Service (AWS KMS) 密钥。在以下示例 IAM 策略中,IAM 角色被授予 AWS KMS 权限:
    **注意:**将 example-account-id 替换为您的账户 ID,将 example-iam-role 替换为您的 IAM 角色。
{  
            "Sid": "Enable IAM User Permissions",  
            "Effect": "Allow",  
            "Principal": [  
                "AWS": {  
                    "arn:aws:iam::example-account-id:example-iam-role",  
                    "arn:aws:iam::example-account-id:root"  
                }  
            ],  
            "Action": "kms:*",  
            "Resource": "*"  
}
  1. 检查 AWS IoT 规则代入的 IAM 角色是否有权在 IAM 策略中执行 AWS KMS 操作。
  2. 检查相关分区是否在 Amazon MSK 集群上。如果您只有一个分区 (0),并且 AWS IoT 规则尝试访问分区 (1),则会再次出现错误消息。

错误: KafkaAction failed to send a message to the specified bootstrap servers.SSL handshake failed.(KafkaAction 未能向指定引导服务器发送消息。SSL 握手失败。)

当 Amazon MSK 集群在与 Amazon MSK 集群进行 TLS 握手期间出现问题时,就会出现此错误。如果您收到此错误,则必须使用 AWS Private Certificate Authority (AWS Private CA) 颁发的证书。您可以将 AWS Private CA 证书添加到密钥存储库和 AWS IoT 规则。有关详细信息,请参阅双向 TLS 身份验证

错误: KafkaAction failed to send a message to the specified bootstrap servers.An unknown error occurred.(KafkaAction 未能向指定引导服务器发送消息。发生未知错误。)
错误: KafkaAction failed to send a message to the specified bootstrap servers.No resolvable bootstrap urls given in bootstrap.servers.(KafkaAction 未能向指定引导服务器发送消息。bootstrap.servers 中没有给出可解析的引导 URL。)

要对这些错误进行故障排除,请完成前面的步骤 1 到 13。如果仍然收到这些错误消息,请逐渐增加发布到 AWS IoT 主题的消息。如果仍然遇到问题,请联系 AWS Support

相关信息

Apache Kafka

如何将 AWS IoT Core 与 Amazon MSK 进行集成

向 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 大规模传送数据

AWS 官方
AWS 官方已更新 1 年前