Input all cloudformation stack's output to environment variables


#1

I knew i can use ${cf:another-service-dev.functionPrefix} to refer a variable (functionPrefix) from a cloudformation stack (another-service-dev) .

Are there any easy ways, similar to variables from a file, so I just assign the cloudformation to a variable, and I use all output variables directly?

Such as:

provider:
  environment:
    stack: ${cf:another-service-dev}

So in lambda handers, I can directly use the output as:

process.env.stack_functionPrefix

Why do I need this feature? because there are a lot of outputs in my CFN stack, I don’t want to define them one by one.


#2

Are you trying to get the cloudformation output of this service (i.e. the service of this serverless.yml file in which you are defining the environment variables)?

If so, I might have part of a solution with plugins, but for that you would have to be able to access output generated by a plugin from within serverless.yml. Unfortunately, I am not yet sure how to do that last part. I’ll see if I can figure this out.

Anyway, if you can somehow access plugin output from within serverless.yml, then in your plugin you could do:

const awsInfo = serverless.pluginManager.plugins.find(p => p.constructor.name === 'AwsInfo')
const output = awsInfo.gatheredData.outputs
module.exports.output = output

Note that you would have to wait for the after:aws:info:gatherData lifecycle event to have occured, otherwise the cloudformation output data will not yet be available. To simplify this, you can also install the serverless-scriptable-plugin and then define a script instead of a new plugin to gather the output as such:

custom:
  scriptHooks:
    # gather cloudformation output
    after:aws:info:gatherData: scripts/gather-cf-output.js

And then (somehow) you would have to in your serverless.yml:

environment:
  stack: ${gather-cf-output:output}

Of course, the last step doesn’t work. Perhaps someone else here can enlighten us if this last step can be achieved?