Amazon SNS를 사용하여 애플리케이션을 Webhook과 통합하는 방법

16368 단어 programmingawsapi
당신은 회의에서 신제품 구축과 제품 X, Y, Z의 통합 수요에 대해 토론한 적이 있습니까?
너는 정말 이런 시스템과 직접적인 통합을 구축하고 싶지 않다. 너는 더욱 통용되는 통합을 구축하고 싶다. 누구든지 사용할 수 있다.기왕 모든 사람을 위해 구축할 수 있는 바에야 왜 사용자 정의를 구축해야 합니까?
이벤트 구동 구조에서, 예를 들어 서버 응용 프로그램이 없는 경우, 응용 프로그램의 많은 다른 위치에 집적점을 가지고 있을 것입니다.이 집적점은 사건이라고 불리며 당신이 생각하는 - 발생한 일을 정확하게 표시합니다.
너는 너의 안전 카메라가 운동을 감지했을 때, 너는 어떻게 휴대전화에서 통지를 받았는지 아니?이것은 사건이다.당신의 스마트 카메라가 그 고양이가 당신의 차도를 지나가는 것을 보았을 때, 그것은'검측 운동'사건을 발표했다.
그런데 사건을 어떻게 처리하세요?너는 인터넷 갈고리로 그들의 말을 들어라.

사진은 Jake Young 에서 Unsplash

무엇이 그물 갈고리입니까?


웹훅은 시스템에서 이벤트가 발생할 때 메시지를 수신하는 데 사용되는 API입니다.일반적으로 특정 이벤트가 발생하면 이벤트 구동 프로그램은 모든 수신 또는 구독 중인 Webhook에 미리 정의된 메시지를 발표합니다.
그리고 이벤트를 발표한 시스템은 이 교환에서 모든 책임을 진다.그것은 다른 시스템으로 하여금 무슨 일이 일어났는지 알게 하고, 지금은 그것의 즐거움의 길을 계속할 수 있다.
구독자는 이 소식을 처리할 책임이 있다.이것은 원시 응용 프로그램의 API를 사용하여 더 많은 데이터를 불러오거나 다른 응용 프로그램을 호출하여 다른 작업을 수행하는 것을 의미하든지 간에 진정한 작업은 웹hook에서 이루어진다.

아마존 SNS


Amazon은 이벤트를 게시하기 위해 관리Simple Notification Service를 제공합니다.솔직히 말하자면, 이것은 이것에 그치지 않지만, 오늘 우리는 응용 프로그램이 실행될 때 외부 시스템에 알릴 수 있도록 HTTPS 이벤트를 어떻게 발표하는지에 중점을 두려고 한다.
SNS에서 이벤트는 주제라고 불리며 응용 프로그램의 다른 작업을 구성하고 분류하는 데 사용된다.
어떤 일이 발생하여 응용 프로그램이 특정한 조작을 실행할 때, 예를 들어 우리의 안전카메라 응용 프로그램의 고양이가 차도를 달리고 있을 때, SNS는 운동 검측 주제에 발표되고 모든 관심 시스템을 통지할 것이다.

사진은 Markus Spiske 에서 Unsplash

이벤트 게시


