We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Using !Ref in ContentUri of LayerVersion throw error E0001
*cfn-lint version: 0.43.0*

*Description of issue.*

The `ContentUri` property of a resource type [AWS::Serverless::LayerVersion][1] can be a string or a `LayerContent` object. But, if we use `!Ref` the template is marked as an error with the message:
>[cfn-lint] E0001: Error transforming template: Resource with id [CommonDependenciesLayer4ffbb56ae8] is invalid. 'ContentUri' requires Bucket and Key properties to be specified.

Here is an example:
```yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Parameters:
  EnvironmentName:
    Description: An environment name
    Type: String
    Default: staging
    AllowedValues:
      - sandbox
      - prod
      - staging

  LayerContentUri:
    Type: String
    Description: Layer content uri
    Default: '../dependencies-layer/nodejs'


Resources:
  CommonDependenciesLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: !Sub '${EnvironmentName}-common-dependencies'
      Description: 'Common dependencies'
      ContentUri: !Ref LayerContentUri
      CompatibleRuntimes:
        - nodejs12.x
      RetentionPolicy: Retain
    Metadata:
      BuildMethod: nodejs12.x
```
The template deploys ok using `sam deploy` so it is not an error. I'm already using the latest version of `cfn-lint` and already did `cfn-lint -u`

Hope this gets fixed soon.

PS: nice job!

