edit-icon download-icon

NAS アクセス

最終更新日: Dec 20, 2018

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 の定義は次のとおりです。

  1. "nasMountConfig": {
  2. "ServerAddr" : string,
  3. "MountDir" : string
  4. }
  5. "nasConfig" : {
  6. "UserId" : int,
  7. "GroupId" : int,
  8. "MountPoints" : [nasMountConfig]
  9. }
UserId と GroupId

nasConfig の最初の部分は、関数が NAS ファイルシステムにアクセスするために使用する userIdgroupId の値です。このサービスのすべての関数は、ユーザー ID が userId、グループID が groupId であるユーザーで実行され、ファイルシステムにアクセスします。したがって、NAS ファイルシステムに正しい NAS 権限グループを設定して、関数が読み書きできるようにしてください。

userIdgroupId の有効な値の範囲は、 -1 から 65534 です。ユーザーが root として実行することを許可していないため、0 は除外されます。userIdgroupId はどちらもサービス作成時のオプション設定です。デフォルトのユーザー ID はシステム定義の値 (変更も可能) で、デフォルトのグループ ID は指定されていない場合、常にユーザー ID と同じです。関数が特定の ID に依存していない場合にのみ、デフォルトのユーザー ID を使用してください。ベストプラクティスは、特定のグループ ID を使用して、さまざまな関数間でファイルを共有し、ユーザー ID はシステムのデフォルトのままにすることです。

ユーザーはサービスを更新するときに、-1 を使用して、 userId または groupId 値をデフォルトにリセットできます。

マウントポイント

nasConfig の次の部分は、 NAS マウントポイントの設定です。各サービスに最大 5 つの NAS マウントポイントを提供できます。各 nasMountConfig は、 NAS の ServerAddrMountDir のペアで構成されています。

ServerAddr

ServerAddr フィールドには、サービスがアクセスする必要のある NAS ファイルシステム内のリモートディレクトリが記述されます。2 つのパートで構成されています。最初のパートは NAS マウントポイントです。NAS コンソールに移動して、NAS システム内にマウントポイントを作成でき、サービスがアクセスしたいファイルシステムを見つけることができます。(以下の図を参照)add mount2 番目のパートは、ファイルシステムの絶対ディレクトリです。マウントアドレスの値をコピーし、それをディレクトリパスと連結して 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 です。nas console

コンソールには、サービス VPC ネットワーク内からアクセス可能な NAS 内のすべてのマウントポイントを示すドロップダウンメニューがあります。ユーザーはリストから 1 つのマウントポイントを選択し、リモートルートパスの絶対パスを入力して ServerAddr を作成できます。コンソールで、これをローカルのマウントディレクトリの値と組み合わせて 1 つの nasMountConfig エントリを作成します。

SDK を使用して NAS 設定を作成する

ユーザーは、プログラムによって NAS Config を作成して更新することもできます。以下は、NAS のサービスを作成する Python2.7 で書かれたコードスニペットです。

  1. vpcConfig = {
  2. 'vpcId': 'my-vpcId',
  3. 'vSwitchIds': [id],
  4. 'securityGroupId': 'my-securityGroupId'
  5. }
  6. nasConfig = {
  7. "userId": my-uid,
  8. "groupId": my-gid,
  9. "mountPoints": [
  10. {
  11. "serverAddr": 'xxx-nas.com:/fc',
  12. "mountDir": '/mount/dir'
  13. }
  14. ]
  15. }
  16. service = client.create_service(name, role=self.vpcRole, vpcConfig=vpcConfig, nasConfig=nasConfig)

関数で NAS を使用する

NAS システムは設定後に使用できるようになります。実行時に他のクライアントやライブラリを使用する必要はありません。ローカルファイルシステムを使用するのとまったく同じです。以下は、NAS ファイルシステムの作成/書き込み/読み込みの python2.7 コードサンプルです。ローカルマシン上で同じコードをデバッグし、変更なしで Function Compute にアップロードできます。

  1. import json
  2. import logging
  3. import random
  4. import string
  5. import os
  6. def handler(event, context):
  7. logger = logging.getLogger()
  8. evt = json.loads(event)
  9. root_dir = evt["root_dir"]
  10. sub_dir = randomString(16)
  11. logger.info('uid : ' + str(os.geteuid()))
  12. logger.info('gid : ' + str(os.getgid()))
  13. file_name = randomString(6)+'.txt'
  14. newDir = root_dir + '/' + sub_dir + '/'
  15. content = "NAS here I come"
  16. os.mkdir(newDir)
  17. fw = open(newDir+file_name, "w+")
  18. fw.write(content)
  19. fw.close()
  20. fr = open(newDir+file_name)
  21. line = fr.readline()
  22. if line != content:
  23. return False
  24. fr.close()
  25. os.remove(newDir+file_name)
  26. os.rmdir(newDir)
  27. return True
  28. def randomString(n):
  29. return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(n))