このページは機械翻訳によるものです。内容の正確さは保証しておりません。 人力翻訳を依頼する

関数のクイック作成

更新日時2025-03-13 16:36

イベント関数を作成して、Alibaba Cloud サービスによって生成されるさまざまなイベントを処理できます。このようなイベントには、Object Storage Service (OSS) へのファイルアップロードや、監視製品によってトリガーされるアラートなどが含まれますが、これらに限定されません。イベントの詳細については、「トリガーの概要」をご参照ください。イベント関数を実装する場合、イベントの統合と基盤となる計算リソースの管理はすべて Function Compute によって処理されるため、ビジネスロジックのみに集中できます。さらに、Function Compute はオンデマンドでインスタンスをプロビジョニングし、自動的にスケーリングし、イベント処理後にインスタンスを破棄して、実際に消費されたリソースに対してのみ課金されるようにします。

サンプルシナリオ

転送効率のために ZIP アップロードを受け入れる一方で、非圧縮ファイルを OSS に保存するという要件を考えてみましょう。この場合、ファイルを解凍して OSS に保存する自動プロセスが必要です。

従来のアプローチでは、OSS でのファイル変更を監視および処理するために複数のプログラムを構築および統合する必要があり、これらのプログラムのデプロイとメンテナンスも考慮する必要があります。一方、イベント関数を使用すると、解凍ロジックのみに集中できます。ファイルが OSS にアップロードされるたびに、事前に構成されたイベントトリガーは、イベントが指定された条件を満たしている場合、ロジックを自動的に呼び出します。処理後、計算リソースは自動的に解放され、コストが節約されます。

このトピックの以下の部分では、イベント関数の実装について説明します。

OSS アップロードイベントをシミュレートし、イベント関数をトリガーしてファイルを解凍し、Function Compute コンソールにファイル名やバケット情報などのファイルメタデータを出力します。このデモは実際の OSS リソースに依存しないため、OSS バケットを準備する必要はありません。

デモでは、以下の項目を体験します。

  1. Function Compute コンソールでイベント関数を作成し、ハンドラを作成し、関数をテストするプロセス全体を完了する

  2. Function Compute の実行環境や組み込みランタイムなどの主要な概念を理解する

  3. ハンドラの event パラメータと context パラメータについて学習する

前提条件

Alibaba Cloud アカウントが作成されていること。

Alibaba Cloud アカウントが作成され、実名認証で検証されていること。

Function Compute がアクティブになっていること。

2024 年 8 月 27 日以降に Alibaba Cloud アカウントを登録し、実名認証を完了している場合、Function Compute は自動的にアクティブになります。Function Compute コンソールに初めてログインすると、無料トライアルが利用できます。詳細については、「無料トライアルクォータ」をご参照ください。

2024 年 8 月 27 日より前に Alibaba Cloud アカウントを登録した場合は、次の手順を実行して Function Compute をアクティブにします。

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

  2. [コンソール]をクリックして Function Compute の購入ページに移動します。次に、[今すぐ購入]をクリックして Function Compute をアクティブにし、Function Compute コンソールに移動します。

    説明
    • Alibaba Cloud アカウントを使用して Function Compute をアクティブにし、Resource Access Management (RAM) ユーザーとして関数などのアプリケーションを管理することをお勧めします。RAM ユーザーには、必要な最小限の権限のみを付与できます。詳細については、「ポリシーとサンプルポリシー」をご参照ください。

  3. (オプション) Function Compute コンソールに初めてログインすると、[alibaba Cloud サービスの承認]メッセージが表示されます。[OK]をクリックしてサービスロールを作成し、Function Compute に他の Alibaba Cloud サービスにアクセスするための権限を付与します。

    Function Compute は、サービスロールを使用して、Virtual Private Cloud (VPC)、Elastic Compute Service (ECS)、Simple Log Service、Container Registry などの特定の Alibaba Cloud サービスにアクセスできます。詳細については、「Function Compute のサービスロール」をご参照ください。

手順

1. 関数の種類を選択する

  1. Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。上部のナビゲーションバーで、関数を作成するリージョン (China (Hangzhou) など) を選択します。次に、[関数を作成] をクリックします。

  2. [関数の作成] ページで、[イベント関数]をクリックします。[関数名]はカスタマイズできます。image

2. ランタイムを選択する

Python
Node.js

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

image

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

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

image

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

3. 関数を作成する

サンプルコード [hello, World!] を使用して関数を作成します。[詳細設定][環境変数] のデフォルト値を保持します。[作成]をクリックします。

image

イベント関数が作成されると、[コード] タブの WebIDE で生成されたサンプルコードを表示できます。次の図は、Python 3.10 ランタイムで生成されたコードを示しています。

image.png

図に示すように、ハンドラを含む関数テンプレートが自動的に生成されます。次の手順では、このテンプレートに基づいてビジネスコードを直接記述できます。

4. コードを変更してデプロイする

