【问题标题】:Lambda chaining - Invoke lambda from another lambda using terraformLambda 链接 - 使用 terraform 从另一个 lambda 调用 lambda
【发布时间】:2019-12-15 21:15:09
【问题描述】:

我正在尝试从另一个调用一个 AWS lambda 并执行 lambda 链接。这样做的理由是 AWS 不提供来自同一个 S3 存储桶的多个触发器。

我创建了一个带有 s3 触发器的 lambda。第一个 lambda 的 java 代码将监听 S3 事件并包含另一个 lambda 的调用。第二个 lambda 将从第一个 lambda 调用。 lambda 的创建都是由 terraform 完成的。

Lambda A 具有 S3 触发器。这将在特定存储桶上的 S3 事件上调用。 Lambda A 将进行处理并使用调用请求调用 Lambda B。 java中Lambda A代码的Lambda B调用是:

public class EventHandler implements RequestHandler<S3Event, String> {
  @Override
  public String handleRequest(S3Event event, Context context) throws RuntimeException {
    InvokeRequest req = new InvokeRequest()
    .withFunctionName("LambdaFunctionB")
    .withPayload(json);
    return "Lambda B invoked"
  }
}

这两个 lambda 都是使用 terraform 创建的。以下脚本:
Lambda A terraform:

module "lambda_function" {
   source = "Git Path"
   absolute_artifact_path = "../lambda.jar"
   lambda_function_name = "LambdaFunctionA"
   lambda_function_description = ""
   lambda_function_runtime = "java8"
   lambda_handler_name = "EventHandler"
   lambda_execution_role_name = "lambda-iam-role"
   lambda_memory = "512"
   dead_letter_target_arn = "error-handling-arn"

}

resource "aws_lambda_permission" "allow_bucket" {
  statement_id  = "statementId"
  action        = "lambda:InvokeFunction"
  function_name = "${module.lambda_function.lambda_arn}"
  principal     = "s3.amazonaws.com"
  source_arn    = "s3.bucket.arn"
}

resource "aws_s3_bucket_notification" "bucket_notification" {
  bucket = "bucketName"

  lambda_function {
    lambda_function_arn = "${module.lambda_function.lambda_arn}"
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = "path/subPath"
  }
}

Lambda B 地形:

module "lambda_function" {
   source = "git path"
   absolute_artifact_path = "../lambda.jar"
   lambda_function_name = "LambdaFunctionB"
   lambda_function_description = ""
   lambda_function_runtime = "java8"
   lambda_handler_name = "LambdaBEventHandler"
   lambda_execution_role_name = "lambda-iam-role"
   lambda_memory = "512"
   dead_letter_target_arn = "error-handling-arn"

}

resource "aws_lambda_permission" "allow_lambda" {
  statement_id  = "AllowExecutionFromLambda"
  action        = "lambda:InvokeFunction"
  function_name = "${module.lambda_function.lambda_arn}"
  principal     = "s3.amazonaws.com"
  source_arn    = "arn:aws:lambda:eu-west-1:xxxxxxxxxx:function:LambdaFunctionA"
}

lambda-iam-role 附加了以下策略

AmazonS3FullAccess
AWSLambdaBasicExecutionRole
AWSLambdaVPCAccessExecutionRole
AmazonSNSFullAccess
CloudWatchEventsFullAccess

期望 Lambda A 应该成功调用 Lambda B。但是我在 Lambda A 日志中收到 AccessDeniedException 并且它无法调用 Lambda B。错误是

com.amazonaws.services.lambda.model.AWSLambdaException: User: arn:aws:sts::xxxxxxxxx:assumed-role/lambda-iam-role/LambdaFunctionA is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:eu-west-1:xxxxxxxxx:function:LambdaFunctionB (Service: AWSLambda; Status Code: 403; Error Code: AccessDeniedException; Request ID: f495ede3-b3cb-47a1-b884-16996545233d)

【问题讨论】:

    标签: aws-lambda terraform terraform-provider-aws


    【解决方案1】:
    • 希望这对您有所帮助,不完全相似,但它从另一个 lambda Github 调用一个 lambda
    • 我认为 lambda 也需要此策略“lambda:InvokeFunction”

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2016-12-31
      • 1970-01-01
      • 2021-11-04
      • 2022-12-05
      • 1970-01-01
      • 2018-08-21
      • 2021-06-02
      • 1970-01-01
      相关资源
      最近更新 更多