本章主要是调用Lambda函数输出 HelloWorld
- 确认默认AWS的区域: more ~/.aws/config (例子中用的 region 为 us-east-2 )
工程的目录结构
工程目录结构1. 准备3个java文件
InputModel.java
package com.serverlessbook.lambda.test;
// 简单类,可以将value定义为private类型,用get/set方法暴露
public class InputModel{
public String value;
}
OutputModel.java
package com.serverlessbook.lambda.test;
// 简单类,可以将value定义为private类型,用get/set方法暴露
public class OutputModel{
public String value;
}
Handler.java
package com.serverlessbook.lambda.test;
import com.serverlessbook.lambda.test.InputModel;
import com.serverlessbook.lambda.test.OutputModel;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
// 实现AWS lambda 接口 RequestHandler 的入口方法
public class Handler implements RequestHandler<InputModel, OutputModel> {
// 实现handleRequest方法,json格式是自动序列化成对象的,在调用的时候参数格式{"value":"xxxxx"}
@Override
public OutputModel handleRequest(InputModel input, Context context) {
// 输入的值,直接输出
OutputModel output = new OutputModel();
output.value = input.value;
return output;
}
}
2. 准备Gradle的2个文件
setting.build 文件:gradle指定子目录项目
include 'lambda-test'
build.gradle 文件
task wrapper(type: Wrapper) {
gradleVersion = '3.0'
}
// 全工程配置,子工程也生效
allprojects {
// 产品ID
group 'com.serverlessbook'
// 项目的版本号
version '1.0'
// 添加Gradle java插件
apply plugin: 'java'
// java 1.8
sourceCompatibility = 1.8
}
// 添加 maven库,jCenter,jitpack
allprojects {
repositories {
mavenCentral()
jcenter()
maven {
url "https://jitpack.io"
}
}
}
// 构建时添加 maven库,jCenter,jitpack
buildscript {
repositories {
mavenCentral()
jcenter()
maven {
url "https://jitpack.io"
}
}
// 添加依赖shadow
dependencies {
classpath "com.github.jengelman.gradle.plugins:shadow:1.2.3"
}
}
//lambda-开头的子项目,编译lambda工程
configure(subprojects.findAll { it.name.startsWith("lambda-") }) {
dependencies {
//json包和对应的aws的sdk
compile 'com.amazonaws:aws-lambda-java-core:1.1.0'
compile 'com.fasterxml.jackson.core:jackson-databind:2.6.+'
}
//添加插件shadow,编译成fat-jar
apply plugin: "com.github.johnrengelman.shadow"
build.finalizedBy shadowJar
}
3. 编译构建jar包
//构建项目
./gradlew build
构建完成,检查 lambda-test/build/libs/lambda-test-1.0-all.jar 文件是否存在。
4. 创建角色和安全策略的IAM角色
- 访问IAM控制台: https://console.aws.amazon.com/iam/home#
-
创建新角色 例如:lambda-execution-role
创建角色 -
设置权限策略
image.png - 添加标签【可选】
-
审核,添加角色名和描述
角色名和描述 -
记录角色的ARN
点击创建的角色:lambda-execution-role,可以看到ARN,这个是后面创建Lambda函数的一个参数"--role"所需要的角色的ARN。
ARN信息
5. 命令行创建lambda函数
aws lambda create-function \
--region us-east-2 \
--function-name book-test \
--runtime java8 \
--timeout 10 \
--role arn:aws:iam::083845954111:role/lambada-execution-role \
--handler com.serverlessbook.lambda.test.Handler \
--zip-file fileb://${PWD}/lambda-test/build/libs/lambda-test-1.0-all.jar
当在页面中调用函数 https://us-east-2.console.aws.amazon.com/lambda/home](https://us-east-2.console.aws.amazon.com/lambda/home)时,可能会出现 Task time out after xxx 时,需要在create-function 的时候加入参数 --timeout 10 或更大,默认3秒,最大900秒。
重复执行创建函数命令则会出现:An error occurred (ResourceConflictException) when calling the CreateFunction operation: Function already exist: book-test ; 这时候需去 https://us-east-2.console.aws.amazon.com/lambda/home?region=us-east-2#/functions 上删除lambda 函数:book-test。
6. 命令行调用Lambda函数
aws lambda invoke \
--invocation-type RequestResponse \
--region us-east-2 \
--profile serverlessbook \
--function-name book-test \
--payload '{"value":"HelloWorld"}' \
--log-type Tail /tmp/test.txt
同时执行 tail -f /tmp/test.txt , 返回{"value":"HelloWorld"}
若结果显示timeout则创建lambda函数时需要调整 time 时间
"{"errorMessage":"2020-05-31T15:06:05.231Z ea9b15cb-3026-4de5-ac5d-0aa396bcf4f1 Task timed out after 3.00 seconds","errorType":"java.lang.RuntimeException"}
一个完整的HelloWorld算完成了。
网友评论