Extract all Implicit Apis (Apis defined through Serverless Function with an Api Event

        :param dict resources: Dictionary of SAM/CloudFormation resources
        :return: List of nametuple Api

def _extract_apis(self, resources):
        """
        Extract all Implicit Apis (Apis defined through Serverless Function with an Api Event

        :param dict resources: Dictionary of SAM/CloudFormation resources
        :return: List of nametuple Api
        """

        # Some properties like BinaryMediaTypes, Cors are set once on the resource but need to be applied to each API.
        # For Implicit APIs, which are defined on the Function resource, these properties
        # are defined on a AWS::Serverless::Api resource with logical ID "ServerlessRestApi". Therefore, no matter
        # if it is an implicit API or an explicit API, there is a corresponding resource of type AWS::Serverless::Api
        # that contains these additional configurations.
        #
        # We use this assumption in the following loop to collect information from resources of type
        # AWS::Serverless::Api. We also extract API from Serverless::Function resource and add them to the
        # corresponding Serverless::Api resource. This is all done using the ``collector``.

        collector = ApiCollector()

        for logical_id, resource in resources.items():

            resource_type = resource.get(SamApiProvider._TYPE)

            if resource_type == SamApiProvider._SERVERLESS_FUNCTION:
                self._extract_apis_from_function(logical_id, resource, collector)

            if resource_type == SamApiProvider._SERVERLESS_API:
                self._extract_from_serverless_api(logical_id, resource, collector)

        apis = SamApiProvider._merge_apis(collector)
        return self._normalize_apis(apis)