Framework (Serverless) + AWS: certificado y dominio

framework

Serverless Framework + AWS: creación automática de certificado y dominio para su aplicación

Esta es una guía que muestra cómo puede crear automáticamente un certificado SSL en Amazon Certificate Manager (ACM) y configurar un subdominio en Route 53 Hosted Zone utilizando Serverless Framework con algunos complementos maravillosos.


Antes de comenzar:

  • Necesita una cuenta de AWS;
  • Tener una Hosted Zone configurada en Route53 con algún nombre de dominio;
  • Tener un poco de conocimiento sobre el uso de Serverless Framework.

En primer lugar, debe saber que usaremos algunos complementos de Serverless Framework para facilitarnos la vida:

 

Nota: mostraré algunos scripts que usan NodeJS, pero Serverless Framework se puede usar en casi cualquier idioma (por no decir literalmente en cualquier lugar).

 


Con esto en mente, ¡adelante! Comience a instalar dependencias:

npm install serverless-domain-manager serverless-certificate-creator -— save-dev

Crear una sección de dominio personalizado

Normalmente separo los dominios para permitir la personalización de cada uno, sería así en mi pila:

https://gist.githubusercontent.com/tiagoboeing/bc6bf75dcec8a0e7d1dfe09b4d93b05d/raw/8fa2704a7d8bd27a14c9b353867e2bb516964f02/serverless-article-custom-domain-and-custom-certificate-domain-section.yml

Por supuesto, usted elige el nombre del certificado. Solo me gusta usar el mismo nombre del dominio para que sea más fácil ubicarlo en ACM.

Esta es la forma en que organizo mis aplicaciones, tome esto como un ejemplo para personalizar/iniciar.

Vea esta sección custom:

custom:
  # Amazon Certificate Manager
  customCertificate:
    # Route 53 Hosted Zone name
    # don't forget the dot on the end!
    hostedZoneNames: "tiagoboeing.com."

    # Here we get our certificate name inside custom.domain.STAGE.certificateName
    # STAGE will be automatically filled with the value from "provider > stage"
    certificateName: ${self:custom.domains.${self:provider.stage}.certificateName}

    region: ${self:provider.region}

  # Route53
  customDomain:
    # Get value from "domains" section using stage that is being deployed
    domainName: ${self:custom.domains.${self:provider.stage}.domainName}

    # Same case of certificaName inside customCertificate
    certificateName: ${self:custom.domains.${self:provider.stage}.certificateName}

    # Enable plugin to create an A Alias and AAAA Alias records in Route53
    # mapping the domainName to the generated distribution domain name.
    createRoute53Record: true

    # Enable plugin to autorun create_domain/delete_domain as part of sls deploy/remove
    autoDomain: true

Desplegar

Siga los siguientes consejos y trucos:

Crear certificado

Para crear el certificado en ACM ejecute:

certificado de creación sin servidor

# o

certificado de creación sin servidor npx

Cree el certificado en la etapa de implementación, puede cambiar la etapa usando --stage prod o STAGE=prod env.

Crear dominio – simplemente ejecutar

To create domain on Route 53, use:

serverless create_domain

# or

npx serverless create_domain

Tenga en cuenta que createRoute53RecordautoDomain se habilitaron en serverless.yml, una  serverless deploy simple comenzará automáticamente en este paso.


Para implementar en otra etapa (no en la predeterminada: dev), debe usar la opción --stage. Como ejemplo por primera vez puedes usar:

# First deploy PROD stage serverless create-cert --stage=prodserverless deploy --stage=prod

Es posible generar manualmente un dominio usando serverless-domain-manager, puede hacerlo usando el comando serverless create_domain,  esto no es necesario si tiene habilitado el indicador autoDomain (como se mencionó anteriormente).

Pila completa

Vea la pila Serverless completa a continuación.

service: sls-my-app

plugins:
  - serverless-domain-manager
  - serverless-certificate-creator
  
provider:
  name: aws
  runtime: nodejs14.x
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'us-east-1'}
  apiGateway:
    shouldStartNameWithService: true
  timeout: 5

  # passing base domain name and stage to our functions
  environment:
    DOMAIN: ${self:custom.customDomain.domainName}
    STAGE: ${self:provider.stage}

functions:
  authenticate:
    handler: src/functions/hello.handler
    description: Return a hello world
    timeout: 3
    events:
      - http:
          method: GET
          path: /
          cors: true

custom:
  domains:
    prod:
      domainName: api.tiagoboeing.com
      certificateName: api.tiagoboeing.com
    dev:
      domainName: api-dev.tiagoboeing.com
      certificateName: api-dev.tiagoboeing.com

  # Amazon Certificate Manager
  customCertificate:
    hostedZoneNames: "tiagoboeing.com." # don't forget the dot on the end - is required by Route53
    certificateName: ${self:custom.domains.dev.certificateName}
    region: ${self:provider.region}

  # Route53
  customDomain:
    domainName: ${self:custom.domains.${self:provider.stage}.domainName}
    certificateName: ${self:custom.domains.dev.certificateName}
    createRoute53Record: true
    autoDomain: true

Recent Post