Object Storage Service (OSS) は、安全で費用対効果が高く、信頼性の高いクラウドストレージサービスです。 OSSでは、大量のデータをクラウドに保存できます。 Function ComputeのサービスにOSSバケットをマウントして、サービス内の関数がオンプレミスのファイルシステムへのアクセスと同様の方法でOSSバケットにアクセスできるようにします。 これにより、リソースアクセスとデータ処理が簡素化されます。
制限事項
リージョン内のFunction Computeのサービスに対して、最大5つのApsara File Storage NAS (NAS) マウントターゲットと5つのOSSマウントターゲットを設定できます。
NASマウントターゲットの関数ランタイムのローカルディレクトリは、OSSマウントターゲットの関数ランタイムのローカルディレクトリと同じにすることはできません。
NASマウントターゲットを設定する方法の詳細については、「NASファイルシステムの設定」をご参照ください。
始める前に
OSS
Function Compute
サービスを作成します。 詳細については、「サービスの作成」をご参照ください。
サービスのロールの権限を設定します。 OSSマウント機能を有効にする場合、Function Computeのサービスに対してOSSに対する権限を持つロールを設定する必要があります。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。
手順
手順1: OSSマウントの設定
Function Computeのサービスに対してOSSマウントターゲットを設定すると、サービス内のすべての関数が指定されたOSSバケット内のファイルにアクセスできます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで目的のサービスを見つけ、[操作] 列の [設定] をクリックします。
では、ストレージ設定[サービスの変更] ページのセクションで、次のパラメーターを設定し、保存 をクリックします。
パラメーター
説明
例
OSSのマウント
OSSマウントを有効にするかどうかを指定します。 有効な値:
有効
無効化
有効にする
OSSマウントターゲット: OSSマウントターゲットを設定します。
バケット
既存のバケットを選択します。 OSSバケットを作成するには、ページ下部の [OSSバケットの作成] をクリックしてOSSコンソールに移動します。 OSSの課金の詳細については、「課金の概要」をご参照ください。
例バケット
Bucket Subdirectory
バケット内のサブディレクトリとして絶対パスを指定します。 このパラメーターを空のままにするか、このパラメーターを /に設定すると、バケットのルートディレクトリがマウントされます。
/ファイル
OSSエンドポイント
エンドポイントを指定します。 デフォルトでは、バケットのエンドポイントが使用されます。 [カスタムエンドポイント] を選択して、カスタムエンドポイントを指定できます。 異なるリージョンのOSSエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
説明Function Computeのサービスと同じリージョンにあるバケットを選択した場合、内部OSSエンドポイントを使用することを推奨します。
別のリージョンにあるバケットを選択する場合は、パブリックエンドポイントを使用する必要があります。 この場合、インターネット経由で転送されたデータに対して課金されます。
デフォルトのエンドポイント
ローカル関数ディレクトリ
ローカル関数ディレクトリを指定します。 ディレクトリは、/home、/mnt、または /dataのサブディレクトリである必要があります。
説明ローカル関数ディレクトリを手動で作成する必要はありません。 既存のディレクトリを直接使用できます。
/mnt/oss
ローカル関数ディレクトリの権限
バケットがローカル関数ディレクトリにマウントされた後、ディレクトリに対する権限を指定します。 読み取り専用または読み取りと書き込みを選択できます。
読み取りと書き込み
説明OSSマウント機能は、サービスのネットワーク設定によって異なります。 VPCへのアクセスを [はい] に設定し、インターネットへのアクセスを [いいえ] に設定した場合、パブリックOSSエンドポイントを使用して、関数が指定されたVPC経由でインターネットにアクセスできるようにする必要があります。 詳細については、「静的パブリックIPアドレスの設定」をご参照ください。
手順2: 関数を作成し、マウントされたOSSディレクトリにアクセスするためのコードを記述する
OSSバケットをマウントした後、次の手順を実行して、オンプレミスファイルへのアクセスと同様の方法で、マウントされたOSSディレクトリ内のファイルにアクセスできます。
[関数の作成] ページで、次のパラメーターを設定します。 他のパラメーターのデフォルト値を保持し、[作成] をクリックします。
関数を作成するメソッド: 組み込みランタイムを使用。
基本設定: [関数名] を設定し、[ハンドラータイプ] を [イベントハンドラー] に設定します。
Code: RuntimeをPython 3.10に設定し、Code Upload Methodをサンプルコードに設定します。
関数の詳細ページで、[コード] タブをクリックし、コードエディターでコードを記述し、[デプロイ] をクリックします。
次のサンプルコードは、Pythonで関数コードを記述する方法の例を示しています。
import os def handler(event, context): # Mounted directory. mount_path = '/mnt/oss' # List files in the mounted directory. files = os.listdir(mount_path) print("Files in OSS mount:", files) # Read a file in the mounted directory. file_path = os.path.join(mount_path, 'example.txt') if os.path.exists(file_path): with open(file_path, 'r') as file: content = file.read() print("Content of example.txt:", content) else: print("example.txt does not exist.") # Write a file to the mounted directory. write_path = os.path.join(mount_path, 'output.txt') with open(write_path, 'w') as file: file.write("Hello, OSS mount!") print("Wrote to output.txt in OSS mount.") return "Function execution completed."
説明example.txt
を、マウントされたディレクトリ内の既存のファイルの名前に置き換えます。コードがデプロイされたら、[コード] タブの [テスト機能] をクリックします。
実行が完了したら、[コード] タブの下部に実行結果を表示できます。 [ログ出力] タブでは、ディレクトリで読み取られたファイル (この例では
example.txt
) の内容を表示できます。 ディレクトリに書き込まれたファイルの内容 (この例ではoutput.txt
) を表示することもできます。
よくある質問
OSSのマウントが失敗し、bucket not found
エラーが報告された場合はどうすればよいですか。
OSSエンドポイントとバケット名が正しいかどうかを確認します。
OSSのマウントが失敗し、host resolvエラー
またはdeadline exceeded
エラーが報告された場合はどうすればよいですか。
エンドポイントが正しく設定されているかどうかを確認します。
エンドポイントのドメイン名の解決に失敗した場合、
host resolvエラー
が報告されます。内部エンドポイントはリージョン間では使用できません。 別のリージョンで内部エンドポイントを使用すると、接続タイムアウトエラーが発生し、
期限超過
エラーが報告されます。
OSSのマウントが失敗し、無効な資格情報
エラーが報告された場合はどうすればよいですか。
サービス用に設定したRAMロールにOSSの権限があるかどうかを確認します。 次の項目は、権限について説明します。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。
読み取り専用:
oss:ListObjects
およびoss:GetObject
読み取りと書き込み:
oss:ListObjects
、oss:GetObject
、oss:PutObject
、oss:DeleteObject
、oss:ListParts
、およびoss:AbortMultipartUpload
。
oss:ListObjects
はバケットレベルのアクションです。 特定のバケットへのアクセスを有効にする場合、ポリシーにacs:oss:*:*:bucketName
などのバケットレベルのリソース表示を含める必要があります。 詳細については、「OSSのRAMポリシーのリソース要素」をご参照ください。
マウントされたディレクトリ内のファイルを読み込んだときに入出力エラー
が報告された場合、どうすればよいですか?
設定したOSSバケットのストレージクラスを確認します。 ストレージクラスがArchiveまたはCold Archiveの場合、バケットに保存されているすべてのオブジェクトはフリーズされ、フリーズ解除された後にのみアクセスされます。 OSSバケットのストレージクラスをStandardに設定することを推奨します。
関数のローカルディレクトリにあるファイルを表示するにはどうすればよいですか?
機能の詳細ページで、[インスタンス] をクリックして、[実行中] 状態のインスタンスを表示します。 目的のインスタンスを見つけて、[操作] 列の [ログイン] をクリックします。
インスタンスに接続した後、コマンドを実行して、関数のローカルディレクトリにあるファイルを表示できます。 コマンド出力の例を次の図に示します。
関数インスタンスのマウントターゲットにアクセスしたときに、トランスポートエンドポイントが接続されていません
エラーが報告された場合の対処方法。
このエラーは、メモリが不足しているためにOSSマウント機能が使用できなくなった場合に報告されることがあります。 ビジネス要件に基づいて、関数のメモリ仕様を増やすことを推奨します。 OSSマウントターゲットを使用する場合は、メモリ容量を512 MB以上に設定します。
ローカル関数ディレクトリに書き込まれたデータは永続的に保存されますか?
関数インスタンスが破壊されると、そのインスタンスによってディレクトリに書き込まれたデータも削除されます。 データを永続的に保存する場合は、NASファイルシステムやOSSバケットなどのファイルシステムをマウントすることを推奨します。 詳細については、「NASファイルシステムの設定」および「OSSファイルシステムの設定」をご参照ください。
権限ポリシーを使用して、指定されたバケットへの読み取り専用アクセスのみを許可するにはどうすればよいですか?
権限ポリシーを使用して、指定されたバケットへの読み取りおよび書き込みアクセスを許可するにはどうすればよいですか。
権限ポリシーを使用して、指定したバケットのサブディレクトリへの読み取り専用アクセスのみを許可するにはどうすればよいですか?
権限ポリシーを使用して、指定したバケットのサブディレクトリへの読み取りおよび書き込みアクセスを許可するにはどうすればよいですか。
OSSのOSSマウントターゲットから書き込むデータが表示されない場合はどうすればよいですか。
OSSマウントターゲットからファイルを書き込むと、フラッシュ操作を呼び出すかファイルを閉じるときにのみ、システムはコンテンツをOSSにアップロードします。
OSSマウントターゲットでの圧縮、解凍、ファイル送信などの操作が遅い場合はどうすればよいですか。
OSSはファイルシステムAPIをサポートしていません。 OSSバケットをディレクトリとしてマウントした後、Function ComputeはOSS APIをカプセル化してファイルシステムAPIを実装します。 たとえば、OSSはランダム書き込みをサポートしていません。 ファイルシステムAPIを使用してOSSマウントターゲット上の既存のファイルを変更する必要がある場合、Function ComputeはOSSからソースファイルをダウンロードし、ファイルを書き換えてから再度OSSにアップロードします。
ファイルシステムAPIの機能がOSS APIの機能に対応する場合 (ファイルのシーケンシャルな読み取りおよび書き込み機能など) 、通常は一般的な操作のパフォーマンスが向上します。 ただし、圧縮および解凍中のファイルに対するランダムな読み取りおよび書き込み操作など、OSS APIを組み合わせてカプセル化する必要がある操作では、OSSとの複数の操作が必要になる場合があります。 したがって、パフォーマンスはオンプレミスのファイルシステムのパフォーマンスに比べてわずかに劣ります。
同じOSSターゲット上の関数インスタンス間で操作が同期されますか。
いいえ。 関数インスタンスは互いに独立しています。 インスタンスによってアクセスされるOSSマウントターゲットのコンテンツは異なる場合があります。 たとえば、インスタンスAがOSSマウントターゲットにファイルFを作成した場合、インスタンスBはすぐにファイルにアクセスできない場合があります。