-- Aws Lambda函数的配置与应用
【官网】:https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html
应用场景
有时遇到一些简单的需求场景,也不想去管理服务器,并且想按计算时间付费,没运行相关接口的时候就不付费。这个时候你应该想到Aws Lambda函数。基础资源
Aws相关的账号,Aws lambda支持的语言及依赖库或包。
使用须知
1.)需要设置lambda函数的授权策略,避免权限漏洞被不法分子利用。 2.)需要注意函数运行时间。 3.)强烈建议在nodejs本地开发环境下调试(部分环境event会话可以不用,改用死值)
配置步骤
>概述.
AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行您的代码并自动缩放。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。您只需要以 AWS Lambda 支持的一种语言(nodejs,python,ruby,java,go,c#,powershell)提供您的代码。
>lambda函数开发(本文基于nodejs).
详见快速入门。
>lambda函数的发布.
>>本地node js环境下开发。
[注]本地开发与aws lambda控制台开发的区别在于,本地环境下没有lambda的事件会话,不过在这个我们可以自己把参数定死,主要是把nodejs的业务代码调通,之后再到lambda控制台那边,把死值改成从event 会话中读取参数。
1. )下载安装nodejs.
https://nodejs.org/en/download/
2. )从开始菜单中的”Node.js command prompt”点击进入。
3. )定位到开发目录。
4. )通过”npm install 包名” 安装依赖库。
5. )创建 index.js, 在里面开发你的业务代码,下面给出一个示例:
>>配置函数
>>>lambda控制台创建函数.
[控制台地址]https://console.aws.amazon.com/lambda/home
选择 Create a function。
在函数名称中,输入 my-function。
选择 Create function。
>>>发布内容。
a)运行库(依赖的包,模块等).
b>业务代码.
在aws lambda后台中把代码放到index文件中。
>>>控制台测试lambda.
A)在右上角,选择测试。
B)在 Configure test event 页面中,选择 Create new test event,并且在 Event template 中,保留默认的 Hello World 选项。输入 Event name 并记录以下示例事件模板:
{
"phone": "15900010002"
}
可以更改示例 JSON 中的键和值,但不要更改事件结构。如果您更改任何键和值,则必须相应更新示例代码。
C)选择 Create (创建),然后选择 Test (测试)。每个用户每个函数可以创建最多 10 个测试事件。这些测试事件不适用于其他用户。
AWS Lambda 代表您执行您的函数。您的 Lambda 函数中的 handler 接收并处理示例事件。
D)成功执行后,在控制台中查看结果。
>>添加到实例并授权。
您可以使用 AWS Identity and Access Management (IAM) 中基于身份的策略授予您账户中的用户访问 Lambda 的权限。基于身份的策略可以直接应用于用户,也可以应用于与用户相关的组和角色。您也可以授予另一个账户中的用户在您的账户中代入角色和访问您的 Lambda 资源的权限。
你需要给你的IAM用户lambda:InvokeFunction permission权限:
在IAM管理控制台中找到您的用户并单击它。
在“权限”选项卡上,展开“内联策略”部分并单击“单击此处”链接以添加策略。
选择“自定义策略”。
给你的策略起个名字。它可以是任意名。将此策略放在策略文档字段中。
示例 策略(policy):
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"Stmt1464440182000",
"Effect":"Allow",
"Action":[
"lambda:getUserByPhone",
"lambda:InvokeFunction"
],
"Resource":[
"*"
]
}
]
}
在这个策略中,包含了两个方法来调用lambda方法。
更新:
现在还有一个名为AWSLambdaRole的IAM管理策略,您可以将其分配给您的IAM用户或IAM角色。这将为您提供所需的权限。
[注]如果没有正确授权,则在应用页面调用lambda时会提示:”AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction“.
>>实现类似域名白名单的机制,限制只有指定域名的网页js才能访问lambda.
AWS Lambda will not work alone itself you need to integrate with API Gateway or any other services. As per your requirement, you need to integrate your Lambda with API Gateway. Now follow the step:
- Go to API Gateway
- Select your API
- Click Action->Enable Cors
- Fill your domain inside Access-Control-Allow-Origin field. e.g; dev.yourdomain.com
常见问题
-
AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction
【解决方案】https://stackoverflow.com/questions/37498124/accessdeniedexception-user-is-not-authorized-to-perform-lambdainvokefunction -
授权了依然不好用
【解决方案】需要针对调用lambda函数的是web网页,Contact Flow, Kinesis还是其它,然后再进行对应的角色授权 -
如何实现lambda函数被web网页调用时实行域名白名单机制
【解决方案】https://stackoverflow.com/questions/56729173/aws-lambda-domain-whitelist
快速入门
【lambda函数开发示例】
exports.handler = function(event, context, callback) { var request = require(‘request‘); var phone=event[‘phone‘]; var ApiUrl =‘https://xxxxx.com/api/getUserByPhone‘; var JsonData={"Phone":phone}; var postData=JSON.stringify(JsonData); var resultMap={"RunCode":-1,"UserID":"","UserName":""}; request.post({url:ApiUrl, form:{data:postData},strictSSL:false}, function(error, response, body) { if (!error && response.statusCode == 200) { console.log("body="+body); var RspContent=JSON.parse(body); resultMap["RunCode"]=RspContent["RunCode"]; if(RspResult["RunCode"]=="1"){ resultMap={ "RunCode":RspResult["RunCode"], "UserID":RspResult["ResultData"]["UserID"], "UserName":RspResult["ResultData"]["UserName"] } } } else{ console.log("err="+error); } console.log(JSON.stringify(resultMap)); if(callback!=null){ callback(null,resultMap); } }); };
【外部调用lambda函数示例】
[注]需要引用js:https://sdk.amazonaws.com/js/aws-sdk-2.283.1.min.js
function onMatchUserInfo(phone){ var payload = ‘{"phone" : "‘ + phone + ‘"}‘ var creds = new AWS.CognitoIdentityCredentials({ IdentityPoolId: ‘us-east-1:111111f2-437e-57dc-8b50-d9219b000000‘ }); AWS.config.credentials = creds; AWS.config.update({ region: ‘us-west-1‘ }); var lambda = new AWS.Lambda(); var params = { FunctionName: ‘GetUserByPhone‘, Payload: payload }; lambda.invoke(params, function(err, data) { if (err) console.log(err, err.stack); else { var cObj=JSON.parse(data.Payload); console.log("userid="+cObj.UserId); window.alert("当前来电客户是"+cObj.UserName); } }); }