- AWS Lambda 教程
- AWS Lambda - 首頁
- AWS Lambda - 概述
- AWS Lambda - 環境設定
- AWS Lambda - 簡介
- 構建 Lambda 函式
- NODEJS 中的函式
- Java 中的函式
- Python 中的函式
- Go 中的函式
- C# 中的函式
- 配置 Lambda 函式
- 使用 AWS 控制檯建立和部署
- 使用 AWS CLI 建立和部署
- 使用 Serverless Framework 建立和部署
- AWS 執行和呼叫 Lambda 函式
- 刪除 Lambda 函式
- 使用 Amazon API Gateway
- 帶有 Amazon S3 的 Lambda 函式
- 帶有 Amazon DynamoDB 的 Lambda 函式
- 帶有計劃事件的 Lambda 函式
- 帶有 Amazon SNS 的 Lambda 函式
- 帶有 CloudTrail 的 Lambda 函式
- 帶有 Amazon Kinesis 的 Lambda 函式
- 帶有自定義使用者應用程式的 Lambda 函式
- AWS Lambda@Edge 與 CloudFront
- 使用 Cloudwatch 監控和故障排除
- AWS Lambda – 額外示例
- AWS Lambda 有用資源
- AWS Lambda - 快速指南
- AWS Lambda - 有用資源
- AWS Lambda - 討論
AWS Lambda – 額外示例
到目前為止,我們已經看到了 AWS Lambda 與 AWS 服務一起工作的情況。基於這些知識,讓我們建立一個簡單的使用者登錄檔單,並使用 API 閘道器將資料釋出到 AWS Lambda。AWS Lambda 將從事件或 API 閘道器觸發器獲取資料,並將這些詳細資訊新增到 DynamoDB 表中。
示例
讓我們考慮一個示例,並在其上執行以下功能:
建立 DynamoDB 表
建立使用者登錄檔單
建立 AWS Lambda 和 API 閘道器以使用 AWS SNS 服務向手機發送訊息
建立 AWS Lambda 和 API 閘道器以釋出表單資料並將其插入 DynamoDb 表中
建立 AWS Lambda 和 API 閘道器以讀取 Dynamodb 表中的資料
使用者登錄檔單的最終工作
建立 DynamoDB 表
輸入的資料將儲存在 DynamodDB 表中。我們將使用 API 閘道器來共享與 AWS Lambda 輸入的資料,然後 AWS Lambda 將在 DynamoDB 中新增詳細資訊。
您可以使用以下詳細資訊在 AWS 控制檯中建立 DynamodDB 表。首先,轉到 AWS 服務並點選 **DynamoDB**。點選 **表** 以建立表,如下所示:
您可以使用 ARN 為要與 AWS Lambda 一起使用的 DynamoDB 建立策略。
轉到 IAM 並選擇 **策略**。點選 **建立策略**,選擇服務為 DynamodDB,如下所示:
點選 **所有 DynamoDB** 操作,如上所示。選擇資源並輸入表的 ARN,如下所示:
現在,點選 **新增**,如下所示。
如果您點選螢幕末尾的 **檢視策略** 按鈕,您將看到以下視窗:
輸入策略名稱,然後點選頁面末尾的 **建立策略** 按鈕。現在,我們需要建立要與 Lambda 一起使用的角色。我們需要 DynamoDB、APIGateway 和 Lambda 的許可權。
轉到 AWS 服務並選擇 IAM。從左側選擇角色並新增所需的角色。
輸入角色名稱,然後點選 **建立角色**。建立的角色是 **roleforlambdaexample**。
建立使用者登錄檔單
以下是使用者登錄檔單的顯示,用於輸入和從 dynamodb 表中讀取資料。
建立 AWS Lambda 和 API 閘道器以使用 SNS 服務向手機發送 OTP 訊息
如果您看到使用者登錄檔單,則有一個按鈕 **驗證手機**。使用者應該輸入電話號碼,然後點選 **驗證手機** 按鈕以驗證電話號碼。
為此:
當用戶點選此按鈕時,將呼叫包含電話詳細資訊的 API 閘道器 POST 方法,並在內部觸發 AWS Lambda。
然後,AWS Lambda 使用 AWS SNS 服務將 OTP 傳送到輸入的電話號碼。
使用者接收 OTP 並必須輸入此 OTP 號碼。
輸入 OTP 的文字框將在輸入電話號碼並點選 **驗證手機** 按鈕後出現。
從 AWS Lambda 收到的 OTP 和使用者輸入的 OTP 必須匹配,才能允許使用者提交使用者登錄檔單。
這裡顯示了一個簡單的框圖,說明了電話驗證的工作原理:
建立的 AWS Lambda 函式如下所示:
相應的 AWS Lambda 程式碼如下所示:
const aws = require("aws-sdk");
const sns = new aws.SNS({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
let phoneno = event.mphone;
let otp = Math.floor(100000 + Math.random() * 900000);
let snsmessage = "Your otp is : "+otp;
sns.publish({
Message: snsmessage,
PhoneNumber: "+91"+phoneno
}, function (err, data) {
if (err) {
console.log(err);
callback(err, null);
} else {
console.log(data);
callback(null, otp);
}
});
};
請注意,我們正在使用 SNS 服務傳送 OTP 程式碼。此程式碼用於驗證使用者在使用者登錄檔單中輸入的手機號碼。為上述電話驗證建立的 API 閘道器如下:
給定的 Lambda 函式為 **phonevalidationexample**。我們在這裡獲取手機詳細資訊以在 AWS Lambda 內部使用。然後,AWS Lambda 將 OTP 程式碼傳送到給定的手機號碼。
建立 AWS Lambda 和 API 閘道器以釋出表單資料並將其插入 DynamoDB 表中
對於使用者登錄檔單,所有欄位都是必填的。有一個 AJAX 呼叫,其中表單中輸入的資料釋出到 API 閘道器 URL。
這裡顯示了一個簡單的框圖,說明了提交按鈕的工作原理:
填寫表單後,提交按鈕將呼叫 API 閘道器,這將觸發 AWS Lambda。AWS Lambda 將從事件或 API 閘道器獲取表單的詳細資訊,並將資料插入 DynamodDB 表中。
讓我們瞭解 API 閘道器和 AWS Lambda 的建立。
首先,轉到 AWS 服務並點選 Lambda。建立的 Lambda 函式如下所示:
現在,要建立 API 閘道器,請轉到 AWS 服務並選擇 **API 閘道器**。點選下面顯示的 **建立 API** 按鈕。
輸入 **API 名稱**,然後點選 **建立 API** 按鈕以新增 API。
現在,建立了一個名為 **registeruser** 的 API。選擇 API 並點選 **操作** 下拉選單以建立 **資源**。
點選 **建立資源**。現在,讓我們新增 **POST** 方法。為此,點選左側建立的資源,然後從 **操作** 下拉選單中選擇 **建立方法**。這將顯示如下所示的下拉選單:
選擇 POST 方法並新增我們上面建立的 Lambda 函式。
點選 **儲存** 按鈕以新增方法。要將表單詳細資訊傳送到 Lambda 函式 **lambdaexample**,我們需要新增 **整合請求**,如下所示:
要釋出表單詳細資訊,您需要點選 **整合請求**。它將顯示以下詳細資訊。
點選 **主體對映模板** 以新增要釋出的表單欄位。
接下來,點選 **新增對映模板** 並輸入內容型別。在這裡,我們添加了 **application/json** 作為內容型別。點選它,在這裡您需要以 json 格式輸入欄位,如下所示:
現在,點選 **儲存** 按鈕並部署 API,如下所示:
這是為 POST 建立的 API,將在我們的 .html 檔案中使用。請注意,我們需要為建立的資源啟用 CORS。將使用 api 閘道器 url 進行 ajax 呼叫,因此必須啟用 CORS。
選擇要在其上啟用 CORS 的方法。點選 **啟用 CORS 並替換現有 CORS 標頭**。
它將顯示如下所示的確認螢幕:
點選 **是,替換現有值** 以啟用 CORS。
這裡顯示了 POST API 閘道器的 AWS Lambda 程式碼:
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
console.log(event);
console.log("Entering Data");
var data = {
TableName : "registeruser",
Item : {
first_name:event.fname,
last_name:event.lname,
emailid:event.emailid,
mobile_no : event.mphone,
otp:event.otp,
username:event.uname,
password:event.passwd,
confirm_password:event.cpasswd
}
}
docClient.put(data, function(err, value) {
if (err) {
console.log("Error");
callback(err, null);
} else {
console.log("data added successfully");
callback(null, value);
}
});
}
AWS Lambda 處理程式中的 event 引數將包含之前在 POST 整合請求中新增的所有詳細資訊。來自 event 的詳細資訊將新增到 DynamodDB 表中,如程式碼所示。
現在,我們需要從 AWS-SDK 獲取服務詳細資訊,如下所示:
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
region:'us-east-1'
});
var data = {
TableName : "registeruser",
Item : {
first_name:event.fname,
last_name:event.lname,
emailid:event.emailid,
mobile_no : event.mphone,
otp:event.otp,
username:event.uname,
password:event.passwd,
confirm_password:event.cpasswd
}
}
docClient.put(data, function(err, value) {
if (err) {
console.log("Error");
callback(err, null);
} else {
console.log("data added successfully");
callback(null, value);
}
});
建立 AWS Lambda 和 API 閘道器以從 DynamodDB 表讀取資料
現在,我們將建立 AWS Lambda 函式以從 DynamoDB 表讀取資料。我們將觸發 APIGateway 到 AWS Lambda 函式,該函式將資料傳送到 html 表單。
建立的 AWS Lambda 函式如下所示:
相應的 AWS Lambda 程式碼如下:
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
region:'us-east-1'
});
exports.handler = function(event, context, callback) {
var readdata = {
TableName : "registeruser",
Limit : 10
}
docClient.scan(readdata, function(err, data) {
if (err) {
console.log("Error");
callback(err, null);
} else {
console.log("Data is " + data);
callback(null, data);
}
});
}
這裡從 DynamoDB 表中讀取資料並提供給回撥。現在,我們將建立 APIGateway 並新增 AWS Lambda 函式作為觸發器。
我們將向之前建立的 API 新增 GET 方法。
新增的 Lambda 函式是 **lambdareaddataexample**。點選 **儲存** 以儲存方法並部署 api。
使用者登錄檔單的最終工作
表單的最終顯示如下所示:
現在,輸入如上所示的詳細資訊。請注意,提交按鈕被停用。只有在輸入所有詳細資訊後才會啟用它,如下所示:
現在,輸入手機號碼並點選 **驗證手機** 按鈕。它將顯示一條警報訊息,提示 **“OTP 已傳送到手機,請輸入 OTP 以繼續”**。傳送到手機號碼的 OTP 如下:
輸入 OTP 和其餘詳細資訊,然後提交表單。
提交後,DynamoDB **registeruser** 表中的資料如下所示:
程式碼詳細資訊如下所示:
Example1.html
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="formdet.js"></script>
<style>
input[type=text], input[type=password],button {
width: 100%;
padding: 5px 5px;
margin: 5px 0;
box-sizing: border-box;
}
#maincontainer {
width: 80%;
margin: auto;
padding: 10px;
}
div#userregistration {
width: 60%;
float: left;
}
div#userdisplay {
margin-left: 60%;
}
</style>
</head>
<body>
<div id="maincontainer">
<div id="userregistration">
<h1>User Registration Form</h1>
<table border="0">
<tr>
<td><b>First Name<span style="color:red;">*</span> : </b></td>
<td><input type="text" value="" name="fname" id="fname" /></td>
<td id="tdfname" style="display:none;"><span style="color:red;">Enter First Name</span></td>
</tr>
<tr>
<td><b>Last Name<span style="color:red;">*</span> : </b></td>
<td><input type="text" value="" name="lname" id="lname" /></td>
<td id="tdlname" style="display:none;"><span style="color:red;">Enter Last Name</span></td>
</tr>
<tr>
<td><b>Email Id<span style="color:red;">*</span> : </b></td>
<td><input type="text" value="" name="emailid" id="emailid" /></td>
<td id="tdemailid" style="display:none;"><span style="color:red;">Enter Email</span></td>
</tr>
<tr>
<td><b>Mobile No<span style="color:red;">*</span> : </b></td>
<td><input type="text" name="mphone" id="mphone"/></td>
<td id="tdmphone" style="display:none;"><span style="color:red;">Enter Mobile Number</span></td>
</tr>
<tr>
<td></td>
<td><button id="validatephone">validate phone</button></td>
<td></td>
</tr>
<tr id="otpdiv" style="display:none;">
<td><b>Enter OTP<span style="color:red;">*</span>:</b></td>
<td><input type="text" value="" name="otp" id="otp" /></td>
<td id="tdotp" style="display:none;"><span style="color:red;">Enter OTP</span></td>
</tr>
<tr>
<td><b>Username<span style="color:red;">*</span>: </b></td>
<td><input type="text" value="" name="uname" id="uname"/></td>
<td id="tduname" style="display:none;"><span style="color:red;">Enter Username</span></td>
</tr>
<tr><td><b>Password<span style="color:red;">*</span> :</b></td>
<td><input type="password" value="" name="passwd" id="passwd"/></td>
<td id="tdpasswd" style="display:none;"><span style="color:red;">Enter Password</span></td>
</tr>
<tr><td><b>Confirm Password<span style="color:red;">*</span> :</b></td>
<td><input type="password" value="" name="cpasswd" id="cpasswd"/></td>
<td id="tdcpasswd" style="display:none;"><span style="color:red;">Enter Confirm Password</span></td>
</tr>
<tr>
<td></td>
<td><button name="submit" id="submit" style="display:;" disabled="true">Submit</button></td>
<td></td>
</tr>
</table>
</div>
<div id="userdisplay">
<h1>User Display</h1>
<table id="displaydetails" style="display:block;width:80%;padding:5px;margin:5px; border: 1px solid black;">
<tr>
<td></td>
<td>FirstName</td>
<td>LastName</td>
<td>Mobile No</td>
<td>EmailID</td>
</tr>
</table>
</div>
</div>
</body>
</html>
formdet.js
function validateform() {
var sError="";
if ($("#fname").val() === "") {
$("#tdfname").css("display","");
sError++;
}
if ($("#lname").val() === "") {
$("#tdlname").css("display","");
sError++;
}
if ($("#emailid").val() === "") {
$("#tdemailid").css("display","");
sError++;
}
if ($("#mphone").val() === "") {
$("#tdmphone").css("display","");
sError++;
}
if ($("#otp").val() === "") {
$("#tdotp").css("display","");
sError++;
}
if ($("#uname").val() === "") {
$("#tduname").css("display","");
sError++;
}
if ($("#passwd").val() === "") {
$("#tdpasswd").css("display","");
sError++;
}
if ($("#cpasswd").val() === "") {
$("#tdcpasswd").css("display","");
sError++;
}
if (sError === "") {
return true;
} else {
return false;
}
}
$("#fname").change(function() {
if ($("#fname").val() !== "") {
$("#tdfname").css("display","none");
} else {
$("#tdfname").css("display","");
}
});
$("#lname").change(function() {
if ($("#lname").val() !== "") {
$("#tdlname").css("display","none");
} else {
$("#tdlname").css("display","");
}
});
$("#emailid").change(function() {
if ($("#emailid").val() !== "") {
$("#tdemailid").css("display","none");
} else {
$("#tdemailid").css("display","");
}
});
$("#mphone").change(function() {
if ($("#mphone").val() !== "") {
$("#tdmphone").css("display","none");
} else {
$("#tdmphone").css("display","");
}
});
$("#otp").change(function() {
if ($("#otp").val() !== "") {
$("#tdotp").css("display","none");
} else {
$("#tdotp").css("display","");
}
});
$("#uname").change(function() {
if ($("#uname").val() !== "") {
$("#tduname").css("display","none");
} else {
$("#tduname").css("display","");
}
});
$("#passwd").change(function() {
if ($("#passwd").val() !== "") {
$("#tdpasswd").css("display","none");
} else {
$("#tdpasswd").css("display","");
}
});
$("#cpasswd").change(function() {
if ($("#cpasswd").val() !== "") {
$("#tdcpasswd").css("display","none");
} else {
$("#tdcpasswd").css("display","");
}
});
var posturl = "https://4rvwimysc1.execute-api.us-east-1.amazonaws.com/prod/adduser";
var phonevalidationurl = "https://wnvt01y6nc.execute-api.us-east-1.amazonaws.com/prod/validate";
var otpsend = "";
function getdata() {
var a = 0;
$.ajax({
type:'GET',
url:posturl,
success: function(data) {
$("#displaydetails").html('');
$("#displaydetails").css("display", "");
console.log(data);
$("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:gray;"><td>Name</td><td>Mobile No</td><td>EmailID</td></tr>');
data.Items.forEach(function(registeruser) {
var clr = (a%2 === 0) ? "#eee": "white";
a++;
$("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:'+clr+'"><td>'+registeruser.first_name+'-'+registeruser.last_name+'</td><td>'+registeruser.mobile_no+'</td><td>'+registeruser.emailid+'</td></tr>');
});
},
error: function(err) {
console.log(err);
}
});
}
$(document).ready(function() {
$("#otp").on("change", function() {
var otpentered = $("#otp").val();
if (otpsend == otpentered) {
document.getElementById("submit").disabled = false;
} else {
alert("OTP is not valid.Please enter the valid one or validate phone again to continue!");
document.getElementById("submit").disabled = true;
}
});
$("#validatephone").on("click", function() {
$.ajax({
type:'POST',
url:phonevalidationurl,
data:JSON.stringify({
"mphone":$("#mphone").val()
}),
success: function(data) {
$("#otpdiv").css("display", "");
alert("OTP is send to the mobile, please enter to continue");
console.log(data);
otpsend = data;
},
error : function(err) {
$("#otpdiv").css("display", "none");
alert("Invalid mobile no.");
}
});
});
$("#submit").on("click", function() {
if (validateform()) {
$.ajax({
type:'POST',
url:posturl,
data:JSON.stringify({
"fname": $("#fname").val(),
"lname": $("#lname").val(),
"emailid":$("#emailid").val(),
"mphone":$("#mphone").val(),
"otp":$("#otp").val(),
"uname":$("#uname").val(),
"passwd":$("#passwd").val(),
"cpasswd":$("#cpasswd").val()
}),
success: function(data) {
alert("Data added successfully");
console.log(data);
getdata();
}
});
}
});
getdata();
});
到目前為止,我們已經對建立的 API 進行了 AJAX 呼叫,併發布瞭如上所示的資料。
將資料新增到表的 AJAX 呼叫如下:
var posturl = "https://4rvwimysc1.execute-api.us-east-1.amazonaws.com/prod/adduser";
$(document).ready(function() {
$("#submit").on("click", function() {
if (validateform()) {
$.ajax({
type:'POST',
url:posturl,
data:JSON.stringify({
"fname": $("#fname").val(),
"lname": $("#lname").val(),
"emailid":$("#emailid").val(),
"mphone":$("#mphone").val(),
"otp":$("#otp").val(),
"uname":$("#uname").val(),
"passwd":$("#passwd").val(),
"cpasswd":$("#cpasswd").val()
}),
success: function(data) {
alert("Data added successfully");
console.log(data);
getdata();
}
});
}
});
});
請注意,要讀取資料,會呼叫一個函式,其程式碼如下:
function getdata() {
var a = 0;
$.ajax({
type:'GET',
url:posturl,
success: function(data) {
$("#displaydetails").html('');
$("#displaydetails").css("display", "");
console.log(data);
$("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:gray;"><td>Name</td><td>Mobile No</td><td>EmailID</td></tr>');
data.Items.forEach(function(registeruser) {
var clr = (a%2 === 0) ? "#eee": "white";
a++;
$("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:'+clr+'"><td>'+registeruser.first_name+'-'+registeruser.last_name+'</td><td>'+registeruser.mobile_no+'</td><td>'+registeruser.emailid+'</td></tr>');
});
},
error: function(err) {
console.log(err);
}
});
}
當您點選手機號碼驗證按鈕時,將呼叫以下程式碼併發送手機號碼:
var phonevalidationurl = "https://wnvt01y6nc.execute-api.us-east-1.amazonaws.com/prod/validate";
var otpsend = "";
$("#validatephone").on("click", function() {
$.ajax({
type:'POST',
url:phonevalidationurl,
data:JSON.stringify({
"mphone":$("#mphone").val()
}),
success: function(data) {
$("#otpdiv").css("display", "");
alert("OTP is send to the mobile, please enter the OTP to continue");
console.log(data);
otpsend = data;
},
error : function(err) {
$("#otpdiv").css("display", "none");
alert("Invalid mobile no.");
}
});
});
// Validate otp
$("#otp").on("change", function() {
var otpentered = $("#otp").val();
if (otpsend == otpentered) {
document.getElementById("submit").disabled = false;
} else {
alert("OTP is not valid.Please enter the valid one or validate phone again to continue!");
document.getElementById("submit").disabled = true;
}
}