#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