[1]: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-layerversion.html

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/cfnlint/transform.py`
Content:
```
1 """
2 Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 SPDX-License-Identifier: MIT-0
4 """
5 import os
6 import logging
7 import six
8 import samtranslator
9 from samtranslator.parser import parser
10 from samtranslator.translator.translator import Translator
11 from samtranslator.public.exceptions import InvalidDocumentException
12 
13 from cfnlint.helpers import load_resource, convert_dict, format_json_string
14 from cfnlint.data import Serverless
15 from cfnlint.rules import Match, TransformError
16 LOGGER = logging.getLogger('cfnlint')
17 
18 
19 class Transform(object):
20     """
21     Application Serverless Module tranform Wrapper.
22     Based on code from AWS SAM CLI:
23     https://github.com/awslabs/aws-sam-cli/blob/develop/samcli/commands/validate/lib/sam_template_validator.py
24     """
25 
26     def __init__(self, filename, template, region):
27         """
28         Initialize Transform class
29         """
30         self._filename = filename
31         self._template = template
32         self._region = region
33         self._parameters = {}
34 
35         self._managed_policy_map = self.load_managed_policies()
36         self._sam_parser = parser.Parser()
37 
38     def template(self):
39         """Get the template"""
40         return self._template
41 
42     def load_managed_policies(self):
43         """
44         Load the ManagedPolicies locally, based on the AWS-CLI:
45         https://github.com/awslabs/aws-sam-cli/blob/develop/samcli/lib/samlib/default_managed_policies.json
46         """
47         return load_resource(Serverless, 'ManagedPolicies.json')
48 
49     def _replace_local_codeuri(self):
50         """
51         Replaces the CodeUri in AWS::Serverless::Function and DefinitionUri in
52         AWS::Serverless::Api to a fake S3 Uri. This is to support running the
53         SAM Translator with valid values for these fields. If this is not done,
54         the template is invalid in the eyes of SAM Translator (the translator
55         does not support local paths)
56         """
57 
58         all_resources = self._template.get('Resources', {})
59 
60         template_globals = self._template.get('Globals', {})
61         auto_publish_alias = template_globals.get('Function', {}).get('AutoPublishAlias')
62         if isinstance(auto_publish_alias, dict):
63             if len(auto_publish_alias) == 1:
64                 for k, v in auto_publish_alias.items():
65                     if k == 'Ref':
66                         if v in self._template.get('Parameters'):
67                             self._parameters[v] = 'Alias'
68 
69 
70         for _, resource in all_resources.items():
71 
72             resource_type = resource.get('Type')
73             resource_dict = resource.get('Properties')
74 
75             if resource_type == 'AWS::Serverless::Function':
76 
77                 Transform._update_to_s3_uri('CodeUri', resource_dict)
78                 auto_publish_alias = resource_dict.get('AutoPublishAlias')
79                 if isinstance(auto_publish_alias, dict):
80                     if len(auto_publish_alias) == 1:
81                         for k, v in auto_publish_alias.items():
82                             if k == 'Ref':
83                                 if v in self._template.get('Parameters'):
84                                     self._parameters[v] = 'Alias'
85             if resource_type in ['AWS::Serverless::LayerVersion']:
86                 if resource_dict.get('ContentUri'):
87                     Transform._update_to_s3_uri('ContentUri', resource_dict)
88             if resource_type == 'AWS::Serverless::Application':
89                 if resource_dict.get('Location'):
90                     resource_dict['Location'] = ''
91                     Transform._update_to_s3_uri('Location', resource_dict)
92             if resource_type == 'AWS::Serverless::Api':
93                 if ('DefinitionBody' not in resource_dict and
94                         'Auth' not in resource_dict and 'Cors' not in resource_dict):
95                     Transform._update_to_s3_uri('DefinitionUri', resource_dict)
96                 else:
97                     resource_dict['DefinitionBody'] = ''
98             if resource_type == 'AWS::Serverless::StateMachine' and resource_dict.get('DefinitionUri'):
99                 Transform._update_to_s3_uri('DefinitionUri', resource_dict)
100 
101     def transform_template(self):
102         """
103         Transform the Template using the Serverless Application Model.
104         """
105         matches = []
106 
107         try:
108             # Output the SAM Translator version in debug mode
109             LOGGER.info('SAM Translator: %s', samtranslator.__version__)
110 
111             sam_translator = Translator(
112                 managed_policy_map=self._managed_policy_map,
113                 sam_parser=self._sam_parser)
114 
115             self._replace_local_codeuri()
116 
117             # Tell SAM to use the region we're linting in, this has to be
118             # controlled using the default AWS mechanisms, see also:
119             # https://github.com/awslabs/serverless-application-model/blob/master/samtranslator/translator/arn_generator.py
120             LOGGER.info('Setting AWS_DEFAULT_REGION to %s', self._region)
121             os.environ['AWS_DEFAULT_REGION'] = self._region
122 
123             self._template = convert_dict(
124                 sam_translator.translate(sam_template=self._template,
125                                          parameter_values=self._parameters))
126 
127             LOGGER.info('Transformed template: \n%s',
128                         format_json_string(self._template))
129         except InvalidDocumentException as e:
130             message = 'Error transforming template: {0}'
131             for cause in e.causes:
132                 matches.append(Match(
133                     1, 1,
134                     1, 1,
135                     self._filename,
136                     TransformError(), message.format(cause.message)))
137         except Exception as e:  # pylint: disable=W0703
138             LOGGER.debug('Error transforming template: %s', str(e))
139             LOGGER.debug('Stack trace: %s', e, exc_info=True)
140             message = 'Error transforming template: {0}'
141             matches.append(Match(
142                 1, 1,
143                 1, 1,
144                 self._filename,
145                 TransformError(), message.format(str(e))))
146 
147         return matches
148 
149     @staticmethod
150     def is_s3_uri(uri):
151         """
152         Checks the uri and determines if it is a valid S3 Uri
153         Parameters
154         ----------
155         uri str, required
156             Uri to check
157         Returns
158         -------
159         bool
160             Returns True if the uri given is an S3 uri, otherwise False
161         """
162         return isinstance(uri, six.string_types) and uri.startswith('s3://')
163 
164     @staticmethod
165     def _update_to_s3_uri(
166             property_key, resource_property_dict,
167             s3_uri_value='s3://bucket/value'):
168         """
169         Updates the 'property_key' in the 'resource_property_dict' to the
170         value of 's3_uri_value'
171         Note: The function will mutate the resource_property_dict that is pass
172         in Parameters
173         ----------
174         property_key str, required
175             Key in the resource_property_dict
176         resource_property_dict dict, required
177             Property dictionary of a Resource in the template to replace
178         s3_uri_value str, optional
179             Value to update the value of the property_key to
180         """
181         uri_property = resource_property_dict.get(property_key, '.')
182 
183         # ignore if dict or already an S3 Uri
184         if isinstance(uri_property, dict) or Transform.is_s3_uri(uri_property):
185             return
186 
187         resource_property_dict[property_key] = s3_uri_value
188
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/cfnlint/transform.py b/src/cfnlint/transform.py
--- a/src/cfnlint/transform.py
+++ b/src/cfnlint/transform.py
@@ -181,7 +181,13 @@
         uri_property = resource_property_dict.get(property_key, '.')
 
         # ignore if dict or already an S3 Uri
