恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
使用 aws-sdk-java-v2 的 archetype-lambda 模板快速构建 AWS Lambda Java 函数项目
首页
资讯中心
/
使用 aws-sdk-java-v2 的 archetype-lambda 模板快速构建 AWS Lambda Java 函数项目
使用 aws-sdk-java-v2 的 archetype-lambda 模板快速构建 AWS Lambda Java 函数项目
发布时间:2026/9/18 6:11:13
使用 aws-sdk-java-v2 的 archetype-lambda 模板快速构建 AWS Lambda Java 函数项目【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2本文围绕 AWS SDK for Java v2 仓库中的archetype-lambdaMaven 原型Archetype讲解如何一键生成一个开箱即用的 AWS Lambda Java 函数工程它预置了按 Lambda 冷启动最佳实践优化过的依赖配置、SDK 客户端工厂DependencyFactory与 SAM 部署模板。读完本文你将掌握通过mvn archetype:generate生成工程、理解生成物中每个文件的作用、配置 SDK 服务客户端与 HTTP 客户端并通过 SAM CLI 完成本地调试与云端部署的完整闭环。一、archetype-lambda 是什么archetype-lambda是 aws-sdk-java-v2 仓库archetypes目录下提供的 Maven Archetype见 archetypes/archetype-lambda其定位在模块描述中写得很明确The AWS SDK for Java - Maven archetype for Java lambda function using AWS Java SDK 2.x即为使用 AWS Java SDK 2.x 编写 Lambda 函数的开发者提供一个可以直接mvn archetype:generate拉起的工程骨架。它解决了手工搭建 Lambda 工程时的几类重复劳动手工拼装 SDK 依赖坐标服务模块、HTTP 客户端、BOM 版本管理反复编写 SDK 客户端初始化样板代码CredentialsProvider、Region、HttpClientBuilder手工编写 SAM 的template.yaml并调优 MemorySize / Timeout 等参数遗漏 Lambda 冷启动优化如 SDK 客户端在构造器中预初始化、为 Netty 客户端引入 OpenSSL。仓库中与它配套的还有archetype-app-quickstart通用应用骨架和archetype-tools提供global.vm与serviceMapping.vm等 Velocity 模板与服务映射表见 archetype-toolsarchetype-lambda在构建时通过maven-dependency-plugin把archetype-tools中的.vm模板解包进来参与代码生成见 archetype-lambda/pom.xml。生成后的工程是什么样通过该 archetype 生成的工程是一个标准 Maven 项目包含以下内容见 archetype-resources 目录sample-project/ ├── pom.xml # 依赖与构建配置BOM、服务模块、HTTP 客户端、shade 插件 ├── template.yaml # SAM 模板Handler / Timeout / MemorySize / CodeUri ├── README.md # 生成工程自带的使用说明即本指南对应文档 └── src/ ├── main/java/package/ │ ├── App.java # Lambda Handler 入口类名由 handlerClassName 决定 │ └── DependencyFactory.java # SDK 客户端工厂 └── test/java/package/ └── AppTest.java # JUnit 5 测试占位META-INF/maven/archetype-metadata.xml见 archetype-metadata.xml定义了哪些文件被过滤生成filteredtrue即其中的${...}占位符会被替换为用户输入值哪些属性必填及默认值。例如service是必填属性httpClient默认aws-crt-client且校验正则限定只能取url-connection-client|apache-client|netty-nio-client|aws-crt-client四者之一。二、环境准备Prerequisites原文档明确要求以下四项前置条件这也是 SAM 工作流能够跑通的底线依赖用途说明Java 8编译与运行生成工程的pom.xml中maven.compiler.source/target默认配置为1.8可通过修改生成工程 pom 调整版本见 生成工程 pom.xmlApache Maven构建执行mvn archetype:generate生成工程并用mvn clean install构建AWS SAM CLI本地运行与部署sam local invoke本地测试、sam deploy --guided部署Docker本地模拟 Lambda 运行环境sam local invoke依赖 Docker 镜像模拟 Lambda 执行环境注意当前仓库中的 SAM 模板template.yaml使用的是Runtime: java25见 template.yaml运行时环境以你实际使用的 SAM CLI / 部署目标为准如与你本地的 Java 版本不匹配可自行调整 Runtime 与 Java 编译版本。三、用 Maven Archetype 生成 Lambda 工程生成工程使用标准的mvn archetype:generate命令Archetype 坐标为software.amazon.awssdk:archetype-lambda${version}处替换为你要使用的 SDK 版本当前仓库根 pom.xml 中awsjavasdk.version对应的发布版本即 SDK 2.x 的最新版本号。3.1 交互式生成交互式模式下Maven 会逐个提示你输入参数service、groupId、artifactId、region、httpClient、handlerClassName等mvn archetype:generate \ -DarchetypeGroupIdsoftware.amazon.awssdk \ -DarchetypeArtifactIdarchetype-lambda \ -DarchetypeVersion${version}3.2 批量Batch模式生成批量模式适合脚本化、CI 化地生成工程所有参数通过-D一次传齐并显式关闭交互模式mvn archetype:generate \ -DarchetypeGroupIdsoftware.amazon.awssdk \ -DarchetypeArtifactIdarchetype-lambda \ -DarchetypeVersion${version} \ -DgroupIdcom.test \ -DartifactIdsample-project \ -Dservices3 \ -DinteractiveModefalse上面的命令会生成一个com.test:sample-project工程其中 SDK 客户端是 S3 客户端services3。四、生成参数详解下表汇总了该 archetype 支持的全部参数来自 archetype-lambda/README.md 的参数表并结合 archetype-metadata.xml 中的默认值与校验规则参数名必填默认值说明service是无指定 Lambda 中要使用的 SDK 服务客户端如s3、dynamodb。仓库services目录下列出的服务模块均可选择见 services 目录groupId是无生成工程的 groupIdartifactId是无生成工程的 artifactIdregion否null不设置运行时从环境变量读取指定 SDK 客户端的 Region校验正则^\w-(\w-)\d$。不设置时代码中会改为读取AWS_REGION环境变量httpClient否aws-crt-clientSDK 客户端使用的 HTTP 客户端仅允许四个选项url-connection-client同步、apache-client同步、netty-nio-client异步、aws-crt-client异步handlerClassName否AppHandler 类名同时作为 Lambda 函数名需使用驼峰命名javaSdkVersion否与 archetype 版本相同使用的 AWS Java SDK 2.x 版本校验正则\d\.\d.\dversion否1.0-SNAPSHOT生成工程的项目版本package否${groupId}生成类的包名httpClient 四个选项如何影响生成代码service与httpClient的组合并不是简单拼字符串而是由 archetype-tools/src/main/resources/global.vm 中的 Velocity 逻辑计算得出url-connection-client→ 生成UrlConnectionHttpClient同步客户端UrlConnectionHttpClient.builder()apache-client→ 生成ApacheHttpClient同步客户端ApacheHttpClient.builder()netty-nio-client→ 生成NettyNioAsyncHttpClient异步客户端NettyNioAsyncHttpClient.builder()aws-crt-client→ 生成AwsCrtAsyncHttpClient异步客户端AwsCrtAsyncHttpClient.builder()。同时服务客户端的类名如S3Client还是S3AsyncClient也由 HTTP 客户端是否异步决定见 global.vm。服务名到类名前缀的映射则来自 serviceMapping.vm例如s3 → S3、dynamodb → DynamoDb、route53 → Route53另有dynamodbstreams映射到dynamodb模块下的DynamoDbStreams与wafregional映射到waf模块的WafRegional两个特殊处理分支。五、深入解析生成工程的源码5.1 DependencyFactorySDK 客户端工厂生成工程中的DependencyFactory集中了 SDK 客户端的全部初始化逻辑见 DependencyFactory.java。它有三个关键设计凭证提供器使用EnvironmentVariableCredentialsProviderLambda 运行环境通过环境变量注入临时凭证因此客户端不硬编码任何凭证Region 二选一若生成时指定了region参数则直接使用Region.${regionEnum}regionEnum由region.replace(-, _).toUpperCase()转换而来如us-west-2→Region.US_WEST_2若未指定则读取AWS_REGION环境变量Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))HTTP 客户端通过.httpClientBuilder(...)注入与httpClient参数联动。5.2 Handler 入口类客户端复用与预热的模板Handler 类实现RequestHandlerMapString, String, String见handlerClassName.java其模板代码本身就是一份冷启动优化示范public class App implements RequestHandlerMapString, String, String { private final S3Client s3Client; public App() { // 在构造器中初始化 SDK 客户端使其在类加载时完成创建可被后续多次调用复用 s3Client DependencyFactory.s3Client(); // 可在此处调用一个简单 API 预热身应用如 dynamodb#listTables } Override public String handleRequest(final MapString, String input, final Context context) { LambdaLogger lambdaLogger context.getLogger(); lambdaLogger.log(Start to handle request); // TODO: 使用 s3Client 调用业务 API return ; } }模板刻意将客户端创建放在构造函数中而非每次请求因为 Lambda 容器会复用冷启动时加载的类与静态资源——这是官方“优化 Lambda 启动时间”的最佳实践。注释中还提示可以在构造函数里发起一次轻量 API 调用做预热身pre-warm up。handleRequest目前仅返回空字符串并写一条日志真正的业务调用留作 TODO。Context.getLogger()返回的LambdaLogger负责向 CloudWatch Logs 输出日志。测试骨架 AppTest.java 则是一个空的 JUnit 5 占位类供你补充单元测试。六、生成工程的 pom.xml 关键配置生成工程的 pom.xml 是理解整个工程依赖策略的核心值得逐块拆解6.1 通过 BOM 统一 SDK 版本dependencyManagement dependencies dependency groupIdsoftware.amazon.awssdk/groupId artifactIdbom/artifactId version${aws.java.sdk.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement引入 bom/pom.xml 后所有software.amazon.awssdk依赖无需逐个声明版本号由 BOM 统一管理——这也是 SDK 官方推荐的版本管理方式避免不同服务模块版本漂移。6.2 服务模块依赖剔除多余 HTTP 客户端dependency groupIdsoftware.amazon.awssdk/groupId artifactId${moduleName}/artifactId exclusions exclusion groupIdsoftware.amazon.awssdk/groupId artifactIdnetty-nio-client/artifactId /exclusion exclusion groupIdsoftware.amazon.awssdk/groupId artifactIdapache-client/artifactId /exclusion /exclusions /dependencySDK 服务模块如s3默认传递依赖 netty/apache 两个 HTTP 客户端而在 Lambda 中你只会用到其中一个。archetype 生成的 pom 通过exclusions 排除未选用的两个客户端让最终 jar 更小、冷启动更快——这正是“优化配置”的体现之一。6.3 按 httpClient 参数注入专属依赖选择aws-crt-client时额外引入software.amazon.awssdk.crt:aws-crt并强制指定linux-x86_64classifierLambda 运行环境即 Linux x86_64同时排除aws-crt-client默认引入的 crt 传递依赖避免版本冲突选择netty-nio-client时额外引入io.netty:netty-tcnative-boringssl-staticnettyOpenSslVersion版本使 Netty 异步客户端在支持时使用 OpenSSL 作为 SSL Provider——这是仓库 docs/BestPractices.md 中针对 Netty 客户端的官方建议。6.4 打包与构建插件maven-shade-plugin3.6.1在package阶段打 fat jarfinalName设为${artifactId}并通过 filter 排除module-info.class以消除模块化警告——fat jar 是 SAM 部署 Lambda 的必要条件maven-compiler-plugin3.14.1编译插件Java 版本由maven.compiler.source/target控制默认 1.8pom 中有 TODO 提示按需修改aws-lambda-java-core1.4.0提供RequestHandler、Context、LambdaLogger等 Lambda Java 运行接口。七、构建与本地测试7.1 构建工程进入生成的项目目录执行mvn clean install该命令完成编译、单测当前只有空的AppTest、打 fat jar产物为target/${artifactId}.jar。7.2 使用 SAM CLI 本地调用sam local invokesam local invoke会基于项目根目录的template.yaml在本地 Docker 容器中模拟 Lambda 运行环境把本地构建产物作为函数包加载并调用一次。它是验证 Handler 逻辑、依赖打包是否完整的最快途径前置条件本机已安装 Docker 并启动。八、添加更多 SDK 服务客户端原文档给出了扩展业务面最常用的操作路径在生成工程的pom.xml中添加对应服务模块依赖如software.amazon.awssdk:dynamodb版本由 BOM 管理无需显式指定在DependencyFactory中仿照已有${serviceClientVariable}Client()的写法新增一个静态工厂方法返回新服务的客户端在 Handler 构造函数中完成新客户端的初始化然后在handleRequest中调用。例如新增 DynamoDB 客户端DependencyFactory中只需追加public static DynamoDbClient dynamoDbClient() { return DynamoDbClient.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .region(Region.US_WEST_2) // 或从 AWS_REGION 环境变量读取 .httpClientBuilder(UrlConnectionHttpClient.builder()) .build(); }提示若新增客户端使用与现有客户端相同的 Region 与 HTTP 客户端可以抽出一个私有方法复用credentialsProvider/region/httpClientBuilder三段配置避免重复样板代码。九、部署到 AWS生成工程内置了 template.yaml基于 SAMAWS::Serverless-2016-10-31默认配置如下AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: AppFunction: # 函数逻辑名由 ${handlerClassName} 决定 Type: AWS::Serverless::Function Properties: Runtime: java25 Handler: ${package}.${handlerClassName}::handleRequest Timeout: 60 MemorySize: 512 CodeUri: ./target/${artifactId}.jar # 按需在此处挂载 IAM 策略例如 #Policies: # - S3ReadPolicy: # BucketName: test-bucket各属性含义与调整要点Handler包名.类名::handleRequest即指向 Handler 类的handleRequest方法Timeout默认 60 秒按业务超时需求调整Lambda 同步调用上限依运行时而定MemorySize默认 512 MB注意内存大小同时线性影响分配的 vCPUCPU 密集型任务可适当调大CodeUri指向mvn clean install产出的 fat jarPolicies模板默认不附加任何策略若函数需要访问其他 AWS 资源如 S3、DynamoDB必须在此处添加对应 IAM 策略否则即使 SDK 客户端构建成功实际 API 调用也会因缺少权限失败。执行部署引导式会交互询问栈名、Region、确认 IAM 变更等sam deploy --guided部署完成后SAM 会输出函数端点 / ARN 等信息可在 AWS 控制台 Lambda 页面查看函数并触发测试。十、最佳实践小结结合生成模板与仓库设计使用该 archetype 落地 Lambda 时值得坚持的几点客户端生命周期SDK 客户端在线程安全的前提下应作为单例在构造函数中初始化并跨调用复用见 Handler 模板避免每次请求重建连接池精简依赖利用 BOM 管理版本并排除未选用的 HTTP 客户端依赖缩小部署包体积权限最小化template.yaml中按需附加策略只授予函数访问特定资源所需的最小权限Region 不硬编码推荐生成时不传region让客户端从AWS_REGION环境变量读取函数可随部署区域自动适配先本地后云端mvn clean install→sam local invoke→sam deploy --guided的链路可在数分钟内完成一次完整的开发验证循环。十一、相关资源archetype-lambda 模块说明生成命令与完整参数表archetype 目录archetype-app-quickstart、archetype-lambda、archetype-tools生成工程资源目录pom.xml、template.yaml、DependencyFactory.java、Handler 模板archetype-metadata.xml参数默认值与校验规则global.vmservice / httpClient 到客户端类名的映射逻辑SDK 服务模块列表service参数可选的全部服务HTTP 客户端实现四个可选 HTTP 客户端对应的源码模块docs/BestPractices.mdSDK 2.x 官方最佳实践含 Netty OpenSSL 建议【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考