【實作紀錄】建立第一支 AWS Lambda

Ray
8 min readJul 10, 2022

--

本文目的為:本文目標是,建立一個API,可以透過該API操作Parse Server的資料,分成四步驟:

  1. 寫一般的nodejs code
  2. 將一般的nodejs code改成lambda格式
  3. 到AWS Lambda上操作將檔案上傳 (記得在local先npm i 把node-module裝好)
  4. 4.到AWS API Gateway建立一個API指向Lambda

1.寫一般的nodejs code

這個範例包含四個檔案,分別是node_module、index.js、package.json、package-lock.json

實際操作流程為

  1. 新建一個新資料夾
  2. 在該資料夾中建立一個index.js
  3. npm init (會建立出一個package.json)
  4. 安裝所需要的套件

index.js

test();function test(){    console.log("Hello World");}// 這時候在cmd 輸入 node index.js 就會跳出Hello World

但我希望這個API功能不只是Hello World,還可以操作Parse Server,所以我的index.js改成

const Parse = require('parse/node');Parse.initialize(appId);
Parse.serverURL = url;
var express = require('express');
var app = express();
app.get('/updateTrialSample', function (req, res) {
const query = new Parse.Query(Parse.Object.extend('TrialSample'));
query.get(req.query.id).then(trialSample => {
trialSample.set('userName', + 'Ray';
trialSample.save().then(() => res.send('success'));
}).catch(err => {
return res.send('fail:' + err);
});
});app.listen(3000);

在cmd輸入 node index.js 後就會啟動這個小server。這隻API只需要傳入 屬於 TrialSample Class中其中一筆資料的 ObjectId ,就會把該筆資料的userName欄位更改為Ray。

2.將一般的nodejs code改成lambda格式

先來看一般的lambda格式

let AWS = require('aws-sdk');
let sns = new AWS.SNS();
exports.handler = (event, context, callback) => {function response(statusCode, message) {
return callback(null, {
statusCode: statusCode,
body: JSON.stringify(message),
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
}

}
response(200, "Hello world")
};

接著要把剛剛的Code改成這種格式,改完如下

const Parse = require('parse/node');
let AWS = require('aws-sdk');
let sns = new AWS.SNS();
exports.handler = (event, context, callback) => {
const { path, queryStringParameters, headers, body } = event;

function response(statusCode, message) {
return callback(null, {
statusCode: statusCode,
body: JSON.stringify(message),
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
}
})
}
Parse.initialize(appId);
Parse.serverURL = url;

const query = new Parse.Query(Parse.Object.extend('TrialSample'));
query.get(queryStringParameters.id).then(trialSample => {
trialSample.set('userName', 'ray');
trialSample.save().then(() => response(200, "success"));
}).catch(err => {
response(400, 'fail:' + err);
});

};

這邊要注意的點

1.不需要express,lambda會幫你搞定

2.拿到傳入參數的方式不一樣

req.query.參數名稱 // node.js 拿 params 參數時寫法

而lambda 寫法是

const { path, queryStringParameters, headers, body } = event;

將參數寫在URL上

queryStringParameters.參數名稱
// get的方式(參數寫在url上)
// ex. https://...amazonaws.com/updateTrialSample?id=Ev6sHJaWW

將參數放在Body

body.id
// post的方式(參數寫在Body的raw中,postman格式要選擇JSON)

3.到AWS Lambda上操作將檔案上傳

將剛剛的檔案封裝成.zip後上傳(node_module、index.js、package.json、package-lock.json)

(上傳前記得在local先npm i 把node-module裝好)

補充:

1.設定測試用參數

2.每次程式有更動記得要先Deploy才會更新

3.如果名稱不是index.js而是app.js的話,要記得更改處理常式名稱,否則系統會不知道要往app.js找

4.如果Server很慢的話,要記得調組態的逾時時間,意思是多久沒反應的話會回報錯誤(預設3秒)。但也要注意執行時間太久的話,收費也會比較高

4.到AWS API Gateway建立一個API指向Lambda

(2023/03/05更新: "到AWS API Gateway建立一個API指向Lambda" 此步驟已不需要,在建function時將Enable function URL勾起來即可)

下為"到AWS API Gateway建立一個API指向Lambda" 原文:

點擊新增整合,將剛剛用的Lambda關聯起來

接著順順的按到最後一步後案建立就可以

完成後會產生出一個URL,這就是API的Base

以這隻範例來說,PostMan要打的位置就是

https://… amazonaws.com/updateTrialSample

5.Debug方式

建立起Lambda後,會自動建一個**CloudWatch。**

可以在這邊找到剛剛新增lambda的日誌,點進去可以看到該lambda的log,也就是說第三步那邊寫的code中的console.log都可以在這邊看到

--

--

No responses yet