Serverless plugin that adds $forEach
syntax to reduce code duplication and allow creating dynamic templates.
$forEach
block requires two fields:
A collection to iterate over. Can be:
- array
iterator: - first - second
- object
iterator: first: first-value second: second-value
- environment variable regular expression
iterator: $env: ENVIRONMENT_VARIABLE_NAME_REGEX
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 value
service: my-service
provider:
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
service: my-service
provider:
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
service: my-service
provider:
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
service: my-service
provider:
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
service: my-service
functions:
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
Assuming you have FIRST_STREAM_ARN=<first-stream-arn>
and SECOND_STREAM_ARN=<second-stream-arn>
set, the configuration above would be converted into
service: my-service
functions:
helloWorld:
handler: ./src/hello-world.js
events:
- stream:
arn: <first-stream-arn>
startingPosition: TRIM_HORIZON
enabled: true
- stream:
arn: <second-stream-arn>
startingPosition: TRIM_HORIZON
enabled: true