AWS Amplify Gen 2 のスケジュール実行可能な関数のルールをデプロイ時は無効化したい

AWS Amplify Gen 2 のスケジュール実行可能な関数のルールをデプロイ時は無効化したい

Clock Icon2025.04.08

いわさです。

半年ほど前に AWS Amplify Gen 2 のアップデートで、関数リソースの設定だけでスケジュール実行を設定できるようになりました。

https://dev.classmethod.jp/articles/amplify-gen2-schedule-function/

スケジュール実行は EventBridge なので、最短 1 分から繰り返し実行が可能です。
こちら当然ながらデプロイした瞬間からルールが有効になっており、すぐに定期実行が開始されます。

通常はそれで問題ないと思うのですが、先日とある事情で、デフォルトでスケジュールを無効化した状態でデプロイして必要なタイミングで手動でルールを有効化したいケースがありました。
調べてみたところ Amplify に追加された FunctionSchedule では無効化のプロパティは提供されていないので、別の方法で無理やり実装してみました。

スケジュール設定された関数のルールを特定する

前提として冒頭の記事のようにスケジュール設定された関数を作成します。

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

export const hogeschedule = defineFunction({
  name: "hogeschedule",
  schedule: [
    "every 1m"
  ],
});
/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))
}

この時、Lambda のスタック上であわせて EventBridge Rule が作成されます。
defineFunctionで設定したスケジュール設定がここに反映される形です。

B9DCFB3E-CBD7-468A-B88C-D3027B73683F.png

念の為確認してみましたが当然ながらルールのステータスは有効状態です。

8215ACD5-51F2-4D27-8571-B1D8BC5AF5FE.png

こちらをデフォルト無効化にしたい。

CDK Aspect でパラメータの上書きをする

Amplify Gen 2 は結局は CDK スタックなので、backend.ts上で様々な方法でスタックにアクセスしプロパティの追加や編集が可能で、過去に何度か試した記事を書きました。
今回は次のように CDK の Aspect 機能を使ってパラメータの上書きをおこなってみたいと思います。

https://zenn.dev/intercept6/articles/629e160efd629f

hogescheduleを探して、stateプロパティにDISABLEDを設定しました。

/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';

import { CfnRule } from 'aws-cdk-lib/aws-events';
import { Aspects, IAspect } from 'aws-cdk-lib';
import { IConstruct } from 'constructs';

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

class DisableScheduleRules implements IAspect {
  visit(node: IConstruct): void {
    if (node instanceof CfnRule) {
      if (node.node.path.includes('hogeschedule')) {
        node.state = 'DISABLED';
      }
    }
  }
}
Aspects.of(backend.stack).add(new DisableScheduleRules());

上記をデプロイ後、作成されたスタックのテンプレートを確認してみると、次のようにイベントルールに DISABLE が設定されていることが確認出来ました。良さそうです。

7EB876F6-2E70-449B-B227-F969B3F88CB6.png

実際にルールのステータスも確認してみましょう。無事無効化されていることが確認出来ていると思います。

2485ABE6-3BD7-49E9-B89B-E6CE95FD770F_4_5005_c.jpeg

さいごに

本日は AWS Amplify Gen 2 のスケジュール実行可能な関数のルールをデプロイ時は無効化したかったのでやってみました。

開発期間などで毎回手動で無効化するのが面倒だったので Gen2 のコード上で対応することにしました。
あまり使う機会はないと思いますがどなたかの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.