掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

使用AWS Lambda、API Gateway和IAM创建简单的REST服务

AWS让使用LambdaAWS API GatewayIAM创建REST服务变得更加简单。在AWS中使用这些技术不需要你为LambdaAIP Gateway服务付出任何托管成本,你只需要按照Lambda的调用次数付费就可以了。Lambda在请求量和并发性方面的自动扩展特性也能为你带来好处。

在下面的例子中,我们将会使用Java创建一个简单的REST服务,这个服务将会判断一个数字是否为质数。

AWS Lambda


Step 1: 创建Lambda函数


这个函数将会实施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方法的调用:EventRequestResponse。在我们的例子中,我们将会通过API GatewayHTTPS之上使用RequestResponse这个invocation方法。

在这个例子中,我们使用API GatewayREST之上唤醒myHandler这个Java函数。函数内的第一个参数(int input),是发送至REST服务中的handlerinput。虽然我们在这个例子中使用的是一个int Java数据类型,但是其中的input可以使任何简单的Java类型、POJO或是Stream类型。

第二个参数——Context context——是一个Context对象,它允许我们与Lambda执行环境进行互动。我们在这里用它来获得与Lambda函数相关联的CloudWatch log streamisPrime是一个私有函数,它帮我们判定input中的数字是否为质数。myHandler函数的最后两行代码,用来输出判定结果,并且将output返回给唤醒器(REST服务)。

Step 2: 创建部署包


你的部署包可以是.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>

Step 3: 通过AWS控制台创建Lambda函数


当你将代码打包好并且上传之后,你需要创建你的Lambda函数,你需要将定义一个package.class-name,将其作为你的handler方法。

  • 1. 登录AWS Management Console,打开AWS Lambda控制台,选择区域。在我们的例子中,我们将使用 US-East Cost (North Virginia)
  • 2. 选择创建一个Lambda函数
  • 3. 在第一步中,选择蓝图,选择hello-world蓝图,或是跳过这一步。
  • 4. 在第二步中,配置函数,定义下面这些值:

             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


先决条件


你必须已经允许API Gateway接触IAM用户。IAM用户也需要获得使用Lambda的完整权限。

Step 1: 创建API


1 登陆API Gateway控制台:https://console.aws.amazon.com/apigateway.

2 点击创建API按钮。

3 给新的API起名字,例如PrimeNumberAPI

4 在从API中克隆区域,选择不要克隆已有API

5 选择创建API

Step 2: 创建资源


1. API Gateway控制台中,选择 资源root (/),然后选择创建资源。

2. 输入新资源名称,例如PRIME

3. 资源路径使用默认值/prime

4. 选择创建资源。

Step 3: 创建并测试POST方法


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”

Step 4: 部署API


1. 在资源窗口,选择部署API

2. 部署阶段,选择新的阶段。

3. 阶段名称内输入production

4. 阶段描述内,输入Prime Number Test

5. 部署描述内,输入Calling Lambda functions

6. 选择部署。

Step 5:测试API


你可以在任何rest API中,测试这个API   

   https://my-api-id.execute-api.region-id.amazonaws.com/production/prime

使用IAM开启认证


1. API Gateway控制台上,点击资源。进入POST API

2. 点击方法请求。在认证类别中,选择AWS_IAM

3. 点击部署API

要想完成验证,你需要使用你的AWS access keysecret key。下面就是一个标准的AmazonAPIGatewayInvokeFullAccess IAM policy

    {

  "Version": "2012-10-17",

  "Statement": [

    {

      "Effect": "Allow",

      "Action": [

        "execute-api:Invoke"

      ],

      "Resource": "arn:aws:execute-api:*:*:*"

    }

  ]

}

下一步,我们需要给REST服务打开CORS

给新创建的服务打开CORS


看看亚马逊的这篇说明文档,它详细解释了如果给用API Gateway创建的服务打开CORS

现在我们就可以使用JavaScriptweb应用中调用这个REST服务了。

通过JavaScript调用服务


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 keysecret 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

0512-88869195
数 据 驱 动 未 来
Data Drives The Future