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:
- Administrador de dominio sin servidor para controlar las reglas de Route53 y las configuraciones de dominio personalizadas de API Gateway.
- Creador de certificados sin servidor para crear certificados en Amazon Certificate Manager y confirmar mediante el método DNS.
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 createRoute53Record
y autoDomain
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