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 マウント機能を有効にするには、関数が OSS にアクセスするためのロールを設定する必要があります。詳細については、「関数ロールを使用して Function Compute に他の Alibaba Cloud サービスへのアクセス権限を付与する」をご参照ください。
手順
ステップ 1: OSS マウントポイントの設定
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。[関数] ページで、対象の関数をクリックします。
関数詳細ページで、[設定] タブをクリックします。[詳細設定] の横にある [編集] をクリックします。[詳細設定] パネルで [ストレージ] セクションを見つけ、[OSS バケットのマウント] を有効にします。必要に応じて次のパラメーターを設定し、[デプロイ] をクリックします。
パラメーター
説明
例
[OSS マウントポイント]: OSS マウントポイントの情報を入力します。
バケット
既存のバケットを選択します。新しい OSS バケットを作成するには、下の [新しい OSS バケットの作成] をクリックして OSS コンソール に移動して作成します。OSS の使用コストに関する情報については、「OSS の課金概要」をご参照ください。
example-bucket
バケットサブディレクトリ
バケット内のサブディレクトリを指定します。これは絶対パスである必要があります。これを空のままにするか、/ に設定すると、バケットのルートディレクトリがマウントされます。
/files
OSS エンドポイント
バケットを選択すると、対応するエンドポイントがデフォルトで選択されます。必要に応じて [カスタムエンドポイント] を選択し、エンドポイントの値を変更できます。さまざまなリージョンの OSS のエンドポイントに関する情報については、「リージョンとエンドポイント」をご参照ください。
説明Function Compute 関数と同じリージョン内のバケットを選択した場合は、内部 OSS エンドポイントを使用します。
別のリージョン内のバケットを選択した場合は、パブリック OSS エンドポイントを使用する必要があります。これにより、インターネット経由のアウトバウンドトラフィックに対して料金が発生します。
デフォルトアドレス
ローカルディレクトリ
関数のランタイム環境でローカルディレクトリを指定します。ディレクトリは /home、/mnt、または /data のサブディレクトリである必要があります。
/mnt/oss
[ローカルディレクトリの権限]
バケットがマウントされた後のローカルディレクトリのアクセス権限を選択します。権限は [読み取り専用] または [読み取り/書き込み] に設定できます。
読み取り/書き込み
説明OSS マウント機能は、関数のネットワーク設定に依存します。関数が VPC のみにアクセスするように設定されており、[デフォルト NIC での関数によるインターネットアクセスを許可] が [いいえ] に設定されている場合、パブリック OSS エンドポイントを使用するには、関数がその VPC を介してインターネットにアクセスできる必要があります。詳細については、「固定パブリック IP アドレスの設定」をご参照ください。
ステップ 2: マウントされた OSS ディレクトリ内のファイルへのアクセス
OSS マウントポイントを設定した後、ローカルファイルにアクセスするのと同じ方法で、マウントされた 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 で失敗します。
関数に設定された 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 または close を呼び出した場合にのみ、システムはコンテンツを 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 からリアルタイムでファイルを表示できない場合があります。