AWS Step Functions로 한 번만 이메일 보내기

대부분의 이메일 배달 API는 두 개의 요청을 보내는 경우 두 개의 이메일을 보냅니다. 요청을 복제할 수 있는 방법이 많기 때문에 이는 문제가 될 수 있습니다. 아마도 당신은 필요 이상으로 이메일을 보내고 싶지 않을 것입니다. 예를 들어 SQS와 EventBridge는 모두 최소 한 번 전송을 보장합니다.



Step Functions 및 DynamoDB를 사용하여 여러 이메일을 보내지 않도록 하는 방법을 살펴보겠습니다. DynamoDB에서 조건식을 사용하여 이미 이메일을 처리했는지 확인합니다. 상태 머신의 기본 흐름은 다음과 같습니다.
  • 이메일을 기반으로 해시를 만듭니다.
  • DynamoDB에 해시를 저장하려고 합니다. 항목이 이미 있으면 중단하고 아무 작업도 수행하지 않습니다.
  • 항목이 없으면 계속 진행하여 이메일을 보냅니다.



  • 동일한 입력으로 여러 번 실행하면 추가 이메일이 전송되지 않습니다. 멱등성이 있습니다.

    해시 만들기



    이메일의 짧은 문자열 표현을 만들어 데이터베이스에 저장하려고 합니다. 보낸 사람, 받는 사람, 제목 및 내용을 기반으로 고유한 문자열을 생성하는 해시 함수를 사용해 봅시다. 이는 데이터베이스의 고유 키로, 이전에 이메일을 처리했는지 여부를 확인하는 데 사용됩니다.

    const crypto = require('crypto');
    
    exports.handler = async (email) => {
        const combined = `${email.from}${email.to}${email.subject}${email.content}`
        const hash = crypto.createHash('sha256').update(combined).digest('base64');
        return hash;
    };
    


    항목 저장



    그런 다음 조건식을 사용하여 데이터베이스에 해시를 삽입하려고 시도합니다. 항목은 이미 존재하지 않아야 합니다. 항목이 이미 존재하는 경우(이미 처리했음을 나타냄) 이 오류를 포착하고 이메일을 보내지 않으려고 합니다. 존재하지 않는 경우 이메일 전송을 진행합니다.

    이메일 보내기



    이메일을 보내는 방법에는 여러 가지가 있습니다. 이메일 전송 API에 따라 구현하십시오. 이 단계는 한 번만 수행하려는 거의 모든 작업으로 대체할 수 있습니다. 예를 들어 결제 및 주문.

    exports.handler = async (email) => {
        // TODO implement send email
        return "sent email";
    };
    
    


    이메일이 이전에 처리되지 않은 경우 실행은 다음과 같아야 합니다.



    이메일이 이미 처리되었습니다.


    ConditionalCheckFailedException를 잡고 Step Functions에서 통과 상태를 사용합니다. 이번에는 실제로 이메일을 보내지 않았더라도 성공 상태로 끝나는 것이 중요합니다. 이는 멱등 API의 특성입니다. 다른 모든 오류에는 실패 상태를 사용하십시오.

    이메일이 이미 전송된 경우 실행은 다음과 같아야 합니다.



    결론



    그게 다야! 상태 시스템에 대한 정의는 여기에서 확인할 수 있습니다. https://gist.github.com/danielfyhr/4144dba260cc2bce1509d12cfd998664

    표준 워크플로는 각 워크플로 단계를 정확히 한 번 실행하도록 보장합니다. https://aws.amazon.com/step-functions/faqs/

    좋은 웹페이지 즐겨찾기