디지털오션의 12일 (5일차) – 매일 알림으로 생일 알림 자동화하기

5일차에 오신 것을 환영합니다! 디지털오션의 12일! 어제, 당신은 생일 알림 서비스디지털오션 함수에서 실행하도록 설정했습니다. 이제 서버리스이고 클라우드 준비가 완료되었습니다. 🎉 오늘은 이 서비스를 자동화하여 스스로 일정에 따라 실행되도록 한 단계 더 나아갈 것입니다. 수동 입력은 필요 없습니다.

이 가이드를 끝내면, 당신의 서비스(또는 작업 중인 다른 함수)는 매일 정해진 시간에 자동으로 실행될 것입니다. 즉, 더 이상 스스로 트리거를 기억할 필요가 없습니다. 자동으로 작동합니다.

자동화의 이유?

어제 클라우드에 함수를 배포한 것은 큰 성과였지만, 수동으로 실행해야 한다면 자동화의 목적을 무색하게 합니다. 오늘의 초점은 서비스를 자동으로 실행되도록 일정 설정하는 것입니다—시계처럼—당신이 설정하고 잊어버릴 수 있도록. 디지털오션 함수는 이 정확한 목적을 위해 트리거를 이용한 내장 일정 기능을 가지고 있으며, 이를 설정할 수 있는 두 가지 방법이 있습니다.

🚀 배울 내용

오늘이 끝나기 전에, 다음을 알게 될 것입니다:

  1. 자동으로 함수를 실행하도록 매일 트리거를 설정합니다.
  2. 두 가지 방법을 배웁니다—DigitalOcean 제어판을 통해 또는 doctl CLI와 project.yml을 사용하여.
  3. 설정을 테스트하여 제대로 작동하는지 확인합니다.

🛠 필요 사항

시작하기 전에 다음 사항을 확인하세요:

  1. 트리거로 자동화할 수 있는 DigitalOcean에 이미 배포된 함수(예: 4일차: 생일 알림 서비스 만들기)가 필요합니다.
  2. doctl CLI를 사용할 경우, 기능을 위한 project.yml 파일이 필요합니다. 4일차에서 doctl CLI 설치 및 설정 방법과 project.yml 파일 생성 방법에 대한 지침을 확인할 수 있습니다.

🧑‍🍳 5일차 레시피: 트리거로 기능 자동화하기

1단계: 기능을 위한 트리거 설정하기

DigitalOcean은 트리거 설정을 위한 두 가지 옵션을 제공합니다:

  1. 옵션 1: 빠르고 쉽게 설정할 수 있도록 제어판을 사용하세요.
  2. 옵션 2: 더 강력하고 프로그래밍 방식의 제어를 위해 doctl CLI를 사용하세요.

경고: CLI를 사용하여 기능을 재배포하면 제어판에서 생성한 트리거가 사라집니다. 자주 재배포할 예정이라면 옵션 2를 사용하여 트리거를 project.yml 파일에 직접 추가하세요.

옵션 1: 제어판을 사용하여 트리거 만들기

트리거를 설정하는 가장 쉬운 방법은 DigitalOcean 제어판을 통한 것입니다. 빠르고, 설정이 필요 없으며, 간단한 일회성 구성에 적합합니다.

  • DigitalOcean 대시보드에서 주요 함수 페이지로 이동합니다.
  • 함수를 찾고 (예: reminders/birthdays) 트리거 탭을 클릭합니다.

  • 트리거 만들기를 클릭하고 트리거의 이름을 추가합니다. 이는 daily-birthday-trigger와 같이 설명적인 어떤 것이어도 됩니다. 이름에는 영숫자, 대시, 마침표만 포함되어야 합니다.
  • 일정을 설정하기 위해 크론 표현식을 추가합니다. 예를 들어, 0 9 * * *는 함수가 매일 오전 9시에 실행됨을 의미합니다.

참고: 크론이 어떻게 작동하는지 확실하지 않나요? 유용한 가이드를 보려면 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 기준으로 실행될 시간을 지정합니다. 예를 들어, 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
    

  • 대시보드로 이동하여 기능 섹션 아래에 트리거가 생성되었는지 확인하세요.

전문가 팁: 트리거를 테스트하려면 크론 표현식을 잠시 후 몇 분으로 설정하세요 (예: 오전 9시 25분이면 28 9 * * *로 설정). 작동하는 것을 확인한 후 기존 일정으로 업데이트하고 다시 배포하세요.

단계 2: 자동화 테스트

트리거가 작동하는지 확인하기 위해 테스트해 보겠습니다. 일반적인 일정에서 트리거가 작동하기를 기다리는 대신, 잠시 후 몇 분으로 설정하여 실행할 수 있습니다. 다음은 그 방법입니다:

  • 트리거의 크론 표현식을 현재 시간(UTC)에서 몇 분 후로 설정하세요. 예를 들어, UTC 오전 9시 25분이면 크론 표현식을 28 9 * * *로 설정하여 함수가 UTC 오전 9시 28분에 실행되도록 합니다.

    참고: 로컬 시간을 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

이것은 트리거가 발동했고 함수가 성공적으로 활성화되었음을 확인합니다! 🎉

참고: 모든 것이 정상 작동하는지 확인한 후, 크론 표현식을 원하는 일정으로 업데이트하고(예: 0 9 * * *는 매일 오전 9:00 UTC) 저장하거나 재배포합니다.

로그에 대한 간단한 참고사항

활성화 로그 명령은 최근 실행을 확인하는 좋은 방법이지만, 때때로 함수의 문제를 디버그하거나 조사하기 위해 더 상세한 로그가 필요할 수 있습니다. DigitalOcean은 이러한 로그를 외부 로깅 서비스로 전달하는 옵션도 제공하여 시간이 지남에 따라 애플리케이션 모니터링 및 문제 해결을 쉽게 만듭니다.

6일차에는 로그를 직접 보고, 효과적으로 해석하며, Logtail 또는 Papertrail과 같은 외부 서비스로 로그 전달을 설정하는 방법을 배웁니다. 이러한 도구들은 당신의 기능 성능을 쉽게 파악하는 데 도움이 될 것입니다.

🎁 마무리

오늘 당신이 성취한 내용은 다음과 같습니다:

  1. 당신은 생일 알림 서비스(또는 다른 기능)를 매일 실행되도록 자동화했습니다.
  2. 당신은 제어판을 통해서와 doctl CLI를 사용하여 트리거를 설정하는 두 가지 방법을 배웠습니다.
  3. 당신은 설정을 테스트하여 예상대로 작동하는지 확인했습니다.

다음은 이 시리즈의 이전 튜토리얼입니다:

다음: 서비스가 독립적으로 실행되므로, 다음 단계는 이를 효과적으로 모니터링하는 것입니다. 다음 튜토리얼에서는 함수 로그를 조회하고 이를 외부 서비스로 전달하여 추적 및 문제 해결을 간소화하는 방법을 배웁니다. 그때 뵙겠습니다!

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