[アップデート] AWS Amplify Gen 2 でスケジュール実行可能な関数を作成できるようになりました

[アップデート] AWS Amplify Gen 2 でスケジュール実行可能な関数を作成できるようになりました

Clock Icon2024.09.07

いわさです。

先日 Amplify Gen 2 には Lambda 関数を作成する Function という機能が提供されています。
先日、スケジュール実行可能な Cron ジョブの機能が提供されたというアップデートアナウンスがありました。

https://aws.amazon.com/about-aws/whats-new/2024/08/aws-amplify-function-cron-jobs-streaming-logs/

AWS リソースでいうと、EventBridge によるスケジュールが設定された Lambda 関数をデプロイするというものです。
そして、実際のところは 2024 年 7 月末あたりの以下のプルリクエストで取り込まれた機能となっており、実はアナウンスよりもだいぶ前から使えるようになっていた機能です。

https://github.com/aws-amplify/amplify-backend/pull/1527

今日は実際にこちらの機能を使って関数を作成してみましたので紹介します。
設定方法は基本的に公式ドキュメントの通りなのですが少しうまくいかないところがあり、コードを一部変更しています。

https://docs.amplify.aws/react/build-a-backend/functions/scheduling-functions/

関数の定義でスケジュールを設定する

バックエンドリソースの定義としては通常どおり関数を定義するのですが、その際にスケジュールを設定します。
EventBridge と同様に Cron 形式あるいは Rate 形式での指定が可能で、複数設定することが出来ます。

/amplify/hogejob/hogeschedule/resource.ts
import { defineFunction } from "@aws-amplify/backend";

export const hogeschedule = defineFunction({
  name: "hogeschedule",
  schedule: [
    "every 1m",
    "0 15 * * ? *"
  ],
});

そして関数にはEventBridgeHandlerを使うのですが、公式ドキュメントの記載内容だと少し足りておらず、次のようなエラーが発生します。

amplify/hogejob/hogeschedule/handler.ts(3,23): error TS2314: Generic type 'EventBridgeHandler' requires 3 type argument(s).
amplify/hogejob/hogeschedule/handler.ts(3,51): error TS7006: Parameter 'event' implicitly has an 'any' type.

EventBridgeHandler はdetail-typedetailを指定する必要があります。

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/aws-lambda/trigger/eventbridge.d.ts

EventBrige でスケジュールイベントを受信した時のイベントを見てみると次のような構造を受信するので今回はそのまま使ってやりました。

{
    "version": "0",
    "id": "874332a9-afb0-5563-2529-ba79ff7f4e27",
    "detail-type": "Scheduled Event",
    "source": "aws.events",
    "account": "123456789012",
    "time": "2024-09-02T23:59:51Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:events:ap-northeast-1:123456789012:rule/hoge0903time"
    ],
    "detail": {}
}
/amplify/hogejob/hogeschedule/handler.ts
import type { EventBridgeHandler } from "aws-lambda";

export const handler: EventBridgeHandler<"Scheduled Event", null, void> = async (event) => {
    console.log("event", JSON.stringify(event, null, 2))
}

あとはバックエンドリソースに含めてデプロイしてみます。

/amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { data } from './data/resource';
import { hogeschedule } from './hogejob/hogeschedule/resource';

const backend = defineBackend({
  auth,
  data,
  hogeschedule,
});

今回はサンドボックスで試しただけですがデプロイ後の様子です。
イベントトリガーが設定された Lambda 関数としてデプロイされました。

CC9830B9-C922-4140-A6D2-42225ED91D7D.png

トリガー詳細を確認してみると Amplify バックエンドで定義したスケジュールが複数設定されていますね。期待通りです。

914484DA-D4A4-4D99-B2E3-5E65E0F9838A.png

さいごに

本日は AWS Amplify Gen 2 でスケジュール実行可能な関数を作成できるようになったので試してみました。

スケジュール実行される軽量なジョブみたいなものを実行する際に使うことが出来そうです。
Amplify で管理すべき関数であればこの機能を使ってスケジュール設定してやるのが非常に楽ですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.