49
4/26/2018 localhost:8000/?print-pdf&showNotes=true#/ http://localhost:8000/?print-pdf&showNotes=true#/ 1/49 ȸ Architecture as Text 1

Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/ 3/49 П‡¨ÐŸ‡¦ 3

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 1/49

� Architecture as Text

1

Page 2: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 2/49

Cofounder/CTO

@brianleroux@begin

2TKTK who are you? past companies? past projects?

Page 3: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 3/49

П‡¨ÐŸ‡¦ÐŸ‡¨ÐŸ‡¦

3

Page 4: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 4/49

The chief cause of problems issolutions. - Eric Sevareid

4

Page 5: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 5/49

Physical servers

Virtual machines

Containers

Cloud functions

5

- Physical servers break down so we moved to commodity hardware. - Virtual machines are slow so we removed stateand load balanced them. - Containers are hard to coordinate so they became cloud functions.

Page 6: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 6/49

Cloud functions are different: virtual machines andcontainers are a metaphor for a physical server

6

Page 7: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 7/49

We knew Cloud Functions would bring significantadvantages in an incumbant market.

7

Page 8: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 8/49

We can't solve problems by using thesame kind of thinking we used when

we created them. - Albert Einstein

8

Page 9: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 9/49

You have to manually provision and setup yourdeployment pipeline with your own assumptionsabout environment isolation and reproducability.

9

Configuration and infrastructure can drift, leaving systems in difficult to repeat/reproduce and thusscaleHard to configure and thus automateWhich means getting consistent, repeatable and reproducable builds is tough to get right

Page 10: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 10/49

10

Page 11: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 11/49

Infrastructure as Code

11

Page 12: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 12/49

1. Manifest checked into your revision control systemso you can version your infra beside your code

2. Tooling for managing the manifest based infra(usually global CLI binary)

12

Page 13: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 13/49

Terraform

Serverless

AWS SAM

13

None of these things existed when we started building begin.com; as they matured and the thing that would become .arcemmerged we still liked our approach

Page 14: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 14/49

Terraform HCL

14

Page 15: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 15/49

Terraform HCL

Provisions a Lambda function on AWS.

resource "aws_iam_role" "iam_for_lambda" { name = "iam_for_lambda" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [{ "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.amazonaws.com" }, "Effect": "Allow", "Sid": "" }] } EOF

15

Page 16: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 16/49

Serverless YAML

16

Page 17: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 17/49

Serverless YAML

Wires a couple of Lambdas and a DynamoDB Table

# serverless.yml service: users provider: name: aws runtime: nodejs6.10 stage: dev # Set the default stage used. Default is dev region: us-east-1 # Overwrite the default region used. Defau profile: production # The default profile to use with this s memorySize: 512 # Overwrite the default memory size. Default deploymentBucket: name: com.serverless.${self:provider.region}.deploys # Ove serverSideEncryption: AES256 # when using server-side encr versionFunctions: false # Optional function versioning

17

Page 18: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 18/49

AWS SAM

18

Page 19: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 19/49

AWS SAM

Wires a couple of Lambdas and a DynamoDB Table

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Simple CRUD webservice. State is stored in a SimpResources: GetFunction: Type: AWS::Serverless::Function Properties: Handler: index.get Runtime: nodejs4.3 CodeUri: s3:///api_backend.zip Policies: AmazonDynamoDBReadOnlyAccess Environment: Variables: TABLE_NAME: !Ref Table Events:

19

Page 20: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 20/49

1. Deep proprietary knowledge is required to configureand maintain common infrastructure primatives

2. Painful manifest files; JSON and YAML are not ideal3. Tooling was designed for the last generation of

metaphors

20

Tooling lags behind AWS releasesSetup requires expertise in AWS Primatives which might as well be AWS FrameworksJSON: is difficult to read, has no comments, and unforgiving to editYAML isn't much better and especially worse with deeply nested statements

Page 21: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 21/49

We are committing AWS infra config arcana into ourrevision control systems

21

Page 22: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 22/49

Infrastructure as Code

22

Page 23: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 23/49

Infrastructure as Code

23

Page 24: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 24/49

Architecture as Text

24

Page 25: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 25/49

.arc is a plaintext manifest file

25Designed to solve the specific problems above by treating infra as a build artifacts

