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

Function Compute:イベント関数による OSS ファイルアップロードの処理

最終更新日:Jul 16, 2026

イベント関数は、Object Storage Service (OSS) へのファイルアップロードや監視サービスによってトリガーされるアラートなど、クラウドサービスからのさまざまなイベントに応答できます。イベント関数を使用する場合、処理ロジックを記述するだけでよく、イベントの統合や基盤となるコンピューティングリソースを管理する必要はありません。Function Compute は、必要な場合にのみインスタンスを実行し、自動的にスケーリングし、イベントが処理された後にインスタンスを破棄します。課金対象は、使用したリソースのみです。

ユースケース

OSS にファイルを保存する必要がある状況を想定します。アップロードを高速化するために、まずファイルを ZIP 形式に圧縮します。しかし、使用したいのは ZIP アーカイブではなく、ファイルそのものです。これを実現するには、ファイルを解凍して OSS に保存し直す自動化されたプロセスが必要です。

従来のアプローチでは、OSS 内のファイルの変更を監視および処理するために、複数のプログラムを構築して統合する必要があります。また、これらのプログラムのデプロイとメンテナンスも必要です。イベント関数を使用することで、ファイル処理ロジックのみに集中できます。ファイルが OSS にアップロードされるたびにイベントが生成されます。イベントが指定した条件を満たすと、関数が自動的にトリガーされ、ハンドラーが実行されます。タスクが完了すると、Function Compute はコンピューティングリソースを自動的に解放し、コストを節約します。

image

OSS バケットをお持ちでない場合があるため、このチュートリアルでは、ハンズオン形式の例を用いてイベント関数の実装方法を説明します。

OSS ファイルのアップロードを模擬したイベントを作成します。このイベントは、イベント関数を呼び出してファイルを処理し、ファイル名やバケット名などの情報をコンソールに出力します。

このチュートリアルでは、以下の内容を学習します。

  1. コンソールによるイベント関数の作成、ハンドラーの記述、関数のエンドツーエンドテスト

  2. Function Compute のランタイムや組み込みランタイムといった主要な概念

  3. ハンドラーパラメーターである eventcontext

前提条件

Alibaba Cloud アカウントの登録

Alibaba Cloud アカウントを登録し、実名認証を完了します。

Function Compute の有効化

2024年8月27日以降に Alibaba Cloud アカウントを登録して認証した場合、有効化せずに Function Compute を直接使用できます。初めて Function Computeコンソール にログインする際に、画面の指示に従って無料トライアルを申請することもできます。詳細については、「無料トライアル」をご参照ください。

2024年8月27日より前に Alibaba Cloud アカウントを登録した場合、次の手順に従ってサービスを有効化してください。

  1. Function Compute の製品ページに移動します。

  2. [コンソール] をクリックして有効化ページを開きます。[今すぐ購入] をクリックしてサービスを有効化し、Function Computeコンソール に移動します。

    説明
    • Alibaba Cloud アカウントでサービスを有効化し、RAM ユーザーを使用して関数と関連アプリケーションを管理することを推奨します。RAM ユーザーには、ビジネスに必要な権限のみを付与してください。詳細については、「権限ポリシーと例」をご参照ください。

  3. (オプション) 初めて Function Computeコンソール にログインする際に、Alibaba Cloud サービスの承認 ダイアログボックスで OK をクリックして、サービス関連ロールを作成します。これにより、Function Compute は他のクラウドサービスにアクセスできるようになります。

    ロールが作成されると、Function Compute は VPC、ECS、Simple Log Service (SLS)、Container Registry などのクラウドリソースにアクセスできるようになります。サービス関連ロールの詳細については、「サービス関連ロール」をご参照ください。

操作手順

ステップ1:関数の種類の選択

  1. Function Computeコンソール にログインします。左側メニューで、関数管理 > 関数リスト を選択します。上部メニューで、関数を作成するリージョンを選択し、関数を作成 をクリックし、プロンプトに従って イベント関数 を選択して作成します。

ステップ2:ランタイムの選択