Python や Node.js などのインタプリタ型言語は、WebIDE 内でのコードの直接変更とデプロイをサポートしていますが、Java などのコンパイル型言語は、コードパッケージのローカルコンパイルのみを許可し、その後のアップロードを許可し、WebIDE 統合を欠いています。
Python
Node.js

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.png

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

    • context: コンテキストオブジェクトは、context パラメータを介して関数に渡され、関数の呼び出し、構成、認証資格情報に関する情報が含まれています。認証資格情報は、関数に割り当てられたロールから取得されます。関数ロールに基づいて、Function Compute は AssumeRole 操作を呼び出して STS トークンを取得し、context オブジェクトの credentials フィールドを介して関数に渡します。このプロセスの詳細については、「Function Compute に他の Alibaba Cloud サービスにアクセスするための権限を付与する」をご参照ください。コンテキストオブジェクトに含まれる情報の詳細については、「コンテキスト」をご参照ください。

  • logger.info(): プログラミング言語の標準ログ機能を使用してログを出力できます。たとえば、Python ランタイムでは、logging モジュールを使用して情報をログに記録できます。このデモでは、バケット名、ファイル名、リージョンを出力します。関数の実行後、Function Compute コンソールでログ出力を見ることができます。詳細については、「ログ」をご参照ください。

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: イベントが関数をトリガーすると、OSS ファイルアップロードイベントのバケット名やファイル名などのイベント関連情報が event パラメータを介して関数に渡されます。このパラメータは JSON オブジェクトとしてフォーマットされます。各イベントの種類の event パラメータに含まれる情報の詳細については、「さまざまなトリガーのイベントの形式」をご参照ください。

    • context: コンテキストオブジェクトは context パラメータを介して関数に渡され、関数の呼び出し、構成、認証資格情報に関する情報が含まれています。認証資格情報は、関数に割り当てられたロールから取得されます。関数ロールに基づいて、Function Compute は AssumeRole 操作を呼び出してセキュリティトークンサービス (STS) トークンを取得し、context オブジェクトの credentials フィールドを介して関数に渡します。このプロセスの詳細については、「Function Compute に他の Alibaba Cloud サービスにアクセスするための権限を付与する」をご参照ください。コンテキストオブジェクトに含まれる情報の詳細については、「コンテキスト」をご参照ください。

  • console.log(): プログラミング言語の標準ログ機能を使用してログを出力できます。たとえば、Node.js ランタイムでは、console モジュールを使用して情報をログに記録できます。このデモでは、バケット名、ファイル名、リージョンを出力します。関数の実行後、Function Compute コンソールでログ出力を見ることができます。詳細については、「ログ」をご参照ください。

5. 関数をテストする

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

シミュレートされたイベントでのテストに加えて、実際の OSS イベントを使用して関数をトリガーすることもできます。詳細については、「高度な操作」をご参照ください。
  1. シミュレートされたイベントを作成する: [関数の詳細] ページで、[コード] タブをクリックし、[関数のテスト] の横にあるドロップダウンアイコンをクリックして、ドロップダウンリストから [テストパラメータの構成] を選択します。[テストパラメータの構成] パネルで、[イベントテンプレート] ドロップダウンリストから [OSS] を選択します。実際の OSS イベントと同じ形式のシミュレートされたイベントが自動的に生成されます。

    [イベント名] とイベントオブジェクトのパラメータ値 (OSS バケット名やファイル名など) をカスタマイズできます。[OK]をクリックします。

    image.png

    シミュレートされた 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 は、実際に消費したリソースに基づいて課金されます。作成された関数は、使用された場合にのみ課金されます。OSS や NAS ファイルシステム (NAS) に保存されているデータなど、関数の呼び出し時に使用される他の Alibaba Cloud サービスまたはリソースに注意してください。

関数を削除するには、Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[関数]をクリックします。上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、削除する関数を見つけ、[垂直方向の省略記号アイコン] > [削除][アクション] 列の を選択します。表示されるダイアログボックスで、削除する関数がリソースにバインドされていないことを確認します。次に、[削除] をクリックします。

image

高度な操作

これで、Function Compute コンソールを使用してイベント関数を作成し、関数ハンドラを構成し、シミュレートされた event を使用して関数をテストしました。詳細な構成については、ビジネス要件に基づいて次の高度な操作を参照してください。

  • トリガーを追加する:

    • OSS バケットがまだない可能性があることを考慮して、このトピックのデモでは、実際の OSS リソースに依存せずに、テストにシミュレートされた OSS イベントを使用しました。ただし、ビジネスで実際の OSS イベントを処理する場合は、関数に OSS トリガーを追加する必要があります。トリガーの追加の詳細については、「ネイティブ OSS トリガーを構成する」をご参照ください。

    • OSS に加えて、他のさまざまな Alibaba Cloud サービス (メッセージキューサービス、Tablestore、Simple Log Service など) からのイベントも Function Compute で関数の実行をトリガーできます。Function Compute でサポートされているトリガーの種類の詳細については、「トリガーの種類」をご参照ください。

  • 依存関係を追加する: イベント処理の一般的な依存関係は Function Compute の各組み込みランタイムにすでに含まれていますが、特定のビジネス要件を満たしていない場合があります。この場合、最も簡単な解決策は、コードと追加の依存関係を ZIP ファイルにパッケージ化し、Function Compute にデプロイすることです。詳細な手順については、「コードパッケージをデプロイする」をご参照ください。関数の コールドスタート を軽減するためにコードパッケージのサイズを小さくする場合は、レイヤーを使用して依存関係を管理できます。詳細については、「カスタムレイヤーを作成する」をご参照ください。

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

参考資料

  • Function Compute コンソールを使用して関数を作成することに加えて、Serverless Devs を使用して関数を作成することもできます。詳細については、「クイックスタート」をご参照ください。

  • We recommend that you refer to the following hands-on tutorial to learn more about event functions:

最初のページ次へ: Function Compute
  • 目次 (1, M)
  • サンプルシナリオ
  • 前提条件
  • 手順
  • 1. 関数の種類を選択する
  • 2. ランタイムを選択する
  • 3. 関数を作成する
  • 4. コードを変更してデプロイする
  • 5. 関数をテストする
  • 6. (オプション) リソースをクリアする
  • 高度な操作
  • 参考資料
フィードバック