Administro una API de REST para una aplicación sin servidor y quiero ampliar esta configuración con una API de WebSockets en la misma región. Todo debe manejarse con el mismo certificado, pero diferentes subdominios.
Al principio creé un nuevo dominio personalizado con sls create_domain --stage=... . Luego traté de agregarlo a la nueva pila de WebSockets, pero terminé con este error:
Error: no se pudieron encontrar los recursos de CloudFormation para...
Encontré en Github que esto parece no ser compatible con CloudFormation en este momento, por lo que Serverless no lo admite.
Así que traté de adjuntar mi escenario al nombre de dominio personalizado manualmente en la interfaz de usuario:
La combinación de API REST y API HTTP en el mismo nombre de dominio solo se puede lograr a través de la interfaz DomainName V2 de API Gateway. Actualmente, las API de WebSocket solo se pueden adjuntar a un nombre de dominio con otras API de WebSocket. Esto también debe ocurrir a través de la interfaz DomainName V2 de API Gateway.
Surge más confusión, ya que ni siquiera es el mismo nombre de dominio en este caso. El nuevo nombre de dominio era sockets.<DOMAIN>.com y el existente era api.<DOMAIN>.com . ¿O subdominios diferentes están cayendo en 'mismo nombre de dominio'?
Sin embargo, traté de crear el dominio personalizado nuevamente a través de la CLI apigatewayv2:
aws apigatewayv2 create-domain-name --domain-name <DOMAIN> --domain-name-configurations file://domain-configuration.json --region eu-west-1configuración-dominio.json:
[ { "ApiGatewayDomainName": "<DOMAIN>", "CertificateArn": "arn:aws:acm:us-east-1:<ACCOUNT_ID>:certificate/<CERT_ID>", "CertificateName": "<DOMAIN>", "DomainNameStatus": "AVAILABLE", "EndpointType": "EDGE", "SecurityPolicy": "TLS_1_2" }]
Pero esto da como resultado el siguiente error:
Se produjo un error (BadRequestException) al llamar a la operación CreateDomainName: ARN de certificado no válido: arn:aws:acm:us-east-1:924441585974:certificate/b88f0a3f-1393-4a16-a876-9830852b5207. El certificado debe estar en 'eu-west-1'.
Mi estado actual era que API Gateway solo permite que los certificados personalizados se ubiquen en us-east-1, por lo que este error me confunde aún más.
Resumen : estoy completamente atascado en cómo obtener un nombre de dominio personalizado adjunto a mi etapa API de WebSocket. ¡Estoy feliz por cada pista en la dirección correcta!
Encontré una solución con una plantilla de recursos de CloudFormation personalizada:
resources: Resources: WebSocketDomainName: Type: AWS::ApiGatewayV2::DomainName Properties: DomainName: <domain-name> DomainNameConfigurations: - EndpointType: 'REGIONAL' CertificateArn: <cert-arn> WebSocketMapping: Type: AWS::ApiGatewayV2::ApiMapping Properties: ApiId: <api-id> DomainName: !Ref WebSocketDomainName Stage: <stage-name> DNSRecord: Type: AWS::Route53::RecordSet Properties: HostedZoneName: <hosted-zone-name>. TTL: '900' ResourceRecords: - !GetAtt [ WebSocketDomainName, RegionalDomainName ] Name: <domain-name> Type: CNAMEEditar : ¡Ahora trabajando conserverless-domain-manager ! 🎉
custom: customDomain: rest: domainName: rest.serverless.foo.com stage: ci basePath: api certificateName: '*.foo.com' createRoute53Record: true endpointType: 'regional' securityPolicy: tls_1_2 http: domainName: http.serverless.foo.com stage: ci basePath: api certificateName: '*.foo.com' createRoute53Record: true endpointType: 'regional' securityPolicy: tls_1_2 websocket: domainName: ws.serverless.foo.com stage: ci basePath: api certificateName: '*.foo.com' createRoute53Record: true endpointType: 'regional' securityPolicy: tls_1_2¡Gracias @tpschmidt por la útil respuesta! Solo para agregar, en caso de que desee un BasePathMapping para su dominio websocket, agregue ApiMappingKey a la formación en la nube proporcionada anteriormente. P.ej:
WebSocketMapping: Type: AWS::ApiGatewayV2::ApiMapping Properties: ApiId: <api-id> DomainName: !Ref WebSocketDomainName Stage: <stage-name> ApiMappingKey: <stage-name> #(eg prod)Tuve que hacer un par de ajustes menores para tener un Lambda en una VPC privada con soporte para WebSockets y un dominio personalizado.
CertificateArn debe ser de ACM y no puede ser un certificado cargado en IAM. WebSocketDomainName: Type: AWS::ApiGatewayV2::DomainName Properties: DomainName: !Ref DomainName DomainNameConfigurations: - EndpointType: REGIONAL CertificateArn: <your-certificate-arn> # This maps /staging or /prod to just the domain name WebSocketMapping: Type: AWS::ApiGatewayV2::ApiMapping Properties: ApiId: <your-api-id> DomainName: !Ref WebSocketDomainName Stage: <your-stage> Route53DNS: Type: AWS::Route53::RecordSetGroup Properties: HostedZoneName: !Ref Route53HostedZone RecordSets: - Name: !Ref DomainName Type: A AliasTarget: HostedZoneId: ZLY8HYME6SFDD # This means eu-west-1 ApiGateWay DNSName: !GetAtt [WebSocketDomainName, RegionalDomainName] Para su comprobación HostedZoneId : https://docs.aws.amazon.com/general/latest/gr/apigateway.html