Python

ランタイム環境 で、[組み込みランタイム] > [Python] > [Python 3.10] を選択します。

イベント関数には 組み込みランタイム の使用を推奨します。これは、組み込みランタイム には、他のクラウドサービスからのイベント (たとえば、Python の oss2 モジュール) に応答するために必要な依存関係が含まれているためです。詳細については、「環境の概要」をご参照ください。カスタムランタイム または カスタムコンテナランタイム を使用する場合は、依存関係をご自身でインストールする必要があります。ランタイムの詳細な比較については、「ランタイムの選択」をご参照ください。

Node.js

ランタイム環境 で、[組み込みランタイム] > [Node.js] > [Node.js 20] を選択します。

イベント関数には 組み込みランタイム の使用を推奨します。これは、組み込みランタイム には、他のクラウドサービスからのイベント (たとえば、Node.js の ali-oss モジュール) に応答するために必要な依存関係が含まれているためです。詳細については、「環境の概要」をご参照ください。カスタムランタイム または カスタムコンテナランタイム を使用する場合は、依存関係をご自身でインストールする必要があります。ランタイムの詳細な比較については、「ランタイムの選択」をご参照ください。

ステップ3:関数の作成

[Hello, world!] サンプルを選択して関数を作成します。詳細設定 はデフォルト値のままにし、作成 をクリックします。

関数が作成されたら、コード タブの WebIDE で生成されたサンプルコードを確認できます。以下は Python のサンプルコードです。

# -*- coding: utf-8 -*-
import logging
import json

# initializer 機能 (https://www.alibabacloud.com/help/document_detail/2513452.html) を有効にするには、
# 以下のように initializer 関数を実装してください。
# def initializer(context):
#   logger = logging.getLogger()
#   logger.info('initializing')


def handler(event, context):
    # evt = json.loads(event)
    logger = logging.getLogger()
    logger.info('hello world')
    return 'hello world'
Hello, world! サンプルコードは、エントリポイントを持つ関数テンプレートを自動的に生成します。以降のステップでは、このテンプレートに基づいてビジネスコードを構築できます。

ステップ4:サンプルコードの変更とデプロイ

Java などのコンパイル言語は WebIDEをサポートしていません。ローカルでのコンパイルとコードパッケージのアップロードが必要です。

Python

コンソールの WebIDE で index.py を開き、既存のコードを次のコードに置き換えてから、デプロイメントコード をクリックします。

index.py

# -*- coding: utf-8 -*-
import logging
import json
# import oss2  # OSSクライアントを作成する必要がある場合は、この行のコメントを解除します。
logger = logging.getLogger()


def handler(event, context):  # ハンドラーはコード実行のエントリポイントです。
    logger.info("Parsing event information...")
    input_events = json.loads(event)
    if not input_events.get('events'):  # 入力イベントの形式を確認します。
        raise Exception("Invalid event format: The events array does not exist or is empty.")
    event_obj = input_events['events'][0]
    bucket_name = event_obj['oss']['bucket']['name']  # OSSバケット名をパースします。
    object_name = event_obj['oss']['object']['key']  # ファイル名をパースします。
    region = context.region  # 関数のリージョンをパースします。
    logger.info(f"OSS bucket name: {bucket_name}, File name: {object_name}, Region: {region}")
    # OSSバケットがある場合は、次の行のコメントを解除してOSSクライアントインスタンスを作成できます。
    # bucket = get_bucket(region, bucket_name, context)
    bucket = None
    result = process_event(bucket, object_name)  # ヘルパー関数を呼び出してイベント処理ロジックを実行します。
    return result


def process_event(bucket, object_name):
    logger.info("Starting event processing...")
    # ここにイベント処理ロジックを記述できます。
    # zip_file = download_file(bucket, object_name)
    # result = extract_and_upload(bucket, zip_file)
    logger.info("Event processing completed.")
    result = 0
    return result  # 戻り値0は、イベントが正常に処理されたことを示します。


