ウェブサイト検索

12 日間 (5 日目) - 毎日のトリガーによる誕生日リマインダーの自動化


12 日間の DigitalOcean 5 日目 へようこそ!昨日、誕生日リマインダー サービスを DigitalOcean Functions で実行するように設定しました。これは、サーバーレスでクラウド対応になったことを意味します。 🎉 今日は、独自のスケジュールで実行するように自動化することで、さらに一歩前進します。手動入力は必要ありません。

このガイドが終了するまでに、サービス (または作業中のその他の機能) が毎日設定された時間に自動的に実行されるようになります。つまり、自分でトリガーすることを忘れずに済み、そのまま機能します。

なぜ自動化するのか?

関数をクラウドにデプロイすることは昨日大きな成果でしたが、それを手動で実行しなければならないのは自動化の目的に反することになります。今日の焦点は、時計仕掛けのように自動的に実行されるようにサービスをスケジュールすることで、設定した後は忘れることができます。 DigitalOcean Functions には、まさにこの目的のためにトリガーを使用したスケジューリングが組み込まれており、それを設定するには 2 つの方法があります。

🚀 学ぶ内容

今日が終わるまでに、次の方法がわかるようになります。

  1. 毎日のトリガーを設定して、関数を自動的に実行します。
  2. これを行うには、DigitalOcean コントロール パネルを使用するか、doctl CLI と project.yml を使用する 2 つの方法を学習します。
  3. セットアップをテストして、機能することを確認します。

🛠 必要なもの

始める前に、次のものが揃っていることを確認してください。

  1. DigitalOcean にすでにデプロイされている機能 (例: 誕生日リマインダー サービス (4 日目: 誕生日リマインダー サービスの構築)) は、トリガーで自動化します。
  2. doctl CLI を使用する場合は、関数に project.yml ファイルが必要です。 doctl CLI のインストールと設定、および project.yml ファイルの作成の手順については、4 日目をご覧ください。

🧑🍳 5日目のレシピ: トリガーを使用した関数の自動化

ステップ 1: 関数のトリガーを設定する

DigitalOcean には、トリガーを設定するための 2 つのオプションがあります。

  1. オプション 1: コントロール パネルを使用して、すばやく簡単にセットアップします。
  2. オプション 2: より堅牢でプログラムによる制御を行うには、doctl CLI を使用します。

警告: CLI を使用して関数を再デプロイすると、コントロール パネルで作成したトリガーが失われることに注意してください。頻繁に再デプロイする場合は、オプション 2 を使用してトリガーを project.yml ファイルに直接追加します。

オプション 1: コントロール パネルを使用してトリガーを作成する

トリガーを設定する最も簡単な方法は、DigitalOcean コントロール パネルを使用することです。迅速でセットアップが不要で、単純な 1 回限りの構成に最適です。

  • DigitalOcean ダッシュボードのメインの「機能」ページに移動します。
  • 機能 (リマインダー/誕生日 など) を見つけて、[トリガー] タブをクリックします。

  • [トリガーの作成] をクリックし、トリガーの名前を追加します。これは、daily-birthday-trigger など、わかりやすいものであれば何でもかまいません。名前には、英数字、ダッシュ、ピリオドのみを含める必要があります。
  • スケジュールを設定するにはcron 式を追加します。たとえば、0 9 * * * は、関数が毎日午前 9:00 に実行されることを意味します。

注: cron の仕組みがわからない場合は、便利なガイドについては、crontab.guru をチェックしてください。

  • トリガーを保存します。

トリガーを作成したら、それをテストして、すべてが期待どおりに動作することを確認することをお勧めします。方法については、以下の自動化のテストセクションに移動してください。

警告: ダッシュボードはシンプルで効果的ですが、CLI を使用して関数を再デプロイすると、ここで作成したトリガーはすべて上書きまたは削除されます。頻繁な更新またはプログラムによる導入の場合は、オプション 2 に進んでください。

オプション 2: project.ymldoctl CLI を使用する

トリガーを project.yml ファイルに直接追加して作成することもできます。この方法では、トリガーが常に関数の構成に含まれることが保証されるため、頻繁に再デプロイする場合により信頼性が高くなります。前述のコントロール パネル オプションとは異なり、このアプローチでは、再展開中にトリガーが上書きされたり失われたりすることがなくなります。

