def export(prefix, search): logger.info('exporting rules') kwargs = {"EventBusName": "default"} if prefix is not None: kwargs["NamePrefix"] = prefix if search is not None: query = "Rules[?contains(Name, '{0}')] | {{Rules: @}}".format(search) kwargs["query"] = query rules = events("list_rules", **kwargs)['Rules'] print(yaml.dump([_export_rule(rule) for rule in rules]))
def _find(names): rules = [] for name in names: rules += events( "list_rules", EventBusName="default", NamePrefix=name )["Rules"] if len(rules) == 0: logger.warn("no rules found for {}".format(names)) return [] return rules
def _targets_for_rule(rule): return events( "list_targets_by_rule", Rule=rule["Name"], EventBusName="default" )["Targets"]
def put(name, cron_expression, function_name, target_input={}, description=None): logger.info("finding lambda function {}".format(function_name)) target_arn = \ _get_target_arn(function_name) or \ _get_target_arn(_namespaced(function_name)) if not target_arn: logger.error("unable to find lambda function for {}".format(function_name)) return logger.debug( "create / update cron rule {0}: {1} for target {2}".format( name, cron_expression, target_arn ) ) if description: rule = events("put_rule", Name=name, ScheduleExpression=cron_expression, Description=description) else: rule = events("put_rule", Name=name, ScheduleExpression=cron_expression) events( "put_targets", Rule=name, Targets=[ { "Id": "1", "Arn": target_arn, "Input": json.dumps(target_input) } ] ) try: logger.debug("setting lambda permission") source_arn = rule["RuleArn"] if source_arn.find(NAMESPACE) > 0: rule_prefix = rule["RuleArn"].split("/{}".format(NAMESPACE))[0] source_arn = "{}/{}*".format(rule_prefix, NAMESPACE) logger.debug("lambda permission SourceArn:{}".format(source_arn)) aws_lambda( "add_permission", FunctionName=target_arn, Action="lambda:InvokeFunction", Principal="events.amazonaws.com", SourceArn=source_arn, StatementId=hashlib.sha1(source_arn.encode("utf-8")).hexdigest() ) except ClientError as error: logger.debug("permission already set. {}".format(error)) for rule in _find([name]): logger.info("rule created/updated:\n{}".format(yaml.dump(_export_rule(rule))))
def _enable(rules): for rule in rules: logger.info("enabling rule {}".format(rule["Name"])) events("enable_rule", Name=rule["Name"])
def _delete(rules): for rule in rules: events("remove_targets", Rule=rule["Name"], Ids=["1"]) events("delete_rule", Name=rule["Name"]) logger.info("rule {} deleted".format(rule["Name"]))