Giter Site home page Giter Site logo

frogvall / serverless-plugin-for-each Goto Github PK

View Code? Open in Web Editor NEW

This project forked from brightspace/serverless-plugin-for-each

0.0 1.0 0.0 592 KB

Serverless plugin that adds $forEach syntax to reduce code duplication and allow creating dynamic templates

License: Apache License 2.0

JavaScript 100.00%

serverless-plugin-for-each's Introduction

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
    iterator:
      - first
      - second
  • object
    iterator:
      first: first-value
      second: second-value
  • environment variable regular expression
    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

When using an object type iterator, nested values can be accessed with dot notation, (e.g. $forEach.value.nestedKey).

Examples

Populate environment variables based on the object

Config

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

Result

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

Multiple $forEach blocks in the same object

Config

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

Result

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

Attach multiple streams to lambda using environment variables

Config

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

Result

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

serverless-plugin-for-each's People

Contributors

dependabot[bot] avatar semantic-release-bot avatar antonbazhal avatar dgarg24 avatar 1-900-mixalot avatar frogvall avatar tenceleste avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.