Project manifest format
Architect projects have the following significant folder structure by default:
.
├── public .......... # Static assets (js, css, svg, images, etc.)
├── src
│ ├── shared ...... # Code shared by all Lambda functions
│ ├── views ....... # Code shared by HTTP GET Lambda functions
│ ├── plugins ..... # Modify anything Architect does; including generated CloudFormation
│ ├── http ........ # @http Lambda functions
│ ├── events ...... # @event Lambda functions
│ ├── queues ...... # @queue Lambda functions
│ ├── scheduled ... # @scheduled Lambda functions
│ ├── tables ...... # @table stream Lambda functions
│ └── ws .......... # @ws Lambda functions
└── app.arc
All folders are optional. Architect ignores any additional folders, and all source paths can be reconfigured to suit unique project needs.
Manifest file format overview
Architect projects have a manifest file in the root of the project that represents the Infrastructure as Code. This manifest file captures the infra requirements beside the code it will run in revision control to ensure every deployment is completely deterministic.
Architect supports the following manifest files:
.arcapp.arcarc.yamlarc.ymlpackage.jsonarc.json
More on app.arc
The app.arc format follows a few simple rules:
- whitespace is significant and must be spaces
- comments start with
# - a pragma starts with
@ - pragmas can be ordered arbitrarily
The app.arc manifest can be broadly split into three sections:
- Project configuration
- Lambda resource definition
- Persistence resource definition
Project configuration
These sections are for global system level env configuration. The most important being the @app namespace which is used to prefix all generated resources.
@app[Required] application namespace@awsAWS specific configuration@viewsconfigure path to view source code@sharedconfigure path to shared source code@macrosmodify generated CloudFormation
Lambda resource definition
These sections deal with Lambda functions and their event sources. Architect conventionally promotes one event source per function. Single responsibility functions are faster to deploy, easier to debug and secure to least privilege.
@httpHTTP routes (API Gateway)@eventsEvent pub/sub (SNS)@queuesqueues and handlers for them (SQS)@scheduledInvoke functions specified times (CloudWatch Events)@wsWeb Socket functions (API Gateway)
Persistence resource definition
These pragmas represent persistence resources.
@staticBucket for hosting static assets (S3)@tablesDatabase tables and trigger functions (DynamoDB)@tables-indexesTable global secondary indexes (DynamoDB)@tables-streamsTable stream handler functions (DynamoDB + Lambda)
Example
arc
# this is going to be great!
@app
hello
@static
fingerprint true
@ws
action
connect
default
disconnect
@http
get /
get /likes
post /likes
@events
hit-counter
@scheduled
daily-affirmation rate(1 day)
@tables
likes
likeID *String
@tables-streams
likes
@tables-indexes
likes
date *String
json
{
"app": "hello",
"static": {
"fingerprint": true
},
"ws": ["action", "connect", "default", "disconnect"],
"http": [
["get", "/"],
["get", "/likes"],
["post", "/likes"]
],
"events": ["hit-counter"],
"scheduled": {
"daily-affirmation": {
"rate": [1, "day"]
}
},
"tables": {
"likes": {
"likeID": "*String"
}
},
"tables-streams": ["likes"],
"tables-indexes": {
"likes": {
"date": "*String"
}
}
}
yaml
---
app: "hello"
static:
fingerprint: true
ws:
- action
- connect
- default
- disconnect
http:
- get: "/"
- get: "/likes"
- post: "/likes"
events:
- hit-counter
scheduled:
- daily-affirmation: "rate(1 day)"
tables:
- likes: { likeID: "*String" }
tables-streams:
- likes
tables-indexes:
- likes: { date: "*String" }
Running arc init in the same directory as the file above generates the following Lambda function code:
.
├── src
│ ├── events
│ │ └── hit-counter/index.js
│ │
│ ├── http
│ │ ├── get-index/index.js
│ │ ├── get-likes/index.js
│ │ └── post-likes/index.js
│ │
│ ├── scheduled
│ │ └── daily-affirmation/index.js
│ │
│ ├── tables-streams
│ │ └── likes/index.js
│ │
│ └── ws
│ ├── action/index.js
│ ├── connect/index.js
│ ├── default/index.js
│ └── disconnect/index.js
│
└── app.arc
The app.arc format is terse, easy to read, and quickly learnable to author. The expressions in an app.arc file unlock the formerly complex tasks of cloud infrastructure provisioning, deployment, and orchestration.