Загрузка файлов из AWS S3 без доступа и секретных ключей в Python - PullRequest
0 голосов
/ 23 октября 2019

У меня есть рабочий код для загрузки файлов из одного из моих блоков в S3, и он выполняет некоторые преобразования в Python. Я не встраиваю ключи доступа и секретные ключи в код, но ключи находятся в моей конфигурации CLI AWS.

import boto3
import botocore


BUCKET_NAME = 'converted-parquet-bucket' # replace with your own bucket name
KEY = 'json-to-parquet/names.snappy.parquet' # replace with path and follow with key object

s3 = boto3.resource('s3')

try:
    s3.Bucket(BUCKET_NAME).download_file(KEY, 'names.snappy.parquet') #  replace the key object name
except botocore.exceptions.ClientError as e: # exception handling
    if e.response['Error']['Code'] == "404":
        print("The object does not exist.") # if object that you are looking for does not exist it will print this
    else:
        raise

# Un comment lines 21 and 22 to convert csv to parquet
# dataframe = pandas.read_csv('names.csv')
# dataframe.to_parquet('names.snappy.parquet' ,engine='auto', compression='snappy')

data = pq.read_pandas('names.snappy.parquet', columns=['Year of Birth', 'Gender', 'Ethnicity', "Child's First Name", 'Count', 'Rank']).to_pandas()


#print(data) # this code will print the ALL the data in the parquet file

print(data.loc[data['Gender'] == 'MALE']) # this code will print the data in the parquet file ONLY what is in the query (SQL query)

Может кто-нибудь помочь мне получитьэтот код работает без с доступом и секретными ключами, встроенными в код или в конфигурации AWS

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Если вы не хотите использовать секретный ключ / ключ доступа, вам следует использовать роли и политики , затем. Вот предложение:

Определите роль (например, RoleWithAccess) и убедитесь, что ваш пользователь (определенный в ваших учетных данных) может взять на себя эту роль

Установить policy для RoleWithAccess, предоставляя доступ для чтения / записи к вашим корзинам

Если вы выполняете его на локальном компьютере, выполните необходимые команды (AWS CLI), чтобы создать профиль , который делаетвы предполагаете, RoleWithAccess (например, ProfileWithAccess)

Выполните ваш сценарий, используя сеанс , передав в качестве аргумента этот профиль , что означает, что вам нужно заменить:

s3 = boto3.resource('s3')

с

session = boto3.session.Session(profile_name='ProfileWithAccess')
s3 = session.resource('s3')

Преимуществом этого подхода является то, что если вы запускаете его внутри экземпляра EC2, вы можете связать свой экземпляр с определенной ролью при его создании (напр. RoleWithAccess). В этом случае вы можете полностью игнорировать сеанс, профиль, весь AWS CLI hocus pocus и просто запустить s3 = boto3.resource('s3').

Вы также можете использовать AWS Lambda, установив роль и политика с разрешением на чтение / запись в ваше ведро.

0 голосов
/ 24 октября 2019

Если вы выполняете свою функцию локально, вам нужно иметь свои учетные данные в локальном файле учетных данных / конфигурационном файле для взаимодействия с ресурсами AWS.

Одной из альтернатив будет запуск на AWS Lambda (если ваша функция выполняетсяпериодически его можно настроить с помощью событий CloudWatch) и использовать Переменные среды или Служба токенов безопасности AWS (STS) для создания временных учетных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...