Используйте terraform для настройки лямбда-функции, запускаемой источником запланированного события

Я хотел бы запускать функцию AWS лямбда каждые пять минут. В Консоли управления AWS это легко настроить на вкладке "Источники событий" лямбда-функции, но как мне настроить ее с помощью Terraform?

Я пытался использовать aws_lambda_event_source_mapping ресурс, но оказывается, что используемый им API поддерживает только события от Kinesis и DynamoDB. Когда я пытаюсь использовать его с источником запланированного события, время создания истекает.

4 ответа

Решение

Вы можете использовать aws_cloudwatch_event_target ресурс, чтобы связать источник запланированного события (правило события) с вашей лямбда-функцией. Вам нужно дать ему разрешение на вызов вашей лямбда-функции; Вы можете использовать aws_lambda_permission ресурс для этого.

Пример:

resource "aws_lambda_function" "check_foo" {
    filename = "check_foo.zip"
    function_name = "checkFoo"
    role = "arn:aws:iam::424242:role/something"
    handler = "index.handler"
}

resource "aws_cloudwatch_event_rule" "every_five_minutes" {
    name = "every-five-minutes"
    description = "Fires every five minutes"
    schedule_expression = "rate(5 minutes)"
}

resource "aws_cloudwatch_event_target" "check_foo_every_five_minutes" {
    rule = "${aws_cloudwatch_event_rule.every_five_minutes.name}"
    target_id = "check_foo"
    arn = "${aws_lambda_function.check_foo.arn}"
}

resource "aws_lambda_permission" "allow_cloudwatch_to_call_check_foo" {
    statement_id = "AllowExecutionFromCloudWatch"
    action = "lambda:InvokeFunction"
    function_name = "${aws_lambda_function.check_foo.function_name}"
    principal = "events.amazonaws.com"
    source_arn = "${aws_cloudwatch_event_rule.every_five_minutes.arn}"
}

Ответ Вербьорна Льюзы включает только разрешения для облачной стражи для запуска лямбды. Вы указали правильную политику и роль iam, которая позволяет лямбде выполнять свои действия?

resource "aws_iam_role" "check_foo_role" {
  name="check-foo-assume-role"
  assume_role_policy="assume_role_policy.json"
}

с предположением о роли_полицы.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}

и политика, ссылающаяся на вышеупомянутую роль Iam ресурса, т.е. что-то вроде

resource "iam_role_policy" "check-foo-policy" {
  name="check-foo-lambda-policy"
  # referencing the iam role above
  role="${aws_iam_role.check_foo_role.id}"
  policy="check-foo-policy.json"
}

и, наконец, json, определяющий политику, check-foo-policy.json.

{
  "Version": "2012-10-17",
  "Statement": [
    {
  "Effect": "Allow",
  "Action": [
    "logs:CreateLogGroup",
    "logs:CreateLogStream",
    "logs:PutLogEvents"
  ],
  "Resource": ["*"]
},
{
  "Effect": "Allow",
  "Action": [
    "abc:SomeAction",
    "abc:AnotherAction",
  ],
  "Resource": "some-arn-matching-the-actions"
}

Обратите внимание, что вы не можете указать ограничение ресурса для действий, связанных с журналами. abc:SomeAction может быть ssm:GetParameter с сопутствующим ресурсом типа arn "arn:aws:ssm:us-east-1:${your-aws-account-id}:parameter/some/parameter/path/*

В дополнение к принятому ответу. Часто бывает необходимо, чтобы zip-файл для лямбды также создавался с помощью terraform. Для этого можно использовать источник данных archive_file:

data "archive_file" "lambda_zip" {
    type        = "zip"
    source_dir  = "src"
    output_path = "check_foo.zip"
}

resource "aws_lambda_function" "check_foo" {
    filename = "check_foo.zip"
    function_name = "checkFoo"
    role = "arn:aws:iam::424242:role/something"
    handler = "index.handler"
}

# then the rest from the accepted answer to trigger this

Это особенно полезно, если код находится под контролем версий, потому что тогда вы можете добавить check_foo.zip к .gitignore и никогда не может быть несовпадения между zip-файлом и исходным кодом, на котором он основан.

спасибо, это сработало для меня очень хорошо

Другие вопросы по тегам