AWS Amplify Gen 2 のスケジュール実行可能な関数のルールをデプロイ時は無効化したい
いわさです。
半年ほど前に AWS Amplify Gen 2 のアップデートで、関数リソースの設定だけでスケジュール実行を設定できるようになりました。
スケジュール実行は EventBridge なので、最短 1 分から繰り返し実行が可能です。
こちら当然ながらデプロイした瞬間からルールが有効になっており、すぐに定期実行が開始されます。
通常はそれで問題ないと思うのですが、先日とある事情で、デフォルトでスケジュールを無効化した状態でデプロイして必要なタイミングで手動でルールを有効化したいケースがありました。
調べてみたところ Amplify に追加された FunctionSchedule では無効化のプロパティは提供されていないので、別の方法で無理やり実装してみました。
スケジュール設定された関数のルールを特定する
前提として冒頭の記事のようにスケジュール設定された関数を作成します。
import { defineFunction } from "@aws-amplify/backend";
export const hogeschedule = defineFunction({
name: "hogeschedule",
schedule: [
"every 1m"
],
});
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
で設定したスケジュール設定がここに反映される形です。
念の為確認してみましたが当然ながらルールのステータスは有効状態です。
こちらをデフォルト無効化にしたい。
CDK Aspect でパラメータの上書きをする
Amplify Gen 2 は結局は CDK スタックなので、backend.ts
上で様々な方法でスタックにアクセスしプロパティの追加や編集が可能で、過去に何度か試した記事を書きました。
今回は次のように CDK の Aspect 機能を使ってパラメータの上書きをおこなってみたいと思います。
hogeschedule
を探して、state
プロパティにDISABLED
を設定しました。
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 が設定されていることが確認出来ました。良さそうです。
実際にルールのステータスも確認してみましょう。無事無効化されていることが確認出来ていると思います。
さいごに
本日は AWS Amplify Gen 2 のスケジュール実行可能な関数のルールをデプロイ時は無効化したかったのでやってみました。
開発期間などで毎回手動で無効化するのが面倒だったので Gen2 のコード上で対応することにしました。
あまり使う機会はないと思いますがどなたかの参考になれば幸いです。