首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform S3到Lambda通知触发器

Terraform S3到Lambda通知触发器
EN

Stack Overflow用户
提问于 2018-09-21 17:43:32
回答 1查看 13.8K关注 0票数 8

我正在试图编码使用S3触发的lambda函数。Lambda函数的创建是成功的,但是"aws_s3_bucket_notification“资源在terraform:apply上失败,MethodNotAllowed错误与status code 405

代码语言:javascript
复制
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>

下面是设置通知触发器的代码:

代码语言:javascript
复制
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的权限:

代码语言:javascript
复制
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"
}

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2018-09-21 19:36:00

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

代码语言:javascript
复制
...
// 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桶策略如下所示:

代码语言:javascript
复制
{
    "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,但是在以前的版本中可能有一个bug,因此在s3通知之前不会创建这个lambda权限。
  2. 检查您的s3桶策略。它可能是明确拒绝lambda访问。如果有的话,一定要处理掉这些。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52448714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档