Object Storage Service (OSS) は、信頼性が高く、安全で、費用対効果の高いクラウドストレージサービスであり、大容量のデータストレージ容量を提供します。Function Compute に OSS マウントを構成することで、関数がローカルファイルシステムのように OSS にアクセスできるようになります。これにより、リソースへのアクセスとデータ処理が効率化されます。
制限事項
同じリージョン内の Function Compute の関数には、最大 5 つの NAS マウントポイントと 5 つの OSS マウントポイントを構成できます。
関数のランタイム環境における NAS マウントポイントと OSS マウントポイントのローカルディレクトリは競合できません。
詳細については、「NAS ファイルシステムを構成する」をご参照ください。
前提条件
Object Storage Service (OSS)
Function Compute
関数が偽装するロールに必要な権限を付与する必要があります。OSS マウント機能を有効にする場合、OSS にアクセスする権限を持つロールを関数に構成する必要があります。詳細については、「関数ロールを使用して Function Compute に他の Alibaba Cloud サービスへのアクセスを許可する」をご参照ください。
手順
ステップ 1: OSS マウントを構成する
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[設定] タブをクリックし、次に [詳細設定] セクションの [編集] をクリックします。[詳細設定] パネルで [ストレージ] オプションを見つけ、[OSS のマウント] スイッチをオンにし、次のパラメーターを構成してから [デプロイ] をクリックします。
構成項目
説明
例
OSS マウントポイント: OSS マウントポイントを構成します。
バケット
既存のバケットを選択します。新しい OSS バケットを作成するには、下の [新しい OSS バケットの作成] をクリックして OSS コンソール に移動し、手動で作成します。OSS の課金の詳細については、「OSS の課金の概要」をご参照ください。
example-bucket
バケットサブディレクトリ
バケット内のサブディレクトリの絶対パスを設定します。このフィールドを空のままにするか、/ に設定すると、バケットのルートディレクトリがマウントされます。
/files
OSS エンドポイント
選択したバケットに対応するエンドポイントがデフォルトで使用されます。必要に応じて、[カスタムエンドポイント] を選択してエンドポイントの値を変更します。さまざまなリージョンの OSS エンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
説明Function Compute 関数と同じリージョン内のバケットを選択した場合は、内部 OSS エンドポイントを使用します。
別のリージョン内のバケットを選択した場合は、パブリック OSS エンドポイントを使用する必要があります。この場合、インターネット経由のアウトバウンドトラフィックに対して課金されます。
デフォルトのエンドポイント
ローカル関数フォルダー
関数ランタイムでローカルディレクトリを指定します。ディレクトリは /home、/mnt、または /data のサブディレクトリである必要があります。
/mnt/oss
ローカル関数ディレクトリの権限
バケットがマウントされた後のローカルディレクトリのアクセス権限。権限は [読み取り専用] または [読み取り/書き込み] に設定できます。
読み取りと書き込み
説明OSS マウント機能は、関数のネットワーク構成に依存します。[指定された VPC による関数呼び出しのみ] を [はい] に設定し、[デフォルト NIC のインターネットアクセスを許可] を [いいえ] に設定した場合、パブリック OSS エンドポイントを使用するには、関数が指定された VPC を介してインターネットにアクセスできる必要があります。詳細については、「固定パブリック IP アドレスを割り当てる」をご参照ください。
ステップ 2: マウントされたディレクトリ内のファイルにアクセスする
OSS マウントを構成した後、ローカルファイルにアクセスするのと同じ方法で、マウントされたディレクトリ内のファイルにアクセスできます。次の手順に従います。
関数の詳細ページで、[コード] タブをクリックし、コードエディタでコードを記述してから、[デプロイ] をクリックします。
次のサンプルコードは 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エラーが発生します。
invalid credentials エラーでマウントが失敗します。
関数に構成した Resource Access Management (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 などのバケットレベルのリソースを含める必要があります。詳細については、「OSS リソースの説明」をご参照ください。
マウントされたファイルを読み取ると、エラーメッセージが Input/output error になります。
このエラーは、OSS バケットのストレージタイプがアーカイブまたはコールドアーカイブの場合に発生します。これらのストレージタイプのオブジェクトは凍結ステータスにあり、アクセスする前に解凍する必要があります。この問題を解決するには、OSS バケットのストレージタイプを標準に設定します。
構成済みのローカル関数ディレクトリ内のファイルを表示するにはどうすればよいですか?
関数の詳細ページで、[インスタンス] タブをクリックします。インスタンスのリストで、[実行中] 状態のインスタンスを見つけ、[操作] 列の [インスタンスに接続] をクリックします。
インスタンスにログインした後、コマンドを実行して、構成されたローカルディレクトリ内のファイル情報を表示します。例:

関数インスタンスのマウントポイントにアクセスするときに Transport endpoint is not connected エラーが報告された場合はどうすればよいですか?
このエラーは、メモリ仕様が低いかメモリ使用量が高いことによるメモリ不足のために OSS マウント機能が利用できなくなった場合に発生する可能性があります。この問題を解決するには、関数のメモリを増やします。OSS マウントポイントを使用する関数には、少なくとも 512 MB のメモリを指定することをお勧めします。
関数ディレクトリに書き込まれたデータは永続的に保存されますか?
いいえ、保存されません。関数インスタンスが破棄されると、関数ディレクトリに書き込まれたデータも削除されます。データを永続的に保存したい場合は、NAS ファイルシステムや OSS ファイルシステムなどのファイルシステムをマウントすることをお勧めします。詳細については、「NAS ファイルシステムを構成する」および「OSS ファイルシステムを構成する」をご参照ください。
権限ポリシーを使用して、指定されたバケットへの読み取り専用アクセスのみを許可するにはどうすればよいですか?
権限ポリシーを使用して、指定されたバケットへの読み取りおよび書き込みアクセスを許可するにはどうすればよいですか?
権限ポリシーを使用して、指定されたバケットのサブディレクトリへの読み取り専用アクセスのみを許可するにはどうすればよいですか?
権限ポリシーを使用して、指定されたバケットのサブディレクトリへの読み取りおよび書き込みアクセスを許可するにはどうすればよいですか?
OSS マウントポイントから書き込み中のファイルが OSS 側で空になるのはなぜですか?
OSS マウントポイントからファイルを書き込む場合、システムは flush 操作を明示的に呼び出すか、ファイルを閉じた場合にのみコンテンツを 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 マウントポイントのコンテンツは異なる場合があります。たとえば、あるインスタンスが OSS マウントポイントにファイルを作成した後、別のインスタンスがリアルタイムでそのファイルをクエリできない場合があります。