Serverless Framework에서 자신의 API URL을 얻고 싶습니다.

소개



Serverless Framework에서 API Gateway를 사용할 때
사활 감시나 어떤 목적으로
내부적으로 API를 호출하고 싶은 경우가 있을까 생각합니다.

그냥 배포 한 후 URL을 확인하십시오.
Lambda의 환경 변수에 ... 등은 조금 번거롭기 때문에
serverless.yml 내에서만 설정할 수 없는지 시도했습니다.

custom으로 URL 생성



주제 부분은 API Gateway에서 생성되는 URL을 문자로 연결합니다.
이제 API Gateway URL을 생성할 수 있습니다.
custom:
  region: ap-northeast-1
  stage: ${opt:stage,"default"}
  my_url:
    {
      "Fn::Join":
        [
          "",
          [
            "https://",
            { "Ref": "ApiGatewayRestApi" },
            ".execute-api.${self:custom.region}.amazonaws.com/${self:custom.stage}/",
          ],
        ],
    }


custom으로 만든 URL을 Lambda의 environment로 설정



절각이므로 실제로 API를 두드려 보겠습니다.
※언어는 node를 전제로 기술하고 있습니다.

API를 두드린다 shikatsukannshishikatsukannshi 에 두드리는 tergetA , tergetB 를 만듭니다.
shikatsukannshi 가 30분에 한 번 일어나서
느낌으로 만들고 있습니다.
functions:
  shikatsukannshi:
    handler: shikatu/handler.main
    environment:
      MY_URL: ${self:custom.my_url}
    events:
      - schedule: rate(30 minutes)
  tergetA:
    handler: api/handler.main
    environment:
      MY_NAME: A
    events:
      - http:
          path: target/a
          method: get
  tergetB:
    handler: api/handler.main
    environment:
      MY_NAME: B
    events:
      - http:
          path: target/b
          method: get

이제 tergetA Lambda 환경 변수 MY_URL에
자신과 연결하는 API Gateway URL을 입력해야 합니다.

serverless.yml 전체로서는 다음과 같은 것을 작성했습니다.
service: qiita-sample

custom:
  region: ap-northeast-1
  stage: ${opt:stage,"default"}
  my_url:
    {
      "Fn::Join":
        [
          "",
          [
            "https://",
            { "Ref": "ApiGatewayRestApi" },
            ".execute-api.${self:custom.region}.amazonaws.com/${self:custom.stage}/",
          ],
        ],
    }

provider:
  name: aws
  runtime: nodejs12.x
  memorySize: 128
  region: ${self:custom.region}

functions:
  shikatsukannshi:
    handler: shikatu/handler.main
    environment:
      MY_URL: ${self:custom.my_url}
    events:
      - schedule: rate(30 minutes)
  tergetA:
    handler: api/handler.main
    environment:
      MY_NAME: A
    events:
      - http:
          path: target/a
          method: get
  tergetB:
    handler: api/handler.main
    environment:
      MY_NAME: B
    events:
      - http:
          path: target/b
          method: get


api 및 모니터링 용 Lambda 만들기



API에서
환경 변수에서 자신의 이름을 검색하고 반환하는 API

api/handler.js
module.exports.main = async (event) => {
    return {
        body: 'Qiitaサンプル:' + process.env['MY_NAME'],
        statusCode: 200
    }
}

그리고 감시용 람다
이쪽도 요청을 던져 결과를 로그에 낼 뿐의 것

shikatu/handler.js
module.exports.main = (event) => {
    const request = require("request");
    const url = process.env['MY_URL']

    // 監視A
    request.get({
        url: url + 'target/a'
    }, function (error, response, body) {
        console.log(body);
    });

    // 監視B
    request.get({
        url: url + 'target/b'
    }, function (error, response, body) {
        console.log(body);
    });
}

결과 확인



배포 및 로그 확인



안전한 API에 액세스 할 수있는 것 같습니다.

좋은 웹페이지 즐겨찾기