HTTP (S) エンドポイントを Amazon SNS トピックにサブスクライブする際の問題をトラブルシューティングするにはどうすればよいですか?

所要時間2分
0

HTTP または HTTPS エンドポイントを Amazon Simple Notification Service (Amazon SNS) トピックにサブスクライブしても、サブスクリプションの確認通知を受信できません。

解決方法

HTTP (S) エンドポイントを SNS トピックにサブスクライブする前に、HTTP (S) エンドポイントが Amazon SNS メッセージを処理する準備ができていることを確認する必要があります。

注: 次の手順は、HTTP (S) サブスクリプションが確定状態にあるものの、まだ通知が届かないシナリオにも当てはまります。

SNS トピックをサブスクライブする前に、HTTP (S) エンドポイントがパブリックにアクセスできることを確認します。

Amazon SNS では、プライベート HTTP (S) エンドポイントをサポートしていません。Amazon SNS は、HTTP (S) エンドポイントを SNS トピックにサブスクライブする際、パブリックインターネットを介してエンドポイントに HTTP POST リクエストを送信します。POST リクエストの詳細と例については、メッセージ形式の解析を参照してください。

エンドポイントがパブリックにアクセス可能かどうかを確認するには、ローカルマシンからサンプルの POST リクエストを作成します。例:

curl -X POST your_HTTPS_endpoint -H "Content-Type:text/plain; charset=UTF-8" --data {"x":"y"} -v

エンドポイントがパブリックにアクセス可能である場合、コマンドは次の HTTP ステータスコードを返します。

200 OK

SNS トピックからパブリックにアクセスできない HTTP エンドポイントをサブスクライブしている場合は、次のエラーが表示されます。

An error occurred (InvalidParameter) when calling the Subscribe operation: Invalid parameter: Unreachable Endpoint

重要: ホスト名にアンダースコアを含めることはできません。例えば、your_hostname というホスト名は使えません。

エンドポイントレスポンスヘッダーを検証する

使用している認証の種類 (基本認証またはダイジェストアクセス認証) に基づいて、次の手順を実行します。エンドポイントが**「https」**で、HTTP/1.1 401 不正ヘッダーレスポンスがサポートされていることを確認してください。

基本アクセス認証:

エンドポイントが認証されていないリクエストを受信すると、HTTP/1.1 401 不正ヘッダーレスポンスと「WWW-Authenticate」ヘッダーが返されます。ヘッダー値には、キーワード「Basic」と RFC 2617 でサポートされるその他のオプションのパラメータ (RFC エディタウェブサイトから) が含まれている必要があります。例:

WWW-Authenticate: Basic

ダイジェストアクセス認証:

エンドポイントが認証されていないリクエストを受信すると、HTTP/1.1 401 不正ヘッダーレスポンスと「WWW-Authenticate」ヘッダーが返されます。ヘッダー値には、キーワード「Digest」、「nonce」と呼ばれるランダムに生成された単独使用値、認証レルム、および RFC 2617 でサポートされるその他のオプションパラメータ (RFC エディタウェブサイトから) が含まれている必要があります。例:

WWW-Authenticate: Digest realm="testrealm@host.com",
                        qop="auth,auth-int",
                        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
                        opaque="5ccc069c403ebaf9f0171e9517f40e41"

配信ステータスのログ記録を設定する

1.    SNS トピックの配信ステータスログを設定します。 

2.    HTTP (S) エンドポイントをサブスクライブしようとしたときに生成される SNS サブスクリプション確認通知配信のログデータを表示します

障害ログがある場合は、次の形式でロググループに生成されます。

sns/your_aws_region/your_account_ID/your_topic_name/Failure

注: サブスクリプション確認通知が配信に失敗した理由を確認するには、Amazon CloudWatch 配信ステータスログで providerResponse を確認してください。

HTTPS エンドポイントの SSL 証明書を確認する

HTTPS エンドポイントを使用している場合は、次のトラブルシューティング手順を実行します。

1.    エンドポイントから返される SSL 証明書が有効で、Amazon SNS によって信頼される認証機関によって署名されていることを確認します。 

2.    エンドポイントが証明書の完全なチェーンを返していることを確認します。完全なチェーンには、すべての中間証明書が含まれています。

注: サードパーティーツールを使用して、エンドポイントから返される SSL 証明書が信頼でき、完全であるかどうかを確認できます。例えば、SSL ラボのウェブサイトの SSL Server Test を使用できます。

または、エンドポイントから返される SSL 証明書が信頼でき、完全であるかどうかを確認するには、次の OpenSSL コマンドを実行します。

openssl s_client -connect yourHostname:443 -servername yourHostname -showcerts

エンドポイントから返される SSL 証明書が信頼できない、または完全でない場合は、CloudWatch Logs に次の providerResponse が表示されることがあります。

{
    "notification": {
        "messageId": "...",
        "topicArn": "arn:aws:sns:ap-northeast-1:***:***",
        "timestamp": "2021-05-12 06:41:20.778"
    },
    "delivery": {
        "deliveryId": "***",
        "destination": "https://***",
        "providerResponse": "SSLPeerUnverifiedException in HttpClient",
        "dwellTimeMs": 66171,
        "attempts": 4
    },
    "status": "FAILURE"
}

ファイアウォールが HTTP (S) エンドポイントをブロックしているかどうかを確認する

ファイアウォールによって HTTP (S) エンドポイントへの SNS サブスクリプションの確認通知の配信が妨げられている場合は、AWS リージョン固有の IP アドレスを許可します

HTTP (S) エンドポイントにサブスクリプションフィルターポリシーが設定されているかどうかを確認する

エンドポイントがサブスクリプション済み状態にあるがトピック通知を受け取っていない場合は、次の手順を実行します。

1.    エンドポイントにサブスクリプションフィルターポリシーが設定されているかどうかを確認します。HTTP (S) サブスクリプションにフィルターポリシーが設定されている場合、通知がフィルタリングされる可能性があります。

2.    SNS メッセージがフィルタリングされているかどうかを確認するには、次の CloudWatch メトリクスをチェックします。NumberOfNotificationsFilteredOutNumberOfNotificationsFilteredOut-InvalidAttributes、および NumberOfNotificationsFilteredOut-NoMessageAttributes


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

関連するコンテンツ