5. Using C4 To Architect ACME Global Widget Production¶
Tip
See Using PlantUML Stdlib C4 Lightweight Software Architecture Description Method for explanation of C4 and PlantUML Stdlib support for it.
5.1. C4 ACME Global Widget Production¶
Your mission, if you choose to accept it, is to design the ACME Global Widget Production System.
ACME has its own production sites, and uses 3rd party production sites.
All sites are connected to a central production host
Each production site consists of several workstations
Monitoring and Analytics is in the scope of what we are creating/changing - SupplyChain and InventoryTracking are not
5.1.1. C4 ACME Context¶
5.1.1.1. Play¶
5.1.1.2. Explore¶
There was a last minute decision to put InventoryTracking in scope for the system we’re creating/changing. Update the diagram.
5.1.1.3. Source¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | @startuml
!include <C4/C4_Context.puml>
!include <office/Users/user.puml>
LAYOUT_WITH_LEGEND()
title Top level Context diagram for ACME Global Widget Production
Person(AcmeProdOwner, Acme Production Owner , "<$user> \n Responsible for Production of widgets in ACME Production Site" )
Person(3rdProdOwner, 3rdParty Production Owner , "<$user> \n Responsible for Production of widgets in 3rdParty Production Site" )
System_Boundary(Remote, "Remote") {
System(ProdSystemHost, "Production Host", "Drives widget Production\n Analyses widget Production data to create reports")
System(Analytics, "Analytics", "Provides data analysis and a dashboard view data - including relevant Production data")
System(Monitoring, "Monitoring", "Monitors Production Host\nUses AWS Services")
System_Ext(SupplyChain, "SupplyChain", "Provides parts to make the widgets")
System_Ext(InventoryTracking, "InventoryTracking", "Customer Reference")
}
Enterprise_Boundary(AcmeProd, "ACME Production Site") {
System(AcmeWorkStation1, "WorkStation1", " Production setup for a group of widgets")
System(AcmeWorkStation2, "WorkStation2", " Production setup for a group of widgets")
System(AcmeWorkStationN, "WorkStationN", " Production setup for a group of widgets")
}
Enterprise_Boundary(3rdProd, "3rdParty Production Site") {
System(3rdWorkStation1, "WorkStation1", " Production setup for a group of widgets")
System(3rdWorkStation2, "WorkStation2", " Production setup for a group of widgets")
System(3rdWorkStationN, "WorkStationN", " Production setup for a group of widgets")
}
Rel_U(AcmeWorkStation1, ProdSystemHost, "Sends Production report for widget")
Rel_U(AcmeWorkStation2, ProdSystemHost, "Sends Production report for widget")
Rel_U(AcmeWorkStationN, ProdSystemHost, "Sends Production report for widget")
Rel_U(3rdWorkStation1, ProdSystemHost, "Sends Production report for widget")
Rel_U(3rdWorkStation2, ProdSystemHost, "Sends Production report for widget")
Rel_U(3rdWorkStationN, ProdSystemHost, "Sends Production report for widget")
Rel_D(AcmeProdOwner, ProdSystemHost, "Reviews Acme and 3rdParty site Production reports")
Rel_D(3rdProdOwner, ProdSystemHost, "Reviews 3rdParty site Production reports")
Rel_D(Analytics, ProdSystemHost, "Data Analysis")
Rel_D(SupplyChain, ProdSystemHost, "Parts")
Rel_D(InventoryTracking, ProdSystemHost, "Tracking")
Rel_D(Monitoring, ProdSystemHost, "Monitoring")
footer %filename() rendered with PlantUML version %version()\nThe Hitchhiker’s Guide to PlantUML
@enduml
|
5.1.2. C4 ACME Container¶
5.1.2.1. Play¶
5.1.2.2. Explore¶
Add another hub and several Units to the Workstation PC.
5.1.2.3. Source¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | @startuml
!include <C4/C4_Context.puml>
!include <C4/C4_Container.puml>
!include <office/Users/user.puml>
LAYOUT_WITH_LEGEND()
skinparam handwritten false
title Container Diagram for ACME Widget Workstation
System_Boundary(WorkStation, "Workstation") {
Person(AcmeOperator, Operator , "<$user> \n On-site Operator who produces Widget" )
System(WorkStationPC, "WorkStation PC", "Drives the Production process. \nProvides feedback to operator. \nConnects to central Production system")
System(Hub, "Hub", "Connects Multiple Widgets")
System(Unit1, "Unit1", "Widget 1")
System(Unit2, "Unit2", "Widget 2")
System(UnitN, "UnitN", "Widget N")
}
Rel_R(AcmeOperator, WorkStationPC, "Checks Production status")
Rel_D(WorkStationPC, Hub, "Drive Production and Info Retrieval")
Rel(Hub, Unit1, "Connect")
Rel(Hub, Unit2, "Connect")
Rel(Hub, UnitN, "Connect")
footer %filename() rendered with PlantUML version %version()\nThe Hitchhiker’s Guide to PlantUML
@enduml
|
5.1.3. C4 ACME Component¶
5.1.3.1. Play¶
5.1.3.2. Source¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | @startuml
'AWS stuff here
'================================
!includeurl <aws/common.puml>
!includeurl <aws/SDKs/Java/Java.puml>
!includeurl <aws/SDKs/Nodejs/Nodejs.puml>
!includeurl <aws/General/users/users.puml>
!includeurl <aws/General/client/client.puml>
!includeurl <aws/General/AWScloud/AWScloud.puml>
!includeurl <aws/General/mobileclient/mobileclient.puml>
!includeurl <aws/Database/AmazonRDS/AmazonRDS.puml>
!includeurl <aws/Database/AmazonRDS/DBinstance/DBinstance.puml>
!includeurl <aws/Database/AmazonRDS/MySQLDBinstance/MySQLDBinstance.puml>
!includeurl <aws/Compute/AWSElasticBeanstalk/AWSElasticBeanstalk.puml>
!includeurl <aws/Compute/AWSElasticBeanstalk/deployment/deployment.puml>
!includeurl <aws/Compute/AWSElasticBeanstalk/application/application.puml>
!includeurl <aws/Compute/ElasticLoadBalancing/ApplicationLoadBalancer/ApplicationLoadBalancer.puml>
!includeurl <aws/Compute/AWSLambda/AWSLambda.puml>
!includeurl <aws/Compute/AWSLambda/LambdaFunction/LambdaFunction.puml>
!includeurl <aws/Storage/AmazonS3/AmazonS3.puml>
!includeurl <aws/Storage/AmazonS3/bucket/bucket.puml>
!includeurl <aws/Storage/AmazonGlacier/AmazonGlacier.puml>
!includeurl <aws/Storage/AmazonGlacier/archive/archive.puml>
!includeurl <aws/SecurityIdentityCompliance/AWSIAM/AWSIAM.puml>
!includeurl <aws/SecurityIdentityCompliance/IAM/permissions/permissions.puml>
!includeurl <aws/SecurityIdentityCompliance/IAM/role/role.puml>
!includeurl <aws/MobileServices/AmazonCognito/AmazonCognito.puml>
!includeurl <aws/NetworkingContentDelivery/AmazonRoute53/AmazonRoute53.puml>
!includeurl <aws/SecurityIdentityCompliance/AWSIAM/AWSIAM.puml>
!includeurl <aws/Analytics/AmazonES/AmazonES.puml>
!includeurl <aws/ManagementTools/AmazonCloudWatch/AmazonCloudWatch.puml>
'Elastic stuff here
'================================
!define ELASTIC_PUML elastic
!include <elastic/apm/apm.puml>
!include <elastic/app_search/app_search.puml>
!include <elastic/beats/beats.puml>
!include <elastic/cloud/cloud.puml>
!include <elastic/cloud_in_kubernetes/cloud_in_kubernetes.puml>
!include <elastic/code_search/code_search.puml>
!include <elastic/ece/ece.puml>
!include <elastic/eck/eck.puml>
!include <elastic/elasticsearch/elasticsearch.puml>
!include <elastic/endpoint/endpoint.puml>
!include <elastic/enterprise_search/enterprise_search.puml>
!include <elastic/kibana/kibana.puml>
!include <elastic/logging/logging.puml>
!include <elastic/logstash/logstash.puml>
!include <elastic/maps/maps.puml>
!include <elastic/metrics/metrics.puml>
!include <elastic/siem/siem.puml>
!include <elastic/site_search/site_search.puml>
!include <elastic/stack/stack.puml>
!include <elastic/uptime/uptime.puml>
'change color of selected background shape https://plantuml.com/deployment-diagram
skinparam actorBackgroundColor White
skinparam agentBackgroundColor White
skinparam artifactBackgroundColor White
skinparam boundaryBackgroundColor White
skinparam cardBackgroundColor White
skinparam cloudBackgroundColor White
skinparam componentBackgroundColor White
skinparam controlBackgroundColor White
skinparam databaseBackgroundColor White
skinparam entityBackgroundColor White
skinparam fileBackgroundColor White
skinparam folderBackgroundColor White
skinparam frameBackgroundColor White
skinparam interfaceBackgroundColor White
skinparam nodeBackgroundColor White
skinparam packageBackgroundColor White
skinparam queueBackgroundColor White
skinparam stackBackgroundColor White
skinparam rectangleBackgroundColor White
skinparam storageBackgroundColor White
skinparam usecaseBackgroundColor White
'To change background color to elastic green
'skinparam componentBackgroundColor 00BFB3
AWSCLOUD(aws) {
AMAZONS3(s3_bucket,"Logs uploaded to here")
package Elastic {
'add "node", "component", "agent" etc... to change background shape per https://plantuml.com/deployment-diagram
'default is agent
ELASTICSEARCH(ElasticSearch, "Search and Analyze",database)
LOGSTASH(Logstash, "Parse and Transform",node)
KIBANA(Kibana, "Visualize",agent)
}
s3_bucket -down-> Logstash: Raw logs
Logstash -right-> ElasticSearch: Transformed Data
ElasticSearch -right-> Kibana: Data to View
}
footer %filename() rendered with PlantUML version %version()\nThe Hitchhiker’s Guide to PlantUML
@enduml
|
5.1.3.3. Play¶
5.1.3.4. Source¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
!includeurl <aws/common>
!includeurl <aws/SDKs/Java/Java.puml>
!includeurl <aws/SDKs/Nodejs/Nodejs.puml>
!includeurl <aws/General/users/users.puml>
!includeurl <aws/General/client/client.puml>
!includeurl <aws/General/AWScloud/AWScloud.puml>
!includeurl <aws/General/mobileclient/mobileclient.puml>
!includeurl <aws/Database/AmazonRDS/AmazonRDS.puml>
!includeurl <aws/Database/AmazonRDS/DBinstance/DBinstance.puml>
!includeurl <aws/Database/AmazonRDS/MySQLDBinstance/MySQLDBinstance.puml>
!includeurl <aws/Compute/AWSElasticBeanstalk/AWSElasticBeanstalk.puml>
!includeurl <aws/Compute/AWSElasticBeanstalk/deployment/deployment.puml>
!includeurl <aws/Compute/AWSElasticBeanstalk/application/application.puml>
!includeurl <aws/Compute/ElasticLoadBalancing/ApplicationLoadBalancer/ApplicationLoadBalancer.puml>
!includeurl <aws/Compute/AWSLambda/AWSLambda.puml>
!includeurl <aws/Compute/AWSLambda/LambdaFunction/LambdaFunction.puml>
!includeurl <aws/Storage/AmazonS3/AmazonS3.puml>
!includeurl <aws/Storage/AmazonS3/bucket/bucket.puml>
!includeurl <aws/Storage/AmazonGlacier/AmazonGlacier.puml>
!includeurl <aws/Storage/AmazonGlacier/archive/archive.puml>
!includeurl <aws/SecurityIdentityCompliance/AWSIAM/AWSIAM.puml>
!includeurl <aws/SecurityIdentityCompliance/IAM/permissions/permissions.puml>
!includeurl <aws/SecurityIdentityCompliance/IAM/role/role.puml>
!includeurl <aws/MobileServices/AmazonCognito/AmazonCognito.puml>
!includeurl <aws/NetworkingContentDelivery/AmazonRoute53/AmazonRoute53.puml>
!includeurl <aws/SecurityIdentityCompliance/AWSIAM/AWSIAM.puml>
!includeurl <aws/Analytics/AmazonES/AmazonES.puml>
!includeurl <aws/ManagementTools/AmazonCloudWatch/AmazonCloudWatch.puml>
!includeurl <aws/ManagementTools/AWSCloudTrail/AWSCloudTrail.puml>
!includeurl <aws/Messaging/AmazonSNS/AmazonSNS.puml>
skinparam componentArrowColor Black
skinparam componentBackgroundColor White
skinparam nodeBackgroundColor White
skinparam agentBackgroundColor White
skinparam artifactBackgroundColor White
AWSCLOUD(awscloud){
APPLICATIONLOADBALANCER(loadbalancer, "ALB Logs")
AMAZONS3(S3, "S3 access Logs")
AWSLAMBDA(Lambda, "Lambda logs\nand metrics")
AWSCLOUDTRAIL(AWSCloudTrail, "API logs")
AMAZONCLOUDWATCH(AmazonCloudWatch)
AMAZONSNS(AmazonSNS, "Send Notifications\n to Owner/Admin")
loadbalancer --> AmazonCloudWatch
S3 --> AmazonCloudWatch
Lambda --> AmazonCloudWatch
AWSCloudTrail --> AmazonCloudWatch
AmazonCloudWatch --> AmazonSNS
}
footer %filename() rendered with PlantUML version %version()\nThe Hitchhiker’s Guide to PlantUML
@enduml
|
5.1.3.5. Explore¶
Add a component diagram for the Production Host