2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LambdaとGitHubActionsで定期実行

Last updated at Posted at 2025-12-07

この記事は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に静的サイトのビルドを実行する設定になります。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?