ウェブサイト検索

12 日間 (6 日目) - 機能ベースの誕生日リマインダー サービスの外部ログのセットアップ


12 日間の DigitalOcean へようこそ!過去 5 日間で、連絡先を PostgreSQL データベースに保存し、誕生日をチェックし、SMS 通知を送信し、DigitalOcean Functions を使用して自動的に実行し、トリガーでスケジュールを自動化する、完全に機能する誕生日リマインダー サービスを構築しました。

今回はロギングを設定してアプリの信頼性をさらに高めます。ログはあらゆるアプリの縁の下の力持ちです。ログは舞台裏で何が起こっているかを確認し、バグを見つけ、問題を効果的にトラブルシューティングするのに役立ちます。

✨ 外部ログサービスを使用する理由?

DigitalOcean は、すべての関数ログ (console 出力とエラー メッセージの両方) を Papertrail、BetterStack (旧 LogTail)、DataDog などの外部ログ サービスに転送する組み込みの方法を提供します。これらのサービスは、次のような強力な機能を提供します。

  • ログを検索およびフィルタリングして、特定のイベントやエラーをすばやく見つけます。
  • デバッグや監査のためにログの履歴を保存します。
  • ログを一元化されたダッシュボードに集約することで複数のアプリを 1 か所で監視します。
  • 重大な問題についてアラートを設定し、Slack や PagerDuty などのツールと統合します。

たとえば、誕生日リマインダー サービスが突然リマインダーの送信を停止した場合、外部ログは、データベース接続エラー、API の構成ミス、またはまったく別の原因であるかどうか、問題を正確に特定するのに役立ちます。

🚀 学ぶ内容

このガイドを終えると、次の方法がわかるようになります。

  • Papertrail を使用して DigitalOcean Function のログを設定します。
  • Papertrail でログの宛先を作成します。これは、トークンベースの認証を使用してログを安全に転送するためのエントリ ポイントです。
  • ログが Papertrail のダッシュボードにキャプチャされていることを確認します。

このチュートリアルの例としてPapertrail を使用しますが、この手順は BetterStack や DataDog などの他のサービスにも簡単に適用できます。

🛠 必要なもの

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

  • DigitalOcean に誕生日リマインダー サービスが展開されました (4 日目から)。
  • Papertrail アカウントにアクセスします (まだお持ちでない場合は作成します)。
  • 関数の project.yml ファイル。

🧑🍳 6日目のレシピ: ロギングのセットアップ

ステップ 1: DigitalOcean で Papertrail ログを有効にする

まず、アカウントで Papertrail が有効になっていることを確認します。

  1. DigitalOcean アカウントにログインします。

  2. ダッシュボードのSaaS アドオンに移動します。

  3. Papertrail を見つけて、[Papertrail を追加] をクリックします。

  4. 無料プランを選択してください (高度なログ検索は含まれていませんが、実験には最適です)。

  5. 規約に同意し、[Papertrail の追加] をクリックしてサービスを有効にします。

それでおしまい!これで Papertrail が DigitalOcean アカウントに接続されました。 🎉

DigitalOcean アカウントで Papertrail が有効になったので、次のステップは、Papertrail でトークンベースの認証を使用するログ宛先を作成することです。

ステップ 2: トークンベースの認証を使用して Papertrail にログの宛先を作成する

すでに Papertrail アカウントをお持ちの場合は、アカウントにログインします。そうでない場合でも、心配する必要はありません。Papertrail を使用すると簡単に始めることができます。クレジットカード不要で無料で登録できます。サインアップすると、ログの保存先を作成できるようになります。

  1. Papertrail アカウントにログインし、[設定] > [ログの宛先] に移動します。

  2. [新しい目的地] をクリックします。

  3. 宛先作成ページで:

    • 宛先に名前を付けます: my-birthday-reminder-service-logs など、わかりやすい名前を付けます。
    • [接続を受け入れる] で、トークンベースの認証用に [トークン] を選択します (HTTPS が選択されていることを確認してください)。
    • [作成] をクリックします。

  4. 作成すると、ログ宛先の詳細の下にトークンが表示されます。このトークンをコピーします。アプリの構成に必要になります。

ステップ 3: .env ファイルと project.yml を更新する

DigitalOcean 関数から Papertrail にログを転送するには、トークンを .env ファイルに追加し、LOG_DESTINATIONS フィールドで直接参照する必要があります。プロジェクト.yml

  1. プロジェクトのルートにある .env ファイルを開き、次の行を追加します。

    PAPERTRAIL_API_TOKEN=<your-token>
    

    を Papertrail からコピーしたトークンに置き換えます。

  2. 次に、project.yml ファイルを開き、environment セクションを更新して LOG_DESTINATIONS フィールドを含めます。更新された project.yml は次のようになります。

    packages:
      - name: reminders
        shared: false
        environment:
          DB_NAME: "${DB_NAME}"
          DB_USER: "${DB_USER}"
          DB_PASSWORD: "${DB_PASSWORD}"
          DB_HOST: "${DB_HOST}"
          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}"
          LOG_DESTINATIONS: '[{"papertrail":{"token":"${PAPERTRAIL_API_TOKEN}"}}]'
        functions:
          - name: birthdays
            runtime: python:default
            triggers:
              - name: daily-birthday-trigger
                sourceType: scheduler
                sourceDetails:
                  cron: "50 7 * * *"
    
    

    この構成では:

    • .env ファイルの PAPERTRAIL_API_TOKEN は、LOG_DESTINATIONS フィールドで自動的に参照されます。
    • これにより、トークンが認証のために Papertrail に安全に渡されるようになります。
  3. 変更を保存し、関数をデプロイします。

    doctl serverless deploy my-birthday-reminder-service
    

