Как вы можете запустить запрос в BigQuery для сопоставления журналов, в которых callerIP не входит в определенный список диапазонов IP?

#google-bigquery

#google-bigquery

Вопрос:

Я пытаюсь выполнить следующий запрос в BigQuery — я уверен, что остальная часть запроса верна, однако единственная проблема заключается в том, как я перечислил IP-адреса в строке ниже. Мне выдается сообщение об ошибке «Обнаружено » <FLOATING_LITERAL> «x.y «» в строке 17, столбец 62″ (где x и y — целые числа)

       AND NOT (protopayload_auditlog.requestMetadata.callerIp : "IP-RANGE IP-RANGE IP-RANGE IP-RANGE") 

Где IP-ДИАПАЗОН, конечно, имеет вид x.y.z.f-x.y.z.e

Я не уверен, как отформатировать эту строку IP-адресов, чтобы заставить запрос работать. Был бы очень признателен за некоторую помощь!

Ниже приведен полный запрос;

 #legacySQL
SELECT
  protopayload_auditlog.authenticationInfo.principalEmail AS principalEmail,
  resource.labels.project_id AS project_id,
  resource.labels.bucket_name AS bucket_name,
  resource.labels.method AS method,
  protopayload_auditlog.requestMetadata.callerIp AS callerIp,
  timestamp AS timestamp
FROM (TABLE_DATE_RANGE([projectid.organisation_audit_logging.cloudaudit_googleapis_com_data_access_],
      DATE_ADD(CURRENT_TIMESTAMP(), -40, 'DAY'),
      DATE_ADD(CURRENT_TIMESTAMP(), -38, 'DAY')))
WHERE
  protopayload_auditlog.serviceName = "storage.googleapis.com"
  AND resource.labels.method = 'google.storage.objects.get'
  AND REGEXP_MATCH(protopayload_auditlog.authenticationInfo.principalEmail, r"^.*@mycompany.com")
  AND NOT (protopayload_auditlog.requestMetadata.callerIp : "IP-RANGE IP-RANGE IP-RANGE IP-RANGE")
LIMIT 500 

Комментарии:

1. можете ли вы поделиться несколькими примерами данных.

2. не уверен, что вы подразумеваете под «образцом данных»?

3. некоторые данные, по которым выполняется этот запрос.

Ответ №1:

вы можете использовать следующий подход в качестве отправной точки — вы можете обернуть весь длинный материал в UDF, чтобы сделать его компактным и читаемым

 AND NOT net.ipv4_to_int64(net.safe_ip_from_string(protopayload_auditlog.requestMetadata.callerIp)) between net.ipv4_to_int64(net.safe_ip_from_string(ip_range1_start)) and net.ipv4_to_int64(net.safe_ip_from_string(ip_range1_end))
AND NOT net.ipv4_to_int64(net.safe_ip_from_string(protopayload_auditlog.requestMetadata.callerIp)) between net.ipv4_to_int64(net.safe_ip_from_string(ip_range2_start)) and net.ipv4_to_int64(net.safe_ip_from_string(ip_range2_end))
...