2

Je suis en train de configurer des règles de CloudWatch qui va déclencher des fonctions lambda un jour/heure spécifique avec les éléments suivants:aws terraformer règle CloudWatch comme déclencheur lambda

resource "aws_lambda_function" "cleanup_daily" { 
    filename   = "name" 
    function_name  = "name" 
    role    = "arn<removed>" 
    handler   = "snapshotcleanup.lambda_handler" 
    source_code_hash = "${base64sha256(file("file_name"))}" 
    runtime   = "python2.7" 
    timeout   = "20" 
    description  = "desc" 
} 

resource "aws_cloudwatch_event_rule" "daily_rule" { 
    name    = "name" 
    description   = "desc" 
    schedule_expression = "cron(....)" 
} 

resource "aws_cloudwatch_event_target" "daily_target" { 
    rule = "${aws_cloudwatch_event_rule.daily_rule.name}" 
    arn = "${aws_lambda_function.cleanup_daily.arn}" 
} 

Cependant, les fonctions lambda ne fonctionnent pas. Si je regarde lambda et vérifie l'onglet des triggers, il n'y a rien là. Si je regarde les règles du cloudwatch et que je regarde sous Targets, la fonction lambda apparaît et si je clique dessus, je suis redirigé vers la fonction elle-même. Des idées qui pourraient mal ici? Pour l'une des règles cloudwatch, j'ai cliqué sur edit -> save -> configure details -> update sans rien changer et qui apparaît maintenant sous l'onglet trigger de lambda, mais qui doit toujours faire fonctionner les autres w/o cette étape,

Répondre

6

Chaque fois que des services AWS distincts interagissent, il est nécessaire de leur accorder les autorisations d'accès nécessaires à l'aide d'AWS IAM.

Dans ce cas, Cloudwatch Events doit avoir accès pour exécuter la fonction Lambda en question.

L'étape 2 de the AWS tutorial décrit comment procéder à l'aide de l'AWS CLI. L'équivalent Terraform de la commande aws lambda add-permission est the aws_lambda_permission resource, qui peut être utilisé avec l'exemple de configuration à partir de la question suivante:

data "aws_caller_identity" "current" { 
    # Retrieves information about the AWS account corresponding to the 
    # access key being used to run Terraform, which we need to populate 
    # the "source_account" on the permission resource. 
} 

resource "aws_lambda_permission" "allow_cloudwatch" { 
    statement_id = "AllowExecutionFromCloudWatch" 
    action   = "lambda:InvokeFunction" 
    function_name = "${aws_lambda_function.cleanup_daily.function_name}" 
    principal  = "events.amazonaws.com" 
    source_account = "${data.aws_caller_identity.current.account_id}" 
    source_arn  = "${aws_cloudwatch_event-rule.daily_rule.arn}" 
} 

autorisations AWS Lambda sont une abstraction sur les rôles IAM et politiques. Pour obtenir des informations d'arrière-plan générales sur les rôles et les règles IAM, voir my longer answer to another question, dans lequel davantage de configuration manuelle était requise.