core concepts

Blueprints (blueprint.yaml)

Describing how to run your Software, with Source Code

Specification

The Noop blueprint.yaml file defines your application’s components, routes, resources, and lifecycle events.

components

The blueprint.yaml must declare a components root element as a list of objects containing configuration for each component in your application. At least one component object must be defined.

components:
  - name: webserver
    ...
  - name: api
    ...

name

Defines the name of the component. Each component name must be unique. Required.

type

Specifies the type of the component; must be one of service, task, or static. Required.

image

Sets the base image from which the component is built. Required.

port

The container port to expose.

root

Establishes the docker build context, setting the host working directory for copy and run build step commands.

build

Defines a series of steps to be executed in creating the component image. Steps are defined as an array of mappings, where the mapping key is the step instruction and mapping value are arguments for that instruction.

steps

directory

Sets the working directory of the image for build step commands that follow.

copy

Copies files from the host to the image. The copy step can take both string and array types as an argument. Strings can use the wildcard symbol ’*’ to pattern match files. Arrays must have at least one element, where elements represent individual files to be copied from host to image. The copy step object can be used in conjunction with the optional destination key to specify the image directory in which files are to be copied.

...
    build:
      steps:
        - directory: /express
        - copy: package*.json
          destination: ./
        - copy: [index.js, dynamodb.js, s3.js]
          destination: ./
    ...

run

Executes a command in the current working directory. If no directory step precedes the run step, the command will execute in the base image’s working directory.

image

Specifies an image to be used for multi-stage builds. The optional stage key can be used to name the build stage. The build stage should be a string value and cannot equal main, which is the name of the primary build stage.

    build:
      steps:
      ...
        - image: node:10
          stage: server-build
      ...

runtime

runtime defines properties associated with a component instance. runtime properties affect build Deployments, specifying container execution commands, instance memory, component resources, and component variables.

resources

Resources that a component will use must be defined in the resources property of a component’s runtime section. Resources are an array of strings, where the string value corresponds to the name of the resource as defined in the Application Blueprint resources (provide link) section.

...
    runtime:
      resources:
        - DynamoDBTable
        - S3Bucket
    ...
resources:
  - name: DynamoDBTable
    type: dynamodb
    hashKeyName: id
    hashKeyType: S
  - name: S3Bucket
    type: s3

entrypoint

Defines a container ENTRYPOINT instruction used to specify a command that will be executed when the container starts.

command

Defines a container CMD instruction used to specify a command that will be executed when the container starts. If used in conjunction with entrypoint, the value of command specifies arguments that will be passed to the entrypoint command.

cpu

Used to specify the number of cpu cores of a component instance.

memory

Used to specify the memory (in MB) of a component instance.

variables

Defines variables to be used at runtime. Each variable is a mapping object, where the object key is the variable name and object value is the variable value. Variables can make use of Noop logic to access object values within certain scopes. A common pattern to assign a variable the value of a resource property is to use the $resources scope object with the corresponding resource object and property.

...
    runtime:
    ...
      variables:
        S3_BUCKET:
          $resources: ImagesBucket.bucket
        S3_ENDPOINT:
          $resources: ImagesBucket.endpoint
        LOG_LEVEL: info

resources

Resources include Postgres, MySQL, Redis, Amazon DynamoDB and Amazon S3. To create a resource in your Application, specify the name, type and optional configuration parameters.

Here is a minimal definition of each resource type:


---
resources:
  - name: DynamoDBTable
    type: dynamodb
    hashKeyName: id
    hashKeyType: S
  - name: S3Bucket
    type: s3
  - name: EphemeralCache
    type: redis
  - name: RecordsDB
    type: postgres
  - name: OtherDB
    type: mysql

name

Defines the name of the resource. Required.

type

One of dynamodb, postgres, mysql, s3 or redis Required.

How to referenece a resource from Application components

To associate the resources with your Application components (Services and Tasks) define them on the component.[n].runtime.resources property.

...
    runtime:
      resources:
        - DynamoDBTable
        - S3Bucket
    ...
resources:
  - name: DynamoDBTable
    type: dynamodb
    hashKeyName: id
    hashKeyType: S
  - name: S3Bucket
    type: s3

When specifying a Dynamo table there are a couple other required and optional properties.

hashKeyName (Dynamo-specific)

Alpha-numeric name - and _ are allowed. Required.

hashKeyType (Dynamo-specific)

One of S, N B Required.

rangeKeyName (Dynamo-specific)

Alpha-numeric name - and _ are allowed.

rangeKeyType (Dynamo-specific)

One of S, N B

routes

Routes get internet traffic to your Application. Specifically, Routes connect your Application’s Service and Static components to the internet.

target

The name of the static or service component to send Traffic to. Required

pattern

String representing the URL path portion to match when forwarding Traffic. Accepts /* and /** notation.

internal

Boolean. Determines whether the route is publicly accessible.

methods

Array of HTTP methods, GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS

condition

Uses Noop Logic. Other conditional rules to determine if traffic should resolve to target.

lifecycles

Lifecycle events allow your Application to run a task or group of tasks when the specified event is triggered.

event

One of BeforeServices, BeforeTraffic or AfterTraffic. Required

components

Array of task Components. Components are executed in series. Required

Complete blueprint.yaml Example

Expressed in Source Code at .noop/blueprint.yaml

# Sample Application Blueprint
components:
  - name: ApiService
    type: service
    image: nodejs:alpine
    port: 8080
    health:
      checker: tcp #cmd [command], http [path, port]
      interval: 10
      retries: 5
      port: 80
    build: # $app $source
      steps:
        - directory: /server
        - copy: package*.json
          destination: package*.json
        - run: npm ci --ignore-scripts
    runtime: # $env $app $build
      resources:
        - ItemsDatabase
        - ImagesBucket
      command: npm start
      cpu: 1
      memory: 256
      variables:
        S3_BUCKET:
          $resources: ImagesBucket.bucket
        S3_ENDPOINT:
          $resources: ImagesBucket.endpoint
        MYSQL_URL:
          $resources: ItemsDatabase.url
        LOG_LEVEL: info
  - name: MaintenanceJob
    type: task
    image: nodejs:alpine
    root: cron_task/
    cron: '*/5 * * * *'
    build:
      steps:
        - directory: /cron
        - image: foo
          stage: bar
        - copy: [package-lock.json, package.json]
          destination: /app/src
          from: main
        - copy: lib/
        - run: npm ci
        - copy: cron_task.js
    runtime:
      command: node cron_task.js
      entrypoint: /bin/bash
      resources:
        - ItemsDatabase
      variables:
        MYSQL_URL:
          $resources: ItemsDatabase.url
lifecycles:
  - event: BeforeServices
    components:
      - MaintenanceJob
routes:
  - pattern: /api/*
    methods: [GET, POST]
    target:
      component: ApiService
  - pattern: /system/*
    internal: true
    target:
      component: ApiService
    condition:
      $request:
        not:
          cidr: [var: x-forwarded-for, 50.16.0.0/15]
resources:
  - name: MySQLDatabase
    type: mysql
  - name: S3Bucket
    type: s3