diff --git a/lib/ansible/plugins/action/aws_s3.py b/lib/ansible/plugins/action/aws_s3.py
index dfe7f2d428a..860fb96aecc 100644
--- a/lib/ansible/plugins/action/aws_s3.py
+++ b/lib/ansible/plugins/action/aws_s3.py
@@ -20,7 +20,7 @@ __metaclass__ = type
 
 import os
 
-from ansible.errors import AnsibleError, AnsibleAction, AnsibleActionFail
+from ansible.errors import AnsibleError, AnsibleAction, AnsibleActionFail, AnsibleFileNotFound
 from ansible.module_utils._text import to_text
 from ansible.plugins.action import ActionBase
 
@@ -43,11 +43,17 @@ class ActionModule(ActionBase):
             new_module_args = self._task.args.copy()
             if source:
                 source = os.path.expanduser(source)
-                try:
-                    source = self._loader.get_real_file(self._find_needle('files', source))
-                    new_module_args['src'] = source
-                except AnsibleError as e:
-                    raise AnsibleActionFail(to_text(e))
+
+                # For backward compatibility check if the file exists on the remote; it should take precedence
+                if not self._remote_file_exists(source):
+                    try:
+                        source = self._loader.get_real_file(self._find_needle('files', source))
+                        new_module_args['src'] = source
+                    except AnsibleFileNotFound as e:
+                        # module handles error message for nonexistent files
+                        new_module_args['src'] = source
+                    except AnsibleError as e:
+                        raise AnsibleActionFail(to_text(e))
 
             # execute the aws_s3 module now, with the updated args
             result.update(self._execute_module(module_args=new_module_args, task_vars=task_vars))