SSM parameters in cloudformation (AWS::SSM::Parameter::) are not recognized and resolved for default values (#4042)
* Add ssm parsing support for cloudformation stacks
This commit is contained in:
parent
315c357cd5
commit
70a7a7e0a0
@ -504,11 +504,26 @@ class ResourceMap(collections_abc.Mapping):
|
|||||||
key = s3_backend.get_object(bucket_name, name)
|
key = s3_backend.get_object(bucket_name, name)
|
||||||
self._parsed_resources.update(json.loads(key.value))
|
self._parsed_resources.update(json.loads(key.value))
|
||||||
|
|
||||||
|
def parse_ssm_parameter(self, value, value_type):
|
||||||
|
|
||||||
|
# The Value in SSM parameters is the SSM parameter path
|
||||||
|
# we need to use ssm_backend to retreive the
|
||||||
|
# actual value from parameter store
|
||||||
|
parameter = ssm_backends[self._region_name].get_parameter(value, False)
|
||||||
|
actual_value = parameter.value
|
||||||
|
if value_type.find("List") > 0:
|
||||||
|
return actual_value.split(",")
|
||||||
|
return actual_value
|
||||||
|
|
||||||
def load_parameters(self):
|
def load_parameters(self):
|
||||||
parameter_slots = self._template.get("Parameters", {})
|
parameter_slots = self._template.get("Parameters", {})
|
||||||
for parameter_name, parameter in parameter_slots.items():
|
for parameter_name, parameter in parameter_slots.items():
|
||||||
# Set the default values.
|
# Set the default values.
|
||||||
self.resolved_parameters[parameter_name] = parameter.get("Default")
|
value = parameter.get("Default")
|
||||||
|
value_type = parameter.get("Type")
|
||||||
|
if value_type.startswith("AWS::SSM::Parameter::") and value:
|
||||||
|
value = self.parse_ssm_parameter(value, value_type)
|
||||||
|
self.resolved_parameters[parameter_name] = value
|
||||||
|
|
||||||
# Set any input parameters that were passed
|
# Set any input parameters that were passed
|
||||||
self.no_echo_parameter_keys = []
|
self.no_echo_parameter_keys = []
|
||||||
@ -517,23 +532,8 @@ class ResourceMap(collections_abc.Mapping):
|
|||||||
parameter_slot = parameter_slots[key]
|
parameter_slot = parameter_slots[key]
|
||||||
|
|
||||||
value_type = parameter_slot.get("Type", "String")
|
value_type = parameter_slot.get("Type", "String")
|
||||||
|
|
||||||
def _parse_ssm_parameter(value, value_type):
|
|
||||||
# The Value in SSM parameters is the SSM parameter path
|
|
||||||
# we need to use ssm_backend to retreive the
|
|
||||||
# actual value from parameter store
|
|
||||||
parameter = ssm_backends[self._region_name].get_parameter(
|
|
||||||
value, False
|
|
||||||
)
|
|
||||||
actual_value = parameter.value
|
|
||||||
|
|
||||||
if value_type.find("List") > 0:
|
|
||||||
return actual_value.split(",")
|
|
||||||
|
|
||||||
return actual_value
|
|
||||||
|
|
||||||
if value_type.startswith("AWS::SSM::Parameter::"):
|
if value_type.startswith("AWS::SSM::Parameter::"):
|
||||||
value = _parse_ssm_parameter(value, value_type)
|
value = self.parse_ssm_parameter(value, value_type)
|
||||||
if value_type == "CommaDelimitedList" or value_type.startswith("List"):
|
if value_type == "CommaDelimitedList" or value_type.startswith("List"):
|
||||||
value = value.split(",")
|
value = value.split(",")
|
||||||
|
|
||||||
|
@ -78,7 +78,10 @@ parameters = {
|
|||||||
ssm_parameter = {
|
ssm_parameter = {
|
||||||
"Parameters": {
|
"Parameters": {
|
||||||
"SingleParamCfn": {"Type": "AWS::SSM::Parameter::Value<String>"},
|
"SingleParamCfn": {"Type": "AWS::SSM::Parameter::Value<String>"},
|
||||||
"ListParamCfn": {"Type": "AWS::SSM::Parameter::Value<List<String>>"},
|
"ListParamCfn": {
|
||||||
|
"Type": "AWS::SSM::Parameter::Value<List<String>>",
|
||||||
|
"Default": "/path/to/list/param",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -537,3 +540,18 @@ def test_ssm_parameter_parsing():
|
|||||||
stack.resource_map.resolved_parameters["ListParamCfn"].should.equal(
|
stack.resource_map.resolved_parameters["ListParamCfn"].should.equal(
|
||||||
["comma", "separated", "string"]
|
["comma", "separated", "string"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Not passing in a value for ListParamCfn to test Default value
|
||||||
|
if not settings.TEST_SERVER_MODE:
|
||||||
|
stack = FakeStack(
|
||||||
|
stack_id="test_id",
|
||||||
|
name="test_stack",
|
||||||
|
template=ssm_parameter_template_json,
|
||||||
|
parameters={"SingleParamCfn": "/path/to/single/param",},
|
||||||
|
region_name="us-west-1",
|
||||||
|
)
|
||||||
|
|
||||||
|
stack.resource_map.resolved_parameters["SingleParamCfn"].should.equal("string")
|
||||||
|
stack.resource_map.resolved_parameters["ListParamCfn"].should.equal(
|
||||||
|
["comma", "separated", "string"]
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user