资讯动态

在 VPC 中通过 AWS SDK for Java v2 构建访问 Neptune 图数据的 Lambda 函数

发布时间:2026/9/26 10:55:57 来源:尧图企业网站定制
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome 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.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本指南以aws-doc-sdk-examples仓库中的 creating_neptune_lambda 用例为骨架完整讲解如何用 AWS SDK for Java v2 编写并部署一个在 VPC 内查询 Amazon Neptune 图数据库的 AWS Lambda 函数。由于 Neptune 是部署在 VPC 内的全托管图数据库任何访问它的 Lambda 函数都必须运行在同一 VPC 中并具备正确的网络与 IAM 权限——读完本文你将掌握 Neptune Data API 的调用方式、Lambda 执行角色的搭建、VPC 子网与安全组配置、shaded JAR 打包以及 CLI 部署与排障的完整实战链路。方案背景为什么 Lambda 必须住在VPC 里Amazon Neptune 是 AWS 的全托管图数据库服务天然设计为在 Virtual Private CloudVPC内部运行不对外提供公共访问端点。因此需要访问 Neptune 的任何 Lambda 函数都必须满足两个硬性条件网络层面Lambda 必须配置在同一个 VPC 内指定与该 Neptune 集群关联的子网与安全组由 ENI弹性网络接口接入 VPC 网络权限层面Lambda 执行角色需要被授予对 Neptune 数据平面Data API以及配套资源CloudWatch Logs 等的 IAM 权限。这一约束在仓库的参考实现中也有明确印证在 NeptuneGremlinQueryExample.java 的类注释中作者明确写道 Neptune 必须从同一 VPC 内的 Lambda、EC2 实例、ECS 任务或通过 VPN / Direct Connect / VPC Peering 连接的环境中访问无公共端点。而 GremlinProfileQueryExample.java 也给出了相同的 VPC 网络约束说明。本用例选择的访问方式是通过Neptune Data API即neptunedata服务走 HTTPS 8182 端口执行 Gremlin 查询而不是用 Gremlin WebSocket 驱动这使得 Java 侧的集成更加轻量、直接。前置条件动手前请确认具备以下环境与资源一个位于 VPC 内的 Amazon Neptune DB 实例可通过运行 AWS Code Library 中的 Neptune Basics 场景快速创建对应仓库中的 NeptuneScenario.java一个允许流量从 Lambda 到达 Neptune 的安全组典型端口为8182具备相应凭证的 AWS 账户配置了 Lambda、IAM、EC2(VPC)、S3、Neptune 权限的 AWS CLI一个 Java IDE本教程使用 IntelliJJava 21 JDKLambda 运行时java21Maven 3.6 或更高版本。注意事项本用例涉及的 AWS 服务属于 AWS Free Tier 涵盖范围但并非所有区域都可用且运行会产生 AWS 账户费用教程结束后务必删除创建的全部资源以免持续计费本代码未经全部 AWS 区域验证请确认目标区域已提供 Neptune 服务。设置 Amazon Neptune 集群与 VPCAmazon Neptune 要求 VPC 内至少包含两个位于不同可用区AZ的子网以保证高可用与容错能力。如果你不确定该使用哪个 VPC 或哪些子网可以运行 AWS Code Library 中的 Amazon Neptune Basics 场景一键生成所需资源它会为你自动完成一个包含多 AZ 子网的合适 VPC一个 Neptune DB 集群与实例全部必要的网络与安全配置。这个场景的底层实现就在仓库的 NeptuneActions.java 中createSubnetGroupAsync方法会先通过 EC2 客户端获取默认 VPC 的 IDgetDefaultVpcId()再列出该 VPC 下的子网 IDgetSubnetIds(vpcId)最后调用createDBSubnetGroup创建 Neptune 专用的 DB 子网组。运行场景后你可以从输出中拿到 VPC ID、子网 ID、安全组 ID 以及 Neptune 集群端点——这些值正是后续部署 Lambda 时--vpc-config参数和代码中NEPTUNE_ENDPOINT的来源。向数据库添加数据Neptune 集群就绪后需要先加载数据供 Lambda 函数查询。Neptune 支持多种数据加载方式从 Amazon S3 批量加载、Gremlin 与 SPARQL 查询、以及与 AWS Database Migration Service 集成等。推荐使用 Neptune bulk loader导入 S3 中存储的 CSV、RDF 或 Turtle 格式数据。本用例中 Lambda 执行的 Gremlin 查询为g.V().hasLabel(person).values(name)因此数据集中需要存在带person标签的顶点及其name属性才能查询到结果。创建 Lambda 执行 IAM 角色Lambda 调用 Neptune Data API 需要经过 IAM 鉴权因此第一步是创建一个可供 Lambda 服务代入assume的执行角色。编写信任策略 JSON 文件新建文件trust-policy-lambda.json内容允许lambda.amazonaws.com服务担任该角色{ Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { Service: lambda.amazonaws.com }, Action: sts:AssumeRole } ] }创建 lambda-execution-role 角色使用 AWS CLI 创建名为lambda-execution-role的 IAM 角色aws iam create-role \ --role-name lambda-execution-role \ --assume-role-policy-document file://trust-policy-lambda.json附加所需托管策略依次执行以下 CLI 命令为执行角色附加托管策略aws iam attach-role-policy \ --role-name lambda-execution-role \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess aws iam attach-role-policy \ --role-name lambda-execution-role \ --policy-arn arn:aws:iam::aws:policy/AWSNeptuneFullAccess aws iam attach-role-policy \ --role-name lambda-execution-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole aws iam attach-role-policy \ --role-name lambda-execution-role \ --policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess各策略的职责如下策略作用AmazonS3ReadOnlyAccess允许 Lambda 读取 S3若后续从 S3 取数据或对象AWSNeptuneFullAccess授予对 Neptune 集群及数据平面的完整访问权限是执行 Gremlin 查询的关键AWSLambdaVPCAccessExecutionRole允许 Lambda 创建并管理 ENI 以接入 VPC是 VPC 部署的必需策略CloudWatchLogsFullAccess允许 Lambda 将日志写入 CloudWatch Logs供后续排障角色创建完成后在部署阶段通过--role arn:aws:iam::123456789012:role/lambda-execution-role指定请替换为你的实际账户 ID。创建 IntelliJ 项目在 IntelliJ 中选择File → New → Project在New Project对话框中选择Maven点击NextGroupId填写org.exampleArtifactId填写NeptuneLambda点击Next再点击Finish。项目创建后保持包结构org.example与仓库中 NeptuneLambdaHandler.java 的包名一致便于后续直接使用org.example.NeptuneLambdaHandler::handleRequest作为 Lambda handler。添加 POM 依赖仓库中的 pom.xml 是完整可用的依赖清单下面拆解关键部分构建属性与 BOM 管理properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding java.version21/java.version maven.compiler.target21/maven.compiler.target maven.compiler.source21/maven.compiler.source /properties通过dependencyManagement引入两个 BOMBill of Materials统一管控依赖版本software.amazon.awssdk:bom:2.31.8AWS SDK for Java v2与org.apache.logging.log4j:log4j-bom:2.23.1。核心依赖说明依赖版本仓库实际值用途software.amazon.awssdk:neptunedataBOM 管理提供NeptunedataClient与ExecuteGremlinQueryRequest/Response即本文使用的 Neptune Data APIsoftware.amazon.awssdk:neptuneBOM 管理管理平面 API创建集群/实例/子网组等与场景代码对应software.amazon.awssdk:apache-client2.25.38基于 Apache HttpClient 的 HTTP 实现用于自定义连接/套接字超时software.amazon.awssdk:s3BOM 管理供执行角色场景读取 S3 数据使用com.amazonaws:aws-lambda-java-core1.2.1提供RequestHandler、Context、LambdaLogger等 Lambda 运行时接口com.fasterxml.jackson.core:jackson-databind2.22.1将响应序列化为 JSON 输出com.google.code.gson:gson2.10.1备用 JSON 处理库org.apache.tinkerpop:gremlin-driver3.6.4若改用 Gremlin 驱动协议访问时的依赖org.junit.jupiter:junit-jupiter5.11.4test scope单元测试框架关于maven-shade-plugin原文档强调项目必须在pom.xml中配置maven-shade-plugin才能打出包含全部依赖的 fat JAR。若缺少该插件打包产物将不包含所依赖的类部署后运行时会出现ClassNotFoundException。这一点在打包小节会进一步说明。编写 Lambda 函数NeptuneLambdaHandler 类本用例通过 Lambda 运行时 Java API 定义一个名为NeptuneLambdaHandler的处理类实现RequestHandlerMapString, String, String接口内部使用 Neptune Data Client API 查询图数据库。仓库中 NeptuneLambdaHandler.java 的完整实现如下为便于直接使用仓库源码中的端点为真实占位集群端点请务必替换为你的 Neptune 端点package org.example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.neptunedata.NeptunedataClient; import software.amazon.awssdk.services.neptunedata.model.ExecuteGremlinQueryRequest; import software.amazon.awssdk.services.neptunedata.model.ExecuteGremlinQueryResponse; import com.fasterxml.jackson.databind.ObjectMapper; import java.net.URI; import java.time.Duration; import java.util.Map; public class NeptuneLambdaHandler implements RequestHandlerMapString, String, String { Override public String handleRequest(MapString, String event, Context context) { LambdaLogger logger context.getLogger(); String NEPTUNE_ENDPOINT Specify your Endpoint:8182; NeptunedataClient neptunedataClient NeptunedataClient.builder() .region(Region.US_EAST_1) .endpointOverride(URI.create(NEPTUNE_ENDPOINT)) .httpClientBuilder(ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(10)) .socketTimeout(Duration.ofSeconds(30))) .overrideConfiguration(ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(30)) .build()) .build(); // Execute Gremlin Query logger.log(Executing Gremlin PROFILE query...\n); ExecuteGremlinQueryRequest queryRequest ExecuteGremlinQueryRequest.builder() .gremlinQuery(g.V().hasLabel(person).values(name)) .build(); ExecuteGremlinQueryResponse response neptunedataClient.executeGremlinQuery(queryRequest); // Log full response as JSON logger.log(Full Response:\n); try { ObjectMapper mapper new ObjectMapper(); String jsonResponse mapper.writerWithDefaultPrettyPrinter().writeValueAsString(response); logger.log(jsonResponse \n); } catch (Exception e) { logger.log(Failed to serialize response: e.getMessage() \n); } // Log result specifically if (response.result() ! null) { logger.log(Query Result:\n response.result().toString() \n); } else { logger.log(No result returned from the query.\n); } return Done; } }关键代码点逐项解读1. 端点与区域NEPTUNE_ENDPOINT形如https://cluster-endpoint:8182其中:8182是 Neptune 集群的 Gremlin/Data API 默认端口。文档强调必须将NEPTUNE_ENDPOINT替换为你的实际 Neptune 端点——该值可通过运行仓库中的 Neptune Basics 场景获取输出集群端点或从 Neptune 控制台集群详情页获得。.region(Region.US_EAST_1)指定签名区域应与集群所在区域一致。2. 客户端构建与超时配置通过ApacheHttpClient.builder()定制底层 HTTP 客户端connectionTimeout10 秒建立连接的超时、socketTimeout30 秒等待数据的超时。通过ClientOverrideConfiguration.builder().apiCallAttemptTimeout(Duration.ofSeconds(30))设置单次 API 调用的整体超时。这一双重超时策略与仓库中 NeptuneGremlinQueryExample.java 和 GremlinProfileQueryExample.java 的客户端构建方式完全一致说明这是该仓库中访问 Neptune 的标准客户端配置模式。注意Lambda 场景中通常不建议显式close()客户端如示例类中的finally { client.close(); }就不适用于每次调用的 handler因为 Lambda 容器会复用 warm 状态让客户端随容器生命周期复用更高效。3. 执行 Gremlin 查询ExecuteGremlinQueryRequest.builder().gremlinQuery(g.V().hasLabel(person).values(name))构建查询请求——遍历所有person标签的顶点并返回其name属性值。neptunedataClient.executeGremlinQuery(queryRequest)是Neptune Data API的核心同步调用返回ExecuteGremlinQueryResponse。仓库中 NeptuneGremlinQueryExample.java 展示了同样的调用模式并补充了NeptunedataException异常捕获与e.awsErrorDetails().errorMessage()错误详情获取方式可迁移到生产代码中。4. 结果记录用 JacksonObjectMapper将完整响应序列化为格式化 JSON 写入日志序列化失败时捕获异常并记录错误信息再针对性地把response.result()转换为字符串输出若为空则记录 No result returned from the query.。在 Lambda 中通过context.getLogger()获取的LambdaLogger写入的日志会自动汇聚到 CloudWatch Logs。打包项目为 JAR在项目根目录执行 Maven 命令打包mvn clean package shade:shade该命令会生成一个shaded JARfat JAR位于项目的target子目录中。为什么必须用 shade 插件maven-shade-plugin负责把 Maven 依赖neptunedata、aws-lambda-java-core、jackson-databind、apache-client等合并进同一个 JAR。如果跳过该插件直接打包产物将缺少这些依赖类Lambda 部署后在运行时抛出ClassNotFoundException。因此确保pom.xml中已正确配置 shade 插件并将最终 JAR 文件如target/my-lambda-jar-with-dependencies.jar作为部署的 zip 源。部署 Lambda 函数使用 AWS CLI 创建 Lambda 函数必须指定与 Neptune 数据库关联的 VPC 子网和安全组这些值同样可通过运行仓库中的 Neptune Basics 场景获取。aws lambda create-function \ --function-name NeptuneLoader \ --runtime java21 \ --role arn:aws:iam::123456789012:role/lambda-execution-role \ --handler org.example.NeptuneLambdaHandler::handleRequest \ --timeout 900 \ --memory-size 1024 \ --zip-file fileb://target/my-lambda-jar-with-dependencies.jar \ --vpc-config SubnetIdssubnet-abcdxxxx,subnet-xyz9xxxx,SecurityGroupIdssg-abc1xxxx参数说明参数说明--function-name函数名NeptuneLoader--runtimejava21与 Java 21 JDK 及 POM 中的java.version21一致--role前面创建的lambda-execution-role的 ARN替换账户 ID--handler格式为类名::handleRequest::表示实例方法引用对应RequestHandler接口--timeout 900函数最长执行时间 900 秒15 分钟为 Gremlin 查询预留充足时间--memory-size 1024分配 1024 MB 内存间接影响 CPU 配额--zip-file fileb://...指向 shaded JARfileb://表示二进制上传--vpc-config指定子网与安全组二者共同隐式确定 VPC注意create-function命令不需要显式指定 VPC ID——指定子网和安全组即可隐式推导出 VPC。请务必核对 IAM 角色 ARN 与 handler 名称等值是否正确。配置安全组规则要让 Lambda 与 Neptune 数据库互通必须正确配置安全组规则1. 入站规则允许来自 Lambda 安全组的流量访问 Neptune 的 8182 端口aws ec2 authorize-security-group-ingress \ --group-id neptune-sg-id \ --protocol tcp \ --port 8182 \ --source-group lambda-sg-id \ --description Allow Lambda SG access to Neptune on port 81822. 出站规则允许 Lambda 安全组向 Neptune 发送 8182 端口流量默认情况下所有出站流量都是允许的若安全组被收紧了请务必确认aws ec2 authorize-security-group-egress \ --group-id lambda-sg-id \ --protocol tcp \ --port 8182 \ --destination-group neptune-sg-id \ --description Allow Lambda to send traffic to Neptune on port 8182通过--source-group/--destination-group引用对端安全组 ID比按 IP 段授权更精确、更安全也是 VPC 内部服务互通的标准做法。调用 Lambda 函数aws lambda invoke --function-name NeptuneLoader output.调用成功后命令行会输出如下 JSON 响应{ StatusCode: 200, ExecutedVersion: $LATEST }检查output.文件可看到即时的调用输出但详细的函数日志需要到 CloudWatch 查看。查看 CloudWatch 日志Lambda 运行日志会自动写入 CloudWatch Logs可按以下三步排查与观察第 1 步查找日志组aws logs describe-log-groups | grep NeptuneLoader第 2 步列出日志组中的日志流按最近事件时间倒序便于找到最新一次调用aws logs describe-log-streams \ --log-group-name /aws/lambda/NeptuneLoader \ --order-by LastEventTime \ --descending第 3 步查看指定日志流的事件aws logs get-log-events \ --log-group-name /aws/lambda/NeptuneLoader \ --log-stream-name your-log-stream-name将your-log-stream-name替换为上一步返回的实际流名称。在这里你将看到 handler 中logger.log输出的完整 JSON 响应、Query Result以及任何异常堆栈是定位查询无结果、超时或网络不通等问题的关键手段。排查要点与延伸阅读网络不通的典型症状调用超时或NeptunedataException。请逐项核对 Lambda 是否配置了--vpc-config、安全组是否放行 8182 端口、子网是否与 Neptune 位于同一 VPC。权限不足的典型症状AccessDeniedException。确认执行角色已附加AWSNeptuneFullAccess与AWSLambdaVPCAccessExecutionRole。打包缺失依赖的典型症状ClassNotFoundException。确认使用mvn clean package shade:shade生成 shaded JAR。更深层的 Gremlin 操作仓库 javav2/example_code/neptune 目录下还提供了更多 Neptune 代码示例包括 NeptuneGremlinQueryExample.javaGremlin 查询 异常处理、GremlinProfileQueryExample.javaPROFILE 查询获取执行计划、OpenCypherExplainExample.javaOpenCypher EXPLAIN以及 NeptuneScenario.java含创建子网组、集群、实例、启停与清理的完整场景。这些示例共用相同的客户端构建与超时配置模式可作为扩展查询逻辑的参考。入门查看HelloNeptune.java 展示了用异步客户端describeDBClustersPaginator分页列出集群的入门方式。后续步骤恭喜你已经成功创建了一个可查询 Neptune 数据的 Lambda 函数。如文档开头所强调请务必删除教程期间创建的全部资源Neptune 集群、Lambda 函数、IAM 角色、安全组规则等以免持续产生费用。更多 AWS 多服务组合示例可继续浏览仓库的 javav2/usecases 目录下的其他实战用例。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome 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.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐AWS SDK for Java v2图数据库Neptune图数据查询AWS SDK for Java v2图数据库Neptune图数据查询 概述 Amazon Neptune是AWS提供的全托管图数据库服务支持属性图模型和R后端使用 aws-sdk-java-v2 的 archetype-lambda 模板快速构建 AWS Lambda Java 函数项目使用 aws sdk java v2 的 archetype lambda 模板快速构建 AWS Lambda Java 函数项目 本文围绕 AWS SDK f后端基于 AWS SDK for Java V2 构建 SageMaker 地理空间工作流的 Lambda 函数基于 AWS SDK for Java V2 构建 SageMaker 地理空间工作流的 Lambda 函数 导读 本文讲解如何基于 AWS SDK for J示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