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 自动化操作。


相关推荐
码云数智-大飞1 小时前
Nginx负载均衡四大核心算法深度解析:原理、配置与选型实战
java
tobias.b1 小时前
408真题解析-2010-37-计算机网络-子网划分与CIDR
开发语言·计算机网络·计算机考研·408真题解析
消失的旧时光-19431 小时前
第二十一课:系统是怎么一步步拆坏的?——单体到模块化实践(完整工程版)
java·spring boot·后端·架构
纯.Pure_Jin(g)1 小时前
【Python练习五】Python 正则与网络爬虫实战:专项练习(2道经典练习带你巩固基础——看完包会)
开发语言·vscode·python
hoiii1871 小时前
基于C#实现的高性能实时MP4录屏方案
开发语言·c#
JasonSJX1 小时前
海海软件正式发布全新 DRM-X官网 Next.js 重构、多语言升级与 SEO 优化,助力全球数字版权保护
开发语言·javascript·安全·重构·视频防录屏·开源drm·加密保护课程
Coder_Boy_1 小时前
Java高级_资深_架构岗 核心知识点(云原生)
java·云原生·架构
系统修复专家1 小时前
UG12.0官方未公开修复方法:彻底解决C++异常崩溃问题
开发语言·c++·安全·bug·dll·游戏报错
yongui478341 小时前
基于C#实现Modbus RTU通信
开发语言·c#