diff --git a/moto/cloudformation/parsing.py b/moto/cloudformation/parsing.py index 6228ade67..dca5a2687 100644 --- a/moto/cloudformation/parsing.py +++ b/moto/cloudformation/parsing.py @@ -745,6 +745,13 @@ class OutputMap(collections_abc.Mapping): def __init__(self, resources, template, stack_id): self._template = template self._stack_id = stack_id + + if "Outputs" in template and template["Outputs"] is None: + raise ValidationError( + stack_id, # not sure why we need to supply this when also supplying message + message="[/Outputs] 'null' values are not allowed in templates", + ) + self._output_json_map = template.get("Outputs") # Create the default resources diff --git a/tests/test_cloudformation/test_stack_parsing.py b/tests/test_cloudformation/test_stack_parsing.py index 81a46dae6..3def8ac29 100644 --- a/tests/test_cloudformation/test_stack_parsing.py +++ b/tests/test_cloudformation/test_stack_parsing.py @@ -56,6 +56,8 @@ output_dict = { } } +null_output = {"Outputs": None} + bad_output = { "Outputs": {"Output1": {"Value": {"Fn::GetAtt": ["Queue", "InvalidAttribute"]}}} } @@ -146,6 +148,7 @@ import_value_template = { } outputs_template = dict(list(dummy_template.items()) + list(output_dict.items())) +null_outputs_template = dict(list(dummy_template.items()) + list(null_output.items())) bad_outputs_template = dict(list(dummy_template.items()) + list(bad_output.items())) get_attribute_outputs_template = dict( list(dummy_template.items()) + list(get_attribute_output.items()) @@ -162,6 +165,7 @@ ssm_parameter_template = dict( dummy_template_json = json.dumps(dummy_template) name_type_template_json = json.dumps(name_type_template) output_type_template_json = json.dumps(outputs_template) +null_output_template_json = json.dumps(null_outputs_template) bad_output_template_json = json.dumps(bad_outputs_template) get_attribute_outputs_template_json = json.dumps(get_attribute_outputs_template) get_availability_zones_template_json = json.dumps(get_availability_zones_template) @@ -316,6 +320,14 @@ def test_parse_stack_with_bad_get_attribute_outputs(): ).should.throw(ValidationError) +def test_parse_stack_with_null_outputs_section(): + FakeStack.when.called_with( + "test_id", "test_stack", null_output_template_json, {}, "us-west-1" + ).should.throw( + ValidationError, "[/Outputs] 'null' values are not allowed in templates" + ) + + def test_parse_stack_with_parameters(): stack = FakeStack( stack_id="test_id",