def _create_cloud_watch_rule_from_meta(name, meta, region): # validation depends on rule type required_parameters = ['rule_type'] rule_type = meta.get('rule_type') if rule_type: if rule_type == 'schedule': required_parameters.append('expression') validate_params(name, meta, required_parameters) event_buses = meta.get('event_bus_accounts') response = CONN.cw_events(region).get_rule(name) if response: _LOG.warn('%s rule exists in %s.', name, region) return describe_rule(name=name, meta=meta, region=region, response=response) try: func = RULE_TYPES[rule_type] func(name, meta, CONN.cw_events(region)) if event_buses: time.sleep(5) _attach_tenant_rule_targets(name, region, event_buses) _LOG.info('Created cloud watch rule %s in %s.', name, region) response = CONN.cw_events(region).get_rule(name) time.sleep(5) return describe_rule(name=name, meta=meta, region=region, response=response) except KeyError: raise AssertionError( 'Invalid rule type: {0} for resource {1}. ' 'Please, change rule type with existing: ' 'schedule|ec2|api_call.'.format(rule_type, name))
def _create_cloud_watch_trigger_from_meta(topic_name, trigger_meta, region): required_parameters = ['target_rule'] validate_params(topic_name, trigger_meta, required_parameters) rule_name = trigger_meta['target_rule'] topic_arn = CONN.sns(region).get_topic_arn(topic_name) CONN.cw_events(region).add_rule_target(rule_name, topic_arn) CONN.sns(region).allow_service_invoke(topic_arn, 'events.amazonaws.com') _LOG.info('SNS topic %s subscribed to cloudwatch rule %s', topic_name, rule_name)
def _remove_cloud_watch_rule(arn, config): region = arn.split(':')[3] resource_name = config['resource_name'] try: CONN.cw_events(region).remove_rule(resource_name) _LOG.info('Rule %s was removed', resource_name) except ClientError as e: exception_type = e.response['Error']['Code'] if exception_type == 'ResourceNotFoundException': _LOG.warn('Rule %s is not found', resource_name) else: raise e
def _create_cloud_watch_trigger_from_meta(lambda_name, lambda_arn, role_name, trigger_meta): required_parameters = ['target_rule'] validate_params(lambda_name, trigger_meta, required_parameters) rule_name = trigger_meta['target_rule'] rule_arn = CONN.cw_events().get_rule_arn(rule_name) CONN.cw_events().add_rule_target(rule_name, lambda_arn) _LAMBDA_CONN.add_invocation_permission(lambda_arn, 'events.amazonaws.com', rule_arn) _LOG.info('Lambda %s subscribed to cloudwatch rule %s', lambda_name, rule_name)
def _attach_tenant_rule_targets(rule_name, region, event_buses): for event_bus in event_buses: target_arn = 'arn:aws:events:{0}:{1}:event-bus/default'.format(region, event_bus) existing_targets = CONN.cw_events(region).list_targets_by_rule( rule_name=rule_name) for target in existing_targets: if target['Arn'] == target_arn: _LOG.debug('Target to event bus %s is already attached', target_arn) return CONN.cw_events(region).add_rule_target(rule_name=rule_name, target_arn=target_arn)
def _create_cloud_watch_trigger_from_meta(name, trigger_meta): required_parameters = ['target_rule', 'input', 'iam_role'] validate_params(name, trigger_meta, required_parameters) rule_name = trigger_meta['target_rule'] input = trigger_meta['input'] sf_role = trigger_meta['iam_role'] sf_arn = _build_sm_arn(name, CONFIG.region) sf_description = _SF_CONN.describe_state_machine(arn=sf_arn) if sf_description.get('status') == 'ACTIVE': sf_role_arn = _IAM_CONN.check_if_role_exists(sf_role) if sf_role_arn: CONN.cw_events().add_rule_sf_target(rule_name, sf_arn, input, sf_role_arn) _LOG.info('State machine %s subscribed to cloudwatch rule %s', name, rule_name)
def describe_rule_from_meta(name, meta): new_region_args = create_args_for_multi_region( [ {'name': name, 'meta': meta} ], ALL_REGIONS) responses = [] for arg in new_region_args: rule = CONN.cw_events(arg['region']).get_rule(name) if rule: responses.append(rule) description = [] for rule in responses: arn = rule['Arn'] del rule['Arn'] description.append({arn: build_description_obj(rule, name, meta)}) return description
def describe_rule(name, meta, region, response=None): if not response: response = CONN.cw_events(region).get_rule(name) arn = response['Arn'] del response['Arn'] return {arn: build_description_obj(response, name, meta)}