Skip to content

Commit 22affd6

Browse files
honglubrettstack
authored andcommitted
feat: add support for using 'AWS::Region' in Ref and Sub (#855)
1 parent 972b610 commit 22affd6

File tree

8 files changed

+143
-1
lines changed

8 files changed

+143
-1
lines changed

samtranslator/intrinsics/actions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ def handler_method(full_ref, ref_value):
371371
"""
372372

373373
# RegExp to find pattern "${logicalId.property}" and return the word inside bracket
374-
logical_id_regex = '[A-Za-z0-9\.]+'
374+
logical_id_regex = '[A-Za-z0-9\.]+|AWS::[A-Z][A-Za-z]*'
375375
ref_pattern = re.compile(r'\$\{(' + logical_id_regex + ')\}')
376376

377377
# Find all the pattern, and call the handler to decide how to substitute them.

samtranslator/translator/translator.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import copy
2+
import boto3
23

34
from samtranslator.model import ResourceTypeResolver, sam_resources
45
from samtranslator.translator.verify_logical_id import verify_unique_logical_id
@@ -48,6 +49,7 @@ def translate(self, sam_template, parameter_values):
4849
# Create & Install plugins
4950
sam_plugins = prepare_plugins(self.plugins)
5051
parameter_values = self._add_default_parameter_values(sam_template, parameter_values)
52+
parameter_values = self._add_pseudo_parameter_values(parameter_values)
5153

5254
self.sam_parser.parse(
5355
sam_template=sam_template,
@@ -205,6 +207,12 @@ def _add_default_parameter_values(self, sam_template, parameter_values):
205207

206208
return default_values
207209

210+
def _add_pseudo_parameter_values(self, parameter_values):
211+
updated_parameter_values = copy.deepcopy(parameter_values)
212+
if 'AWS::Region' not in updated_parameter_values:
213+
updated_parameter_values['AWS::Region'] = boto3.session.Session().region_name
214+
return updated_parameter_values
215+
208216

209217
def prepare_plugins(plugins):
210218
"""

tests/intrinsics/test_actions.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,23 @@ def test_sub_all_refs_with_dict_input(self):
419419

420420
self.assertEqual(expected, result)
421421

422+
def test_sub_all_refs_with_pseudo_parameters(self):
423+
parameters = {
424+
"key1": "value1",
425+
"AWS::Region": "ap-southeast-1"
426+
}
427+
input = {
428+
"Fn::Sub": "hello ${AWS::Region} ${key1}"
429+
}
430+
expected = {
431+
"Fn::Sub": "hello ap-southeast-1 value1"
432+
}
433+
434+
sub = SubAction()
435+
result = sub.resolve_parameter_refs(input, parameters)
436+
437+
self.assertEqual(expected, result)
438+
422439
class TestSubInternalMethods(TestCase):
423440

424441
@patch.object(SubAction, "_sub_all_refs")

tests/translator/input/layers_with_intrinsics.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,15 @@ Resources:
3434
ContentUri: s3://sam-demo-bucket/layer.zip
3535
LayerName: !Sub layer-${LayerNameParam}
3636

37+
LayerWithRefNameIntrinsicRegion:
38+
Type: AWS::Serverless::LayerVersion
39+
Properties:
40+
ContentUri: s3://sam-demo-bucket/layer.zip
41+
LayerName: !Ref 'AWS::Region'
42+
43+
LayerWithSubNameIntrinsicRegion:
44+
Type: AWS::Serverless::LayerVersion
45+
Properties:
46+
ContentUri: s3://sam-demo-bucket/layer.zip
47+
LayerName: !Sub 'layer-${AWS::Region}'
48+

tests/translator/output/aws-cn/layers_with_intrinsics.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,30 @@
2424
"LayerName": "SomeLayerName"
2525
}
2626
},
27+
"LayerWithRefNameIntrinsicRegion186db7e435": {
28+
"DeletionPolicy": "Retain",
29+
"Type": "AWS::Lambda::LayerVersion",
30+
"Properties": {
31+
"Content": {
32+
"S3Bucket": "sam-demo-bucket",
33+
"S3Key": "layer.zip"
34+
},
35+
"LayerName": "cn-north-1"
36+
}
37+
},
38+
"LayerWithSubNameIntrinsicRegionfbc3f9f13d": {
39+
"DeletionPolicy": "Retain",
40+
"Type": "AWS::Lambda::LayerVersion",
41+
"Properties": {
42+
"Content": {
43+
"S3Bucket": "sam-demo-bucket",
44+
"S3Key": "layer.zip"
45+
},
46+
"LayerName": {
47+
"Fn::Sub": "layer-cn-north-1"
48+
}
49+
}
50+
},
2751
"LayerWithRuntimesIntrinsic1a006faa85": {
2852
"DeletionPolicy": "Retain",
2953
"Type": "AWS::Lambda::LayerVersion",

tests/translator/output/aws-us-gov/layers_with_intrinsics.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,30 @@
2424
"LayerName": "SomeLayerName"
2525
}
2626
},
27+
"LayerWithRefNameIntrinsicRegionad31c93c8b": {
28+
"DeletionPolicy": "Retain",
29+
"Type": "AWS::Lambda::LayerVersion",
30+
"Properties": {
31+
"Content": {
32+
"S3Bucket": "sam-demo-bucket",
33+
"S3Key": "layer.zip"
34+
},
35+
"LayerName": "us-gov-west-1"
36+
}
37+
},
38+
"LayerWithSubNameIntrinsicRegion5b2c74d55e": {
39+
"DeletionPolicy": "Retain",
40+
"Type": "AWS::Lambda::LayerVersion",
41+
"Properties": {
42+
"Content": {
43+
"S3Bucket": "sam-demo-bucket",
44+
"S3Key": "layer.zip"
45+
},
46+
"LayerName": {
47+
"Fn::Sub": "layer-us-gov-west-1"
48+
}
49+
}
50+
},
2751
"LayerWithRuntimesIntrinsic1a006faa85": {
2852
"DeletionPolicy": "Retain",
2953
"Type": "AWS::Lambda::LayerVersion",

tests/translator/output/layers_with_intrinsics.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,30 @@
2424
"LayerName": "SomeLayerName"
2525
}
2626
},
27+
"LayerWithRefNameIntrinsicRegion32bf7198a5": {
28+
"DeletionPolicy": "Retain",
29+
"Type": "AWS::Lambda::LayerVersion",
30+
"Properties": {
31+
"Content": {
32+
"S3Bucket": "sam-demo-bucket",
33+
"S3Key": "layer.zip"
34+
},
35+
"LayerName": "ap-southeast-1"
36+
}
37+
},
38+
"LayerWithSubNameIntrinsicRegiond71326de24": {
39+
"DeletionPolicy": "Retain",
40+
"Type": "AWS::Lambda::LayerVersion",
41+
"Properties": {
42+
"Content": {
43+
"S3Bucket": "sam-demo-bucket",
44+
"S3Key": "layer.zip"
45+
},
46+
"LayerName": {
47+
"Fn::Sub": "layer-ap-southeast-1"
48+
}
49+
}
50+
},
2751
"LayerWithRuntimesIntrinsic1a006faa85": {
2852
"DeletionPolicy": "Retain",
2953
"Type": "AWS::Lambda::LayerVersion",

tests/translator/test_translator.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,39 @@ def test_add_default_parameter_values_must_ignore_invalid_template_parameters(se
731731
sam_template, parameter_values)
732732
self.assertEqual(expected, result)
733733

734+
@patch('boto3.session.Session.region_name', 'ap-southeast-1')
735+
def test_add_pseudo_parameter_values_aws_region(self):
736+
parameter_values = {
737+
"Param1": "value1"
738+
}
739+
740+
expected = {
741+
"Param1": "value1",
742+
"AWS::Region": "ap-southeast-1"
743+
}
744+
745+
746+
sam_parser = Parser()
747+
translator = Translator({}, sam_parser)
748+
result = translator._add_pseudo_parameter_values(parameter_values)
749+
self.assertEqual(expected, result)
750+
751+
@patch('boto3.session.Session.region_name', 'ap-southeast-1')
752+
def test_add_pseudo_parameter_values_aws_region_not_override(self):
753+
parameter_values = {
754+
"AWS::Region": "value1"
755+
}
756+
757+
expected = {
758+
"AWS::Region": "value1"
759+
}
760+
761+
762+
sam_parser = Parser()
763+
translator = Translator({}, sam_parser)
764+
result = translator._add_pseudo_parameter_values(parameter_values)
765+
self.assertEqual(expected, result)
766+
734767

735768
class TestTemplateValidation(TestCase):
736769

0 commit comments

Comments
 (0)