Мы здесь, в 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 г.