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

Function Compute:イベント関数を使用したクラウドサービスイベントの処理

最終更新日:Apr 21, 2026

イベント関数は、Object Storage Service (OSS) へのファイルのアップロードやモニタリングプロダクトによってトリガーされるアラートなど、クラウドサービスによって生成されるさまざまな イベント に応答できます。イベント関数を使用すると、イベント統合や基盤となる計算リソースを管理することなく、処理ロジックの記述のみを行えます。Function Compute は、必要に応じてインスタンスを自動的に実行、スケール、終了します。使用したリソースに対してのみ料金が発生します。

利用シーン

Object Storage Service (OSS) にファイルを保存する必要があるとします。アップロードを高速化するために、まずファイルを ZIP アーカイブに圧縮します。しかし、ファイルを使用する必要がある場合は、ZIP アーカイブではなく元のファイルが必要です。これには、ファイルを自動的に解凍して OSS に保存し直す必要があります。

イベント関数を使用すると、ファイル処理コードに集中できます。ファイルが OSS にアップロードされるたびにイベントが生成されます。イベントが設定した条件を満たすと、関数が自動的にトリガーされ、ハンドラが実行されます。ハンドラの処理が完了すると、計算リソースは解放され、コストを節約できます。

OSS バケットをお持ちでない場合があるため、このチュートリアルでは、シミュレートされたイベントを使用してイベント関数を実装する方法を説明します。

シミュレートされた Object Storage Service (OSS) のファイルアップロードイベントを作成します。このイベントはイベント関数を呼び出してファイルを処理し、ファイル名やバケット名などの情報をコンソールに出力します。

この例を完了すると、次のことを学習できます:

  1. イベント関数の作成、ハンドラの記述、およびコンソールを使用した関数のテスト。

  2. Function Compute のランタイムや組み込みランタイムなどの主要な概念の理解。

  3. ハンドラのパラメーターである eventcontext についての学習。

前提条件

Alibaba Cloud アカウントの作成

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

Function Compute の有効化

2024 年 8 月 27 日以降に Alibaba Cloud アカウントを作成し、実名認証を完了した場合、手動で有効化しなくても Function Compute を使用できます。Function Compute コンソールに初めてログインする際に、画面の指示に従って無料トライアルのリソースパッケージを申請することもできます。詳細については、「無料トライアル枠」をご参照ください。

Alibaba Cloud アカウントが 2024 年 8 月 27 日より前に登録された場合は、次の手順を実行してサービスを有効化します:

  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] を選択します。

image

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

Node.js

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

image

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

3. 関数の作成

[Hello, world! の例] を選択します。詳細設定 はデフォルト値のままにし、作成 をクリックします。関数の作成が完了するまで待ちます。

image

関数が作成された後、コード タブの WebIDE で生成されたサンプルコードを表示できます。次の図は Python の例です。

image.png

Hello, world のサンプルコードは、エントリーポイントを持つ関数テンプレートを自動的に生成します。次のステップで、このテンプレートから直接ビジネスコードを構築できます。

4. サンプルコードの変更とデプロイ

