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.
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}"
}
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/*