web-dev-qa-db-fra.com

Utilisez terraform pour configurer une fonction lambda déclenchée par une source d'événements planifiés

Je souhaite exécuter une fonction AWS lambda toutes les cinq minutes. Dans AWS Management Console, cela est facile à configurer, sous l'onglet "Sources d'événements" de la fonction lambda, mais comment puis-je le configurer avec Terraform ?

J'ai essayé d'utiliser une ressource aws_lambda_event_source_mapping , mais il s'avère que l'API utilisée ne prend en charge que les événements de Kinesis et DynamoDB. Lorsque j'essaie de l'utiliser avec une source d'événements planifiée, la création expire.

32
Vebjorn Ljosa

Vous pouvez utiliser une ressource aws_cloudwatch_event_target pour lier la source d'événements planifiés (règle d'événement) à votre fonction lambda. Vous devez lui donner la permission d'invoquer votre fonction lambda. vous pouvez utiliser une ressource aws_lambda_permission pour cela.

Exemple:

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}"
}
57
Vebjorn Ljosa

La réponse de Verbjorns Ljosa inclut uniquement les autorisations permettant à cloudwatch d'appeler le lambda. Avez-vous spécifié la stratégie et le rôle iam appropriés permettant au lambda d’effectuer ses actions?

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

avec assume_role_policy.json

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

et une politique référençant le rôle de ressource iam ci-dessus. quelque chose comme

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

et enfin le json spécifiant la politique, 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"
}

Notez que vous ne pouvez pas spécifier de restriction de ressources pour les actions liées aux journaux. abc:SomeAction pourrait être ssm:GetParameter avec une ressource d'accompagnement comme "arn:aws:ssm:us-east-1:${your-aws-account-id}:parameter/some/parameter/path/*

1
johan mårtensson