Data Model

Introduction

Workload Discovery on AWS relies on AWS Config when discovering the vast majority of its resources. We will follow the modelling that Config provides and extend it to the resources that Perspective discovers using AWS SDK calls also.

Applying The Config Model

Workload Discovery on AWS uses a graph database as its persistence layer, as such the main entities we are concerned with are the vertices and the edges that describe the relationships between individual vertexes.

Vertices

Neptune allows us to label vertices, we will use the ResourceType value returned by config, which also maps to the resource type used by CloudFormation, e.g, AWS::EC2::Instance. It thus makes sense to use this CloudFormation naming scheme for Perspectives non-Config resources.

Edges

For many resource types, AWS Config also gives us information about the relationships between the resources it returns and annotates these with a relationship type, e.g., is contained in or is associated with. We will reuse these as edge labels between the vertices in the graph. We will follow the convention of labeling edge in Upper Case, e.g., `IS_CONTAINED_IN. For non-Config resources, we will follow relationship types Config provides and map them where appropriate.

Relationship Types

AWS Config

Resource Type Relationship Type Related Resource Type

AWS::ApiGateway::RestApi

CONTAINS

AWS::ApiGateway::Stage

AWS::ApiGateway::Stage

IS_CONTAINED_IN

AWS::ApiGateway::RestApi

IS_ASSOCIATED_WITH

AWS::WAF::WebACL

AWS::ApiGatewayV2::Api

CONTAINS

AWS::ApiGateway::Stage

AWS::ApiGatewayV2::Stage

IS_CONTAINED_IN

AWS::ApiGatewayV2::Api

AWS::CloudFront::Distribution

IS_ASSOCIATED_WITH

AWS::WAF::WebACL

IS_ASSOCIATED_WITH

AWS::ACM::Certificate

IS_ASSOCIATED_WITH

AWS::S3::Bucket

IS_ASSOCIATED_WITH

AWS::IAM::ServerCertificate

AWS::CloudFront::StreamingDistribution

IS_ASSOCIATED_WITH

AWS::WAF::WebACL

IS_ASSOCIATED_WITH

AWS::ACM::Certificate

IS_ASSOCIATED_WITH

AWS::S3::Bucket

IS_ASSOCIATED_WITH

AWS::IAM::ServerCertificate

AWS::EC2::Volume

IS_ATTACHED_TO

AWS::EC2::Instance

AWS::EC2::Host

CONTAINS

AWS::EC2::Instance

AWS::EC2::EIP

IS_ATTACHED_TO

AWS::EC2::Instance

AWS::EC2::Instance

CONTAINS

AWS::EC2::NetworkInterface

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ATTACHED_TO

AWS::EC2::Volume

IS_ATTACHED_TO

AWS::EC2::EIP

IS_CONTAINED_IN

AWS::EC2::Host

IS_CONTAINED_IN

AWS::EC2::RouteTable

IS_CONTAINED_IN

AWS::EC2::Subnet

IS_CONTAINED_IN

AWS::EC2::VPC

AWS::EC2::NetworkInterface

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ATTACHED_TO

AWS::EC2::EIP

IS_ATTACHED_TO

AWS::EC2::Instance

IS_CONTAINED_IN

AWS::EC2::Host

IS_CONTAINED_IN

AWS::EC2::Subnet

IS_CONTAINED_IN

AWS::EC2::VPC

AWS::EC2::SecurityGroup

IS_ASSOCIATED_WITH

AWS::EC2::Instance

IS_ASSOCIATED_WITH

AWS::EC2::NetworkInterface

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::EC2::NatGateway

IS_CONTAINED_IN

AWS::EC2::Subnet

AWS::EC2::EgressOnlyInternetGateway

IS_CONTAINED_IN

AWS::EC2::VPC

AWS::EC2::VPCEndpoint

IS_CONTAINED_IN

AWS::EC2::VPC

IS_CONTAINED_IN

AWS::EC2::Subnet

IS_ATTACHED_TO

AWS::EC2::NetworkInterface

AWS::EC2::VPCEndpointService

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancingV2::LoadBalancer

AWS::EC2::VPCPeeringConnection

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::EC2::RegisteredHAInstance

IS_ASSOCIATED_WITH

AWS::EC2::Instance

AWS::Elasticsearch::Domain

IS_ASSOCIATED_WITH

AWS::KMS::Key

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ASSOCIATED_WITH

AWS::EC2::Subnet

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::Redshift::Cluster

IS_ASSOCIATED_WITH

AWS::Redshift::ClusterParameterGroup

IS_ASSOCIATED_WITH

AWS::Redshift::ClusterSecurityGroup

IS_ASSOCIATED_WITH

AWS::Redshift::ClusterSubnetGroup

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::Redshift::ClusterSnapshot

IS_ASSOCIATED_WITH

AWS::Redshift::Cluster

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::Redshift::ClusterSubnetGroup

IS_ASSOCIATED_WITH

AWS::Redshift::Cluster

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::RDS::DBInstance

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ASSOCIATED_WITH

AWS::RDS::DBSecurityGroup

IS_ASSOCIATED_WITH

AWS::RDS::DBSubnetGroup

AWS::RDS::DBSecurityGroup

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::RDS::DBSnapshot

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::RDS::DBSubnetGroup

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::RDS::DBCluster

CONTAINS

AWS::RDS::DBInstance

IS_ASSOCIATED_WITH

AWS::RDS::DBSubnetGroup

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

AWS::RDS::DBClusterSnapshot

IS_ASSOCIATED_WITH

AWS::RDS::DBCluster

IS_ASSOCIATED_WITH

AWS::EC2::VPC

AWS::EC2::CustomerGateway

IS_ATTACHED_TO

AWS::EC2::VPNConnection

AWS::EC2::InternetGateway

IS_ATTACHED_TO

AWS::EC2::VPC

AWS::EC2::RouteTable

CONTAINS

AWS::EC2::Instance

CONTAINS

AWS::EC2::NetworkInterface

CONTAINS

AWS::EC2::Subnet

CONTAINS

AWS::EC2::VPNGateway

AWS::EC2::Subnet

CONTAINS

AWS::EC2::Instance

CONTAINS

AWS::EC2::NetworkInterface

IS_ATTACHED_TO

AWS::EC2::NetworkAcl

IS_CONTAINED_IN

AWS::EC2::RouteTable

IS_CONTAINED_IN

AWS::EC2::VPC

AWS::EC2::VPC

CONTAINS

AWS::EC2::Instance

CONTAINS

AWS::EC2::NetworkInterface

CONTAINS

AWS::EC2::NetworkAcl

CONTAINS

AWS::EC2::RouteTable

CONTAINS

AWS::EC2::Subnet

AWS::EC2::VPNConnection

IS_ATTACHED_TO

AWS::EC2::CustomerGateway

IS_ATTACHED_TO

AWS::EC2::VPNGateway

AWS::EC2::VPNGateway

IS_ATTACHED_TO

AWS::EC2::VPNConnection

IS_ATTACHED_TO

AWS::EC2::VPC

IS_CONTAINED_IN

AWS::EC2::RouteTable

AWS::AutoScaling::AutoScalingGroup

CONTAINS

AWS::EC2::Instance

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancing::LoadBalancer

IS_ASSOCIATED_WITH

AWS::AutoScaling::LaunchConfiguration

IS_ASSOCIATED_WITH

AWS::EC2::Subnet

AWS::AutoScaling::LaunchConfiguration

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

AWS::AutoScaling::ScalingPolicy

IS_ASSOCIATED_WITH

AWS::AutoScaling::AutoScalingGroup

IS_ASSOCIATED_WITH

AWS::CloudWatch::Alarm

AWS::AutoScaling::ScheduledAction

IS_ASSOCIATED_WITH

AWS::AutoScaling::AutoScalingGroup

AWS::CloudFormation::Stack

CONTAINS

AWS::*

AWS::CodeBuild::Project

IS_ASSOCIATED_WITH

AWS::S3::Bucket

IS_ASSOCIATED_WITH

AWS::IAM::Role

AWS::CodePipeline::Pipeline

IS_ATTACHED_TO

AWS::S3::Bucket

IS_ASSOCIATED_WITH

AWS::IAM::Role

IS_ASSOCIATED_WITH

AWS::CodeBuild::Project

IS_ASSOCIATED_WITH

AWS::Lambda::Function

IS_ASSOCIATED_WITH

AWS::CloudFormation::Stack

IS_ASSOCIATED_WITH

AWS::ElasticBeanstalk::Application

AWS::Config::ResourceCompliance

IS_ASSOCIATED_WITH

AWS::*

AWS::ElasticBeanstalk::Application

CONTAINS

AWS::ElasticBeanstalk::ApplicationVersion

CONTAINS

AWS::ElasticBeanstalk::Environment

CONTAINS

AWS::IAM::Role

AWS::ElasticBeanstalk::ApplicationVersion

IS_CONTAINED_IN

AWS::ElasticBeanstalk::Application

IS_ASSOCIATED_WITH

AWS::ElasticBeanstalk::Environment

IS_ASSOCIATED_WITH

AWS::S3::Bucket

AWS::ElasticBeanstalk::Environment

IS_CONTAINED_IN

AWS::ElasticBeanstalk::Application

IS_ASSOCIATED_WITH

AWS::ElasticBeanstalk::ApplicationVersion

IS_ASSOCIATED_WITH

AWS::IAM::Role

CONTAINS

AWS::CloudFormation::Stack

AWS::IAM::User

IS_ATTACHED_TO

AWS::IAM::Group

AWS::IAM::Group

CONTAINS

AWS::IAM::User

AWS::IAM::User

IS_ATTACHED_TO

AWS::IAM::Group

IS_ATTACHED_TO

AWS::IAM::User

IS_ATTACHED_TO

AWS::IAM::Role

AWS::Lambda::Function

IS_ASSOCIATED_WITH

AWS::IAM::Role

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_CONTAINED_IN

AWS::EC2::Subnet

AWS::NetworkFirewall::Firewall

IS_ATTACHED_TO

AWS::EC2::Subnet

IS_ASSOCIATED_WITH

AWS::NetworkFirewall::FirewallPolicy

AWS::NetworkFirewall::FirewallPolicy

IS_ASSOCIATED_WITH

AWS::NetworkFirewall::RuleGroup

AWS::SecretsManager::Secret

IS_ASSOCIATED_WITH

AWS::KMS::Key

IS_ASSOCIATED_WITH

AWS::Lambda::Function

AWS::ServiceCatalog::CloudFormationProduct

IS_ASSOCIATED_WITH

AWS::ServiceCatalog::CloudFormationProvisionedProduct

IS_CONTAINED_IN

AWS::ServiceCatalog::Portfolio

AWS::ServiceCatalog::CloudFormationProvisionedProduct

IS_ASSOCIATED_WITH

AWS::ServiceCatalog::Portfolio

IS_ASSOCIATED_WITH

AWS::ServiceCatalog::CloudFormationProduct

IS_ASSOCIATED_WITH

AWS::CloudFormation::Stack

AWS::ServiceCatalog::Portfolio

CONTAINS

AWS::ServiceCatalog::CloudFormationProduct

AWS::Shield::Protection

IS_ASSOCIATED_WITH

AWS::CloudFront::Distribution

AWS::ShieldRegional::Protection

IS_ASSOCIATED_WITH

AWS::EC2::EIP

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancing::LoadBalancer

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancingV2::LoadBalancer

AWS::SSM::ManagedInstanceInventory

IS_ASSOCIATED_WITH

AWS::EC2::Instance

AWS::SSM::PatchCompliance

IS_ASSOCIATED_WITH

AWS::SSM::ManagedInstanceInventory

AWS::SSM::AssociationCompliance

IS_ASSOCIATED_WITH

AWS::SSM::ManagedInstanceInventory

AWS::SSM::FileData

IS_ASSOCIATED_WITH

AWS::SSM::ManagedInstanceInventory

AWS::WAF::WebACL

IS_ASSOCIATED_WITH

AWS::WAF::Rule

IS_ASSOCIATED_WITH

AWS::WAFRegional::RateBasedRule

IS_ASSOCIATED_WITH

AWS::WAF::RuleGroup

AWS::WAF::RuleGroup

IS_ASSOCIATED_WITH

AWS::WAF::Rule

AWS::WAFRegional::WebACL

IS_ASSOCIATED_WITH

AWS::WAFRegional::Rule

IS_ASSOCIATED_WITH

AWS::WAFRegional::RateBasedRule

IS_ASSOCIATED_WITH

AWS::WAFRegional::RuleGroup

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancingV2::LoadBalancer

AWS::WAFRegional::RuleGroup

IS_ASSOCIATED_WITH

AWS::WAFRegional::Rule

AWS::WAFv2::WebACL

IS_ASSOCIATED_WITH

AWS::WAFv2::RuleGroup

IS_ASSOCIATED_WITH

AWS::WAFv2::IPSet

IS_ASSOCIATED_WITH

AWS::WAFv2::ManagedRuleSet

IS_ASSOCIATED_WITH

AWS::WAFv2::RegexPatternSet

IS_ASSOCIATED_WITH

AWS::ApiGateway::Stage

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancingV2::LoadBalancer

AWS::WAFv2::RuleGroup

IS_ASSOCIATED_WITH

AWS::WAFv2::IPSet

IS_ASSOCIATED_WITH

AWS::WAFv2::RegexPatternSet

AWS::WAFv2::ManagedRuleSet

IS_ASSOCIATED_WITH

AWS::WAFv2::RuleGroup

AWS::ElasticLoadBalancingV2::LoadBalancer

IS_CONTAINED_IN

AWS::EC2::VPC

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ATTACHED_TO

AWS::EC2::Subnet

AWS::ElasticLoadBalancing::LoadBalancer

IS_CONTAINED_IN

AWS::EC2::VPC

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ATTACHED_TO

AWS::EC2::Subnet

AWS SDK

Resource Type Relationship Type Related Resource Type

AWS::ApiGateway::RestApi

CONTAINS

AWS::ApiGateway::Resource

AWS::ApiGateway::Resource

IS_CONTAINED_IN

AWS::ApiGateway::RestApi

CONTAINS

AWS::ApiGateway::Method

AWS::ApiGateway::Method

IS_CONTAINED_IN

AWS::ApiGateway::Resource

AWS::EC2::SpotFleet

CONTAINS

AWS::EC2::Spot

AWS::EC2::Spot

IS_CONTAINED_IN

AWS::EC2::SpotFleet

IS_ASSOCIATED_WITH

AWS::EC2::Instance

AWS::ECS::Cluster

CONTAINS

AWS::ECS::Service

AWS::ECS::Service

IS_CONTAINED_IN

AWS::ECS::Cluster

CONTAINS

AWS::ECS::Task

IS_ASSOCIATED_WITH

AWS::ElasticLoadBalancingV2::LoadBalancer

IS_ASSOCIATED_WITH

AWS::EC2::SecurityGroup

IS_ASSOCIATED_WITH

AWS::IAM::Role

AWS::ECS::Task

IS_CONTAINED_IN

AWS::ECS::Service

AWS::ECS::TaskDefinition

IS_ASSOCIATED_WITH

AWS::ECS::Task

AWS::IAM::AWSManagedPolicy

IS_ASSOCIATED_WITH

AWS::IAM::Role

IS_ASSOCIATED_WITH

AWS::IAM::User

IS_ASSOCIATED_WITH

AWS::IAM::Group

AWS::Lambda::EnvironmentVariable

IS_CONTAINED_IN

AWS::Lambda::Function

AWS::Lambda::Function

CONTAINS

AWS::Lambda::EnvironmentVariable

AWS::VPC::Endpoint

IS_ASSOCIATED_WITH

AWS::EC2::NetworkInterface