# def get_bucket(region, bucket_name, context):
#     # ここでOSSバケットクライアントインスタンスを作成します。必要なID認証情報はコンテキストから取得できます。
#     creds = context.credentials  # 一時キーを取得します。
#     auth = oss2.StsAuth(
#         creds.access_key_id,
#         creds.access_key_secret,
#         creds.security_token)
#     endpoint = f'oss-{region}-internal.aliyuncs.com'
#     bucket = oss2.Bucket(auth, endpoint, bucket_name)
#     return bucket


# def download_file(bucket, object_name):
#     # これはOSSからファイルをダウンロードするためのサンプルコードです。
#     try:
#         file_obj = bucket.get_object(object_name)
#         return file_obj
#     except oss2.exceptions.OssError as e:
#         logger.error(f"Failed to download the file: {e}")


# def extract_and_upload(bucket, file_obj):
#     # ここでファイルを解凍してOSSにアップロードするロジックを定義できます。
#     return 0;

コードの詳細

  • def handler(event, context):

    • handler:この Python 関数がハンドラーです。コードには複数の Python 関数を含めることができますが、ハンドラーは常にエントリポイントです。Function Compute が正しく見つけられるように、ハンドラー名は変更しないでください。詳細については、「ハンドラーとは」をご参照ください。

      Function Compute コンソールで、関数詳細ページに移動し、[関数詳細] タブをクリックし、[設定] サブタブを選択して [リクエストハンドラー] フィールドを表示または編集します。フィールドの形式は [ファイル名].[関数名] で、たとえば index.handler です。

    • event:イベントが関数をトリガーすると、OSS ファイルアップロードイベントのバケット名やファイル名などのイベントに関する情報が、event パラメーターを介して渡されます。このパラメーターは JSON オブジェクトです。さまざまなトリガータイプの event パラメーターの内容については、「トリガーイベントの形式」をご参照ください。

    • contextcontext オブジェクトは、context パラメーターを介して関数に渡されます。これには、呼び出し、関数の設定、認証に関する情報が含まれます。認証情報は、関数に設定されたロールの権限から派生します。ロールを設定すると、Function Compute は AssumeRole 操作を呼び出して一時キー (STS トークン) を取得し、そのキーを context オブジェクトの credentials フィールドを介して関数に渡します。詳細については、「関数ロールを使用してFunction Computeに他のクラウドサービスへのアクセス権限を付与する」をご参照ください。context オブジェクトに含まれる情報については、「コンテキスト」をご参照ください。

  • logger.info():Python の logging モジュールなどのプログラミング言語の標準的なロギング機能を使用して、ログを出力できます。この例では、ステートメントを使用してバケット名、ファイル名、リージョン名を出力します。関数が呼び出された後、コンソールでログ出力を確認できます。詳細については、「ログ」をご参照ください。

Node.js

コンソールの WebIDE で index.mjs を開き、既存のコードを次のコードに置き換えてから、デプロイメントコード をクリックします。

index.mjs

'use strict';
// import OSSClient from 'ali-oss'; // OSSクライアントを作成する必要がある場合は、この行のコメントを解除します。

export const handler = async (event, context) => { // ハンドラーはコード実行のエントリポイントです。
  console.log("Parsing event information...");
  const inputEvents = JSON.parse(event);
  if (!Array.isArray(inputEvents.events) || inputEvents.events.length === 0) { // 入力イベントの形式を確認します。
    throw new Error("Invalid event format: The events array does not exist or is empty.");
  }
  const eventObj = inputEvents.events[0];
  const bucketName = eventObj.oss.bucket.name; // OSSバケット名をパースします。
  const objectName = eventObj.oss.object.key; // ファイル名をパースします。
  const region = context.region;  // 関数のリージョンをパースします。
  console.log(`OSS bucket name: ${bucketName}, File name: ${objectName}, Region: ${region}`);
  // OSSバケットがある場合は、次の行のコメントを解除してOSSクライアントインスタンスを作成できます。
  // const bucket = getBucket(region, context)
  const bucket = null;
  const result = processEvent(bucket, objectName); // ヘルパー関数を呼び出してイベント処理ロジックを実行します。
  return result;
};


