Скрипт Python для запроса журналов доступа S3 CloudFront из AWS Athena и импорта запроса выбора в корзину S3 - PullRequest
0 голосов
/ 05 августа 2020

Я планирую ежедневно запускать этот скрипт для функции Lambda и получать список IP-адресов, находить любой подозрительный IP-адрес и добавлять его в правило блокировки WAF. Но моя проблема здесь в сценарии, мне может потребоваться вручную изменить имя таблицы, так как она не может перезаписать ту же существующую таблицу на AWS Athena, и мне нужно обновить S3 bucket_input для текущего дня. Так есть ли способ автоматизировать и это

#!/usr/bin/env python3
import boto3

#Function for executing athena queries
def run_query(query, database, s3_output):
    client = boto3.client('athena')
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': s3_accesslog1
            },
        ResultConfiguration={
            'OutputLocation': s3_output,
            }
        )
    print('Execution ID: ' + response['QueryExecutionId'])
    return response
    
#Athena configuration
s3_input = 's3://smathena/athenatest/'
s3_ouput = 's3://python-demo/Test-Athena/'
database = 's3_accesslog1'
table = 'Test_output'

#Athena database and table definition
create_database = "CREATE DATABASE IF NOT EXISTS %s;" % (database)
create_table = \
  """CREATE EXTERNAL TABLE IF NOT EXISTS %s.%s (
  `Date` DATE,
   Time STRING,
   Location STRING,
   SCBytes BIGINT,
   RequestIP STRING,
   Method STRING,
   Host STRING,
   Uri STRING,
   Status INT,
   Referrer STRING,
   UserAgent STRING,
   UriQS STRING,
   Cookie STRING,
   ResultType STRING,
   RequestId STRING,
   HostHeader STRING,
   Protocol STRING,
   CSBytes BIGINT,
   TimeTaken FLOAT,
   XForwardFor STRING,
   SSLProtocol STRING,
   SSLCipher STRING,
   ResponseResultType STRING,
   CSProtocolVersion STRING,
   FleStatus STRING,
   FleEncryptedFields INT,
   CPort INT,
   TimeToFirstByte FLOAT,
   XEdgeDetailedResult STRING,
   ScContent STRING,
   ScContentLen BIGINT,
   ScRangeStart BIGINT,
   ScRangeEnd BIGINT
   )
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
   LOCATION '%s'
   TBLPROPERTIES ('skip.header.line.count' = '2');""" % ( database, table, s3_input )

#Query definitions
query_1 = "SELECT requestip, count(*) FROM %s.%s group by requestip order by count(*) desc" % (database, table)
query_2 = "SELECT * FROM %s.%s where useragent = googlebot" % (database, table)

#Execute all queries
queries = [ create_database, create_table, query_1, query_2 ]
for q in queries:
   print("Executing query: %s" % (q))
   res = run_query(q, database, s3_ouput)

1 Ответ

0 голосов
/ 06 августа 2020

Я думаю, проблема в том, что команда запускается с:

QueryExecutionContext={
            'Database': s3_accesslog1
            },

Однако база данных не существует - на самом деле вы пытаетесь ее создать!

Итак, попробуйте удалить эту запись и посмотрите, работает ли она. Это означает, что вам нужно будет указать базу данных / схему в каждом запросе, но это часто бывает хорошей идеей, чтобы избежать двусмысленности.

...