async init() {
    logger.debug('initializing')
    // create an instanceId (can be e.g. used when a predictable random value is needed)
    this.instanceId = this.instanceId ?? new Date().getTime().toString()

    // create a new CLI instance
    this.cli = new this.classes.CLI(this)

    // set the options and commands which were processed by the CLI
    this.pluginManager.setCliOptions(this.processedInput.options)
    this.pluginManager.setCliCommands(this.processedInput.commands)
    await this.service.load(this.processedInput.options)

    // load all plugins
    await this.pluginManager.loadAllPlugins(this.service.plugins)
    this.isConfigurationExtendable = false

    // give the CLI the plugins and commands so that it can print out
    // information such as options when the user enters --help
    this.cli.setLoadedPlugins(this.pluginManager.getPlugins())
    this.cli.setLoadedCommands(this.pluginManager.getCommands())
  }
Initializes the serverless instance. This method is responsible for creating
an instance ID, initializing a new CLI instance, setting CLI options and
commands, loading the service and all plugins, and setting the loaded plugins
and commands for the CLI. This is typically called at the start of a
serverless lifecycle.

@async
@throws {Error} If there's an error in loading the service or plugins.