async request(service, method, params, options) {
    // TODO: Determine calling module and log that
    const requestOptions = _.isObject(options) ? options : {}
    const shouldCache = _.get(requestOptions, 'useCache', false)
    // Copy is required as the credentials may be modified during the request
    const credentials = await this.getCredentials()
    const serviceOptions = {
      name: service,
      params: {
        ...credentials,
        region: _.get(requestOptions, 'region', this.getRegion()),
        isS3TransferAccelerationEnabled: this.isS3TransferAccelerationEnabled(),
      },
    }
    return (shouldCache ? awsRequest.memoized : awsRequest)(
      serviceOptions,
      method,
      params,
    )
  }
Execute an AWS request by calling the AWS SDK
@param {string} service - Service name
@param {string} method - Method name
@param {Object} params - Parameters
@param {Object} [options] - Options to modify the request behavior
@prop [options.useCache] - Utilize cache to retrieve results
@prop [options.region] - Specify when to request to different region