Java 开发 AWS Lambda 实战指南(使用 SAM CLI 与 IntelliJ)
目录
-
环境准备
-
创建 Java Lambda 项目
-
本地构建与运行
-
在 IntelliJ 中调试 Lambda
-
使用 SAM CLI 部署 Lambda
-
自动化部署脚本(可选)
1️⃣ 环境准备
1.1 软件环境: 在开始之前,需要确保以下工具已经安装并配置好:
| 工具 | 说明 |
|---|---|
| Java JDK | 建议使用 LTS 版本,例如 Java 17。安装后需配置 JAVA_HOME 和 PATH。 |
| Maven | 用于管理依赖和构建项目。 |
| AWS CLI | 配置 AWS 账户和默认区域。 |
| SAM CLI | AWS Serverless Application Model CLI,用于构建、运行和部署 Lambda。 |
| IntelliJ IDEA | Java 开发 IDE,建议安装 AWS Toolkit 插件以便调试 Lambda。 |
示例验证命令:
java -version
mvn -v
aws --version
sam --version
bash
java -version
java version "21.0.10" 2026-01-20 LTS
Java(TM) SE Runtime Environment (build 21.0.10+8-LTS-217)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.10+8-LTS-217, mixed mode, sharing)
mvn -v
Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1)
Maven home: D:\apache-maven-3.9.12
Java version: 21.0.10, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-21.0.10
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"
aws --version
aws-cli/2.33.16 Python/3.13.11 Windows/11 exe/AMD64
sam --version
SAM CLI, version 1.153.1
1.2 IDEA SAM配置

2️⃣ 创建 Java Lambda 项目
2.1 使用 Maven 创建项目:推荐使用IDEA创建
mvn archetype:generate ^
-DgroupId=com.example.lambda ^
-DartifactId=my-lambda-project ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-DinteractiveMode=false
使用IDEA创建(确保安装插件AWS Toolkit)

设置JDK版本,SAM模板

2.2 目录结构示例:
my-lambda-project/
├─ src/main/java/com/example/lambda/App.java
├─ pom.xml
├─ template.yaml # SAM 模板
2.3 函数请求处理器 App.java(Lambda Handler):相当于SpringBoot的接口
java
package com.example.lambda;
import java.util.HashMap;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
/**
* AWS Lambda handler for API Gateway.
* Receives HTTP request and returns JSON response.
*/
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
/**
* Lambda handler method.
*
* @param request The API Gateway HTTP request
* @param context Lambda execution context
* @return API Gateway HTTP response
*/
@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) {
// Create response object
APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
// Log the request body
context.getLogger().log("Received request: " + request.getBody());
// Prepare JSON response
Map<String, String> responseBody = new HashMap<>();
responseBody.put("message", "Hello from Lambda!");
responseBody.put("input", request.getBody() != null ? request.getBody() : "no input");
// Set HTTP headers
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
// Configure response
response.setStatusCode(200); // HTTP 200 OK
response.setHeaders(headers); // Set headers
response.setBody(responseBody.toString()); // Convert Map to string (for demo)
// Log response
context.getLogger().log("Response: " + response.getBody());
return response;
}
}
2.4 pom.xml(Maven 项目依赖)
XML
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.lambda</groupId>
<artifactId>my-lambda-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>my-lambda-project</name>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!-- AWS Lambda Java Core -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- AWS Lambda Java Events (for API Gateway event classes) -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>3.11.0</version>
</dependency>
<!-- Optional: Jackson for JSON handling -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<!-- Maven Shade Plugin: package all dependencies into one jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.lambda.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.5 SAM 模板示例 (template.yaml)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Lambda Java example
Resources:
MyLambdaFunction:
Type: AWS::Serverless::Function
Properties:
Handler: com.example.lambda.App::handleRequest
Runtime: java17
CodeUri: target/my-lambda-project-1.0-SNAPSHOT.jar
MemorySize: 512
Timeout: 30
Policies:
- AWSLambdaBasicExecutionRole
Outputs:
LambdaFunctionName:
Description: Name of the Lambda function
Value: !Ref MyLambdaFunction
LambdaFunctionArn:
Description: ARN of the Lambda function
Value: !GetAtt MyLambdaFunction.Arn
3️⃣ 本地构建与运行
Maven 构建项目
mvn clean package
SAM 本地构建
sam build
SAM 本地测试 Lambda
sam local invoke MyLambdaFunction -e event.json
-
event.json为测试事件,例如:{
"message": "Hello, SAM Lambda!"
}
4️⃣ 在 IntelliJ 中调试 Lambda
-
安装 AWS Toolkit 插件。
-
打开项目后,配置 Run/Debug Configurations:
-
类型选择 AWS SAM Local。
-
指定 Handler 类(例如:
com.example.lambda.App::handleRequest)。 -
配置测试事件 JSON。
-
-
点击 Debug 按钮,即可在本地调试 Lambda 函数。
5️⃣ 使用 SAM CLI 部署 Lambda
交互式部署(第一次运行)
sam deploy --guided
会提示输入:
-
Stack Name
-
AWS Region
-
确认变更集(Confirm changeset)
-
IAM 权限创建
-
是否禁用回滚
-
S3 Bucket(上传 Lambda 代码)
-
保存参数到
samconfig.toml
非交互式自动部署(后续部署)
sam deploy ^
--no-confirm-changeset ^
--disable-rollback ^
--capabilities CAPABILITY_IAM
SAM 会自动读取
samconfig.toml中保存的配置。
6️⃣ 自动化部署脚本(Windows .bat 示例)
将本地构建、SAM 构建和部署整合到一个脚本:
@echo off
REM ===================================================
REM Build and deploy AWS SAM Lambda (IoT Lambda)
REM ===================================================
cd /d D:\project\java\aws-lambda-iot-core
echo.
echo [1/3] Maven clean package...
call mvn clean package
if errorlevel 1 (
echo Maven build failed.
exit /b 1
)
echo.
echo [2/3] SAM build...
call sam build
if errorlevel 1 (
echo SAM build failed.
exit /b 1
)
echo.
echo [3/3] Deploying AWS Lambda using SAM...
sam deploy ^
--no-confirm-changeset ^
--disable-rollback ^
--capabilities CAPABILITY_IAM ^
--region ap-northeast-1
if errorlevel 1 (
echo SAM deployment failed.
exit /b 1
)
echo.
echo Deployment finished successfully!
pause
使用方法:
-
保存为
deploy.bat -
双击运行即可完成构建 + 部署全过程。
🔹 总结
-
使用 Maven 管理 Java 项目,使用 SAM CLI 构建和部署 Lambda。
-
第一次部署可用
--guided,后续可通过samconfig.toml实现自动化。 -
可以在 IntelliJ 本地调试 Lambda,提升开发效率。
-
使用
.bat脚本可一键完成构建、打包和部署,适合 Windows 11 自动化操作。