Skip to content
This repository was archived by the owner on Aug 5, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added documentation/AWSArchitecture_GP2GP_GPCC_MHS.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
183 changes: 183 additions & 0 deletions documentation/AWSArchitecture_GP2GP_GPCC_MHS.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
@startuml

!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/master/dist
!includeurl AWSPuml/AWSCommon.puml

' Comment out the following line to create technical view
!includeurl AWSPuml/AWSSimplified.puml

!includeurl AWSPuml/ApplicationIntegration/MQ.puml
!includeurl AWSPuml/Compute/EC2ContainerRegistry.puml
!includeurl AWSPuml/Compute/EC2Instance.puml
!includeurl AWSPuml/Compute/ECSContainer1.puml
!includeurl AWSPuml/Compute/ECSService.puml
!includeurl AWSPuml/Compute/Fargate.puml
!includeurl AWSPuml/Database/DocumentDBwithMongoDBcompatibility.puml
!includeurl AWSPuml/Database/RDSPostgreSQLinstance.puml
!includeurl AWSPuml/Database/ElastiCacheForRedis.puml
!includeurl AWSPuml/GroupIcons/Cloudalt.puml
!includeurl AWSPuml/GroupIcons/Region.puml
!includeurl AWSPuml/GroupIcons/VPCSubnetPublic.puml
!includeurl AWSPuml/GroupIcons/VPCSubnetPrivate.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/Route53HostedZone.puml
!includeurl AWSPuml/ManagementAndGovernance/CloudWatch.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/APIGateway2.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/ClientVPN.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/VPCCustomerGateway.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/ELBApplicationLoadBalancer.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/ELBNetworkLoadBalancer.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/ElasticLoadBalancing.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/VPCElasticNetworkInterface.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/VPCEndpoints.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/VPCInternetGateway.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/VPCPeering.puml
!includeurl AWSPuml/NetworkingAndContentDelivery/VPCVPNGateway.puml
!includeurl AWSPuml/SecurityIdentityAndCompliance/SecretsManager.puml
!includeurl AWSPuml/Storage/SimpleStorageServiceS3.puml

' left to right direction

