Serverless Framework@AWS에서 lambda를 정기적으로 시작하는 lambda 만들기

어떤 이유로 Lambda에서 다른 Lambda를 부르고 싶을 수도 있습니다.
예를 들어, 람다의 콜드 스타트 ​​비용을 최대한 지불하고 싶지 않을 때, 정기적으로 그 람다를 발화시키는 것이 하나의 패턴으로 소개되는 경우가있는 것 같습니다.


슬라이드: htps //w w. s에서 멋지다. 네 t / 케이스 케 69 / 츠네 우 푸아 ws-mb

그러므로 이것을 Serverless Framework로 해 보겠습니다.
아마도 이것을하는 사람은 많이 있다고 생각합니다. ↓의 링크처의 기사가 바로 이번의 예 그대로입니다만, Lambda의 이름을 리터럴로 묻는 근처가 확실히 오지 않았기 때문에, Qiita에 재작성해 보았습니다.

할 일



간단합니다.
  • 두 개의 Lambda를 준비하고, 한쪽을 schedule 이벤트로 발화하도록 한다
  • 발화 된 람다는 다른 람다를 부른다

  • Lambda 구현



    이번에는 호출하는 쪽이라는 두 가지 함수를 동일한 JavaScript 모듈에 넣습니다. schedule로 발화하는 Lambda로부터, 불리는 Lambda의 이름을 아는 방법입니다만, 환경 변수 CRON_TARGET_NAME로 건네주기로 합니다.
    const AWS = require("aws-sdk");
    const lambda = new AWS.Lambda();
    
    module.exports.hello = (_event, _context) => {
      console.log("hello");
    };
    
    module.exports.cron = (_event, _context) => {
      const params = {
        FunctionName: process.env.CRON_TARGET_NAME,
        InvocationType: "Event",
      };
      lambda.invoke(params, (err, data) => {
        console.log(err, data);
      });
    };
    

    serverless.yml



    나머지는 구성 파일 serverless.yml을 씁니다.
    service: schedule-test
    
    provider:
      name: aws
      runtime: nodejs8.10
      region: ap-northeast-1
      memorySize: 128
    
      iamRoleStatements:
        - Effect: Allow
          Action:
            - lambda:InvokeFunction
          Resource:
            - "*"
    
    functions:
      hello:
        handler: handler.hello
        name: ${self:provider.stage}-hello-function
      cron:
        handler: handler.cron
        environment:
          CRON_TARGET_NAME: ${self:functions.hello.name}
        events:
          - schedule: rate(5 minutes)
    

    Lambda를 시작하는 데 필요한 두 가지가 있습니다.
  • 적절한 권한 (functions.cron을 실행하는 사용자가 lambda:InvokeFunction를 허용 함)
  • Lambda 함수의 이름

  • AWS 문서에 따르면 ARN 대신 함수 이름으로 Lambda를 시작하기에 충분합니다


  • 이 시동 대상인 function.hello AWS의 이름은 functions.hello.name에 지정할 수 있습니다. 이름을 디폴트가 아닌 명시적으로 지정해 두는 것으로, 다른 개소에서는 ${self:functions.hello.name} 로 참조할 수 있게 되기 (위해)때문에, cron 의 환경 변수 CRON_TARGET_NAME 에 이름을 건네줄 수 있게 되어 있습니다 .

    IAM에 대해서는 iamRoleStatements를 작성하여 Lambda를 시작할 수 있는 권한을 더했습니다.

    하지 않는 것


  • iamRoleStatementsResource*보다 좁은 것이 좋을지도

  • 두 개의 Lambda 함수는 동기화되어야 할 것 같으므로 InvocationType: "Event"가 더 적합 할 수 있습니다.
  • (2018/12/15 덧붙여) async로 해 두는 것이 편리한 것이라는 조언을 받았으므로 샘플을 수정했습니다


  • 참고 링크


  • htps : // / 렌 s 테와 rt. 메/2017/10/02/세 rゔぇrぇs-f 라메를 rk-ぁmb다
  • htps : // / r ゔ ぇ r ぇ s. 이 m / f 라메를 rk / 두 cs / p 로즈로 rs / 아 ws / 구이 /
  • 좋은 웹페이지 즐겨찾기