AWS让使用Lambda、AWS API Gateway和IAM创建REST服务变得更加简单。在AWS中使用这些技术不需要你为Lambda何AIP Gateway服务付出任何托管成本,你只需要按照Lambda的调用次数付费就可以了。Lambda在请求量和并发性方面的自动扩展特性也能为你带来好处。
在下面的例子中,我们将会使用Java创建一个简单的REST服务,这个服务将会判断一个数字是否为质数。
这个函数将会实施Lambda handler函数。
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
public class Hello {
public String myHandler(int input, Context context) {
LambdaLogger logger = context.getLogger();
StringBuilder result = new StringBuilder("");
result.append("Input Parameter " + input + " is ");
if(isPrime(input)) {
result.append("a PRIME");
} else {
result.append("NOT a PRIME");
}
logger.log(result.toString());
return result.toString();
}
private boolean isPrime(long n) {
if(n < 2) return false;
if(n == 2 || n == 3) return true;
if(n%2 == 0 || n%3 == 0) return false;
long sqrtN = (long)Math.sqrt(n)+1;
for(long i = 6L; i <= sqrtN; i += 6) {
if(n%(i-1) == 0 || n%(i+1) == 0) return false;
}
return true;
}
}
在创建Lambda函数的时候,你需要定义一个handler,它需要在Lambda函数被触发的时候唤醒。Lambda支持两种invocation方法的调用:Event和RequestResponse。在我们的例子中,我们将会通过API Gateway在HTTPS之上使用RequestResponse这个invocation方法。
在这个例子中,我们使用API Gateway在REST之上唤醒myHandler这个Java函数。函数内的第一个参数(int input),是发送至REST服务中的handler的input。虽然我们在这个例子中使用的是一个int Java数据类型,但是其中的input可以使任何简单的Java类型、POJO或是Stream类型。
第二个参数——Context context——是一个Context对象,它允许我们与Lambda执行环境进行互动。我们在这里用它来获得与Lambda函数相关联的CloudWatch log stream。isPrime是一个私有函数,它帮我们判定input中的数字是否为质数。myHandler函数的最后两行代码,用来输出判定结果,并且将output返回给唤醒器(REST服务)。
你的部署包可以是.zip文件,也可以是独立的.jar。在我们的例子中,我们将会使用Maven Shade这个插件来创建一个独立的.jar。你需要使用aws-lambda-java-core这个依赖来创建一个Maven pom.xml,然后使用Maven Shade插件生成一个独立的.jar。在此之后,你还需要通过AWS控制台创建一个Lambda函数。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
当你将代码打包好并且上传之后,你需要创建你的Lambda函数,你需要将定义一个package.class-name,将其作为你的handler方法。
1. 输入函数名称,在我们的例子中,函数名称为PRIMELAMBDA。
1.在Runtime列表中选择Java 8。选择上传.ZIP文件,点击上传,之后选择你所创建的.jar(或是.zip)。(注意:你有人可以将.jar或是.zip文件上传到一个S3 bucket中,并且提供S3 bucket名称和对象的key。)
2.在Handler中,定义package.class-name::handler(在我们的例子中为.Hello::myHandler)
3.创建一个IAM Role,它将会允许你写CloudWatch日志。
1.使用下面提供的代码创建一个inline policy,并且将这个policy分配给IAM role。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
2 将内存定义为512(或者你所需要的内存数量)。
3 将Timeout定义为15秒(或者你所需要的timeout响应时间)。
现在,我们就创建REST服务,让它来使用API Gateway唤醒Lambda函数。
你必须已经允许API Gateway接触IAM用户。IAM用户也需要获得使用Lambda的完整权限。
1 登陆API Gateway控制台:https://console.aws.amazon.com/apigateway.
2 点击创建API按钮。
3 给新的API起名字,例如PrimeNumberAPI。
4 在从API中克隆区域,选择不要克隆已有API。
5 选择创建API。
1. 在API Gateway控制台中,选择 资源root (/),然后选择创建资源。
2. 输入新资源名称,例如PRIME。
3. 资源路径使用默认值/prime。
4. 选择创建资源。
1. 在资源窗口中,选择/ prime,然后选择创建方法。
2. HTTP方法选择POST。之后点击对勾保存。
3. 在整合类型的设置窗口内,选择Lambda函数。
4. Lambda区域选择与你之前创建的PRIMELAMBDA区域一致的区域。
5. Lambda函数中输入PRIMELAMBDA,然后选择保存。
6. 之后,你就获得了API Gateway权限,它会唤醒你的Lambda函数,选择Ok。
7. 在方法执行窗口中,选择TEST。方法Request Body窗口,然后输入任何触发数字,例如1234。
8. 点击测试,如果成功, Response Body将会显示如下结果:
“Input Parameter 1234 is NOT a PRIME”
1. 在资源窗口,选择部署API。
2. 部署阶段,选择新的阶段。
3. 阶段名称内输入production。
4. 阶段描述内,输入Prime Number Test。
5. 部署描述内,输入Calling Lambda functions。
6. 选择部署。
你可以在任何rest API中,测试这个API。
https://my-api-id.execute-api.region-id.amazonaws.com/production/prime
1. 在API Gateway控制台上,点击资源。进入POST API。
2. 点击方法请求。在认证类别中,选择AWS_IAM。
3. 点击部署API。
要想完成验证,你需要使用你的AWS access key和secret key。下面就是一个标准的AmazonAPIGatewayInvokeFullAccess IAM policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": "arn:aws:execute-api:*:*:*"
}
]
}
下一步,我们需要给REST服务打开CORS。
看看亚马逊的这篇说明文档,它详细解释了如果给用API Gateway创建的服务打开CORS。
现在我们就可以使用JavaScript在web应用中调用这个REST服务了。
API Gateway提供了一份文档,你可以根据这份文档来设置JavaScript SDK
在生成了JavaScript SDK之后,就可以使用下面这个生成的JavaScript酷了:
<script type="text/javascript" src="lib/axios/dist/axios.standalone.js"></script>
<script type="text/javascript" src="lib/CryptoJS/rollups/hmac-sha256.js"></script>
<script type="text/javascript" src="lib/CryptoJS/components/hmac.js"></script>
<script type="text/javascript" src="lib/CryptoJS/components/enc-base64.js"> </script>
<script type="text/javascript" src="lib/moment/moment.js"></script>
<script type="text/javascript" src="lib/url-template/url-template.js"></script>
<script type="text/javascript" src="lib/apiGatewayCore/sigV4Client.js"></script>
<script type="text/javascript" src="lib/apiGatewayCore/apiGatewayClient.js"></script>
<script type="text/javascript" src="lib/apiGatewayCore/utils.js"></script>
<script type="text/javascript" src="apigClient.js"></script >
之后,使用apigClient对象来写JavaScript,让它与之前创建的REST服务互动。要想pass access key和secret key,你需要使用下列代码创建一个新的客户端:
var apigClient = apigClientFactory.newClient({
accessKey: document.getElementById("accessKey").value,
secretKey: document.getElementById("secretKey").value,
});
注意:如果你在没有IAM验证的情况下创建了API Gateway REST服务,任何人都可以唤醒它。在HTML元素中pass任何一个数字,并且使用任何额外的参数,都可以唤醒服务:
var body = document.getElementById("number").value;
var params = {
// This is where any modeled request parameters should be added.
// The key is the parameter name, as it is defined in the API in API Gateway.
//param0: '',
//param1: ''
};
var additionalParams = {
// If there are any unmodeled query parameters or headers that must be
// sent with the request, add them here.
headers: {
//param0: '',
//param1: ''
},
queryParams: {
//param0: '',
//param1: ''
}
};
最后,调用REST服务,方法是在参数中进行pass,这个参数包含了被服务判定的整数,一起任何其他的额外参数,如下所示:
apigClient.prime(params, body, additionalParams)
.then(function(result){
res.innerHTML = JSON.stringify(result);
}).catch(function(result){
res.innerHTML = "Sorry, API Gateway is not responding";
});
判定结果会用REST服务的输出更新HTML元素的显示。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景
涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。
根据给定的手机号、姓名、身份证、人像图片核验是否一致
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。
IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。