-        if isinstance(uri_property, dict) or Transform.is_s3_uri(uri_property):
+        if isinstance(uri_property, dict):
+            if len(uri_property) == 1:
+                for k in uri_property.keys():
+                    if k == 'Ref':
+                        resource_property_dict[property_key] = s3_uri_value
+            return
+        if Transform.is_s3_uri(uri_property):
             return
 
         resource_property_dict[property_key] = s3_uri_value

{"golden_diff": "diff --git a/src/cfnlint/transform.py b/src/cfnlint/transform.py\n--- a/src/cfnlint/transform.py\n+++ b/src/cfnlint/transform.py\n@@ -181,7 +181,13 @@\n         uri_property = resource_property_dict.get(property_key, '.')\n \n         # ignore if dict or already an S3 Uri\n-        if isinstance(uri_property, dict) or Transform.is_s3_uri(uri_property):\n+        if isinstance(uri_property, dict):\n+            if len(uri_property) == 1:\n+                for k in uri_property.keys():\n+                    if k == 'Ref':\n+                        resource_property_dict[property_key] = s3_uri_value\n+            return\n+        if Transform.is_s3_uri(uri_property):\n             return\n \n         resource_property_dict[property_key] = s3_uri_value\n", "issue": "Using !Ref in ContentUri of LayerVersion throw error E0001\n*cfn-lint version: 0.43.0*\r\n\r\n*Description of issue.*\r\n\r\nThe `ContentUri` property of a resource type [AWS::Serverless::LayerVersion][1] can be a string or a `LayerContent` object. But, if we use `!Ref` the template is marked as an error with the message:\r\n>[cfn-lint] E0001: Error transforming template: Resource with id [CommonDependenciesLayer4ffbb56ae8] is invalid. 'ContentUri' requires Bucket and Key properties to be specified.\r\n\r\nHere is an example:\r\n```yaml\r\nAWSTemplateFormatVersion: '2010-09-09'\r\nTransform: AWS::Serverless-2016-10-31\r\n\r\nParameters:\r\n  EnvironmentName:\r\n    Description: An environment name\r\n    Type: String\r\n    Default: staging\r\n    AllowedValues:\r\n      - sandbox\r\n      - prod\r\n      - staging\r\n\r\n  LayerContentUri:\r\n    Type: String\r\n    Description: Layer content uri\r\n    Default: '../dependencies-layer/nodejs'\r\n\r\n\r\nResources:\r\n  CommonDependenciesLayer:\r\n    Type: AWS::Serverless::LayerVersion\r\n    Properties:\r\n      LayerName: !Sub '${EnvironmentName}-common-dependencies'\r\n      Description: 'Common dependencies'\r\n      ContentUri: !Ref LayerContentUri\r\n      CompatibleRuntimes:\r\n        - nodejs12.x\r\n      RetentionPolicy: Retain\r\n    Metadata:\r\n      BuildMethod: nodejs12.x\r\n```\r\nThe template deploys ok using `sam deploy` so it is not an error. I'm already using the latest version of `cfn-lint` and already did `cfn-lint -u`\r\n\r\nHope this gets fixed soon.\r\n\r\nPS: nice job!\r\n\r\n[1]: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-layerversion.html\n", "before_files": [{"content": "\"\"\"\nCopyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\nSPDX-License-Identifier: MIT-0\n\"\"\"\nimport os\nimport logging\nimport six\nimport samtranslator\nfrom samtranslator.parser import parser\nfrom samtranslator.translator.translator import Translator\nfrom samtranslator.public.exceptions import InvalidDocumentException\n\nfrom cfnlint.helpers import load_resource, convert_dict, format_json_string\nfrom cfnlint.data import Serverless\nfrom cfnlint.rules import Match, TransformError\nLOGGER = logging.getLogger('cfnlint')\n\n\nclass Transform(object):\n    \"\"\"\n    Application Serverless Module tranform Wrapper.\n    Based on code from AWS SAM CLI:\n    https://github.com/awslabs/aws-sam-cli/blob/develop/samcli/commands/validate/lib/sam_template_validator.py\n    \"\"\"\n\n    def __init__(self, filename, template, region):\n        \"\"\"\n        Initialize Transform class\n        \"\"\"\n        self._filename = filename\n        self._template = template\n        self._region = region\n        self._parameters = {}\n\n        self._managed_policy_map = self.load_managed_policies()\n        self._sam_parser = parser.Parser()\n\n    def template(self):\n        \"\"\"Get the template\"\"\"\n        return self._template\n\n    def load_managed_policies(self):\n        \"\"\"\n        Load the ManagedPolicies locally, based on the AWS-CLI:\n        https://github.com/awslabs/aws-sam-cli/blob/develop/samcli/lib/samlib/default_managed_policies.json\n        \"\"\"\n        return load_resource(Serverless, 'ManagedPolicies.json')\n\n    def _replace_local_codeuri(self):\n        \"\"\"\n        Replaces the CodeUri in AWS::Serverless::Function and DefinitionUri in\n        AWS::Serverless::Api to a fake S3 Uri. This is to support running the\n        SAM Translator with valid values for these fields. If this is not done,\n        the template is invalid in the eyes of SAM Translator (the translator\n        does not support local paths)\n        \"\"\"\n\n        all_resources = self._template.get('Resources', {})\n\n        template_globals = self._template.get('Globals', {})\n        auto_publish_alias = template_globals.get('Function', {}).get('AutoPublishAlias')\n        if isinstance(auto_publish_alias, dict):\n            if len(auto_publish_alias) == 1:\n                for k, v in auto_publish_alias.items():\n                    if k == 'Ref':\n                        if v in self._template.get('Parameters'):\n                            self._parameters[v] = 'Alias'\n\n\n        for _, resource in all_resources.items():\n\n            resource_type = resource.get('Type')\n            resource_dict = resource.get('Properties')\n\n            if resource_type == 'AWS::Serverless::Function':\n\n                Transform._update_to_s3_uri('CodeUri', resource_dict)\n                auto_publish_alias = resource_dict.get('AutoPublishAlias')\n                if isinstance(auto_publish_alias, dict):\n                    if len(auto_publish_alias) == 1:\n                        for k, v in auto_publish_alias.items():\n                            if k == 'Ref':\n                                if v in self._template.get('Parameters'):\n                                    self._parameters[v] = 'Alias'\n            if resource_type in ['AWS::Serverless::LayerVersion']:\n                if resource_dict.get('ContentUri'):\n                    Transform._update_to_s3_uri('ContentUri', resource_dict)\n            if resource_type == 'AWS::Serverless::Application':\n                if resource_dict.get('Location'):\n                    resource_dict['Location'] = ''\n                    Transform._update_to_s3_uri('Location', resource_dict)\n            if resource_type == 'AWS::Serverless::Api':\n                if ('DefinitionBody' not in resource_dict and\n                        'Auth' not in resource_dict and 'Cors' not in resource_dict):\n                    Transform._update_to_s3_uri('DefinitionUri', resource_dict)\n                else:\n                    resource_dict['DefinitionBody'] = ''\n            if resource_type == 'AWS::Serverless::StateMachine' and resource_dict.get('DefinitionUri'):\n                Transform._update_to_s3_uri('DefinitionUri', resource_dict)\n\n    def transform_template(self):\n        \"\"\"\n        Transform the Template using the Serverless Application Model.\n        \"\"\"\n        matches = []\n\n        try:\n            # Output the SAM Translator version in debug mode\n            LOGGER.info('SAM Translator: %s', samtranslator.__version__)\n\n            sam_translator = Translator(\n                managed_policy_map=self._managed_policy_map,\n                sam_parser=self._sam_parser)\n\n            self._replace_local_codeuri()\n\n            # Tell SAM to use the region we're linting in, this has to be\n            # controlled using the default AWS mechanisms, see also:\n            # https://github.com/awslabs/serverless-application-model/blob/master/samtranslator/translator/arn_generator.py\n            LOGGER.info('Setting AWS_DEFAULT_REGION to %s', self._region)\n            os.environ['AWS_DEFAULT_REGION'] = self._region\n\n            self._template = convert_dict(\n                sam_translator.translate(sam_template=self._template,\n                                         parameter_values=self._parameters))\n\n            LOGGER.info('Transformed template: \\n%s',\n                        format_json_string(self._template))\n        except InvalidDocumentException as e:\n            message = 'Error transforming template: {0}'\n            for cause in e.causes:\n                matches.append(Match(\n                    1, 1,\n                    1, 1,\n                    self._filename,\n                    TransformError(), message.format(cause.message)))\n        except Exception as e:  # pylint: disable=W0703\n            LOGGER.debug('Error transforming template: %s', str(e))\n            LOGGER.debug('Stack trace: %s', e, exc_info=True)\n            message = 'Error transforming template: {0}'\n            matches.append(Match(\n                1, 1,\n                1, 1,\n                self._filename,\n                TransformError(), message.format(str(e))))\n\n        return matches\n\n    @staticmethod\n    def is_s3_uri(uri):\n        \"\"\"\n        Checks the uri and determines if it is a valid S3 Uri\n        Parameters\n        ----------\n        uri str, required\n            Uri to check\n        Returns\n        -------\n        bool\n            Returns True if the uri given is an S3 uri, otherwise False\n        \"\"\"\n        return isinstance(uri, six.string_types) and uri.startswith('s3://')\n\n    @staticmethod\n    def _update_to_s3_uri(\n            property_key, resource_property_dict,\n            s3_uri_value='s3://bucket/value'):\n        \"\"\"\n        Updates the 'property_key' in the 'resource_property_dict' to the\n        value of 's3_uri_value'\n        Note: The function will mutate the resource_property_dict that is pass\n        in Parameters\n        ----------\n        property_key str, required\n            Key in the resource_property_dict\n        resource_property_dict dict, required\n            Property dictionary of a Resource in the template to replace\n        s3_uri_value str, optional\n            Value to update the value of the property_key to\n        \"\"\"\n        uri_property = resource_property_dict.get(property_key, '.')\n\n        # ignore if dict or already an S3 Uri\n        if isinstance(uri_property, dict) or Transform.is_s3_uri(uri_property):\n            return\n\n        resource_property_dict[property_key] = s3_uri_value\n", "path": "src/cfnlint/transform.py"}], "after_files": [{"content": "\"\"\"\nCopyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\nSPDX-License-Identifier: MIT-0\n\"\"\"\nimport os\nimport logging\nimport six\nimport samtranslator\nfrom samtranslator.parser import parser\nfrom samtranslator.translator.translator import Translator\nfrom samtranslator.public.exceptions import InvalidDocumentException\n\nfrom cfnlint.helpers import load_resource, convert_dict, format_json_string\nfrom cfnlint.data import Serverless\nfrom cfnlint.rules import Match, TransformError\nLOGGER = logging.getLogger('cfnlint')\n\n\nclass Transform(object):\n    \"\"\"\n    Application Serverless Module tranform Wrapper.\n    Based on code from AWS SAM CLI:\n    https://github.com/awslabs/aws-sam-cli/blob/develop/samcli/commands/validate/lib/sam_template_validator.py\n    \"\"\"\n\n    def __init__(self, filename, template, region):\n        \"\"\"\n        Initialize Transform class\n        \"\"\"\n        self._filename = filename\n        self._template = template\n        self._region = region\n        self._parameters = {}\n\n        self._managed_policy_map = self.load_managed_policies()\n        self._sam_parser = parser.Parser()\n\n    def template(self):\n        \"\"\"Get the template\"\"\"\n        return self._template\n\n    def load_managed_policies(self):\n        \"\"\"\n        Load the ManagedPolicies locally, based on the AWS-CLI:\n        https://github.com/awslabs/aws-sam-cli/blob/develop/samcli/lib/samlib/default_managed_policies.json\n        \"\"\"\n        return load_resource(Serverless, 'ManagedPolicies.json')\n\n    def _replace_local_codeuri(self):\n        \"\"\"\n        Replaces the CodeUri in AWS::Serverless::Function and DefinitionUri in\n        AWS::Serverless::Api to a fake S3 Uri. This is to support running the\n        SAM Translator with valid values for these fields. If this is not done,\n        the template is invalid in the eyes of SAM Translator (the translator\n        does not support local paths)\n        \"\"\"\n\n        all_resources = self._template.get('Resources', {})\n\n        template_globals = self._template.get('Globals', {})\n        auto_publish_alias = template_globals.get('Function', {}).get('AutoPublishAlias')\n        if isinstance(auto_publish_alias, dict):\n            if len(auto_publish_alias) == 1:\n                for k, v in auto_publish_alias.items():\n                    if k == 'Ref':\n                        if v in self._template.get('Parameters'):\n                            self._parameters[v] = 'Alias'\n\n\n        for _, resource in all_resources.items():\n\n            resource_type = resource.get('Type')\n            resource_dict = resource.get('Properties')\n\n            if resource_type == 'AWS::Serverless::Function':\n\n                Transform._update_to_s3_uri('CodeUri', resource_dict)\n                auto_publish_alias = resource_dict.get('AutoPublishAlias')\n                if isinstance(auto_publish_alias, dict):\n                    if len(auto_publish_alias) == 1:\n                        for k, v in auto_publish_alias.items():\n                            if k == 'Ref':\n                                if v in self._template.get('Parameters'):\n                                    self._parameters[v] = 'Alias'\n            if resource_type in ['AWS::Serverless::LayerVersion']:\n                if resource_dict.get('ContentUri'):\n                    Transform._update_to_s3_uri('ContentUri', resource_dict)\n            if resource_type == 'AWS::Serverless::Application':\n                if resource_dict.get('Location'):\n                    resource_dict['Location'] = ''\n                    Transform._update_to_s3_uri('Location', resource_dict)\n            if resource_type == 'AWS::Serverless::Api':\n                if ('DefinitionBody' not in resource_dict and\n                        'Auth' not in resource_dict and 'Cors' not in resource_dict):\n                    Transform._update_to_s3_uri('DefinitionUri', resource_dict)\n                else:\n                    resource_dict['DefinitionBody'] = ''\n            if resource_type == 'AWS::Serverless::StateMachine' and resource_dict.get('DefinitionUri'):\n                Transform._update_to_s3_uri('DefinitionUri', resource_dict)\n\n    def transform_template(self):\n        \"\"\"\n        Transform the Template using the Serverless Application Model.\n        \"\"\"\n        matches = []\n\n        try:\n            # Output the SAM Translator version in debug mode\n            LOGGER.info('SAM Translator: %s', samtranslator.__version__)\n\n            sam_translator = Translator(\n                managed_policy_map=self._managed_policy_map,\n                sam_parser=self._sam_parser)\n\n            self._replace_local_codeuri()\n\n            # Tell SAM to use the region we're linting in, this has to be\n            # controlled using the default AWS mechanisms, see also:\n            # https://github.com/awslabs/serverless-application-model/blob/master/samtranslator/translator/arn_generator.py\n            LOGGER.info('Setting AWS_DEFAULT_REGION to %s', self._region)\n            os.environ['AWS_DEFAULT_REGION'] = self._region\n\n            self._template = convert_dict(\n                sam_translator.translate(sam_template=self._template,\n                                         parameter_values=self._parameters))\n\n            LOGGER.info('Transformed template: \\n%s',\n                        format_json_string(self._template))\n        except InvalidDocumentException as e:\n            message = 'Error transforming template: {0}'\n            for cause in e.causes:\n                matches.append(Match(\n                    1, 1,\n                    1, 1,\n                    self._filename,\n                    TransformError(), message.format(cause.message)))\n        except Exception as e:  # pylint: disable=W0703\n            LOGGER.debug('Error transforming template: %s', str(e))\n            LOGGER.debug('Stack trace: %s', e, exc_info=True)\n            message = 'Error transforming template: {0}'\n            matches.append(Match(\n                1, 1,\n                1, 1,\n                self._filename,\n                TransformError(), message.format(str(e))))\n\n        return matches\n\n    @staticmethod\n    def is_s3_uri(uri):\n        \"\"\"\n        Checks the uri and determines if it is a valid S3 Uri\n        Parameters\n        ----------\n        uri str, required\n            Uri to check\n        Returns\n        -------\n        bool\n            Returns True if the uri given is an S3 uri, otherwise False\n        \"\"\"\n        return isinstance(uri, six.string_types) and uri.startswith('s3://')\n\n    @staticmethod\n    def _update_to_s3_uri(\n            property_key, resource_property_dict,\n            s3_uri_value='s3://bucket/value'):\n        \"\"\"\n        Updates the 'property_key' in the 'resource_property_dict' to the\n        value of 's3_uri_value'\n        Note: The function will mutate the resource_property_dict that is pass\n        in Parameters\n        ----------\n        property_key str, required\n            Key in the resource_property_dict\n        resource_property_dict dict, required\n            Property dictionary of a Resource in the template to replace\n        s3_uri_value str, optional\n            Value to update the value of the property_key to\n        \"\"\"\n        uri_property = resource_property_dict.get(property_key, '.')\n\n        # ignore if dict or already an S3 Uri\n        if isinstance(uri_property, dict):\n            if len(uri_property) == 1:\n                for k in uri_property.keys():\n                    if k == 'Ref':\n                        resource_property_dict[property_key] = s3_uri_value\n            return\n        if Transform.is_s3_uri(uri_property):\n            return\n\n        resource_property_dict[property_key] = s3_uri_value\n", "path": "src/cfnlint/transform.py"}]}