Object Storage Service (OSS) は、安全で低コスト、高い信頼性を誇る大容量のクラウドストレージサービスです。Function Compute サービスに OSS マウントポイントを設定することで、サービス内の関数がローカルファイルシステムのように OSS と対話できるようになります。これにより、リソースへのアクセスとデータ処理のフローが簡素化されます。
制限事項
Function Compute は、同一リージョン内のサービスごとに最大 5 つの NAS マウントポイントと 5 つの OSS マウントポイントをサポートします。
関数実行環境で NAS および OSS マウントポイントに設定するローカルディレクトリは、競合しないようにする必要があります。
NAS マウントポイントの設定方法の詳細については、「NAS ファイルシステムの設定」をご参照ください。
前提条件
Object Storage Service (OSS)
Function Compute
サービスを作成します。詳細については、「サービスの作成」をご参照ください。
サービスロールの権限を設定します。OSS マウント機能を有効にする場合は、Function Compute サービスが OSS にアクセスできるロールを設定する必要があります。詳細については、「Function Compute に他の Alibaba Cloud サービスへのアクセス権限を付与」をご参照ください。
操作手順
ステップ 1:OSS マウントポイントの設定
Function Compute では、OSS はサービスレベルで設定されます。つまり、サービスに OSS マウントポイントを設定すると、そのサービス内のすべての関数が指定された OSS バケット内のファイルにアクセスできるようになります。
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[サービス & 関数] をクリックします。
上部のナビゲーションバーでリージョンを選択します。[サービス] ページで対象のサービスを見つけ、[操作] 列の [設定] をクリックします。
[サービス編集] ページで、[ストレージ設定] セクションの以下のパラメーターを設定し、[保存] をクリックします。
設定項目
説明
例
OSS のマウント
OSS ファイルシステムを有効または無効にします。
有効化:OSS ファイルシステムを有効にします。
無効化:OSS ファイルシステムを無効にします。
有効化
OSS マウントポイント:OSS マウントポイントに以下の設定を構成します。
バケット
既存の OSS バケットを選択します。新しいバケットを作成するには、下にある [新しい OSS バケットの作成] をクリックします。これにより、Object Storage Service コンソールが開き、手動で作成できます。料金の詳細については、「OSS の課金概要」をご参照ください。
example-bucket
バケットサブディレクトリ
バケット内にサブディレクトリを設定します。絶対パスを使用してください。バケットのルートディレクトリをマウントする場合は、この項目を空にするか、/ に設定します。
/files
OSS エンドポイント
バケットを選択すると、そのバケットのデフォルトのエンドポイントが表示されます。[カスタムエンドポイント] を選択して変更することもできます。リージョンごとのエンドポイントについては、「リージョンとエンドポイント」をご参照ください。
説明Function Compute サービスと同じリージョンにあるバケットを選択した場合は、OSS の内部ネットワークエンドポイントを使用することを推奨します。
バケットが異なるリージョンにある場合は、パブリックネットワークエンドポイントを使用します。この場合、インターネット経由のアウトバウンドトラフィック料金が発生します。
デフォルトアドレス
関数内のローカルディレクトリ
関数実行環境内にローカルディレクトリを設定します。パスは /home、/mnt、または /data のサブディレクトリである必要があります。
説明このディレクトリを手動で作成する必要はありません。設定後すぐに使用できます。
/mnt/oss
関数内のローカルディレクトリの権限
関数実行環境でマウントされたディレクトリの読み取り専用または読み取り/書き込み権限を設定します。
読み取り/書き込み
説明OSS のマウントは、サービスのネットワーク設定に依存します。サービスが VPC からのアクセスのみを許可し ([指定された VPC からの関数呼び出しのみを許可] が [はい] に設定され、[関数にインターネットへのアクセスを許可] が [いいえ] に設定されている場合)、パブリックネットワークエンドポイントを使用する場合は、指定された VPC を介して関数がインターネットにアクセスできることを確認する必要があります。詳細については、「静的パブリック IP アドレスの設定」をご参照ください。
ステップ 2:関数の作成とマウントされた OSS ディレクトリ内のファイルへのアクセス
OSS マウントポイントを設定した後、マウントされたディレクトリ内のファイルにローカルファイルのようにアクセスできます。
[関数の作成] ページで、以下の設定を行います。他の設定はデフォルト値のままにして、[作成] をクリックします。
作成方法:[ビルトインランタイムで作成]
基本設定:[関数名] を入力します。[ハンドラタイプ] で、[イベントハンドラ] を選択します。
関数コード:[ランタイム] で、[Python 3.10] を選択します。[コードアップロード方法] で、[サンプルコード] を選択します。
関数詳細ページで、[関数コード] タブをクリックします。コードエディタでコードを入力し、[コードのデプロイ] をクリックします。
この例では Python を使用します。以下のコードは一例です。
import os def handler(event, context): # マウントされたディレクトリ mount_path = '/mnt/oss' # マウントされたディレクトリ内のファイルをリスト表示 files = os.listdir(mount_path) print("Files in OSS mount:", files) # マウントされたディレクトリ内のファイルを読み取り 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_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を、マウントされた OSS ディレクトリ内の実際のファイル名に置き換えてください。コードがデプロイされた後、[関数コード] タブの [関数のテスト] をクリックします。
関数が実行された後、[関数コード] タブの下で結果を確認できます。[ログ] タブでは、マウントされた OSS ディレクトリから読み取った
example.txtの内容を確認できます。OSS コンソールでは、マウントされたディレクトリに書き込まれたoutput.txtの内容を確認できます。
よくある質問
OSS のマウントに失敗します。エラーメッセージは bucket not found です。
OSS のエンドポイントとバケット名が正しいことを確認してください。
OSS のマウントに失敗します。エラーメッセージは host resolv error または deadline exceeded です。
エンドポイントが正しいことを確認してください。
host resolv errorメッセージは、エンドポイントの名前解決の失敗を示します。deadline exceededエラーは、異なるリージョンから内部ネットワークエンドポイントを使用した場合に発生します。内部ネットワークエンドポイントはリージョンをまたいで使用することはできません。
OSS のマウントに失敗します。エラーメッセージは invalid credentials です。
サービスに割り当てられた RAM ロールに OSS へのアクセス権限があることを確認してください。必要な権限は以下の通りです。詳細については、「Function Compute に他の Alibaba Cloud サービスへのアクセス権限を付与」をご参照ください。
読み取り専用:
oss:ListObjectsおよびoss:GetObjectアクションが含まれます。読み取り/書き込み:
oss:ListObjects、oss:GetObject、oss:PutObject、oss:DeleteObject、oss:ListParts、およびoss:AbortMultipartUploadアクションが含まれます。
oss:ListObjects はバケットレベルのアクションです。したがって、特定のバケットへのアクセスを許可する場合、ポリシーには acs:oss:*:*:bucketName のようなバケットレベルのリソース ARN を含める必要があります。詳細については、「OSS リソースの説明」をご参照ください。
マウントされたファイルを読み取る際に、エラーメッセージ Input/output error が表示されます。
ご利用の OSS バケットのストレージクラスを確認してください。アーカイブストレージまたはコールドアーカイブストレージクラスを使用するバケット内のファイルは凍結されています。これらのファイルにアクセスする前に、解凍する必要があります。OSS バケットには標準ストレージクラスを使用することを推奨します。
設定したローカルディレクトリ内のファイルを表示するにはどうすればよいですか?
関数詳細ページで、[インスタンス] タブをクリックします。[実行中] 状態のインスタンスを見つけます。そのインスタンスの [操作] 列にある [接続] をクリックします。

