この記事はRust+SvelteKit+CDKでRSS要約アプリを作ってみる Advent Calendar 2025の8日目の記事になります。
また、筆者が属している株式会社野村総合研究所のアドベントカレンダーもあるので、ぜひ購読ください。
EventBridgeでLambdaを定期実行する
決まった時刻に実行したい場合
Lambdaを定期実行したい場合はEventBridgeを使うことができます。今回は日次かつ決まった時刻に実行したいため、events.Schedule.cronを利用します。CDKでの定義方法は以下のとおりです。
// RSSフィード収集Lambda
const collectorLambda = new RustFunction(this, "CollectorFunction", {
manifestPath: path.join(__dirname, "..", "lambda", "Cargo.toml"),
binaryName: "collector",
environment: {
FEED_TABLE_NAME: feedDb.tableName,
ARTICLE_TABLE_NAME: articleDb.tableName,
ARTICLE_BUCKET_NAME: articleBucket.bucketName,
QUEUE_URL: queue.queueUrl,
AWS_LAMBDA_LOG_LEVEL: "debug",
},
timeout: cdk.Duration.seconds(120), // ← ここで設定(例: 30秒)
});
new events.Rule(this, "RssFeedScheduleRule", {
schedule: events.Schedule.cron({
minute: "30",
hour: "22",
}),
targets: [new cdk.aws_events_targets.LambdaFunction(collectorLambda)],
});
このように書くことで、UTCで22:30にRSSフィード収集Lambdaを実行する設定になります(タイムゾーンは無いので日本時間ではないことに注意しましょう)。
決まった間隔で実行したい場合
実行の間隔を定義したい場合はevents.Schedule.rateを利用します。
new events.Rule(this, "RssFeedScheduleRule", {
schedule: events.Schedule.rate(cdk.Duration.hours(24)),
targets: [new cdk.aws_events_targets.LambdaFunction(collectorLambda)],
});
このように書くと、24時間ごと(=日次)にLambdaを実行します。ただし、実行時刻はデプロイタイミングに依存することになります。
GitHub Actionsを定期実行する
静的サイトのビルドも日次で実行します。ソースコードを元に生成するので、LambdaではなくGitHub Actionsを利用します。GitHub Actionsの設定は以下のとおりです。
name: Build and Deploy Web App
on:
push:
branches:
- main
schedule:
- cron: "0 23 * * *"
workflow_dispatch:
jobs:
web_deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ vars.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ vars.AWS_REGION }}
- name: Install dependencies
working-directory: ./web
run: bun install --frozen-lockfile
- name: Build web app
working-directory: ./web
env:
WEBSITE_BUCKET_NAME: ${{ vars.WEBSITE_BUCKET_NAME }}
ARTICLE_DATABASE_NAME: ${{ vars.ARTICLE_DATABASE_NAME }}
run: bun run build
- name: Deploy to S3
run: |
aws s3 sync ./web/build s3://${{ vars.WEBSITE_BUCKET_NAME }} --delete
- name: Deploy to CloudFront
run: |
aws cloudfront create-invalidation --distribution-id ${{ vars.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*"
このように書くことで、UTCで23:00に静的サイトのビルドを実行する設定になります。