serverless-aws-alias icon indicating copy to clipboard operation
serverless-aws-alias copied to clipboard

Per alias resourcing does not appear to work

Open quot-zz opened this issue 7 years ago • 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

quot-zz avatar May 30 '17 05:05 quot-zz

Ok. I'll check. Maybe the provider variable git broken with another fix.

HyperBrain avatar May 30 '17 08:05 HyperBrain

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 avatar Jun 04 '17 13:06 HyperBrain

@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.

eahefnawy avatar Jun 05 '17 04:06 eahefnawy

Yes, currently we don't have support to use variables in keys (as @eahefnawy mentioned).

Here's the issue where we track this feature: https://github.com/serverless/serverless/issues/2892

Could be an interesting addition though!

pmuens avatar Jun 05 '17 07:06 pmuens

@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.

HyperBrain avatar Jun 05 '17 11:06 HyperBrain

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!

eahefnawy avatar Jun 05 '17 13:06 eahefnawy

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.

HyperBrain avatar Jun 06 '17 21:06 HyperBrain

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.

pmuens avatar Jun 07 '17 13:06 pmuens

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.)

HyperBrain avatar Jul 14 '17 16:07 HyperBrain

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.

mekwall avatar Aug 02 '19 12:08 mekwall

You have two ways (as I know) to define per alias resources:

  1. You can have separate configurations (per alias). Use --config option, it's a new feature https://github.com/serverless/serverless/pull/6216
  2. Use serverless-plugin-ifelse plugin.

Enase avatar Aug 05 '19 11:08 Enase

@Enase Thanks, but some of the resources are generated by another plugin, so I don't have control over their resource ids.

mekwall avatar Aug 05 '19 15:08 mekwall

all the plugins generate resources based on some parameters, you can manage it I believe

Enase avatar Aug 07 '19 10:08 Enase