インスタンスに接続した後、コマンドを実行して、設定したローカルディレクトリ内のファイルをリスト表示できます。例:

関数インスタンスがマウントポイントにアクセスする際に Transport endpoint is not connected と表示されます。
このエラーは、関数インスタンスのメモリが少ないか、メモリ使用量が高い場合に発生する可能性があります。これにより、メモリ不足 (OOM) エラーが原因で OSS マウント機能が失敗することがあります。この問題を解決するには、関数のメモリサイズを増やしてください。OSS マウントポイントを使用する場合は、メモリサイズを少なくとも 512 MB に設定することを推奨します。
関数ディレクトリに書き込まれたファイルは永続的に保存されますか?
いいえ、保存されません。関数インスタンスが破棄されると、関数ディレクトリに書き込まれたファイルは削除されます。データを永続的に保存するには、マウントポイントを設定する必要があります。NAS と OSS の両方のマウントポイントが永続ストレージをサポートしています。詳細については、「NAS ファイルシステムの設定」および「OSS ファイルシステムの設定」をご参照ください。
権限ポリシーを使用して特定のバケットへの読み取り専用アクセスを許可するにはどうすればよいですか?
権限ポリシーを使用して特定のバケットへの読み取り/書き込みアクセスを許可するにはどうすればよいですか?
権限ポリシーを使用してバケット内の特定のサブディレクトリへの読み取り専用アクセスを許可するにはどうすればよいですか?
権限ポリシーを使用してバケット内の特定のサブディレクトリへの読み取り/書き込みアクセスを許可するにはどうすればよいですか?
OSS マウントポイント経由でファイルを書き込むと、OSS コンソールでファイルが空に見えます。
デフォルトでは、書き込まれたコンテンツは、ファイルが明示的にフラッシュまたはクローズされたときにのみ OSS にアップロードされます。
OSS マウントポイントでの圧縮、展開、ファイル転送などの操作の応答が遅いです。
OSS はファイルシステム API をサポートしていません。OSS バケットをディレクトリとしてマウントした後、Function Compute は OSS API をラップしてファイルシステム API をシミュレートします。たとえば、OSS はランダム書き込み操作をサポートしていません。ファイルシステム API を使用して OSS マウントポイント上の既存のファイルを変更する場合、Function Compute は OSS からソースファイル全体をダウンロードし、それを変更してから OSS に再アップロードします。
シーケンシャルな読み取りや書き込みなど、OSS API に直接マッピングされる操作は良好なパフォーマンスを発揮します。しかし、圧縮や展開など、複数の OSS API 呼び出しを必要とする操作は、ランダムな読み取りを伴うことが多く、OSS へのより多くのラウンドトリップリクエストが必要です。その結果、これらの操作はローカルファイルシステム上よりも遅くなります。
異なる関数インスタンスは、同じ OSS マウントポイントへのアクセスを調整または同期しますか?
関数インスタンスは独立して動作します。その結果、OSS マウントポイント上のコンテンツはインスタンス間で一貫性がない場合があります。たとえば、関数インスタンス A を使用して OSS マウントポイント上にファイル F を作成した場合、関数インスタンス B からリアルタイムでそのファイルを取得できない場合があります。