diff --git a/docs/deprecations.md b/docs/deprecations.md
index 086a97d7c5f..3c43134f1f2 100644
--- a/docs/deprecations.md
+++ b/docs/deprecations.md
@@ -36,6 +36,20 @@ Note:
- The `serverless.yml` setting is ineffective for deprecations reported before the configuration is read.
- `SLS_DEPRECATION_DISABLE` and `disabledDeprecations` remain respected, and no errors will be thrown for mentioned deprecation codes.
+
+
+## Grouping websockets settings under `provider.websockets`
+
+Deprecation code: `PROVIDER_WEBSOCKETS_SETTINGS_v3`
+
+Websockets-related settings of _provider_ including `websocketsApiName`, `websocketsApiRouteSelectionExpression` and `websocketsDescription` are also now supported at `websockets` property. Refer to the [Websocket Guide](/docs/providers/aws/events/websocket.md).
+
+- `provider.websocketsApiName` -> `provider.websockets.apiName`
+- `provider.websocketsApiRouteSelectionExpression` -> `provider.websockets.apiRouteSelectionExpression`
+- `provider.websocketsDescription` -> `provider.websockets.description`
+
+Starting with v4.0.0 old versions of settings will no longer be supported
+
## Property `variablesResolutionMode`
diff --git a/docs/providers/aws/events/websocket.md b/docs/providers/aws/events/websocket.md
index 798ab837d8b..e801391e572 100644
--- a/docs/providers/aws/events/websocket.md
+++ b/docs/providers/aws/events/websocket.md
@@ -76,9 +76,10 @@ service: serverless-ws-test
provider:
name: aws
runtime: nodejs12.x
- websocketsApiName: custom-websockets-api-name
- websocketsApiRouteSelectionExpression: $request.body.action # custom routes are selected by the value of the action property in the body
- websocketsDescription: Custom Serverless Websockets
+ websockets:
+ apiName: custom-websockets-api-name
+ apiRouteSelectionExpression: $request.body.action # custom routes are selected by the value of the action property in the body
+ description: Custom Serverless Websockets
functions:
connectionHandler:
diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md
index 721caf1fd1a..ca658e79895 100644
--- a/docs/providers/aws/guide/serverless.yml.md
+++ b/docs/providers/aws/guide/serverless.yml.md
@@ -237,12 +237,6 @@ provider:
apiName: custom-api-name
# Endpoint type for API Gateway REST API: edge or regional (default: edge)
endpointType: regional
- # Use a custom name for the websockets API
- websocketsApiName: custom-websockets-api-name
- # custom route selection expression
- websocketsApiRouteSelectionExpression: $request.body.route
- # Use a custom description for the websockets API
- websocketsDescription: Custom Serverless Websockets
# Optional API Gateway REST API global config
apiGateway:
# Attach to an externally created REST API via its ID:
@@ -310,6 +304,13 @@ provider:
name: GlobalModel
# Optional: Description of the API Gateway model
description: 'A global model that can be referenced in functions'
+ # Use a custom name for the websockets API
+ websockets:
+ apiName: custom-websockets-api-name
+ # custom route selection expression
+ apiRouteSelectionExpression: $request.body.route
+ # Use a custom description for the websockets API
+ description: Custom Serverless Websockets
```
### ALB
diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js
index a32c4edbc60..feb6696a615 100644
--- a/lib/plugins/aws/lib/naming.js
+++ b/lib/plugins/aws/lib/naming.js
@@ -207,6 +207,12 @@ module.exports = {
// Websockets API
getWebsocketsApiName() {
+ if (_.get(this.provider.serverless.service.provider.websockets)) {
+ return (
+ `${this.provider.serverless.service.provider.websockets.apiName}` ||
+ `${this.provider.getStage()}-${this.provider.serverless.service.service}-websockets`
+ );
+ }
if (
this.provider.serverless.service.provider.websocketsApiName &&
typeof this.provider.serverless.service.provider.websocketsApiName === 'string'
diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/api.js b/lib/plugins/aws/package/compile/events/websockets/lib/api.js
index b4c39638357..dd54f262f88 100644
--- a/lib/plugins/aws/package/compile/events/websockets/lib/api.js
+++ b/lib/plugins/aws/package/compile/events/websockets/lib/api.js
@@ -13,9 +13,14 @@ module.exports = {
this.websocketsApiLogicalId = this.provider.naming.getWebsocketsApiLogicalId();
- const RouteSelectionExpression =
- this.serverless.service.provider.websocketsApiRouteSelectionExpression ||
- '$request.body.action';
+ const RouteSelectionExpression = _.get(
+ this.provider,
+ 'serverless.service.provider.websockets.routeSelectionExpression'
+ )
+ ? this.serverless.service.provider.websockets.routeSelectionExpression ||
+ '$request.body.action'
+ : this.serverless.service.provider.websocketsRouteSelectionExpression ||
+ '$request.body.action';
_.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, {
[this.websocketsApiLogicalId]: {
@@ -23,8 +28,9 @@ module.exports = {
Properties: {
Name: this.provider.naming.getWebsocketsApiName(),
RouteSelectionExpression,
- Description:
- this.serverless.service.provider.websocketsDescription || 'Serverless Websockets',
+ Description: this.serverless.service.provider.websockets
+ ? this.serverless.service.provider.websockets.description || 'Serverless Websockets'
+ : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets',
ProtocolType: 'WEBSOCKET',
},
},
diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js
index 60cf98780e4..ef54d86efc5 100644
--- a/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js
+++ b/lib/plugins/aws/package/compile/events/websockets/lib/deployment.js
@@ -34,8 +34,9 @@ module.exports = {
DependsOn: dependentResourceIds,
Properties: {
ApiId: this.provider.getApiGatewayWebsocketApiId(),
- Description:
- this.serverless.service.provider.websocketsDescription || 'Serverless Websockets',
+ Description: this.serverless.service.provider.websockets
+ ? this.serverless.service.provider.websockets.description
+ : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets',
},
},
});
diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js
index 837f1e09054..f83e03fc84b 100644
--- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js
+++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js
@@ -30,8 +30,9 @@ module.exports = {
ApiId: this.provider.getApiGatewayWebsocketApiId(),
// DeploymentId is generated at deployment.js file
StageName: this.provider.getStage(),
- Description:
- this.serverless.service.provider.websocketsDescription || 'Serverless Websockets',
+ Description: this.serverless.service.provider.websockets
+ ? this.serverless.service.provider.websockets.description || 'Serverless Websockets'
+ : this.serverless.service.provider.websocketsDescription || 'Serverless Websockets',
},
};
diff --git a/lib/plugins/aws/provider.js b/lib/plugins/aws/provider.js
index 1a5ef46b335..bec5f417809 100644
--- a/lib/plugins/aws/provider.js
+++ b/lib/plugins/aws/provider.js
@@ -1198,6 +1198,15 @@ class AwsProvider {
websocketsApiName: { type: 'string' },
websocketsApiRouteSelectionExpression: { type: 'string' },
websocketsDescription: { type: 'string' },
+ websockets: {
+ type: 'object',
+ properties: {
+ apiName: { type: 'string' },
+ apiRouteSelectionExpression: { type: 'string' },
+ description: { type: 'string' },
+ },
+ additionalProperties: false,
+ },
},
},
function: {
diff --git a/test/unit/lib/plugins/aws/lib/naming.test.js b/test/unit/lib/plugins/aws/lib/naming.test.js
index 1c62257e763..efd365d0454 100644
--- a/test/unit/lib/plugins/aws/lib/naming.test.js
+++ b/test/unit/lib/plugins/aws/lib/naming.test.js
@@ -233,7 +233,7 @@ describe('#naming()', () => {
});
});
- describe('#getWebsocketsApiName()', () => {
+ describe('#get()', () => {
it('should return the composition of stage & service name if custom name not provided', () => {
serverless.service.service = 'myService';
expect(sdk.naming.getWebsocketsApiName()).to.equal(