Repository: aws-cloudformation/cfn-lint

Issue:
Update I1022 to only suggest sub if all values can be in the sub
### CloudFormation Lint Version

0.64.1

### What operating system are you using?

All

### Describe the bug

Original feedback provided by @iann0036.  Translated to an issue for tracking.

```yaml
Fn::Join:
  - ""
  - - Fn::Select:
       - 0
       - Fn::Split:
          - "/"
          - !Ref MySubnet1CIDR
    - !Ref MySubnetsCIDRSize
```

```
I1022: Prefer using Fn::Sub over Fn::Join with an empty delimiter
```

### Expected behavior

Currently the way to make this comply would be

```yaml
Fn::Sub:
    - ${CIDR}${MySubnetsCIDRSize}
    - CIDR:
        Fn::Select:
          - 0
          - Fn::Split:
            - "/"
            - !Ref MySubnet1CIDR
```

which may not be as optimal 

### Reproduction template

```yaml
Fn::Join:
    - ""
    - - Fn::Select:
        - 0
        - Fn::Split:
          - "/"
          - !Ref MySubnet1CIDR
      - !Ref MySubnetsCIDRSize
 ````


Discussion:

Resolving patch:
diff --git a/src/cfnlint/rules/functions/SubNotJoin.py b/src/cfnlint/rules/functions/SubNotJoin.py
--- a/src/cfnlint/rules/functions/SubNotJoin.py
+++ b/src/cfnlint/rules/functions/SubNotJoin.py
@@ -7,12 +7,34 @@
 
 class SubNotJoin(CloudFormationLintRule):
     """Check if Join is being used with no join characters"""
+
     id = 'I1022'
     shortdesc = 'Use Sub instead of Join'
-    description = 'Prefer a sub instead of Join when using a join delimiter that is empty'
+    description = (
+        'Prefer a sub instead of Join when using a join delimiter that is empty'
+    )
     source_url = 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html'
     tags = ['functions', 'sub', 'join']
 
+    def _check_element(self, element):
+        if isinstance(element, dict):
+            if len(element) == 1:
+                for key, value in element.items():
+                    if key in ['Fn::Sub']:
+                        if not isinstance(value, str):
+                            return False
+                    elif key not in ['Ref', 'Fn::GetAtt']:
+                        return False
+
+        return True
+
+    def _check_elements(self, elements):
+        for element in elements:
+            if not self._check_element(element):
+                return False
+
+        return True
+
     def match(self, cfn):
         matches = []
 
@@ -21,8 +43,15 @@ def match(self, cfn):
         for join_obj in join_objs:
             if isinstance(join_obj[-1], list):
                 join_operator = join_obj[-1][0]
+                join_elements = join_obj[-1][1]
                 if isinstance(join_operator, str):
                     if join_operator == '':
-                        matches.append(RuleMatch(
-                            join_obj[0:-1], 'Prefer using Fn::Sub over Fn::Join with an empty delimiter'))
+                        if isinstance(join_elements, list):
+                            if self._check_elements(join_elements):
+                                matches.append(
+                                    RuleMatch(
+                                        join_obj[0:-1],
+                                        'Prefer using Fn::Sub over Fn::Join with an empty delimiter',
+                                    )
+                                )
         return matches


Test patch:
diff --git a/test/fixtures/results/public/watchmaker.json b/test/fixtures/results/public/watchmaker.json
--- a/test/fixtures/results/public/watchmaker.json
+++ b/test/fixtures/results/public/watchmaker.json
@@ -95,70 +95,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 47,
-                "LineNumber": 689
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Metadata",
-                "AWS::CloudFormation::Init",
-                "cw-agent-install",
-                "files",
-                "/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json",
-                "content",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 37,
-                "LineNumber": 689
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 47,
-                "LineNumber": 803
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Metadata",
-                "AWS::CloudFormation::Init",
-                "finalize",
-                "commands",
-                "10-signal-success",
-                "command",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 37,
-                "LineNumber": 803
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -297,38 +233,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 47,
-                "LineNumber": 914
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Metadata",
-                "AWS::CloudFormation::Init",
-                "setup",
-                "files",
-                "/etc/cfn/cfn-hup.conf",
-                "content",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 37,
-                "LineNumber": 914
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -403,38 +307,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 47,
-                "LineNumber": 977
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Metadata",
-                "AWS::CloudFormation::Init",
-                "setup",
-                "files",
-                "/etc/cfn/hooks.d/cfn-auto-reloader.conf",
-                "content",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 37,
-                "LineNumber": 977
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -541,38 +413,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 47,
-                "LineNumber": 1091
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Metadata",
-                "AWS::CloudFormation::Init",
-                "watchmaker-launch",
-                "commands",
-                "10-watchmaker-launch",
-                "command",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 37,
-                "LineNumber": 1091
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -795,38 +635,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 47,
-                "LineNumber": 1215
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Metadata",
-                "AWS::CloudFormation::Init",
-                "watchmaker-update",
-                "commands",
-                "10-watchmaker-update",
-                "command",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 37,
-                "LineNumber": 1215
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -1049,36 +857,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 39,
-                "LineNumber": 1345
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Properties",
-                "BlockDeviceMappings",
-                0,
-                "DeviceName",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 29,
-                "LineNumber": 1345
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -1109,69 +887,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 35,
-                "LineNumber": 1453
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 25,
-                "LineNumber": 1453
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/public/watchmaker.json",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 55,
-                "LineNumber": 1470
-            },
-            "Path": [
-                "Resources",
-                "WatchmakerInstance",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join",
-                1,
-                10,
-                "Fn::If",
-                1,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 45,
-                "LineNumber": 1470
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/public/watchmaker.json",
         "Level": "Informational",
@@ -1313,7 +1028,7 @@
         "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 29,
+                "ColumnNumber": 37,
                 "LineNumber": 1687
             },
             "Path": [
@@ -1321,7 +1036,7 @@
                 "WatchmakerInstanceLogGroup"
             ],
             "Start": {
-                "ColumnNumber": 3,
+                "ColumnNumber": 9,
                 "LineNumber": 1687
             }
         },
diff --git a/test/fixtures/results/quickstart/nist_application.json b/test/fixtures/results/quickstart/nist_application.json
--- a/test/fixtures/results/quickstart/nist_application.json
+++ b/test/fixtures/results/quickstart/nist_application.json
@@ -1464,35 +1464,6 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/main/docs/cfn-resource-specification.md#valueprimitivetype"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 813
-            },
-            "Path": [
-                "Resources",
-                "rPostProcInstance",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 813
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Informational",
@@ -1664,7 +1635,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 22,
-                "LineNumber": 1025
+                "LineNumber": 1026
             },
             "Path": [
                 "Resources",
@@ -1672,7 +1643,7 @@
             ],
             "Start": {
                 "ColumnNumber": 3,
-                "LineNumber": 1025
+                "LineNumber": 1026
             }
         },
         "Message": "Both UpdateReplacePolicy and DeletionPolicy are needed to protect Resources/rS3AccessLogsPolicy from deletion",
@@ -1683,44 +1654,13 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 1042
-            },
-            "Path": [
-                "Resources",
-                "rS3AccessLogsPolicy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1042
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
         "Location": {
             "End": {
                 "ColumnNumber": 16,
-                "LineNumber": 1057
+                "LineNumber": 1058
             },
             "Path": [
                 "Resources",
@@ -1731,7 +1671,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1057
+                "LineNumber": 1058
             }
         },
         "Message": "IAM Policy Version should be updated to '2012-10-17'.",
@@ -1748,7 +1688,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 19,
-                "LineNumber": 1059
+                "LineNumber": 1060
             },
             "Path": [
                 "Resources",
@@ -1756,7 +1696,7 @@
             ],
             "Start": {
                 "ColumnNumber": 3,
-                "LineNumber": 1059
+                "LineNumber": 1060
             }
         },
         "Message": "Both UpdateReplacePolicy and DeletionPolicy are needed to protect Resources/rS3ELBAccessLogs from deletion",
@@ -1773,7 +1713,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1069
+                "LineNumber": 1070
             },
             "Path": [
                 "Resources",
@@ -1785,7 +1725,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1069
+                "LineNumber": 1070
             }
         },
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/0/FromPort should be of type Integer",
@@ -1802,7 +1742,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1071
+                "LineNumber": 1072
             },
             "Path": [
                 "Resources",
@@ -1814,7 +1754,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1071
+                "LineNumber": 1072
             }
         },
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/0/ToPort should be of type Integer",
@@ -1831,7 +1771,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1073
+                "LineNumber": 1074
             },
             "Path": [
                 "Resources",
@@ -1843,7 +1783,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1073
+                "LineNumber": 1074
             }
         },
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/1/FromPort should be of type Integer",
@@ -1860,7 +1800,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1075
+                "LineNumber": 1076
             },
             "Path": [
                 "Resources",
@@ -1872,7 +1812,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1075
+                "LineNumber": 1076
             }
         },
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/1/ToPort should be of type Integer",
@@ -1889,7 +1829,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1079
+                "LineNumber": 1080
             },
             "Path": [
                 "Resources",
@@ -1901,7 +1841,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1079
+                "LineNumber": 1080
             }
         },
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
@@ -1918,7 +1858,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1081
+                "LineNumber": 1082
             },
             "Path": [
                 "Resources",
@@ -1930,7 +1870,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1081
+                "LineNumber": 1082
             }
         },
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
@@ -1947,7 +1887,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1097
+                "LineNumber": 1098
             },
             "Path": [
                 "Resources",
@@ -1959,7 +1899,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1097
+                "LineNumber": 1098
             }
         },
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
@@ -1976,7 +1916,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1099
+                "LineNumber": 1100
             },
             "Path": [
                 "Resources",
@@ -1988,7 +1928,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1099
+                "LineNumber": 1100
             }
         },
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
@@ -2005,7 +1945,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1102
+                "LineNumber": 1103
             },
             "Path": [
                 "Resources",
@@ -2017,7 +1957,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1102
+                "LineNumber": 1103
             }
         },
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
@@ -2034,7 +1974,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1104
+                "LineNumber": 1105
             },
             "Path": [
                 "Resources",
@@ -2046,7 +1986,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1104
+                "LineNumber": 1105
             }
         },
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
@@ -2063,7 +2003,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1107
+                "LineNumber": 1108
             },
             "Path": [
                 "Resources",
@@ -2075,7 +2015,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1107
+                "LineNumber": 1108
             }
         },
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/2/FromPort should be of type Integer",
@@ -2092,7 +2032,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1109
+                "LineNumber": 1110
             },
             "Path": [
                 "Resources",
@@ -2104,7 +2044,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1109
+                "LineNumber": 1110
             }
         },
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/2/ToPort should be of type Integer",
@@ -2121,7 +2061,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1123
+                "LineNumber": 1124
             },
             "Path": [
                 "Resources",
@@ -2133,7 +2073,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1123
+                "LineNumber": 1124
             }
         },
         "Message": "Property Resources/rSecurityGroupRDS/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
@@ -2150,7 +2090,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1127
+                "LineNumber": 1128
             },
             "Path": [
                 "Resources",
@@ -2162,7 +2102,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1127
+                "LineNumber": 1128
             }
         },
         "Message": "Property Resources/rSecurityGroupRDS/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
@@ -2179,7 +2119,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1142
+                "LineNumber": 1143
             },
             "Path": [
                 "Resources",
@@ -2191,7 +2131,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1142
+                "LineNumber": 1143
             }
         },
         "Message": "Property Resources/rSecurityGroupWeb/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
@@ -2208,7 +2148,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1144
+                "LineNumber": 1145
             },
             "Path": [
                 "Resources",
@@ -2220,7 +2160,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1144
+                "LineNumber": 1145
             }
         },
         "Message": "Property Resources/rSecurityGroupWeb/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
@@ -2237,7 +2177,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1154
+                "LineNumber": 1155
             },
             "Path": [
                 "Resources",
@@ -2249,7 +2189,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1154
+                "LineNumber": 1155
             }
         },
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
@@ -2266,7 +2206,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1156
+                "LineNumber": 1157
             },
             "Path": [
                 "Resources",
@@ -2278,7 +2218,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1156
+                "LineNumber": 1157
             }
         },
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
@@ -2295,7 +2235,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1159
+                "LineNumber": 1160
             },
             "Path": [
                 "Resources",
@@ -2307,7 +2247,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1159
+                "LineNumber": 1160
             }
         },
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
@@ -2324,7 +2264,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1161
+                "LineNumber": 1162
             },
             "Path": [
                 "Resources",
@@ -2336,7 +2276,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1161
+                "LineNumber": 1162
             }
         },
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
@@ -2353,7 +2293,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 17,
-                "LineNumber": 1164
+                "LineNumber": 1165
             },
             "Path": [
                 "Resources",
@@ -2365,7 +2305,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1164
+                "LineNumber": 1165
             }
         },
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/2/FromPort should be of type Integer",
@@ -2382,7 +2322,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 15,
-                "LineNumber": 1166
+                "LineNumber": 1167
             },
             "Path": [
                 "Resources",
@@ -2394,7 +2334,7 @@
             ],
             "Start": {
                 "ColumnNumber": 9,
-                "LineNumber": 1166
+                "LineNumber": 1167
             }
         },
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/2/ToPort should be of type Integer",
@@ -2411,7 +2351,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 27,
-                "LineNumber": 1182
+                "LineNumber": 1183
             },
             "Path": [
                 "Resources",
@@ -2424,7 +2364,7 @@
             ],
             "Start": {
                 "ColumnNumber": 11,
-                "LineNumber": 1182
+                "LineNumber": 1183
             }
         },
         "Message": "Property Resources/rWebContentBucket/Properties/LifecycleConfiguration/Rules/0/ExpirationInDays should be of type Integer",
@@ -2441,7 +2381,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 29,
-                "LineNumber": 1191
+                "LineNumber": 1192
             },
             "Path": [
                 "Resources",
@@ -2455,7 +2395,7 @@
             ],
             "Start": {
                 "ColumnNumber": 13,
-                "LineNumber": 1191
+                "LineNumber": 1192
             }
         },
         "Message": "Property Resources/rWebContentBucket/Properties/LifecycleConfiguration/Rules/0/Transition/TransitionInDays should be of type Integer",
@@ -2472,7 +2412,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 14,
-                "LineNumber": 1197
+                "LineNumber": 1198
             },
             "Path": [
                 "Resources",
@@ -2481,7 +2421,7 @@
             ],
             "Start": {
                 "ColumnNumber": 5,
-                "LineNumber": 1197
+                "LineNumber": 1198
             }
         },
         "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/Bucket/Ref",
@@ -2498,7 +2438,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 14,
-                "LineNumber": 1197
+                "LineNumber": 1198
             },
             "Path": [
                 "Resources",
@@ -2507,7 +2447,7 @@
             ],
             "Start": {
                 "ColumnNumber": 5,
-                "LineNumber": 1197
+                "LineNumber": 1198
             }
         },
         "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/0/Resource/Fn::Join/1/3/Ref",
@@ -2524,7 +2464,7 @@
         "Location": {
             "End": {
                 "ColumnNumber": 14,
-                "LineNumber": 1197
+                "LineNumber": 1198
             },
             "Path": [
                 "Resources",
@@ -2533,7 +2473,7 @@
             ],
             "Start": {
                 "ColumnNumber": 5,
-                "LineNumber": 1197
+                "LineNumber": 1198
             }
         },
         "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/1/Resource/Fn::Join/1/3/Ref",
@@ -2543,67 +2483,5 @@
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 1210
-            },
-            "Path": [
-                "Resources",
-                "rWebContentS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1210
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 1227
-            },
-            "Path": [
-                "Resources",
-                "rWebContentS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                1,
-                "Resource",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1227
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
     }
 ]
diff --git a/test/fixtures/results/quickstart/nist_high_main.json b/test/fixtures/results/quickstart/nist_high_main.json
--- a/test/fixtures/results/quickstart/nist_high_main.json
+++ b/test/fixtures/results/quickstart/nist_high_main.json
@@ -95,7 +95,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -122,7 +122,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -149,7 +149,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -176,7 +176,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -203,7 +203,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -230,7 +230,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -551,34 +551,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 377
-            },
-            "Path": [
-                "Resources",
-                "ApplicationTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 377
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Error",
@@ -712,34 +684,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 401
-            },
-            "Path": [
-                "Resources",
-                "ConfigRulesTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 401
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Error",
@@ -792,34 +736,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 414
-            },
-            "Path": [
-                "Resources",
-                "IamTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 414
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Error",
@@ -872,34 +788,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 435
-            },
-            "Path": [
-                "Resources",
-                "LoggingTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 435
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Error",
@@ -996,7 +884,7 @@
                 "LineNumber": 445
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -1048,7 +936,7 @@
                 "LineNumber": 445
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -1143,34 +1031,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 516
-            },
-            "Path": [
-                "Resources",
-                "ManagementVpcTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 516
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Error",
@@ -1223,34 +1083,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 570
-            },
-            "Path": [
-                "Resources",
-                "ProductionVpcTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 570
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Error",
diff --git a/test/fixtures/results/quickstart/nist_logging.json b/test/fixtures/results/quickstart/nist_logging.json
--- a/test/fixtures/results/quickstart/nist_logging.json
+++ b/test/fixtures/results/quickstart/nist_logging.json
@@ -189,102 +189,6 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 74
-            },
-            "Path": [
-                "Resources",
-                "rArchiveLogsBucketPolicy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 74
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 89
-            },
-            "Path": [
-                "Resources",
-                "rArchiveLogsBucketPolicy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                1,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 89
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 107
-            },
-            "Path": [
-                "Resources",
-                "rArchiveLogsBucketPolicy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                2,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 107
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
         "Level": "Warning",
@@ -469,74 +373,6 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 204
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailRole",
-                "Properties",
-                "Policies",
-                0,
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 15,
-                "LineNumber": 204
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 218
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailRole",
-                "Properties",
-                "Policies",
-                0,
-                "PolicyDocument",
-                "Statement",
-                1,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 15,
-                "LineNumber": 218
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
         "Level": "Warning",
@@ -693,234 +529,6 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 243
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 243
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 261
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                1,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 261
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 279
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                2,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 279
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 294
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                3,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 294
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 312
-            },
-            "Path": [
-                "Resources",
-                "rCloudTrailS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                4,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 312
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 342
-            },
-            "Path": [
-                "Resources",
-                "rCloudWatchLogsRole",
-                "Properties",
-                "Policies",
-                0,
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 15,
-                "LineNumber": 342
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 361
-            },
-            "Path": [
-                "Resources",
-                "rCloudWatchLogsRole",
-                "Properties",
-                "Policies",
-                0,
-                "PolicyDocument",
-                "Statement",
-                1,
-                "Resource",
-                0,
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 15,
-                "LineNumber": 361
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
         "Level": "Error",
diff --git a/test/fixtures/results/quickstart/non_strict/nist_application.json b/test/fixtures/results/quickstart/non_strict/nist_application.json
--- a/test/fixtures/results/quickstart/non_strict/nist_application.json
+++ b/test/fixtures/results/quickstart/non_strict/nist_application.json
@@ -723,35 +723,6 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 813
-            },
-            "Path": [
-                "Resources",
-                "rPostProcInstance",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 813
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Informational",
@@ -888,37 +859,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 1043
-            },
-            "Path": [
-                "Resources",
-                "rS3AccessLogsPolicy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1043
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
@@ -1049,67 +989,5 @@
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 1211
-            },
-            "Path": [
-                "Resources",
-                "rWebContentS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                0,
-                "Resource",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1211
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 21,
-                "LineNumber": 1228
-            },
-            "Path": [
-                "Resources",
-                "rWebContentS3Policy",
-                "Properties",
-                "PolicyDocument",
-                "Statement",
-                1,
-                "Resource",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1228
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
     }
 ]
diff --git a/test/fixtures/results/quickstart/non_strict/nist_high_main.json b/test/fixtures/results/quickstart/non_strict/nist_high_main.json
--- a/test/fixtures/results/quickstart/non_strict/nist_high_main.json
+++ b/test/fixtures/results/quickstart/non_strict/nist_high_main.json
@@ -95,7 +95,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -122,7 +122,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -149,7 +149,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -176,7 +176,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -203,7 +203,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -230,7 +230,7 @@
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -551,34 +551,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 377
-            },
-            "Path": [
-                "Resources",
-                "ApplicationTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 377
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Informational",
@@ -685,34 +657,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 401
-            },
-            "Path": [
-                "Resources",
-                "ConfigRulesTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 401
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Informational",
@@ -738,34 +682,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 414
-            },
-            "Path": [
-                "Resources",
-                "IamTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 414
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Informational",
@@ -791,34 +707,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 435
-            },
-            "Path": [
-                "Resources",
-                "LoggingTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 435
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Informational",
@@ -888,7 +776,7 @@
                 "LineNumber": 445
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -940,7 +828,7 @@
                 "LineNumber": 445
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -1035,34 +923,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 516
-            },
-            "Path": [
-                "Resources",
-                "ManagementVpcTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 516
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
         "Level": "Informational",
@@ -1087,33 +947,5 @@
             "ShortDescription": "Check stateful resources have a set UpdateReplacePolicy/DeletionPolicy",
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html"
         }
-    },
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_high_main.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 17,
-                "LineNumber": 570
-            },
-            "Path": [
-                "Resources",
-                "ProductionVpcTemplate",
-                "Properties",
-                "TemplateURL",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 570
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
     }
 ]
diff --git a/test/fixtures/results/quickstart/non_strict/openshift.json b/test/fixtures/results/quickstart/non_strict/openshift.json
--- a/test/fixtures/results/quickstart/non_strict/openshift.json
+++ b/test/fixtures/results/quickstart/non_strict/openshift.json
@@ -194,35 +194,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 377
-            },
-            "Path": [
-                "Resources",
-                "AnsibleConfigServer",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 377
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -368,35 +339,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 922
-            },
-            "Path": [
-                "Resources",
-                "OpenShiftEtcdLaunchConfig",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 922
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -455,35 +397,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 1147
-            },
-            "Path": [
-                "Resources",
-                "OpenShiftMasterASLaunchConfig",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1147
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Informational",
@@ -516,35 +429,6 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 1481
-            },
-            "Path": [
-                "Resources",
-                "OpenShiftNodesLaunchConfig",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1481
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Informational",
diff --git a/test/fixtures/results/quickstart/openshift.json b/test/fixtures/results/quickstart/openshift.json
--- a/test/fixtures/results/quickstart/openshift.json
+++ b/test/fixtures/results/quickstart/openshift.json
@@ -252,35 +252,6 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/main/docs/cfn-resource-specification.md#valueprimitivetype"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 377
-            },
-            "Path": [
-                "Resources",
-                "AnsibleConfigServer",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 377
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -539,35 +510,6 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/main/docs/cfn-resource-specification.md#valueprimitivetype"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 922
-            },
-            "Path": [
-                "Resources",
-                "OpenShiftEtcdLaunchConfig",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 922
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Error",
@@ -712,35 +654,6 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/main/docs/cfn-resource-specification.md#valueprimitivetype"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 1147
-            },
-            "Path": [
-                "Resources",
-                "OpenShiftMasterASLaunchConfig",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1147
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Error",
@@ -1005,35 +918,6 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/main/docs/cfn-resource-specification.md#valueprimitivetype"
         }
     },
-    {
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
-        "Level": "Informational",
-        "Location": {
-            "End": {
-                "ColumnNumber": 19,
-                "LineNumber": 1481
-            },
-            "Path": [
-                "Resources",
-                "OpenShiftNodesLaunchConfig",
-                "Properties",
-                "UserData",
-                "Fn::Base64",
-                "Fn::Join"
-            ],
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1481
-            }
-        },
-        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
-        "Rule": {
-            "Description": "Prefer a sub instead of Join when using a join delimiter that is empty",
-            "Id": "I1022",
-            "ShortDescription": "Use Sub instead of Join",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Error",
diff --git a/test/fixtures/templates/bad/functions/subnotjoin.yaml b/test/fixtures/templates/bad/functions/subnotjoin.yaml
--- a/test/fixtures/templates/bad/functions/subnotjoin.yaml
+++ b/test/fixtures/templates/bad/functions/subnotjoin.yaml
@@ -19,6 +19,6 @@ Resources:
       UserData:
         Fn::Base64:
           Fn::Join:
-          - ''
-          - - !Sub 'yum install ${myPackage}'
-            - !Sub 'yum install ${myAppPackage}'
\ No newline at end of file
+            - ""
+            - - !Sub "yum install ${myPackage}"
+              - !Sub "yum install ${myAppPackage}"
diff --git a/test/fixtures/templates/good/functions/subnotjoin.yaml b/test/fixtures/templates/good/functions/subnotjoin.yaml
--- a/test/fixtures/templates/good/functions/subnotjoin.yaml
+++ b/test/fixtures/templates/good/functions/subnotjoin.yaml
@@ -20,4 +20,18 @@ Resources:
         Fn::Base64:
           Fn::Sub: |
             yum install ${myPackage}
-            yum install ${myAppPackage}
\ No newline at end of file
+            yum install ${myAppPackage}
+  myInstance2:
+    Type: AWS::EC2::Instance
+    Properties:
+      ImageId: String
+      UserData:
+        Fn::Base64:
+          Fn::Join:
+            - ""
+            - - Fn::Select:
+                  - 0
+                  - Fn::Split:
+                    - "/"
+                    - "a/path/"
+              - !Sub "yum install ${myAppPackage}"