При создании подписки на 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" и подтверждаем.