class_docstr: S3Driver
  
  This PersistenceDriver uses AWS S3 as the backing layer. The entire table is stored in a single
  large S3 file.
  
  Upon initialization, the S3 file is loaded, decompressed, decoded, and loaded into memory as
  a Python dict.
  
  To improve performance, the decoded contents of the S3 file are cached in-memory for up to
  "cache_refresh_minutes" in minutes of time, after which they are reloaded from S3.
  
  (!) NOTE: Tweaking the cache_refresh_minutes will likely not help memory performance of your
      LookupTable. If you are having memory issues on your Lambda, try using the DynamoDBDriver.
code: def __init__(self, configuration):
      # Example configuration:
      # {
      #     "driver": "s3",
      #     "bucket": "airbnb.sample.lookuptable",
      #     "key": "resource_map.gz",
      #     "cache_refresh_minutes": 10,
      #     "compression": "gzip"
      # },
  
      super(S3Driver, self).__init__(configuration)
  
      self._s3_bucket = configuration["bucket"]
      self._s3_key = configuration["key"]
      self._compression = configuration.get("compression", False)
      self._cache_refresh_minutes = configuration.get(
          "cache_refresh_minutes", self._DEFAULT_CACHE_REFRESH_MINUTES
      )
  
      self._cache = DriverCache(maximum_key_count=0)
  
      # S3 cannot support a per-key TTL so I use a separate DriverCache that stores
      # the global cache invalidation timer.
      self._cache_clock = DriverCache()
      self._dirty = False
  
      # Explicitly set timeout for S3 connection. The boto default timeout is 60 seconds.
      boto_config = boto_helpers.default_config(timeout=10)
  
      self._s3_adapter = S3Adapter(
          self,
          boto3.resource("s3", config=boto_config),
          self._s3_bucket,
          self._s3_key,
      )
  
imports: import json
  import sys
  import time
  import zlib
  import boto3
  from botocore.exceptions import ClientError, ConnectTimeoutError, ReadTimeoutError
  import streamalert.shared.helpers.boto
  from streamalert.shared.logger import get_logger
  from streamalert.shared.lookup_tables.cache import DriverCache
  from streamalert.shared.lookup_tables.drivers import PersistenceDriver
  from streamalert.shared.lookup_tables.errors import LookupTablesCommitError, LookupTablesInitializationError
label_desc: Use image node_id 1 to create a new S3Driver object from inherited base classes: PersistenceDriver with example: obj = S3Driver(configuration)