使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java

在上一篇文章中,我们实现了基于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 索引字典,oracle数据字典、索引、序列

*************************数据字典*******************************普通的表 是用来存放 应用程序 需要的数据的student表 是存放学生信息的category 表 是存放 商品种类信息的oracle 也是一个应用程序, oracle这个系统级应用程序本身也需要存放一些数据,这些数据存到哪张表中…

从内核文件系统看文件读写过程

阅读目录 系统调用虚拟文件系统I/O 缓冲区Page CacheAddress Space文件读写基本流程 回到顶部系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境&#xff0c;但是计算机系统的各种硬件资源是有限的&#xff0c;因此为了保证每一个进程都能安全的…

打印沙漏

7-1打印沙漏 &#xff08;20 分&#xff09; 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相…

oracle数据库读取工具,用Oracle导入导出工具实现Oracle数据库移植

用Oracle导入导出工具实现Oracle数据库移植.很不错的方法,建议使用![more]用Oracle导入导出工具实现Oracle数据库移植Oracle数据库作为目前市场的主流数据库之一&#xff0c;许多应用都在其上进行开发&#xff0c;由于Oracle数据库更新换代的原因和不同的应用程序提供商&#x…

遥感影像语义理解

面向高分辨率遥感影像场景语义理解的概率主题模型研究&#xff1a;http://www.lmars.whu.edu.cn/index.php/xwzx/2320.html 基于自适应深度稀疏语义建模的高分辨率遥感影像场景分类&#xff1a;链接 为了挖掘高分辨率遥感场景更具区分性的语义信息&#xff0c;提出了一种将稀疏…

性能优化CPU、内存、磁盘I/O、网络性能相关命令

系统优化是一项复杂、繁琐、长期的工作&#xff0c;优化前需要监测、采集、测试、评估&#xff0c;优化后也需要测试、采集、评估、监测&#xff0c;而且是一个长期和持续的过程&#xff0c;不 是说现在优化了&#xff0c;测试了&#xff0c;以后就可以一劳永逸了&#xff0c;也…

java word批注_编写Java批注

java word批注Java 批注的允许的属性类型刻意非常严格&#xff0c;但是允许的类型也可以使用一些简洁的复合批注类型。 考虑教程站点中的示例注释&#xff1a; package annotation; interface ClassPreamble {String author();String[] reviewers(); }在这里&#xff0c;作者和…

oracle报错ora-00200,oracle 11gR2 rac 创建database报ORA-00200错误

oracle 11gR2 rac创建数据库时,报ORA-00200错误,提示权限不够NOTE: MARK has subscribedNOTE: Loaded library: SystemSUCCESS: diskgroup TESTDG was mountedErrors in file /u01/app/oracle/diag/rdbms/racdb/racdb1/trace/racdb1_ora_16324.trc:ORA-27091: unable to queue …

SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

摘要 ROS机器人操作系统在机器人应用领域很流行&#xff0c;依托代码开源和模块间协作等特性&#xff0c;给机器人开发者带来了很大的方便。我们的机器人“miiboo”中的大部分程序也采用ROS进行开发&#xff0c;所以本文就重点对ROS…

oracle ojvm generic,Oracle OJVM安全补丁

什么是OJVM PSU&#xff1f;CPU: Critical Patch UpdateOracle对于其产品每个季度发行一次的安全补丁包&#xff0c;通常是为了修复产品中的安全隐患。PSU: Patch Set UpdatesOracle对于其产品每个季度发行一次的补丁包&#xff0c;包含了bug的修复。Oracle选取被用户下载数量多…

小规模流处理kata。 第1部分:线程池

我再次为我的公司在GeeCON 2016上举办了编程竞赛。 这次分配需要设计并根据以下要求选择实施系统&#xff1a; 一个系统每秒传送约一千个事件。 每个Event至少具有两个属性&#xff1a; clientId –我们期望一个客户端每秒最多可以处理几个事件 UUID –全球唯一 消耗一个事…

VC++ MSDN中的 _beginthreadex与_endthreadex 的使用例子

1._beginthread, _beginthreadex .用于创建线程[cpp] view plaincopy uintptr_t _beginthread( void( *start_address )( void * ), unsigned stack_size, void *arglist ); uintptr_t _beginthreadex( //推荐使用 void *security, //安全属性&#…

「澳洋主数据项目」主数据促企业变革

part 1 企业简介&#xff1a; 澳洋集团是一家跨地区、多元化的民营企业集团&#xff0c;总部位于全国百强县市前三甲的江苏省张家港市。集团成立于1998年7月&#xff0c;2007年经国家工商总局核准&#xff0c;升格为免冠行政区划的大型集团企业。集团现有37家下属子&#xff08…

linux bin目录误删,Linux下误删 /user/bin目录后的补救

当危险的动作发生&#xff0c; 误删 /user/bin目录后的补救以下是昨天晚上真实的误操作现场&#xff0c;模拟记录一下(这是测试环境&#xff0c;所以操作得很随意&#xff0c;有些执行动作很不规范)在上面编译一个软件Dboop&#xff0c;完事以后想把它做个软链到 /usr/binsudo …

使用JFlex生成词法分析器 1:安装配置

环境&#xff1a;Windows 10 STEP 1&#xff1a; 下载 JFlex 文件&#xff0c;我选择的是 jflex-1.7.0.zip。下载完成后解压到想安装的位置。 文件结构如下&#xff08;假设解压目录为 C:\&#xff09;&#xff1a; C:\jflex-1.7.0\ --bin\ (start scri…

问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。

简单分析如下&#xff1a; 考虑vector每次内存扩充两倍的情况。 如果我们插入N个元素&#xff0c; 则会引发lgN次的内存扩充&#xff0c;而每次扩充引起的元素拷贝次数为 2^0, 2^1, 2^2, ..., 2^lgN. 把所有的拷贝次数相加得到 2^0 2^1 2^2 ... 2^lgN 2 * 2^lgN - 1 约为…

linux superblock 时间,Linux命令(八)

1、文件系统:windows的FAT&#xff0c;win2000以后的NTFS文件系统&#xff0c;Linux的正规文件系统为EXT2(Linux second extended file system&#xff0c;Ext2fs)传统方式中&#xff0c;一个分区只能格式化为一个分区。由于新技术的利用&#xff0c;一个分区可以格式化为多个文…

在Amazon Elastic Beanstalk上部署Spring Boot应用程序

在此博客中&#xff0c;我们将看到如何在Amazon ElasticBeanstalk上部署Spring Boot应用程序。 Amazon ElasticBeanstalk具有一个预配置的Java环境&#xff0c;可用于部署内部装有servlet容器的Spring Boot JAR。 对于我们的示例&#xff0c;此处将使用maven作为构建工具。 …

Linux上静态库和动态库的编译和使用

linux上静态库和动态库的编译和使用&#xff08;附外部符号错误浅谈&#xff09; 这就是静态库和动态库的显著区别&#xff0c;静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中&#xff0c;而动态库则是运行期间动态调用&#xff0c;只有运行时找不到对应动…

Linux Socket API Connect 函数详解

在讲解套接字编程函数之前&#xff0c;有必要对socket编程的两个不可或缺的结构体进行说明。 第一个结构体式struct sockaddr.。这个结构为许多类型的套接字储存套接字地址信息&#xff1a; Sockaddr结构体介绍 #include<sys/socket.h> struct sockaddr { …