aws-lambda - aws events put-targets 响应为正,但未添加触发器
问题描述
我正在部署一个 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
解决方案
我做了两个观察:首先:在 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,
},
]
)
推荐阅读
- php - iOS推送通知成功使用命令提示符但不是在php中
- scala - scala - 遍历目录中的文件并获取与目录中特定字符串匹配的文件名?
- sql - 通过 DESC 订购的替代方案
- javascript - JavaScript function() 不是函数
- jxbrowser - 如何从 jxbrowser 获取 websocket 数据?
- ios - 无法使用 xpath 在 appium iOS 中找到文本字段,并且名称或 ID 不可用
- numpy - Numpy:沿轴按索引数组选择
- kubernetes - 如何在没有集群级别访问权限的情况下在 AKS 集群中创建 PV?
- java - 将多维数组转换为 Floatbuffer,然后将 OpenGL 纹理转换为批量用于着色器
- linux - 用 sed 替换 log4j 转换模式