美文网首页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