在上一篇文章中,我们实现了基于Java的aws lambda函数,并使用CloudFront进行了部署。 由于我们已经设置了lambda函数,因此我们将使用AWS API Gateway将其与http端点集成。

Amazon API Gateway是一项完全托管的服务,使开发人员可以轻松地创建,发布,维护,监控和保护各种规模的API。 在AWS管理控制台中单击几下,您可以创建一个API,充当应用程序从后端服务访问数据,业务逻辑或功能(例如在Amazon Elastic Compute Cloud上运行的工作负载)的“前门”。 (Amazon EC2),在AWS Lambda或任何Web应用程序上运行的代码

对于此示例,将API网关想象为一个HTTP连接器。 我们将更改原始功能以实现划分。

package com.gkatzioura.deployment.lambda;import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;import java.math.BigDecimal;
import java.util.Map;
import java.util.logging.Logger;/*** Created by gkatzioura on 9/10/2016.*/
public class RequestFunctionHandler implements RequestHandler<Map<String,String>,String> {private static final String NUMERATOR_KEY = "numerator";private static final String DENOMINATOR_KEY = "denominator";private static final Logger LOGGER = Logger.getLogger(RequestFunctionHandler.class.getName());public String handleRequest(Map <String,String> values, Context context) {LOGGER.info("Handling request");if(!values.containsKey(NUMERATOR_KEY)||!values.containsKey(DENOMINATOR_KEY)) {return "You need both numberator and denominator";}try {BigDecimal numerator = new BigDecimal(values.get(NUMERATOR_KEY));BigDecimal denominator= new BigDecimal(values.get(DENOMINATOR_KEY));return  numerator.divide(denominator).toString();} catch (Exception e) {return "Please provide valid values";}}}

然后,我们将更改lambda代码并在s3上对其进行更新。

aws s3 cp build/distributions/JavaLambdaDeployment.zip s3://lambda-functions/JavaLambdaDeployment.zip

下一步是更新我们的CloudFormation模板,并将api网关转发请求添加到我们的lambda函数。

首先,我们必须声明我们的Rest API

"AGRA16PAA": {"Type": "AWS::ApiGateway::RestApi","Properties": {"Name": "CalculationApi"}}

然后,我们需要添加一个休息资源。 在DependsOn元素内,我们可以看到rest api的ID。 因此,cloudwatch将在创建其余api后创建资源。

"AGR2JDQ8": {"Type": "AWS::ApiGateway::Resource","Properties": {"RestApiId": {"Ref": "AGRA16PAA"},"ParentId": {"Fn::GetAtt": ["AGRA16PAA","RootResourceId"]},"PathPart": "divide"},"DependsOn": ["AGRA16PAA"]}

另一个关键部分是添加权限,以便能够调用我们的lambda函数。