設定方法は次のとおりです。

  • 「Day 4: DigitalOcean Functions を使用した誕生日通知のデプロイ」の project.yml ファイルを開きます。次のようになります。

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
    
  • triggers セクションを関数設定に追加して、スケジュールを定義します。

    triggers:
      - name: daily-birthday-trigger
        sourceType: scheduler
        sourceDetails:
        cron: "0 9 * * *"
    
  • 最終更新された project.yml ファイル:

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
            triggers:
              - name: daily-birthday-trigger
                sourceType: scheduler
                sourceDetails:
                  cron: "0 9 * * *"
    

    これにより、DigitalOcean は毎日午前 9 時に birthdays 関数を実行するように指示されます。

    1. triggers セクション: トリガーの名前、タイプ、スケジュールを定義します。トリガーには、daily-birthday-trigger など、わかりやすい名前を付けることができます。

    2. cron: 関数が毎日実行される時刻を UTC で指定します。たとえば、cron 式 0 9 * * * は、関数が毎日午前 9:00 に実行されるようにスケジュールします。

  • ファイルを保存し、my-birthday-reminder-service フォルダーを含むディレクトリから次のコマンドを実行してデプロイします。

    doctl serverless deploy my-birthday-reminder-service
    

    重要: my-birthday-reminder-service フォルダ内ではなく、必ず親ディレクトリからコマンドを実行してください。間違った場所から実行すると、次のようなエラーが発生する可能性があります。

    ❯ doctl serverless deploy my-birthday-reminder-service
    Error: ENOENT: no such file or directory, lstat
    
  • { }

  • デプロイが成功すると、次のような確認メッセージが表示されます。

    Deployed functions
      - reminders/birthdays
    Deployed triggers:
      - daily-birthday-trigger
    

  • ダッシュボードに移動して、関数セクションにトリガーが作成されていることを確認します。

プロのヒント: トリガーをテストするには、一時的に cron 式を今から数分後に設定します (例: 午前 9 時 25 分の場合は 28 9 * * *)。動作することを確認したら、意図したスケジュールに更新して再デプロイします。

ステップ 2: 自動化をテストする

トリガーをテストして、機能していることを確認しましょう。通常のスケジュールで起動するのを待つ代わりに、今から数分後に実行するように一時的に設定できます。その方法は次のとおりです。

  • トリガーの cron 式を現在時刻 (UTC) から数分に設定します。たとえば、UTC の午前 9 時 25 分の場合、関数が UTC の午前 9 時 28 分に実行されるように、cron 式を 28 9 * * * に設定します。

    注: 現地時間を UTC に変換する方法がわからない場合は、 Time Zone Converter などのツールが役に立ちます。

  • { }

  • 更新されたトリガーを保存するか(コントロール パネルを使用する場合)、更新された project.yml ファイルを再デプロイします(CLI を使用する場合)。

    doctl serverless deploy my-birthday-reminder-service
    
  • トリガーが実行されるのを待ち、アクティベーション ログをチェックして関数が正常に実行されたことを確認します。

    doctl serverless activations logs --function reminders/birthdays --last
    

注: アクティベーション ログには、関数が正常に実行されたかエラーが発生したかなど、関数が実行されたときの詳細が記録されます。これは、トリガーがスケジュールされた時間に起動されたことを確認するのに役立ちます。

このコマンドは、関数の最新のアクティブ化の詳細を返します。たとえば、次のようなものが表示される場合があります。

=== 59e8e4f482874d79a8e4f48287dd79ef success 12/23 07:46:33 reminders/birthdays:0.0.6
2024-12-23T07:46:33.323205805Z stdout: Message sent for Charlie Brown. Message SID: SM85f5caeb3ec09239e0d8bdaaba2b158b

これにより、トリガーが起動され、機能が正常にアクティブ化されたことが確認されます。 🎉

注: すべてが機能していることを確認したら、cron 式を意図したスケジュールに更新します (例: 0 9 * * * は毎日午前 9:00 UTC)。保存または再デプロイします。

ログに関する簡単なメモ

activations logs コマンドは、最近の実行を確認する優れた方法ですが、関数の問題をデバッグまたは調査するために、より詳細なログが必要になる場合があります。 DigitalOcean は、これらのログを外部ログ サービスに転送するオプションも提供し、アプリケーションの監視とトラブルシューティングを長期的に容易にします。

6 日目では、ログを直接表示し、効果的に解釈し、Logtail や Papertrail などの外部サービスへのログ転送を設定する方法を学びます。これらのツールを使用すると、関数のパフォーマンスを簡単に把握できます。

🎁 まとめ

今日あなたが達成したことは次のとおりです。

  1. 誕生日リマインダー サービス (またはその他の機能) を毎日実行するように自動化しました。
  2. トリガーを設定する 2 つの方法、つまりコントロール パネルを使用する方法と doctl CLI を使用する方法を学習しました。
  3. セットアップをテストして、期待どおりに動作することを確認しました。

このシリーズの以前のチュートリアルは次のとおりです。

  • 1 日目: 誕生日リマインダー用に PostgreSQL データベースをセットアップする
  • 2 日目: Python を使用して PostgreSQL データベースに接続する
  • 3日目: 誕生日の確認とSMS通知の送信
  • 4 日目: 誕生日通知を関数にデプロイする

次のステップ: サービスが独立して実行されるようになったので、次のステップはサービスを効果的に監視することです。次のチュートリアルでは、関数ログを表示し、追跡とトラブルシューティングを簡素化するために外部サービスに転送する方法を学びます。それではまた!