Skip to content

Commit 30ecbc1

Browse files
authored
Replace parameters when both transforms (#3861)
1 parent 0e3017f commit 30ecbc1

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

src/cfnlint/template/transforms/_sam.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from cfnlint.data import Serverless
1919
from cfnlint.decode.utils import convert_dict
20-
from cfnlint.helpers import load_resource
20+
from cfnlint.helpers import ensure_list, is_function, load_resource
2121
from cfnlint.template.transforms._types import TransformResult
2222

2323
LOGGER = logging.getLogger("cfnlint")
@@ -100,11 +100,10 @@ def _replace_local_codeuri(self):
100100
Transform._update_to_s3_uri("CodeUri", resource_dict)
101101
auto_publish_alias = resource_dict.get("AutoPublishAlias")
102102
if isinstance(auto_publish_alias, dict):
103-
if len(auto_publish_alias) == 1:
104-
for k, v in auto_publish_alias.items():
105-
if k == "Ref":
106-
if v in self._template.get("Parameters"):
107-
self._parameters[v] = "Alias"
103+
k, v = is_function(auto_publish_alias)
104+
if k == "Ref":
105+
if v in self._template.get("Parameters"):
106+
self._parameters[v] = "Alias"
108107
if isinstance(resource_dict.get("AutoPublishCodeSha256"), dict):
109108
resource_dict["AutoPublishCodeSha256"] = "fakesha"
110109
if resource_type in ["AWS::Serverless::LayerVersion"]:
@@ -130,6 +129,33 @@ def _replace_local_codeuri(self):
130129
):
131130
Transform._update_to_s3_uri("DefinitionUri", resource_dict)
132131

132+
def _find_and_replace(self, item, parameters):
133+
134+
k, v = is_function(item)
135+
if k == "Ref":
136+
if v in parameters:
137+
return parameters[v]
138+
if isinstance(item, dict):
139+
for k, v in item.items():
140+
item[k] = self._find_and_replace(v, parameters)
141+
if isinstance(item, list):
142+
for i, v in enumerate(item):
143+
item[i] = self._find_and_replace(v, parameters)
144+
145+
return item
146+
147+
def _replace_variables_with_language_extension(self):
148+
transforms = self._template.get("Transform", [])
149+
150+
transforms = ensure_list(transforms)
151+
if "AWS::LanguageExtensions" in transforms:
152+
parameters = {}
153+
for k, v in self._template.get("Parameters", {}).items():
154+
if isinstance(v, dict) and v.get("Default"):
155+
parameters[k] = v.get("Default")
156+
157+
self._template = self._find_and_replace(self._template, parameters)
158+
133159
def transform_template(self):
134160
"""
135161
Transform the Template using the Serverless Application Model.
@@ -144,6 +170,7 @@ def transform_template(self):
144170
managed_policy_map=self._managed_policy_map, sam_parser=self._sam_parser
145171
)
146172

173+
self._replace_variables_with_language_extension()
147174
self._replace_local_codeuri()
148175

149176
# Tell SAM to use the region we're linting in, this has to be

test/fixtures/templates/good/transform/language_extension.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ Conditions:
77
Parameters:
88
DBPolicy:
99
Type: String
10+
AutoPublishAliasParameter:
11+
Type: String
12+
Default: TestAliasRef
1013
Mappings:
1114
StackIdMap01:
1215
teststack1:
@@ -38,3 +41,25 @@ Resources:
3841
- "Retain"
3942
- "Delete"
4043
DeletionPolicy: "Retain"
44+
TestStateMachine:
45+
Type: AWS::Serverless::StateMachine
46+
Properties:
47+
Name: StateMachine
48+
AutoPublishAlias: !Ref AutoPublishAliasParameter
49+
Definition:
50+
StartAt: MyLambdaState
51+
States:
52+
MyLambdaState:
53+
Type: Task
54+
Resource: arn:aws:lambda:us-east-1:<REDACTED>:function:print-event
55+
End: true
56+
57+
TestLambdaFunction:
58+
Type: AWS::Serverless::Function
59+
Properties:
60+
Handler: index.handler
61+
Runtime: python3.9
62+
InlineCode: |
63+
def handler(event, context):
64+
print("Hello, world!")
65+
AutoPublishAlias: !Ref AutoPublishAliasParameter

0 commit comments

Comments
 (0)