Python Загрузка файла S3 без знания имени ключа - PullRequest
0 голосов
/ 30 ноября 2018

Я пишу скрипт на Python, который запускает запрос через Athena, выводит его на S3 и загружает на мой компьютер.Я могу выполнить свой запрос через Афину и вывести результат в S3.Так что мой следующий шаг, который я не могу понять, это как загрузить его на мой компьютер, не зная имени ключа?

Есть ли способ поиска ключа объекта в моем скрипте python после его вывода наАфина?
Что я выполнил:

# Output location and DB
s3_output = ‘s3_output_here’
database = ‘database_here’

# Function to run Athena query
def run_query(query, database, s3_output):
    while True:
        try:
            response = client.start_query_execution(
                QueryString=query,
                QueryExecutionContext={
                    'Database': database
                    },
                ResultConfiguration={
                    'OutputLocation': s3_output,
                    }
                )
            return response
            break
        except client.exceptions.TooManyRequestsException as e:
            print('Too many requests, trying again after sleep')
            time.sleep(100)

# Our SQL Query    
query = """
SELECT *
FROM test
”””

print("Running query to Athena...")
res = run_query(query, database, s3_output)

Я понимаю, как загрузить файл с этим кодом:

try:
    s3.Bucket(BUCKET_NAME).download_file(KEY, ‘KEY_HERE’)
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == "404":
        print("The object does not exist.")
    else:
        raise

Итак, как я могу прочитать имя ключа после запускамой первый заполненный код?

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете получить ключ, используя команду get_key, предоставляемую библиотекой boto.Вот как я загружаю вещи из s3:

    with open("path/aws-credentials.json") as f:
        data= json.load(f)
        conn = boto.connect_s3(data["accessKeyId"], data["secretAccessKey"])
    bucket = conn.get_bucket('your_bucket')
    file_path = bucket.get_key('path/to/s3/file')
    file_path.get_contents_to_filename('path/on/local/computer/filename')

Вы можете жестко закодировать свои учетные данные в коде, если вы просто что-то тестируете, но если вы планируете запустить это в производство, лучше хранить вашивнешне учетные данные в виде файла json.

...