Мы здесь, в H+S, занимаемся одной простой целью: созданием постов о странных специфических сценариях программирования. Где-то в мире грустная душа ищет программный доступ к файлам с сервера S3, сохраняя при этом свое ведро приватным. Тому человеку: мы вас услышали.
Есть много причин, по которым вы хотите получить доступ к файлам в S3. Например, допустим, вы прочитали тот пост об использовании Pandas в лямбда-функции. Поскольку вы уже знакомы с PyMySQL, гипотетически вы можете экспортировать данные из запроса к БД в CSV, сохраненный в S3. Бьюсь об заклад, вы можете догадаться, чем я занимался в последнее время.
Настройте AWS на своем VPS
Самый простой и безопасный способ взаимодействия с другими сервисами AWS на вашем инстансе EC2 (или выбранном VPS) — через интерфейс командной строки AWS. Его легко установить как глобальную библиотеку Python3:
pip3 install awscli
С установленным интерфейсом командной строки мы сможем сделать что-то поистине волшебное: установить нашу конфигурацию AWS глобально. Это означает, что каждый раз, когда мы используем взаимодействие с микросервисом (например, S3), библиотека boto3 всегда будет искать наши ключи и секреты в файлах, хранящихся в ~/.aws/
, без нашего указания. Это очень важно с точки зрения безопасности, поскольку удаляет все упоминания учетных данных из нашей кодовой базы, включая расположение указанных секретов.
Используйте $ aws configure
, чтобы запустить процесс:
$ aws configure
AWS Access Key ID [None]: YOURACCESSKEY
AWS Secret Access Key [None]: YOURSECRETKEY
Default region name [None]: us-east-2
Default output format [None]: json
Это создает для нас пару файлов конфигурации. Если нам никогда не понадобится изменять эти файлы, их можно найти здесь:
vim ~/.aws/credentials
vim ~/.aws/config
Время узла
Предположим, что у вас есть приложение, настроенное с некоторой базовой маршрутизацией, например настроенное базовое приложение ExpressJS.
В вашем приложении нам нужно добавить 2 зависимости:
$ npm install --save aws-sdk
$ npm install --save aws-config
Теперь создадим маршрут.
var awsConfig = require('aws-config'); var AWS = require('aws-sdk');
router.get('/export', function(req, res, next) { var file = 'df.csv'; console.log('Trying to download file', fileKey);
var s3 = new AWS.S3({});
var options = { Bucket: 'your-bucket-name', Key: file, };
s3.getObject(options, function(err, data) { res.attachment(file); res.send(data.Body); }); });
Обратите внимание на пустые фигурные скобки в new AWS.S3({})
. Если бы мы решили варварски жестко закодировать наши учетные данные в исходный код, обычно эти значения жили бы между этими скобками как объект. Когда скобки пусты, библиотека AWS автоматически знает, что нужно искать в нашем файле учетных данных AWS наши ключи доступа и секретные ключи.
Вот как вы делаете что-то неправильнона всякий случай, если хотите развлечься:
var s3 = new AWS.S3({
'AccessKeyID': 'YOURACCESSKEY',
'SecretAccessKey': 'YOURSECRETACCESSKEY',
'Region': 'YOUR REGION'
});
Да, это совершенно не будет совершено где-то случайно. Покачай головой.
Вот и все: этот маршрут вызовет загрузку целевого файла при переходе по маршруту. Как бы я ни был уверен, мы все хотели бы посидеть здесь и рассмотреть более сложные варианты использования, давайте вообще избежим Callback Hell и насладимся остатком дня.
Аду придется подождать до следующего раза.
Первоначально опубликовано на сайте hackersandslackers.com 22 июня 2018 г.