Page 26: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 26/49

.arc# this is an .arc file @app helloapp @html get /

26

Page 27: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 27/49

Things to understand about .arc

27

Page 28: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 28/49

1. Comments start with #2. Sections start with @3. Everything a�er a section becomes instructions for generating AWS

infrastructure

28

Page 29: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 29/49

.arc lives in the root of a Node project

.arc file always lives beside package.json

# this is an .arc file @app helloapp @html get /

29

Page 30: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 30/49

@app defines a namespace

@app namespace scopes all generated infrastructure within AWS.

# this is an .arc file @app helloapp @html get /

30

Page 31: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 31/49

@html defines text/html routes

(Other HTTP handlers supported: @json)

# this is an .arc file @app helloapp @html get /

31

Page 32: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 32/49

.arc tooling is local to the project using npmscripts

32

Page 33: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 33/49

npm run create

A Lambda function wired to API Gateway handles requests to /.

# / # |-src # | '-html # | '-get-index # | |-index.js # | '-package.json # |-.arc # '-package.json

33

Page 34: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 34/49

.arc is expressive# this is an .arc file @app helloapp @html get / get /about get /contact post /contact @json get /api

34

Page 35: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 35/49

npm run create

The file system layout mirrors the .arc file.

# / # |-src # | |-html # | | |-get-index/ # | | |-get-about/ # | | |-get-contact/ # | | '-post-contact/ # | '-json # | '-get-api/ # |-.arc # '-package.json

35

Page 36: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 36/49

a complete .arc example@app hello @html get / post /likes @json get /likes @events hit-counter @scheduled daily-affirmation rate(1 day)

36

Page 37: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 37/49

Lets look at the generated cloud function code

37

Page 38: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 38/49

src/html/get-index/index.jsvar arc = require('@architect/functions') function index(req, res) { console.log(JSON.stringify(req, null, 2)) res({ html: 'hello world' }) } exports.handler = arc.html.get(index)

38

Page 39: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 39/49

src/html/post-likes/index.jsvar arc = require('@architect/functions') function likes(req, res) { // send an email or something here res({ location: '/' }) } exports.handler = arc.html.post(likes)

39

Page 40: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 40/49

src/events/hit-counter/index.jsvar arc = require('@architect/functions') function count(payload, callback) { // do a db thing here probs console.log(JSON.stringify(payload, null, 2)) callback() } exports.handler = arc.events.subscribe(count)

40

Page 41: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 41/49

src/scheduled/daily-affirmation/index.js

var arc = require('@architect/functions') function daily(payload, callback) { // idk, send an sms here maybe? console.log(JSON.stringify(payload, null, 2)) callback() } exports.handler = arc.scheduled(daily)

41

Page 42: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 42/49

src/tables/likes-update/index.jsvar arc = require('@architect/functions') function like(record, callback) { // anything you want! console.log(JSON.stringify(payload, null, 2)) callback() } exports.handler = arc.tables.update(like)

42

Page 43: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 43/49

.arc has three facets

43

Page 44: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 44/49

1. Declaritively define architecture with a high level primitives in plain text in.arc

2. Workflows to generate local code, configure, provision and deployinfrastructure

3. Cloud function code itself

44

Page 45: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 45/49

Other stuff you should know

45

Page 46: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 46/49

npm start runs code completely offline and in memorynpm run deploy ships to stagingARC_DEPLOY=production npm run deploy promotes code toproduction

Safely use the console tactically to access and admin deployed infraFormat, parser and tooling are completely open to extension

46

Page 47: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 47/49

Before .arc 1. Super long dev/depoy cycles2. Inconsistent infra leading to hard to trace bugs3. Frustration, demotivation, unhappiness and a sense of

doom

47

Page 48: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 48/49

A�er .arc 1. Dev cycles are immediate, deployments run in

secondss2. Infra is consistent, bugs are easy to trace (and

isolated!)3. Green builds and happy devs

48

Page 49: Architecture as Text - files.gotocon.com · 4/26/2018 localhost:8000/?print-pdf&showNotes=true#/  3/49 П‡¨ÐŸ‡¦ 3

4/26/2018 localhost:8000/?print-pdf&showNotes=true#/

http://localhost:8000/?print-pdf&showNotes=true#/ 49/49

arc.codes

49