- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.
导读
本文围绕javav2/example_code/lambda/目录下的官方示例代码,系统讲解如何使用AWS SDK for Java 2.x完成 AWS Lambda 函数生命周期管理的全部核心操作:创建函数、查询函数、列举函数、同步调用、更新函数代码与配置、删除函数,并配合 JUnit 5 集成测试与config.properties配置文件的完整实践。读者学完后将具备一套可复制的 Lambda 管理实战方案——既能通过LambdaScenario主类以命令行方式串联全流程,也能通过单元测试驱动的方式验证每个 API 调用。
代码示例全景
本节对应 README 中“Code examples”一节。该目录下有两个可直接运行的 Java 类:
| 文件 | 作用 |
|---|---|
| LambdaScenario.java | 完整场景:创建 → 查询 → 列举 → 调用 → 更新代码 → 更新配置 → 删除 |
| GetAccountSettings.java | 单操作示例:读取账户级 Lambda 限额(如代码总大小上限) |
按官方 README 的分类,示例分为三层:
- Hello Lambda(入门):通过 listFunctions 方法(
ListFunctions)快速体验 SDK 与 Lambda 服务的连通性,展示如何列出当前账户的所有函数。 - Learn the basics(基础场景):即 LambdaScenario.java 整体,涵盖一个函数从创建到清理的完整生命周期。
- Single actions(单操作):README 明确列出 6 个独立 API 调用及其源码位置:
| 操作 | 方法 | 源码位置 |
|---|---|---|
| CreateFunction | createLambdaFunction | LambdaScenario.java#L156-L193 |
| DeleteFunction | deleteLambdaFunction | LambdaScenario.java#L347-L360 |
| GetFunction | getFunction | LambdaScenario.java#L203-L216 |
| Invoke | invokeFunction | LambdaScenario.java#L249-L271 |
| UpdateFunctionCode | updateFunctionCode | LambdaScenario.java#L284-L308 |
| UpdateFunctionConfiguration | updateFunctionConfiguration | LambdaScenario.java#L321-L335 |
补充说明:仓库中的 metadata.yaml 还登记了
CreateFunction.java、DeleteFunction.java、LambdaInvoke.java、ListLambdaFunctions.java等独立单文件示例,说明该目录在设计上兼顾“整段场景”与“可独立复用的单操作片段”两种形态,读者可按需抽取。
环境准备与前提条件
运行时要求
官方 javav2 顶层 README 对运行全部 Java v2 示例提出如下要求:
- 本地能够访问本仓库(clone、fork 或下载 zip 均可);
- 安装Apache Maven(>3.0);
- 所有 Java v2 示例假定 SDK 通过默认凭证链(default credentials provider chain)获取 AWS 凭证,具体配置方式:
- 在共享 AWS 配置文件
~/.aws/config中设置 IAM Identity Center SSO; - 或在
~/.aws/credentials中设置临时凭证;
- 在共享 AWS 配置文件
- 配置默认 Region:若未显式设置,SDK 默认使用us-east-1。
GetAccountSettings.java即显式使用Region.US_EAST_1构建客户端。
LambdaScenario.java的类注释进一步说明:运行前请确认开发环境与凭证就绪,并参考 SDK for Java 2.x 快速入门。
项目依赖(pom.xml)
lambda/pom.xml 展示了本示例的完整依赖配置,核心要点:
- SDK BOM 管理:通过
software.amazon.awssdk:bom:2.35.10(type=pom、scope=import)统一管理各 AWS SDK 模块版本,业务代码只需声明模块名:software.amazon.awssdk:lambda——Lambda 服务客户端;software.amazon.awssdk:secretsmanager——测试时从 Secrets Manager 读取配置;software.amazon.awssdk:sso与ssooidc——支持 SSO 凭证链;
- JSON 处理:
org.json:json:20231013(场景中构造调用负载)与com.google.code.gson:gson:2.10.1(测试中反序列化 Secrets Manager 返回); - 测试框架:
org.junit.jupiter:junit-jupiter:5.11.4(scope=test); - 日志:
log4j-bom:2.23.1配合log4j-core、log4j-slf4j2-impl、log4j-1.2-api与slf4j-api:2.0.13; - 编译目标:Java 21(
<java.version>21</java.version>、maven.compiler.source/target=21); - 构建插件:
maven-compiler-plugin:3.1与maven-surefire-plugin:3.5.2。
注意:场景中创建函数使用的运行时是Runtime.JAVA17(见源码),而本机编译目标是 Java 21,两者并无冲突——Java 17 运行时指 Lambda 侧的执行环境,Java 21 是本项目 Maven 编译版本。
安全与成本提醒(⚠ Important)
README 明确提醒,运行这些示例可能产生 AWS 账户费用:
- 运行代码或测试都可能产生费用,详见 AWS Pricing 与 Free Tier;
- 建议遵循最小权限原则(least privilege),仅授予完成任务所需的最低权限;
- 示例并非在全部 AWS 区域经过测试,请注意 AWS Regional Services 的区域服务可用性。
命令行运行完整场景(Learn the basics)
LambdaScenario是本文的核心可执行程序,采用 Maven 构建后通过java -cp直接运行。按 javav2 顶层 README 的说明,先进入示例目录执行mvn package,产物 jar(含依赖的 uber JAR)会出现在target目录。
命令行参数
从 main 方法的 usage 文本 可提取完整参数列表,程序要求恰好 5 个参数,否则打印用法并退出:
java -cp target/AWSLambdav2-1.0.jar com.example.lambda.scenario.LambdaScenario \ <functionName> <role> <handler> <bucketName> <key>| 参数 | 含义 | 示例值 |
|---|---|---|
functionName | 要创建的 Lambda 函数名称 | HelloFunction |
role | 具有 Lambda 执行权限的 IAM 服务角色 ARN | arn:aws:iam::123456789012:role/lambda-exec |
handler | 处理器的完全限定方法名 | example.Handler::handleRequest |
bucketName | 存放 .zip/.jar 函数代码的 S3 桶名 | my-code-bucket |
key | 该 .zip/.jar 在 S3 中的对象键 | LambdaHello-1.0-SNAPSHOT.jar |
场景执行的 7 个步骤
结合 LambdaScenario.java 的 main 流程,程序依次输出带----分隔线的进度日志:
- 创建函数:
createLambdaFunction,打印返回的函数 ARN; - 获取函数:
getFunction,打印函数运行时(runtime); - 列举函数:
listFunctions,打印账户下所有函数名; - 同步调用:
invokeFunction,先 Sleep 1 分钟等待函数就绪,再调用并打印返回负载; - 更新代码并再次调用:
updateFunctionCode,再次Sleep 1 分钟后重新调用; - 更新配置:
updateFunctionConfiguration,修改 handler 与 runtime; - 删除函数:
deleteLambdaFunction,清理资源。
源码级原理:每个 API 调用如何工作
① 创建函数(CreateFunction)——createLambdaFunction:
- 使用
FunctionCode.builder().s3Key(key).s3Bucket(bucketName)指定代码源(也可用ZipFile直接内联 zip 字节); - 构建
CreateFunctionRequest,关键字段:functionName:函数名;description:示例固定为"Created by the Lambda Java API";code:S3 中的函数代码;handler:入口方法;runtime:Runtime.JAVA17;role:IAM 角色 ARN。
- 调用后通过LambdaWaiter轮询:
waiter.waitUntilFunctionExists(...)确保函数进入 Active 状态再返回,返回值为functionArn()。
② 获取函数(GetFunction)——getFunction:仅携带functionName构造GetFunctionRequest,从响应response.configuration().runtime()打印运行时信息,验证函数已正确创建。
③ 列举函数(ListFunctions)——listFunctions:调用无参awsLambda.listFunctions(),遍历functionResult.functions()中每个FunctionConfiguration,打印config.functionName()。注意默认分页(每页 50 个),生产环境如需全量可配合分页器(ListFunctionsPaginator)使用。
④ 同步调用(Invoke)——invokeFunction:
- 负载构造:用
JSONObject写入{"inputValue":"2000"},再经SdkBytes.fromUtf8String(json)转为SdkBytes——这是 SDK for Java 2.x 中 API 调用负载的标准封装方式; InvokeRequest.builder().functionName(...).payload(payload)默认即同步(RequestResponse)调用;- 结果通过
res.payload().asUtf8String()读取函数返回的 JSON 字符串并打印。如需异步调用可设置invocationType(InvocationType.EVENT)。
⑤ 更新代码(UpdateFunctionCode)——updateFunctionCode:
- 关键参数
publish(true):表示立即发布一个新版本(对应控制台中的“Publish new version”); s3Bucket/s3Key指向新代码;- 同样使用 waiter:
waitUntilFunctionUpdated(getFunctionConfigRequest)等待更新完成; - 打印
response.lastModified()确认代码变更生效。
⑥ 更新配置(UpdateFunctionConfiguration)——updateFunctionConfiguration:通过UpdateFunctionConfigurationRequest更新handler与runtime,此处演示了不改代码、仅改运行配置(如入口方法、内存、超时、环境变量)的典型场景。README 中“configure with an environment variable”的要求即对应此类配置更新操作。
⑦ 删除函数(DeleteFunction)——deleteLambdaFunction:仅需functionName构造请求并调用deleteFunction,删除后打印确认信息。
所有方法统一捕获LambdaException,出错时打印错误消息并以System.exit(1)退出,保证失败可见。
运行 JUnit 5 集成测试
测试入口与覆盖范围
LambdaTest.java 是官方提供的 JUnit 5 集成测试,按 javav2 顶层 README 的说明可用mvn test在命令行运行。测试使用@Order注解保证顺序执行:
- Test 1
testGetAccountSettings:调用 GetAccountSettings.getSettings,通过getAccountSettings()读取账户限额(accountLimit().totalCodeSize(),即账户代码总大小字节数),断言不抛异常; - Test 2
testLambdaScenario:完整复刻场景流程——createLambdaFunction并断言返回的 ARN 非空;getFunction;listFunctions;- 等待 5 分钟后
invokeFunction; updateFunctionCode;- 再次等待 5 分钟后
invokeFunction; deleteLambdaFunction清理。
代码注释明确指出:运行这些集成测试必须先在config.properties或 AWS Secrets Manager 中设置所需值。测试通过getSecretValues()从 Secrets Manager 读取名为test/lambda的 secret(Region 固定US_EAST_1),再用 Gson 反序列化为SecretValues对象;测试会为functionNameSc/functionName附加UUID.randomUUID()后缀避免命名冲突。
⚠ 运行测试同样会操作真实 AWS 资源并可能产生账户费用,且测试内置了长达 5 分钟的等待,整体耗时较长,请评估后再执行。
config.properties 配置项详解
仓库中实际存在 config.properties 模板(位于src/main/resources),各字段初始值均为<Enter value>,与 README“Tests”一节列出的键一一对应:
| 键 | 含义 | 示例值 |
|---|---|---|
functionNameSc | 供LambdaScenario测试使用的新函数名 | myLambdaSc |
functionName | 供其他测试使用的新函数名 | myLambda |
bucketName | 存放用于更新函数代码的 .zip/.jar 的 S3 桶名 | my-code-bucket |
key | 该 .zip/.jar 的 S3 对象键 | LambdaHello-1.0-SNAPSHOT.jar |
filePath | .zip/.jar 在本地文件系统中的路径 | /path/to/LambdaHello-1.0-SNAPSHOT.jar |
role | 具有 Lambda 权限的角色 ARN | arn:aws:iam::123456789012:role/lambda-exec |
handler | 完全限定的方法名 | example.Handler::handleRequest |
README 特别强调:如果未完整定义这些值,JUnit 测试将失败;其中CreateFunction与LambdaScenario测试需要 .zip 或 .jar 形式的函数代码。
常用排错与后续资源
常见问题排查
- 找不到
config.properties中的值:测试启动会从 Secrets Manager 读取test/lambdasecret;若尚未创建该 secret,可将配置直接写入 config.properties(按 LambdaTest.java 的注释,两种方式任选其一); - 函数创建后立即调用失败:Lambda 函数从创建/更新到完全就绪需要时间,示例代码通过显式
Thread.sleep(60000)(场景主类)或TimeUnit.MINUTES.sleep(5)(测试类)等待,并配合 waiter 轮询。实际生产中建议以 waiter + 指数退避代替固定睡眠; - 没有 .zip/.jar 函数代码:README 指出可参考仓库中 creating_workflows_stepfunctions 用例目录(该目录为 AWS Step Functions + Lambda 工作流教程,内含配套的 Lambda 函数构建产物与 Maven 工程 pom.xml),自行构建出可上传的 jar 后再运行本示例。
官方参考文档
- Lambda Developer Guide
- Lambda API Reference
- SDK for Java 2.x Lambda reference
总结
javav2/example_code/lambda目录为 SDK for Java 2.x 用户提供了一条从“单 API 调用”到“完整生命周期场景”再到“JUnit 集成测试”的完整学习路径。掌握LambdaScenario中的 6 个核心方法与LambdaWaiter的配合用法后,你就能在自己的项目中以同样的模式实现无服务器函数的自动化部署、更新与清理——这也是在 AWS 上构建 Java 无服务器应用最常用的一套基础能力。
- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.
相关推荐
使用 AWS SDK for Java 2.x 管理 Amazon EC2:代码示例与实战场景详解
使用 AWS SDK for Java 2.x 管理 Amazon EC2:代码示例与实战场景详解 本指南基于 aws doc sdk examples 仓库中
示例工程教程后端免费大语言模型API零成本接入终极指南:学生与独立开发者的第一份AI接口地图
免费大语言模型API零成本接入终极指南:学生与独立开发者的第一份AI接口地图 毕设想做个AI聊天机器人,一看付费接口的账单立刻被劝退;脑子里有个AI小创意想快速
示例工程教程后端如何快速掌握res-downloader:新手的完整网络资源下载指南
如何快速掌握res downloader:新手的完整网络资源下载指南 你是否曾为无法下载喜欢的视频内容而烦恼?当你看到精彩的视频号内容、抖音创意或快手短剧时,想
示例工程教程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考