Given a a list of functions and a schedule to execute them,
        setup up regular execution.

def schedule(self):
        """
        Given a a list of functions and a schedule to execute them,
        setup up regular execution.

        """
        events = self.stage_config.get('events', [])

        if events:
            if not isinstance(events, list): # pragma: no cover
                print("Events must be supplied as a list.")
                return

        for event in events:
            self.collision_warning(event.get('function'))

        if self.stage_config.get('keep_warm', True):
            if not events:
                events = []

            keep_warm_rate = self.stage_config.get('keep_warm_expression', "rate(4 minutes)")
            events.append({'name': 'zappa-keep-warm',
                           'function': 'handler.keep_warm_callback',
                           'expression': keep_warm_rate,
                           'description': 'Zappa Keep Warm - {}'.format(self.lambda_name)})

        if events:
            try:
                function_response = self.zappa.lambda_client.get_function(FunctionName=self.lambda_name)
            except botocore.exceptions.ClientError as e: # pragma: no cover
                click.echo(click.style("Function does not exist", fg="yellow") + ", please " +
                           click.style("deploy", bold=True) + "first. Ex:" +
                           click.style("zappa deploy {}.".format(self.api_stage), bold=True))
                sys.exit(-1)

            print("Scheduling..")
            self.zappa.schedule_events(
                lambda_arn=function_response['Configuration']['FunctionArn'],
                lambda_name=self.lambda_name,
                events=events
            )

        # Add async tasks SNS
        if self.stage_config.get('async_source', None) == 'sns' \
           and self.stage_config.get('async_resources', True):
            self.lambda_arn = self.zappa.get_lambda_function(
                function_name=self.lambda_name)
            topic_arn = self.zappa.create_async_sns_topic(
                lambda_name=self.lambda_name,
                lambda_arn=self.lambda_arn
            )
            click.echo('SNS Topic created: %s' % topic_arn)

        # Add async tasks DynamoDB
        table_name = self.stage_config.get('async_response_table', False)
        read_capacity = self.stage_config.get('async_response_table_read_capacity', 1)
        write_capacity = self.stage_config.get('async_response_table_write_capacity', 1)
        if table_name and self.stage_config.get('async_resources', True):
            created, response_table = self.zappa.create_async_dynamodb_table(
                table_name, read_capacity, write_capacity)
            if created:
                click.echo('DynamoDB table created: %s' % table_name)
            else:
                click.echo('DynamoDB table exists: %s' % table_name)
                provisioned_throughput = response_table['Table']['ProvisionedThroughput']
                if provisioned_throughput['ReadCapacityUnits'] != read_capacity or \
                    provisioned_throughput['WriteCapacityUnits'] != write_capacity:
                        click.echo(click.style(
                            "\nWarning! Existing DynamoDB table ({}) does not match configured capacity.\n".format(table_name),
                            fg='red'
                        ))