When using Lambda, it’s very common to use environment variables to expose configuration. This allows for making generic and re-usable code that can be configured at deploy time.
Unfortunately Lambda@Edge doesn’t support environment variables. That means that the code needs to be entirely encapsulated in deployment package. This makes configuration-at-deploy-time impossible.
This is also targeted with lambda-edgedeploy
handler. When deploying function for use by CloudFront, handler opens specified package and injects configuration passed to it as JSON file. By default it’s named config.json
, but name is also configurable.
Let’s say you want to expose some build variables to your function via CloudFormation:
EdgeFunction: Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt "EdgeDeploy.Arn" # … all of the Lambda@Edge properties here … packageBucket: "deploy-bucket" packageKey: "path/to/your/lambda.zip" # by default config.json is used as filename configFile: "env.json" config: # you can use references to other resources and parameters # these are just a regular CloudFormation-processed values applicationVersion: !Ref "ReleaseVersion" applicationDomain: "Fn::ImportValue": !Sub "${ProjectKey}:${ProjectVersion}:DomainName" facebookAppId: !Ref "FacebookAppId"
This will deploy your lambda.zip
package with env.json
file in it with configuration values:
{ "applicationVersion": "0.0.1", "applicationDomain": "wrzasq.pl", "facebookAppId": "123456789abcdefgh" }
Note: Keep in mind that Lambda@Edge can only handle Node.js packages, so there is no reason to explain implementations for other runtimes.
As JSON is a native notation of JavaScript, it’s very easy to load built config file within your Node Lambda:
// require() style let env = require("env.json"); // ES import style import * as env from "./env.json";