serverless-heaven / serverless-aws-alias

Alias support for Serverless 1.x
MIT License
189 stars 68 forks source link

Per alias resourcing does not appear to work #49

Open quot-zz opened 7 years ago

quot-zz commented 7 years ago

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
HyperBrain commented 7 years ago

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

HyperBrain commented 7 years ago

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

eahefnawy commented 7 years ago

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

pmuens commented 7 years ago

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!

HyperBrain commented 7 years ago

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

eahefnawy commented 7 years ago

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!

HyperBrain commented 7 years ago

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.

pmuens commented 7 years ago

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.

HyperBrain commented 7 years ago

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

mekwall commented 5 years ago

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.

Enase commented 5 years ago

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.
mekwall commented 5 years ago

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

Enase commented 5 years ago

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