Получить файл из корзины S3, используя Serverless и Node js - PullRequest
0 голосов
/ 12 января 2019

Я новичок в Serverless и AWS также. Так что мое требование похоже. Мне нужно скачать файл с S3. Я пытался во многих отношениях. Я прочитал много статей, но не смог найти подходящий документ для этой цели.

Итак, я создал шаблон с использованием Serverless и получил все файлы, такие как handler.js, serverless.yml

Мне нужно знать правильные шаги для загрузки файла с S3.

То, что я пытался это. Handler.js

const AWS = require('aws-sdk');
const S3= new AWS.S3();
exports.hello = async (event, context) => {
  console.log(`Hi from Node.js ${process.version} on Lambda!`)
  S3.getObject({Bucket: '*******', Key: '******'}).promise().then( data =>{
    return {
      statusCode: 200,
      body: data
  })
}

Serveless.yml

service: node11

custom:
  bucket: *********

provider:
  name: aws
  runtime: provided # set to provided
  stage: dev
  region: us-east-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:*
      Resource: "arn:aws:s3:::${self:custom.bucket}/*"

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: /
          method: get
    layers: # add layer
      - arn:aws:lambda:us-east-1:553035198032:layer:nodejs11:3

Что бы я ни делал, я всегда получаю сообщение об ошибке типа ВНУТРЕННЯЯ ОШИБКА СЕРВЕРА.

Как правильно получить файл с S3?

1 Ответ

0 голосов
/ 13 января 2019

Попробуйте это:

const AWS = require('aws-sdk');
const S3= new AWS.S3();
exports.hello = async (event, context) => {
  try {
    console.log(`Hi from Node.js ${process.version} on Lambda!`);
    // Converted it to async/await syntax just to simplify.
    const data = await S3.getObject({Bucket: '*******', Key: '******'}).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(data)
    }
  }
  catch (err) {
    return {
      statusCode: err.statusCode || 400,
      body: err.message || JSON.stringify(err.message)
    }
  }
}

и убедитесь, что в serverless.yml вы установили runtime: nodejs8.10 в provider.

Лямбда-ответ body должен быть строкой, как определено здесь .

...