docstr: Discovers and applies CloudWatch config updates as required.
  
  Args:
      is_head_node: whether this node is the head node.
docstr_tok: ["Discovers","and","applies","CloudWatch","config","updates","as","required",".","Args",":","is_head_node",":","whether","this","node","is","the","head","node","."]
code: def update_from_config(self, is_head_node: bool) -> None:
      """Discovers and applies CloudWatch config updates as required.
  
      Args:
          is_head_node: whether this node is the head node.
      """
      for config_type in CloudwatchConfigType:
          if CloudwatchHelper.cloudwatch_config_exists(
              self.provider_config, config_type.value
          ):
              self._update_cloudwatch_config(
                  config_type.value, is_head_node
              )
  
imports: import copy
  import hashlib
  import json
  import logging
  import os
  import time
  from enum import Enum
  from typing import Any, Callable, Dict, List, Union
  import botocore
  from ray.autoscaler._private.aws.utils import client_cache, resource_cache
  from ray.autoscaler.tags import NODE_KIND_HEAD, TAG_RAY_CLUSTER_NAME, TAG_RAY_NODE_KIND
label_desc: Use image node_id 2 for calling the CloudwatchHelper obj's underlying member method code with example usage: obj.update_from_config(is_head_node) without return types