Gebruik terraform om een ​​lambda-functie in te stellen die wordt geactiveerd door een geplande gebeurtenisbron

Ik wil graag elke vijf minuten een AWS lambda-functie uitvoeren. In de AWS Management Console is dit eenvoudig in te stellen, onder het tabblad “Event Sources” van de lambda-functie, maar hoe stel ik dit in met Terraform?

Ik heb geprobeerd een aws_lambda_event_source_mapping-bronte gebruiken, maar het blijkt dat de API die het gebruiktalleen ondersteunt evenementen van Kinesis en DynamoDB. Als ik het probeer te gebruiken met een geplande gebeurtenisbron, treedt er een time-out op voor het maken.


Antwoord 1, autoriteit 100%

U kunt een aws_cloudwatch_event_target-bron gebruiken om de geplande gebeurtenisbron (gebeurtenisregel) aan uw lambda-functie te koppelen. Je moet het toestemming geven om je lambda-functie aan te roepen; je kunt hiervoor een aws_lambda_permissionbron gebruiken.

Voorbeeld:

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

Antwoord 2, autoriteit 2%

Het antwoord van Verbjorns Ljosa bevat alleen toestemmingen voor cloudwatch om de lambda aan te roepen. Heb je het juiste beleid en de juiste iam-rol gespecificeerd waarmee de lambda zijn acties kan uitvoeren?

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

met assume_role_policy.json

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

en een beleid dat verwijst naar de bovenstaande resource iam-rol, d.w.z. zoiets als

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

en tot slot de json die het beleid specificeert, 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"
}

Houd er rekening mee dat u geen resourcebeperking kunt opgeven voor de aan logboeken gerelateerde acties. abc:SomeActionkan ssm:GetParameterzijn met een begeleidende bron zoals "arn:aws:ssm:us-east-1:${your-aws-account-id}:parameter/some/parameter/path/*


Antwoord 3, autoriteit 2%

Als aanvulling op het geaccepteerde antwoord. Vaak zou men willen dat het zip-bestand voor de lambda ook door terraform wordt gemaakt. Hiervoor kan men gebruik maken van de archive_file data source:

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

Dat is vooral handig als de code onder versiebeheer staat, want dan kun je de check_foo.ziptoevoegen aan de .gitignoreen er kan nooit een mismatch zijn tussen het zipbestand en de broncode waarop het is gebaseerd.

Other episodes