Have ideas to improve npm?Join in the discussion! »

    serverless-plugin-colocate

    0.0.11 • Public • Published

    Serverless Colocate Plugin

    serverless npm version npm downloads Build Status license

    Colocate your Configuration and Code

    Requirements:

    • Serverless v1.12.x or higher.
    • AWS provider

    How it works

    Colocate allows you to keep your infrastructure configuration and code in the same place. Making it easier to reason and refactor your project.

    Setup

    Install via npm in the root of your Serverless service:

    npm install serverless-plugin-colocate --save-dev
    
    • Add the plugin to the plugins array in your Serverless serverless.yml:
    plugins:
      - serverless-plugin-colocate

    Configuration Options

    custom:
      colocate:
        defaultInclude:         # Optional: For very edge cases where these includes don't meet your needs
          - "**/*.yml"
          - "**/*.yaml"
        defaultExclude:         # Optional: For very edge cases where these includes don't meet your needs
          - "serverless.yml"
          - "node_modules/**"
        exclude:                # Optional: Exclude additional patterns from fragment search
          - "**/goodbye.yml"

    Example

    Project Structure
    <project_root>
    - package1
      - hello.js
      - hello.yml
    - package2
      - goodbye.js
      - goodbye.yml
    - serverless.yml
    
    
    serverless.yml
    service: ServerlessColocateExample
    
    plugins:
      - serverless-plugin-colocate
    
    provider:
      name: aws
      stage: ${opt:stage, "Test"}
      runtime: nodejs8.10
      role: DefaultRole
    
    resources:
      Resources:
        DefaultRole:
          Type: AWS::IAM::Role
          Properties:
            Path: /
            RoleName: ${self:service}-${self:provider.stage}
            AssumeRolePolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Principal:
                    Service:
                      - lambda.amazonaws.com
                  Action: sts:AssumeRole
            Policies:
              - PolicyName: ${self:service}-${self:provider.stage}
                PolicyDocument:
                  Version: "2012-10-17"
                  Statement:
                    - Effect: Allow
                      Action:
                        - logs:CreateLogGroup
                        - logs:CreateLogStream
                        - logs:PutLogEvents
                      Resource: arn:aws:logs:${self:provider.region}:*:log-group:/aws/lambda/*:*:*
    package1/hello.yml
    provider:
      environment:
        HELLO_MESSAGE: Mholo
        
    functions:
      Hello:
        handler: hello.handle
        events:
          - http:
              path: hello
              method: get
              cors: true
              
    resources:
      Resources:
        HelloPolicy:
          Type: AWS::IAM::Policy
          DependsOn: DefaultRole
          Properties:
            PolicyName: ${self:service}-${self:provider.stage}-Hello
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - s3:GetObject
                  Resource:
                    - arn:aws:s3:::package2/*
            Roles:
              - ${self:service}-${self:provider.stage}
    package2/goodbye.yml
    provider:
      environment:
        GOODBYE_MESSAGE: Hamba kakuhle
        
    functions:
      Goodbye:
        handler: goodbye.handle
        events:
          - http:
              path: goodbye
              method: get
              cors: true
    
    resources:  
      Resources:
        GoodbyePolicy:
          Type: AWS::IAM::Policy
          DependsOn: DefaultRole
          Properties:
            PolicyName: ${self:service}-${self:provider.stage}-Goodbye
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - s3:GetObject
                  Resource:
                    - arn:aws:s3:::package1/*
            Roles:
              - ${self:service}-${self:provider.stage}          
    Effective serverless.yml
    service: ServerlessColocateExample
    
    plugins:
      - serverless-plugin-colocate
    
    provider:
      name: aws
      stage: ${opt:stage, "Test"}
      runtime: nodejs8.10
      role: DefaultRole
      environment:
        HELLO_MESSAGE: Mholo
        GOODBYE_MESSAGE: Hamba kakuhle 
        
    functions:
      Hello:
        handler: package1/hello.handle     
        events:
          - http:
              path: hello
              method: get
              cors: true
      Goodbye:
        handler: package2/goodbye.handle
        events:
          - http:
              path: goodbye
              method: get
              cors: true
        
    resources:
      Resources:
        DefaultRole:
          Type: AWS::IAM::Role
          Properties:
            Path: /
            RoleName: ${self:service}-${self:provider.stage}
            AssumeRolePolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Principal:
                    Service:
                      - lambda.amazonaws.com
                  Action: sts:AssumeRole
            Policies:
              - PolicyName: ${self:service}-${self:provider.stage}
                PolicyDocument:
                  Version: "2012-10-17"
                  Statement:
                    - Effect: Allow
                      Action:
                        - logs:CreateLogGroup
                        - logs:CreateLogStream
                        - logs:PutLogEvents
                      Resource: arn:aws:logs:${self:provider.region}:*:log-group:/aws/lambda/*:*:*
        HelloPolicy:
          Type: AWS::IAM::Policy
          DependsOn: DefaultRole
          Properties:
          PolicyName: ${self:service}-${self:provider.stage}-Hello
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - s3:GetObject
                  Resource:
                    - arn:aws:s3:::package1/*
            Roles:
              - ${self:service}-${self:provider.stage}
        GoodbyePolicy:
          Type: AWS::IAM::Policy
          DependsOn: DefaultRole        
          Properties:
            PolicyName: ${self:service}-${self:provider.stage}-Goodbye
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - s3:GetObject
                  Resource:
                    - arn:aws:s3:::package2/*
            Roles:
              - ${self:service}-${self:provider.stage}

    Function Handler Path

    The plugin will prepend the correct path to function handler: ie. in the hello.yml the handler is simply handler: hello.handle but in the effective serverless.yml the Hello function handler is handler: package1/hello.handle

    Skip a specific configuration file

    If you want the plugin to ignore a particular configuration file, simply add ignore: true to the root of the configuration file. This is simpler than commenting out the entire file.

    ignore: true
    
    functions:
      Hello:
        handler: hello.handle  
    

    Contribute

    Help us making this plugin better and future proof.

    • Clone the code
    • Install the dependencies with npm install
    • Create a feature branch git checkout -b new_feature
    • Lint with standard npm run lint

    License

    This software is released under the MIT license. See the license file for more details.

    Install

    npm i serverless-plugin-colocate

    DownloadsWeekly Downloads

    66

    Version

    0.0.11

    License

    MIT

    Unpacked Size

    17.4 kB

    Total Files

    5

    Last publish

    Collaborators

    • avatar