Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/brightspace/serverless-plugin-for-each
Serverless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates
https://github.com/brightspace/serverless-plugin-for-each
Last synced: 5 days ago
JSON representation
Serverless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates
- Host: GitHub
- URL: https://github.com/brightspace/serverless-plugin-for-each
- Owner: Brightspace
- License: apache-2.0
- Created: 2021-05-11T16:58:56.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2024-11-01T06:03:05.000Z (14 days ago)
- Last Synced: 2024-11-01T07:16:57.797Z (14 days ago)
- Language: JavaScript
- Homepage:
- Size: 957 KB
- Stars: 1
- Watchers: 6
- Forks: 5
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
- Codeowners: CODEOWNERS
Awesome Lists containing this project
README
# serverless-plugin-for-each
Serverless plugin that adds `$forEach` syntax to reduce code duplication and allow creating dynamic templates.
## Configuration
`$forEach` block requires two fields:
### iterator
A collection to iterate over. Can be:
- *array*
```yaml
iterator:
- first
- second
```
- *object*
```yaml
iterator:
first: first-value
second: second-value
```
- *environment variable regular expression*
```yaml
iterator:
$env: ENVIRONMENT_VARIABLE_NAME_REGEX
```### template
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## Examples
### Populate environment variables based on the list
#### 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-urlcustom:
# 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-urlcustom:
# this list does not need to be hardcoded here and can come from a file, for example
queues:
FIRST: first-queue
SECOND: second-queue
```### Multiple $forEach blocks in the same object
#### 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-arncustom:
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-arncustom:
queues:
FIRST: first-queue
SECOND: second-queue
tables:
ONE: table-one
TWO: table-two
```### Attach multiple streams to lambda using environment variables
#### 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
```