使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java
在上一篇文章中,我們實現(xiàn)了基于Java的aws lambda函數(shù),并使用CloudFront進(jìn)行了部署。 由于我們已經(jīng)設(shè)置了lambda函數(shù),因此我們將使用AWS API Gateway將其與http端點集成。
Amazon API Gateway是一項完全托管的服務(wù),使開發(fā)人員可以輕松地創(chuàng)建,發(fā)布,維護(hù),監(jiān)控和保護(hù)各種規(guī)模的API。 在AWS管理控制臺中單擊幾下,您可以創(chuàng)建一個API,充當(dāng)應(yīng)用程序從后端服務(wù)訪問數(shù)據(jù),業(yè)務(wù)邏輯或功能(例如在Amazon Elastic Compute Cloud上運(yùn)行的工作負(fù)載)的“前門”。 (Amazon EC2),在AWS Lambda或任何Web應(yīng)用程序上運(yùn)行的代碼
對于此示例,將API網(wǎng)關(guān)想象為一個HTTP連接器。 我們將更改原始功能以實現(xiàn)劃分。
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上對其進(jìn)行更新。
aws s3 cp build/distributions/JavaLambdaDeployment.zip s3://lambda-functions/JavaLambdaDeployment.zip下一步是更新我們的CloudFormation模板,并將api網(wǎng)關(guān)轉(zhuǎn)發(fā)請求添加到我們的lambda函數(shù)。
首先,我們必須聲明我們的Rest API
"AGRA16PAA": {"Type": "AWS::ApiGateway::RestApi","Properties": {"Name": "CalculationApi"}}然后,我們需要添加一個休息資源。 在DependsOn元素內(nèi),我們可以看到rest api的ID。 因此,cloudwatch將在創(chuàng)建其余api后創(chuàng)建資源。
"AGR2JDQ8": {"Type": "AWS::ApiGateway::Resource","Properties": {"RestApiId": {"Ref": "AGRA16PAA"},"ParentId": {"Fn::GetAtt": ["AGRA16PAA","RootResourceId"]},"PathPart": "divide"},"DependsOn": ["AGRA16PAA"]}另一個關(guān)鍵部分是添加權(quán)限,以便能夠調(diào)用我們的lambda函數(shù)。
"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網(wǎng)關(guān)方法,以便能夠從api網(wǎng)關(guān)調(diào)用我們的lambda函數(shù)。 此外,我們將添加api網(wǎng)關(guān)部署說明。
"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 我們的堆棧剛剛更新。
我們可以到達(dá)我們的api網(wǎng)關(guān)端點并嘗試發(fā)布帖子。
您可以在github上找到源代碼。
翻譯自: https://www.javacodegeeks.com/2016/10/java-aws-cloud-using-lambda-api-gateway-cloudformation.html
總結(jié)
以上是生活随笔為你收集整理的使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长城汽车下设智能化前沿组织 打造大模型服
- 下一篇: java word批注_编写Java批注