美文网首页AWS Serverless 学习
AWS Lambda笔记--HelloWorld-3

AWS Lambda笔记--HelloWorld-3

作者: lazy_zhu | 来源:发表于2020-06-01 01:10 被阅读0次

本章主要是调用Lambda函数输出 HelloWorld

  1. 确认默认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角色

  1. 访问IAM控制台: https://console.aws.amazon.com/iam/home#
  2. 创建新角色 例如:lambda-execution-role


    创建角色
  3. 设置权限策略


    image.png
  4. 添加标签【可选】
  5. 审核,添加角色名和描述


    角色名和描述
  6. 记录角色的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算完成了。

相关文章

网友评论

    本文标题:AWS Lambda笔记--HelloWorld-3

    本文链接:https://www.haomeiwen.com/subject/dizrzhtx.html