Serverless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates
npm install serverless-plugin-for-eachServerless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates.
$forEach block requires two fields:
yaml
iterator:
- first
- second
`
- object
`yaml
iterator:
first: first-value
second: second-value
`
- environment variable regular expression
`yaml
iterator:
$env: ENVIRONMENT_VARIABLE_NAME_REGEX
`$3
An array or object to replace $forEach block with. Template can contain $forEach.key and $forEach.value variables that are interpolated during the replacement. Depending on the iterator type, these variables are replaced with:
- array:
- $forEach.key - item index in the array
- $forEach.value - item value
- object:
- $forEach.key - field name
- $forEach.value - field value
- environment variable regular expression:
- $forEach.key - environment variable name
- $forEach.value - environment variable valueExamples
$3
#### Config
`yaml
service: my-serviceprovider:
environment:
LOG_LEVEL: info
REGION: us-east-1
$forEach:
iterator: ${self:custom.queues}
template:
$forEach.key_QUEUE_URL:
Fn::ImportValue: my-service-$forEach.value-url
custom:
# this list does not need to be hardcoded here and can come from a file, for example
queues:
FIRST: first-queue
SECOND: second-queue
`#### Result
`yaml
service: my-serviceprovider:
environment:
LOG_LEVEL: info
REGION: us-east-1
FIRST_QUEUE_URL:
Fn::ImportValue: my-service-first-queue-url
SECOND_QUEUE_URL:
Fn::ImportValue: my-service-second-queue-url
custom:
# this list does not need to be hardcoded here and can come from a file, for example
queues:
FIRST: first-queue
SECOND: second-queue
`$3
#### Config
`yaml
service: my-serviceprovider:
environment:
LOG_LEVEL: info
REGION: us-east-1
$forEach_queues: # A "_suffix" can be added to avoid duplicated keys
iterator: ${self:custom.queues}
template:
$forEach.key_QUEUE_URL:
Fn::ImportValue: my-service-$forEach.value-url
$forEach_tables:
iterator: ${self:custom.tables}
template:
$forEach.key_TABLE_ARN:
Fn::ImportValue: my-service-$forEach.value-arn
custom:
queues:
FIRST: first-queue
SECOND: second-queue
tables:
ONE: table-one
TWO: table-two
`#### Result
`yaml
service: my-serviceprovider:
environment:
LOG_LEVEL: info
REGION: us-east-1
FIRST_QUEUE_URL:
Fn::ImportValue: my-service-first-queue-url
SECOND_QUEUE_URL:
Fn::ImportValue: my-service-second-queue-url
ONE_TABLE_ARN:
Fn::ImportValue: my-service-one-table-arn
TWO_TABLE_ARN:
Fn::ImportValue: my-service-two-table-arn
custom:
queues:
FIRST: first-queue
SECOND: second-queue
tables:
ONE: table-one
TWO: table-two
`$3
#### Config
`yaml
service: my-servicefunctions:
helloWorld:
handler: ./src/hello-world.js
events:
- $forEach:
iterator:
$env: STREAM_ARN$ # matches all env vars with this suffix
template:
- stream:
arn: $forEach.value
startingPosition: TRIM_HORIZON
enabled: true
`#### Result
Assuming you have
FIRST_STREAM_ARN= and SECOND_STREAM_ARN= set, the configuration above would be converted into`yaml
service: my-servicefunctions:
helloWorld:
handler: ./src/hello-world.js
events:
- stream:
arn:
startingPosition: TRIM_HORIZON
enabled: true
- stream:
arn:
startingPosition: TRIM_HORIZON
enabled: true
``