"LPI6K5": {"Type": "AWS::Lambda::Permission","Properties": {"Action": "lambda:invokeFunction","FunctionName": {"Fn::GetAtt": ["LF9MBL", "Arn"]},"Principal": "apigateway.amazonaws.com","SourceArn": {"Fn::Join": ["",["arn:aws:execute-api:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":", {"Ref": "AGRA16PAA"}, "/*"]]}}}

最后一步是添加api网关方法,以便能够从api网关调用我们的lambda函数。 此外,我们将添加api网关部署说明。

"Deployment": {"Type": "AWS::ApiGateway::Deployment","Properties": {"RestApiId": { "Ref": "AGRA16PAA" },"Description": "First Deployment","StageName": "StagingStage"},"DependsOn" : ["AGM25KFD"]},"AGM25KFD": {"Type": "AWS::ApiGateway::Method","Properties": {"AuthorizationType": "NONE","HttpMethod": "POST","ResourceId": {"Ref": "AGR2JDQ8"},"RestApiId": {"Ref": "AGRA16PAA"},"Integration": {"Type": "AWS","IntegrationHttpMethod": "POST","IntegrationResponses": [{"StatusCode": 200}],"Uri": {"Fn::Join": ["",["arn:aws:apigateway:",{"Ref": "AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt": ["LF9MBL", "Arn"]},"/invocations"]]}},"MethodResponses": [{"StatusCode": 200}]}

因此,我们最终获得了新的cloudwatch配置。

{"AWSTemplateFormatVersion": "2010-09-09","Resources": {"LF9MBL": {"Type": "AWS::Lambda::Function","Properties": {"Code": {"S3Bucket": "lambda-functions","S3Key": "JavaLambdaDeployment.zip"},"FunctionName": "SimpleRequest","Handler": "com.gkatzioura.deployment.lambda.RequestFunctionHandler","MemorySize": 128,"Role": "arn:aws:iam::274402012893:role/lambda_basic_execution","Runtime": "java8"}},"Deployment": {"Type": "AWS::ApiGateway::Deployment","Properties": {"RestApiId": { "Ref": "AGRA16PAA" },"Description": "First Deployment","StageName": "StagingStage"},"DependsOn" : ["AGM25KFD"]},"AGM25KFD": {"Type": "AWS::ApiGateway::Method","Properties": {"AuthorizationType": "NONE","HttpMethod": "POST","ResourceId": {"Ref": "AGR2JDQ8"},"RestApiId": {"Ref": "AGRA16PAA"},"Integration": {"Type": "AWS","IntegrationHttpMethod": "POST","IntegrationResponses": [{"StatusCode": 200}],"Uri": {"Fn::Join": ["",["arn:aws:apigateway:",{"Ref": "AWS::Region"},":lambda:path/2015-03-31/functions/",{"Fn::GetAtt": ["LF9MBL","Arn"]},"/invocations"]]}},"MethodResponses": [{"StatusCode": 200}]},"DependsOn": ["LF9MBL","AGR2JDQ8","LPI6K5"]},"AGR2JDQ8": {"Type": "AWS::ApiGateway::Resource","Properties": {"RestApiId": {"Ref": "AGRA16PAA"},"ParentId": {"Fn::GetAtt": ["AGRA16PAA","RootResourceId"]},"PathPart": "divide"},"DependsOn": ["AGRA16PAA"]},"AGRA16PAA": {"Type": "AWS::ApiGateway::RestApi","Properties": {"Name": "CalculationApi"}},"LPI6K5": {"Type": "AWS::Lambda::Permission","Properties": {"Action": "lambda:invokeFunction","FunctionName": {"Fn::GetAtt": ["LF9MBL", "Arn"]},"Principal": "apigateway.amazonaws.com","SourceArn": {"Fn::Join": ["",["arn:aws:execute-api:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":", {"Ref": "AGRA16PAA"}, "/*"]]}}}}
}

最后但并非最不重要的一点是,我们必须更新以前的cloudformation堆栈。

所以我们上传了我们最新的模板

aws s3 cp cloudformationjavalambda2.template s3://cloudformation-templates/cloudformationjavalambda2.template

我们要做的就是更新堆栈。

aws cloudformation update-stack --stack-name JavaLambdaStack --template-url https://s3.amazonaws.com/cloudformation-templates/cloudformationjavalambda2.template

我们的堆栈刚刚更新。
我们可以到达我们的api网关端点并尝试发布帖子。

curl -H "Content-Type: application/json" -X POST -d '{"numerator":1,"denominator":"2"}' https://{you api gateway endpoint}/StagingStage/divide
"0.5"

您可以在github上找到源代码。

翻译自: https://www.javacodegeeks.com/2016/10/java-aws-cloud-using-lambda-api-gateway-cloudformation.html

使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java相关推荐

  1. aws lambda使用_使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java

    aws lambda使用 在上一篇文章中,我们实现了基于Java的aws lambda函数,并使用CloudFront进行了部署. 由于我们已经设置了lambda函数,因此我们将使用AWS API G ...

  2. 使用Lambda在AWS云上使用Java

    如今,Amazon Web Services越来越受欢迎. Java是AWS的一等公民,它很容易上手. 部署应用程序有些不同,但是仍然很容易和方便. AWS Lambda是一种计算服务,您可以在其中将 ...

  3. 结合 Authing 实现 AWS 云上的身份认证与授权

    身份认证与 Cognito 服务介绍 在 Web 或 App 开发过程中,用户的认证和权限处理是非常重要的一个模块,这里包括用户注册.登录认证及管理对应的权限.除了用户名密码登录外,通过第三方社交帐号 ...

  4. AWS云上部署Hadoop

    目录 一.实验目的 二.实验操作 1.创建EC2实例​编辑 2.使用putty连接实例​编辑 3.新增 Hadoop 用户.安装 Java 环境(master.slave01.slave02都需进行相 ...

  5. AWS云上基础服务体验课程

    上海-亚马逊 AWS 联合创新中心举办的 SA Immersion Day(Workshop)线上技术培训会圆满结课.此次培训主题为 AWS 云上基础服务介绍及体验,共邀请了两位 AWS 解决方案架构 ...

  6. aws创建html网页,AWS: 在AWS上创建一个网站,综合运用(Lambda + Api Gateway + Dynamodb + S3)...

    简介 本文将创建一个微型网站,以达到综合运用AWS服务的目的: 1.Dynamodb:一种完全托管的NoSQL数据库服务 2.Lambda:实现具体的业务逻辑,基于python3编写,它会调用dyna ...

  7. AWS 云上安全最佳实践

    一.账号及访问管理 1.1.多 VPC 还是多账号模式 单个团可以使用多 VPC 模式来管理和创建您的应用环境: 多个团队可以使用多账户模式来管理和隔离您的应用环境. 1.2.多账户模式,选择主 ma ...

  8. websockets_如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序

    websockets by Janitha Tennakoon 通过詹妮莎·特纳库恩 如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序 (How to ...

  9. aws lambda_AWS API Gateway和AWS Lambda示例

    aws lambda The purpose of this article is to present the most relevant details and not-so-straight s ...

最新文章

  1. 破解.NET 2.0配置之谜(一)
  2. 如何实现js调用java函数
  3. spring boot 邮件端口_不会吧,SpringBoot还能发送邮件发送邮件?快来看看如何操作吧
  4. 史上最坑的证书报错解决方法:Code=3000 未找到应用程序的“aps-environment”的权利字符串
  5. 1.EXTJS Row Editor Grid 点取消时插入的新行 的解决方法
  6. 查看linux系统是32位还是64位
  7. 【工具】Notepad++的一些常用配置
  8. Spring Boot笔记-接收RabbitMQ队列中的消息
  9. mysql view 子查询_mysql – View的SELECT包含FROM子句中的子查询
  10. ClickHouse在字节跳动推荐和广告业务部门的最佳实践
  11. linux安装 soapui_在Linux/Unix上安装开源测试工具SoapUI
  12. Unix/Linux/BSD命令大全|实用指南
  13. YOLOv5网络详解
  14. 宇枫资本工薪族理财启发
  15. ndarray数组基本结构和操作
  16. php里面substr函数,PHP substr()函数
  17. bs文件服务器,BS在线文件管理系统
  18. 微信沟通的当下,你有多久没登陆过QQ?
  19. python中delay__Python time delay
  20. IT专业人士如何高效的学习专业知识

热门文章

  1. JavaScript Function.arguments 属性详解
  2. Oracle入门(十二B)之表创建
  3. 图说:为什么Java中的字符串被定义为不可变的
  4. idea打war的问题
  5. 《朝花夕拾》金句摘抄(三)
  6. com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
  7. MyBatis中多表查询(业务代码方式)
  8. jquery官网打不开难以下载,不妨试试webjars
  9. MySQL多对多创建表语句(防忘记)
  10. android输入时背景颜色,Button根据EditText输入状态改变背景颜色