async function processEvent (bucket, objectName) {
  console.log("Starting event processing...");
  // ここにイベント処理ロジックを記述できます。
  // const zipFile = downloadFile(bucket, objectName);
  // const result = extractAndUpload(bucket, zipFile);
  console.log("Event processing completed.");
  const result = 0;
  return result;
}


// function getBucket (region, context) {
//   // ここでOSSバケットクライアントインスタンスを作成します。必要なID認証情報はコンテキストから取得できます。
//   const bucket = new OSSClient({
//     region: region,
//     accessKeyId: context.credentials.accessKeyId,
//     accessKeySecret: context.credentials.accessKeySecret,
//     securityToken: context.credentials.securityToken
//   });
//   return bucket;
// }


// async function downloadFile (bucket, objectName) {
//   try {
//     // これはOSSからファイルをダウンロードするためのサンプルコードです。
//     const result = await bucket.get(objectName, objectName);
//     console.log(result);
//     return result;
//   } catch (e) {
//     console.log(e);
//   }
// }

// async function extractAndUpload (bucket, zipFile) {
//     // ここでファイルを解凍してOSSにアップロードするロジックを定義できます。
//     return 0;
// }

コードの詳細

  • export const handler = async (event, context)

    • handler:この Node.js 関数がハンドラーです。コードには複数の Node.js 関数を含めることができますが、ハンドラーは常にエントリポイントです。Function Compute が正しく見つけられるように、ハンドラー名は変更しないでください。詳細については、「ハンドラーとは」をご参照ください。

      2025-01-23_15-42-21 (1)

    • event:イベントが関数をトリガーすると、event パラメーターによって、OSS ファイルアップロードイベントのバケット名やファイル名など、イベントに関する情報が渡されます。このパラメーターは JSON オブジェクトです。さまざまな種類のイベントの event に含まれる情報については、「トリガーイベントの形式」をご参照ください。

    • context: 関数のランタイムコンテキストオブジェクトです。 これは context パラメーターを介して関数に渡され、呼び出し、関数設定、ID 認証などの情報が含まれます。 ID 認証情報は、関数に設定されているロールの権限から取得されます。 関数にロールを設定すると、FC は AssumeRole 操作を呼び出して一時キー (STS トークン) を取得します。 その後、FC は context オブジェクトの credentials フィールドを介して、一時キーを関数に渡します。 詳細については、「関数ロールを使用して Function Compute に他のクラウドサービスへのアクセス権限を付与する」をご参照ください。 context オブジェクトに含まれる情報については、「コンテキスト」をご参照ください。

  • console.log():Node.js の console モジュールなど、プログラミング言語の標準的なロギング機能を使用して、情報をログに出力できます。この例では、ステートメントを使用してバケット名、ファイル名、リージョン名を出力します。関数が呼び出された後、コンソールでログ出力を確認できます。詳細については、「ログ」をご参照ください。

ステップ5:関数のテスト

OSS ファイルのアップロードによる関数のトリガーをシミュレートするために、模擬イベントを定義し、それを用いて関数をトリガーします。

