Skip to main content

Library to generate DRAW.IO compatible diagrams to represent Cloud infrastructure. AWS Cloud supported.

Project description

MultiCloud Diagrams is a package for generating and rendering Diagrams-As-a-Code (DAG) in popular drawio format for different Cloud providers.

Features:

  • allows to generate drawio diagram with predefined styles for popular aws services, support graph-based connection with named edges
  • supports single and batch elements append to diagram
  • duplicates detection to prevent ball of mud in file format and diagram
  • verification that both vertices present on diagram when adding edge connection between them
  • if the node is not present, fallback to default icon when rendering
  • read previous version of drawio file and reuses existing vertices coordinates when generating a new version
  • generate diagram from YAML definition
  • mix and augment Diagram-as-code, real infra crawler, static yaml-based content to diagram

Supported AWS services:

  • lambda_function
  • sqs
  • sns
  • iam_role/iam_policy/iam_permission
  • dynamo/dynamo_stream
  • api_gw
  • s3
  • kms
  • ssm

Library can be used with different approaches and even mix all of them. Samples and usage:

1. Generating AWS DynamoDB Details drawio diagram based on library, http, awscli, etc. Example based on boto3 DynamoDB response

{
        'AttributeDefinitions': [
            {
                'AttributeName': 'first',
                'AttributeType': 'S'
            },
            {
                'AttributeName': 'second',
                'AttributeType': 'N'
            },
            {
                'AttributeName': 'third',
                'AttributeType': 'B'
            },
        ],
        'TableName': 'prod-dynamo-table',
        'KeySchema': [
            {
                'AttributeName': 'string',
                'KeyType': 'HASH'
            },
        ],
        'TableSizeBytes': 123,
        'ItemCount': 123,
        'TableArn': 'arn:aws:dynamodb:eu-west-1:123456789:table/prod-dynamo-table',
        'LocalSecondaryIndexes': [{
...       
...
...
          
          'SSEDescription': {
            'Status': 'ENABLED',
            'SSEType': 'KMS',
            'KMSMasterKeyArn': 'string',
          },
          'DeletionProtectionEnabled': True
        }

output.prod.dynamo.png

2. Diagrams as a Code. DAG. Generating AWS IAM Graph from the code based on DAG declaration:

    producer_func_arn = 'arn:aws:lambda:eu-west-1:123456789:function:producer-lambda'
    metadata = {
        "CodeSize": 1234,
        "Handler": "main",
        "Layers": 0,
        "Memory": 128,
        "PackageType": "Zip",
        "Runtime": "go1.x",
        "Timeout": 30,
        "TracingConfig": "{'Mode': 'Active'}",
        "Version": "$LATEST"
    }
    mcd.add_vertex(id=producer_func_arn, node_name='producer-lambda', arn=producer_func_arn, node_type='lambda_function', metadata=metadata)
    
    consumer_func_arn = 'arn:aws:lambda:eu-west-1:123456789:function:consumer-lambda'
    mcd.add_vertex(id=consumer_func_arn, node_name='consumer-lambda', arn=consumer_func_arn, node_type='lambda_function')
    
    dynamo_arn = 'arn:aws:dynamodb:eu-west-1:123456789:table/table1'
    mcd.add_vertex(id=dynamo_arn, node_name='table1', arn=dynamo_arn, node_type='dynamo')
    
    sns_arn = 'arn:aws:sns:eu-west-1:123456789:internal.fifo'
    metadata = {
        "Owner": 123456789,
        "SubscriptionsConfirmed": 3,
        "SubscriptionsPending": 0
    }
    mcd.add_vertex(id=sns_arn, node_name='internal', arn=sns_arn, node_type='sns', metadata=metadata)
    
    sqs_arn = 'arn:aws:sqs:eu-west-1:123456789:int-eu-live-events.fifo'
    metadata = {
        "DelaySeconds": 0,
        "FifoQueue": "TRUE",
        "ReceiveMessageWaitTimeSeconds": 0,
        "SqsManagedSseEnabled": "false",
        "VisibilityTimeout": 30
    }
    mcd.add_vertex(id=sqs_arn, node_name='events', arn=sqs_arn, node_type='sqs', metadata=metadata)
    
    sqs_arn2 = 'arn:aws:sqs:eu-west-1:123456789:int-eu-live-events2.fifo'
    mcd.add_vertex(id=sqs_arn2, node_name='events2', arn=sqs_arn2, node_type='sqs')
    
    s3_arn = 'arn:aws:s3:::bucket_name/key_name'
    mcd.add_vertex(id=s3_arn, node_name='key_name', arn=s3_arn, node_type='s3')
    
    mcd.add_link(src_node_id=f'lambda_function:{producer_func_arn}', dst_node_id=f'sns:{sns_arn}')
    mcd.add_link(src_node_id=f'lambda_function:{producer_func_arn}', dst_node_id=f's3:{s3_arn}')
    mcd.add_link(src_node_id=f'sns:{sns_arn}', dst_node_id=f'sqs:{sqs_arn}')
    mcd.add_link(src_node_id=f'sns:{sns_arn}', dst_node_id=f'sqs:{sqs_arn2}')
    mcd.add_link(src_node_id=f'sqs:{sqs_arn}', dst_node_id=f'lambda_function:{consumer_func_arn}')
    mcd.add_link(src_node_id=f'lambda_function:{consumer_func_arn}', dst_node_id=f'dynamo:{dynamo_arn}')

output.prod.iam-roles.png

3. Generating Diagram from YAML source

vertices:
  - name: prod-lambda-name
    type: lambda_function
    arn: arn:aws:lambda:eu-west-1:123456789:function:prod-lambda-name
  - name: role-lambda-name
    type: iam_role
    arn: arn:aws:iam::123456789:role/prod-lambda-name
  - name: prod-cloudwatch-policy
    icon: broker
    type: iam_policy
    arn: arn:aws:iam::123456789:policy/prod-cloudwatch-policy
  - name: prod-s3-policy
    type: iam_policy
    arn: arn:aws:iam::123456789:policy/prod-s3-policy
  - name: prod-dynamodb-policy
    type: iam_policy
    arn: arn:aws:iam::123456789:policy/prod-dynamo-policy
edges:
#  1st approach src/dst are linked to yaml vertices by name
  - { src: prod-lambda-name, dst: role-lambda-name, label: HasRole, link_type: none }
  - { src: role-lambda-name, dst: prod-cloudwatch-policy, label: Allow CloudWatch logs, link_type: none }
#  2nd approach src/dst are linked by ARN (ARN can be present in same yaml, or loaded programmatically)
  - {
    src_arn: arn:aws:iam::123456789:role/prod-lambda-name,
    src_type: iam_role,
    dst_arn: arn:aws:iam::123456789:policy/prod-s3-policy,
    dst_type: iam_policy,
    label: Allow S3 access,
    link_type: none }
# 3rd approach is mixed of 1st and 2nd
  - {
    src_arn: arn:aws:iam::123456789:role/prod-lambda-name,
    src_type: iam_role,
    dst: prod-dynamodb-policy,
    label: Allow DynamoDB read access,
    link_type: none }

FYI:

OpenSource Guide, How to contribute to opensource

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

multicloud_diagrams-0.3.4.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

multicloud_diagrams-0.3.4-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file multicloud_diagrams-0.3.4.tar.gz.

File metadata

  • Download URL: multicloud_diagrams-0.3.4.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.11.2 Darwin/21.6.0

File hashes

Hashes for multicloud_diagrams-0.3.4.tar.gz
Algorithm Hash digest
SHA256 f331b3cd126ad38b9e0ecc23d0e3c465b15566d9c889e4c6c71df7cd3ae48e43
MD5 c9e6442025d80d7736754e78273674cc
BLAKE2b-256 3c4ac1c90b979197b50186b6e451cdf12bc80d0d2b8aa061ae3cd9f00aa8180b

See more details on using hashes here.

File details

Details for the file multicloud_diagrams-0.3.4-py3-none-any.whl.

File metadata

File hashes

Hashes for multicloud_diagrams-0.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8aa7adb0fc2acfc2b09758b27dabc0f554bfb41c45fd81ba8e1ecd1eb56c3347
MD5 abe1f44b166bc386732851a1e6344581
BLAKE2b-256 50d8825b5b2df5c06606aa6d950065978f5b07a50869ce4792593467a33c2c8b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page