amplify-education / serverless-domain-manager

Serverless plugin for managing custom domains with API Gateways.
MIT License
941 stars 232 forks source link

Error: V2 - Unable to update base path mapping for '...': Invalid stage identifier specified #589

Closed jsw closed 1 year ago

jsw commented 1 year ago

Community Note

Bug Report

Error Description After upgrading from 7.0.4 to 7.1.0 I get the following output

Command Run

npx sls deploy --stage dev

Console Output


Deploying foo to stage dev (us-west-2)
Warning: Function (api) timeout setting (30) may not provide enough room to process an HTTP API request (of which timeout is limited to 30s). This may introduce a situation where endpoint times out for a successful lambda invocation.

× Stack foo failed to deploy (252s)
Environment: linux, node 18.16.1, framework 3.33.0 (local), plugin 6.2.3, SDK 4.3.2
Credentials: Local, environment variables
Docs:        docs.serverless.com
Support:     forum.serverless.com
Bugs:        github.com/serverless/serverless/issues

Error:
Error: V2 - Unable to update base path mapping for 'dev.example.com':
Invalid stage identifier specified
    at APIGatewayV2Wrapper.<anonymous> (/home/runner/work/.../node_modules/serverless-domain-manager/dist/src/aws/api-gateway-v2-wrapper.js:159:23)
    at Generator.throw (<anonymous>)
    at rejected (/home/runner/work/.../node_modules/serverless-domain-manager/dist/src/aws/api-gateway-v2-wrapper.js:6:65)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Error: Process completed with exit code 1.

Domain Manager Configuration Replace this with your own serverless.yml file (anonymized, of course) to help us better resolve your issue.

custom:
  stage: ${opt:stage, self:provider.stage}
  domains:
    dev: dev.example.com
    test: test.example.com
    prod: example.com
  customDomain:
    domainName: ${self:custom.domains.${self:custom.stage}}
    basePath: ''
    stage: ${self:custom.stage}
    createRoute53Record: true
    apiType: http
    endpointType: 'regional'

Versions

rddimon commented 1 year ago

Hi @jsw

Please set the customDomain.stage to the $default or just remove the stage option and the plugin will set it to $default

More info is here: https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-stages.html

jsw commented 1 year ago

Hi @rddimon

Thanks for the response. Can you elaborate at bit? You want me to change customDomain.stage from ${self:custom.stage} to ${default}? Or maybe dev, which I guess is the "default" stage, which is the value of provider.stage.

Did something change between 7.0.4 and 7.1.0 that requires me to update serverless.xml? I explicitly set the stage in each of my environments, e.g. sls deploy --stage dev and this works in 7.0.4 but not 7.1.0. Is that expected?

BenElferink commented 1 year ago

I second this issue, and I can confirm that setting customDomain.stage to $default helps overcome this error.

However it'll only deploy to our stg environment, it fails to deploy afterwards to prod. This is the error received on an attempt to deploy to prod (using $default):

Error:
UPDATE_ROLLBACK_IN_PROGRESS: loans-v3-*** (AWS::CloudFormation::Stack)
Export with name sls-loans-v3-default-DistributionDomainNameHttp is already exported by stack loans-v3-staging
CJTurpie commented 1 year ago

I'm getting a similar issue related to v7.1.0 where I can't deploy to prod after deploying to staging with the following error:

Export with name sls-back-end-default-HostedZoneIdHttp is already exported by stack back-end-staging
rddimon commented 1 year ago

Hi @rddimon

Thanks for the response. Can you elaborate at bit? You want me to change customDomain.stage from ${self:custom.stage} to ${default}? Or maybe dev, which I guess is the "default" stage, which is the value of provider.stage.

Did something change between 7.0.4 and 7.1.0 that requires me to update serverless.xml? I explicitly set the stage in each of my environments, e.g. sls deploy --stage dev and this works in 7.0.4 but not 7.1.0. Is that expected?

In 7.1.0 we released a fix for the issue #578 the custom.customDomain.stage value is being ignored

It looks like, from the AWS documentation, that for the HTTP APIs we need to have the $default stage created before creating any other custom stages

To simply fix your issue you will need just to remove ustomDomain.stage option from the HTTP configurations

rddimon commented 1 year ago

I second this issue, and I can confirm that setting customDomain.stage to $default helps overcome this error.

However it'll only deploy to our stg environment, it fails to deploy afterwards to prod. This is the error received on an attempt to deploy to prod (using $default):

Error:
UPDATE_ROLLBACK_IN_PROGRESS: loans-v3-*** (AWS::CloudFormation::Stack)
Export with name sls-loans-v3-default-DistributionDomainNameHttp is already exported by stack loans-v3-staging

Thank you for highlighting it! We are going to release a fix for it today.

berkeleycole commented 1 year ago

I am seeing this error - was it supposed to be resolved in the latest update? I just updated to v7.1.1 today and started seeing this issue. Will try the fix above but curious if there is something else I need to do. Thanks!

BenElferink commented 1 year ago

I am seeing this error - was it supposed to be resolved in the latest update? I just updated to v7.1.1 today and started seeing this issue. Will try the fix above but curious if there is something else I need to do. Thanks!

Upgrading to v7.1.1 and setting the customDomain.stage to $default works! Here's an example snippet:

  customDomain:
    domainName: ${env:DOMAIN, ''}
    stage: $default
    basePath: v3/loans
    apiType: http
    endpointType: regional
berkeleycole commented 1 year ago

Thank you for the response @belferink1996! Our issue ended up being another result of updating with the aws sdk. I can confirm that the $default stage with version 7.1.1 does work.

Thanks!

zoli-kasa commented 1 year ago

maybe this should've been a major change, if the API is not compatible with the previous one?

rddimon commented 1 year ago

Hi @zoli-kasa

It was a bit tricky release as it was a bug fix for the #578.

This issue is related only to the HTTP API type and not to the REST or Websocket. Also, this is an AWS behavior to not allow to create a custom stage without $default for the HTTP API type. One more thing is that the plugin will set $default stage for you in case not specified in the config.

But in general, the concern is right and we will take it into account in our further releases.

rddimon commented 1 year ago

Hi @jsw

Is the issue solved for you now? Are we good to close the issue?

zoli-kasa commented 1 year ago

maybe you could write a detailed change about this in the release log, to help other users with the same issue during upgrade?

jsw commented 1 year ago

Hi @jsw

Is the issue solved for you now? Are we good to close the issue?

I have confirmed that removing custom.customDomain.stage fixes the issue. I have tested multiple stages. Thanks for the solution.

rddimon commented 1 year ago

maybe you could write a detailed change about this in the release log, to help other users with the same issue during upgrade?

It might be harder to predict issues But yeah good suggestion we will try to add known solutions next time