HTTP または HTTPS エンドポイントを Amazon Simple Notification Service (Amazon SNS) トピックにサブスクライブしても、サブスクリプション確認通知を受信できません。
解決策
HTTP (S) エンドポイントを SNS トピックにサブスクライブする前に、HTTP (S) エンドポイントが Amazon SNS メッセージを処理する準備ができていることを確認する必要があります。
**注:**以下の手順は、HTTP (S) サブスクリプションが確認済みの状態にあるものの、まだ通知を受け取っていない場合にも適用されます。
SNS トピックをサブスクライブする前に、HTTP (S) エンドポイントが公開されていることを確認する
Amazon SNS はプライベート HTTP (S) エンドポイントをサポートしていません。HTTP (S) エンドポイントを SNS トピックにサブスクライブすると、公共インターネットを介してエンドポイントに HTTP POST リクエストが行われます。詳細と POST リクエストの例については、「Parsing message formats」を参照してください。
エンドポイントが公開されているかどうかを確認するには、ローカルマシンからサンプルの 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 Unauthorized ヘッダーレスポンスをサポートしていることを確認してください。
基本アクセス認証:
エンドポイントが認証されていないリクエストを受信すると、「WWW-Authenticate」ヘッダーとともに HTTP/1.1 401 Unauthorized ヘッダーレスポンスが返されます。ヘッダー値にはキーワード「Basic」と、 RFC 2617 (RFC Editor のウェブサイトから) でサポートされているその他のオプションパラメーターが含まれている必要があります。例:
WWW-Authenticate: Basic
ダイジェストアクセス認証:
エンドポイントが認証されていないリクエストを受信すると、「WWW-Authenticate」ヘッダーとともに HTTP/1.1 401 Unauthorized ヘッダーレスポンスが返されます。ヘッダー値には以下が含まれている必要があります。
- キーワード「Digest」
- ランダムに生成される「nonce」という1回限りの値
- 認証範囲
- RFC 2617 (RFC エディタのウェブサイトから) でサポートされているその他のオプションパラメータ
例:
WWW-Authenticate: Digest realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
配信ステータスのログの設定
次の手順を実行します。
- SNS トピックの配信ステータスのログについて設定します。
- HTTP (S) エンドポイントをサブスクライブしようとしたときに生成される SNS サブスクリプション確認通知配信のログデータを表示します。
失敗ログが存在する場合は、次の形式でロググループに生成されます。
sns/your_aws_region/your_account_ID/your_topic_name/Failure
**注:**サブスクリプション確認通知が配信に失敗した理由を確認するには、Amazon CloudWatch 配信ステータスログの providerResponse を確認してください。
HTTPS エンドポイントの SSL 証明書を確認する
HTTPS エンドポイントを使用している場合は、次のトラブルシューティング手順を実行してください。
-
エンドポイントから返された SSL 証明書が有効で、Amazon SNS が信頼する認証局によって署名されていることを確認します。
-
エンドポイントが証明書チェーン全体を返すことを確認します。完全なチェーンには、すべての中間証明書が含まれます。
**注:**サードパーティのツールを使用して、エンドポイントから返されたSSL証明書が信頼でき、完全であるかどうかを確認できます。例えば、SSL Labs のウェブサイトで SSL Server Test を使用できます。
次の OpenSSL コマンドを実行して、エンドポイントから返された SSL 証明書が信頼でき、完全であるかどうかを確認することもできます。
openssl s_client -connect yourHostname:443 -servername yourHostname -showcerts
エンドポイントから返された SSL 証明書が信頼できない、または完全でない場合、CloudWatch ログに次の 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) エンドポイントをブロックしていないか確認する
ファイアウォールが SNS サブスクリプション確認通知の HTTP (S) エンドポイントへの配信を妨げている場合は、AWS リージョン固有の IP アドレスを許可してください。
HTTP (S) エンドポイントにサブスクリプションフィルターポリシーがあるかどうかを確認する
エンドポイントがサブスクライブ済み状態でもトピック通知を受け取っていない場合は、次の手順を実行してください。
- サブスクリプションフィルターポリシーがエンドポイントに設定されているかどうかを確認します。HTTP (S) サブスクリプションにフィルターポリシーがある場合、通知がフィルターされている可能性があります。
- SNS メッセージがフィルターされていることを確認するには、次の CloudWatch メトリクスを確認します。 NumberOfNotificationsFilteredOut、 NumberOfNotificationsFilteredOut-InvalidAttributes、NumberOfNotificationsFilteredOut-NoMessageAttributes。