Используйте terraform для настройки лямбда-функции, запускаемой запланированным источником событий
Я хотел бы запускать функцию AWS lambda каждые пять минут. В консоли управления AWS это легко настроить на вкладке "Источники событий" лямбда-функции, но как настроить его с помощью терраформировать?
Я пытался использовать an aws_lambda_event_source_mapping
ресурс, но оказывается, что API, который он использует поддерживает только события из Kinesis и DynamoDB. Когда я пытаюсь использовать его с запланированным источником событий, время создания истекает.
2 ответов
можно использовать 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}"
}
ответ Verbjorns Ljosa включает только разрешения для cloudwatch для вызова лямбды. Вы указали правильную политику и роль iam, которая позволяет лямбде выполнять свои действия?
resource "aws_iam_role" "check_foo_role" {
name="check-foo-assume-role"
assume_role_policy="assume_role_policy.json"
}
С assume_role_policy.в 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/*