rectangle {
Cloudalt(aws, "AWS Cloud Architecture for GP2GP/GPCC/MHS adapters deployed in PTL", "") {
rectangle {
Region(euWest, "eu-west-2 (London) Region", "") {
rectangle "DocDB" {
DocumentDBwithMongoDBcompatibility(gp2gpDb, "GP2GP DB\n(PSS State Database)", "")
DocumentDBwithMongoDBcompatibility(stateDb, "MHS State DB\n(MHS State Database)", "")
DocumentDBwithMongoDBcompatibility(syncDb, "MHS Sync-Async DB\n(MHS Sync-Async Database)", "")
}
SimpleStorageServiceS3(containerLayerStore, "S3 Bucket", "Technology", "")
rectangle "Amazon MQ Queues" {
'MQ(pssQueues, "ueues\n(PSS Inbound/Outbound Queues)", "")
MQ(mhsQueues, "MHS Queues\n(MHS Inbound/Outbound Queues)", "")
}
CloudWatch(cw, "CloudWatch", "")
SecretsManager(secrets, "Secrets Manager", "")
Route53HostedZone(r53hz,"nhsredteam.internal.nhs.uk", "")
EC2ContainerRegistry(ecr, "Container Registry", "")

rectangle {
VPCSubnetPublic(adaptorVPC, "Adaptor VPC", "") {
rectangle {
VPCSubnetPrivate(azABC1, "Same three private subnets used for ECS Fargate Cluster", "Private subnet") {
VPCEndpoints(ep, "RDS PostgreSQL VPC Endpoint", "")
rectangle "ECR Security Group" {
VPCElasticNetworkInterface(ecrVPC, "ECR VPC Endpoint", "")
}
rectangle "MQ Security Group" {
VPCElasticNetworkInterface(mqVPC, "MQ VPC Endpoint", "")
}
VPCEndpoints(s3ep, "S3 VPC Endpoint", "")
rectangle "CloudWatch Security Group" {
VPCElasticNetworkInterface(cwep, "CloudWatch VPC Endpoint", "")
}
rectangle "Secret Manager Security Group" {
VPCElasticNetworkInterface(smep, "Secret Manager VPC Endpoint", "")
}
}
rectangle {
VPCSubnetPrivate(azABC, "Availability Zones A, B & C", "Private subnet") {
rectangle {
Fargate(fargate, "ECS Fargate Cluster", "") {
rectangle "Outbound MHS Security Group" as osg {
ECSService(oService, "Outbound MHS Fargate Service", "") {
rectangle "Outbound MHS ECS Fargate Task" {
ECSContainer1(oTask, "Outbound MHS Containers", "")
}
}
}
rectangle "Route Security Group" as rsg {
ECSService(rService, "Route Fargate Service", "") {
rectangle "Route ECS Fargate Task" {
ECSContainer1(rTask, "Route Containers", "")
}
}
}
rectangle "Inbound Mock_MHS Security Group" as isg {
ECSService(iService, "Inbound Mock_MHS Fargate Service", "") {
rectangle "Inbound Mock_MHS ECS Fargate Task" {
ECSContainer1(iTask, "Inbound Mock_MHS Containers", "")
}
}
}
rectangle "GP2GP Security Group" as psssg {
ECSService(pssService, "GP2GP ECS Fargate Service", "") {
rectangle "GP2GP ECS Fargate Task" {
ECSContainer1(gp2gpTask, "GP2GP Containers", "")
}
}
}
rectangle "GPCC Security Group" as gpccsg {
ECSService(gpccService, "GPCC ECS Fargate Service", "") {
rectangle "GPCC ECS Fargate Task" {
ECSContainer1(gpccTask, "GPCC Containers", "")
}
}
}
}
}
}
}
rectangle {
VPCSubnetPrivate(azLB, "Same three private subnets used for ECS Fargate Cluster", "Private subnet") {
rectangle "Outbound ALB Security Group" {
ELBApplicationLoadBalancer(outboundLB, "Outbound Mock_MHS Application Load Balancer", "")
}
rectangle "Route ALB Security Group" {
ELBApplicationLoadBalancer(routeLB, "Route Application Load Balancer", "")
}
rectangle "GPCC ALB Security Group" {
ELBApplicationLoadBalancer(gpccLB, "GPCC Application Load Balancer", "")
}
ELBNetworkLoadBalancer(inboundLB, "Inbound Mock_MHS Network Load Balancer", "")
ElastiCacheForRedis(redis, "SDS Cache\n(ElastiCache for Redis HA)", "")
}
}
}
}
}
}
}
}

rectangle "NHS External System" {
EC2Instance(spine, "Spine", "")
EC2Instance(gpc, "GPC", "")
EC2Instance(sds, "SDS", "")
}


rTask <--> spine
azABC1 --up--> r53hz
fargate --up--> s3ep
fargate --up--> smep
s3ep --up--> containerLayerStore
smep --up--> secrets
oTask --up--> ep
oTask --down-->routeLB
gp2gpTask --up-> mqVPC
gp2gpTask <--> gpccTask
iTask --up-> mqVPC
oTask --up-> mqVPC
gpccTask --down--> sds
gpccTask --down--> gpc

'mqVPC --up-> pssQueues
mqVPC --up-> mhsQueues
gp2gpTask --up-> ep
fargate --up--> cwep
cwep --up--> cw
fargate --up--> ecrVPC
ecrVPC --up-->ecr
routeLB --> rTask

rTask --down--> redis
ep --up--> gp2gpDb
ep --up--> stateDb
ep --up--> syncDb

iTask --up--> ep
outboundLB --up--> oTask
gpccLB --up--> gpccTask
inboundLB --up--> iTask
@enduml
Binary file added documentation/Azure-Architecture-GP2GP.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
68 changes: 68 additions & 0 deletions documentation/Azure-Architecture-GP2GP.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
@startuml
!pragma revision 1
!includeurl https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Container.puml
!define AzurePuml https://raw.githubusercontent.com/RicardoNiepel/Azure-PlantUML/master/dist

!includeurl AzurePuml/AzureCommon.puml
!includeurl AzurePuml/AzureC4Integration.puml

!includeurl AzurePuml/Containers/all.puml
!includeurl AzurePuml/Databases/AzureCosmosDb.puml
!includeurl AzurePuml/Databases/AzureRedisCache.puml
!includeurl AzurePuml/General/Azure.puml
!includeurl AzurePuml/Integration/AzureServiceBus.puml
!includeurl AzurePuml/Management/all.puml
!includeurl AzurePuml/Networking/all.puml
!includeurl AzurePuml/Compute/AzureFunction.puml
!includeurl AzurePuml/Compute/AzureVirtualMachine.puml
!includeurl AzurePuml/Security/AzureKeyVault.puml

title "Azure Architecture - GP2GP Adaptor"

LAYOUT_LEFT_RIGHT
LAYOUT_WITH_LEGEND()


Azure(azure, "Azure", "Cloud") {
AzureSubscription(azPTL, "PTL Subscription", "") {
AzureVirtualNetwork(ptlvn, "PTL VNET", "") {
}
}
AzureSubscription(az, "Adaptors Subscription", "") {
AzureVirtualNetwork(avn, "NIA Adaptors VNET", "") {
rectangle "AKS subnet" {
AzureKubernetesService(aks, "Adaptors Kubernetes Cluster", "k8s cluster") {
'agent "Lab Results Pod" as labResults #fff
agent "GP2GP Pod" as gp2gp #fff
agent "GPCC Pod" as gpcc #B88
agent "MHS-Inbound" as mhsin #ddd
agent "MHS-Outbound" as mhsout #ddd
agent "MHS-Route" as mhsroute #ddd
}
}
}
AzureCosmosDb(cosmos, "State Db", "MongoDb")
rectangle "MHS Queues" {
AzureServiceBus(mhsinq, "MHS Inbound Queue", "Internal task queue")

}
}
}
System_Ext(nhs, "NHS Systems", "Spine, SDS, GPC Connect, etc")

mhsin --left--> mhsinq : Message Received via HTTP
mhsroute <-down--> nhs : Retrieve Endpoint from SPINE to Forward Message
mhsout <--left--> mhsroute : Enqueue FHIR message
mhsinq --> gp2gp : Message Recevied from MHS-Inbound
gp2gp <--left--> gpcc : Get GPC Structure
gpcc <-> nhs : Migrate Structure Record
gp2gp <--left--> mhsout : Consume FHIR Message

gp2gp <--> cosmos
gpcc <--> cosmos
mhsout <--> cosmos
mhsin <--> cosmos

nhs <--> ptlvn

@enduml