8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Functionsで長時間処理を実行する方法

Last updated at Posted at 2025-12-02

本記事はOracle Cloud Infrastructure Advent Calendar 2025 シリーズ1 の2日目の記事です。
1日目はy.takanashiさんのOCI クラウド・シェル 完全攻略でした。

はじめに

2025年10月7日にOCI Functionsで最大3600秒(60分)まで処理が実行できるようになりました。長時間実行のためにはデタッチドモードでファンクションを起動させる必要があり、その手順や処理結果の確認が非同期になるのでその方法などを解説します。

Functionsの処理時間の仕様について

以前からFunctionsの起動方法は同期モード(Sync Mode)とデタッチドモード(Detached Mode、非同期モード)の2種類があります。前者は呼び出し後処理の完了まで待ち、後者は処理の呼び出しのみですぐに処理完了とし、コールしたファンクションの成否は別途確認する必要があります。
デタッチドモードでの実行時、以前はコンソールなどで確認する必要がありましたが、処理時間の延長とともに処理終了時にNotifications, Queue, Streamingのいずれかのサービスを呼び出すことが可能になりました。また、処理の成功と失敗それぞれに通知を設定することができるため、処理失敗時のみ通知する、処理の成功と失敗で通知先手段や通知先を分割する、といった対応も可能です。
本機能追加により、大規模なデータの処理もある程度Functionsで対応が可能になりました。

これらの本記事にかかわる変更前後の仕様を表でまとめました。

2025年10月7日以前

同期モード デタッチドモード
処理結果の確認 呼び出し結果としてわかる 別途確認
最大処理可能時間 300秒 300秒

2025年10月7日以降

同期モード デタッチドモード
処理結果の確認 呼び出し結果としてわかる 別途確認だが通知が可能に
最大処理可能時間 300秒 3600秒

サンプルファンクションによる動作確認

今回は処理結果の通知を行う方法としてNotificationsのメール送信を使用します。Notificationsのトピック/サブスクリプションは作成済みとします。

1. アプリケーションの作成

クラウドコンソールの左上のハンバーガーメニューで「開発者サービス」⇒ファンクション内の「アプリケーション」を選択し、新規のアプリケーションを作成します。
スクリーンショット 2025-12-01 000611.png

2. ファンクションの実行ソースと構成ファイル類の作成

今回はPythonを使用します。処理の内容は手抜きですが10分間待機するだけです。

import io
import time
from fdk import response

def handler(ctx, data: io.BytesIO = None):
    time.sleep(600)
    return response.Response(
        ctx,
        response_data="",
        status_code=200
    )

ソース以外には構成情報用のファイルとしてfunc.yamlとrequirements.txtが必要です。ただしfunc.yamlのtimeoutの値は従来の制限のまま300秒までです。実際の上限は後程クラウドコンソールで設定しますので、func.yaml上のtimeoutの値は何でも構いません。今回は無記載(デフォルトの30秒)です。

func.yaml
schema_version: 20180708
name: detached_func_sample
version: 0.0.1
runtime: python
entrypoint: /python/bin/fdk /function/func.py handler
requirements.txt
fdk>=0.1.71

3. ファンクションのデプロイ

作業環境はComputeでもオンプレミスの環境でもクラウドシェルなどでも構いませんが、クラウドシェル以外の環境の場合はDockerとFn CLIをセットアップしてください。検証ではDockerを使用していますがPodmanの利用も可能です。

1) コンテキストの作成

既存のコンテキストを利用する場合は飛ばしていただいて構いません。

fn create context oci-context --provider oracle
fn use context oci-context

2) コンテキストの更新

fn update context oracle.compartment-id "<コンパートメントOCID>"
fn update context api-url "https://functions.<リージョン名>.oci.oraclecloud.com"

<リージョン名>の部分は東京リージョンの場合は「ap-tokyo-1」、大阪リージョンの場合は「ap-osaka-1」です。

3) Dockerログイン

docker login -u '<名前空間>/<OCIユーザー名>' <リージョン・キー>.ocir.io

<名前空間>はオブジェクトストレージのバケットの詳細欄から確認するか、OCI CLIでoci os ns getの出力を確認してください。
<リージョン・キー>は東京リージョンの場合は「nrt」、大阪リージョンの場合は「kix」です。
実行するとパスワードを求められますが、これは事前に作成しておいた認証トークンの値を指定します。認証トークンは自ユーザーのプロファイルから「トークンおよびキー」のタブをクリックし、認証トークンの項目で「トークンの生成」ボタンを押して作成します。値の表示はされませんので、コピーした内容は必ずどこかに保存、理想的にはVaultのシークレットに保存してください。

4) コンテキストにレジストリを登録

fn update context registry <リージョン・キー>.ocir.io/<名前空間>/<アプリケーション名>

5) ファンクションのデプロイ

fn -v deploy --app <アプリケーション名>

4. ファンクションの設定の更新

クラウドコンソールでアプリケーションの詳細画面に移動し、「ファンクション」タブをクリックします。次いで該当ファンクションの詳細画面に移動し、画面右上の「編集」ボタンをクリックします。
編集画面でデタッチ呼び出し構成部分にてタイムアウト時間と成功/失敗時の宛先を指定します。今回はNotificationsを指定しています。
指定を終えたら画面右下(スクリーンショットでは切れております)の「変更の保存」ボタンをクリックして変更を保存します。
スクリーンショット 2025-12-02 121242.png

5. ファンクションの実行

Fn CLIのfn invokeではデタッチド実行ができませんのでOCI CLIでファンクションを実行します。

oci fn function invoke --function-id "<ファンクションのOCID>" --fn-invoke-type detached  --file "-" --body ""

呼び出しに成功すれば何も戻さず終了します。

6. 処理終了の確認

処理が完了するとNotificationのサブスクリプションで登録した宛先にメールが届きます。メールのタイトルが機械的ですが、タイトルや本文を変更したい場合はコンソール設定によるNotificationsの通知ではなく、デタッチドファンクション内もしくはNotifications経由で起動したファンクションの中でAPIにてNotificationsの通知を実行してください。
スクリーンショット 2025-12-02 132009.png

おわりに

本記事で紹介している機能追加によりFunctionsの使い勝手が非常に向上しました。ぜひご利用ください。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?