Serverless Framework에서 Lambda + ALB 사용

소개



API Gateway를 이용한다면 functions에 기재할 뿐이었지만
ALB를 Lambda의 트리거로 하는 경우 별도 ALB를 작성할 필요가 있을 것 같았기 때문에 해 보았다

서비스 구성



ALB -> 람다

Lambda는 인수를 그대로 응답으로 반환하는 것만을 작성.
ALB는 2개의 패스로의 라우팅을 각각 같은 Lambda에, 그 이외를 404로 하는 것을 작성.

※사전에 준비한 것
- Lambda에 붙이는 IAM 롤
- ALB에 붙이는 VPC(서브넷 ID 2개와 보안 그룹 ID)

폴더 구성


.
├── handler.js
└── serverless.yml

Lambda 소스 코드



코드는 내용에 특별히 관련이 없으므로 별도로 무엇이든 가능합니다.

handler.js
module.exports.main = async (event) => {
    return response = {
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(event),
        statusCode: 200
    }
}


serverless.yml



API Gateway와 약간 쓰는 방법은 바뀌지만
단순히 ALB를 Lambda의 API로 사용하고 싶다면
ALB와 리스너를 resources로 작성
functions로 그것에 묶는 것만으로 좋은 것 같다.

serverless.yml
service: alb-lambda-example

provider:
  name: aws
  runtime: nodejs10.x
  region: ap-northeast-1

functions:
  echo:
    handler: handler.main
    role: arn:aws:iam::00000000000:role/iam_role # IAMロールのARN
    events:
      - alb:
          listenerArn: 
            Ref: exampleLoadBalancerListener
          priority: 2
          conditions:
            path: /hello
      - alb:
          listenerArn: 
            Ref: exampleLoadBalancerListener
          priority: 1
          conditions:
            path: /world

resources:
  Resources:
    exampleLoadBalancer:
      Type: AWS::ElasticLoadBalancingV2::LoadBalancer
      Properties:
        Name: alb-lambda-example-alb
        Scheme: internet-facing
        Subnets:
          - subnet-XXXXXXXXXXXXX # サブネットID
          - subnet-YYYYYYYYYYYYY # サブネットID
        SecurityGroups:
          - sg-ZZZZZZZZZZZZZZ # セキュリティグループID
    exampleLoadBalancerListener:
      Type: "AWS::ElasticLoadBalancingV2::Listener"
      Properties:
        DefaultActions:
          - Type: fixed-response
            FixedResponseConfig: 
              ContentType: text/html
              MessageBody: <h1>Not Found</h1>
              StatusCode: 404
        LoadBalancerArn: 
          Ref: exampleLoadBalancer
        Port: 80
        Protocol: HTTP

결과



AWS 콘솔의 ALB 할당 규칙





작성된 ALB의 DNS에 브라우저로 액세스하면 /hello/world 에서는 JSON이 응답되고 그 이외에서는 Not Found 페이지가 표시되었다.

트러블 슛



sls deploy는 성공하지만 Lambda는 ALB와 연결되지 않습니다.


serverless를 업데이트하면 치료할 수 있습니다.

좋은 웹페이지 즐겨찾기