配置NAS文件系统

在函数计算的应用场景中,面对多个应用或函数需共享访问同一组数据的需求,例如,机器学习应用中,训练好的模型需要被多个推理函数共享,您可以为函数配置NAS文件系统来存储这些数据,实现文件共享,简化数据管理流程,同时解决本地磁盘空间限制问题。为函数配置NAS文件系统后,您的FC函数可以像操作本地文件系统一样,轻松执行读取和写入NAS文件的操作。

前提条件

  • 函数计算

    已创建函数并为函数配置VPC网络访问能力。具体操作,请参见创建函数配置网络

    说明

    目前只支持在私有的VPC环境内添加NAS挂载点,因此,在配置网络时需设置允许函数访问VPC内资源,并配置正确的VPC,才能访问指定的NAS文件系统。

  • 文件存储NAS

    已创建NAS文件系统,并添加挂载点。具体操作,请参见创建文件系统添加挂载点

使用限制

  • 函数计算在同一地域下的一个函数最多支持配置5个NAS挂载点和5个OSS挂载点。

  • NAS挂载点和OSS挂载点设置的函数运行环境中的本地目录不能冲突。

配置NAS文件系统

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数详情页面,选择配置页签,然后在左侧导航栏选择存储,在NAS 文件系统区域单击编辑,在编辑面板中配置以下参数,然后单击部署

    您可以选择自动配置或自定义配置两种方式来配置NAS文件系统。

    自动配置

    系统自动为您创建一个名称为Alibaba-Fc-V3-Component-Generated的通用型NAS文件系统以及同名的专有网络、交换机和安全组。

    当您下一次再选择自动配置时,系统查询到当前地域下已存在该NAS文件系统,则会复用该文件系统和相关VPC配置,不会重复创建。关于费用详情,请参见VPC产品计费通用型NAS计费

    image

    自定义配置

    您需要手动选择NAS文件系统,设置用户、用户组以及NAS挂载点等NAS相关参数才能完成配置NAS文件系统。

    重点配置项介绍如下:

    配置项

    说明

    示例

    NAS 文件系统

    选择已创建的NAS文件系统。

    如需创建新的NAS文件系统,单击下方的创建新的 NAS 文件系统,跳转到文件存储控制台手动创建。

    重要

    仅支持NFS协议类型的NAS文件系统,不支持SMB协议类型。

    01d394****

    用户用户组

    需填写自定义的用户ID和用户组ID。如您不输入任何值,系统将使用root用户,即UID=0GID=0。更多信息,请参见NAS用户和用户组

    1

    远端目录

    • 通用型NAS的该目录必须以/开头。

    • 极速型NAS的该目录必须以/share开头。

    若您配置的目录在远端NAS中不存在,函数计算将会为您自动创建该目录。目录所有者为上述配置的用户和用户组,权限等级为777

    更多信息,请参见远端目录

    /

    函数本地目录

    建议使用/home/mnt/tmp/data的子目录。

    说明

    不能使用通用的Linux和Unix系统目录及其子目录,例如/bin/opt/var/dev等,以免挂载失败。

    更多信息,请参见函数本地目录

    /mnt/nas

    image

    说明
    • 如果您希望不同函数可以共享NAS文件资源,您需要在为这些函数配置NAS文件系统时,使用同一个用户和用户组。

    • 上传至NAS的文件权限与本地文件权限完全相同。

验证NAS是否挂载成功

准备访问NAS的函数代码

