Terraform AWS S3 для запуска лямбда-уведомлений - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь кодифицировать лямбда-функцию, которая запускается с помощью S3.Создание лямбда-функции выполнено успешно, но ресурс «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:

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"
}

Заранее спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Итак, я попробовал ту же настройку, что и у вас,

...
// lambda resource

resource "aws_s3_bucket_notification" "my-trigger" {
    bucket = "k8-alb-ingress-access-logs"

    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:::k8-alb-ingress-access-logs/AWSLogs/890895631537/*"
        }
    ]
}

И уведомление s3 успешно создано.

Так что я думаю, что теперь вы должны проверить 2 вещи:

  1. Убедитесь, что ваше aws_lambda_permission действительно создано до вашего уведомления s3.Я использую terraform 0.10.2, но в предыдущих версиях могла быть ошибка, из-за которой это лямбда-разрешение не было создано до уведомления s3.

  2. Проверьте политику корзины s3.Это может быть явное запрещение лямбда-доступа.Если таковые имеются, обязательно избавьтесь от них.

...