docs: def read_creds(profile_name, csv_file = None, mfa_serial_arg = None, mfa_code = None, force_init = False,
                 role_session_name = 'opinel'):
      """
      Read credentials from anywhere (CSV, Environment, Instance metadata, config/credentials)
  
      :param profile_name:
      :param csv_file:
      :param mfa_serial_arg:
      :param mfa_code:
      :param force_init:
      :param role_session_name:
  
      :return:
      """
      first_sts_session = False
      source_profile = None
      role_mfa_serial = None
      expiration = None
      credentials = init_creds()
      role_arn, external_id = read_profile_from_environment_variables()
      if csv_file:
          # Read credentials from a CSV file that was provided
          credentials['AccessKeyId'], credentials['SecretAccessKey'], credentials['SerialNumber'] = \
              read_creds_from_csv(csv_file)
      elif profile_name == 'default':
          # Try reading credentials from environment variables (Issue #11) if the profile name is 'default'
          credentials = read_creds_from_environment_variables()
      if ('AccessKeyId' not in credentials or not credentials['AccessKeyId']) \
              and not csv_file and profile_name == 'default':
          ec2_credentials = read_creds_from_ec2_instance_metadata()
          if ec2_credentials:
              credentials = ec2_credentials
          else:
              ecs_credentials = read_creds_from_ecs_container_metadata()
              if ecs_credentials:
                  credentials = ecs_credentials
          # TODO support lambda
      if role_arn or (not credentials['AccessKeyId'] and not csv_file):
          # Lookup if a role is defined in ~/.aws/config
          if not role_arn:
              role_arn, source_profile, role_mfa_serial, external_id = read_profile_from_aws_config_file(profile_name)
          # Scout2 issue 237 - credentials file may be used to configure role-based profiles...
          if not role_arn:
              role_arn, source_profile, role_mfa_serial, external_id = \
                  read_profile_from_aws_config_file(profile_name, config_file = aws_credentials_file)
          if role_arn:
              # Lookup cached credentials
              try:
                  cached_credentials_filename = get_cached_credentials_filename(profile_name, role_arn)
                  with open(cached_credentials_filename, 'rt') as f:
                      assume_role_data = json.load(f)
                      oldcred = credentials
                      credentials = assume_role_data['Credentials']
                      expiration = dateutil.parser.parse(credentials['Expiration'])
                      expiration = expiration.replace(tzinfo=None)
                      current = datetime.datetime.utcnow()
                      if expiration < current:
                          print('Role\'s credentials have expired on %s' % credentials['Expiration'])
                          credentials = oldcred
              except Exception as e:
                  pass
              if not expiration or expiration < current or credentials['AccessKeyId'] == None:
                  if source_profile:
                      credentials = read_creds(source_profile)
                  if role_mfa_serial:
                      credentials['SerialNumber'] = role_mfa_serial
                      # Auto prompt for a code...
                      if not mfa_code:
                          credentials['TokenCode'] = prompt_4_mfa_code()
                  if external_id:
                      credentials['ExternalId'] = external_id
                  credentials = assume_role(profile_name, credentials, role_arn, role_session_name)
          # Read from ~/.aws/credentials
          else:
              credentials = read_creds_from_aws_credentials_file(profile_name)
              if credentials['SessionToken']:
                  if 'Expiration' in credentials and credentials['Expiration']:
                      expiration = dateutil.parser.parse(credentials['Expiration'])
                      expiration = expiration.replace(tzinfo=None)
                      current = datetime.datetime.utcnow()
                      if expiration < current:
                          printInfo('Saved STS credentials expired on %s' % credentials['Expiration'])
                          force_init = True
                  else:
                      force_init = True
                      sts_credentials = credentials
              else:
                  first_sts_session = True
              if force_init or (mfa_serial_arg and mfa_code):
                  credentials = read_creds_from_aws_credentials_file(profile_name if first_sts_session
                                                                     else '%s-nomfa' % profile_name)
                  if not credentials['AccessKeyId']:
                      printInfo('Warning: Unable to determine STS token expiration; later API calls may fail.')
                      credentials = sts_credentials
                  else:
                      if mfa_serial_arg:
                          credentials['SerialNumber'] = mfa_serial_arg
                      if mfa_code:
                          credentials['TokenCode'] = mfa_code
                      if 'AccessKeyId' in credentials and credentials['AccessKeyId']:
                          credentials = init_sts_session(profile_name, credentials)
      # If we don't have valid creds by now, print an error message
      if 'AccessKeyId' not in credentials or credentials['AccessKeyId'] == None or \
              'SecretAccessKey' not in credentials or credentials['SecretAccessKey'] == None:
          printError('Error: could not find AWS credentials. Use the --help option for more information.')
      if not 'AccessKeyId' in credentials:
          credentials = { 'AccessKeyId': None }
      return credentials