Alibaba Cloud Network Attached Storage (NAS) は、信頼性と可用性の高い分散ファイルシステムであり、標準のファイルアクセスプロトコルをサポートしています。これにより、既存のアプリケーションをそのまま Alibaba Cloud で利用することができます。
Alibaba Cloud Function Compute は現在、 NAS とシームレスに統合されています。ローカルファイルにアクセスするのと同じ方法で、NAS ファイルシステムに格納されているファイルにアクセスする関数を記述することができます。サービス上の NAS マウントポイント情報を含め NAS 固有の設定を提供します。サービスが、有効な NAS 設定を取得すると、すべての関数はローカルファイルシステムのような、特定の NAS ファイルシステムにアクセスできます。
NAS の設定
NAS 関連の設定は、サービスレベルの設定であり、サービス下のすべての関数が、同じ NAS 設定を共有していることを意味します。Function Compute で使用する前に、NAS 機能が有効になっていることを確認してください。
VPC と NAS
NAS をサービスに追加するための重要な前提条件の 1 つは、サービスで VPC の設定が必要なことです。NAS はユーザーが作成した VPC ネットワーク内に、マウントポイントを安全に作成するだけなので、ユーザーは指定された NAS ファイルシステムにアクセスするために、サービスが正しい VPC 設定で構成されていることを確認する必要があります。
nasConfig
nasConfig
の定義は次のとおりです。
"nasMountConfig": {
"ServerAddr" : string,
"MountDir" : string
}
"nasConfig" : {
"UserId" : int,
"GroupId" : int,
"MountPoints" : [nasMountConfig]
}
UserId と GroupId
nasConfig
の最初の部分は、関数が NAS ファイルシステムにアクセスするために使用する userId
と groupId
の値です。このサービスのすべての関数は、ユーザー ID が userId
、グループID が groupId
であるユーザーで実行され、ファイルシステムにアクセスします。したがって、NAS ファイルシステムに正しい NAS 権限グループを設定して、関数が読み書きできるようにしてください。
userId
と groupId
の有効な値の範囲は、 -1 から 65534 です。ユーザーが root として実行することを許可していないため、0 は除外されます。userId
と groupId
はどちらもサービス作成時のオプション設定です。デフォルトのユーザー ID はシステム定義の値 (変更も可能) で、デフォルトのグループ ID は指定されていない場合、常にユーザー ID と同じです。関数が特定の ID に依存していない場合にのみ、デフォルトのユーザー ID を使用してください。ベストプラクティスは、特定のグループ ID を使用して、さまざまな関数間でファイルを共有し、ユーザー ID はシステムのデフォルトのままにすることです。
ユーザーはサービスを更新するときに、-1 を使用して、 userId
または groupId
値をデフォルトにリセットできます。
マウントポイント
nasConfig
の次の部分は、 NAS マウントポイントの設定です。各サービスに最大 5 つの NAS マウントポイントを提供できます。各 nasMountConfig
は、 NAS の ServerAddr
と MountDir
のペアで構成されています。
ServerAddr
ServerAddr
フィールドには、サービスがアクセスする必要のある NAS ファイルシステム内のリモートディレクトリが記述されます。2 つのパートで構成されています。最初のパートは NAS マウントポイントです。NAS コンソールに移動して、NAS システム内にマウントポイントを作成でき、サービスがアクセスしたいファイルシステムを見つけることができます。(以下の図を参照)2 番目のパートは、ファイルシステムの絶対ディレクトリです。マウントアドレスの値をコピーし、それをディレクトリパスと連結して ServerAddr
の値として使用できます。たとえば、NAS ファイルシステムのマウントアドレスが “xxxx-nas.aliyuncs.com” で、関数のアクセスを /workspace/document ディレクトリの下に制限したい場合は、 ServerAddr
は “xxxx-nas.aliyuncs.com:/workspace/document” になります。
MountDir
MountDir
はローカルファイルシステムのマウントポイントを指します。”/bin”, “/opt”, “/var”, “/dev” などの一般的な Linux システムディレクトリの下に NAS ディレクトリをマウントしないことを推奨します。ユーザーは NAS ファイルシステムを “/mnt”、”/home” などのディレクトリにマウントできます。
ServerAddr
と組み合わせて、NASファイルシステム内の特定のディレクトリからローカルファイルシステム内のディレクトリへのマッピングを形成します。前の例でいうと、MountDir
を /mnt/fc として nasMountConfig
に設定すると、このサービスのすべての関数は、NAS ファイルシステム内のローカルディレクトリ /mnt/fc をリモートディレクトリ /workspace/document として使用できます。
コンソールで NAS を使用する
ユーザーは、サービスの作成や更新中に、コンソール上で nasConfig
を設定できます。VPC を使用して NAS にアクセスするため、Nas Config パネルは、サービスに VPC 設定がある場合にのみ有効です。値が入力されていない場合、デフォルトのユーザー/グループ ID は -1 です。
コンソールには、サービス VPC ネットワーク内からアクセス可能な NAS 内のすべてのマウントポイントを示すドロップダウンメニューがあります。ユーザーはリストから 1 つのマウントポイントを選択し、リモートルートパスの絶対パスを入力して ServerAddr
を作成できます。コンソールで、これをローカルのマウントディレクトリの値と組み合わせて 1 つの nasMountConfig
エントリを作成します。
SDK を使用して NAS 設定を作成する
ユーザーは、プログラムによって NAS Config を作成して更新することもできます。以下は、NAS のサービスを作成する Python2.7 で書かれたコードスニペットです。
vpcConfig = {
'vpcId': 'my-vpcId',
'vSwitchIds': [id],
'securityGroupId': 'my-securityGroupId'
}
nasConfig = {
"userId": my-uid,
"groupId": my-gid,
"mountPoints": [
{
"serverAddr": 'xxx-nas.com:/fc',
"mountDir": '/mount/dir'
}
]
}
service = client.create_service(name, role=self.vpcRole, vpcConfig=vpcConfig, nasConfig=nasConfig)
関数で NAS を使用する
NAS システムは設定後に使用できるようになります。実行時に他のクライアントやライブラリを使用する必要はありません。ローカルファイルシステムを使用するのとまったく同じです。以下は、NAS ファイルシステムの作成/書き込み/読み込みの python2.7 コードサンプルです。ローカルマシン上で同じコードをデバッグし、変更なしで Function Compute にアップロードできます。
import json
import logging
import random
import string
import os
def handler(event, context):
logger = logging.getLogger()
evt = json.loads(event)
root_dir = evt["root_dir"]
sub_dir = randomString(16)
logger.info('uid : ' + str(os.geteuid()))
logger.info('gid : ' + str(os.getgid()))
file_name = randomString(6)+'.txt'
newDir = root_dir + '/' + sub_dir + '/'
content = "NAS here I come"
os.mkdir(newDir)
fw = open(newDir+file_name, "w+")
fw.write(content)
fw.close()
fr = open(newDir+file_name)
line = fr.readline()
if line != content:
return False
fr.close()
os.remove(newDir+file_name)
os.rmdir(newDir)
return True
def randomString(n):
return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(n))