Ние тук в H+S сме посветени на една проста кауза: създаване на публикации за странно специфични сценарии за програмиране. Някъде по света като тъжна душа търси програмен достъп до файлове от S3 сървър, като същевременно запазва своята кофа частна. Към този човек: чухме ви.

Има много причини да искате да имате достъп до файлове в S3. Например, да кажем, че сте прочели онази публикация за използването на Pandas във функция Lambda. Тъй като вече сте запознати с PyMySQL, хипотетично може да сте в състояние да експортирате данни от заявка в DB към CSV, записан в S3. Обзалагам се, че можете да познаете какво правя напоследък.

Конфигурирайте AWS на вашия VPS

Най-лесният и безопасен начин за взаимодействие с други AWS услуги на вашето EC2 копие (или VPS по избор) е чрез AWS CLI. Това се инсталира лесно като глобална библиотека на Python3:

pip3 install awscli

С инсталирания CLI ще можем да направим нещо наистина вълшебно: да зададем нашата 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

Време на възела

Ще приемем, че имате приложение, настроено с някакво основно маршрутизиране, като например настройката на barebone 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 г.