デジタルオーシャンの12日間(5日目)- デイリートリガーを使用した誕生日リマインダーの自動化

ようこそ、第5日デジタルオーシャンの12日間へ!昨日、あなたは誕生日リマインダーサービスデジタルオーシャンファンクションズで実行するように設定しました。つまり、サーバーレスでクラウド対応になりました。🎉 今日は、それをさらに進めて、自動的にスケジュールされるようにしていきます—手動での入力は不要です。

このガイドの終わりまでには、あなたのサービス(または作業中の他の機能)は、毎日設定した時間に自動的に実行されるようになります。つまり、自分でトリガーを思い出す必要はなくなります—ただ動作するだけです。

なぜ自動化するのか?

昨日、あなたの機能をクラウドにデプロイすることは大きな成果でしたが、それを手動で実行する必要があるのでは自動化の目的が果たせません。今日の焦点は、サービスを自動的に実行するようにスケジュールすることです—時計のように—なので、設定して忘れることができます。デジタルオーシャンファンクションズには、まさにこの目的のためにトリガーを使用したスケジューリング機能が組み込まれており、設定する方法は2つあります。

🚀 あなたが学ぶこと

今日の終わりまでに、あなたは以下のことができるようになります:

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

🛠 あなたに必要なもの

始める前に、次のものを用意してください:

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

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

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

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

  1. オプション1: コントロールパネルを使用して迅速かつ簡単に設定する。
  2. オプション2: より堅牢でプログラム的な制御のためにdoctl CLIを使用する。

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

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

トリガーを設定する最も簡単な方法は、DigitalOceanのコントロールパネルを通じて行うことです。迅速で、設定は不要で、シンプルな一度限りの構成に最適です。

  • DigitalOceanダッシュボードのメイン関数ページに移動します。
  • 関数を見つけて(例:reminders/birthdays)、トリガータブをクリックします。

  • トリガーを作成をクリックし、トリガーの名前を追加します。これは、daily-birthday-triggerのような説明的なものであれば何でも構いません。名前には英数字、ダッシュ、およびピリオドのみを含める必要があります。
  • cron式を追加してスケジュールを設定します。例えば、0 9 * * *は、関数が毎日午前9時に実行されることを意味します。

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

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

トリガーを作成したら、すべてが予想通りに機能するかを確認するためにテストすることをお勧めします。以下の自動化をテストするセクションにジャンプして、その方法を学びましょう。

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

オプション2: doctl CLIを使用してproject.ymlを使う

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

セットアップ方法は以下の通りです:

  • あなたの project.yml ファイルを 第4日: DigitalOcean Functionsを使用した誕生日通知のデプロイ から開いてください。内容は次のようなものになるかもしれません:

    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に、birthdays関数を毎日午前9時に実行するよう指示します。

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

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

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

    doctl serverless deploy my-birthday-reminder-service
    

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

    ❯ doctl serverless deploy my-birthday-reminder-service
    エラー: ENOENT: そのようなファイルやディレクトリはありません、lstat
    
  • デプロイが成功すると、次のような確認メッセージが表示されます:

    デプロイされた関数
      - reminders/birthdays
    デプロイされたトリガー:
      - daily-birthday-trigger
    

  • ダッシュボードに移動して、Functionsセクションの下にトリガーが作成されたことを確認してください。

プロのヒント: トリガーをテストするために、cron式を今から数分後に設定してください(例:9:25 AMの場合、28 9 * * *)。動作することを確認したら、元のスケジュールに戻して再デプロイしてください。

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

トリガーが正しく動作しているか確認するためにテストしましょう。通常のスケジュールで発動するのを待つ代わりに、今から数分後に実行するように一時的に設定できます。方法は以下の通りです:

  • トリガーのcron式を現在の時間(UTC)から数分後に設定します。例えば、UTCで9:25 AMの場合、cron式を28 9 * * *に設定して、関数がUTCで9:28 AMに実行されるようにします。

    注意: ローカル時間をUTCに変換する方法がわかりませんか? タイムゾーンコンバーターなどのツールが役立ちます。

  • 更新したトリガーを保存します(コントロールパネルを使用している場合)または更新された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 * * *はUTCの毎日9:00 AM)、保存または再デプロイします。

ログについての簡単な注意

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

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

🎁 まとめ

今日の成果は以下の通りです:

  1. あなたは、バースデーリマインダーサービス(または他の任意の機能)を毎日実行するように自動化しました。
  2. コントロールパネルを通じて、またはdoctl CLIを使用して、トリガーを設定する2つの方法を学びました。
  3. 設定が期待通りに動作することを確認するためにテストしました。

このシリーズの以前のチュートリアルは以下の通りです:

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

Source:
https://www.digitalocean.com/community/tutorials/automating-birthday-reminders-with-triggers