ヒント: このコマンドを実行するときは、my-birthday-reminder-service ディレクトリ内にいないことを確認してください。デプロイメントエラーを避けるために、親ディレクトリから実行してください。

ステップ 4: Papertrail のログを確認する

構成が完了したら、ログを確認してすべてが動作していることを確認しましょう。 curl コマンドを使用した簡単なテストから始めて、関数が期待どおりにログを送信するかどうかを確認します。

カールを使ったクイックテスト

関数をテストする前に、次の curl コマンドを使用して、Papertrail ログの保存先が正しく設定されていることを確認します。

  • ターミナルを開いて次のコマンドを実行します。

    curl -u :<your-token> \
        -H "Content-Type: application/json" \
        -d '{"hello": "world"}' \
        https://logs.collector.solarwinds.com/v1/log
    

を Papertrail からコピーしたトークンに置き換えます。

  • Papertrail アカウントにログインし、イベント タブ (https://my.papertrailapp.com/events) に移動します。

  • {"hello": "world"} というログ エントリを探します。

    1. ログが表示された場合: おめでとうございます。ログの宛先は正しく設定されています。
    2. そうでない場合: トークンを再確認し、curl コマンドを再試行します。正しいトークンとエンドポイント URL を使用していることを確認してください。

機能をテストする

ログの宛先が機能することを確認したら、関数をテストします。

  • 関数を手動でトリガーしてログを生成します。
doctl serverless activations invoke reminders/birthdays

ヒント: 必要に応じて、コントロール パネルから関数に移動し、[実行] をクリックして関数を手動で実行することもできます。

  • コントロール パネルから実行する場合の確認:

    • [実行] をクリックすると、機能が有効になったことを確認するメッセージが表示されます。
    • すべてが正しく設定されている場合は、次のようなメッセージがログに表示されます。
    2024-12-26T22:58:27.164476652Z stdout: Logs will be written to the specified remote location. Only errors in doing so will be surfaced here.
    

    これにより、ログが Papertrail に正常に転送されたことが確認されます。

  • Papertrail アカウントにログインし、イベント タブ (https://my.papertrailapp.com/events) に移動します。

  • 関数からの次のようなログ エントリを確認します。

    2024-12-26T23:05:39 INFO: Reminder sent to +1234567890 for Alice Smith's birthday.
    
    1. ログが表示される場合: 関数はログを Papertrail に正常に送信しています。
    2. そうでない場合: 以下のトラブルシューティング セクションに進みます。

トラブルシューティング

Papertrail にログが表示されない場合は、次のデバッグ手順を実行してください。

  1. 設定の確認: project.yml ファイルに LOG_DESTINATIONS フィールドが含まれており、Papertrail トークンを正しく参照していることを確認してください。

  2. ログ ステートメントの確認: __main__.py ファイルに、ログを生成するための print または logger.info ステートメントが含まれていることを確認してください。 。例えば:

    import logging
    
    logging.basicConfig(level=logging.INFO)
    
    def main(params):
        logging.info("Reminder function triggered.")
        print("Reminder function executed.")
    
  3. Curl を使用したテスト: curl コマンドを再度実行して、トークンとログの宛先が期待どおりに動作していることを確認します。

  4. 関数を再デプロイ: 設定またはログ ステートメントに変更が加えられた場合は、関数を再デプロイします。

    doctl serverless deploy my-birthday-reminder-service
    
  5. アクティベーション ログを確認する: 次のコマンドを使用して、最新のアクティベーション ログにエラーがないか確認します。

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

これらの手順に従うことで、ログ設定に関する問題を特定して解決できるはずです。

🎁 まとめ

今日、あなたは以下の方法で誕生日リマインダー サービスをレベルアップしました。

  1. DigitalOcean での Papertrail ログの有効化。
  2. Papertrail にトークンベースのログ宛先を作成しました。
  3. Papertrail のトークンベースのログ送信先を使用して、アプリから Papertrail にログを転送します。
  4. Papertrail のログを確認しました。

ログインを適切に行うと、アプリの監視とトラブルシューティングをより効果的に行うことができます。 🎉

振り返る: これまでの旅

ここで、誕生日リマインダー サービスでこれまでに達成したすべてのことを祝いましょう。過去 6 日間で次のことを行いました。

  1. 1 日目: 連絡先を保存するための PostgreSQL データベースをセットアップする
  2. 2 日目: データベースに接続して誕生日を取得する Python スクリプトを構築しました。
  3. 3日目: Twilioを使用してSMSリマインダーを送信する機能を追加
  4. 4 日目: アプリを DigitalOcean Functions にデプロイしてサーバーレスかつスケーラブルにしました
  5. 5 日目: スケジュールに従って実行する自動リマインダー
  6. 6 日目: PaperTrail などのサービスを使用してログをキャプチャし保存するためのログ記録を設定する

次は、2 番目のアプリであるメールベースの受信プロセッサを構築するためにギアを切り替えます。これは少し異なりますが、同様にエキサイティングです。明日は次の課題に取り組みますので、さらにクールなツールやテクニックを学ぶ準備をしてください。 🚀