boto/boto3 · error · ResourceNotExistsError

The '{service_name}' resource does not exist. The available

Error message

The '{service_name}' resource does not exist.
The available resources are:
   - {available_services}
[Consider using a boto3.client('{service_name}') instead of a resource for '{service_name}']

What it means

Raised as boto3.exceptions.ResourceNotExistsError by Session.resource() when the loader cannot find a resource model for the requested service_name (UnknownServiceError from load_service_model). The resource API only covers a subset of AWS services that have hand-authored resource models in boto3, so requesting a resource for an unsupported service yields this error, which lists the available resources and, if a low-level client exists, suggests using boto3.client() instead.

Source

Thrown at boto3/session.py:433

            a region_name value passed explicitly to the method.  If
            user_agent_extra is specified in the client config, it overrides
            the default user_agent_extra provided by the resource API. See
            `botocore config documentation
            <https://docs.aws.amazon.com/botocore/latest/reference/config.html>`_
            for more details.

        :return: Subclass of :py:class:`~boto3.resources.base.ServiceResource`
        """
        try:
            resource_model = self._loader.load_service_model(
                service_name, 'resources-1', api_version
            )
        except UnknownServiceError:
            available = self.get_available_resources()
            has_low_level_client = (
                service_name in self.get_available_services()
            )
            raise ResourceNotExistsError(
                service_name, available, has_low_level_client
            )
        except DataNotFoundError:
            # This is because we've provided an invalid API version.
            available_api_versions = self._loader.list_api_versions(
                service_name, 'resources-1'
            )
            raise UnknownAPIVersionError(
                service_name, api_version, ', '.join(available_api_versions)
            )

        if api_version is None:
            # Even though botocore's load_service_model() can handle
            # using the latest api_version if not provided, we need
            # to track this api_version in boto3 in order to ensure
            # we're pairing a resource model with a client model
            # of the same API version.  It's possible for the latest
            # API version of a resource model in boto3 to not be

View on GitHub (pinned to c7b4afac23)

Solutions

  1. Use the low-level client instead: boto3.client('service') — it supports all services.
  2. Check the list in the error message (or boto3.session.Session().get_available_resources()) and correct the service name/casing.
  3. Upgrade boto3 to pick up newer resource models.
  4. If the service name is correct but still missing, it has no resource model — switch your code to the client API for that service.

Example fix

// before
resource = boto3.resource('servicewithnoresource')  # ResourceNotExistsError

// after
client = boto3.client('servicewithnoresource')  # low-level client always works
Defensive patterns

Strategy: fallback

Validate before calling

available_resources = boto3.session.Session().get_available_resources()
if service_name not in available_resources:
    obj = boto3.client(service_name)  # fallback to low-level client
else:
    obj = boto3.resource(service_name)

Type guard

def has_resource_model(service_name: str) -> bool:
    return service_name in boto3.session.Session().get_available_resources()

Try / catch

from boto3.exceptions import ResourceNotExistsError
try:
    obj = boto3.resource(service_name)
except ResourceNotExistsError:
    obj = boto3.client(service_name)  # every AWS service has a client

Prevention

When it happens

Trigger: Calling boto3.resource('service') (or session.resource('service')) for a service without a bundled resource model — e.g. a newer/less-common service, a typo, or a service name using the wrong casing. Also triggered by passing an api_version that resolves to no resource data.

Common situations: Assuming every AWS service has a resource interface; typos or wrong service-name casing (e.g. 'S3' vs 's3'); using a service added after your pinned boto3 version; migrating from client to resource API for a service that has no resource model.

Related errors


AI-assisted analysis of boto/boto3@c7b4afac23 (2026-08-04). Data as JSON: /data/errors/f71db44dd00dd5ce.json. Report an issue: GitHub.