2016-10-22 3 views
19

У меня есть функция Node 4.3 Lambda в AWS. Я хочу, чтобы иметь возможность написать текстовый файл на S3 и прочитать много учебников о том, как интегрироваться с S3. Тем не менее, все они о том, как вызывать функции лямбда после записи в S3, как показано ниже:AWS Lambda function write to S3

http://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

Как я могу создать текстовый файл в S3 от Lambda с помощью узла? Это возможно? Документация по амазонам, похоже, не охватывает ее.

ответ

36

Да, это абсолютно возможно!

var AWS = require('aws-sdk'); 
function putObjectToS3(bucket, key, data){ 
    var s3 = new AWS.S3(); 
     var params = { 
      Bucket : bucket, 
      Key : key, 
      Body : data 
     } 
     s3.putObject(params, function(err, data) { 
      if (err) console.log(err, err.stack); // an error occurred 
      else  console.log(data);   // successful response 
     }); 
} 

Убедитесь, что вы даете лямбда-функции необходимые разрешения на запись в целевой s3 ковшом/ключевой путь, выбрав или обновление IAM Роль ваш лямбда выполняет под.

IAM Заявление добавить:

{ 
    "Sid": "Stmt1468366974000", 
    "Effect": "Allow", 
    "Action": "s3:*", 
    "Resource": [ 
     "arn:aws:s3:::my-bucket-name-goes-here/optional-path-before-allow/*" 
    ] 
} 

Дальнейшее чтение:

AWS JavaScript SDK: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

Конкретное "Put Object" детали: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

+0

Если лямбда-функция выполняется внутри VPC вы должны создать конечную точку для него. Прежде чем найти это, обратный вызов s3.putObject никогда не вызывался. См. Эту статью о конечной точке S3 VPC: https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/ См. Информацию о доступе к ресурсам из лямбда: https://aws.amazon.com/blogs/aws/new-access-resources-in-a-vpc-from-your-lambda-functions/ – vtellier

3

Вы можете загрузить файл на s3 с помощью

AWS-SDk

Если вы используете IAM пользователя, то вы должны предоставить ключ доступа и секретный ключ и убедитесь, что вы предоставили необходимое разрешение до IAM пользователь.

var AWS = require('aws-sdk'); 
AWS.config.update({accessKeyId: "ACCESS_KEY",secretAccessKey: 'SECRET_KEY'}); 
var s3bucket = new AWS.S3({params: {Bucket: 'BUCKET_NAME'}}); 
function uploadFileOnS3(fileName, fileData){ 
    var params = { 
     Key: fileName, 
     Body: fileData, 
    }; 
    s3bucket.upload(params, function (err, res) {    
     if(err) 
      console.log("Error in uploading file on s3 due to "+ err) 
     else  
      console.log("File successfully uploaded.") 
    }); 
} 

Здесь я временно запрограммирован для доступа к секретным ключам и секретным ключам для целей тестирования. Для наилучшей практики см. Ссылку ниже.

https://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html

+3

Ничто в запросе на запросы специально для ключей доступа и секретов, которые будут использоваться для аутентификации. Это очень плохая практика для аутентификации таким образом, и поэтому я не рекомендую ее, поскольку решение разумно. Лямбда-функции должны быть снабжены ролью IAM, достаточной для доступа к функции Лямбды для выполнения ее функции. –

+0

Я знаю, что я просто поместил секретный ключ и ключ доступа к жесткому кодированию, но этот метод предназначен только для небольших личных сценариев или для целей тестирования. –