模擬イベントを使用する代わりに、実際の OSS イベントを使用してテストとして関数をトリガーすることもできます。詳細については、「次のステップ」をご参照ください。
  1. 模擬イベントの作成関数の詳細 ページで、コード タブをクリックします。関数のテスト の右側にあるドロップダウン矢印をクリックし、テストパラメーターの設定 を選択します。イベントテンプレート リストで [OSS] を選択します。コンソールは、実際の OSS イベントと同じ形式で模擬イベントを自動的に生成します。

    イベント名 や、OSS バケット名やファイル名などのイベントオブジェクト内のパラメーター値をカスタマイズできます。完了したら、OK をクリックします。

    OSS 模擬イベントのサンプル

    次のサンプルイベントの内容をテストパラメーターのテキストボックスに貼り付けて、以降の操作に進むことができます。

    {
        "events": [
            {
                "eventName": "ObjectCreated:PutObject",
                "eventSource": "acs:oss",
                "eventTime": "2024-08-13T06:45:43.000Z",
                "eventVersion": "1.0",
                "oss": {
                    "bucket": {
                        "arn": "acs:oss:cn-hangzhou:164901546557****:test-bucket",
                        "name": "test-bucket",
                        "ownerIdentity": "164901546557****"
                    },
                    "object": {
                        "deltaSize": 122539,
                        "eTag": "688A7BF4F233DC9C88A80BF985AB****",
                        "key": "source/example.zip",
                        "size": 122539
                    },
                    "ossSchemaVersion": "1.0",
                    "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
                },
                "region": "cn-hangzhou",
                "requestParameters": {
                    "sourceIPAddress": "140.205.XX.XX"
                },
                "responseElements": {
                    "requestId": "58F9FF2D3DF792092E12044C"
                },
                "userIdentity": {
                    "principalId": "164901546557****"
                }
            }
        ]
    }
  2. コード タブで 関数のテスト をクリックして関数をトリガーします。実行が成功したら、レスポンス を確認します。戻り値 0 は、イベントが正常に処理されたことを示します。ログ出力 をクリックして、関数実行中に生成されたログを表示します。

    関数をテストすると、Function Compute はモックイベントの内容を event パラメーターを介してハンドラー handler に渡し、前のステップで定義したコードを実行して event パラメーターをパースし、ファイルを処理します。

    ログ出力には、次の主要な情報が表示されます:FunctionCompute python3 runtime inited、それに続く 4 つの [INFO] レベルのログエントリ:Parsing event information...OSS bucket name is test-bucket, file name is source/example.zip, Region is cn-hangzhouStarting event processing...Event processing completed.。これは、関数が模擬 OSS イベント情報を正常にパースし、ファイル処理を完了したことを示します。

ステップ6:(オプション) リソースのクリーンアップ

Function Compute は実際のリソース使用量に基づいて課金されます。呼び出されない関数は課金されません。ただし、OSS や File Storage NAS (NAS) に保存されているデータなど、関数に関連付けられている他のクラウド製品やリソースにご注意ください。

Function Computeコンソール にログインし、関数管理 > 関数リスト を選択し、リージョンを選択します。対象の関数の 操作 列で、削除 をクリックします。ダイアログボックスで、関数にトリガーなどの関連リソースがないことを確認してから、削除を確定します。

次のステップ

これで、コンソールでイベント関数を作成し、ハンドラーを変更し、モック event を使用して関数をテストしました。ビジネスニーズに応じて、以下の高度な操作をご参照ください。

  • トリガーの追加:

    • OSS バケットをお持ちでない場合があるため、この例ではテストに模擬 OSS アップロードイベントを使用しています。実際のワークロードでは、関数に OSS トリガーを追加してください。詳細については、「ネイティブOSSトリガーの設定」をご参照ください。

    • オブジェクトストレージに加えて、多くの Alibaba Cloud サービス (さまざまなメッセージキュー、Tablestore、SLS など) からのイベントも Function Compute をトリガーできます。サポートされているトリガーのリストについては、「トリガーの概要」をご参照ください。

  • 依存関係の追加: 組み込みランタイムにはイベント処理のための一般的な依存関係が含まれていますが、本番環境でのニーズを満たさない場合があります。最も簡単なアプローチは、コードと依存関係を ZIP ファイル (コードパッケージ) にパッケージ化し、Function Compute にデプロイすることです。詳細については、「コードパッケージのデプロイ」をご参照ください。コードパッケージのサイズを削減し、関数のコールドスタートを高速化するには、レイヤーを使用して依存関係を管理してください。詳細については、「カスタムレイヤーの作成」をご参照ください。

  • ロギングの設定: 関数のデバッグ、トラブルシューティング、またはセキュリティ監査を容易にするために、関数のロギングを設定することを推奨します。詳細については、「ロギング機能の設定」をご参照ください。

関連ドキュメント