amazon web services - servidor - Use terraform para configurar una función lambda activada por un origen de evento programado
qué es aws lambda (2)
Me gustaría ejecutar una función lambda de AWS cada cinco minutos. En la consola de administración de AWS, esto es fácil de configurar, en la pestaña "Orígenes de eventos" de la función lambda, pero ¿cómo lo configuro con Terraform ?
Intenté usar un recurso aws_lambda_event_source_mapping
, pero resulta que la API que usa solo admite eventos de Kinesis y DynamoDB. Cuando trato de usarlo con un origen de evento programado, la creación se agota.
La respuesta de Verbjorns Ljosa solo incluye permisos para que Cloudwatch invoque a la lambda. ¿Ha especificado la política adecuada y el rol de iam que le permita a la lambda realizar sus acciones?
resource "aws_iam_role" "check_foo_role" {
name="check-foo-assume-role"
assume_role_policy="assume_role_policy.json"
}
con assume_role_policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
y una política que hace referencia al rol de iam del recurso anterior, es decir, algo así como
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"
}
y finalmente el json especificando la política, 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"
}
Tenga en cuenta que no puede especificar una restricción de recursos para las acciones relacionadas con los registros. abc: SomeAction podría ser ssm: GetParameter con un recurso que lo acompaña, como "arn:aws:ssm:us-east-1:${your-aws-account-id}:parameter/some/parameter/path/*
Puede usar un recurso aws_cloudwatch_event_target
para vincular el origen de evento programado (regla de evento) a su función lambda. Debe otorgarle permiso para invocar su función lambda; puede utilizar un recurso aws_lambda_permission
para esto.
Ejemplo:
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}"
}