moto icon indicating copy to clipboard operation
moto copied to clipboard

Route53: exception when trying to delete non-existent tag

Open eranbo opened this issue 3 weeks ago • 1 comments

Hi,

I'm using aws-sdk V3.
When trying to delete a non existing tag from hosted zone Route32 I get this error in the console: ... char 'd' is not expected ..

and this error in moto:

    response = self.full_dispatch_request()

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 919, in full_dispatch_request

    rv = self.handle_user_exception(e)

  File "/usr/local/lib/python3.13/site-packages/flask_cors/extension.py", line 176, in wrapped_function

    return cors_after_request(app.make_response(f(*args, **kwargs)))

                                                ~^^^^^^^^^^^^^^^^^

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 917, in full_dispatch_request

    rv = self.dispatch_request()

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 902, in dispatch_request

    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]

           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^

  File "/moto/moto/core/utils.py", line 119, in __call__

    result = self.callback(request, request.url, dict(request.headers))

  File "/moto/moto/route53/urls.py", line 13, in tag_response

    return Route53().list_or_change_tags_for_resource_request(

    

  File "/moto/moto/route53/responses.py", line 379, in list_or_change_tags_for_resource_request

    self.backend.change_tags_for_resource(type_, id_, tags)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^

  File "/moto/moto/route53/models.py", line 678, in change_tags_for_resource

    del self.resource_tags[resource_id][tags["Key"]]

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^

KeyError: 'initial-tag-key'

172.18.0.1 - - [04/Dec/2025 16:56:49] "POST /2013-04-01/tags/hostedzone/4Q2YKW7QKK518MMA0HQY47 HTTP/1.1" 500 -

Error on request:

Traceback (most recent call last):

  File "/usr/local/lib/python3.13/site-packages/werkzeug/serving.py", line 370, in run_wsgi

    execute(self.server.app)

    ~~~~~~~^^^^^^^^^^^^^^^^^

  File "/usr/local/lib/python3.13/site-packages/werkzeug/serving.py", line 331, in execute

    application_iter = app(environ, start_response)

  File "/moto/moto/moto_server/werkzeug_app.py", line 267, in __call__

    return backend_app(environ, start_response)

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 1536, in __call__

    return self.wsgi_app(environ, start_response)

           ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 1514, in wsgi_app

    response = self.handle_exception(e)

  File "/usr/local/lib/python3.13/site-packages/flask_cors/extension.py", line 176, in wrapped_function

    return cors_after_request(app.make_response(f(*args, **kwargs)))

                                                ~^^^^^^^^^^^^^^^^^

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 1511, in wsgi_app

    response = self.full_dispatch_request()

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 919, in full_dispatch_request

    rv = self.handle_user_exception(e)

  File "/usr/local/lib/python3.13/site-packages/flask_cors/extension.py", line 176, in wrapped_function

    return cors_after_request(app.make_response(f(*args, **kwargs)))

                                                ~^^^^^^^^^^^^^^^^^

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 917, in full_dispatch_request

    rv = self.dispatch_request()

  File "/usr/local/lib/python3.13/site-packages/flask/app.py", line 902, in dispatch_request

    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]

           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^

  File "/moto/moto/core/utils.py", line 119, in __call__

    result = self.callback(request, request.url, dict(request.headers))

  File "/moto/moto/route53/urls.py", line 13, in tag_response

    return Route53().list_or_change_tags_for_resource_request(

    

  File "/moto/moto/route53/responses.py", line 379, in list_or_change_tags_for_resource_request

    self.backend.change_tags_for_resource(type_, id_, tags)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^

  File "/moto/moto/route53/models.py", line 678, in change_tags_for_resource

    del self.resource_tags[resource_id][tags["Key"]]

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^

KeyError: 'initial-tag-key'

When trying the same operation from aws cli: $ aws route53 change-tags-for-resource --resource-type hostedzone --resource-id 4Q2YKW7QKK518MMA0HQY47 --remove-tag-keys owner

I get this error: An error occurred (500) when calling the ChangeTagsForResource operation (reached max retries: 2): Internal Server Error

eranbo avatar Dec 04 '25 17:12 eranbo

Definitely a bug. Thank you for reporting it. You've identified all the information needed for a quick fix... PRs welcome! 😉

bpandola avatar Dec 05 '25 22:12 bpandola