SNS는 일종의 위탁 관리 서비스일 수도 있지만, 여전히 인코딩이 있어야만 정상적으로 작동할 수 있다.
응용 프로그램에서 동작하는 코드를 처리하려면 메시지를 만들고 SNS를 호출해서 발표해야 합니다.메시지의 상세한 정보는 완전히 귀하가 결정합니다. 추가할 수 있는 것과 추가할 수 없는 것에 대해서는 어떠한 규칙도 없습니다.그러나 정보를 구축할 때 구체적인 사항을 기억해야 한다.
  • 기본적으로 SNS 메시지는 암호화되지 않으므로 PIIPersonally Identifiable Information와 같은 내용을 추가하는 것을 피합니다.
  • 메시지 구조가 결정되면 변경하지 마세요!You might break your integrators .
  • 컨설턴트는 항상 API를 호출하여 더 많은 정보를 얻을 수 있고 필요한 정보만 제공할 수 있습니다.
  • 방송하다


    모든 사람에게 이벤트를 발표하고 싶다면, 이벤트 구독자에게 방송 메시지를 보낼 수 있습니다.응용 프로그램이 단일 세입자/다중 사례이거나 모든 사람에게 적용되는 이벤트(예를 들어 사용자에게 중대한 시스템 중단을 알리는 것)가 있다면 이 메시지는 사용자에게 적용됩니다.
    다음은 노드의 단일 임대인 응용 프로그램의 운동 검사 사건 예시입니다.js lambda 함수:
    function publishMotionDetectedEvent = async (cameraId, coords, duration) => {
      const message = {
        eventType: 'motion-detected',
        data: {
          cameraId: cameraId,
          boundingBox: {
            x: coords.x,
            y: coords.y,
            width: coords.width,
            length: coords.length
          },
          durationMs: duration
        }
      };
    
      const params = {
        Message: JSON.stringify(message),
        TopicArn: process.env.MOTION_DETECTED_TOPIC_ARN
      };
    
      const sns = new SNS();
      await sns.publish(params).promise();
    }
    
    우리의 소식에서, 우리는 현재 발표되고 있는 사건에 관한 필요한 정보만 있을 뿐이다.예를 들어cameraId, 구축boundingBox 디테일, 그리고 운동durationMs.
    이 정보는 구독 활동의 모든 사람에게 발송될 것이다.만약 그들이 더 많은 정보를 필요로 한다면, 그들은 우리의 응용 프로그램에서 API를 사용하여 그들의 데이터를 풍부하게 할 수 있다.

    필터링


    다세입자 프로그램에서 사건이 발생했을 때 모든 사람에게 메시지를 방송하는 것을 원하지 않습니다.이것은 사용자의 프라이버시에 매우 불리하다.
    반대로 구독에 메시지 필터를 추가하고 이벤트에 상세한 정보를 추가해서 특정 구독자만 얻을 수 있도록 합니다.
    다음은 필터 메시지를 발표하는 예입니다. 이번에는 step 함수를 통해 본 컴퓨터로 발표됩니다.
    {
      "StartAt": "Publish motion-detected Event",
      "States": {
        "Publish motion-detected Event": {
          "Type": "Task",
          "Resource": "arn:aws:states:::sns:publish",
          "Parameters": {
            "TopicArn": "${MOTION_DETECTED_TOPIC_ARN}",
            "Message": {
              "eventType": "motion-detected",
              "data": {
                "cameraId.$": "$.cameraId",
                "boundingBox": {
                  "x.$": "$.coords.x",
                  "y.$": "$.coords.y",
                  "width.$": "$.coords.width",
                  "length.$": "$.coords.length",
                },
                "durationMs.$": "$.duration"
              }
            },
            "MessageAttributes": {
              "tenant": {
                "DataType": "String",
                "StringValue.$": "$.tenant"
              }
            }
          },
          "ResultPath": null,
          "Next": "Notified Subscribers Successfully"
        },
        "Notified Subscribers Successfully": {
          "Comment": "The motion-detected event was sent to all subscribers for the tenant.",
          "Type": "Succeed"
        }
      }
    }
    
    메시지는 기본적으로 같아 보이지만, 현재 우리는 MessageAttributes 속성과 임차인 정보를 추가했다.이는 SNS 실행message filtering을 알려주고 선택한 구독자에게만 보냅니다.
    물론 이 정보의 또 다른 차이점은 우리가 Step Function 를 사용하여 발표했다는 것이다.이것은 매우 좋다. 필요orchestration 상황에서 lambda를 전문적으로 구축하여 발표할 필요가 없기 때문에 절차 함수 정의에서 직접 완성할 수 있다.
    메시지에 전달된 값은 실행 상하문에서 정의되고 JSON Path 을 통해 접근합니다.

    구독 이벤트


    SNS를 통해 이벤트를 발표하는 방법을 알게 된 만큼 구독자를 설정하는 방법을 살펴보자.우리는 사람들이 그들의 API 단점을 우리 시스템에 추가하여 그들이 관심 있는 사건을 구독할 수 있기를 바란다.
    구독과 게시는 두 가지 절차가 필요하기 때문에 약간 다르다.
  • 청약 추가(미국)
  • 청약 확인(그들)
  • 구독 추가


    우리의 절반 임무는 코드를 작성하고 정확한 설정을 확보하는 것이다.다음은 노드를 사용하여 다세입자 응용 프로그램에 운동 검사 이벤트 구독을 추가하는 예입니다.js lambda 함수:
    function subscribeToMotionDetectedEvent = async (endpoint, tenant) => {
      const params = {
        Protocol: 'https',
        TopicArn: process.env.MOTION_DETECTED_TOPIC_ARN,
        Endpoint: endpoint,
        Attributes: {
          FilterPolicy: {
            tenant: [ tenant ]
          }
        }
      };
    
      const sns = new SNS();
      await sns.subscribe(params).promise();
    }
    
    복잡하거나 조건 논리가 필요한 경우 Filter Policy 에 많은 규칙을 추가할 수 있습니다.하지만 지금은 세입자 필터만 고집할 뿐이다.

    확인


    코드가 실행된 후, 우리가 구독하는 단점은 확인 링크가 있는 메시지를 받을 것이다.이는 엔드포인트가 POST 메시지를 수신할 수 있도록 하기 위한 것이지 죽은 링크에만 데이터를 보내는 것이 아니다.
    subscription has been confirmed 이전에는 엔드포인트에 이벤트를 게시하지 않습니다.이것은 구독자가 반드시 인코딩을 해서 확인해야 할 수도 있기 때문에 문서에서 이 점을 이해하도록 하십시오.
    일단 구독이 확인되면, 당신은 온라인에 접속합니다!이벤트는 사용자가 보낸 메시지FilterPolicyAttributes에 따라 구독자에게 발표됩니다.

    해봐!


    이벤트와 Webhook은 응용 프로그램의 건장하지만 통용되는 통합을 위한 간단한 방법이다.Amazon SNS는 입문하기 쉬운데, 왜 위의 코드 부분을 lambda나 step 함수에 추가하지 않습니까?
    CloudFormation을 사용하여 마이크로 서비스를 구축하고 배포하는 경우 (그렇지 않으면 그렇게 해야 함) 매우 간단한 주제를 추가합니다.
    MotionDetectedSNSTopic:
        Type: AWS::SNS::Topic
        Properties:
          TopicName: motion-detected
    
    현재 템플릿에 추가하여 배포하고 게시를 시작합니다!

    좋은 웹페이지 즐겨찾기