class_docstr: Centralized config for handling configuration loading/parsing
class_docstr_tok: ["Centralized","config","for","handling","configuration","loading\/parsing"]
docstr: Simple helper function to house the boto3 ssm client get_parameters operations
  
  Args:
      names (list): A list of parameter names to retrieve from the aws ssm
          parameter store
  
  Returns:
      tuple (dict, list): Dictionary with the load parameter names as keys
          and the actual parameter (as a dictionary) as the value. The seconary
          list that is returned contains any invalid parameters that were not loaded
docstr_tok: ["Simple","helper","function","to","house","the","boto3","ssm","client","get_parameters","operations","Args",":","names","(","list",")",":","A","list","of","parameter","names","to","retrieve","from","the","aws","ssm","parameter","store","Returns",":","tuple","(","dict",",","list",")",":","Dictionary","with","the","load","parameter","names","as","keys","and","the","actual","parameter","(","as","a","dictionary",")","as","the","value",".","The","seconary","list","that","is","returned","contains","any","invalid","parameters","that","were","not","loaded"]
code: def _get_parameters(cls, *names):
      """Simple helper function to house the boto3 ssm client get_parameters operations
  
      Args:
          names (list): A list of parameter names to retrieve from the aws ssm
              parameter store
  
      Returns:
          tuple (dict, list): Dictionary with the load parameter names as keys
              and the actual parameter (as a dictionary) as the value. The seconary
              list that is returned contains any invalid parameters that were not loaded
      """
      # Create the ssm boto3 client that will be cached and used throughout this execution
      # if one does not exist already
      if AppConfig.SSM_CLIENT is None:
          boto_config = client.Config(
              connect_timeout=cls.BOTO_TIMEOUT,
              read_timeout=cls.BOTO_TIMEOUT,
          )
          AppConfig.SSM_CLIENT = boto3.client("ssm", config=boto_config)
  
      LOGGER.debug(
          "Retrieving values from parameter store with names: %s",
          ", ".join("'{}'".format(name) for name in names),
      )
      try:
          parameters = AppConfig.SSM_CLIENT.get_parameters(
              Names=list(names), WithDecryption=True
          )
      except ClientError as err:
          joined_names = ", ".join(
              "'{}'".format(name) for name in names
          )
          raise AppConfigError(
              "Could not get parameter with names {}. Error: "
              "{}".format(
                  joined_names, err.response["Error"]["Message"]
              )
          )
  
      decoded_params = {}
      for param in parameters["Parameters"]:
          try:
              decoded_params[param["Name"]] = json.loads(param["Value"])
          except ValueError:
              raise AppConfigError(
                  "Could not load value for parameter with "
                  "name '{}'. The value is not valid json: "
                  "'{}'".format(param["Name"], param["Value"])
              )
  
      return decoded_params, parameters["InvalidParameters"]
  
imports: import calendar
  from datetime import datetime
  import json
  import re
  import time
  import backoff
  import boto3
  from botocore import client
  from botocore.exceptions import ClientError
  from streamalert.apps.exceptions import AppAuthError, AppConfigError, AppStateError
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 14 for calling the AppConfig obj's underlying member method code with example usage: obj._get_parameters(cls) and returns: decoded_params,  parameters