Serverless (node.js)에서 자체 도메인 SSL을 적용하는 방법

11551 단어 serverlessAWSNode.js
마지막으로 쓴 기사 에서는 S3에 배치한 정적 컨텐츠를 SSL의 독자 도메인으로 공개하는 방법에 대해 비잊었습니다만,

이번에는 Serverless Framework를 사용하여
자신의 도메인을 적용하는 방법에 대해 알아보고 시도한 내용에 대해 잊지 마십시오.
전회와 같이, 도메인 취득 후 수년 계속 자고 있던 도메인 koshikawa.net로 검증했습니다.

목표


  • serverless로 배포하는 웹 사이트에 자체 도메인을 적용합니다.
  • 배포시 지정한 각 환경에 대해 하위 도메인을 변경합니다.
  • sls deploy --stage prd 그렇다면 koshikawa.net에 반영됩니다
  • sls deploy --stage dev 그렇다면 dev.koshikawa.net에 반영됩니다


  • 결과는 이런 느낌




    프로덕션 (koshikawa.net) prd와 콘텐츠는 동일
    프로덕션 (prd.koshikawa.net)
    개발 (dev.koshikawa.net)







    방법



  • serverless-domain-manager 을 사용하는 것만.

  • 참고 사이트



  • serverless.com - How to set up a custom domain name for Lambda & API Gateway with Serverless
  • Serverless 본가의 기사, 여기를 추적하면 기본적인 것은 할 수 있었습니다.


  • CircleCI 및 serverless를 사용하여 브랜치별로 Lambda/API Gateway 환경 구축
  • 환경 마다 배포처의 도메인을 변경하는 구체적인 설정예라든지 매우 참고가 되었습니다.


  • serverless.com - Deploy a REST API using Serverless, Express and Node.js
  • Serverless 본가의 aws-node.js에서 REST API 튜토리얼, serverless에서 WEB 앱을 만드는 방법을 기억하기 위해.


  • 사전에 해 두는 것


  • 개별 도메인을 Route53에서 영역 관리하고 ACM 인증서를 발급합니다.
  • S3에 deploymentBucket을 만들어 둔다.
  • 명령 실행할 사용자에게 필요한 권한을 부여합니다. (serverless-domain-manager의 README.md에 설명되어 있음)

  • 쓴 소스



    index.js
    'use strict';
    
    const serverless = require('serverless-http');
    const express = require('express');
    const app = express();
    
    app.get('/', function (req, res) {
        res.send('Hello, world! on Serverless Framework');
    });
    
    app.get('/goodbye', function (req, res) {
        res.send('Goodbye, world! on Serverless Framework');
    });
    
    module.exports.handler = serverless(app);
    

    serverless.yml



    serverless.yml
    # serverless.yml
    
    service: ${self:custom.name}
    
    plugins:
      - serverless-offline
      - serverless-domain-manager
    
    provider:
      name: aws
      region: ap-northeast-1
      runtime: nodejs8.10
      stage: ${opt:stage, 'dev'}
      deploymentBucket:
        name: ${self:custom.name}.${self:provider.region}.deploys
    
    custom:
      name: koshikawanet
      customDomain:
        domainName: '${self:provider.stage}.koshikawa.net'
        certificateName: '*.koshikawa.net'
        basePath: ''
        stage: ${self:provider.stage}
        createRoute53Record: true
    
    functions:
      hello:
        handler: index.handler
        events:
          - http: GET /
      goodbye:
        handler: index.handler
        events:
          - http: GET /goodbye
    

    deploy 전에 create_domain



    sls offline start에서 로컬로 동작을 확인할 수 있으면,sls create_domain 명령으로 다음을 수행합니다.
    · API Gateway에 맞춤 도메인 생성 및
    · Route53에 대해 생성된 CloudFront FQDN의 Alias를 붙이기

    개발 (--stage dev는 선택 사항)


    $ sls create_domain --stage dev
    ...
    Serverless: 'dev.koshikawa.net' was created/updated. New domains may take up to 40 minutes to be initialized.
    

    프로덕션


    $ sls create_domain --stage prd
    ...
    Serverless: 'prd.koshikawa.net' was created/updated. New domains may take up to 40 minutes to be initialized.
    

    ※ 수중의 환경에서는 반영 시간에 40분도 걸리지 않고 10분 정도로 반영되었습니다.
    serverless.com의 기사에도 10분~20분 정도라고 써 있습니다.

    1분 기다리지 않고 deploy를 실시했는데, 커스텀 도메인에 대해서 Base Path Mappings의 설정이 되지 않고,{"message":"Forbidden"} 가 반환되는 사건이 되어, 재작성을 강요당했기 때문에,
    여유있게 가자.

    deploy



    개발 (--stage dev는 선택 사항)


    $ sls deploy --stage dev
    ...
    Service Information
    service: koshikawanet
    stage: dev
    region: ap-northeast-1
    stack: koshikawanet-dev
    api keys:
      None
    endpoints:
      GET - https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
      GET - https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/goodbye
    functions:
      hello: koshikawanet-dev-hello
      goodbye: koshikawanet-dev-goodbye
    Serverless Domain Manager Summary
    Domain Name
      dev.koshikawa.net
    Distribution Domain Name
      xxxxxxx.cloudfront.net
    Serverless: Invoke aws:deploy:finalize
    

    이제 htps : //에서 v. 코시와. 네 t 에 배포할 수 있습니다.

    프로덕션


    $ sls deploy --stage prd
    ...
    Service Information
    service: koshikawanet
    stage: prd
    region: ap-northeast-1
    stack: koshikawanet-prd
    api keys:
      None
    endpoints:
      GET - https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prd
      GET - https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prd/goodbye
    functions:
      hello: koshikawanet-prd-hello
      goodbye: koshikawanet-prd-goodbye
    Serverless Domain Manager Summary
    Domain Name
      prd.koshikawa.net
    Distribution Domain Name
      xxxxxxx.cloudfront.net
    

    이제 htps : // prd. 코시와. 네 t 에 배포할 수 있습니다.

    프로덕션 사이트 koshikawa.net에 prd 환경의 API 매핑


    prd.koshikawa.net 는 프로덕션 사이트로서 도메인에 환경명이 들어가 있어 괄호 나쁘기 때문에,koshikawa.net 에 prd 와 같은 내용이 반영되도록(듯이) 설정합니다.
  • API Gateway 콘솔 화면에서 사용자 지정 도메인 koshikawa.net을 만듭니다.
  • Base Path Mappings 설정에서 prd 환경에 배포된 API를 지정합니다.
    심상:


  • 사용자 지정 도메인을 만든 후 CloudFront의 FQDN이 결정되므로 Route53 영역 설정 화면에서 koshikawa.net의 A 레코드로 CloudFront의 FQDN을 Alias로 설정합니다.
    API Gateway 콘솔에서 CloudFront의 FQDN 표시 예:


  • 참고 : 물론 명령으로 설정 가능



    API Gateway에서 지역별 API에 대한 맞춤 도메인 이름 설정

    base-path-mapping의 예:
    aws apigateway create-base-path-mapping \
        --domain-name 'koshikawa.net' \
        --base-path '' \
        --rest-api-id xxx \
        --stage 'prd'
    

    현장에서는 이상입니다.
    자고 있던 도메인을 키우는 방법에 대해서는 아직 검토중입니다.

    좋은 웹페이지 즐겨찾기