Java 开发AWS Lambda 实战指南(SAM CLI + IntelliJ)

Java 开发 AWS Lambda 实战指南(使用 SAM CLI 与 IntelliJ)

目录

  1. 环境准备

  2. 创建 Java Lambda 项目

  3. 本地构建与运行

  4. 在 IntelliJ 中调试 Lambda

  5. 使用 SAM CLI 部署 Lambda

  6. 自动化部署脚本(可选)


1️⃣ 环境准备

1.1 软件环境: 在开始之前,需要确保以下工具已经安装并配置好:

工具 说明
Java JDK 建议使用 LTS 版本,例如 Java 17。安装后需配置 JAVA_HOMEPATH
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

  1. 安装 AWS Toolkit 插件。

  2. 打开项目后,配置 Run/Debug Configurations

    • 类型选择 AWS SAM Local

    • 指定 Handler 类(例如:com.example.lambda.App::handleRequest)。

    • 配置测试事件 JSON。

  3. 点击 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 自动化操作。


相关推荐
名字还没想好☜6 分钟前
Go 的 select 实战:超时、非阻塞收发与优雅退出的三个套路
开发语言·数据库·golang·go·并发
geovindu7 分钟前
java: Backtracking Algorithm
java·开发语言·windows·后端·算法·回溯算法
NWU_LK11 分钟前
【WebFlux】第六篇 —— 全链路响应式与数据库交互
java·数据库
一只小菜鸡..13 分钟前
南京大学 操作系统 (JYY) 学习笔记:Hello, OS World! (程序的机器视角)
java·笔记·学习
叶总没有会19 分钟前
3.2 构建AI智能体项目扩展知识
java·数据库·人工智能·spring·ai
Lakers-2420 分钟前
1987年6月10日晚上23-24点出生性格、运势和命运
java
唐青枫22 分钟前
Java Jetty 实战详解:从嵌入式 HTTP 服务到 Spring Boot 容器替换
java
Scott9999HH9 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔9 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社10 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言