完成NAS文件系统的配置后,您可以在您的函数代码中,通过挂载时指定的路径来访问NAS文件系统。

  1. 在函数详情页面,单击代码页签,在代码编辑器中编写代码,然后单击部署代码

    本文以Python事件函数代码为例,在代码中完成将内容写入NAS文件系统和读取NAS文件内容。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import random
    import subprocess
    import string
    import os
    
    
    def handler(event, context):
        # report file system disk space usage and check NAS mount target
        out, err=subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE).communicate()
        print('disk: ' + str(out))
        lines = [ l.decode() for l in out.splitlines() if str(l).find(':') != -1 ]
        nas_dirs = [ x.split()[-1] for x in lines ]
        print('uid : ' + str(os.geteuid()))
        print('gid : ' + str(os.getgid()))
    
        for nas_dir in nas_dirs:
            sub_dir = randomString(16)
            file_name = randomString(6)+'.txt'
            new_dir = nas_dir + '/' + sub_dir + '/'
            print('test file: ' + new_dir + file_name)
            # 写入NAS文件
            content = "NAS here I come"
            os.mkdir(new_dir)
            fw = open(new_dir + file_name, "w+")
            fw.write(content)
            fw.close()
            # Showing the folder tree in NAS
            for home, dirs, files in os.walk(nas_dir):
                level = home.replace(nas_dir, '').count(os.sep)
                indent = ' ' * 2 * (level)
                print('{}{}/'.format(indent, os.path.basename(home)))
                subindent = ' ' * 2 * (level + 1)
                for f in files:
                    print('{}{}'.format(subindent, f))
            # 读取NAS文件
            f = open(new_dir + file_name, "r")
            print(f.readline())
            f.close()
        
        return 'success'
    
    
    def randomString(n):
        return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(n))
      

验证结果

  1. 代码部署成功后,单击代码页签的测试函数

    执行完成后,您可以在代码页签的下方查看执行结果。在日志输出页签下可以看到函数已经成功写入NAS文件并读取NAS文件。

    image

  2. (可选)完成文件的写入和读取之后,您可以登录实例查看函数本地目录下的文件情况,确认查询到的NAS文件与上一步函数执行成功后日志输出内容是否一致。

    1. 您可以在函数详情页面,单击实例页签,单击目标实例操作列的登录实例

      如果当前没有运行中的实例,可以在代码页签单击测试函数重新执行一次函数,创建实例。

      image

    2. 成功登录实例后,您就可以通过命令查看配置的函数本地目录下的文件信息。示例如下:

      image

  3. (可选)您还可以使用NAS可视化浏览器应用,直接通过浏览器管理已挂载NAS文件系统中的文件。

    登录NAS控制台,找到目标文件系统,在操作列,选择image > 浏览器。如果当前地域不支持直接打开浏览器应用,请参见使用函数计算快速搭建可视化NAS浏览器应用

    image

    image

相关概念

NAS用户和用户组

UserID(用户ID)和GroupID(用户组ID)取值范围为[0, 65534],如果不填写,默认值均为0,即分别表示root用户ID和root用户组ID。您需要根据需求设置文件的拥有者和相应的组权限,确保文件读写权限一致。例如,如果您希望不同函数可以共享NAS文件资源,您需要在为这些函数配置NAS文件系统时,使用同一个用户和用户组。

远端目录和函数本地目录

每个NAS挂载点的地址由远端目录函数本地目录组成。挂载NAS的过程本质上是创建了一个从函数计算实例的本地目录到NAS远端目录的映射关系。

  • 远端目录

    远端NAS中的目录是指位于NAS文件系统中的目录,由挂载点和绝对目录两部分组成。挂载点可以通过NAS控制台来添加。将挂载点和绝对目录拼接得到远端目录。例如,NAS文件系统的挂载点是xxxx-nas.aliyuncs.com,您希望被访问的绝对目录是/workspace/document,对应完整的远端目录就是xxxx-nas.aliyuncs.com:/workspace/document

    您可以登录NAS控制台,在文件系统列表中,单击目标文件系统,然后单击挂载使用,以获取挂载点。

    image

  • 函数本地目录

    函数运行环境中的本地目录是指本地文件系统的挂载点。建议使用/home/mnt/tmp/data的子目录。不能使用通用的Linux和Unix系统目录及其子目录挂载NAS,例如/bin/opt/var/dev等。

相关文档

  • 函数计算支持的存储类型包括文件存储NAS、对象存储OSS、临时硬盘和层,如果您希望了解这些存储类型的适用场景及差异,请参见函数存储选型

  • 如果您需要存储大量图片、视频和文档等非结构化数据,建议您挂载OSS对象存储系统来实现。更多信息,请参见配置OSS对象存储

  • 您还可以使用Serverless Devs为函数挂载NAS系统。具体操作,请参见Serverless Devs常用命令

  • 如果您需要可视化管理为函数配置的NAS文件管理系统,可以通过函数计算应用中心创建NAS可视化浏览器应用。具体操作,请参见快速入门(FC)