SNS 메시지를 통해 AWS Lambda 트리거

12217 단어 awsserverlesstesting
만약 나처럼 이벤트 구동 프로그래밍을 좋아한다면, 너는 계속 읽고 싶을 것이다.오늘 우리는 AWS Lambda메시지 트리거AWS SNS 함수를 살펴보자.나는 이미 서버 없는 구조와 AWS에 관한 재미있는 화제를 토론했지만, 아직 이런 화제는 없다.파내서 준비해라.가자.

TL;박사 01 명

  • 우리는 무엇을 짓고 있습니까?
  • AWS SNS란 무엇입니까?
  • 사용Serverless Framework으로 API 구축
  • API 배포AWS Lambda
  • 사용Dashbird 테스트 API
  • **참고: 최종 결과를 즉시 확인하려면 모두code from this tutorial is already on GitHub 옵션을 사용하십시오.

    우리는 무엇을 짓고 있습니까?


    응용 프로그램을 만드는 데 필요한 인프라 구성 요소만 주목할 것입니다.코드 자체는 무작위 복잡한 계산 행위를 시뮬레이션할 것이다.나는 그에게 전달되는 숫자의 곱셈을 계산하는 귀속 함수를 선택했다.이것은 매우 좋은 도표이다. 왜냐하면 도표는 당연히 매우 좋기 때문이다.
    init 함수는 유일하게 공개된 함수로 API Gateway에 연결된다.이것은 number 매개 변수만 받아들일 수 있으며, 성공하면 이 매개 변수를 검증하고 SNS 테마를 발표하여 number 값을 보냅니다.
    SNS 주제는 두 번째 함수calculate를 트리거합니다.이 기능은 계산을 실행하고 결과를 콘솔에 로그아웃합니다.이것은 데이터 처리, 이미지 처리, 기계 학습 계산 등 복잡한 계산 배경 작업을 시뮬레이션했다.calculate 기능이 실패하면 데드 큐 SNS 주제에 메시지가 표시되고 error 기능이 트리거됩니다.
    비동기적으로 호출되는 모든 함수는 실패할 때 두 번 다시 시도됩니다.오류 로그 탱크로 사신 대기열을 사용하는 것은 현명한 용례이다.
    지금 당신은 왜 SNS가 Lambda's invoke API로 첫 번째 lambda 함수의 두 번째 lambda 함수를 호출하지 않고 이렇게 복잡한지 알고 싶습니까?
    우선, 이것은 비동기적인 업무 흐름의 거대한 반모드이다. 우리는 바로 이렇다.그렇지 않으면, 두 번째 lambda 함수로부터 즉시 응답을 받아야 합니다.또 다른 문제는 곧 람다의 합병 제한에 도달할 수 있다는 것이다.그것은 호출 분실과 데이터 분실을 초래할 수 있다.SNS 등을 통해 게시/구독 서비스나 SQS 등 대기열을 통해 데이터를 보내면 데이터 무결성이 확보된다.
    이제 의미 있어요?자기야, 우리 SNS 얘기 좀 더 하자.

    AWS SNS란 무엇입니까?


    우리가 인코딩을 시작하기 전에, 우리는 기본 지식을 이해해야 한다.우리는 AWS Lambda가 무엇인지 알고 있지만 SNS는?AWS 문서는 매우 간단합니다.

    Amazon Simple Notification Service (SNS) is a flexible, fully managed pub/sub messaging and mobile notifications service for coordinating the delivery of messages to subscribing endpoints and clients.

    -- AWS Docs


    영어에서는 게시자/구독자를 바탕으로 서비스 간에 알림을 보내는 방식이라는 것을 의미한다.한 서비스가 특정한 주제에 대한 데이터를 발표하고 주제를 따라 보냅니다.그리고 SNS는 이를 특정 주제의 모든 구독자에게 전달한다.이곳의 중점은 주제이다. 왜 아래로 내려가야 하는지 보게 될 것이다.

    서버 프레임워크가 없는 API 구축


    여느 때와 마찬가지로, 첫 번째 일은 프로젝트를 설정하고 의존항을 설치하는 것이다.

    1. 서버 프레임워크 없음 설치


    나의 서버 없는 응용 프로그램 개발과 배치 도구는 Serverless Framework이다.계속 설치합시다.
    $ npm i -g serverless
    
    
    주의: 만약 리눅스를 사용한다면, 이 명령을 sudo 형식으로 실행해야 할 수도 있습니다.
    기계에 전역적으로 설치되면 터미널의 어느 곳에서든 명령을 사용할 수 있습니다.그러나 AWS 계정과 통신하려면 IAM 사용자를 구성해야 합니다.건너뛰기here for the explanation를 건너뛰고 제공된 키로 다음 명령을 실행합니다.
    $ serverless config credentials\
        --provider aws\
        --key xxxxxxxxxxxxxx\
        --secret xxxxxxxxxxxxxx
    
    
    현재, 서버 설치 프로그램이 없으면 터미널 명령을 실행할 때 어떤 계정에 연결해야 하는지 알 수 있습니다.우리 뛰어들어 그것의 실제 행동을 좀 봅시다.

    2. 서비스 만들기


    서버 없는 응용 프로그램 서비스를 저장할 새 디렉터리를 만듭니다.거기서 터미널을 시작합니다.이제 새 서비스를 만들 수 있습니다.
    서비스는 무엇입니까?이것은 마치 하나의 항목과 같다.여기서 AWS Lambda 함수를 정의하고 이벤트를 트리거하며 오늘 추가한 SNS를 포함하여 필요한 AWS 인프라 자원을 설정할 수 있습니다. 이 모든 것은 서버리스라는 파일에 있습니다.yml.
    터미널 형식으로 돌아가기:
    $ serverless create --template aws-nodejs\
        --path lambda-sns-dlq-error-handling
    
    
    create 명령은 새 서비스를 만듭니다.정말 깜짝이야!우리는 또한 함수를 위해 실행할 때를 선택한다.이것을 템플릿이라고 합니다.수신aws-nodejs은 런타임을 Node로 설정합니다.js.이것이 바로 우리가 원하는 것이다.이 경로는 이 서비스에 대한 폴더를 만들 것입니다.

    3. 코드 편집기를 사용하여 서비스 디렉터리 탐색


    당신이 가장 좋아하는 코드 편집기로 lambda sns dlq 오류 처리 폴더를 엽니다.안에 세 개의 파일이 있어야 하는데, 지금은 서버가 없는 파일만 보고 있습니다.yml.이것은 이 서비스의 모든 설정 설정을 포함합니다.여기에서 일반적인 설정 설정과 모든 기능 설정을 지정할 수 있습니다.서버가 없어졌어요.yml은 템플릿 코드와 주석으로 가득 차게 됩니다.마음대로 삭제하고 붙여넣으세요.
    service: lambda-sns-dlq-error-handling
    
    plugins:
      - serverless-pseudo-parameters
    
    provider:
      name: aws
      runtime: nodejs8.10
      stage: dev
      region: eu-central-1
      memorySize: 128
      environment:
        accountId: '#{AWS::AccountId}'
        region: '#{AWS::Region}'
      iamRoleStatements:
        - Effect: "Allow"
          Resource: "*"
          Action:
            - "sns:*"
    
    functions:
      init:
        handler: init.handler
        events:
          - http:
              path: init
              method: post
              cors: true
      calculate:
        handler: calculate.handler
        events:
          - sns: calculate-topic # created immediately
        onError: arn:aws:sns:#{AWS::Region}:#{AWS::AccountId}:dlq-topic
      error:
        handler: error.handler
        events:
          - sns: dlq-topic # created immediately
    
    
    여기서 무슨 일이 일어났는지 분석해 봅시다.functions 섹션을 참조하십시오.여기에는 세 가지 기능이 있다.위에서 아래로 각각 init,calculateerror이다.init 함수는 간단한 HTTP 요청으로 트리거되며 API 게이트웨이를 통해 호출됩니다.우리가 잘 아는 분야.
    그러나 calculateerror 기능은 SNS 주제에 의해 촉발되었다.이것은 init 함수에 논리가 있어 정보를 calculate-topic라는 주제에 발표하고 calculate 함수는 같은 주제를 구독한다는 것을 의미한다.
    다음에 error 함수는 구독dlq-topic을 하고 calculate 함수는 실패할 때 이 테마에 메시지를 발표합니다. onError 속성과 같습니다.지금 이 물건들은 일리가 있는 거지, 그렇지?
    당신의 기능에 SNS 테마를 이벤트로 추가하면 서비스가 배치되면 자원이 자동으로 만들어진다는 것을 기억하세요.
    또한 iamRoleStatements를 보면 우리의 함수가 터치할 수 있는 권한을 지정하고 SNS 테마에 호출된다.serverless-pseudo-parameters 플러그인은 클라우드 포메이션 문법 인용AccountIdRegion을 사용하여 모든 자원에서 SNS ARN의 일치성을 유지하기 쉽다.

    4. 종속성 설치


    다행히도 이 부분의 내용은 매우 짧다.패키지를 하나만 설치하면 됩니다.우선, npm를 초기화한 다음에 설치할 수 있다serverless-pseudo-parameters.
    $ npm init -y && npm i serverless-pseudo-parameters
    
    
    그럼 됐어.

    5. 비즈니스 논리 작성


    모든 요소를 고려하면 배치 과정은 상당히 간단하다.우리가 지금 써야 할 코드는 마찬가지로 간단하다.별거 아니야, 실망시켜서 미안해.
    간단함을 유지하기 위해 이 세 함수를 단독 파일에 저장합시다.우선 init를 만듭니다.js 파일과 이 코드 세그먼트를 에 붙여넣습니다.
    // init.js
    const aws = require('aws-sdk')
    const sns = new aws.SNS({ region: 'eu-central-1' })
    
    function generateResponse (code, payload) {
      console.log(payload)
      return {
        statusCode: code,
        body: JSON.stringify(payload)
      }
    }
    function generateError (code, err) {
      console.error(err)
      return generateResponse(code, {
        message: err.message
      })
    }
    async function publishSnsTopic (data) {
      const params = {
        Message: JSON.stringify(data),
        TopicArn: `arn:aws:sns:${process.env.region}:${process.env.accountId}:calculate-topic`
      }
      return sns.publish(params).promise()
    }
    
    module.exports.handler = async (event) => {
      const data = JSON.parse(event.body)
      if (typeof data.number !== 'number') {
        return generateError(400, new Error('Invalid number.'))
      }
    
      try {
        const metadata = await publishSnsTopic(data)
        return generateResponse(200, {
          message: 'Successfully added the calculation.',
          data: metadata
        })
      } catch (err) {
        return generateError(500, new Error('Couldn\'t add the calculation due to an internal error.'))
      }
    }
    
    
    우리는 몇 개의 조수 함수와 밑에 내보낸 lambda 함수가 있다.이게 어떻게 된 일입니까?lambda는 입력을 검증하고 일부 데이터를 calculate-topic SNS 테마에 발표합니다.이것이 바로 이 함수가 한 모든 것이다.calculate-topic SNS 테마는 calculatelambda 함수를 트리거합니다.이제 보충해 봅시다.
    파일을 만들고calculate라고 이름을 붙입니다.js.이 부분을 붙여라.
    // calculate.js
    module.exports.handler = async (event) => {
      const { number } = JSON.parse(event.Records[0].Sns.Message)
      const factorial = (x) => x === 0 ? 1 : x * factorial(x - 1)
      const result = factorial(number)
    
      console.log(`The factorial of ${number} is ${result}.`)
      return result
    }
    
    
    보시다시피 이것은 단지 간단한 곱셈 계산일 뿐이며, 귀속 함수로 실현된다.init 함수에서 SNS 주제에 게시된 숫자의 계승을 계산합니다.
    여기서 주의해야 할 점은 calculate 함수가 모두 세 번 실패하면, 서버리스에서 사용하는 onError 속성이 지정한 사신 대기열 SNS 테마에 메시지를 발표할 것이다.yml 파일.사신 대기열은 다음에 error 함수를 터치합니다.이제 오류를 CloudWatch에서 로그아웃할 수 있도록 만듭니다.오류가 발생했습니다.js 파일을 만들고 이 줄을 에 붙여넣습니다.
    // error.js
    module.exports.handler = async (event) => {
      console.error(event)
    }
    
    
    지금, 이 정도면 된다.그러나 이상적인 경우, 현재 발생하고 있는 모든 것에 대한 상세한 정보를 포함하는 구조화된 로그 기록이 있어야 합니다.이것은 다른 문장의 주제다.

    AWS Lambda에 API 배포


    간단한 부분이 왔다.API를 배포하려면 명령 하나만 실행하면 됩니다.$ serverless deploy\
    ![lambda deploy](https://dashbird.io/wp-content/uploads/2018/08/deploy.png)
    단점이 컨트롤러에 기록된 것을 볼 수 있습니다.여기가 네가 요청을 보낸 곳이다.

    Dashbird를 사용하여 API 테스트


    API를 테스트하는 가장 간단한 방법은 CURL을 사용하는 것입니다.간단한 CURL 명령을 만들고 끝점에 JSON 로드를 보냅니다.
    $ curl -H "Content-Type: application/json"\
      -d '{"number":1000}'\
      https://<id>.execute-api.eu-central-1.amazonaws.com/dev/init
    
    
    모든 것이 정상적이면 계산 결과가 클라우드 워치에 기록됩니다.만약 그렇지 않다면, 너는 운이 나빠질 것이다.이 경우, 나는 발생하는 일을 디버깅하기 위해 기본적으로 Dashbird 를 사용한다.free and doesn't require a credit card로 설정합니다.
    몇 개의 다른 값으로 단점을 몇 번 클릭한 후 결과는 다음과 같다.init 예상대로 작동합니다.

    그러나 진정으로 우리를 흥미롭게 하는 것은 calculate 함수다.다음은 그것이 성공할 때의 모습이다.

    실패할 때 충돌 로그를 지정하고 오류 로그를 표시합니다.

    두 번 다시 시도한 후, 사신 대기열에 메시지를 보내고 error 함수를 터치합니다.

    잘 됐다!우리는 이미 모든 다른 장면을 테스트했다.이것이 일을 좀 분명하게 할 수 있기를 바란다.

    마무리


    그게 다야.Lambda를 위한 SNS 트리거 작성과 함께 실패한 호출 중 오류를 포착하기 위한 데드 큐를 구현했습니다.서버less를 사용하여 각종 간헐 계산을 하는 것은 효과적인 용례로 미래에 갈수록 유행할 것이다.
    너는 서버를 걱정할 필요가 없다. 너는 그것의 운행 시간을 위해 비용을 지불하기만 하면 된다.코드를 배치하기만 하면 안심할 수 있다.만약 어떤 물건이 고장나면, 당신은 Dashbird 누군가가 뒤에서 당신을 감시하고 있으며, 만약 무엇이 잘못되면, 게으름을 피우거나 이메일로 당신을 일깨워 줄 것이다.너는 그것만 사랑해!

    코드를 보고 싶으면 여기GitHub repo입니다.SNS 메시지가 Lambda 함수를 트리거해야 하는 경우 사용자가 직접 사용할 수 있는 시작 프로그램으로 사용할 수 있습니다.만약 당신이 그것을 좋아한다면, 더 많은 사람들이 GitHub에서 그것을 보게 하려면, 그것에 별을 하나 주어라.

    좋은 웹페이지 즐겨찾기