AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

Amazon MSK トピックにメッセージを送信できない AWS IoT ルールをトラブルシューティングする方法を教えてください。

所要時間3分
0

AWS IoT Core ルールで、Amazon Managed Streaming for Apache Kafka (Amazon MSK) トピックにメッセージを送信できない問題をトラブルシューティングしたいです。

簡単な説明

AWS IoT ルールが Amazon MSK クラスターへのメッセージの発行に失敗すると、次のいずれかのエラーメッセージが表示されることがあります。

  • 「KafkaAction は、指定されたブートストラップサーバーにメッセージを送信できませんでした。1000 ms 経過後、トピック <topic_name> がメタデータにありません。」
  • 「KafkaAction は、指定されたブートストラップサーバーにメッセージを送信できませんでした。SSL ハンドシェイクが失敗しました。」
  • 「KafkaAction は、指定されたブートストラップサーバーにメッセージを送信できませんでした。不明なエラーが発生しました。」
  • 「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 は、指定されたブートストラップサーバーにメッセージを送信できませんでした。1000 ms 経過後、トピックがメタデータにありません。

このエラーは、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 に正しい接続文字列が指定されているかどうかを確認します。ブートストラップサーバーと ZooKeeper の接続文字列は、Amazon MSK 設定の [クライアント情報] ページにあります。

  3. クラスターにマップされているセキュリティグループを確認します。セキュリティグループは、Amazon Virtual Private Cloud (Amazon VPC) の宛先からブートストラップサーバーにマップされたポートへのインバウンドトラフィックを許可する必要があります。

  4. ZooKeeper のポートがインバウンドトラフィックを許可しているかどうかを確認します。ZooKeeper は、プレーンテキストにはポート 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 クラスターにあるかどうかを確認します。1 つのパーティション (0) があり、AWS IoT ルールがパーティション (1) にアクセスしようとすると、エラーメッセージが再び表示されます。

エラー: KafkaAction は、指定されたブートストラップサーバーにメッセージを送信できませんでした。SSL ハンドシェイクが失敗しました。

このエラーは、Amazon MSK クラスターとの TLS ハンドシェイク中に Amazon MSK クラスターに問題が発生した場合に発生します。このエラーが発生した場合は、AWS プライベート認証機関 (AWS プライベート CA) が発行した証明書を使用する必要があります。AWS プライベート CA 証明書をキーストアと AWS IoT ルールに追加します。詳細については、「相互 TLS 認証」を参照してください。

エラー: KafkaAction は、指定されたブートストラップサーバーにメッセージを送信できませんでした。不明なエラーが発生しました。
エラー: KafkaAction は、指定されたブートストラップサーバーにメッセージを送信できませんでした。bootstrap.servers には解決可能なブートストラップ URL が指定されていません。

これらのエラーをトラブルシューティングするには、前のステップ 1 ~ 13 を実行します。それでもエラーメッセージが表示される場合は、AWS IoT トピックに発行するメッセージを徐々に増やします。それでも問題が解決しない場合は、AWS サポートにお問い合わせください

関連情報

Apache Kafka

AWS IoT Core を Amazon MSK と統合する方法

Amazon Managed Streaming for Apache Kafka (Amazon MSK) に大規模なデータを配信する

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