serverless-localstack icon indicating copy to clipboard operation
serverless-localstack copied to clipboard

AttributeError: 'str' object has no attribute 'get' Error when deploying lambdas via serverless-localstack

Open adrtorre opened this issue 3 years ago • 3 comments

2022-01-20T05:14:29.300:DEBUG:localstack.utils.cloudformation.template_deployer: Error applying changes for CloudFormation stack "CFN_STACKNAME": 'str' object has no attribute 'get' Traceback (most recent call last):

aws-mocks                       |   File "/opt/code/localstack/localstack/utils/cloudformation/template_deployer.py", line 1525, in _run
aws-mocks                       |     self.do_apply_changes_in_loop(changes, stack, stack_name)
aws-mocks                       |   File "/opt/code/localstack/localstack/utils/cloudformation/template_deployer.py", line 1597, in do_apply_changes_in_loop
aws-mocks                       |     self.apply_change(change, stack, new_resources, stack_name=stack_name)
aws-mocks                       |   File "/opt/code/localstack/localstack/utils/cloudformation/template_deployer.py", line 1666, in apply_change
aws-mocks                       |     result = update_resource(resource_id, new_resources, stack_name)
aws-mocks                       |   File "/opt/code/localstack/localstack/utils/cloudformation/template_deployer.py", line 780, in update_resource
aws-mocks                       |     result = instance.update_resource(resource, stack_name=stack_name, resources=resources)
aws-mocks                       |   File "/opt/code/localstack/localstack/services/cloudformation/models/awslambda.py", line 78, in update_resource
aws-mocks                       |     return client.update_function_configuration(**update_config_props)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/client.py", line 391, in _api_call
aws-mocks                       |     return self._make_api_call(operation_name, kwargs)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/client.py", line 705, in _make_api_call
aws-mocks                       |     http, parsed_response = self._make_request(
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/client.py", line 725, in _make_request
aws-mocks                       |     return self._endpoint.make_request(operation_model, request_dict)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/endpoint.py", line 104, in make_request
aws-mocks                       |     return self._send_request(request_dict, operation_model)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/endpoint.py", line 136, in _send_request
aws-mocks                       |     success_response, exception = self._get_response(
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/endpoint.py", line 167, in _get_response
aws-mocks                       |     success_response, exception = self._do_get_response(
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/endpoint.py", line 218, in _do_get_response
aws-mocks                       |     parsed_response = parser.parse(
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 245, in parse
aws-mocks                       |     parsed = self._do_parse(response, shape)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 844, in _do_parse
aws-mocks                       |     self._add_modeled_parse(response, shape, final_parsed)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 853, in _add_modeled_parse
aws-mocks                       |     self._parse_payload(response, shape, member_shapes, final_parsed)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 894, in _parse_payload
aws-mocks                       |     body_parsed = self._parse_shape(shape, original_parsed)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 312, in _parse_shape
aws-mocks                       |     return handler(shape, node)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 641, in _handle_structure
aws-mocks                       |     final_parsed[member_name] = self._parse_shape(
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 312, in _parse_shape
aws-mocks                       |     return handler(shape, node)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 949, in _handle_list
aws-mocks                       |     return super(BaseRestParser, self)._handle_list(shape, node)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 320, in _handle_list
aws-mocks                       |     parsed.append(self._parse_shape(member_shape, item))
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 312, in _parse_shape
aws-mocks                       |     return handler(shape, node)
aws-mocks                       |   File "/opt/code/localstack/.venv/lib/python3.8/site-packages/botocore/parsers.py", line 639, in _handle_structure
aws-mocks                       |     raw_value = value.get(json_name)
aws-mocks                       | AttributeError: 'str' object has no attribute 'get'
aws-mocks                       | 

adrtorre avatar Jan 20 '22 05:01 adrtorre

Hi @adrtorre , thanks for reporting, and apologies for the long delay. This looks more like an issue in LocalStack itself, not related to the Serverless plugin. Can you help us and provide a small example configuration, so we can replicate the issue end-to-end?

Also, we've made a number of enhancements in the meantime - can you please double-check if the problem persists after pulling the latest Docker image? Thanks!

whummer avatar May 21 '22 22:05 whummer

I'm having the same issue with a Chalice app when I try to redeploy/update an lambda. Upgrading to the latest version (1.1.1.dev) doesn't seem to help. I have to completely shut down localstack and restart in order to deploy a new version of my lambda.

Updating lambda function: my_app-local-my_function
Traceback (most recent call last):
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/cli/__init__.py", line 636, in main
    return cli(obj={})
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/click/decorators.py", line 26, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/cli/__init__.py", line 189, in deploy
    deployed_values = d.deploy(config, chalice_stage_name=stage)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/deploy/deployer.py", line 376, in deploy
    return self._deploy(config, chalice_stage_name)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/deploy/deployer.py", line 392, in _deploy
    self._executor.execute(plan)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/deploy/executor.py", line 42, in execute
    getattr(self, '_do_%s' % instruction.__class__.__name__.lower(),
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/deploy/executor.py", line 55, in _do_apicall
    result = method(**final_kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/awsclient.py", line 884, in update_function
    self._update_function_config(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/awsclient.py", line 971, in _update_function_config
    self._do_update_function_config(function_name, kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/awsclient.py", line 977, in _do_update_function_config
    result = self._call_client_method_with_retries(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/chalice/awsclient.py", line 1895, in _call_client_method_with_retries
    response = method(**kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/client.py", line 512, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/client.py", line 902, in _make_api_call
    http, parsed_response = self._make_request(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/client.py", line 925, in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/endpoint.py", line 119, in make_request
    return self._send_request(request_dict, operation_model)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/endpoint.py", line 199, in _send_request
    success_response, exception = self._get_response(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/endpoint.py", line 241, in _get_response
    success_response, exception = self._do_get_response(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/endpoint.py", line 308, in _do_get_response
    parsed_response = parser.parse(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 251, in parse
    parsed = self._do_parse(response, shape)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 871, in _do_parse
    self._add_modeled_parse(response, shape, final_parsed)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 881, in _add_modeled_parse
    self._parse_payload(response, shape, member_shapes, final_parsed)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 923, in _parse_payload
    body_parsed = self._parse_shape(shape, original_parsed)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 331, in _parse_shape
    return handler(shape, node)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 662, in _handle_structure
    final_parsed[member_name] = self._parse_shape(
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 331, in _parse_shape
    return handler(shape, node)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 982, in _handle_list
    return super()._handle_list(shape, node)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 339, in _handle_list
    parsed.append(self._parse_shape(member_shape, item))
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 331, in _parse_shape
    return handler(shape, node)
  File "/Users/myhome/.pyenv/versions/3.9.12/envs/my_app/lib/python3.9/site-packages/botocore/parsers.py", line 660, in _handle_structure
    raw_value = value.get(json_name)
AttributeError: 'str' object has no attribute 'get'

dhay avatar Sep 23 '22 15:09 dhay

Thanks for reporting @adrtorre @dhay - can you please share the details of your function configuration. Is your Lambda function configured with Lambda layers, by any chance? Would be great if you can share your client code / configuration, to make it easier for us to replicate the issue.. Thanks!

whummer avatar Sep 24 '22 16:09 whummer

Hi again @dhay @adrtorre Closing this issue as resolved - according to our testing, this should be resolved with the latest version of the Docker image. Please do let us know if the problem persists.. Thanks!

whummer avatar Jan 20 '23 20:01 whummer