Python や Node.js などのインタプリタ言語では、WebIDE で直接コードを変更してデプロイできます。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("イベント情報を解析しています...")
    input_events = json.loads(event)
    if not input_events.get('events'):  # 受信イベントの形式を確認します。
        raise Exception("無効なイベント形式です:events 配列が存在しないか、空です。")
    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}, ファイル名: {object_name}, リージョン: {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("イベント処理を開始しています...")
    # ここにイベント処理ロジックを記述できます。
    # zip_file = download_file(bucket, object_name)
    # result = extract_and_upload(bucket, zip_file)
    logger.info("イベント処理が完了しました。")
    result = 0
    return result  # 戻り値 0 は、イベントが正常に処理されたことを示します。


# def get_bucket(region, bucket_name, context):
#     # OSS バケットクライアントインスタンスを作成します。必要な認証情報はコンテキストから取得できます。
#     creds = context.credentials  # STS トークンを取得します。
#     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"ファイルのダウンロードに失敗しました。 {e}")


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

関数コードの理解

  • def handler(event, context):

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

      image

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

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

  • 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("イベント情報を解析しています...");
  const inputEvents = JSON.parse(event);
  if (!Array.isArray(inputEvents.events) || inputEvents.events.length === 0) { // 受信イベントの形式を確認します。
    throw new Error("無効なイベント形式です:events 配列が存在しないか、空です。");
  }
  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 バケット名: ${bucketName}, オブジェクトファイル名: ${objectName}, リージョン: ${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("イベント処理を開始しています...");
  // ここにイベント処理ロジックを記述できます。
  // const zipFile = downloadFile(bucket, objectName);
  // const result = extractAndUpload(bucket, zipFile);
  console.log("イベント処理が完了しました。");
  const result = 0;
  return result;
}


// function getBucket (region, context) {
//   // OSS バケットクライアントインスタンスを作成します。必要な認証情報はコンテキストから取得できます。
//   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 パラメーターを介して関数に渡されます。これには、呼び出し、関数設定、および認証に関する情報が含まれます。認証情報は、関数に設定されたロールの権限から取得されます。関数にロールを設定すると、FC は AssumeRole を呼び出して STS トークンを取得します。その後、FC は context オブジェクトの credentials フィールドで STS トークンを関数に渡します。詳細については、「関数ロールを使用して関数に他のクラウドサービスへのアクセス権を付与する」をご参照ください。コンテキストオブジェクトにどのような情報が含まれているかについては、「コンテキスト」をご参照ください。

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

5. 関数のテスト

OSS へのファイルアップロードが関数をトリガーするシナリオをシミュレートするために、モックイベントを定義し、それを使用して関数をトリガーします。

モックイベントでのテストに加えて、実際の OSS イベントを使用して関数をトリガーしてテストすることもできます。詳細については、「高度な操作」をご参照ください。
  1. モックイベントの作成関数の詳細 ページで、コード タブをクリックします。関数のテスト の横にあるドロップダウン矢印をクリックし、テストパラメーターの設定 を選択します。イベントテンプレート セクションで、[Object Storage Service (OSS)] を選択します。モックイベントが自動的に生成されます。このイベントの形式は、実際の OSS イベントと同じです。

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

    image

    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 パラメーターを解析してファイルを処理します。

    image.png

6. (任意) リソースのクリーンアップ

Function Compute はリソース使用量に基づいて課金されます。使用しない関数に対しては課金されません。ただし、Object Storage Service (OSS) に保存されたデータや Apsara File Storage NAS など、他のクラウドサービスに関連するリソースは別途料金が発生する可能性があることにご注意ください。

関数を削除するには、Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、関数管理 > 関数リスト を選択します。リージョンを選択します。削除したい関数を見つけ、操作 列の 削除 をクリックします。表示されるダイアログボックスで、関数にトリガーなどの関連リソースがないことを確認し、削除を確定します。

高度な操作

これで、イベント関数を作成し、ハンドラを変更し、コンソールでシミュレートされた event を使用して関数をテストしました。必要に応じて、次の高度な操作をご参照ください:

  • トリガーの追加:

    • このトピックでは、テストのためにシミュレートされた Object Storage Service (OSS) ファイルアップロードイベントを使用します。これは、OSS バケットをお持ちでない場合があるためです。ビジネスで関数を使用する場合は、関数に OSS トリガーを追加します。詳細については、「ネイティブ OSS トリガーの設定」をご参照ください。

    • OSS に加えて、他の多くの Alibaba Cloud サービスのイベントも Function Compute をトリガーできます。これらのサービスには、さまざまなメッセージキュー、Tablestore、Simple Log Service (SLS) が含まれます。サポートされているトリガーのリストについては、「トリガーの概要」をご参照ください。

  • 依存関係の追加: 組み込みランタイムには、イベント処理のための一般的な依存ライブラリが含まれています。ただし、これらのライブラリがすべてのビジネス要件を満たすとは限りません。最も簡単な解決策は、コードと追加の依存関係を ZIP ファイルにパッケージ化することです。その後、コードパッケージを Function Compute にアップロードしてデプロイします。詳細については、「コードパッケージのデプロイ」をご参照ください。コードパッケージのサイズを削減し、コールドスタートを高速化するには、レイヤーを使用して依存関係を管理します。詳細については、「カスタムレイヤーの作成」をご参照ください。

  • ログの設定: デバッグ、トラブルシューティング、およびセキュリティ監査に役立つように、関数のログを設定します。詳細な手順については、「ロギング機能の設定」をご参照ください。

関連ドキュメント