При создании подписки на HTTP/HTTPS в AWS SNS можно наблюдать, что подписка повисла в статусе: «Pending confirmation»
SNS на указанный URL делает POST запрос, в котором отправляет данные в формате JSON, и ожидает в ответ получить значение ключа: «SubscribeURL«. Но если приложение не умеет ответить SNS‘у, то можно ввести URL подтверждения вручную, но для этого его нужно узнать.
Для этого можно воспользоваться Nginx‘ом и его access_log.
Так как тело POST запроса записывается в лог, только при использовании «proxy_pass«, то смоделируем проксирование на бэкенд.
nginx.conf
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { log_format postdata escape=json '"$request_body"'; server { listen 80; server_name _; location /success { return 200; } location / { proxy_redirect off; proxy_pass_request_body on; proxy_pass $scheme://127.0.0.1:$server_port/success; add_header X-Body $request_body; access_log /var/log/nginx/post.log postdata; } } }
В примере конфигурация приведена для HTTP протокола, если у вас HTTPS, добавьте части конфигурации, которые относятся к SSL.
Перечитаем конфигурацию Nginx‘а:
systemctl reload nginx
После возвращаемся в консоль AWS и в SNS подписках выбираем нужную и делаем повторный запрос «Request Confirmation»
Смотрим лог Nginx‘а:
cat /var/log/nginx/post.log
Интересует значение ключа: «SubscribeURL«, оно будет вида:
https://sns.{REGION}.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:{REGION}:{YOUR_ACCOUNT_ID}:{YOUR_TOPIC_NAME}&Token={YOUR_TOKEN}
Копируем его и возвращаемся к AWS SNS. Выбираем подтверждение подписки «Confirm Subscription»
Вставляем значение «SubscribeURL» и подтверждаем.