Terraform에서 Serverless Framework로 만든 API 참조

소개



개발에 있어서, 인프라는 Terraform, 백엔드는 Serverless Framework로 만들고 싶었기 때문에,
각각을 어떻게 정의하면 좋은 느낌에 참조할 수 있는지 검토했으므로 비망 메모✍️

사고방식


  • CloudFront -> API Gateway -> Lambda에서 백엔드 처리를 원합니다.
  • /api 부하에 온 요청을 API Gateway에 흘린다

  • CloudFront -> S3에서 정적 콘텐츠를 전달하고 싶습니다.
  • 위와 일치하지 않은 요청을 S3에 전달합니다.

  • 인프라와 백엔드는 별도로 관리하고 싶습니다.
  • CloudFrontl, S3는 인프라 (Terraform)
  • API Gateway와 Lambda는 백엔드(Serverless Framework)


  • 방법



    Serverless Framework는 sls deploy 그러면 뒤에서 CloudFormation 스택을 만들므로,
    Terraform에서 aws_cloudformation_stack로 참조

    serverless.yml(발췌)
    service:
      name: example-backend
    
    provider:
      name: aws
      runtime: nodejs10.x
      stage: ${opt:stage, self:custom.defaultStage}
      region: ap-northeast-1
      # リージョナルのAPI Gatewayを作成
      endpointType: REGIONAL
    
      # Lambdaで使うRoleはこちらで作る。ActionやResourceは適宜設定
      iamRoleStatements:
        - Effect: Allow
          Action:
            - secretsmanager:GetSecretValue
          Resource: "*"
    
    functions:
      example:
        handler: src/example.lambdaHandler
        # これだけでLambda Proxy統合のAPI Gatewayができる
        events:
          - http: POST api/example
    
    custom:
      defaultStage: prod
    
    ServiceEndpoint라는 키 값을 사용할 수 있습니다.



    Terraform은 다음과 같은 느낌 (거의 생략이지만 ...)
    실제로 스택 이름은 var로 주입하는 등

    terraform.tf(발췌)
    data "aws_cloudformation_stack" "backend" {
      # これでCloudFormationの出力が参照できる
      name = "example-backend-prod"
    }
    
    resource "aws_cloudfront_distribution" "infra" {
    
      # 省略
    
      # API Gatewayのオリジンを作る
      origin {
        # ServiceEndpointから xxx.execute-api.ap-northeast-1.amazonaws.com と prod を抜き出す
        domain_name = "${split("/", data.aws_cloudformation_stack.backend.outputs["ServiceEndpoint"])[2]}"
        origin_path = "/${split("/", data.aws_cloudformation_stack.backend.outputs["ServiceEndpoint"])[3]}"
    
        # 省略
      }
    
      # S3のオリジンを作る
      origin {
        # 省略
      }
    
      # API Gatewayの定義 
      ordered_cache_behavior {
        # Serverless Frameworkで指定したのと合わせる
        path_pattern     = "/api/*"
    
        # 省略
      }
    
      # こっちでS3を定義。/api/*にマッチしないリクエストを扱う
      default_cache_behavior {
        # 省略
      }
    
    }
    

    좋은 웹페이지 즐겨찾기