【问题标题】:Terraform AWS S3 to Lambda Notification TriggerTerraform AWS S3 到 Lambda 通知触发器
【发布时间】:2019-02-26 03:47:29
【问题描述】:

我正在尝试编写要使用 S3 触发的 lambda 函数。 Lambda 函数创建成功,但“aws_s3_bucket_notification”资源在terraform:apply 失败,MethodNotAllowed 错误,status code 405

Error: Error applying plan:
20-Sep-2018 15:23:53    1 error(s) occurred:
20-Sep-2018 15:23:53    * aws_s3_bucket_notification.my-trigger: 1 error(s) occurred:
20-Sep-2018 15:23:53    * aws_s3_bucket_notification.my-trigger: Error putting S3 notification configuration: MethodNotAllowed: The specified method is not allowed against this resource.
20-Sep-2018 15:23:53            status code: 405, request id:<hidden>, host id:<hidden>

这是我设置通知触发器的代码:

resource "aws_s3_bucket_notification" "my-trigger" {
  bucket = "my-bucket"

  lambda_function {
    lambda_function_arn = "${aws_lambda_function.my-function.arn}"
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = "file-prefix"
    filter_suffix       = "file-extension"
  }
}

这是从 S3 触发 Lambda 的权限:

resource "aws_lambda_permission" "s3-lambda-permission" {
  statement_id  = "AllowExecutionFromS3Bucket"
  action        = "lambda:InvokeFunction"
  function_name = "${aws_lambda_function.my-function.arn}"
  principal     = "s3.amazonaws.com"
  source_arn    = "arn:aws:s3:::my-bucket"
}

提前致谢!

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda terraform


    【解决方案1】:

    所以我尝试了和你一样的设置,

    ...
    // lambda resource
    
    resource "aws_s3_bucket_notification" "my-trigger" {
        bucket = "my-bucket"
    
        lambda_function {
            lambda_function_arn = "${aws_lambda_function.my-function.arn}"
            events              = ["s3:ObjectCreated:*"]
            filter_prefix       = "AWSLogs/"
            filter_suffix       = ".txt"
        }
    }
    
    resource "aws_lambda_permission" "test" {
      statement_id  = "AllowS3Invoke"
      action        = "lambda:InvokeFunction"
      function_name = "${aws_lambda_function.my-function.arn}"
      principal = "s3.amazonaws.com"
      source_arn = "arn:aws:s3:::my-bucket"
    }
    
    ...
    

    我的 S3 存储桶策略是这样的:

    {
        "Version": "2012-10-17",
        "Id": "AWSConsole-AccessLogs-Policy-1534800162725",
        "Statement": [
            {
                "Sid": "AWSConsoleStmt-1534800162725",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::123456789012:root"
                },
                "Action": "s3:PutObject",
                "Resource": "arn:aws:s3:::my-bucket/AWSLogs/123456789012/*"
            }
        ]
    }
    

    并且成功创建了 s3 通知。

    所以我认为现在你应该检查两件事:

    1. 确保您的 aws_lambda_permission 在您的 s3 通知之前实际创建。我使用的是 terraform 0.10.2,但之前的版本可能存在错误,因此在 s3 通知之前不会创建此 lambda 权限。

    2. 检查您的 s3 存储桶策略。它可能明确拒绝 lambda 访问。如果有,请确保摆脱它们。

    【讨论】:

    • 这个答案几乎是评论。如果您可以用一个可行的示例充实它并删除提问段落以说明正在发生的事情,这将是一个有用的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2017-11-01
    • 2017-06-07
    • 1970-01-01
    • 2018-03-08
    • 2021-06-25
    相关资源
    最近更新 更多