【问题标题】:How to list triggers associated with AWS Lambda function using Java SDK如何使用 Java 开发工具包列出与 AWS Lambda 函数关联的触发器
【发布时间】:2017-09-25 17:20:34
【问题描述】:

在 AWS Lambda 控制台中,如果您单击触发器选项卡,它将显示触发器列表(如果为该 lambda 函数配置了任何触发器)。 如何获取使用 Java SDK for AWS 触发的配置列表?

谢谢。

【问题讨论】:

标签: amazon-web-services aws-lambda aws-sdk


【解决方案1】:

您可以获得触发器列表,但这不是一项简单的任务。我设法在代码中重现了控制台的行为。我在 Node.js 中编写代码,但在 Java SDK 中使用这些方法会得到相同的结果。

1) 使用 Lambda getPolicy() 方法检索策略 JSON(与控制台中触发器/查看函数策略下显示的相同)。

2) 解析 JSON 并使用“Statement”/“Condition”/“ArnLike”/“AWS:SourceArn”元素解析出触发器的 S3 存储桶名称。

3) 使用 S3 getBucketNotificationConfiguration() 方法检索在 2) 中找到的每个存储桶的触发器列表。

4) 解析 3) 的结果并在 LambdaFunctionConfigurations 节点中搜索您的 Lambda 的匹配 LambdaFunctionArn。匹配节点包含从 2) 到您的 Lambda 的 S3 存储桶的任何触发器的详细信息。

我假设可以类似地找到来自 S3 存储桶以外的其他 AWS 源的触发器,但我的用例仅适用于 S3 存储桶。

注意:johni 在 4 月 29 日提供的答案不正确。当我尝试它时,我了解到此方法仅返回 Kinesis 事件。来自其他 AWS 源的触发器仅在 Lambda 函数的策略 JSON 中可见。

【讨论】:

    【解决方案2】:

    当您获取 lambda 函数的详细信息时,它们并没有直接列出,这看起来有点奇怪,而从 UI 的角度来看,它们似乎是 lambda 的一部分。有人已经指出分配给 lambda 的策略文档,您可以使用它来确定允许调用此 lambda 的其他 AWS 资源。

    遇到这种情况时,我正在使用 Go,但 Java 的方法基本相同。在 go 中它看起来像这样:

    func(p *AWSParser) getEventTriggers(functionName string) *[]Trigger {
    
        var triggers []Trigger
        res2, err := p.lambdaSvc.GetPolicy(&lambda.GetPolicyInput{FunctionName: &functionName})
    
        if err == nil {
            polAsJson := gjson.Parse(*res2.Policy)
            polAsJson.Get("Statement").ForEach(func (_, value gjson.Result) bool {
                sid := value.Get("Sid").String()
                effect := value.Get("Effect").String()
                action := value.Get("Action").String()
                sourceArn := value.Get("Condition.ArnLike.AWS:SourceArn").String()
    
                triggers = append(triggers, Trigger{Sid: sid, Effect: effect, Action: action, SourceArn: sourceArn})
                return true
            })
        }
    
        return &triggers
    }
    

    基本上你需要做的是:

    1. 在 lambda 服务上调用 getPolicy 函数,提供您的 Lambda 名称。
    2. 结果可以包含一个策略文档,它本身就是一个 JSON 字符串
    3. 您可以从此策略确定调用资源。

    作为示例,以下是解析此策略以获取 lambda 的结果,该 lambda 可以从 cognito 触发器调用:

        "Sid": "CSI_customMessage_eu-west-1qTL8mCdN9_CSI_customMessage",
        "Effect": "Allow",
        "Action": "lambda:InvokeFunction",
        "SourceArn": "arn:aws:cognito-idp:eu-west-1:###:userpool/###"
    

    【讨论】:

    【解决方案3】:

    一个简单的 AWS CLI(我知道它不是 Java,但它会为您提供结构)

    aws lambda get-policy --function-name your-function-name --query 'Policy' --output text| jq '.'
    

    【讨论】:

      【解决方案4】:

      这当然是可能的。 您所说的触发器在他们的文档中称为 EventSources

      你在找这个:

      http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/lambda/model/ListEventSourceMappingsResult.html

      【讨论】:

      • 正如 Corey 所提到的,这种方法只返回 Kinesis 事件(我认为也是 DynamoDB 事件)所以这并不完全。
      • 如上所述,这只适用于 SQS、DynamoDB 流和 Kinesis 流。
      猜你喜欢
      • 2017-07-27
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2019-05-04
      • 2019-01-02
      • 2019-04-24
      相关资源
      最近更新 更多