def METHOD_NAME(self, file_name, remote_path):
    """
    Uploads given file to S3
    :param file_name: Path to the file that will be uploaded
    :param remote_path:  be uploaded
    :return: VersionId of the latest upload
    """
    if self.prefix and len(self.prefix) > 0:
        remote_path = "{0}/{1}".format(self.prefix, remote_path)
    # Check if a file with same data exists
    if not self.force_upload and self.file_exists(remote_path):
        LOG.debug("File with same data already exists at {0}. "
                  "Skipping upload".format(remote_path))
        return self.make_url(remote_path)
    try:
        # Default to regular server-side encryption unless customer has
        # specified their own KMS keys
        additional_args = {
            "ServerSideEncryption": "AES256"
        }
        if self.kms_key_id:
            additional_args["ServerSideEncryption"] = "aws:kms"
            additional_args["SSEKMSKeyId"] = self.kms_key_id
        if self.artifact_metadata:
            additional_args["Metadata"] = self.artifact_metadata
        print_progress_callback = \
            ProgressPercentage(file_name, remote_path)
        future = self.transfer_manager.METHOD_NAME(file_name,
                                              self.bucket_name,
                                              remote_path,
                                              additional_args,
                                              [print_progress_callback])
        future.result()
        return self.make_url(remote_path)
    except botocore.exceptions.ClientError as ex:
        error_code = ex.response["Error"]["Code"]
        if error_code == "NoSuchBucket":
            raise NoSuchBucketError(bucket_name=self.bucket_name)
        raise ex