You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AWS Lambda Java SDK获取Lambda函数关联的S3存储桶名称

实现方案

错误原因说明

你调用的listFunctionEventInvokeConfigs接口用于查询Lambda异步调用的运行配置(例如重试策略、死信队列绑定等),和S3触发器的关联配置无关,因此无法获取到目标存储桶信息。

正确实现步骤

基于s3-get-object蓝图创建的Lambda函数,AWS会自动在Lambda的资源权限策略中添加一条允许对应S3桶调用函数的规则,我们可以通过解析该规则提取存储桶名称:

  • 调用Lambda SDK的getPolicy接口获取Lambda的资源策略JSON
  • 筛选出主体为s3.amazonaws.com的权限语句
  • 从语句的条件字段中提取S3桶ARN,解析得到桶名

Java 代码示例(基于AWS SDK v2)

依赖配置

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>lambda</artifactId>
        <version>2.20.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version>
    </dependency>
</dependencies>

核心代码

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.lambda.LambdaClient;
import software.amazon.awssdk.services.lambda.model.GetPolicyRequest;
import software.amazon.awssdk.services.lambda.model.GetPolicyResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LambdaS3BucketFetcher {
    private static final Pattern S3_ARN_PATTERN = Pattern.compile("arn:aws:s3:::([^/]+)");
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public List<String> getAssociatedS3Buckets(String functionName, Region region) {
        List<String> bucketNames = new ArrayList<>();
        try (LambdaClient lambdaClient = LambdaClient.builder().region(region).build()) {
            GetPolicyRequest request = GetPolicyRequest.builder()
                    .functionName(functionName)
                    .build();
            GetPolicyResponse response = lambdaClient.getPolicy(request);
            // 解析策略JSON
            JsonNode policyJson = objectMapper.readTree(response.policy());
            JsonNode statements = policyJson.get("Statement");

            for (JsonNode statement : statements) {
                // 筛选S3主体的权限语句
                JsonNode principal = statement.get("Principal");
                if (principal != null && "s3.amazonaws.com".equals(principal.get("Service").asText())) {
                    JsonNode condition = statement.get("Condition");
                    if (condition != null) {
                        String sourceArn = condition.get("ArnLike").get("aws:SourceArn").asText();
                        Matcher matcher = S3_ARN_PATTERN.matcher(sourceArn);
                        if (matcher.find()) {
                            bucketNames.add(matcher.group(1));
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bucketNames;
    }
}

注意事项

  • 如果你的Lambda函数关联了多个S3桶触发器,上述代码会返回所有关联的桶名
  • 若Lambda权限策略被手动修改过,没有保留S3相关的权限语句,该方法不适用,此时可遍历所有S3桶的事件通知配置匹配目标Lambda ARN提取桶名

内容的提问来源于stack exchange,提问作者Baburaj Velayudhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 06:51:02