Hướng dẫn tạo aws-lambda function sử dụng nodejs

Trong bài viết này mình sẽ giới thiệu về

  1. Cách tạo function aws lambda đọc file từ S3
  2. Cách tạo trigger từ S3 thực thi lambda
  3. Cách deploy 1 function lambda lên aws sử dụng lambda

Cách tạo function aws lambda đọc file từ S3

Bạn chỉ cần vào trong tài khoản aws vào mục lambda, sau đó tạo 1 function

Chú ý: Bạn cần phải tạo 1 role cho lambda của bạn để có thể access S3

Sau khi tạo xong thì aws sẽ tạo cho bạn 1 sample code

'use strict';

console.log('Loading function');

const aws = require('aws-sdk');

const s3 = new aws.S3({ apiVersion: '2006-03-01' });


exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    const bucket = event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    const params = {
        Bucket: bucket,
        Key: key,
    };
    s3.getObject(params, (err, data) => {
        if (err) {
            console.log(err);
            const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
            console.log(message);
            callback(message);
        } else {
            console.log('CONTENT TYPE:', data.ContentType);
            callback(null, data.ContentType);
        }
    });
};

Ở code sample trên bạn cần chú ý

  • Tất cả thực thi của lambda sẽ ở trong handler
  • Phần callback khi error hoặc success là cực kỳ quan trọng, vì nó sẽ trả về giá trị cho những thành phần nào đang trigger đến lambda, nếu không gọi callback về thì phần trigger lambda sẽ bị retry, cứ khi hết timeout mà chưa có callback về thì sẽ retry 1 lần, nếu bạn ko có callback thì lambda của bạn sẽ thực thi 3 lần 😄. Ví dụ insert vào db hay send mail sẽ thấy là có 3 lần

Cách tạo trigger từ S3 sang lambda

Ở mỗi lambda sẽ có phần config trigger

Bạn chọn phần trigger từ S3

Bạn chỉ cần chọn event type file ở S3 và prefix or subfix để nhận trigger, cách test rất đơn giản bạn tạo trigger xong chỉ cần dùng lệnh aws cli copy file lên S3 và vào xem log watch của lambda

Cách deploy 1 function lambda lên aws sử dụng lambda

  1. Yêu cầu môi trường

  2. Khởi tạo project example

    • Sử dụng npm để cài đặt khởi tạo
      $ mkdir lambda-gulp-sample
      $ cd lambda-gulp-sample
      $ npm init -y
      
    • Cài đặt plugin cho development
      npm install gulp node-aws-lambda gulp-zip del gulp-install run-sequence --save-dev
      
    • Cài đặt package for aws
      npm install async gm --save
      
    • Tạo folder lưu trữ file sẽ deploy lên aws
        $ mkdir dist
    
    • Tạo file chứa code để thực thi: ** index.js**, nội dung sẽ copy ở example trên vào
  3. Tạo file gulpfile.js Xem ví dụ ở đây https://github.com/ngodinhngoc/node-aws-lambda/blob/master/README.md

     ```
     var gulp = require('gulp');
     var zip = require('gulp-zip');
     var del = require('del');
     var install = require('gulp-install');
     var runSequence = require('run-sequence');
     var awsLambda = require('node-aws-lambda');
    
     gulp.task('clean', function(cb) {
       del(['./dist', './dist.zip'], cb);
     });
    
     gulp.task('js', function() {
       return gulp.src('index.js')
         .pipe(gulp.dest('dist/'));
     });
    
     gulp.task('node-mods', function() {
       return gulp.src('./package.json')
         .pipe(gulp.dest('dist/'))
         .pipe(install({production: true}));
     });
    
     gulp.task('zip', function() {
       return gulp.src(['dist/**/*', '!dist/package.json'])
         .pipe(zip('dist.zip'))
         .pipe(gulp.dest('./'));
     });
    
     gulp.task('upload', function(callback) {
       awsLambda.deploy('./dist.zip', require("./lambda-config.js"), callback);
     });
    
     gulp.task('deploy', function(callback) {
       return runSequence(
         ['clean'],
         ['js', 'node-mods'],
         ['zip'],
         ['upload'],
         callback
       );
     });
     ```
    
  4. Tạo file lambda-config.js

       module.exports = {
            region: 'us-west-2',
            handler: 'index.handler',
            role: 'arn:aws:iam::xxxxxxxxxxxx:role/lambda_s3_exec_role',
            functionName: 'gulpSample',
            timeout: 10,
            nodejs: 6.10.x
          }
    
  5. Deploy lambda

    • Export file zip và login vào aws để upload, bạn chỉ cần gọi lệnh $ gulp zip
    • Nếu đã config chuẩn file lambda-config.js và config aws configure thì bạn chỉ cần gọi $ gulp deploy và vào trong aws xem đã upload file zip lên chưa

    Trên là hướng dẫn tạo aws lambda và deploy sử dụng gulp, bạn có câu hỏi gì thì có thể để comment ở dưới