Можно ли создать консольные URL-адреса AWS для фильтров группы журналов CloudWatch? - PullRequest
0 голосов
/ 22 марта 2020

Я хотел бы отправить своих пользователей напрямую в указанную c группу журналов и фильтр, но мне нужно иметь возможность генерировать правильный формат URL. Например, этот URL

https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logsV2:log-groups/log-group/
%252Fmy%252Flog%252Fgroup%252Fgoes%252Fhere/log-events/$3FfilterPattern$3D$255Bincoming_ip$252C$2Buser_name$252C$2Buser_ip$2B$252C$2Btimestamp$252C$2Brequest$2B$2521$253D$2B$2522GET$2B$252Fhealth_checks$252Fall$2B*$2522$252C$2Bstatus_code$2B$253D$2B5*$2B$257C$257C$2Bstatus_code$2B$253D$2B429$252C$2Bbytes$252C$2Burl$252C$2Buser_agent$255D$26start$3D-172800000

приведет вас к группе журналов с именем /my/log/group/goes/here и отфильтрует сообщения с этим шаблоном за последние 2 дня:

[incoming_ip, user_name, user_ip , timestamp, request != "GET /health_checks/all *", status_code = 5* || status_code = 429, bytes, url, user_agent]

Я могу декодировать часть URL, но я не знаю, какими должны быть некоторые другие символы (см. ниже), но на самом деле это не похоже на стандартную кодировку HTML для меня. Кто-нибудь знает кодировщик / декодер для этого формата URL?

%252F == /
$252C == ,
$255B == [
$255D == ]
$253D == =
$2521 == !
$2522 == "
$252F == _
$257C == |

$2B == +
$26 == &
$3D == =
$3F == ?

1 Ответ

0 голосов
/ 23 марта 2020

Я создал немного кода Ruby, который, кажется, удовлетворяет анализатору URL-адресов CloudWatch. Я не уверен, почему вы должны дважды убежать от некоторых вещей, а затем заменить % на $ в других. Я предполагаю, что есть какая-то причина, но я не мог придумать хороший способ сделать это, поэтому я просто грубо заставляю это. Если у вас есть что-то лучше, или вы знаете, почему они это делают, пожалуйста, добавьте комментарий.

ПРИМЕЧАНИЕ: filter, который я тестировал, является своего рода basi c, и я не уверен, что может потребоваться изменить если вам это действительно нравится.

# Basic URL that is the same across all requests
url = 'https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logsV2:log-groups/log-group/'

# CloudWatch log group
log_group = '/aws/my/log/group'

# Either specify the instance you want to search or leave it out to search all instances
instance = '/log-events/i-xxxxxxxxxxxx'
 OR
instance = '/log-events'

# The filter to apply.
filter = '[incoming_ip, user_name, user_ip , timestamp, request, status_code = 5*, bytes, url, user_agent]'

# Start time.  There might be an End time as well but my queries haven't used 
# that yet so I'm not sure how it's formatted.  It should be pretty similar
# though.
hours = 48
start = "&start=-#{hours*60*60*1000}"

# This will get you the final URL
final = url + CGI.escape(CGI.escape(log_group)) + instance + '$3FfilterPattern$3D' + CGI.escape(CGI.escape(filter)).gsub('%','$') + CGI.escape(start).gsub('%','$')

...