Две функции AWS Lambda с двумя ролями IAM

#amazon-web-services #aws-lambda #terraform

#amazon-веб-сервисы #aws-lambda #terraform

Вопрос:

У меня есть две функции AWS Lambda. У одного должен быть доступ к лямбда-политике, а у другого должен быть доступ к лямбда-политике и SQS.

Я пытаюсь создать роли IAM, чтобы по умолчанию у них был доступ к политике Lambda, а затем для второй роли IA я пытаюсь прикрепить политику SQS.

Я использую следующий HCL:

 resource "aws_sqs_queue" "sqs" {
  name = "lambda-feeding-queue"
}

resource "aws_lambda_event_source_mapping" "sqs" {
  event_source_arn = aws_sqs_queue.sqs.arn
  function_name = aws_lambda_function.example.arn
  enabled = true
  batch_size = 1
}

resource "aws_lambda_function" "example" {
  function_name = "ServerlessExampleBook"

  s3_bucket = "lambda"
  s3_key = "mn/v1.0.0/lambda-1.0.0-all.jar"

  handler = "dk.fitfit.handler.BookRequestHandler"
  runtime = "java8"

  memory_size = 256

  role = aws_iam_role.example.arn
}

resource "aws_lambda_function" "event" {
  function_name = "ServerlessExampleEvent"

  s3_bucket = "lambda"
  s3_key = "mn/v1.0.0/lambda-1.0.0-all.jar"

  handler = "dk.fitfit.handler.EventRequestHandler"
  runtime = "java8"

  memory_size = 256

  role = aws_iam_role.event.arn
}

resource "aws_iam_role" "example" {
  name = "serverless_example_lambda"
  assume_role_policy = data.aws_iam_policy_document.lambda.json
}

data "aws_iam_policy_document" "lambda" {
  statement {
    effect = "Allow"

    actions = [
      "sts:AssumeRole",
    ]

    principals {
      identifiers = [
        "lambda.amazonaws.com"]
      type = "Service"
    }
  }
}

resource "aws_iam_role" "event" {
  name = "serverless_example_lambda_event"
  assume_role_policy = data.aws_iam_policy_document.lambda.json
}

resource "aws_iam_role_policy_attachment" "sqs" {
  role = aws_iam_role.event.name
  policy_arn = aws_iam_policy.sqs.arn
}

resource "aws_iam_policy" "sqs" {
  policy = data.aws_iam_policy_document.sqs.json
}

data "aws_iam_policy_document" "sqs" {
  statement {
    effect = "Allow"
    resources = [aws_sqs_queue.sqs.arn]

    actions = [
      "sqs:ReceiveMessage",
      "sqs:DeleteMessage",
      "sqs:GetQueueAttributes",
    ]
  }
}
 

Но ему не нравится, что политика SQS выбрана, потому что я получаю следующую ошибку:

Ошибка: Ошибка при создании сопоставления источника лямбда-события: исключение InvalidParameterValueException: предоставленная роль выполнения не имеет разрешений на вызов ReceiveMessage в SQS { RespMetadata: { StatusCode: 400, RequestID: «4971c72f-a2f3-40c2-9d55-fd892b27586b» }, Message_: «Предоставленная роль выполнения не имеет разрешений на вызовПолучение сообщения в SQS», введите: «Пользователь» }

Комментарии:

1. Где вы связываете созданную роль с вашими лямбда-функциями? Для этого нет кода.

2. Почему бы просто не создать роль IAM 1 и связать ее с Lambda 1, а также создать роль IAM 2 и связать ее с Lambda 2?

3. @Marcin — я обновил вопрос с помощью моих лямбд, к которым также прикреплены роли

4. @JohnRotenstein — Это то, что я пытаюсь сделать. Кстати, спасибо за правки

5. @Marcin — Это заставило меня увидеть мою ошибку. Но заслуги принадлежат вам. Если вы дадите ответ, в котором указано, что function_name = aws_lambda_function.example . arn должно быть function_name = aws_lambda_function.event.arn Я приму это 😉

Ответ №1:

На основе комментариев.

Проблема возникла из-за ошибки в aws_lambda_event_source_mapping . Вместо

 function_name = aws_lambda_function.example.arn
 

это должно быть

 function_name = aws_lambda_function.event.arn