【问题标题】:aws events put-targets response is positive but the trigger is not addedaws events put-targets 响应为正,但未添加触发器
【发布时间】:2020-04-09 00:22:59
【问题描述】:

我正在部署一个 lambda 函数,我想每天调用它。我意识到即使我没有收到任何错误,最终的部署步骤也会以某种方式失败

aws events put-rule --name "daily_lambda_rule" \ 
                    --schedule-expression 'rate(15 minutes)'


aws lambda add-permission --function-name daily_lambda_rule \
                          --statement-id daily_lambda_function_scheduler \
                          --action 'lambda:InvokeFunction' \
                          --principal events.amazonaws.com \
                          --source-arn arn:aws:events:us-east-1:your-account-id:rule/daily_lambda_rule

aws events put-targets --rule daily_lambda_rule \
                        --targets "Id": "1","Arn":"arn:aws:lambda:us-east-1:your-account-id:function:myfun"

最后的输出是:

{
    "FailedEntryCount": 0,
    "FailedEntries": []
}

这表明一切正常,但是当我单击 lambda 函数时,我没有看到 cloudwatch 添加了此触发器的迹象。此外,手动添加触发器也可以正常工作。

使用boto3 产生相同的结果:

import boto3
events_client = boto3.client('events')
lambda_arn = 'arn:aws:lambda:eu-west-2:my-account-id:function:myfunction'
event_rule_name ='daily_lambda_rule'

scheduled_lambda = [
    {
        'Id': "myfunction", # lambda name
        'Arn': lambda_arn,
    }
]

response = events_client.put_targets(Rule=event_rule_name,
                          Targets=scheduled_lambda)

阻止脚本从 adding the trigger 到 lambda 函数的错误可能是哪里/什么?

特此我未成功检查的一些链接: https://towardsdatascience.com/loading-reddit-posts-using-aws-lambda-and-cloudwatch-events-9edb03ba4c14

https://docs.aws.amazon.com/cli/latest/reference/events/put-targets.html

boto3 - put_target https://docs.aws.amazon.com/code-samples/latest/catalog/python-cloudwatch-put_targets.py.html

boto3- 示例 https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/python/example_code/lambda/scheduled_lambda/scheduled_lambda.py

【问题讨论】:

    标签: aws-lambda boto3 aws-cli amazon-cloudwatch


    【解决方案1】:

    我做了两个观察: 首先:在 CLI 命令中,在放置规则的同时,也启用状态:

    aws events put-rule --name "daily_lambda_rule" \ 
                        --schedule-expression 'rate(15 minutes)'
                        --state 'ENABLED'
    

    其次:在 Python Boto3 脚本中,您跳过了 Lambda 权限步骤 - 必须将触发器附加到 Lambda。以下是对我有用的完整代码:

    import boto3
    
    lambda_client = boto3.client('lambda')
    events_client = boto3.client('events')
    
    lambda_name = "live_scoreboard"
    fn_role = 'arn:aws:iam::{}:role/lambda_basic_execution'.format(MY_ACCOUNT_ID)
    
    create_res = lambda_client.create_function(
        FunctionName=lambda_name,
        Runtime='python3.8',
        Role=fn_role,
        Handler="{0}.lambda_handler".format(lambda_name),
        Code={'ZipFile': open("CODE_FILE_PATH.ZIP", 'rb').read(), },
    )
    fn_arn = create_res['FunctionArn']
    cron = "0/5 9-18 * 2 ? 2020"
    rule_name = "sb_".format(lambda_name)
    
    rule_res = events_client.put_rule(
        Name=rule_name,
        ScheduleExpression='cron({})'.format(cron),
        State='ENABLED',
    )
    lambda_client.add_permission(
        FunctionName=lambda_name,
        StatementId="{0}-Event".format(rule_name),
        Action='lambda:InvokeFunction',
        Principal='events.amazonaws.com',
        SourceArn=rule_res['RuleArn'],
    )
    events_client.put_targets(
        Rule=rule_name,
        Targets=[
            {
                'Id': "target_" + (SOME_ID),
                'Arn': fn_arn,
            },
        ]
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2019-03-03
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多