Per alias resourcing does not appear to work
quot-zz opened this issue · 13 comments
Attempting to deploy a previously packaged serverless build that makes use of the example under Use with per alias resource heading in the README results in the error -
Template format error: Resource name myKinesis${self:provider.alias} is non alphanumeric.
Section in question:
resources:
Resources:
myKinesis${self:provider.alias}:
Type: AWS::Kinesis::Stream
Properties:
Name: my-kinesis-${self.provider.alias}
ShardCount: 1
Ok. I'll check. Maybe the provider variable git broken with another fix.
I tested the behavior and committed a fix into a separate branch. The table name (and other properties) are now substituted correctly (e.g. TableName: ${self:provider.alias}
.
Nevertheless the resource name (myKinesis${self:provider.alias}
) does not get replaced correctly. This seems to be a bug (maybe missing feature) in the Serverless framework. IMO it would be correct if Serverless would apply the variable substitution not only to variable values, but also to resource names.
/cc @pmuens @eahefnawy
@HyperBrain by resource names, you mean the logical IDs? That's interesting, but it's something that we've explicitly ignored for now. If you see a strong use case for that could you open an issue about it?
From the docs:
Note: You can only use variables in serverless.yml property values, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example.Note: You can only use variables in serverless.yml property values, not property keys. So you can't use variables to generate dynamic logical IDs in the custom resources section for example.
Yes, currently we don't have support to use variables in keys (as @eahefnawy mentioned).
Here's the issue where we track this feature: serverless/serverless#2892
Could be an interesting addition though!
@eahefnawy @pmuens The use case here is the creation of per-alias resources (defined by the user). This would automatically rename the logical resource ids to include the alias name (see my example in the README). This feature is very interesting for feature development, where one would add an per-alias resource, to make sure that every other developer would have it's own instance of the resource when he deploys to his alias. I will have a look at the feature issue in Serverless and check if I can do anything there.
hmmm actually if I remember correctly we've ignored it because its not supported by the traverse module we were using back then, but now we ditched and might work out!
I merged the fix for the property values part. The issue will be kept open until the property based variable substitution has been added to the Serverless framework.
In the mean-time I will change the README and add a not that the example is currently not functional with a reference to this issue.
I merged the fix for the property values part. The issue will be kept open until the property based variable substitution has been added to the Serverless framework.
In the mean-time I will change the README and add a not that the example is currently not functional with a reference to this issue.
Sounds good. Thanks for the update on this one @HyperBrain 👍
For everyone reading through this: The Framework issue can be found here.
An alternative here would be that we create a new configuration section in serverless.yml
named aliasResources
with the same layout as the resources
property. The difference would be that all resources defined in there will be deployed per alias.
This would also allow to reference these resources in the same way as the standard CF resources (e.g. function event subscriptions, environment variables, etc.)
Any ideas on how to best solve this? I'm trying to get this plugin to work with serverless-nextjs-plugin
but getting resource id conflicts when I try to deploy a second alias.
You have two ways (as I know) to define per alias resources:
- You can have separate configurations (per alias). Use --config option, it's a new feature serverless/serverless#6216
- Use
serverless-plugin-ifelse
plugin.
@Enase Thanks, but some of the resources are generated by another plugin, so I don't have control over their resource ids.
all the plugins generate resources based on some parameters, you can manage it I believe