AttributeError: 'str' object has no attribute 'get' Error when deploying lambdas via serverless-localstack
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 |
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!
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'
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!
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!