すべてのプロダクト
Search
ドキュメントセンター

Function Compute:OSSファイルシステムの設定

最終更新日:Jul 24, 2024

Object Storage Service (OSS) は、安全で費用対効果が高く、信頼性の高いクラウドストレージサービスです。 OSSでは、大量のデータをクラウドに保存できます。 Function Computeで関数のOSSファイルシステムを設定できます。 このように、関数は、関数がオンプレミスのファイルシステムにアクセスするのと同じ方法でOSSファイルシステムにアクセスできます。

制限事項

  • リージョン内のFunction Computeの関数に対して、最大5つのApsara File Storage NAS (NAS) マウントターゲットと5つのOSSマウントターゲットを設定できます。

  • 同じ関数の場合、NASマウントターゲットの関数ランタイム内のローカルディレクトリをOSSマウントターゲットのものと同じにすることはできません。

    NASファイルシステムのマウントターゲットを設定する方法の詳細については、「NASファイルシステムの設定」をご参照ください。

始める前に

手順

手順1: OSSマウントの設定

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションツリーで、[ストレージ] タブをクリックします。 [OSS] セクションで、[変更] をクリックします。 OSSパネルで、次のパラメーターを設定し、[OK] をクリックします。

    パラメーター

    説明

    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マウントを設定した後、次の手順を実行してマウントされたディレクトリ内のファイルにアクセスし、マウントが有効かどうかを確認できます。

  1. 関数の詳細ページで、[コード] タブをクリックし、コードエディターでコードを記述し、[デプロイ] をクリックします。

    次のサンプルコードは、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を、マウントされたディレクトリに存在するファイルの名前に置き換えます。

  2. コードがデプロイされたら、[コード] タブの [テスト機能] をクリックします。

    コードが実行された後、[コード] タブの下部に実行結果が表示されます。 ログ出力では、ディレクトリで読み取られたファイル (この例ではexample.txt) の内容を表示できます。 ディレクトリに書き込まれたファイルの内容 (この例ではoutput.txt) を表示することもできます。

よくある質問

OSSのマウントが失敗し、bucket not foundエラーが報告された場合はどうすればよいですか。

OSSエンドポイントとバケット名が正しいかどうかを確認します。

OSSのマウントが失敗し、host resolvエラーまたはdeadline exceededエラーが報告された場合はどうすればよいですか。

エンドポイントが正しく設定されているかどうかを確認します。

  • エンドポイントのドメイン名の解決に失敗した場合、host resolvエラーが報告されます。

  • 内部エンドポイントはリージョン間では使用できません。 別のリージョンで内部エンドポイントを使用すると、接続タイムアウトエラーが発生し、期限超過エラーが報告されます。

OSSのマウントが失敗し、無効な資格情報エラーが報告された場合はどうすればよいですか。

関数用に設定したResource Access Management (RAM) ロールに、OSSへのアクセス権限があるかどうかを確認します。 次の項目は、権限について説明します。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。

  • 読み取り専用: oss:ListObjectsおよびoss:GetObject

  • 読み取りと書き込み: oss:ListObjectsoss:GetObjectoss:PutObjectoss:DeleteObjectoss:ListParts、およびoss:AbortMultipartUpload

説明

oss:ListObjectsはバケットレベルのアクションです。 特定のバケットへのアクセスを有効にする場合、ポリシーにacs:oss:*:*:bucketNameなどのバケットレベルのリソース表示を含める必要があります。 詳細については、「OSSのRAMポリシーのリソース要素」をご参照ください。

マウントされたディレクトリのファイルを読み取ったときに入出力エラーエラーが報告された場合はどうすればよいですか?

設定したOSSバケットのストレージクラスを確認します。 ストレージクラスがArchiveまたはCold Archiveの場合、バケットに保存されているすべてのオブジェクトは凍結されます。 これらのオブジェクトは、凍結解除後にのみアクセスできます。 OSSバケットのストレージクラスをStandardに設定することを推奨します。

関数のローカルディレクトリにあるファイルを表示するにはどうすればよいですか?

  1. 関数の詳細ページで、[インスタンス] タブをクリックして [実行中] 状態のインスタンスを表示し、インスタンスの [操作] 列の [インスタンスに接続] をクリックします。

    image

  2. インスタンスに接続した後、コマンドを実行して、関数のローカルディレクトリにあるファイルを表示できます。 次の図に例を示します。

    image

関数インスタンスのマウントターゲットにアクセスしたときにトランスポートエンドポイントが接続されていませんエラーが報告された場合はどうすればよいですか?

このエラーは、メモリが不足しているためにOSSマウント機能が使用できなくなった場合に報告されることがあります。 ビジネス要件に基づいて、関数のメモリ仕様を増やすことを推奨します。 OSSマウントターゲットを使用する場合は、メモリ容量を512 MB以上の値に設定します。

関数のローカルディレクトリに書き込まれたデータは永続的に保存されますか?

いいえ。 関数インスタンスが破壊されると、そのインスタンスによってディレクトリに書き込まれたデータも削除されます。 データを永続的に保存する場合は、NASファイルシステムやOSSファイルシステムなどのファイルシステムをマウントすることを推奨します。 詳細については、「NASファイルシステムの設定」および「OSSファイルシステムの設定」をご参照ください。

権限ポリシーを使用して、指定されたバケットへの読み取り専用アクセスのみを許可するにはどうすればよいですか?

サンプルポリシーを表示するには、展開します。 例のbucketNameをバケットの実際の名前に置き換えます。 詳細については、「RAMポリシー」をご参照ください。

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListObjects",
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:*:bucketName" 、
        "acs:oss:*:*:bucketName/*"
      ],
      "Effect": "Allow"
    }
  ]
}

権限ポリシーを使用して、指定されたバケットへの読み取りおよび書き込みアクセスを許可するにはどうすればよいですか。

サンプルポリシーを表示するには、展開します。 例のbucketNameをバケットの実際の名前に置き換えます。 詳細については、「RAMポリシー」をご参照ください。

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListObjects",
        "oss:GetObject"、
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Resource": [
        "acs:oss:*:*:bucketName" 、
        "acs:oss:*:*:bucketName/*"
      ],
      "Effect": "Allow"
    }
  ]
}

権限ポリシーを使用して、指定したバケットのサブディレクトリへの読み取り専用アクセスのみを許可するにはどうすればよいですか?

サンプルポリシーを表示するには、展開します。 例のbucketNameをバケットの実際の名前に置き換え、bucketPathをバケットのサブディレクトリに置き換えます。 詳細については、「RAMポリシー」をご参照ください。

{
  "Version": "1",
  "Statement": [
    {
      "Action": "oss:ListObjects",
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "bucketPath/*"
          ]
        }
      }
    },
    {
      "Action": [
        "oss:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName/bucketPath/*"
      ]
    }
  ]
}

権限ポリシーを使用して、指定したバケットのサブディレクトリへの読み取りおよび書き込みアクセスを許可するにはどうすればよいですか。

サンプルポリシーを表示するには、展開します。 例のbucketNameをバケットの実際の名前に置き換え、bucketPathをバケットのサブディレクトリに置き換えます。 詳細については、「RAMポリシー」をご参照ください。

{
  "Version": "1",
  "Statement": [
    {
      "Action": "oss:ListObjects",
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "bucketPath/*"
          ]
        }
      }
    },
    {
      "Action": [
        "oss:GetObject",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName/bucketPath/*"
      ]
    }
  ]
}

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はすぐにファイルにアクセスできない場合があります。