This is page 110 of 115. Use http://codebase.md/versuscontrol/ai-infrastructure-agent?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .github
│ └── workflows
│ ├── dev-ci.yaml
│ └── release.yaml
├── .gitignore
├── cmd
│ ├── server
│ │ └── main.go
│ ├── tmp
│ │ └── main.go
│ └── web
│ └── main.go
├── config.anthropic.yaml.example
├── config.bedrock.yaml.example
├── config.gemini.yaml.example
├── config.ollama.yaml.example
├── config.openai.yaml.example
├── config.yaml
├── Dockerfile
├── docs
│ ├── _sidebar.md
│ ├── .nojekyll
│ ├── api-key-setup
│ │ ├── anthropic-api-setup.md
│ │ ├── aws-bedrock-nova-setup.md
│ │ ├── gemini-api-setup.md
│ │ ├── ollama-setup.md
│ │ └── openai-api-setup.md
│ ├── architecture
│ │ └── architecture-overview.md
│ ├── CNAME
│ ├── docs.html
│ ├── examples
│ │ ├── working-with-ec2-instance.md
│ │ └── working-with-vpc.md
│ ├── getting-started.md
│ ├── images
│ │ ├── advanced-demo.svg
│ │ ├── ai-analysis-planning.png
│ │ ├── ai-execute-planning.png
│ │ ├── ai-infrastructure-agent.svg
│ │ ├── ai-infrastructure-state.png
│ │ ├── core-components.svg
│ │ ├── ec2-00.png
│ │ ├── ec2-01.png
│ │ ├── ec2-02.png
│ │ ├── ec2-03.png
│ │ ├── ec2-04.png
│ │ ├── ec2-05.png
│ │ ├── ec2-06.png
│ │ ├── ec2-07.png
│ │ ├── pattern.879b8d77.svg
│ │ ├── simple-demo.png
│ │ ├── vpc-00.png
│ │ ├── vpc-01.png
│ │ ├── vpc-02.png
│ │ ├── vpc-03.png
│ │ ├── vpc-04.png
│ │ ├── vpc-05.png
│ │ ├── vpc-06.png
│ │ ├── vpc-07.png
│ │ ├── vpc-08.png
│ │ ├── vpc-09.png
│ │ ├── vpc-10.png
│ │ ├── vpc-11.png
│ │ ├── vpc-architecture.svg
│ │ └── web-dashboard.svg
│ ├── index.html
│ ├── installation.md
│ └── README.md
├── go.mod
├── go.sum
├── internal
│ ├── config
│ │ ├── config.go
│ │ └── loader.go
│ └── logging
│ └── logger.go
├── LICENSE
├── pkg
│ ├── adapters
│ │ ├── alb.go
│ │ ├── asg.go
│ │ ├── base.go
│ │ ├── ec2.go
│ │ ├── keypair.go
│ │ ├── rds.go
│ │ ├── security_group.go
│ │ └── vpc.go
│ ├── agent
│ │ ├── agent_capability_extractors.go
│ │ ├── agent_dependency_resolver.go
│ │ ├── agent_factory.go
│ │ ├── agent_json_processing.go
│ │ ├── agent_plan_executor.go
│ │ ├── agent_request_processor.go
│ │ ├── agent_resource_correlation.go
│ │ ├── agent_state.go
│ │ ├── agent_test.go
│ │ ├── agent_utility_helpers.go
│ │ ├── mcp_communication.go
│ │ ├── mocks
│ │ │ ├── aws_client_mock.go
│ │ │ ├── helpers.go
│ │ │ ├── mcp_integration_test.go
│ │ │ ├── mcp_server_mock.go
│ │ │ ├── state_manager_mock.go
│ │ │ └── validation.go
│ │ ├── react_plan_recovery_engine.go
│ │ ├── react_plan_utility_helpers.go
│ │ ├── resources
│ │ │ ├── field_resolver.go
│ │ │ ├── id_extractor.go
│ │ │ └── pattern_matcher.go
│ │ └── types.go
│ ├── api
│ │ ├── decision_storage.go
│ │ ├── handlers_agent.go
│ │ ├── handlers_discovery.go
│ │ ├── handlers_state.go
│ │ ├── handlers_system.go
│ │ ├── recovery_coordinator.go
│ │ ├── server.go
│ │ ├── types.go
│ │ ├── websocket_messages.go
│ │ └── websocket.go
│ ├── aws
│ │ ├── alb.go
│ │ ├── asg.go
│ │ ├── client.go
│ │ ├── ec2.go
│ │ ├── params.go
│ │ ├── rds.go
│ │ ├── security_group.go
│ │ └── vpc.go
│ ├── conflict
│ │ └── resolver.go
│ ├── discovery
│ │ └── scanner.go
│ ├── graph
│ │ ├── analyzer.go
│ │ └── manager.go
│ ├── interfaces
│ │ ├── aws_resource.go
│ │ ├── mcp_tool.go
│ │ └── state_management.go
│ ├── mcp
│ │ ├── resource_definitions.go
│ │ ├── resource_registry.go
│ │ ├── server_integration.go
│ │ ├── server.go
│ │ └── tool_manager.go
│ ├── state
│ │ └── manager.go
│ ├── tools
│ │ ├── alb_tools.go
│ │ ├── ami_tools.go
│ │ ├── asg_tools.go
│ │ ├── ec2_tools.go
│ │ ├── factory.go
│ │ ├── helpers.go
│ │ ├── keypair_tools.go
│ │ ├── networking_tools.go
│ │ ├── rds_tools.go
│ │ ├── registry.go
│ │ ├── security_group_tools.go
│ │ ├── state_tools.go
│ │ ├── vpc_tools.go
│ │ └── zone_tools.go
│ ├── types
│ │ └── mcp.go
│ └── utilities
│ └── helpers.go
├── README.md
├── scripts
│ ├── install.sh
│ └── run-web-ui.sh
├── settings
│ ├── field-mappings-enhanced.yaml
│ ├── resource-extraction-enhanced.yaml
│ ├── resource-patterns-enhanced.yaml
│ └── templates
│ ├── decision-plan-prompt-optimized.txt
│ ├── recovery-prompt-optimized.txt
│ └── tools-execution-context-optimized.txt
└── web
└── build
├── ai-infrastructure-agent.svg
├── asset-manifest.json
├── aws-service-icons
│ ├── .DS_Store
│ ├── analytics
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Athena_16.png
│ │ │ ├── Arch_Amazon-Athena_16.svg
│ │ │ ├── Arch_Amazon-CloudSearch_16.png
│ │ │ ├── Arch_Amazon-CloudSearch_16.svg
│ │ │ ├── Arch_Amazon-Data-Firehose_16.png
│ │ │ ├── Arch_Amazon-Data-Firehose_16.svg
│ │ │ ├── Arch_Amazon-DataZone_16.png
│ │ │ ├── Arch_Amazon-DataZone_16.svg
│ │ │ ├── Arch_Amazon-EMR_16.png
│ │ │ ├── Arch_Amazon-EMR_16.svg
│ │ │ ├── Arch_Amazon-FinSpace_16.png
│ │ │ ├── Arch_Amazon-FinSpace_16.svg
│ │ │ ├── Arch_Amazon-Kinesis_16.png
│ │ │ ├── Arch_Amazon-Kinesis_16.svg
│ │ │ ├── Arch_Amazon-Kinesis-Data-Streams_16.png
│ │ │ ├── Arch_Amazon-Kinesis-Data-Streams_16.svg
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_16.png
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_16.svg
│ │ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_16.png
│ │ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_16.svg
│ │ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_16.png
│ │ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_16.svg
│ │ │ ├── Arch_Amazon-OpenSearch-Service_16.png
│ │ │ ├── Arch_Amazon-OpenSearch-Service_16.svg
│ │ │ ├── Arch_Amazon-QuickSight_16.png
│ │ │ ├── Arch_Amazon-QuickSight_16.svg
│ │ │ ├── Arch_Amazon-Redshift_16.png
│ │ │ ├── Arch_Amazon-Redshift_16.svg
│ │ │ ├── Arch_Amazon-SageMaker_16.png
│ │ │ ├── Arch_Amazon-SageMaker_16.svg
│ │ │ ├── Arch_AWS-Clean-Rooms_16.png
│ │ │ ├── Arch_AWS-Clean-Rooms_16.svg
│ │ │ ├── Arch_AWS-Data-Exchange_16.png
│ │ │ ├── Arch_AWS-Data-Exchange_16.svg
│ │ │ ├── Arch_AWS-Entity-Resolution_16.png
│ │ │ ├── Arch_AWS-Entity-Resolution_16.svg
│ │ │ ├── Arch_AWS-Glue_16.png
│ │ │ ├── Arch_AWS-Glue_16.svg
│ │ │ ├── Arch_AWS-Glue-DataBrew_16.png
│ │ │ ├── Arch_AWS-Glue-DataBrew_16.svg
│ │ │ ├── Arch_AWS-Lake-Formation_16.png
│ │ │ └── Arch_AWS-Lake-Formation_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Athena_32.png
│ │ │ ├── Arch_Amazon-Athena_32.svg
│ │ │ ├── Arch_Amazon-CloudSearch_32.png
│ │ │ ├── Arch_Amazon-CloudSearch_32.svg
│ │ │ ├── Arch_Amazon-Data-Firehose_32.png
│ │ │ ├── Arch_Amazon-Data-Firehose_32.svg
│ │ │ ├── Arch_Amazon-DataZone_32.png
│ │ │ ├── Arch_Amazon-DataZone_32.svg
│ │ │ ├── Arch_Amazon-EMR_32.png
│ │ │ ├── Arch_Amazon-EMR_32.svg
│ │ │ ├── Arch_Amazon-FinSpace_32.png
│ │ │ ├── Arch_Amazon-FinSpace_32.svg
│ │ │ ├── Arch_Amazon-Kinesis_32.png
│ │ │ ├── Arch_Amazon-Kinesis_32.svg
│ │ │ ├── Arch_Amazon-Kinesis-Data-Streams_32.png
│ │ │ ├── Arch_Amazon-Kinesis-Data-Streams_32.svg
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_32.png
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_32.svg
│ │ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_32.png
│ │ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_32.svg
│ │ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_32.png
│ │ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_32.svg
│ │ │ ├── Arch_Amazon-OpenSearch-Service_32.png
│ │ │ ├── Arch_Amazon-OpenSearch-Service_32.svg
│ │ │ ├── Arch_Amazon-QuickSight_32.png
│ │ │ ├── Arch_Amazon-QuickSight_32.svg
│ │ │ ├── Arch_Amazon-Redshift_32.png
│ │ │ ├── Arch_Amazon-Redshift_32.svg
│ │ │ ├── Arch_Amazon-SageMaker_32.png
│ │ │ ├── Arch_Amazon-SageMaker_32.svg
│ │ │ ├── Arch_AWS-Clean-Rooms_32.png
│ │ │ ├── Arch_AWS-Clean-Rooms_32.svg
│ │ │ ├── Arch_AWS-Data-Exchange_32.png
│ │ │ ├── Arch_AWS-Data-Exchange_32.svg
│ │ │ ├── Arch_AWS-Entity-Resolution_32.png
│ │ │ ├── Arch_AWS-Entity-Resolution_32.svg
│ │ │ ├── Arch_AWS-Glue_32.png
│ │ │ ├── Arch_AWS-Glue_32.svg
│ │ │ ├── Arch_AWS-Glue-DataBrew_32.png
│ │ │ ├── Arch_AWS-Glue-DataBrew_32.svg
│ │ │ ├── Arch_AWS-Lake-Formation_32.png
│ │ │ └── Arch_AWS-Lake-Formation_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Athena_48.png
│ │ │ ├── Arch_Amazon-Athena_48.svg
│ │ │ ├── Arch_Amazon-CloudSearch_48.png
│ │ │ ├── Arch_Amazon-CloudSearch_48.svg
│ │ │ ├── Arch_Amazon-Data-Firehose_48.png
│ │ │ ├── Arch_Amazon-Data-Firehose_48.svg
│ │ │ ├── Arch_Amazon-DataZone_48.png
│ │ │ ├── Arch_Amazon-DataZone_48.svg
│ │ │ ├── Arch_Amazon-EMR_48.png
│ │ │ ├── Arch_Amazon-EMR_48.svg
│ │ │ ├── Arch_Amazon-FinSpace_48.png
│ │ │ ├── Arch_Amazon-FinSpace_48.svg
│ │ │ ├── Arch_Amazon-Kinesis_48.png
│ │ │ ├── Arch_Amazon-Kinesis_48.svg
│ │ │ ├── Arch_Amazon-Kinesis-Data-Streams_48.png
│ │ │ ├── Arch_Amazon-Kinesis-Data-Streams_48.svg
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_48.png
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_48.svg
│ │ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_48.png
│ │ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_48.svg
│ │ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_48.png
│ │ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_48.svg
│ │ │ ├── Arch_Amazon-OpenSearch-Service_48.png
│ │ │ ├── Arch_Amazon-OpenSearch-Service_48.svg
│ │ │ ├── Arch_Amazon-QuickSight_48.png
│ │ │ ├── Arch_Amazon-QuickSight_48.svg
│ │ │ ├── Arch_Amazon-Redshift_48.png
│ │ │ ├── Arch_Amazon-Redshift_48.svg
│ │ │ ├── Arch_Amazon-SageMaker_48.png
│ │ │ ├── Arch_Amazon-SageMaker_48.svg
│ │ │ ├── Arch_AWS-Clean-Rooms_48.png
│ │ │ ├── Arch_AWS-Clean-Rooms_48.svg
│ │ │ ├── Arch_AWS-Data-Exchange_48.png
│ │ │ ├── Arch_AWS-Data-Exchange_48.svg
│ │ │ ├── Arch_AWS-Entity-Resolution_48.png
│ │ │ ├── Arch_AWS-Entity-Resolution_48.svg
│ │ │ ├── Arch_AWS-Glue_48.png
│ │ │ ├── Arch_AWS-Glue_48.svg
│ │ │ ├── Arch_AWS-Glue-DataBrew_48.png
│ │ │ ├── Arch_AWS-Glue-DataBrew_48.svg
│ │ │ ├── Arch_AWS-Lake-Formation_48.png
│ │ │ └── Arch_AWS-Lake-Formation_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-Athena_64.png
│ │ ├── Arch_Amazon-Athena_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-CloudSearch_64.png
│ │ ├── Arch_Amazon-CloudSearch_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Data-Firehose_64.png
│ │ ├── Arch_Amazon-Data-Firehose_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-DataZone_64.png
│ │ ├── Arch_Amazon-DataZone_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EMR_64.png
│ │ ├── Arch_Amazon-EMR_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-FinSpace_64.png
│ │ ├── Arch_Amazon-FinSpace_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Kinesis_64.png
│ │ ├── Arch_Amazon-Kinesis_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Kinesis-Data-Streams_64.png
│ │ ├── Arch_Amazon-Kinesis-Data-Streams_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Kinesis-Video-Streams_64.png
│ │ ├── Arch_Amazon-Kinesis-Video-Streams_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_64.png
│ │ ├── Arch_Amazon-Managed-Service-for-Apache-Flink_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_64.png
│ │ ├── Arch_Amazon-Managed-Streaming-for-Apache-Kafka_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-OpenSearch-Service_64.png
│ │ ├── Arch_Amazon-OpenSearch-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-QuickSight_64.png
│ │ ├── Arch_Amazon-QuickSight_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Redshift_64.png
│ │ ├── Arch_Amazon-Redshift_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-SageMaker_64.png
│ │ ├── Arch_Amazon-SageMaker_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Clean-Rooms_64.png
│ │ ├── Arch_AWS-Clean-Rooms_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Data-Exchange_64.png
│ │ ├── Arch_AWS-Data-Exchange_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Entity-Resolution_64.png
│ │ ├── Arch_AWS-Entity-Resolution_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Glue_64.png
│ │ ├── Arch_AWS-Glue_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Glue-DataBrew_64.png
│ │ ├── Arch_AWS-Glue-DataBrew_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Lake-Formation_64.png
│ │ ├── Arch_AWS-Lake-Formation_64.svg
│ │ └── [email protected]
│ ├── app-integration
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-AppFlow_16.png
│ │ │ ├── Arch_Amazon-AppFlow_16.svg
│ │ │ ├── Arch_Amazon-EventBridge_16.png
│ │ │ ├── Arch_Amazon-EventBridge_16.svg
│ │ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_16.png
│ │ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_16.svg
│ │ │ ├── Arch_Amazon-MQ_16.png
│ │ │ ├── Arch_Amazon-MQ_16.svg
│ │ │ ├── Arch_Amazon-Simple-Notification-Service_16.png
│ │ │ ├── Arch_Amazon-Simple-Notification-Service_16.svg
│ │ │ ├── Arch_Amazon-Simple-Queue-Service_16.png
│ │ │ ├── Arch_Amazon-Simple-Queue-Service_16.svg
│ │ │ ├── Arch_AWS-AppSync_16.png
│ │ │ ├── Arch_AWS-AppSync_16.svg
│ │ │ ├── Arch_AWS-B2B-Data-Interchange_16.png
│ │ │ ├── Arch_AWS-B2B-Data-Interchange_16.svg
│ │ │ ├── Arch_AWS-Express-Workflows_16.png
│ │ │ ├── Arch_AWS-Express-Workflows_16.svg
│ │ │ ├── Arch_AWS-Step-Functions_16.png
│ │ │ └── Arch_AWS-Step-Functions_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-AppFlow_32.png
│ │ │ ├── Arch_Amazon-AppFlow_32.svg
│ │ │ ├── Arch_Amazon-EventBridge_32.png
│ │ │ ├── Arch_Amazon-EventBridge_32.svg
│ │ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_32.png
│ │ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_32.svg
│ │ │ ├── Arch_Amazon-MQ_32.png
│ │ │ ├── Arch_Amazon-MQ_32.svg
│ │ │ ├── Arch_Amazon-Simple-Notification-Service_32.png
│ │ │ ├── Arch_Amazon-Simple-Notification-Service_32.svg
│ │ │ ├── Arch_Amazon-Simple-Queue-Service_32.png
│ │ │ ├── Arch_Amazon-Simple-Queue-Service_32.svg
│ │ │ ├── Arch_AWS-AppSync_32.png
│ │ │ ├── Arch_AWS-AppSync_32.svg
│ │ │ ├── Arch_AWS-B2B-Data-Interchange_32.png
│ │ │ ├── Arch_AWS-B2B-Data-Interchange_32.svg
│ │ │ ├── Arch_AWS-Express-Workflows_32.png
│ │ │ ├── Arch_AWS-Express-Workflows_32.svg
│ │ │ ├── Arch_AWS-Step-Functions_32.png
│ │ │ └── Arch_AWS-Step-Functions_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-AppFlow_48.png
│ │ │ ├── Arch_Amazon-AppFlow_48.svg
│ │ │ ├── Arch_Amazon-EventBridge_48.png
│ │ │ ├── Arch_Amazon-EventBridge_48.svg
│ │ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_48.png
│ │ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_48.svg
│ │ │ ├── Arch_Amazon-MQ_48.png
│ │ │ ├── Arch_Amazon-MQ_48.svg
│ │ │ ├── Arch_Amazon-Simple-Notification-Service_48.png
│ │ │ ├── Arch_Amazon-Simple-Notification-Service_48.svg
│ │ │ ├── Arch_Amazon-Simple-Queue-Service_48.png
│ │ │ ├── Arch_Amazon-Simple-Queue-Service_48.svg
│ │ │ ├── Arch_AWS-AppSync_48.png
│ │ │ ├── Arch_AWS-AppSync_48.svg
│ │ │ ├── Arch_AWS-B2B-Data-Interchange_48.png
│ │ │ ├── Arch_AWS-B2B-Data-Interchange_48.svg
│ │ │ ├── Arch_AWS-Express-Workflows_48.png
│ │ │ ├── Arch_AWS-Express-Workflows_48.svg
│ │ │ ├── Arch_AWS-Step-Functions_48.png
│ │ │ └── Arch_AWS-Step-Functions_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-AppFlow_64.png
│ │ ├── Arch_Amazon-AppFlow_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EventBridge_64.png
│ │ ├── Arch_Amazon-EventBridge_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_64.png
│ │ ├── Arch_Amazon-Managed-Workflows-for-Apache-Airflow_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-MQ_64.png
│ │ ├── Arch_Amazon-MQ_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Simple-Notification-Service_64.png
│ │ ├── Arch_Amazon-Simple-Notification-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Simple-Queue-Service_64.png
│ │ ├── Arch_Amazon-Simple-Queue-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-AppSync_64.png
│ │ ├── Arch_AWS-AppSync_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-B2B-Data-Interchange_64.png
│ │ ├── Arch_AWS-B2B-Data-Interchange_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Express-Workflows_64.png
│ │ ├── Arch_AWS-Express-Workflows_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Step-Functions_64.png
│ │ ├── Arch_AWS-Step-Functions_64.svg
│ │ └── [email protected]
│ ├── artificial-intelligence
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Augmented-AI-A2I_16.png
│ │ │ ├── Arch_Amazon-Augmented-AI-A2I_16.svg
│ │ │ ├── Arch_Amazon-Bedrock_16.png
│ │ │ ├── Arch_Amazon-Bedrock_16.svg
│ │ │ ├── Arch_Amazon-CodeGuru_16.png
│ │ │ ├── Arch_Amazon-CodeGuru_16.svg
│ │ │ ├── Arch_Amazon-CodeWhisperer_16.png
│ │ │ ├── Arch_Amazon-CodeWhisperer_16.svg
│ │ │ ├── Arch_Amazon-Comprehend_16.png
│ │ │ ├── Arch_Amazon-Comprehend_16.svg
│ │ │ ├── Arch_Amazon-Comprehend-Medical_16.png
│ │ │ ├── Arch_Amazon-Comprehend-Medical_16.svg
│ │ │ ├── Arch_Amazon-DevOps-Guru_16.png
│ │ │ ├── Arch_Amazon-DevOps-Guru_16.svg
│ │ │ ├── Arch_Amazon-Elastic-Inference_16.png
│ │ │ ├── Arch_Amazon-Elastic-Inference_16.svg
│ │ │ ├── Arch_Amazon-Forecast_16.png
│ │ │ ├── Arch_Amazon-Forecast_16.svg
│ │ │ ├── Arch_Amazon-Fraud-Detector_16.png
│ │ │ ├── Arch_Amazon-Fraud-Detector_16.svg
│ │ │ ├── Arch_Amazon-Kendra_16.png
│ │ │ ├── Arch_Amazon-Kendra_16.svg
│ │ │ ├── Arch_Amazon-Lex_16.png
│ │ │ ├── Arch_Amazon-Lex_16.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Equipment_16.png
│ │ │ ├── Arch_Amazon-Lookout-for-Equipment_16.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Metrics_16.png
│ │ │ ├── Arch_Amazon-Lookout-for-Metrics_16.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Vision_16.png
│ │ │ ├── Arch_Amazon-Lookout-for-Vision_16.svg
│ │ │ ├── Arch_Amazon-Monitron_16.png
│ │ │ ├── Arch_Amazon-Monitron_16.svg
│ │ │ ├── Arch_Amazon-Nova_16.png
│ │ │ ├── Arch_Amazon-Nova_16.svg
│ │ │ ├── Arch_Amazon-Personalize_16.png
│ │ │ ├── Arch_Amazon-Personalize_16.svg
│ │ │ ├── Arch_Amazon-Polly_16.png
│ │ │ ├── Arch_Amazon-Polly_16.svg
│ │ │ ├── Arch_Amazon-Q_16.png
│ │ │ ├── Arch_Amazon-Q_16.svg
│ │ │ ├── Arch_Amazon-Rekognition_16.png
│ │ │ ├── Arch_Amazon-Rekognition_16.svg
│ │ │ ├── Arch_Amazon-SageMaker-AI_16.png
│ │ │ ├── Arch_Amazon-SageMaker-AI_16.svg
│ │ │ ├── Arch_Amazon-SageMaker-Ground-Truth_16.png
│ │ │ ├── Arch_Amazon-SageMaker-Ground-Truth_16.svg
│ │ │ ├── Arch_Amazon-SageMaker-Studio-Lab_16.png
│ │ │ ├── Arch_Amazon-SageMaker-Studio-Lab_16.svg
│ │ │ ├── Arch_Amazon-Textract_16.png
│ │ │ ├── Arch_Amazon-Textract_16.svg
│ │ │ ├── Arch_Amazon-Transcribe_16.png
│ │ │ ├── Arch_Amazon-Transcribe_16.svg
│ │ │ ├── Arch_Amazon-Translate_16.png
│ │ │ ├── Arch_Amazon-Translate_16.svg
│ │ │ ├── Arch_Apache-MXNet-on-AWS_16.png
│ │ │ ├── Arch_Apache-MXNet-on-AWS_16.svg
│ │ │ ├── Arch_AWS-App-Studio_16.png
│ │ │ ├── Arch_AWS-App-Studio_16.svg
│ │ │ ├── Arch_AWS-Deep-Learning-AMIs_16.png
│ │ │ ├── Arch_AWS-Deep-Learning-AMIs_16.svg
│ │ │ ├── Arch_AWS-Deep-Learning-Containers_16.png
│ │ │ ├── Arch_AWS-Deep-Learning-Containers_16.svg
│ │ │ ├── Arch_AWS-DeepComposer_16.png
│ │ │ ├── Arch_AWS-DeepComposer_16.svg
│ │ │ ├── Arch_AWS-DeepRacer_16.png
│ │ │ ├── Arch_AWS-DeepRacer_16.svg
│ │ │ ├── Arch_AWS-HealthImaging_16.png
│ │ │ ├── Arch_AWS-HealthImaging_16.svg
│ │ │ ├── Arch_AWS-HealthLake_16.png
│ │ │ ├── Arch_AWS-HealthLake_16.svg
│ │ │ ├── Arch_AWS-HealthOmics_16.png
│ │ │ ├── Arch_AWS-HealthOmics_16.svg
│ │ │ ├── Arch_AWS-HealthScribe_16.png
│ │ │ ├── Arch_AWS-HealthScribe_16.svg
│ │ │ ├── Arch_AWS-Neuron_16.png
│ │ │ ├── Arch_AWS-Neuron_16.svg
│ │ │ ├── Arch_AWS-Panorama_16.png
│ │ │ ├── Arch_AWS-Panorama_16.svg
│ │ │ ├── Arch_PyTorch-on-AWS_16.png
│ │ │ ├── Arch_PyTorch-on-AWS_16.svg
│ │ │ ├── Arch_TensorFlow-on-AWS_16.png
│ │ │ └── Arch_TensorFlow-on-AWS_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Augmented-AI-A2I_32.png
│ │ │ ├── Arch_Amazon-Augmented-AI-A2I_32.svg
│ │ │ ├── Arch_Amazon-Bedrock_32.png
│ │ │ ├── Arch_Amazon-Bedrock_32.svg
│ │ │ ├── Arch_Amazon-CodeGuru_32.png
│ │ │ ├── Arch_Amazon-CodeGuru_32.svg
│ │ │ ├── Arch_Amazon-CodeWhisperer_32.png
│ │ │ ├── Arch_Amazon-CodeWhisperer_32.svg
│ │ │ ├── Arch_Amazon-Comprehend_32.png
│ │ │ ├── Arch_Amazon-Comprehend_32.svg
│ │ │ ├── Arch_Amazon-Comprehend-Medical_32.png
│ │ │ ├── Arch_Amazon-Comprehend-Medical_32.svg
│ │ │ ├── Arch_Amazon-DevOps-Guru_32.png
│ │ │ ├── Arch_Amazon-DevOps-Guru_32.svg
│ │ │ ├── Arch_Amazon-Elastic-Inference_32.png
│ │ │ ├── Arch_Amazon-Elastic-Inference_32.svg
│ │ │ ├── Arch_Amazon-Forecast_32.png
│ │ │ ├── Arch_Amazon-Forecast_32.svg
│ │ │ ├── Arch_Amazon-Fraud-Detector_32.png
│ │ │ ├── Arch_Amazon-Fraud-Detector_32.svg
│ │ │ ├── Arch_Amazon-Kendra_32.png
│ │ │ ├── Arch_Amazon-Kendra_32.svg
│ │ │ ├── Arch_Amazon-Lex_32.png
│ │ │ ├── Arch_Amazon-Lex_32.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Equipment_32.png
│ │ │ ├── Arch_Amazon-Lookout-for-Equipment_32.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Metrics_32.png
│ │ │ ├── Arch_Amazon-Lookout-for-Metrics_32.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Vision_32.png
│ │ │ ├── Arch_Amazon-Lookout-for-Vision_32.svg
│ │ │ ├── Arch_Amazon-Monitron_32.png
│ │ │ ├── Arch_Amazon-Monitron_32.svg
│ │ │ ├── Arch_Amazon-Nova_32.png
│ │ │ ├── Arch_Amazon-Nova_32.svg
│ │ │ ├── Arch_Amazon-Personalize_32.png
│ │ │ ├── Arch_Amazon-Personalize_32.svg
│ │ │ ├── Arch_Amazon-Polly_32.png
│ │ │ ├── Arch_Amazon-Polly_32.svg
│ │ │ ├── Arch_Amazon-Q_32.png
│ │ │ ├── Arch_Amazon-Q_32.svg
│ │ │ ├── Arch_Amazon-Rekognition_32.png
│ │ │ ├── Arch_Amazon-Rekognition_32.svg
│ │ │ ├── Arch_Amazon-SageMaker-AI_32.png
│ │ │ ├── Arch_Amazon-SageMaker-AI_32.svg
│ │ │ ├── Arch_Amazon-SageMaker-Ground-Truth_32.png
│ │ │ ├── Arch_Amazon-SageMaker-Ground-Truth_32.svg
│ │ │ ├── Arch_Amazon-SageMaker-Studio-Lab_32.png
│ │ │ ├── Arch_Amazon-SageMaker-Studio-Lab_32.svg
│ │ │ ├── Arch_Amazon-Textract_32.png
│ │ │ ├── Arch_Amazon-Textract_32.svg
│ │ │ ├── Arch_Amazon-Transcribe_32.png
│ │ │ ├── Arch_Amazon-Transcribe_32.svg
│ │ │ ├── Arch_Amazon-Translate_32.png
│ │ │ ├── Arch_Amazon-Translate_32.svg
│ │ │ ├── Arch_Apache-MXNet-on-AWS_32.png
│ │ │ ├── Arch_Apache-MXNet-on-AWS_32.svg
│ │ │ ├── Arch_AWS-App-Studio_32.png
│ │ │ ├── Arch_AWS-App-Studio_32.svg
│ │ │ ├── Arch_AWS-Deep-Learning-AMIs_32.png
│ │ │ ├── Arch_AWS-Deep-Learning-AMIs_32.svg
│ │ │ ├── Arch_AWS-Deep-Learning-Containers_32.png
│ │ │ ├── Arch_AWS-Deep-Learning-Containers_32.svg
│ │ │ ├── Arch_AWS-DeepComposer_32.png
│ │ │ ├── Arch_AWS-DeepComposer_32.svg
│ │ │ ├── Arch_AWS-DeepRacer_32.png
│ │ │ ├── Arch_AWS-DeepRacer_32.svg
│ │ │ ├── Arch_AWS-HealthImaging_32.png
│ │ │ ├── Arch_AWS-HealthImaging_32.svg
│ │ │ ├── Arch_AWS-HealthLake_32.png
│ │ │ ├── Arch_AWS-HealthLake_32.svg
│ │ │ ├── Arch_AWS-HealthOmics_32.png
│ │ │ ├── Arch_AWS-HealthOmics_32.svg
│ │ │ ├── Arch_AWS-HealthScribe_32.png
│ │ │ ├── Arch_AWS-HealthScribe_32.svg
│ │ │ ├── Arch_AWS-Neuron_32.png
│ │ │ ├── Arch_AWS-Neuron_32.svg
│ │ │ ├── Arch_AWS-Panorama_32.png
│ │ │ ├── Arch_AWS-Panorama_32.svg
│ │ │ ├── Arch_PyTorch-on-AWS_32.png
│ │ │ ├── Arch_PyTorch-on-AWS_32.svg
│ │ │ ├── Arch_TensorFlow-on-AWS_32.png
│ │ │ └── Arch_TensorFlow-on-AWS_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Augmented-AI-A2I_48.png
│ │ │ ├── Arch_Amazon-Augmented-AI-A2I_48.svg
│ │ │ ├── Arch_Amazon-Bedrock_48.png
│ │ │ ├── Arch_Amazon-Bedrock_48.svg
│ │ │ ├── Arch_Amazon-CodeGuru_48.png
│ │ │ ├── Arch_Amazon-CodeGuru_48.svg
│ │ │ ├── Arch_Amazon-CodeWhisperer_48.png
│ │ │ ├── Arch_Amazon-CodeWhisperer_48.svg
│ │ │ ├── Arch_Amazon-Comprehend_48.png
│ │ │ ├── Arch_Amazon-Comprehend_48.svg
│ │ │ ├── Arch_Amazon-Comprehend-Medical_48.png
│ │ │ ├── Arch_Amazon-Comprehend-Medical_48.svg
│ │ │ ├── Arch_Amazon-DevOps-Guru_48.png
│ │ │ ├── Arch_Amazon-DevOps-Guru_48.svg
│ │ │ ├── Arch_Amazon-Elastic-Inference_48.png
│ │ │ ├── Arch_Amazon-Elastic-Inference_48.svg
│ │ │ ├── Arch_Amazon-Forecast_48.png
│ │ │ ├── Arch_Amazon-Forecast_48.svg
│ │ │ ├── Arch_Amazon-Fraud-Detector_48.png
│ │ │ ├── Arch_Amazon-Fraud-Detector_48.svg
│ │ │ ├── Arch_Amazon-Kendra_48.png
│ │ │ ├── Arch_Amazon-Kendra_48.svg
│ │ │ ├── Arch_Amazon-Lex_48.png
│ │ │ ├── Arch_Amazon-Lex_48.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Equipment_48.png
│ │ │ ├── Arch_Amazon-Lookout-for-Equipment_48.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Metrics_48.png
│ │ │ ├── Arch_Amazon-Lookout-for-Metrics_48.svg
│ │ │ ├── Arch_Amazon-Lookout-for-Vision_48.png
│ │ │ ├── Arch_Amazon-Lookout-for-Vision_48.svg
│ │ │ ├── Arch_Amazon-Monitron_48.png
│ │ │ ├── Arch_Amazon-Monitron_48.svg
│ │ │ ├── Arch_Amazon-Nova_48.png
│ │ │ ├── Arch_Amazon-Nova_48.svg
│ │ │ ├── Arch_Amazon-Personalize_48.png
│ │ │ ├── Arch_Amazon-Personalize_48.svg
│ │ │ ├── Arch_Amazon-Polly_48.png
│ │ │ ├── Arch_Amazon-Polly_48.svg
│ │ │ ├── Arch_Amazon-Q_48.png
│ │ │ ├── Arch_Amazon-Q_48.svg
│ │ │ ├── Arch_Amazon-Rekognition_48.png
│ │ │ ├── Arch_Amazon-Rekognition_48.svg
│ │ │ ├── Arch_Amazon-SageMaker-AI_48.png
│ │ │ ├── Arch_Amazon-SageMaker-AI_48.svg
│ │ │ ├── Arch_Amazon-SageMaker-Ground-Truth_48.png
│ │ │ ├── Arch_Amazon-SageMaker-Ground-Truth_48.svg
│ │ │ ├── Arch_Amazon-SageMaker-Studio-Lab_48.png
│ │ │ ├── Arch_Amazon-SageMaker-Studio-Lab_48.svg
│ │ │ ├── Arch_Amazon-Textract_48.png
│ │ │ ├── Arch_Amazon-Textract_48.svg
│ │ │ ├── Arch_Amazon-Transcribe_48.png
│ │ │ ├── Arch_Amazon-Transcribe_48.svg
│ │ │ ├── Arch_Amazon-Translate_48.png
│ │ │ ├── Arch_Amazon-Translate_48.svg
│ │ │ ├── Arch_Apache-MXNet-on-AWS_48.png
│ │ │ ├── Arch_Apache-MXNet-on-AWS_48.svg
│ │ │ ├── Arch_AWS-App-Studio_48.png
│ │ │ ├── Arch_AWS-App-Studio_48.svg
│ │ │ ├── Arch_AWS-Deep-Learning-AMIs_48.png
│ │ │ ├── Arch_AWS-Deep-Learning-AMIs_48.svg
│ │ │ ├── Arch_AWS-Deep-Learning-Containers_48.png
│ │ │ ├── Arch_AWS-Deep-Learning-Containers_48.svg
│ │ │ ├── Arch_AWS-DeepComposer_48.png
│ │ │ ├── Arch_AWS-DeepComposer_48.svg
│ │ │ ├── Arch_AWS-DeepRacer_48.png
│ │ │ ├── Arch_AWS-DeepRacer_48.svg
│ │ │ ├── Arch_AWS-HealthImaging_48.png
│ │ │ ├── Arch_AWS-HealthImaging_48.svg
│ │ │ ├── Arch_AWS-HealthLake_48.png
│ │ │ ├── Arch_AWS-HealthLake_48.svg
│ │ │ ├── Arch_AWS-HealthOmics_48.png
│ │ │ ├── Arch_AWS-HealthOmics_48.svg
│ │ │ ├── Arch_AWS-HealthScribe_48.png
│ │ │ ├── Arch_AWS-HealthScribe_48.svg
│ │ │ ├── Arch_AWS-Neuron_48.png
│ │ │ ├── Arch_AWS-Neuron_48.svg
│ │ │ ├── Arch_AWS-Panorama_48.png
│ │ │ ├── Arch_AWS-Panorama_48.svg
│ │ │ ├── Arch_PyTorch-on-AWS_48.png
│ │ │ ├── Arch_PyTorch-on-AWS_48.svg
│ │ │ ├── Arch_TensorFlow-on-AWS_48.png
│ │ │ └── Arch_TensorFlow-on-AWS_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-Augmented-AI-A2I_64.png
│ │ ├── Arch_Amazon-Augmented-AI-A2I_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Bedrock_64.png
│ │ ├── Arch_Amazon-Bedrock_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-CodeGuru_64.png
│ │ ├── Arch_Amazon-CodeGuru_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-CodeWhisperer_64.png
│ │ ├── Arch_Amazon-CodeWhisperer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Comprehend_64.png
│ │ ├── Arch_Amazon-Comprehend_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Comprehend-Medical_64.png
│ │ ├── Arch_Amazon-Comprehend-Medical_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-DevOps-Guru_64.png
│ │ ├── Arch_Amazon-DevOps-Guru_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Elastic-Inference_64.png
│ │ ├── Arch_Amazon-Elastic-Inference_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Forecast_64.png
│ │ ├── Arch_Amazon-Forecast_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Fraud-Detector_64.png
│ │ ├── Arch_Amazon-Fraud-Detector_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Kendra_64.png
│ │ ├── Arch_Amazon-Kendra_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Lex_64.png
│ │ ├── Arch_Amazon-Lex_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Lookout-for-Equipment_64.png
│ │ ├── Arch_Amazon-Lookout-for-Equipment_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Lookout-for-Metrics_64.png
│ │ ├── Arch_Amazon-Lookout-for-Metrics_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Lookout-for-Vision_64.png
│ │ ├── Arch_Amazon-Lookout-for-Vision_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Monitron_64.png
│ │ ├── Arch_Amazon-Monitron_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Nova_64.png
│ │ ├── Arch_Amazon-Nova_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Personalize_64.png
│ │ ├── Arch_Amazon-Personalize_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Polly_64.png
│ │ ├── Arch_Amazon-Polly_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Q_64.png
│ │ ├── Arch_Amazon-Q_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Rekognition_64.png
│ │ ├── Arch_Amazon-Rekognition_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-SageMaker-AI_64.png
│ │ ├── Arch_Amazon-SageMaker-AI_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-SageMaker-Ground-Truth_64.png
│ │ ├── Arch_Amazon-SageMaker-Ground-Truth_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-SageMaker-Studio-Lab_64.png
│ │ ├── Arch_Amazon-SageMaker-Studio-Lab_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Textract_64.png
│ │ ├── Arch_Amazon-Textract_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Transcribe_64.png
│ │ ├── Arch_Amazon-Transcribe_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Translate_64.png
│ │ ├── Arch_Amazon-Translate_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Apache-MXNet-on-AWS_64.png
│ │ ├── Arch_Apache-MXNet-on-AWS_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-App-Studio_64.png
│ │ ├── Arch_AWS-App-Studio_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Deep-Learning-AMIs_64.png
│ │ ├── Arch_AWS-Deep-Learning-AMIs_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Deep-Learning-Containers_64.png
│ │ ├── Arch_AWS-Deep-Learning-Containers_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-DeepComposer_64.png
│ │ ├── Arch_AWS-DeepComposer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-DeepRacer_64.png
│ │ ├── Arch_AWS-DeepRacer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-HealthImaging_64.png
│ │ ├── Arch_AWS-HealthImaging_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-HealthLake_64.png
│ │ ├── Arch_AWS-HealthLake_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-HealthOmics_64.png
│ │ ├── Arch_AWS-HealthOmics_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-HealthScribe_64.png
│ │ ├── Arch_AWS-HealthScribe_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Neuron_64.png
│ │ ├── Arch_AWS-Neuron_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Panorama_64.png
│ │ ├── Arch_AWS-Panorama_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_PyTorch-on-AWS_64.png
│ │ ├── Arch_PyTorch-on-AWS_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_TensorFlow-on-AWS_64.png
│ │ ├── Arch_TensorFlow-on-AWS_64.svg
│ │ └── [email protected]
│ ├── blockchain
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_Amazon-Managed-Blockchain_16.png
│ │ │ ├── Arch_Amazon-Managed-Blockchain_16.svg
│ │ │ ├── Arch_Amazon-Quantum-Ledger-Database_16.png
│ │ │ └── Arch_Amazon-Quantum-Ledger-Database_16.svg
│ │ ├── 32
│ │ │ ├── Arch_Amazon-Managed-Blockchain_32.png
│ │ │ ├── Arch_Amazon-Managed-Blockchain_32.svg
│ │ │ ├── Arch_Amazon-Quantum-Ledger-Database_32.png
│ │ │ └── Arch_Amazon-Quantum-Ledger-Database_32.svg
│ │ ├── 48
│ │ │ ├── Arch_Amazon-Managed-Blockchain_48.png
│ │ │ ├── Arch_Amazon-Managed-Blockchain_48.svg
│ │ │ ├── Arch_Amazon-Quantum-Ledger-Database_48.png
│ │ │ └── Arch_Amazon-Quantum-Ledger-Database_48.svg
│ │ └── 64
│ │ ├── Arch_Amazon-Managed-Blockchain_64.png
│ │ ├── Arch_Amazon-Managed-Blockchain_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Quantum-Ledger-Database_64.png
│ │ ├── Arch_Amazon-Quantum-Ledger-Database_64.svg
│ │ └── [email protected]
│ ├── business-applications
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Alexa-For-Business_16.png
│ │ │ ├── Arch_Alexa-For-Business_16.svg
│ │ │ ├── Arch_Amazon-Chime_16.png
│ │ │ ├── Arch_Amazon-Chime_16.svg
│ │ │ ├── Arch_Amazon-Chime-SDK_16.png
│ │ │ ├── Arch_Amazon-Chime-SDK_16.svg
│ │ │ ├── Arch_Amazon-Connect_16.png
│ │ │ ├── Arch_Amazon-Connect_16.svg
│ │ │ ├── Arch_Amazon-Pinpoint_16.png
│ │ │ ├── Arch_Amazon-Pinpoint_16.svg
│ │ │ ├── Arch_Amazon-Pinpoint-APIs_16.png
│ │ │ ├── Arch_Amazon-Pinpoint-APIs_16.svg
│ │ │ ├── Arch_Amazon-Simple-Email-Service_16.png
│ │ │ ├── Arch_Amazon-Simple-Email-Service_16.svg
│ │ │ ├── Arch_Amazon-WorkDocs_16.png
│ │ │ ├── Arch_Amazon-WorkDocs_16.svg
│ │ │ ├── Arch_Amazon-WorkDocs-SDK_16.png
│ │ │ ├── Arch_Amazon-WorkDocs-SDK_16.svg
│ │ │ ├── Arch_Amazon-WorkMail_16.png
│ │ │ ├── Arch_Amazon-WorkMail_16.svg
│ │ │ ├── Arch_AWS-AppFabric_16.png
│ │ │ ├── Arch_AWS-AppFabric_16.svg
│ │ │ ├── Arch_AWS-End-User-Messaging_16.png
│ │ │ ├── Arch_AWS-End-User-Messaging_16.svg
│ │ │ ├── Arch_AWS-Supply-Chain_16.png
│ │ │ ├── Arch_AWS-Supply-Chain_16.svg
│ │ │ ├── Arch_AWS-Wickr_16.png
│ │ │ └── Arch_AWS-Wickr_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Alexa-For-Business_32.png
│ │ │ ├── Arch_Alexa-For-Business_32.svg
│ │ │ ├── Arch_Amazon-Chime_32.png
│ │ │ ├── Arch_Amazon-Chime_32.svg
│ │ │ ├── Arch_Amazon-Chime-SDK_32.png
│ │ │ ├── Arch_Amazon-Chime-SDK_32.svg
│ │ │ ├── Arch_Amazon-Connect_32.png
│ │ │ ├── Arch_Amazon-Connect_32.svg
│ │ │ ├── Arch_Amazon-Pinpoint_32.png
│ │ │ ├── Arch_Amazon-Pinpoint_32.svg
│ │ │ ├── Arch_Amazon-Pinpoint-APIs_32.png
│ │ │ ├── Arch_Amazon-Pinpoint-APIs_32.svg
│ │ │ ├── Arch_Amazon-Simple-Email-Service_32.png
│ │ │ ├── Arch_Amazon-Simple-Email-Service_32.svg
│ │ │ ├── Arch_Amazon-WorkDocs_32.png
│ │ │ ├── Arch_Amazon-WorkDocs_32.svg
│ │ │ ├── Arch_Amazon-WorkDocs-SDK_32.png
│ │ │ ├── Arch_Amazon-WorkDocs-SDK_32.svg
│ │ │ ├── Arch_Amazon-WorkMail_32.png
│ │ │ ├── Arch_Amazon-WorkMail_32.svg
│ │ │ ├── Arch_AWS-AppFabric_32.png
│ │ │ ├── Arch_AWS-AppFabric_32.svg
│ │ │ ├── Arch_AWS-End-User-Messaging_32.png
│ │ │ ├── Arch_AWS-End-User-Messaging_32.svg
│ │ │ ├── Arch_AWS-Supply-Chain_32.png
│ │ │ ├── Arch_AWS-Supply-Chain_32.svg
│ │ │ ├── Arch_AWS-Wickr_32.png
│ │ │ └── Arch_AWS-Wickr_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Alexa-For-Business_48.png
│ │ │ ├── Arch_Alexa-For-Business_48.svg
│ │ │ ├── Arch_Amazon-Chime_48.png
│ │ │ ├── Arch_Amazon-Chime_48.svg
│ │ │ ├── Arch_Amazon-Chime-SDK_48.png
│ │ │ ├── Arch_Amazon-Chime-SDK_48.svg
│ │ │ ├── Arch_Amazon-Connect_48.png
│ │ │ ├── Arch_Amazon-Connect_48.svg
│ │ │ ├── Arch_Amazon-Pinpoint_48.png
│ │ │ ├── Arch_Amazon-Pinpoint_48.svg
│ │ │ ├── Arch_Amazon-Pinpoint-APIs_48.png
│ │ │ ├── Arch_Amazon-Pinpoint-APIs_48.svg
│ │ │ ├── Arch_Amazon-Simple-Email-Service_48.png
│ │ │ ├── Arch_Amazon-Simple-Email-Service_48.svg
│ │ │ ├── Arch_Amazon-WorkDocs_48.png
│ │ │ ├── Arch_Amazon-WorkDocs_48.svg
│ │ │ ├── Arch_Amazon-WorkDocs-SDK_48.png
│ │ │ ├── Arch_Amazon-WorkDocs-SDK_48.svg
│ │ │ ├── Arch_Amazon-WorkMail_48.png
│ │ │ ├── Arch_Amazon-WorkMail_48.svg
│ │ │ ├── Arch_AWS-AppFabric_48.png
│ │ │ ├── Arch_AWS-AppFabric_48.svg
│ │ │ ├── Arch_AWS-End-User-Messaging_48.png
│ │ │ ├── Arch_AWS-End-User-Messaging_48.svg
│ │ │ ├── Arch_AWS-Supply-Chain_48.png
│ │ │ ├── Arch_AWS-Supply-Chain_48.svg
│ │ │ ├── Arch_AWS-Wickr_48.png
│ │ │ └── Arch_AWS-Wickr_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Alexa-For-Business_64.png
│ │ ├── Arch_Alexa-For-Business_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Chime_64.png
│ │ ├── Arch_Amazon-Chime_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Chime-SDK_64.png
│ │ ├── Arch_Amazon-Chime-SDK_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Connect_64.png
│ │ ├── Arch_Amazon-Connect_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Pinpoint_64.png
│ │ ├── Arch_Amazon-Pinpoint_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Pinpoint-APIs_64.png
│ │ ├── Arch_Amazon-Pinpoint-APIs_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Simple-Email-Service_64.png
│ │ ├── Arch_Amazon-Simple-Email-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-WorkDocs_64.png
│ │ ├── Arch_Amazon-WorkDocs_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-WorkDocs-SDK_64.png
│ │ ├── Arch_Amazon-WorkDocs-SDK_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-WorkMail_64.png
│ │ ├── Arch_Amazon-WorkMail_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-AppFabric_64.png
│ │ ├── Arch_AWS-AppFabric_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-End-User-Messaging_64.png
│ │ ├── Arch_AWS-End-User-Messaging_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Supply-Chain_64.png
│ │ ├── Arch_AWS-Supply-Chain_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Wickr_64.png
│ │ ├── Arch_AWS-Wickr_64.svg
│ │ └── [email protected]
│ ├── cloud-financial
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-Billing-Conductor_16.png
│ │ │ ├── Arch_AWS-Billing-Conductor_16.svg
│ │ │ ├── Arch_AWS-Budgets_16.png
│ │ │ ├── Arch_AWS-Budgets_16.svg
│ │ │ ├── Arch_AWS-Cost-and-Usage-Report_16.png
│ │ │ ├── Arch_AWS-Cost-and-Usage-Report_16.svg
│ │ │ ├── Arch_AWS-Cost-Explorer_16.png
│ │ │ ├── Arch_AWS-Cost-Explorer_16.svg
│ │ │ ├── Arch_Reserved-Instance-Reporting_16.png
│ │ │ ├── Arch_Reserved-Instance-Reporting_16.svg
│ │ │ ├── Arch_Savings-Plans_16.png
│ │ │ └── Arch_Savings-Plans_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-Billing-Conductor_32.png
│ │ │ ├── Arch_AWS-Billing-Conductor_32.svg
│ │ │ ├── Arch_AWS-Budgets_32.png
│ │ │ ├── Arch_AWS-Budgets_32.svg
│ │ │ ├── Arch_AWS-Cost-and-Usage-Report_32.png
│ │ │ ├── Arch_AWS-Cost-and-Usage-Report_32.svg
│ │ │ ├── Arch_AWS-Cost-Explorer_32.png
│ │ │ ├── Arch_AWS-Cost-Explorer_32.svg
│ │ │ ├── Arch_Reserved-Instance-Reporting_32.png
│ │ │ ├── Arch_Reserved-Instance-Reporting_32.svg
│ │ │ ├── Arch_Savings-Plans_32.png
│ │ │ └── Arch_Savings-Plans_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-Billing-Conductor_48.png
│ │ │ ├── Arch_AWS-Billing-Conductor_48.svg
│ │ │ ├── Arch_AWS-Budgets_48.png
│ │ │ ├── Arch_AWS-Budgets_48.svg
│ │ │ ├── Arch_AWS-Cost-and-Usage-Report_48.png
│ │ │ ├── Arch_AWS-Cost-and-Usage-Report_48.svg
│ │ │ ├── Arch_AWS-Cost-Explorer_48.png
│ │ │ ├── Arch_AWS-Cost-Explorer_48.svg
│ │ │ ├── Arch_Reserved-Instance-Reporting_48.png
│ │ │ ├── Arch_Reserved-Instance-Reporting_48.svg
│ │ │ ├── Arch_Savings-Plans_48.png
│ │ │ └── Arch_Savings-Plans_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_AWS-Billing-Conductor_64.png
│ │ ├── Arch_AWS-Billing-Conductor_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Budgets_64.png
│ │ ├── Arch_AWS-Budgets_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cost-and-Usage-Report_64.png
│ │ ├── Arch_AWS-Cost-and-Usage-Report_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cost-Explorer_64.png
│ │ ├── Arch_AWS-Cost-Explorer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Reserved-Instance-Reporting_64.png
│ │ ├── Arch_Reserved-Instance-Reporting_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Savings-Plans_64.png
│ │ ├── Arch_Savings-Plans_64.svg
│ │ └── [email protected]
│ ├── compute
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-DCV_16.png
│ │ │ ├── Arch_Amazon-DCV_16.svg
│ │ │ ├── Arch_Amazon-EC2_16.png
│ │ │ ├── Arch_Amazon-EC2_16.svg
│ │ │ ├── Arch_Amazon-EC2-Auto-Scaling_16.png
│ │ │ ├── Arch_Amazon-EC2-Auto-Scaling_16.svg
│ │ │ ├── Arch_Amazon-EC2-Image-Builder_16.png
│ │ │ ├── Arch_Amazon-EC2-Image-Builder_16.svg
│ │ │ ├── Arch_Amazon-Elastic-VMware-Service_16.png
│ │ │ ├── Arch_Amazon-Elastic-VMware-Service_16.svg
│ │ │ ├── Arch_Amazon-Lightsail_16.png
│ │ │ ├── Arch_Amazon-Lightsail_16.svg
│ │ │ ├── Arch_Amazon-Lightsail-for-Research_16.png
│ │ │ ├── Arch_Amazon-Lightsail-for-Research_16.svg
│ │ │ ├── Arch_AWS-App-Runner_16.png
│ │ │ ├── Arch_AWS-App-Runner_16.svg
│ │ │ ├── Arch_AWS-Batch_16.png
│ │ │ ├── Arch_AWS-Batch_16.svg
│ │ │ ├── Arch_AWS-Compute-Optimizer_16.png
│ │ │ ├── Arch_AWS-Compute-Optimizer_16.svg
│ │ │ ├── Arch_AWS-Elastic-Beanstalk_16.png
│ │ │ ├── Arch_AWS-Elastic-Beanstalk_16.svg
│ │ │ ├── Arch_AWS-Lambda_16.png
│ │ │ ├── Arch_AWS-Lambda_16.svg
│ │ │ ├── Arch_AWS-Local-Zones_16.png
│ │ │ ├── Arch_AWS-Local-Zones_16.svg
│ │ │ ├── Arch_AWS-Nitro-Enclaves_16.png
│ │ │ ├── Arch_AWS-Nitro-Enclaves_16.svg
│ │ │ ├── Arch_AWS-Outposts-family_16.png
│ │ │ ├── Arch_AWS-Outposts-family_16.svg
│ │ │ ├── Arch_AWS-Outposts-rack_16.png
│ │ │ ├── Arch_AWS-Outposts-rack_16.svg
│ │ │ ├── Arch_AWS-Outposts-servers_16.png
│ │ │ ├── Arch_AWS-Outposts-servers_16.svg
│ │ │ ├── Arch_AWS-Parallel-Cluster_16.png
│ │ │ ├── Arch_AWS-Parallel-Cluster_16.svg
│ │ │ ├── Arch_AWS-Parallel-Computing-Service_16.png
│ │ │ ├── Arch_AWS-Parallel-Computing-Service_16.svg
│ │ │ ├── Arch_AWS-Serverless-Application-Repository_16.png
│ │ │ ├── Arch_AWS-Serverless-Application-Repository_16.svg
│ │ │ ├── Arch_AWS-SimSpace-Weaver_16.png
│ │ │ ├── Arch_AWS-SimSpace-Weaver_16.svg
│ │ │ ├── Arch_AWS-Wavelength_16.png
│ │ │ ├── Arch_AWS-Wavelength_16.svg
│ │ │ ├── Arch_Bottlerocket_16.png
│ │ │ ├── Arch_Bottlerocket_16.svg
│ │ │ ├── Arch_Elastic-Fabric-Adapter_16.png
│ │ │ ├── Arch_Elastic-Fabric-Adapter_16.svg
│ │ │ ├── Arch_NICE-EnginFrame_16.png
│ │ │ └── Arch_NICE-EnginFrame_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-DCV_32.png
│ │ │ ├── Arch_Amazon-DCV_32.svg
│ │ │ ├── Arch_Amazon-EC2_32.png
│ │ │ ├── Arch_Amazon-EC2_32.svg
│ │ │ ├── Arch_Amazon-EC2-Auto-Scaling_32.png
│ │ │ ├── Arch_Amazon-EC2-Auto-Scaling_32.svg
│ │ │ ├── Arch_Amazon-EC2-Image-Builder_32.png
│ │ │ ├── Arch_Amazon-EC2-Image-Builder_32.svg
│ │ │ ├── Arch_Amazon-Elastic-VMware-Service_32.png
│ │ │ ├── Arch_Amazon-Elastic-VMware-Service_32.svg
│ │ │ ├── Arch_Amazon-Lightsail_32.png
│ │ │ ├── Arch_Amazon-Lightsail_32.svg
│ │ │ ├── Arch_Amazon-Lightsail-for-Research_32.png
│ │ │ ├── Arch_Amazon-Lightsail-for-Research_32.svg
│ │ │ ├── Arch_AWS-App-Runner_32.png
│ │ │ ├── Arch_AWS-App-Runner_32.svg
│ │ │ ├── Arch_AWS-Batch_32.png
│ │ │ ├── Arch_AWS-Batch_32.svg
│ │ │ ├── Arch_AWS-Compute-Optimizer_32.png
│ │ │ ├── Arch_AWS-Compute-Optimizer_32.svg
│ │ │ ├── Arch_AWS-Elastic-Beanstalk_32.png
│ │ │ ├── Arch_AWS-Elastic-Beanstalk_32.svg
│ │ │ ├── Arch_AWS-Lambda_32.png
│ │ │ ├── Arch_AWS-Lambda_32.svg
│ │ │ ├── Arch_AWS-Local-Zones_32.png
│ │ │ ├── Arch_AWS-Local-Zones_32.svg
│ │ │ ├── Arch_AWS-Nitro-Enclaves_32.png
│ │ │ ├── Arch_AWS-Nitro-Enclaves_32.svg
│ │ │ ├── Arch_AWS-Outposts-family_32.png
│ │ │ ├── Arch_AWS-Outposts-family_32.svg
│ │ │ ├── Arch_AWS-Outposts-rack_32.png
│ │ │ ├── Arch_AWS-Outposts-rack_32.svg
│ │ │ ├── Arch_AWS-Outposts-servers_32.png
│ │ │ ├── Arch_AWS-Outposts-servers_32.svg
│ │ │ ├── Arch_AWS-Parallel-Cluster_32.png
│ │ │ ├── Arch_AWS-Parallel-Cluster_32.svg
│ │ │ ├── Arch_AWS-Parallel-Computing-Service_32.png
│ │ │ ├── Arch_AWS-Parallel-Computing-Service_32.svg
│ │ │ ├── Arch_AWS-Serverless-Application-Repository_32.png
│ │ │ ├── Arch_AWS-Serverless-Application-Repository_32.svg
│ │ │ ├── Arch_AWS-SimSpace-Weaver_32.png
│ │ │ ├── Arch_AWS-SimSpace-Weaver_32.svg
│ │ │ ├── Arch_AWS-Wavelength_32.png
│ │ │ ├── Arch_AWS-Wavelength_32.svg
│ │ │ ├── Arch_Bottlerocket_32.png
│ │ │ ├── Arch_Bottlerocket_32.svg
│ │ │ ├── Arch_Elastic-Fabric-Adapter_32.png
│ │ │ ├── Arch_Elastic-Fabric-Adapter_32.svg
│ │ │ ├── Arch_NICE-EnginFrame_32.png
│ │ │ └── Arch_NICE-EnginFrame_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-DCV_48.png
│ │ │ ├── Arch_Amazon-DCV_48.svg
│ │ │ ├── Arch_Amazon-EC2_48.png
│ │ │ ├── Arch_Amazon-EC2_48.svg
│ │ │ ├── Arch_Amazon-EC2-Auto-Scaling_48.png
│ │ │ ├── Arch_Amazon-EC2-Auto-Scaling_48.svg
│ │ │ ├── Arch_Amazon-EC2-Image-Builder_48.png
│ │ │ ├── Arch_Amazon-EC2-Image-Builder_48.svg
│ │ │ ├── Arch_Amazon-Elastic-VMware-Service_48.png
│ │ │ ├── Arch_Amazon-Elastic-VMware-Service_48.svg
│ │ │ ├── Arch_Amazon-Lightsail_48.png
│ │ │ ├── Arch_Amazon-Lightsail_48.svg
│ │ │ ├── Arch_Amazon-Lightsail-for-Research_48.png
│ │ │ ├── Arch_Amazon-Lightsail-for-Research_48.svg
│ │ │ ├── Arch_AWS-App-Runner_48.png
│ │ │ ├── Arch_AWS-App-Runner_48.svg
│ │ │ ├── Arch_AWS-Batch_48.png
│ │ │ ├── Arch_AWS-Batch_48.svg
│ │ │ ├── Arch_AWS-Compute-Optimizer_48.png
│ │ │ ├── Arch_AWS-Compute-Optimizer_48.svg
│ │ │ ├── Arch_AWS-Elastic-Beanstalk_48.png
│ │ │ ├── Arch_AWS-Elastic-Beanstalk_48.svg
│ │ │ ├── Arch_AWS-Lambda_48.png
│ │ │ ├── Arch_AWS-Lambda_48.svg
│ │ │ ├── Arch_AWS-Local-Zones_48.png
│ │ │ ├── Arch_AWS-Local-Zones_48.svg
│ │ │ ├── Arch_AWS-Nitro-Enclaves_48.png
│ │ │ ├── Arch_AWS-Nitro-Enclaves_48.svg
│ │ │ ├── Arch_AWS-Outposts-family_48.png
│ │ │ ├── Arch_AWS-Outposts-family_48.svg
│ │ │ ├── Arch_AWS-Outposts-rack_48.png
│ │ │ ├── Arch_AWS-Outposts-rack_48.svg
│ │ │ ├── Arch_AWS-Outposts-servers_48.png
│ │ │ ├── Arch_AWS-Outposts-servers_48.svg
│ │ │ ├── Arch_AWS-Parallel-Cluster_48.png
│ │ │ ├── Arch_AWS-Parallel-Cluster_48.svg
│ │ │ ├── Arch_AWS-Parallel-Computing-Service_48.png
│ │ │ ├── Arch_AWS-Parallel-Computing-Service_48.svg
│ │ │ ├── Arch_AWS-Serverless-Application-Repository_48.png
│ │ │ ├── Arch_AWS-Serverless-Application-Repository_48.svg
│ │ │ ├── Arch_AWS-SimSpace-Weaver_48.png
│ │ │ ├── Arch_AWS-SimSpace-Weaver_48.svg
│ │ │ ├── Arch_AWS-Wavelength_48.png
│ │ │ ├── Arch_AWS-Wavelength_48.svg
│ │ │ ├── Arch_Bottlerocket_48.png
│ │ │ ├── Arch_Bottlerocket_48.svg
│ │ │ ├── Arch_Elastic-Fabric-Adapter_48.png
│ │ │ ├── Arch_Elastic-Fabric-Adapter_48.svg
│ │ │ ├── Arch_NICE-EnginFrame_48.png
│ │ │ └── Arch_NICE-EnginFrame_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-DCV_64.png
│ │ ├── Arch_Amazon-DCV_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EC2_64.png
│ │ ├── Arch_Amazon-EC2_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EC2-Auto-Scaling_64.png
│ │ ├── Arch_Amazon-EC2-Auto-Scaling_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EC2-Image-Builder_64.png
│ │ ├── Arch_Amazon-EC2-Image-Builder_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Elastic-VMware-Service_64.png
│ │ ├── Arch_Amazon-Elastic-VMware-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Lightsail_64.png
│ │ ├── Arch_Amazon-Lightsail_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Lightsail-for-Research_64.png
│ │ ├── Arch_Amazon-Lightsail-for-Research_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-App-Runner_64.png
│ │ ├── Arch_AWS-App-Runner_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Batch_64.png
│ │ ├── Arch_AWS-Batch_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Compute-Optimizer_64.png
│ │ ├── Arch_AWS-Compute-Optimizer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elastic-Beanstalk_64.png
│ │ ├── Arch_AWS-Elastic-Beanstalk_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Lambda_64.png
│ │ ├── Arch_AWS-Lambda_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Local-Zones_64.png
│ │ ├── Arch_AWS-Local-Zones_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Nitro-Enclaves_64.png
│ │ ├── Arch_AWS-Nitro-Enclaves_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Outposts-family_64.png
│ │ ├── Arch_AWS-Outposts-family_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Outposts-rack_64.png
│ │ ├── Arch_AWS-Outposts-rack_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Outposts-servers_64.png
│ │ ├── Arch_AWS-Outposts-servers_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Parallel-Cluster_64.png
│ │ ├── Arch_AWS-Parallel-Cluster_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Parallel-Computing-Service_64.png
│ │ ├── Arch_AWS-Parallel-Computing-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Serverless-Application-Repository_64.png
│ │ ├── Arch_AWS-Serverless-Application-Repository_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-SimSpace-Weaver_64.png
│ │ ├── Arch_AWS-SimSpace-Weaver_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Wavelength_64.png
│ │ ├── Arch_AWS-Wavelength_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Bottlerocket_64.png
│ │ ├── Arch_Bottlerocket_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Elastic-Fabric-Adapter_64.png
│ │ ├── Arch_Elastic-Fabric-Adapter_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_NICE-EnginFrame_64.png
│ │ ├── Arch_NICE-EnginFrame_64.svg
│ │ └── [email protected]
│ ├── containers
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_Amazon-ECS-Anywhere_16.png
│ │ │ ├── Arch_Amazon-ECS-Anywhere_16.svg
│ │ │ ├── Arch_Amazon-EKS-Anywhere_16.png
│ │ │ ├── Arch_Amazon-EKS-Anywhere_16.svg
│ │ │ ├── Arch_Amazon-EKS-Cloud_16.png
│ │ │ ├── Arch_Amazon-EKS-Cloud_16.svg
│ │ │ ├── Arch_Amazon-EKS-Distro_16.png
│ │ │ ├── Arch_Amazon-EKS-Distro_16.svg
│ │ │ ├── Arch_Amazon-Elastic-Container-Registry_16.png
│ │ │ ├── Arch_Amazon-Elastic-Container-Registry_16.svg
│ │ │ ├── Arch_Amazon-Elastic-Container-Service_16.png
│ │ │ ├── Arch_Amazon-Elastic-Container-Service_16.svg
│ │ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_16.png
│ │ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_16.svg
│ │ │ ├── Arch_AWS-Fargate_16.png
│ │ │ ├── Arch_AWS-Fargate_16.svg
│ │ │ ├── Arch_Red-Hat-OpenShift-Service-on-AWS_16.png
│ │ │ └── Arch_Red-Hat-OpenShift-Service-on-AWS_16.svg
│ │ ├── 32
│ │ │ ├── Arch_Amazon-ECS-Anywhere_32.png
│ │ │ ├── Arch_Amazon-ECS-Anywhere_32.svg
│ │ │ ├── Arch_Amazon-EKS-Anywhere_32.png
│ │ │ ├── Arch_Amazon-EKS-Anywhere_32.svg
│ │ │ ├── Arch_Amazon-EKS-Cloud_32.png
│ │ │ ├── Arch_Amazon-EKS-Cloud_32.svg
│ │ │ ├── Arch_Amazon-EKS-Distro_32.png
│ │ │ ├── Arch_Amazon-EKS-Distro_32.svg
│ │ │ ├── Arch_Amazon-Elastic-Container-Registry_32.png
│ │ │ ├── Arch_Amazon-Elastic-Container-Registry_32.svg
│ │ │ ├── Arch_Amazon-Elastic-Container-Service_32.png
│ │ │ ├── Arch_Amazon-Elastic-Container-Service_32.svg
│ │ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_32.png
│ │ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_32.svg
│ │ │ ├── Arch_AWS-Fargate_32.png
│ │ │ ├── Arch_AWS-Fargate_32.svg
│ │ │ ├── Arch_Red-Hat-OpenShift-Service-on-AWS_32.png
│ │ │ └── Arch_Red-Hat-OpenShift-Service-on-AWS_32.svg
│ │ ├── 48
│ │ │ ├── Arch_Amazon-ECS-Anywhere_48.png
│ │ │ ├── Arch_Amazon-ECS-Anywhere_48.svg
│ │ │ ├── Arch_Amazon-EKS-Anywhere_48.png
│ │ │ ├── Arch_Amazon-EKS-Anywhere_48.svg
│ │ │ ├── Arch_Amazon-EKS-Cloud_48.png
│ │ │ ├── Arch_Amazon-EKS-Cloud_48.svg
│ │ │ ├── Arch_Amazon-EKS-Distro_48.png
│ │ │ ├── Arch_Amazon-EKS-Distro_48.svg
│ │ │ ├── Arch_Amazon-Elastic-Container-Registry_48.png
│ │ │ ├── Arch_Amazon-Elastic-Container-Registry_48.svg
│ │ │ ├── Arch_Amazon-Elastic-Container-Service_48.png
│ │ │ ├── Arch_Amazon-Elastic-Container-Service_48.svg
│ │ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_48.png
│ │ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_48.svg
│ │ │ ├── Arch_AWS-Fargate_48.png
│ │ │ ├── Arch_AWS-Fargate_48.svg
│ │ │ ├── Arch_Red-Hat-OpenShift-Service-on-AWS_48.png
│ │ │ └── Arch_Red-Hat-OpenShift-Service-on-AWS_48.svg
│ │ └── 64
│ │ ├── Arch_Amazon-ECS-Anywhere_64.png
│ │ ├── Arch_Amazon-ECS-Anywhere_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EKS-Anywhere_64.png
│ │ ├── Arch_Amazon-EKS-Anywhere_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EKS-Cloud_64.png
│ │ ├── Arch_Amazon-EKS-Cloud_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-EKS-Distro_64.png
│ │ ├── Arch_Amazon-EKS-Distro_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Elastic-Container-Registry_64.png
│ │ ├── Arch_Amazon-Elastic-Container-Registry_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Elastic-Container-Service_64.png
│ │ ├── Arch_Amazon-Elastic-Container-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_64.png
│ │ ├── Arch_Amazon-Elastic-Kubernetes-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Fargate_64.png
│ │ ├── Arch_AWS-Fargate_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Red-Hat-OpenShift-Service-on-AWS_64.png
│ │ ├── Arch_Red-Hat-OpenShift-Service-on-AWS_64.svg
│ │ └── [email protected]
│ ├── customer-enablement
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_AWS-Activate_16.png
│ │ │ ├── Arch_AWS-Activate_16.svg
│ │ │ ├── Arch_AWS-IQ_16.png
│ │ │ ├── Arch_AWS-IQ_16.svg
│ │ │ ├── Arch_AWS-Managed-Services_16.png
│ │ │ ├── Arch_AWS-Managed-Services_16.svg
│ │ │ ├── Arch_AWS-Professional-Services_16.png
│ │ │ ├── Arch_AWS-Professional-Services_16.svg
│ │ │ ├── Arch_AWS-rePost_16.png
│ │ │ ├── Arch_AWS-rePost_16.svg
│ │ │ ├── Arch_AWS-rePost-Private_16.png
│ │ │ ├── Arch_AWS-rePost-Private_16.svg
│ │ │ ├── Arch_AWS-Support_16.png
│ │ │ ├── Arch_AWS-Support_16.svg
│ │ │ ├── Arch_AWS-Training-Certification_16.png
│ │ │ └── Arch_AWS-Training-Certification_16.svg
│ │ ├── 32
│ │ │ ├── Arch_AWS-Activate_32.png
│ │ │ ├── Arch_AWS-Activate_32.svg
│ │ │ ├── Arch_AWS-IQ_32.png
│ │ │ ├── Arch_AWS-IQ_32.svg
│ │ │ ├── Arch_AWS-Managed-Services_32.png
│ │ │ ├── Arch_AWS-Managed-Services_32.svg
│ │ │ ├── Arch_AWS-Professional-Services_32.png
│ │ │ ├── Arch_AWS-Professional-Services_32.svg
│ │ │ ├── Arch_AWS-rePost_32.png
│ │ │ ├── Arch_AWS-rePost_32.svg
│ │ │ ├── Arch_AWS-rePost-Private_32.png
│ │ │ ├── Arch_AWS-rePost-Private_32.svg
│ │ │ ├── Arch_AWS-Support_32.png
│ │ │ ├── Arch_AWS-Support_32.svg
│ │ │ ├── Arch_AWS-Training-Certification_32.png
│ │ │ └── Arch_AWS-Training-Certification_32.svg
│ │ ├── 48
│ │ │ ├── Arch_AWS-Activate_48.png
│ │ │ ├── Arch_AWS-Activate_48.svg
│ │ │ ├── Arch_AWS-IQ_48.png
│ │ │ ├── Arch_AWS-IQ_48.svg
│ │ │ ├── Arch_AWS-Managed-Services_48.png
│ │ │ ├── Arch_AWS-Managed-Services_48.svg
│ │ │ ├── Arch_AWS-Professional-Services_48.png
│ │ │ ├── Arch_AWS-Professional-Services_48.svg
│ │ │ ├── Arch_AWS-rePost_48.png
│ │ │ ├── Arch_AWS-rePost_48.svg
│ │ │ ├── Arch_AWS-rePost-Private_48.png
│ │ │ ├── Arch_AWS-rePost-Private_48.svg
│ │ │ ├── Arch_AWS-Support_48.png
│ │ │ ├── Arch_AWS-Support_48.svg
│ │ │ ├── Arch_AWS-Training-Certification_48.png
│ │ │ └── Arch_AWS-Training-Certification_48.svg
│ │ └── 64
│ │ ├── Arch_AWS-Activate_64.png
│ │ ├── Arch_AWS-Activate_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IQ_64.png
│ │ ├── Arch_AWS-IQ_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Managed-Services_64.png
│ │ ├── Arch_AWS-Managed-Services_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Professional-Services_64.png
│ │ ├── Arch_AWS-Professional-Services_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-rePost_64.png
│ │ ├── Arch_AWS-rePost_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-rePost-Private_64.png
│ │ ├── Arch_AWS-rePost-Private_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Support_64.png
│ │ ├── Arch_AWS-Support_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Training-Certification_64.png
│ │ ├── Arch_AWS-Training-Certification_64.svg
│ │ └── [email protected]
│ ├── database
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Aurora_16.png
│ │ │ ├── Arch_Amazon-Aurora_16.svg
│ │ │ ├── Arch_Amazon-DocumentDB_16.png
│ │ │ ├── Arch_Amazon-DocumentDB_16.svg
│ │ │ ├── Arch_Amazon-DynamoDB_16.png
│ │ │ ├── Arch_Amazon-DynamoDB_16.svg
│ │ │ ├── Arch_Amazon-ElastiCache_16.png
│ │ │ ├── Arch_Amazon-ElastiCache_16.svg
│ │ │ ├── Arch_Amazon-Keyspaces_16.png
│ │ │ ├── Arch_Amazon-Keyspaces_16.svg
│ │ │ ├── Arch_Amazon-MemoryDB_16.png
│ │ │ ├── Arch_Amazon-MemoryDB_16.svg
│ │ │ ├── Arch_Amazon-Neptune_16.png
│ │ │ ├── Arch_Amazon-Neptune_16.svg
│ │ │ ├── Arch_Amazon-RDS_16.png
│ │ │ ├── Arch_Amazon-RDS_16.svg
│ │ │ ├── Arch_Amazon-Timestream_16.png
│ │ │ ├── Arch_Amazon-Timestream_16.svg
│ │ │ ├── Arch_AWS-Database-Migration-Service_16.png
│ │ │ ├── Arch_AWS-Database-Migration-Service_16.svg
│ │ │ ├── Arch_Oracle-Database-at-AWS_16.png
│ │ │ └── Arch_Oracle-Database-at-AWS_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Aurora_32.png
│ │ │ ├── Arch_Amazon-Aurora_32.svg
│ │ │ ├── Arch_Amazon-DocumentDB_32.png
│ │ │ ├── Arch_Amazon-DocumentDB_32.svg
│ │ │ ├── Arch_Amazon-DynamoDB_32.png
│ │ │ ├── Arch_Amazon-DynamoDB_32.svg
│ │ │ ├── Arch_Amazon-ElastiCache_32.png
│ │ │ ├── Arch_Amazon-ElastiCache_32.svg
│ │ │ ├── Arch_Amazon-Keyspaces_32.png
│ │ │ ├── Arch_Amazon-Keyspaces_32.svg
│ │ │ ├── Arch_Amazon-MemoryDB_32.png
│ │ │ ├── Arch_Amazon-MemoryDB_32.svg
│ │ │ ├── Arch_Amazon-Neptune_32.png
│ │ │ ├── Arch_Amazon-Neptune_32.svg
│ │ │ ├── Arch_Amazon-RDS_32.png
│ │ │ ├── Arch_Amazon-RDS_32.svg
│ │ │ ├── Arch_Amazon-Timestream_32.png
│ │ │ ├── Arch_Amazon-Timestream_32.svg
│ │ │ ├── Arch_AWS-Database-Migration-Service_32.png
│ │ │ ├── Arch_AWS-Database-Migration-Service_32.svg
│ │ │ ├── Arch_Oracle-Database-at-AWS_32.png
│ │ │ └── Arch_Oracle-Database-at-AWS_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Aurora_48.png
│ │ │ ├── Arch_Amazon-Aurora_48.svg
│ │ │ ├── Arch_Amazon-DocumentDB_48.png
│ │ │ ├── Arch_Amazon-DocumentDB_48.svg
│ │ │ ├── Arch_Amazon-DynamoDB_48.png
│ │ │ ├── Arch_Amazon-DynamoDB_48.svg
│ │ │ ├── Arch_Amazon-ElastiCache_48.png
│ │ │ ├── Arch_Amazon-ElastiCache_48.svg
│ │ │ ├── Arch_Amazon-Keyspaces_48.png
│ │ │ ├── Arch_Amazon-Keyspaces_48.svg
│ │ │ ├── Arch_Amazon-MemoryDB_48.png
│ │ │ ├── Arch_Amazon-MemoryDB_48.svg
│ │ │ ├── Arch_Amazon-Neptune_48.png
│ │ │ ├── Arch_Amazon-Neptune_48.svg
│ │ │ ├── Arch_Amazon-RDS_48.png
│ │ │ ├── Arch_Amazon-RDS_48.svg
│ │ │ ├── Arch_Amazon-Timestream_48.png
│ │ │ ├── Arch_Amazon-Timestream_48.svg
│ │ │ ├── Arch_AWS-Database-Migration-Service_48.png
│ │ │ ├── Arch_AWS-Database-Migration-Service_48.svg
│ │ │ ├── Arch_Oracle-Database-at-AWS_48.png
│ │ │ └── Arch_Oracle-Database-at-AWS_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-Aurora_64.png
│ │ ├── Arch_Amazon-Aurora_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-DocumentDB_64.png
│ │ ├── Arch_Amazon-DocumentDB_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-DynamoDB_64.png
│ │ ├── Arch_Amazon-DynamoDB_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-ElastiCache_64.png
│ │ ├── Arch_Amazon-ElastiCache_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Keyspaces_64.png
│ │ ├── Arch_Amazon-Keyspaces_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-MemoryDB_64.png
│ │ ├── Arch_Amazon-MemoryDB_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Neptune_64.png
│ │ ├── Arch_Amazon-Neptune_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-RDS_64.png
│ │ ├── Arch_Amazon-RDS_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Timestream_64.png
│ │ ├── Arch_Amazon-Timestream_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Database-Migration-Service_64.png
│ │ ├── Arch_AWS-Database-Migration-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Oracle-Database-at-AWS_64.png
│ │ ├── Arch_Oracle-Database-at-AWS_64.svg
│ │ └── [email protected]
│ ├── developer-tools
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-CodeCatalyst_16.png
│ │ │ ├── Arch_Amazon-CodeCatalyst_16.svg
│ │ │ ├── Arch_Amazon-Corretto_16.png
│ │ │ ├── Arch_Amazon-Corretto_16.svg
│ │ │ ├── Arch_AWS-Cloud-Control-API_16.png
│ │ │ ├── Arch_AWS-Cloud-Control-API_16.svg
│ │ │ ├── Arch_AWS-Cloud-Development-Kit_16.png
│ │ │ ├── Arch_AWS-Cloud-Development-Kit_16.svg
│ │ │ ├── Arch_AWS-Cloud9_16.png
│ │ │ ├── Arch_AWS-Cloud9_16.svg
│ │ │ ├── Arch_AWS-CloudShell_16.png
│ │ │ ├── Arch_AWS-CloudShell_16.svg
│ │ │ ├── Arch_AWS-CodeArtifact_16.png
│ │ │ ├── Arch_AWS-CodeArtifact_16.svg
│ │ │ ├── Arch_AWS-CodeBuild_16.png
│ │ │ ├── Arch_AWS-CodeBuild_16.svg
│ │ │ ├── Arch_AWS-CodeCommit_16.png
│ │ │ ├── Arch_AWS-CodeCommit_16.svg
│ │ │ ├── Arch_AWS-CodeDeploy_16.png
│ │ │ ├── Arch_AWS-CodeDeploy_16.svg
│ │ │ ├── Arch_AWS-CodePipeline_16.png
│ │ │ ├── Arch_AWS-CodePipeline_16.svg
│ │ │ ├── Arch_AWS-Command-Line-Interface_16.png
│ │ │ ├── Arch_AWS-Command-Line-Interface_16.svg
│ │ │ ├── Arch_AWS-Fault-Injection-Service_16.png
│ │ │ ├── Arch_AWS-Fault-Injection-Service_16.svg
│ │ │ ├── Arch_AWS-Infrastructure-Composer_16.png
│ │ │ ├── Arch_AWS-Infrastructure-Composer_16.svg
│ │ │ ├── Arch_AWS-Tools-and-SDKs_16.png
│ │ │ ├── Arch_AWS-Tools-and-SDKs_16.svg
│ │ │ ├── Arch_AWS-X-Ray_16.png
│ │ │ └── Arch_AWS-X-Ray_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-CodeCatalyst_32.png
│ │ │ ├── Arch_Amazon-CodeCatalyst_32.svg
│ │ │ ├── Arch_Amazon-Corretto_32.png
│ │ │ ├── Arch_Amazon-Corretto_32.svg
│ │ │ ├── Arch_AWS-Cloud-Control-API_32.png
│ │ │ ├── Arch_AWS-Cloud-Control-API_32.svg
│ │ │ ├── Arch_AWS-Cloud-Development-Kit_32.png
│ │ │ ├── Arch_AWS-Cloud-Development-Kit_32.svg
│ │ │ ├── Arch_AWS-Cloud9_32.png
│ │ │ ├── Arch_AWS-Cloud9_32.svg
│ │ │ ├── Arch_AWS-CloudShell_32.png
│ │ │ ├── Arch_AWS-CloudShell_32.svg
│ │ │ ├── Arch_AWS-CodeArtifact_32.png
│ │ │ ├── Arch_AWS-CodeArtifact_32.svg
│ │ │ ├── Arch_AWS-CodeBuild_32.png
│ │ │ ├── Arch_AWS-CodeBuild_32.svg
│ │ │ ├── Arch_AWS-CodeCommit_32.png
│ │ │ ├── Arch_AWS-CodeCommit_32.svg
│ │ │ ├── Arch_AWS-CodeDeploy_32.png
│ │ │ ├── Arch_AWS-CodeDeploy_32.svg
│ │ │ ├── Arch_AWS-CodePipeline_32.png
│ │ │ ├── Arch_AWS-CodePipeline_32.svg
│ │ │ ├── Arch_AWS-Command-Line-Interface_32.png
│ │ │ ├── Arch_AWS-Command-Line-Interface_32.svg
│ │ │ ├── Arch_AWS-Fault-Injection-Service_32.png
│ │ │ ├── Arch_AWS-Fault-Injection-Service_32.svg
│ │ │ ├── Arch_AWS-Infrastructure-Composer_32.png
│ │ │ ├── Arch_AWS-Infrastructure-Composer_32.svg
│ │ │ ├── Arch_AWS-Tools-and-SDKs_32.png
│ │ │ ├── Arch_AWS-Tools-and-SDKs_32.svg
│ │ │ ├── Arch_AWS-X-Ray_32.png
│ │ │ └── Arch_AWS-X-Ray_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-CodeCatalyst_48.png
│ │ │ ├── Arch_Amazon-CodeCatalyst_48.svg
│ │ │ ├── Arch_Amazon-Corretto_48.png
│ │ │ ├── Arch_Amazon-Corretto_48.svg
│ │ │ ├── Arch_AWS-Cloud-Control-API_48.png
│ │ │ ├── Arch_AWS-Cloud-Control-API_48.svg
│ │ │ ├── Arch_AWS-Cloud-Development-Kit_48.png
│ │ │ ├── Arch_AWS-Cloud-Development-Kit_48.svg
│ │ │ ├── Arch_AWS-Cloud9_48.png
│ │ │ ├── Arch_AWS-Cloud9_48.svg
│ │ │ ├── Arch_AWS-CloudShell_48.png
│ │ │ ├── Arch_AWS-CloudShell_48.svg
│ │ │ ├── Arch_AWS-CodeArtifact_48.png
│ │ │ ├── Arch_AWS-CodeArtifact_48.svg
│ │ │ ├── Arch_AWS-CodeBuild_48.png
│ │ │ ├── Arch_AWS-CodeBuild_48.svg
│ │ │ ├── Arch_AWS-CodeCommit_48.png
│ │ │ ├── Arch_AWS-CodeCommit_48.svg
│ │ │ ├── Arch_AWS-CodeDeploy_48.png
│ │ │ ├── Arch_AWS-CodeDeploy_48.svg
│ │ │ ├── Arch_AWS-CodePipeline_48.png
│ │ │ ├── Arch_AWS-CodePipeline_48.svg
│ │ │ ├── Arch_AWS-Command-Line-Interface_48.png
│ │ │ ├── Arch_AWS-Command-Line-Interface_48.svg
│ │ │ ├── Arch_AWS-Fault-Injection-Service_48.png
│ │ │ ├── Arch_AWS-Fault-Injection-Service_48.svg
│ │ │ ├── Arch_AWS-Infrastructure-Composer_48.png
│ │ │ ├── Arch_AWS-Infrastructure-Composer_48.svg
│ │ │ ├── Arch_AWS-Tools-and-SDKs_48.png
│ │ │ ├── Arch_AWS-Tools-and-SDKs_48.svg
│ │ │ ├── Arch_AWS-X-Ray_48.png
│ │ │ └── Arch_AWS-X-Ray_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-CodeCatalyst_64.png
│ │ ├── Arch_Amazon-CodeCatalyst_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Corretto_64.png
│ │ ├── Arch_Amazon-Corretto_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cloud-Control-API_64.png
│ │ ├── Arch_AWS-Cloud-Control-API_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cloud-Development-Kit_64.png
│ │ ├── Arch_AWS-Cloud-Development-Kit_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cloud9_64.png
│ │ ├── Arch_AWS-Cloud9_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CloudShell_64.png
│ │ ├── Arch_AWS-CloudShell_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CodeArtifact_64.png
│ │ ├── Arch_AWS-CodeArtifact_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CodeBuild_64.png
│ │ ├── Arch_AWS-CodeBuild_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CodeCommit_64.png
│ │ ├── Arch_AWS-CodeCommit_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CodeDeploy_64.png
│ │ ├── Arch_AWS-CodeDeploy_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CodePipeline_64.png
│ │ ├── Arch_AWS-CodePipeline_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Command-Line-Interface_64.png
│ │ ├── Arch_AWS-Command-Line-Interface_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Fault-Injection-Service_64.png
│ │ ├── Arch_AWS-Fault-Injection-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Infrastructure-Composer_64.png
│ │ ├── Arch_AWS-Infrastructure-Composer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Tools-and-SDKs_64.png
│ │ ├── Arch_AWS-Tools-and-SDKs_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-X-Ray_64.png
│ │ ├── Arch_AWS-X-Ray_64.svg
│ │ └── [email protected]
│ ├── end-user-computing
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-AppStream-2_16.png
│ │ │ ├── Arch_Amazon-AppStream-2_16.svg
│ │ │ ├── Arch_Amazon-WorkSpaces-Family_16.png
│ │ │ └── Arch_Amazon-WorkSpaces-Family_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-AppStream-2_32.png
│ │ │ ├── Arch_Amazon-AppStream-2_32.svg
│ │ │ ├── Arch_Amazon-WorkSpaces-Family_32.png
│ │ │ └── Arch_Amazon-WorkSpaces-Family_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-AppStream-2_48.png
│ │ │ ├── Arch_Amazon-AppStream-2_48.svg
│ │ │ ├── Arch_Amazon-WorkSpaces-Family_48.png
│ │ │ └── Arch_Amazon-WorkSpaces-Family_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-AppStream-2_64.png
│ │ ├── Arch_Amazon-AppStream-2_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-WorkSpaces-Family_64.png
│ │ ├── Arch_Amazon-WorkSpaces-Family_64.svg
│ │ └── [email protected]
│ ├── front-end-web-mobile
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_Amazon-Location-Service_16.png
│ │ │ ├── Arch_Amazon-Location-Service_16.svg
│ │ │ ├── Arch_AWS-Amplify_16.png
│ │ │ ├── Arch_AWS-Amplify_16.svg
│ │ │ ├── Arch_AWS-Device-Farm_16.png
│ │ │ └── Arch_AWS-Device-Farm_16.svg
│ │ ├── 32
│ │ │ ├── Arch_Amazon-Location-Service_32.png
│ │ │ ├── Arch_Amazon-Location-Service_32.svg
│ │ │ ├── Arch_AWS-Amplify_32.png
│ │ │ ├── Arch_AWS-Amplify_32.svg
│ │ │ ├── Arch_AWS-Device-Farm_32.png
│ │ │ └── Arch_AWS-Device-Farm_32.svg
│ │ ├── 48
│ │ │ ├── Arch_Amazon-Location-Service_48.png
│ │ │ ├── Arch_Amazon-Location-Service_48.svg
│ │ │ ├── Arch_AWS-Amplify_48.png
│ │ │ ├── Arch_AWS-Amplify_48.svg
│ │ │ ├── Arch_AWS-Device-Farm_48.png
│ │ │ └── Arch_AWS-Device-Farm_48.svg
│ │ └── 64
│ │ ├── Arch_Amazon-Location-Service_64.png
│ │ ├── Arch_Amazon-Location-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Amplify_64.png
│ │ ├── Arch_AWS-Amplify_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Device-Farm_64.png
│ │ ├── Arch_AWS-Device-Farm_64.svg
│ │ └── [email protected]
│ ├── games
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-GameLift-Servers_16.png
│ │ │ ├── Arch_Amazon-GameLift-Servers_16.svg
│ │ │ ├── Arch_Amazon-GameLift-Streams_16.png
│ │ │ ├── Arch_Amazon-GameLift-Streams_16.svg
│ │ │ ├── Arch_Open-3D-Engine_16.png
│ │ │ └── Arch_Open-3D-Engine_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-GameLift-Servers_32.png
│ │ │ ├── Arch_Amazon-GameLift-Servers_32.svg
│ │ │ ├── Arch_Amazon-GameLift-Streams_32.png
│ │ │ ├── Arch_Amazon-GameLift-Streams_32.svg
│ │ │ ├── Arch_Open-3D-Engine_32.png
│ │ │ └── Arch_Open-3D-Engine_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-GameLift-Servers_48.png
│ │ │ ├── Arch_Amazon-GameLift-Servers_48.svg
│ │ │ ├── Arch_Amazon-GameLift-Streams_48.png
│ │ │ ├── Arch_Amazon-GameLift-Streams_48.svg
│ │ │ ├── Arch_Open-3D-Engine_48.png
│ │ │ └── Arch_Open-3D-Engine_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-GameLift-Servers_64.png
│ │ ├── Arch_Amazon-GameLift-Servers_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-GameLift-Streams_64.png
│ │ ├── Arch_Amazon-GameLift-Streams_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Open-3D-Engine_64.png
│ │ ├── Arch_Open-3D-Engine_64.svg
│ │ └── [email protected]
│ ├── general-icons
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_AWS-Marketplace_Dark_16.png
│ │ │ ├── Arch_AWS-Marketplace_Dark_16.svg
│ │ │ ├── Arch_AWS-Marketplace_Light_16.png
│ │ │ └── Arch_AWS-Marketplace_Light_16.svg
│ │ ├── 32
│ │ │ ├── Arch_AWS-Marketplace_Dark_32.png
│ │ │ ├── Arch_AWS-Marketplace_Dark_32.svg
│ │ │ ├── Arch_AWS-Marketplace_Light_32.png
│ │ │ └── Arch_AWS-Marketplace_Light_32.svg
│ │ ├── 48
│ │ │ ├── Arch_AWS-Marketplace_Dark_48.png
│ │ │ ├── Arch_AWS-Marketplace_Dark_48.svg
│ │ │ ├── Arch_AWS-Marketplace_Light_48.png
│ │ │ └── Arch_AWS-Marketplace_Light_48.svg
│ │ └── 64
│ │ ├── Arch_AWS-Marketplace_Dark_64.png
│ │ ├── Arch_AWS-Marketplace_Dark_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Marketplace_Light_64.png
│ │ ├── Arch_AWS-Marketplace_Light_64.svg
│ │ └── [email protected]
│ ├── internet-of-things
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-IoT-Analytics_16.png
│ │ │ ├── Arch_AWS-IoT-Analytics_16.svg
│ │ │ ├── Arch_AWS-IoT-Button_16.png
│ │ │ ├── Arch_AWS-IoT-Button_16.svg
│ │ │ ├── Arch_AWS-IoT-Core_16.png
│ │ │ ├── Arch_AWS-IoT-Core_16.svg
│ │ │ ├── Arch_AWS-IoT-Device-Defender_16.png
│ │ │ ├── Arch_AWS-IoT-Device-Defender_16.svg
│ │ │ ├── Arch_AWS-IoT-Device-Management_16.png
│ │ │ ├── Arch_AWS-IoT-Device-Management_16.svg
│ │ │ ├── Arch_AWS-IoT-Events_16.png
│ │ │ ├── Arch_AWS-IoT-Events_16.svg
│ │ │ ├── Arch_AWS-IoT-ExpressLink_16.png
│ │ │ ├── Arch_AWS-IoT-ExpressLink_16.svg
│ │ │ ├── Arch_AWS-IoT-FleetWise_16.png
│ │ │ ├── Arch_AWS-IoT-FleetWise_16.svg
│ │ │ ├── Arch_AWS-IoT-Greengrass_16.png
│ │ │ ├── Arch_AWS-IoT-Greengrass_16.svg
│ │ │ ├── Arch_AWS-IoT-SiteWise_16.png
│ │ │ ├── Arch_AWS-IoT-SiteWise_16.svg
│ │ │ ├── Arch_AWS-IoT-TwinMaker_16.png
│ │ │ ├── Arch_AWS-IoT-TwinMaker_16.svg
│ │ │ ├── Arch_FreeRTOS_16.png
│ │ │ └── Arch_FreeRTOS_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-IoT-Analytics_32.png
│ │ │ ├── Arch_AWS-IoT-Analytics_32.svg
│ │ │ ├── Arch_AWS-IoT-Button_32.png
│ │ │ ├── Arch_AWS-IoT-Button_32.svg
│ │ │ ├── Arch_AWS-IoT-Core_32.png
│ │ │ ├── Arch_AWS-IoT-Core_32.svg
│ │ │ ├── Arch_AWS-IoT-Device-Defender_32.png
│ │ │ ├── Arch_AWS-IoT-Device-Defender_32.svg
│ │ │ ├── Arch_AWS-IoT-Device-Management_32.png
│ │ │ ├── Arch_AWS-IoT-Device-Management_32.svg
│ │ │ ├── Arch_AWS-IoT-Events_32.png
│ │ │ ├── Arch_AWS-IoT-Events_32.svg
│ │ │ ├── Arch_AWS-IoT-ExpressLink_32.png
│ │ │ ├── Arch_AWS-IoT-ExpressLink_32.svg
│ │ │ ├── Arch_AWS-IoT-FleetWise_32.png
│ │ │ ├── Arch_AWS-IoT-FleetWise_32.svg
│ │ │ ├── Arch_AWS-IoT-Greengrass_32.png
│ │ │ ├── Arch_AWS-IoT-Greengrass_32.svg
│ │ │ ├── Arch_AWS-IoT-SiteWise_32.png
│ │ │ ├── Arch_AWS-IoT-SiteWise_32.svg
│ │ │ ├── Arch_AWS-IoT-TwinMaker_32.png
│ │ │ ├── Arch_AWS-IoT-TwinMaker_32.svg
│ │ │ ├── Arch_FreeRTOS_32.png
│ │ │ └── Arch_FreeRTOS_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-IoT-Analytics_48.png
│ │ │ ├── Arch_AWS-IoT-Analytics_48.svg
│ │ │ ├── Arch_AWS-IoT-Button_48.png
│ │ │ ├── Arch_AWS-IoT-Button_48.svg
│ │ │ ├── Arch_AWS-IoT-Core_48.png
│ │ │ ├── Arch_AWS-IoT-Core_48.svg
│ │ │ ├── Arch_AWS-IoT-Device-Defender_48.png
│ │ │ ├── Arch_AWS-IoT-Device-Defender_48.svg
│ │ │ ├── Arch_AWS-IoT-Device-Management_48.png
│ │ │ ├── Arch_AWS-IoT-Device-Management_48.svg
│ │ │ ├── Arch_AWS-IoT-Events_48.png
│ │ │ ├── Arch_AWS-IoT-Events_48.svg
│ │ │ ├── Arch_AWS-IoT-ExpressLink_48.png
│ │ │ ├── Arch_AWS-IoT-ExpressLink_48.svg
│ │ │ ├── Arch_AWS-IoT-FleetWise_48.png
│ │ │ ├── Arch_AWS-IoT-FleetWise_48.svg
│ │ │ ├── Arch_AWS-IoT-Greengrass_48.png
│ │ │ ├── Arch_AWS-IoT-Greengrass_48.svg
│ │ │ ├── Arch_AWS-IoT-SiteWise_48.png
│ │ │ ├── Arch_AWS-IoT-SiteWise_48.svg
│ │ │ ├── Arch_AWS-IoT-TwinMaker_48.png
│ │ │ ├── Arch_AWS-IoT-TwinMaker_48.svg
│ │ │ ├── Arch_FreeRTOS_48.png
│ │ │ └── Arch_FreeRTOS_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_AWS-IoT-Analytics_64.png
│ │ ├── Arch_AWS-IoT-Analytics_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-Button_64.png
│ │ ├── Arch_AWS-IoT-Button_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-Core_64.png
│ │ ├── Arch_AWS-IoT-Core_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-Device-Defender_64.png
│ │ ├── Arch_AWS-IoT-Device-Defender_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-Device-Management_64.png
│ │ ├── Arch_AWS-IoT-Device-Management_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-Events_64.png
│ │ ├── Arch_AWS-IoT-Events_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-ExpressLink_64.png
│ │ ├── Arch_AWS-IoT-ExpressLink_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-FleetWise_64.png
│ │ ├── Arch_AWS-IoT-FleetWise_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-Greengrass_64.png
│ │ ├── Arch_AWS-IoT-Greengrass_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-SiteWise_64.png
│ │ ├── Arch_AWS-IoT-SiteWise_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IoT-TwinMaker_64.png
│ │ ├── Arch_AWS-IoT-TwinMaker_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_FreeRTOS_64.png
│ │ ├── Arch_FreeRTOS_64.svg
│ │ └── [email protected]
│ ├── management-governance
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-CloudWatch_16.png
│ │ │ ├── Arch_Amazon-CloudWatch_16.svg
│ │ │ ├── Arch_Amazon-Managed-Grafana_16.png
│ │ │ ├── Arch_Amazon-Managed-Grafana_16.svg
│ │ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_16.png
│ │ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_16.svg
│ │ │ ├── Arch_AWS-AppConfig_16.png
│ │ │ ├── Arch_AWS-AppConfig_16.svg
│ │ │ ├── Arch_AWS-Application-Auto-Scaling_16.png
│ │ │ ├── Arch_AWS-Application-Auto-Scaling_16.svg
│ │ │ ├── Arch_AWS-Auto-Scaling_16.png
│ │ │ ├── Arch_AWS-Auto-Scaling_16.svg
│ │ │ ├── Arch_AWS-Backint-Agent_16.png
│ │ │ ├── Arch_AWS-Backint-Agent_16.svg
│ │ │ ├── Arch_AWS-Chatbot_16.png
│ │ │ ├── Arch_AWS-Chatbot_16.svg
│ │ │ ├── Arch_AWS-CloudFormation_16.png
│ │ │ ├── Arch_AWS-CloudFormation_16.svg
│ │ │ ├── Arch_AWS-CloudTrail_16.png
│ │ │ ├── Arch_AWS-CloudTrail_16.svg
│ │ │ ├── Arch_AWS-Compute-Optimizer_16.png
│ │ │ ├── Arch_AWS-Compute-Optimizer_16.svg
│ │ │ ├── Arch_AWS-Config_16.png
│ │ │ ├── Arch_AWS-Config_16.svg
│ │ │ ├── Arch_AWS-Console-Mobile-Application_16.png
│ │ │ ├── Arch_AWS-Console-Mobile-Application_16.svg
│ │ │ ├── Arch_AWS-Control-Tower_16.png
│ │ │ ├── Arch_AWS-Control-Tower_16.svg
│ │ │ ├── Arch_AWS-Distro-for-OpenTelemetry_16.png
│ │ │ ├── Arch_AWS-Distro-for-OpenTelemetry_16.svg
│ │ │ ├── Arch_AWS-Health-Dashboard_16.png
│ │ │ ├── Arch_AWS-Health-Dashboard_16.svg
│ │ │ ├── Arch_AWS-Launch-Wizard_16.png
│ │ │ ├── Arch_AWS-Launch-Wizard_16.svg
│ │ │ ├── Arch_AWS-License-Manager_16.png
│ │ │ ├── Arch_AWS-License-Manager_16.svg
│ │ │ ├── Arch_AWS-Management-Console_16.png
│ │ │ ├── Arch_AWS-Management-Console_16.svg
│ │ │ ├── Arch_AWS-Organizations_16.png
│ │ │ ├── Arch_AWS-Organizations_16.svg
│ │ │ ├── Arch_AWS-Proton_16.png
│ │ │ ├── Arch_AWS-Proton_16.svg
│ │ │ ├── Arch_AWS-Resilience-Hub_16.png
│ │ │ ├── Arch_AWS-Resilience-Hub_16.svg
│ │ │ ├── Arch_AWS-Resource-Explorer_16.png
│ │ │ ├── Arch_AWS-Resource-Explorer_16.svg
│ │ │ ├── Arch_AWS-Service-Catalog_16.png
│ │ │ ├── Arch_AWS-Service-Catalog_16.svg
│ │ │ ├── Arch_AWS-Service-Management-Connector_16.png
│ │ │ ├── Arch_AWS-Service-Management-Connector_16.svg
│ │ │ ├── Arch_AWS-Systems-Manager_16.png
│ │ │ ├── Arch_AWS-Systems-Manager_16.svg
│ │ │ ├── Arch_AWS-Telco-Network-Builder_16.png
│ │ │ ├── Arch_AWS-Telco-Network-Builder_16.svg
│ │ │ ├── Arch_AWS-Trusted-Advisor_16.png
│ │ │ ├── Arch_AWS-Trusted-Advisor_16.svg
│ │ │ ├── Arch_AWS-User-Notifications_16.png
│ │ │ ├── Arch_AWS-User-Notifications_16.svg
│ │ │ ├── Arch_AWS-Well-Architected-Tool_16.png
│ │ │ └── Arch_AWS-Well-Architected-Tool_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-CloudWatch_32.png
│ │ │ ├── Arch_Amazon-CloudWatch_32.svg
│ │ │ ├── Arch_Amazon-Managed-Grafana_32.png
│ │ │ ├── Arch_Amazon-Managed-Grafana_32.svg
│ │ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_32.png
│ │ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_32.svg
│ │ │ ├── Arch_AWS-AppConfig_32.png
│ │ │ ├── Arch_AWS-AppConfig_32.svg
│ │ │ ├── Arch_AWS-Application-Auto-Scaling_32.png
│ │ │ ├── Arch_AWS-Application-Auto-Scaling_32.svg
│ │ │ ├── Arch_AWS-Auto-Scaling_32.png
│ │ │ ├── Arch_AWS-Auto-Scaling_32.svg
│ │ │ ├── Arch_AWS-Backint-Agent_32.png
│ │ │ ├── Arch_AWS-Backint-Agent_32.svg
│ │ │ ├── Arch_AWS-Chatbot_32.png
│ │ │ ├── Arch_AWS-Chatbot_32.svg
│ │ │ ├── Arch_AWS-CloudFormation_32.png
│ │ │ ├── Arch_AWS-CloudFormation_32.svg
│ │ │ ├── Arch_AWS-CloudTrail_32.png
│ │ │ ├── Arch_AWS-CloudTrail_32.svg
│ │ │ ├── Arch_AWS-Compute-Optimizer_32.png
│ │ │ ├── Arch_AWS-Compute-Optimizer_32.svg
│ │ │ ├── Arch_AWS-Config_32.png
│ │ │ ├── Arch_AWS-Config_32.svg
│ │ │ ├── Arch_AWS-Console-Mobile-Application_32.png
│ │ │ ├── Arch_AWS-Console-Mobile-Application_32.svg
│ │ │ ├── Arch_AWS-Control-Tower_32.png
│ │ │ ├── Arch_AWS-Control-Tower_32.svg
│ │ │ ├── Arch_AWS-Distro-for-OpenTelemetry_32.png
│ │ │ ├── Arch_AWS-Distro-for-OpenTelemetry_32.svg
│ │ │ ├── Arch_AWS-Health-Dashboard_32.png
│ │ │ ├── Arch_AWS-Health-Dashboard_32.svg
│ │ │ ├── Arch_AWS-Launch-Wizard_32.png
│ │ │ ├── Arch_AWS-Launch-Wizard_32.svg
│ │ │ ├── Arch_AWS-License-Manager_32.png
│ │ │ ├── Arch_AWS-License-Manager_32.svg
│ │ │ ├── Arch_AWS-Management-Console_32.png
│ │ │ ├── Arch_AWS-Management-Console_32.svg
│ │ │ ├── Arch_AWS-Organizations_32.png
│ │ │ ├── Arch_AWS-Organizations_32.svg
│ │ │ ├── Arch_AWS-Proton_32.png
│ │ │ ├── Arch_AWS-Proton_32.svg
│ │ │ ├── Arch_AWS-Resilience-Hub_32.png
│ │ │ ├── Arch_AWS-Resilience-Hub_32.svg
│ │ │ ├── Arch_AWS-Resource-Explorer_32.png
│ │ │ ├── Arch_AWS-Resource-Explorer_32.svg
│ │ │ ├── Arch_AWS-Service-Catalog_32.png
│ │ │ ├── Arch_AWS-Service-Catalog_32.svg
│ │ │ ├── Arch_AWS-Service-Management-Connector_32.png
│ │ │ ├── Arch_AWS-Service-Management-Connector_32.svg
│ │ │ ├── Arch_AWS-Systems-Manager_32.png
│ │ │ ├── Arch_AWS-Systems-Manager_32.svg
│ │ │ ├── Arch_AWS-Telco-Network-Builder_32.png
│ │ │ ├── Arch_AWS-Telco-Network-Builder_32.svg
│ │ │ ├── Arch_AWS-Trusted-Advisor_32.png
│ │ │ ├── Arch_AWS-Trusted-Advisor_32.svg
│ │ │ ├── Arch_AWS-User-Notifications_32.png
│ │ │ ├── Arch_AWS-User-Notifications_32.svg
│ │ │ ├── Arch_AWS-Well-Architected-Tool_32.png
│ │ │ └── Arch_AWS-Well-Architected-Tool_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-CloudWatch_48.png
│ │ │ ├── Arch_Amazon-CloudWatch_48.svg
│ │ │ ├── Arch_Amazon-Managed-Grafana_48.png
│ │ │ ├── Arch_Amazon-Managed-Grafana_48.svg
│ │ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_48.png
│ │ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_48.svg
│ │ │ ├── Arch_AWS-AppConfig_48.png
│ │ │ ├── Arch_AWS-AppConfig_48.svg
│ │ │ ├── Arch_AWS-Application-Auto-Scaling_48.png
│ │ │ ├── Arch_AWS-Application-Auto-Scaling_48.svg
│ │ │ ├── Arch_AWS-Auto-Scaling_48.png
│ │ │ ├── Arch_AWS-Auto-Scaling_48.svg
│ │ │ ├── Arch_AWS-Backint-Agent_48.png
│ │ │ ├── Arch_AWS-Backint-Agent_48.svg
│ │ │ ├── Arch_AWS-Chatbot_48.png
│ │ │ ├── Arch_AWS-Chatbot_48.svg
│ │ │ ├── Arch_AWS-CloudFormation_48.png
│ │ │ ├── Arch_AWS-CloudFormation_48.svg
│ │ │ ├── Arch_AWS-CloudTrail_48.png
│ │ │ ├── Arch_AWS-CloudTrail_48.svg
│ │ │ ├── Arch_AWS-Compute-Optimizer_48.png
│ │ │ ├── Arch_AWS-Compute-Optimizer_48.svg
│ │ │ ├── Arch_AWS-Config_48.png
│ │ │ ├── Arch_AWS-Config_48.svg
│ │ │ ├── Arch_AWS-Console-Mobile-Application_48.png
│ │ │ ├── Arch_AWS-Console-Mobile-Application_48.svg
│ │ │ ├── Arch_AWS-Control-Tower_48.png
│ │ │ ├── Arch_AWS-Control-Tower_48.svg
│ │ │ ├── Arch_AWS-Distro-for-OpenTelemetry_48.png
│ │ │ ├── Arch_AWS-Distro-for-OpenTelemetry_48.svg
│ │ │ ├── Arch_AWS-Health-Dashboard_48.png
│ │ │ ├── Arch_AWS-Health-Dashboard_48.svg
│ │ │ ├── Arch_AWS-Launch-Wizard_48.png
│ │ │ ├── Arch_AWS-Launch-Wizard_48.svg
│ │ │ ├── Arch_AWS-License-Manager_48.png
│ │ │ ├── Arch_AWS-License-Manager_48.svg
│ │ │ ├── Arch_AWS-Management-Console_48.png
│ │ │ ├── Arch_AWS-Management-Console_48.svg
│ │ │ ├── Arch_AWS-Organizations_48.png
│ │ │ ├── Arch_AWS-Organizations_48.svg
│ │ │ ├── Arch_AWS-Proton_48.png
│ │ │ ├── Arch_AWS-Proton_48.svg
│ │ │ ├── Arch_AWS-Resilience-Hub_48.png
│ │ │ ├── Arch_AWS-Resilience-Hub_48.svg
│ │ │ ├── Arch_AWS-Resource-Explorer_48.png
│ │ │ ├── Arch_AWS-Resource-Explorer_48.svg
│ │ │ ├── Arch_AWS-Service-Catalog_48.png
│ │ │ ├── Arch_AWS-Service-Catalog_48.svg
│ │ │ ├── Arch_AWS-Service-Management-Connector_48.png
│ │ │ ├── Arch_AWS-Service-Management-Connector_48.svg
│ │ │ ├── Arch_AWS-Systems-Manager_48.png
│ │ │ ├── Arch_AWS-Systems-Manager_48.svg
│ │ │ ├── Arch_AWS-Telco-Network-Builder_48.png
│ │ │ ├── Arch_AWS-Telco-Network-Builder_48.svg
│ │ │ ├── Arch_AWS-Trusted-Advisor_48.png
│ │ │ ├── Arch_AWS-Trusted-Advisor_48.svg
│ │ │ ├── Arch_AWS-User-Notifications_48.png
│ │ │ ├── Arch_AWS-User-Notifications_48.svg
│ │ │ ├── Arch_AWS-Well-Architected-Tool_48.png
│ │ │ └── Arch_AWS-Well-Architected-Tool_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-CloudWatch_64.png
│ │ ├── Arch_Amazon-CloudWatch_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Managed-Grafana_64.png
│ │ ├── Arch_Amazon-Managed-Grafana_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_64.png
│ │ ├── Arch_Amazon-Managed-Service-for-Prometheus_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-AppConfig_64.png
│ │ ├── Arch_AWS-AppConfig_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Application-Auto-Scaling_64.png
│ │ ├── Arch_AWS-Application-Auto-Scaling_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Auto-Scaling_64.png
│ │ ├── Arch_AWS-Auto-Scaling_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Backint-Agent_64.png
│ │ ├── Arch_AWS-Backint-Agent_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Chatbot_64.png
│ │ ├── Arch_AWS-Chatbot_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CloudFormation_64.png
│ │ ├── Arch_AWS-CloudFormation_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CloudTrail_64.png
│ │ ├── Arch_AWS-CloudTrail_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Compute-Optimizer_64.png
│ │ ├── Arch_AWS-Compute-Optimizer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Config_64.png
│ │ ├── Arch_AWS-Config_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Console-Mobile-Application_64.png
│ │ ├── Arch_AWS-Console-Mobile-Application_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Control-Tower_64.png
│ │ ├── Arch_AWS-Control-Tower_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Distro-for-OpenTelemetry_64.png
│ │ ├── Arch_AWS-Distro-for-OpenTelemetry_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Health-Dashboard_64.png
│ │ ├── Arch_AWS-Health-Dashboard_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Launch-Wizard_64.png
│ │ ├── Arch_AWS-Launch-Wizard_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-License-Manager_64.png
│ │ ├── Arch_AWS-License-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Management-Console_64.png
│ │ ├── Arch_AWS-Management-Console_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Organizations_64.png
│ │ ├── Arch_AWS-Organizations_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Proton_64.png
│ │ ├── Arch_AWS-Proton_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Resilience-Hub_64.png
│ │ ├── Arch_AWS-Resilience-Hub_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Resource-Explorer_64.png
│ │ ├── Arch_AWS-Resource-Explorer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Service-Catalog_64.png
│ │ ├── Arch_AWS-Service-Catalog_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Service-Management-Connector_64.png
│ │ ├── Arch_AWS-Service-Management-Connector_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Systems-Manager_64.png
│ │ ├── Arch_AWS-Systems-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Telco-Network-Builder_64.png
│ │ ├── Arch_AWS-Telco-Network-Builder_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Trusted-Advisor_64.png
│ │ ├── Arch_AWS-Trusted-Advisor_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-User-Notifications_64.png
│ │ ├── Arch_AWS-User-Notifications_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Well-Architected-Tool_64.png
│ │ ├── Arch_AWS-Well-Architected-Tool_64.svg
│ │ └── [email protected]
│ ├── media-services
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Elastic-Transcoder_16.png
│ │ │ ├── Arch_Amazon-Elastic-Transcoder_16.svg
│ │ │ ├── Arch_Amazon-Interactive-Video-Service_16.png
│ │ │ ├── Arch_Amazon-Interactive-Video-Service_16.svg
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_16.png
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_16.svg
│ │ │ ├── Arch_AWS-Deadline-Cloud_16.png
│ │ │ ├── Arch_AWS-Deadline-Cloud_16.svg
│ │ │ ├── Arch_AWS-Elemental-Appliances-&-Software_16.png
│ │ │ ├── Arch_AWS-Elemental-Appliances-&-Software_16.svg
│ │ │ ├── Arch_AWS-Elemental-Conductor_16.png
│ │ │ ├── Arch_AWS-Elemental-Conductor_16.svg
│ │ │ ├── Arch_AWS-Elemental-Delta_16.png
│ │ │ ├── Arch_AWS-Elemental-Delta_16.svg
│ │ │ ├── Arch_AWS-Elemental-Link_16.png
│ │ │ ├── Arch_AWS-Elemental-Link_16.svg
│ │ │ ├── Arch_AWS-Elemental-Live_16.png
│ │ │ ├── Arch_AWS-Elemental-Live_16.svg
│ │ │ ├── Arch_AWS-Elemental-MediaConnect_16.png
│ │ │ ├── Arch_AWS-Elemental-MediaConnect_16.svg
│ │ │ ├── Arch_AWS-Elemental-MediaConvert_16.png
│ │ │ ├── Arch_AWS-Elemental-MediaConvert_16.svg
│ │ │ ├── Arch_AWS-Elemental-MediaLive_16.png
│ │ │ ├── Arch_AWS-Elemental-MediaLive_16.svg
│ │ │ ├── Arch_AWS-Elemental-MediaPackage_16.png
│ │ │ ├── Arch_AWS-Elemental-MediaPackage_16.svg
│ │ │ ├── Arch_AWS-Elemental-MediaStore_16.png
│ │ │ ├── Arch_AWS-Elemental-MediaStore_16.svg
│ │ │ ├── Arch_AWS-Elemental-MediaTailor_16.png
│ │ │ ├── Arch_AWS-Elemental-MediaTailor_16.svg
│ │ │ ├── Arch_AWS-Elemental-Server_16.png
│ │ │ ├── Arch_AWS-Elemental-Server_16.svg
│ │ │ ├── Arch_AWS-Thinkbox-Deadline_16.png
│ │ │ ├── Arch_AWS-Thinkbox-Deadline_16.svg
│ │ │ ├── Arch_AWS-Thinkbox-Frost_16.png
│ │ │ ├── Arch_AWS-Thinkbox-Frost_16.svg
│ │ │ ├── Arch_AWS-Thinkbox-Krakatoa_16.png
│ │ │ ├── Arch_AWS-Thinkbox-Krakatoa_16.svg
│ │ │ ├── Arch_AWS-Thinkbox-Sequoia_16.png
│ │ │ ├── Arch_AWS-Thinkbox-Sequoia_16.svg
│ │ │ ├── Arch_AWS-Thinkbox-Stoke_16.png
│ │ │ ├── Arch_AWS-Thinkbox-Stoke_16.svg
│ │ │ ├── Arch_AWS-Thinkbox-XMesh_16.png
│ │ │ └── Arch_AWS-Thinkbox-XMesh_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Elastic-Transcoder_32.png
│ │ │ ├── Arch_Amazon-Elastic-Transcoder_32.svg
│ │ │ ├── Arch_Amazon-Interactive-Video-Service_32.png
│ │ │ ├── Arch_Amazon-Interactive-Video-Service_32.svg
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_32.png
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_32.svg
│ │ │ ├── Arch_AWS-Deadline-Cloud_32.png
│ │ │ ├── Arch_AWS-Deadline-Cloud_32.svg
│ │ │ ├── Arch_AWS-Elemental-Appliances-&-Software_32.png
│ │ │ ├── Arch_AWS-Elemental-Appliances-&-Software_32.svg
│ │ │ ├── Arch_AWS-Elemental-Conductor_32.png
│ │ │ ├── Arch_AWS-Elemental-Conductor_32.svg
│ │ │ ├── Arch_AWS-Elemental-Delta_32.png
│ │ │ ├── Arch_AWS-Elemental-Delta_32.svg
│ │ │ ├── Arch_AWS-Elemental-Link_32.png
│ │ │ ├── Arch_AWS-Elemental-Link_32.svg
│ │ │ ├── Arch_AWS-Elemental-Live_32.png
│ │ │ ├── Arch_AWS-Elemental-Live_32.svg
│ │ │ ├── Arch_AWS-Elemental-MediaConnect_32.png
│ │ │ ├── Arch_AWS-Elemental-MediaConnect_32.svg
│ │ │ ├── Arch_AWS-Elemental-MediaConvert_32.png
│ │ │ ├── Arch_AWS-Elemental-MediaConvert_32.svg
│ │ │ ├── Arch_AWS-Elemental-MediaLive_32.png
│ │ │ ├── Arch_AWS-Elemental-MediaLive_32.svg
│ │ │ ├── Arch_AWS-Elemental-MediaPackage_32.png
│ │ │ ├── Arch_AWS-Elemental-MediaPackage_32.svg
│ │ │ ├── Arch_AWS-Elemental-MediaStore_32.png
│ │ │ ├── Arch_AWS-Elemental-MediaStore_32.svg
│ │ │ ├── Arch_AWS-Elemental-MediaTailor_32.png
│ │ │ ├── Arch_AWS-Elemental-MediaTailor_32.svg
│ │ │ ├── Arch_AWS-Elemental-Server_32.png
│ │ │ ├── Arch_AWS-Elemental-Server_32.svg
│ │ │ ├── Arch_AWS-Thinkbox-Deadline_32.png
│ │ │ ├── Arch_AWS-Thinkbox-Deadline_32.svg
│ │ │ ├── Arch_AWS-Thinkbox-Frost_32.png
│ │ │ ├── Arch_AWS-Thinkbox-Frost_32.svg
│ │ │ ├── Arch_AWS-Thinkbox-Krakatoa_32.png
│ │ │ ├── Arch_AWS-Thinkbox-Krakatoa_32.svg
│ │ │ ├── Arch_AWS-Thinkbox-Sequoia_32.png
│ │ │ ├── Arch_AWS-Thinkbox-Sequoia_32.svg
│ │ │ ├── Arch_AWS-Thinkbox-Stoke_32.png
│ │ │ ├── Arch_AWS-Thinkbox-Stoke_32.svg
│ │ │ ├── Arch_AWS-Thinkbox-XMesh_32.png
│ │ │ └── Arch_AWS-Thinkbox-XMesh_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-Elastic-Transcoder_48.png
│ │ │ ├── Arch_Amazon-Elastic-Transcoder_48.svg
│ │ │ ├── Arch_Amazon-Interactive-Video-Service_48.png
│ │ │ ├── Arch_Amazon-Interactive-Video-Service_48.svg
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_48.png
│ │ │ ├── Arch_Amazon-Kinesis-Video-Streams_48.svg
│ │ │ ├── Arch_AWS-Deadline-Cloud_48.png
│ │ │ ├── Arch_AWS-Deadline-Cloud_48.svg
│ │ │ ├── Arch_AWS-Elemental-Appliances-&-Software_48.png
│ │ │ ├── Arch_AWS-Elemental-Appliances-&-Software_48.svg
│ │ │ ├── Arch_AWS-Elemental-Conductor_48.png
│ │ │ ├── Arch_AWS-Elemental-Conductor_48.svg
│ │ │ ├── Arch_AWS-Elemental-Delta_48.png
│ │ │ ├── Arch_AWS-Elemental-Delta_48.svg
│ │ │ ├── Arch_AWS-Elemental-Link_48.png
│ │ │ ├── Arch_AWS-Elemental-Link_48.svg
│ │ │ ├── Arch_AWS-Elemental-Live_48.png
│ │ │ ├── Arch_AWS-Elemental-Live_48.svg
│ │ │ ├── Arch_AWS-Elemental-MediaConnect_48.png
│ │ │ ├── Arch_AWS-Elemental-MediaConnect_48.svg
│ │ │ ├── Arch_AWS-Elemental-MediaConvert_48.png
│ │ │ ├── Arch_AWS-Elemental-MediaConvert_48.svg
│ │ │ ├── Arch_AWS-Elemental-MediaLive_48.png
│ │ │ ├── Arch_AWS-Elemental-MediaLive_48.svg
│ │ │ ├── Arch_AWS-Elemental-MediaPackage_48.png
│ │ │ ├── Arch_AWS-Elemental-MediaPackage_48.svg
│ │ │ ├── Arch_AWS-Elemental-MediaStore_48.png
│ │ │ ├── Arch_AWS-Elemental-MediaStore_48.svg
│ │ │ ├── Arch_AWS-Elemental-MediaTailor_48.png
│ │ │ ├── Arch_AWS-Elemental-MediaTailor_48.svg
│ │ │ ├── Arch_AWS-Elemental-Server_48.png
│ │ │ ├── Arch_AWS-Elemental-Server_48.svg
│ │ │ ├── Arch_AWS-Thinkbox-Deadline_48.png
│ │ │ ├── Arch_AWS-Thinkbox-Deadline_48.svg
│ │ │ ├── Arch_AWS-Thinkbox-Frost_48.png
│ │ │ ├── Arch_AWS-Thinkbox-Frost_48.svg
│ │ │ ├── Arch_AWS-Thinkbox-Krakatoa_48.png
│ │ │ ├── Arch_AWS-Thinkbox-Krakatoa_48.svg
│ │ │ ├── Arch_AWS-Thinkbox-Sequoia_48.png
│ │ │ ├── Arch_AWS-Thinkbox-Sequoia_48.svg
│ │ │ ├── Arch_AWS-Thinkbox-Stoke_48.png
│ │ │ ├── Arch_AWS-Thinkbox-Stoke_48.svg
│ │ │ ├── Arch_AWS-Thinkbox-XMesh_48.png
│ │ │ └── Arch_AWS-Thinkbox-XMesh_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-Elastic-Transcoder_64.png
│ │ ├── Arch_Amazon-Elastic-Transcoder_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Interactive-Video-Service_64.png
│ │ ├── Arch_Amazon-Interactive-Video-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Kinesis-Video-Streams_64.png
│ │ ├── Arch_Amazon-Kinesis-Video-Streams_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Deadline-Cloud_64.png
│ │ ├── Arch_AWS-Deadline-Cloud_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-Appliances-&-Software_64.png
│ │ ├── Arch_AWS-Elemental-Appliances-&-Software_64.svg
│ │ ├── Arch_AWS-Elemental-Appliances-&[email protected]
│ │ ├── Arch_AWS-Elemental-Conductor_64.png
│ │ ├── Arch_AWS-Elemental-Conductor_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-Delta_64.png
│ │ ├── Arch_AWS-Elemental-Delta_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-Link_64.png
│ │ ├── Arch_AWS-Elemental-Link_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-Live_64.png
│ │ ├── Arch_AWS-Elemental-Live_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-MediaConnect_64.png
│ │ ├── Arch_AWS-Elemental-MediaConnect_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-MediaConvert_64.png
│ │ ├── Arch_AWS-Elemental-MediaConvert_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-MediaLive_64.png
│ │ ├── Arch_AWS-Elemental-MediaLive_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-MediaPackage_64.png
│ │ ├── Arch_AWS-Elemental-MediaPackage_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-MediaStore_64.png
│ │ ├── Arch_AWS-Elemental-MediaStore_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-MediaTailor_64.png
│ │ ├── Arch_AWS-Elemental-MediaTailor_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Elemental-Server_64.png
│ │ ├── Arch_AWS-Elemental-Server_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Thinkbox-Deadline_64.png
│ │ ├── Arch_AWS-Thinkbox-Deadline_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Thinkbox-Frost_64.png
│ │ ├── Arch_AWS-Thinkbox-Frost_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Thinkbox-Krakatoa_64.png
│ │ ├── Arch_AWS-Thinkbox-Krakatoa_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Thinkbox-Sequoia_64.png
│ │ ├── Arch_AWS-Thinkbox-Sequoia_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Thinkbox-Stoke_64.png
│ │ ├── Arch_AWS-Thinkbox-Stoke_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Thinkbox-XMesh_64.png
│ │ ├── Arch_AWS-Thinkbox-XMesh_64.svg
│ │ └── [email protected]
│ ├── migration-modernization
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-Application-Discovery-Service_16.png
│ │ │ ├── Arch_AWS-Application-Discovery-Service_16.svg
│ │ │ ├── Arch_AWS-Application-Migration-Service_16.png
│ │ │ ├── Arch_AWS-Application-Migration-Service_16.svg
│ │ │ ├── Arch_AWS-Data-Transfer-Terminal_16.png
│ │ │ ├── Arch_AWS-Data-Transfer-Terminal_16.svg
│ │ │ ├── Arch_AWS-DataSync_16.png
│ │ │ ├── Arch_AWS-DataSync_16.svg
│ │ │ ├── Arch_AWS-Mainframe-Modernization_16.png
│ │ │ ├── Arch_AWS-Mainframe-Modernization_16.svg
│ │ │ ├── Arch_AWS-Migration-Evaluator_16.png
│ │ │ ├── Arch_AWS-Migration-Evaluator_16.svg
│ │ │ ├── Arch_AWS-Migration-Hub_16.png
│ │ │ ├── Arch_AWS-Migration-Hub_16.svg
│ │ │ ├── Arch_AWS-Transfer-Family_16.png
│ │ │ ├── Arch_AWS-Transfer-Family_16.svg
│ │ │ ├── Arch_AWS-Transform_16.png
│ │ │ └── Arch_AWS-Transform_16.svg
│ │ ├── 32
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-Application-Discovery-Service_32.png
│ │ │ ├── Arch_AWS-Application-Discovery-Service_32.svg
│ │ │ ├── Arch_AWS-Application-Migration-Service_32.png
│ │ │ ├── Arch_AWS-Application-Migration-Service_32.svg
│ │ │ ├── Arch_AWS-Data-Transfer-Terminal_32.png
│ │ │ ├── Arch_AWS-Data-Transfer-Terminal_32.svg
│ │ │ ├── Arch_AWS-DataSync_32.png
│ │ │ ├── Arch_AWS-DataSync_32.svg
│ │ │ ├── Arch_AWS-Mainframe-Modernization_32.png
│ │ │ ├── Arch_AWS-Mainframe-Modernization_32.svg
│ │ │ ├── Arch_AWS-Migration-Evaluator_32.png
│ │ │ ├── Arch_AWS-Migration-Evaluator_32.svg
│ │ │ ├── Arch_AWS-Migration-Hub_32.png
│ │ │ ├── Arch_AWS-Migration-Hub_32.svg
│ │ │ ├── Arch_AWS-Transfer-Family_32.png
│ │ │ ├── Arch_AWS-Transfer-Family_32.svg
│ │ │ ├── Arch_AWS-Transform_32.png
│ │ │ └── Arch_AWS-Transform_32.svg
│ │ ├── 48
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_AWS-Application-Discovery-Service_48.png
│ │ │ ├── Arch_AWS-Application-Discovery-Service_48.svg
│ │ │ ├── Arch_AWS-Application-Migration-Service_48.png
│ │ │ ├── Arch_AWS-Application-Migration-Service_48.svg
│ │ │ ├── Arch_AWS-Data-Transfer-Terminal_48.png
│ │ │ ├── Arch_AWS-Data-Transfer-Terminal_48.svg
│ │ │ ├── Arch_AWS-DataSync_48.png
│ │ │ ├── Arch_AWS-DataSync_48.svg
│ │ │ ├── Arch_AWS-Mainframe-Modernization_48.png
│ │ │ ├── Arch_AWS-Mainframe-Modernization_48.svg
│ │ │ ├── Arch_AWS-Migration-Evaluator_48.png
│ │ │ ├── Arch_AWS-Migration-Evaluator_48.svg
│ │ │ ├── Arch_AWS-Migration-Hub_48.png
│ │ │ ├── Arch_AWS-Migration-Hub_48.svg
│ │ │ ├── Arch_AWS-Transfer-Family_48.png
│ │ │ ├── Arch_AWS-Transfer-Family_48.svg
│ │ │ ├── Arch_AWS-Transform_48.png
│ │ │ └── Arch_AWS-Transform_48.svg
│ │ └── 64
│ │ ├── .DS_Store
│ │ ├── Arch_AWS-Application-Discovery-Service_64.png
│ │ ├── Arch_AWS-Application-Discovery-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Application-Migration-Service_64.png
│ │ ├── Arch_AWS-Application-Migration-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Data-Transfer-Terminal_64.png
│ │ ├── Arch_AWS-Data-Transfer-Terminal_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-DataSync_64.png
│ │ ├── Arch_AWS-DataSync_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Mainframe-Modernization_64.png
│ │ ├── Arch_AWS-Mainframe-Modernization_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Migration-Evaluator_64.png
│ │ ├── Arch_AWS-Migration-Evaluator_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Migration-Hub_64.png
│ │ ├── Arch_AWS-Migration-Hub_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Transfer-Family_64.png
│ │ ├── Arch_AWS-Transfer-Family_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Transform_64.png
│ │ ├── Arch_AWS-Transform_64.svg
│ │ └── [email protected]
│ ├── networking-content-delivery
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── .DS_Store
│ │ │ ├── Arch_Amazon-API-Gateway_16.png
│ │ │ ├── Arch_Amazon-API-Gateway_16.svg
│ │ │ ├── Arch_Amazon-Application-Recovery-Controller_16.png
│ │ │ ├── Arch_Amazon-Application-Recovery-Controller_16.svg
│ │ │ ├── Arch_Amazon-CloudFront_16.png
│ │ │ ├── Arch_Amazon-CloudFront_16.svg
│ │ │ ├── Arch_Amazon-Route-53_16.png
│ │ │ ├── Arch_Amazon-Route-53_16.svg
│ │ │ ├── Arch_Amazon-Virtual-Private-Cloud_16.png
│ │ │ ├── Arch_Amazon-Virtual-Private-Cloud_16.svg
│ │ │ ├── Arch_Amazon-VPC-Lattice_16.png
│ │ │ ├── Arch_Amazon-VPC-Lattice_16.svg
│ │ │ ├── Arch_AWS-App-Mesh_16.png
│ │ │ ├── Arch_AWS-App-Mesh_16.svg
│ │ │ ├── Arch_AWS-Client-VPN_16.png
│ │ │ ├── Arch_AWS-Client-VPN_16.svg
│ │ │ ├── Arch_AWS-Cloud-Map_16.png
│ │ │ ├── Arch_AWS-Cloud-Map_16.svg
│ │ │ ├── Arch_AWS-Cloud-WAN_16.png
│ │ │ ├── Arch_AWS-Cloud-WAN_16.svg
│ │ │ ├── Arch_AWS-Direct-Connect_16.png
│ │ │ ├── Arch_AWS-Direct-Connect_16.svg
│ │ │ ├── Arch_AWS-Global-Accelerator_16.png
│ │ │ ├── Arch_AWS-Global-Accelerator_16.svg
│ │ │ ├── Arch_AWS-Private-5G_16.png
│ │ │ ├── Arch_AWS-Private-5G_16.svg
│ │ │ ├── Arch_AWS-PrivateLink_16.png
│ │ │ ├── Arch_AWS-PrivateLink_16.svg
│ │ │ ├── Arch_AWS-Site-to-Site-VPN_16.png
│ │ │ ├── Arch_AWS-Site-to-Site-VPN_16.svg
│ │ │ ├── Arch_AWS-Transit-Gateway_16.png
│ │ │ ├── Arch_AWS-Transit-Gateway_16.svg
│ │ │ ├── Arch_AWS-Verified-Access_16.png
│ │ │ ├── Arch_AWS-Verified-Access_16.svg
│ │ │ ├── Arch_Elastic-Load-Balancing_16.png
│ │ │ └── Arch_Elastic-Load-Balancing_16.svg
│ │ ├── 32
│ │ │ ├── Arch_Amazon-API-Gateway_32.png
│ │ │ ├── Arch_Amazon-API-Gateway_32.svg
│ │ │ ├── Arch_Amazon-Application-Recovery-Controller_32.png
│ │ │ ├── Arch_Amazon-Application-Recovery-Controller_32.svg
│ │ │ ├── Arch_Amazon-CloudFront_32.png
│ │ │ ├── Arch_Amazon-CloudFront_32.svg
│ │ │ ├── Arch_Amazon-Route-53_32.png
│ │ │ ├── Arch_Amazon-Route-53_32.svg
│ │ │ ├── Arch_Amazon-Virtual-Private-Cloud_32.png
│ │ │ ├── Arch_Amazon-Virtual-Private-Cloud_32.svg
│ │ │ ├── Arch_Amazon-VPC-Lattice_32.png
│ │ │ ├── Arch_Amazon-VPC-Lattice_32.svg
│ │ │ ├── Arch_AWS-App-Mesh_32.png
│ │ │ ├── Arch_AWS-App-Mesh_32.svg
│ │ │ ├── Arch_AWS-Client-VPN_32.png
│ │ │ ├── Arch_AWS-Client-VPN_32.svg
│ │ │ ├── Arch_AWS-Cloud-Map_32.png
│ │ │ ├── Arch_AWS-Cloud-Map_32.svg
│ │ │ ├── Arch_AWS-Cloud-WAN_32.png
│ │ │ ├── Arch_AWS-Cloud-WAN_32.svg
│ │ │ ├── Arch_AWS-Direct-Connect_32.png
│ │ │ ├── Arch_AWS-Direct-Connect_32.svg
│ │ │ ├── Arch_AWS-Global-Accelerator_32.png
│ │ │ ├── Arch_AWS-Global-Accelerator_32.svg
│ │ │ ├── Arch_AWS-Private-5G_32.png
│ │ │ ├── Arch_AWS-Private-5G_32.svg
│ │ │ ├── Arch_AWS-PrivateLink_32.png
│ │ │ ├── Arch_AWS-PrivateLink_32.svg
│ │ │ ├── Arch_AWS-Site-to-Site-VPN_32.png
│ │ │ ├── Arch_AWS-Site-to-Site-VPN_32.svg
│ │ │ ├── Arch_AWS-Transit-Gateway_32.png
│ │ │ ├── Arch_AWS-Transit-Gateway_32.svg
│ │ │ ├── Arch_AWS-Verified-Access_32.png
│ │ │ ├── Arch_AWS-Verified-Access_32.svg
│ │ │ ├── Arch_Elastic-Load-Balancing_32.png
│ │ │ └── Arch_Elastic-Load-Balancing_32.svg
│ │ ├── 48
│ │ │ ├── Arch_Amazon-API-Gateway_48.png
│ │ │ ├── Arch_Amazon-API-Gateway_48.svg
│ │ │ ├── Arch_Amazon-Application-Recovery-Controller_48.png
│ │ │ ├── Arch_Amazon-Application-Recovery-Controller_48.svg
│ │ │ ├── Arch_Amazon-CloudFront_48.png
│ │ │ ├── Arch_Amazon-CloudFront_48.svg
│ │ │ ├── Arch_Amazon-Route-53_48.png
│ │ │ ├── Arch_Amazon-Route-53_48.svg
│ │ │ ├── Arch_Amazon-Virtual-Private-Cloud_48.png
│ │ │ ├── Arch_Amazon-Virtual-Private-Cloud_48.svg
│ │ │ ├── Arch_Amazon-VPC-Lattice_48.png
│ │ │ ├── Arch_Amazon-VPC-Lattice_48.svg
│ │ │ ├── Arch_AWS-App-Mesh_48.png
│ │ │ ├── Arch_AWS-App-Mesh_48.svg
│ │ │ ├── Arch_AWS-Client-VPN_48.png
│ │ │ ├── Arch_AWS-Client-VPN_48.svg
│ │ │ ├── Arch_AWS-Cloud-Map_48.png
│ │ │ ├── Arch_AWS-Cloud-Map_48.svg
│ │ │ ├── Arch_AWS-Cloud-WAN_48.png
│ │ │ ├── Arch_AWS-Cloud-WAN_48.svg
│ │ │ ├── Arch_AWS-Direct-Connect_48.png
│ │ │ ├── Arch_AWS-Direct-Connect_48.svg
│ │ │ ├── Arch_AWS-Global-Accelerator_48.png
│ │ │ ├── Arch_AWS-Global-Accelerator_48.svg
│ │ │ ├── Arch_AWS-Private-5G_48.png
│ │ │ ├── Arch_AWS-Private-5G_48.svg
│ │ │ ├── Arch_AWS-PrivateLink_48.png
│ │ │ ├── Arch_AWS-PrivateLink_48.svg
│ │ │ ├── Arch_AWS-Site-to-Site-VPN_48.png
│ │ │ ├── Arch_AWS-Site-to-Site-VPN_48.svg
│ │ │ ├── Arch_AWS-Transit-Gateway_48.png
│ │ │ ├── Arch_AWS-Transit-Gateway_48.svg
│ │ │ ├── Arch_AWS-Verified-Access_48.png
│ │ │ ├── Arch_AWS-Verified-Access_48.svg
│ │ │ ├── Arch_Elastic-Load-Balancing_48.png
│ │ │ └── Arch_Elastic-Load-Balancing_48.svg
│ │ └── 64
│ │ ├── Arch_Amazon-API-Gateway_64.png
│ │ ├── Arch_Amazon-API-Gateway_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Application-Recovery-Controller_64.png
│ │ ├── Arch_Amazon-Application-Recovery-Controller_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-CloudFront_64.png
│ │ ├── Arch_Amazon-CloudFront_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Route-53_64.png
│ │ ├── Arch_Amazon-Route-53_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Virtual-Private-Cloud_64.png
│ │ ├── Arch_Amazon-Virtual-Private-Cloud_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-VPC-Lattice_64.png
│ │ ├── Arch_Amazon-VPC-Lattice_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-App-Mesh_64.png
│ │ ├── Arch_AWS-App-Mesh_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Client-VPN_64.png
│ │ ├── Arch_AWS-Client-VPN_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cloud-Map_64.png
│ │ ├── Arch_AWS-Cloud-Map_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Cloud-WAN_64.png
│ │ ├── Arch_AWS-Cloud-WAN_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Direct-Connect_64.png
│ │ ├── Arch_AWS-Direct-Connect_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Global-Accelerator_64.png
│ │ ├── Arch_AWS-Global-Accelerator_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Private-5G_64.png
│ │ ├── Arch_AWS-Private-5G_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-PrivateLink_64.png
│ │ ├── Arch_AWS-PrivateLink_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Site-to-Site-VPN_64.png
│ │ ├── Arch_AWS-Site-to-Site-VPN_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Transit-Gateway_64.png
│ │ ├── Arch_AWS-Transit-Gateway_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Verified-Access_64.png
│ │ ├── Arch_AWS-Verified-Access_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Elastic-Load-Balancing_64.png
│ │ ├── Arch_Elastic-Load-Balancing_64.svg
│ │ └── [email protected]
│ ├── quantum-technologies
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_Amazon-Braket_16.png
│ │ │ └── Arch_Amazon-Braket_16.svg
│ │ ├── 32
│ │ │ ├── Arch_Amazon-Braket_32.png
│ │ │ └── Arch_Amazon-Braket_32.svg
│ │ ├── 48
│ │ │ ├── Arch_Amazon-Braket_48.png
│ │ │ └── Arch_Amazon-Braket_48.svg
│ │ └── 64
│ │ ├── Arch_Amazon-Braket_64.png
│ │ ├── Arch_Amazon-Braket_64.svg
│ │ └── [email protected]
│ ├── satellite
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_AWS-Ground-Station_16.png
│ │ │ └── Arch_AWS-Ground-Station_16.svg
│ │ ├── 32
│ │ │ ├── Arch_AWS-Ground-Station_32.png
│ │ │ └── Arch_AWS-Ground-Station_32.svg
│ │ ├── 48
│ │ │ ├── Arch_AWS-Ground-Station_48.png
│ │ │ └── Arch_AWS-Ground-Station_48.svg
│ │ └── 64
│ │ ├── Arch_AWS-Ground-Station_64.png
│ │ ├── Arch_AWS-Ground-Station_64.svg
│ │ └── [email protected]
│ ├── security-identity-compliance
│ │ ├── .DS_Store
│ │ ├── 16
│ │ │ ├── Arch_Amazon-Cloud-Directory_16.png
│ │ │ ├── Arch_Amazon-Cloud-Directory_16.svg
│ │ │ ├── Arch_Amazon-Cognito_16.png
│ │ │ ├── Arch_Amazon-Cognito_16.svg
│ │ │ ├── Arch_Amazon-Detective_16.png
│ │ │ ├── Arch_Amazon-Detective_16.svg
│ │ │ ├── Arch_Amazon-GuardDuty_16.png
│ │ │ ├── Arch_Amazon-GuardDuty_16.svg
│ │ │ ├── Arch_Amazon-Inspector_16.png
│ │ │ ├── Arch_Amazon-Inspector_16.svg
│ │ │ ├── Arch_Amazon-Macie_16.png
│ │ │ ├── Arch_Amazon-Macie_16.svg
│ │ │ ├── Arch_Amazon-Security-Lake_16.png
│ │ │ ├── Arch_Amazon-Security-Lake_16.svg
│ │ │ ├── Arch_Amazon-Verified-Permissions_16.png
│ │ │ ├── Arch_Amazon-Verified-Permissions_16.svg
│ │ │ ├── Arch_AWS-Artifact_16.png
│ │ │ ├── Arch_AWS-Artifact_16.svg
│ │ │ ├── Arch_AWS-Audit-Manager_16.png
│ │ │ ├── Arch_AWS-Audit-Manager_16.svg
│ │ │ ├── Arch_AWS-Certificate-Manager_16.png
│ │ │ ├── Arch_AWS-Certificate-Manager_16.svg
│ │ │ ├── Arch_AWS-CloudHSM_16.png
│ │ │ ├── Arch_AWS-CloudHSM_16.svg
│ │ │ ├── Arch_AWS-Directory-Service_16.png
│ │ │ ├── Arch_AWS-Directory-Service_16.svg
│ │ │ ├── Arch_AWS-Firewall-Manager_16.png
│ │ │ ├── Arch_AWS-Firewall-Manager_16.svg
│ │ │ ├── Arch_AWS-IAM-Identity-Center_16.png
│ │ │ ├── Arch_AWS-IAM-Identity-Center_16.svg
│ │ │ ├── Arch_AWS-Identity-and-Access-Management_16.png
│ │ │ ├── Arch_AWS-Identity-and-Access-Management_16.svg
│ │ │ ├── Arch_AWS-Key-Management-Service_16.png
│ │ │ ├── Arch_AWS-Key-Management-Service_16.svg
│ │ │ ├── Arch_AWS-Network-Firewall_16.png
│ │ │ ├── Arch_AWS-Network-Firewall_16.svg
│ │ │ ├── Arch_AWS-Payment-Cryptography_16.png
│ │ │ ├── Arch_AWS-Payment-Cryptography_16.svg
│ │ │ ├── Arch_AWS-Private-Certificate-Authority_16.png
│ │ │ ├── Arch_AWS-Private-Certificate-Authority_16.svg
│ │ │ ├── Arch_AWS-Resource-Access-Manager_16.png
│ │ │ ├── Arch_AWS-Resource-Access-Manager_16.svg
│ │ │ ├── Arch_AWS-Secrets-Manager_16.png
│ │ │ ├── Arch_AWS-Secrets-Manager_16.svg
│ │ │ ├── Arch_AWS-Security-Hub_16.png
│ │ │ ├── Arch_AWS-Security-Hub_16.svg
│ │ │ ├── Arch_AWS-Security-Incident-Response_16.png
│ │ │ ├── Arch_AWS-Security-Incident-Response_16.svg
│ │ │ ├── Arch_AWS-Shield_16.png
│ │ │ ├── Arch_AWS-Shield_16.svg
│ │ │ ├── Arch_AWS-Signer_16.png
│ │ │ ├── Arch_AWS-Signer_16.svg
│ │ │ ├── Arch_AWS-WAF_16.png
│ │ │ └── Arch_AWS-WAF_16.svg
│ │ ├── 32
│ │ │ ├── Arch_Amazon-Cloud-Directory_32.png
│ │ │ ├── Arch_Amazon-Cloud-Directory_32.svg
│ │ │ ├── Arch_Amazon-Cognito_32.png
│ │ │ ├── Arch_Amazon-Cognito_32.svg
│ │ │ ├── Arch_Amazon-Detective_32.png
│ │ │ ├── Arch_Amazon-Detective_32.svg
│ │ │ ├── Arch_Amazon-GuardDuty_32.png
│ │ │ ├── Arch_Amazon-GuardDuty_32.svg
│ │ │ ├── Arch_Amazon-Inspector_32.png
│ │ │ ├── Arch_Amazon-Inspector_32.svg
│ │ │ ├── Arch_Amazon-Macie_32.png
│ │ │ ├── Arch_Amazon-Macie_32.svg
│ │ │ ├── Arch_Amazon-Security-Lake_32.png
│ │ │ ├── Arch_Amazon-Security-Lake_32.svg
│ │ │ ├── Arch_Amazon-Verified-Permissions_32.png
│ │ │ ├── Arch_Amazon-Verified-Permissions_32.svg
│ │ │ ├── Arch_AWS-Artifact_32.png
│ │ │ ├── Arch_AWS-Artifact_32.svg
│ │ │ ├── Arch_AWS-Audit-Manager_32.png
│ │ │ ├── Arch_AWS-Audit-Manager_32.svg
│ │ │ ├── Arch_AWS-Certificate-Manager_32.png
│ │ │ ├── Arch_AWS-Certificate-Manager_32.svg
│ │ │ ├── Arch_AWS-CloudHSM_32.png
│ │ │ ├── Arch_AWS-CloudHSM_32.svg
│ │ │ ├── Arch_AWS-Directory-Service_32.png
│ │ │ ├── Arch_AWS-Directory-Service_32.svg
│ │ │ ├── Arch_AWS-Firewall-Manager_32.png
│ │ │ ├── Arch_AWS-Firewall-Manager_32.svg
│ │ │ ├── Arch_AWS-IAM-Identity-Center_32.png
│ │ │ ├── Arch_AWS-IAM-Identity-Center_32.svg
│ │ │ ├── Arch_AWS-Identity-and-Access-Management_32.png
│ │ │ ├── Arch_AWS-Identity-and-Access-Management_32.svg
│ │ │ ├── Arch_AWS-Key-Management-Service_32.png
│ │ │ ├── Arch_AWS-Key-Management-Service_32.svg
│ │ │ ├── Arch_AWS-Network-Firewall_32.png
│ │ │ ├── Arch_AWS-Network-Firewall_32.svg
│ │ │ ├── Arch_AWS-Payment-Cryptography_32.png
│ │ │ ├── Arch_AWS-Payment-Cryptography_32.svg
│ │ │ ├── Arch_AWS-Private-Certificate-Authority_32.png
│ │ │ ├── Arch_AWS-Private-Certificate-Authority_32.svg
│ │ │ ├── Arch_AWS-Resource-Access-Manager_32.png
│ │ │ ├── Arch_AWS-Resource-Access-Manager_32.svg
│ │ │ ├── Arch_AWS-Secrets-Manager_32.png
│ │ │ ├── Arch_AWS-Secrets-Manager_32.svg
│ │ │ ├── Arch_AWS-Security-Hub_32.png
│ │ │ ├── Arch_AWS-Security-Hub_32.svg
│ │ │ ├── Arch_AWS-Security-Incident-Response_32.png
│ │ │ ├── Arch_AWS-Security-Incident-Response_32.svg
│ │ │ ├── Arch_AWS-Shield_32.png
│ │ │ ├── Arch_AWS-Shield_32.svg
│ │ │ ├── Arch_AWS-Signer_32.png
│ │ │ ├── Arch_AWS-Signer_32.svg
│ │ │ ├── Arch_AWS-WAF_32.png
│ │ │ └── Arch_AWS-WAF_32.svg
│ │ ├── 48
│ │ │ ├── Arch_Amazon-Cloud-Directory_48.png
│ │ │ ├── Arch_Amazon-Cloud-Directory_48.svg
│ │ │ ├── Arch_Amazon-Cognito_48.png
│ │ │ ├── Arch_Amazon-Cognito_48.svg
│ │ │ ├── Arch_Amazon-Detective_48.png
│ │ │ ├── Arch_Amazon-Detective_48.svg
│ │ │ ├── Arch_Amazon-GuardDuty_48.png
│ │ │ ├── Arch_Amazon-GuardDuty_48.svg
│ │ │ ├── Arch_Amazon-Inspector_48.png
│ │ │ ├── Arch_Amazon-Inspector_48.svg
│ │ │ ├── Arch_Amazon-Macie_48.png
│ │ │ ├── Arch_Amazon-Macie_48.svg
│ │ │ ├── Arch_Amazon-Security-Lake_48.png
│ │ │ ├── Arch_Amazon-Security-Lake_48.svg
│ │ │ ├── Arch_Amazon-Verified-Permissions_48.png
│ │ │ ├── Arch_Amazon-Verified-Permissions_48.svg
│ │ │ ├── Arch_AWS-Artifact_48.png
│ │ │ ├── Arch_AWS-Artifact_48.svg
│ │ │ ├── Arch_AWS-Audit-Manager_48.png
│ │ │ ├── Arch_AWS-Audit-Manager_48.svg
│ │ │ ├── Arch_AWS-Certificate-Manager_48.png
│ │ │ ├── Arch_AWS-Certificate-Manager_48.svg
│ │ │ ├── Arch_AWS-CloudHSM_48.png
│ │ │ ├── Arch_AWS-CloudHSM_48.svg
│ │ │ ├── Arch_AWS-Directory-Service_48.png
│ │ │ ├── Arch_AWS-Directory-Service_48.svg
│ │ │ ├── Arch_AWS-Firewall-Manager_48.png
│ │ │ ├── Arch_AWS-Firewall-Manager_48.svg
│ │ │ ├── Arch_AWS-IAM-Identity-Center_48.png
│ │ │ ├── Arch_AWS-IAM-Identity-Center_48.svg
│ │ │ ├── Arch_AWS-Identity-and-Access-Management_48.png
│ │ │ ├── Arch_AWS-Identity-and-Access-Management_48.svg
│ │ │ ├── Arch_AWS-Key-Management-Service_48.png
│ │ │ ├── Arch_AWS-Key-Management-Service_48.svg
│ │ │ ├── Arch_AWS-Network-Firewall_48.png
│ │ │ ├── Arch_AWS-Network-Firewall_48.svg
│ │ │ ├── Arch_AWS-Payment-Cryptography_48.png
│ │ │ ├── Arch_AWS-Payment-Cryptography_48.svg
│ │ │ ├── Arch_AWS-Private-Certificate-Authority_48.png
│ │ │ ├── Arch_AWS-Private-Certificate-Authority_48.svg
│ │ │ ├── Arch_AWS-Resource-Access-Manager_48.png
│ │ │ ├── Arch_AWS-Resource-Access-Manager_48.svg
│ │ │ ├── Arch_AWS-Secrets-Manager_48.png
│ │ │ ├── Arch_AWS-Secrets-Manager_48.svg
│ │ │ ├── Arch_AWS-Security-Hub_48.png
│ │ │ ├── Arch_AWS-Security-Hub_48.svg
│ │ │ ├── Arch_AWS-Security-Incident-Response_48.png
│ │ │ ├── Arch_AWS-Security-Incident-Response_48.svg
│ │ │ ├── Arch_AWS-Shield_48.png
│ │ │ ├── Arch_AWS-Shield_48.svg
│ │ │ ├── Arch_AWS-Signer_48.png
│ │ │ ├── Arch_AWS-Signer_48.svg
│ │ │ ├── Arch_AWS-WAF_48.png
│ │ │ └── Arch_AWS-WAF_48.svg
│ │ └── 64
│ │ ├── Arch_Amazon-Cloud-Directory_64.png
│ │ ├── Arch_Amazon-Cloud-Directory_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Cognito_64.png
│ │ ├── Arch_Amazon-Cognito_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Detective_64.png
│ │ ├── Arch_Amazon-Detective_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-GuardDuty_64.png
│ │ ├── Arch_Amazon-GuardDuty_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Inspector_64.png
│ │ ├── Arch_Amazon-Inspector_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Macie_64.png
│ │ ├── Arch_Amazon-Macie_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Security-Lake_64.png
│ │ ├── Arch_Amazon-Security-Lake_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_Amazon-Verified-Permissions_64.png
│ │ ├── Arch_Amazon-Verified-Permissions_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Artifact_64.png
│ │ ├── Arch_AWS-Artifact_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Audit-Manager_64.png
│ │ ├── Arch_AWS-Audit-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Certificate-Manager_64.png
│ │ ├── Arch_AWS-Certificate-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-CloudHSM_64.png
│ │ ├── Arch_AWS-CloudHSM_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Directory-Service_64.png
│ │ ├── Arch_AWS-Directory-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Firewall-Manager_64.png
│ │ ├── Arch_AWS-Firewall-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-IAM-Identity-Center_64.png
│ │ ├── Arch_AWS-IAM-Identity-Center_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Identity-and-Access-Management_64.png
│ │ ├── Arch_AWS-Identity-and-Access-Management_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Key-Management-Service_64.png
│ │ ├── Arch_AWS-Key-Management-Service_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Network-Firewall_64.png
│ │ ├── Arch_AWS-Network-Firewall_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Payment-Cryptography_64.png
│ │ ├── Arch_AWS-Payment-Cryptography_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Private-Certificate-Authority_64.png
│ │ ├── Arch_AWS-Private-Certificate-Authority_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Resource-Access-Manager_64.png
│ │ ├── Arch_AWS-Resource-Access-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Secrets-Manager_64.png
│ │ ├── Arch_AWS-Secrets-Manager_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Security-Hub_64.png
│ │ ├── Arch_AWS-Security-Hub_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Security-Incident-Response_64.png
│ │ ├── Arch_AWS-Security-Incident-Response_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Shield_64.png
│ │ ├── Arch_AWS-Shield_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-Signer_64.png
│ │ ├── Arch_AWS-Signer_64.svg
│ │ ├── [email protected]
│ │ ├── Arch_AWS-WAF_64.png
│ │ ├── Arch_AWS-WAF_64.svg
│ │ └── [email protected]
│ └── storage
│ ├── .DS_Store
│ ├── 16
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-EFS_16.png
│ │ ├── Arch_Amazon-EFS_16.svg
│ │ ├── Arch_Amazon-Elastic-Block-Store_16.png
│ │ ├── Arch_Amazon-Elastic-Block-Store_16.svg
│ │ ├── Arch_Amazon-File-Cache_16.png
│ │ ├── Arch_Amazon-File-Cache_16.svg
│ │ ├── Arch_Amazon-FSx_16.png
│ │ ├── Arch_Amazon-FSx_16.svg
│ │ ├── Arch_Amazon-FSx-for-Lustre_16.png
│ │ ├── Arch_Amazon-FSx-for-Lustre_16.svg
│ │ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_16.png
│ │ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_16.svg
│ │ ├── Arch_Amazon-FSx-for-OpenZFS_16.png
│ │ ├── Arch_Amazon-FSx-for-OpenZFS_16.svg
│ │ ├── Arch_Amazon-FSx-for-WFS_16.png
│ │ ├── Arch_Amazon-FSx-for-WFS_16.svg
│ │ ├── Arch_Amazon-S3-on-Outposts_16.png
│ │ ├── Arch_Amazon-S3-on-Outposts_16.svg
│ │ ├── Arch_Amazon-Simple-Storage-Service_16.png
│ │ ├── Arch_Amazon-Simple-Storage-Service_16.svg
│ │ ├── Arch_Amazon-Simple-Storage-Service-Glacier_16.png
│ │ ├── Arch_Amazon-Simple-Storage-Service-Glacier_16.svg
│ │ ├── Arch_AWS-Backup_16.png
│ │ ├── Arch_AWS-Backup_16.svg
│ │ ├── Arch_AWS-Elastic-Disaster-Recovery_16.png
│ │ ├── Arch_AWS-Elastic-Disaster-Recovery_16.svg
│ │ ├── Arch_AWS-Snowball_16.png
│ │ ├── Arch_AWS-Snowball_16.svg
│ │ ├── Arch_AWS-Snowball-Edge_16.png
│ │ ├── Arch_AWS-Snowball-Edge_16.svg
│ │ ├── Arch_AWS-Storage-Gateway_16.png
│ │ └── Arch_AWS-Storage-Gateway_16.svg
│ ├── 32
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-EFS_32.png
│ │ ├── Arch_Amazon-EFS_32.svg
│ │ ├── Arch_Amazon-Elastic-Block-Store_32.png
│ │ ├── Arch_Amazon-Elastic-Block-Store_32.svg
│ │ ├── Arch_Amazon-File-Cache_32.png
│ │ ├── Arch_Amazon-File-Cache_32.svg
│ │ ├── Arch_Amazon-FSx_32.png
│ │ ├── Arch_Amazon-FSx_32.svg
│ │ ├── Arch_Amazon-FSx-for-Lustre_32.png
│ │ ├── Arch_Amazon-FSx-for-Lustre_32.svg
│ │ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_32.png
│ │ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_32.svg
│ │ ├── Arch_Amazon-FSx-for-OpenZFS_32.png
│ │ ├── Arch_Amazon-FSx-for-OpenZFS_32.svg
│ │ ├── Arch_Amazon-FSx-for-WFS_32.png
│ │ ├── Arch_Amazon-FSx-for-WFS_32.svg
│ │ ├── Arch_Amazon-S3-on-Outposts_32.png
│ │ ├── Arch_Amazon-S3-on-Outposts_32.svg
│ │ ├── Arch_Amazon-Simple-Storage-Service_32.png
│ │ ├── Arch_Amazon-Simple-Storage-Service_32.svg
│ │ ├── Arch_Amazon-Simple-Storage-Service-Glacier_32.png
│ │ ├── Arch_Amazon-Simple-Storage-Service-Glacier_32.svg
│ │ ├── Arch_AWS-Backup_32.png
│ │ ├── Arch_AWS-Backup_32.svg
│ │ ├── Arch_AWS-Elastic-Disaster-Recovery_32.png
│ │ ├── Arch_AWS-Elastic-Disaster-Recovery_32.svg
│ │ ├── Arch_AWS-Snowball_32.png
│ │ ├── Arch_AWS-Snowball_32.svg
│ │ ├── Arch_AWS-Snowball-Edge_32.png
│ │ ├── Arch_AWS-Snowball-Edge_32.svg
│ │ ├── Arch_AWS-Storage-Gateway_32.png
│ │ └── Arch_AWS-Storage-Gateway_32.svg
│ ├── 48
│ │ ├── .DS_Store
│ │ ├── Arch_Amazon-EFS_48.png
│ │ ├── Arch_Amazon-EFS_48.svg
│ │ ├── Arch_Amazon-Elastic-Block-Store_48.png
│ │ ├── Arch_Amazon-Elastic-Block-Store_48.svg
│ │ ├── Arch_Amazon-File-Cache_48.png
│ │ ├── Arch_Amazon-File-Cache_48.svg
│ │ ├── Arch_Amazon-FSx_48.png
│ │ ├── Arch_Amazon-FSx_48.svg
│ │ ├── Arch_Amazon-FSx-for-Lustre_48.png
│ │ ├── Arch_Amazon-FSx-for-Lustre_48.svg
│ │ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_48.png
│ │ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_48.svg
│ │ ├── Arch_Amazon-FSx-for-OpenZFS_48.png
│ │ ├── Arch_Amazon-FSx-for-OpenZFS_48.svg
│ │ ├── Arch_Amazon-FSx-for-WFS_48.png
│ │ ├── Arch_Amazon-FSx-for-WFS_48.svg
│ │ ├── Arch_Amazon-S3-on-Outposts_48.png
│ │ ├── Arch_Amazon-S3-on-Outposts_48.svg
│ │ ├── Arch_Amazon-Simple-Storage-Service_48.png
│ │ ├── Arch_Amazon-Simple-Storage-Service_48.svg
│ │ ├── Arch_Amazon-Simple-Storage-Service-Glacier_48.png
│ │ ├── Arch_Amazon-Simple-Storage-Service-Glacier_48.svg
│ │ ├── Arch_AWS-Backup_48.png
│ │ ├── Arch_AWS-Backup_48.svg
│ │ ├── Arch_AWS-Elastic-Disaster-Recovery_48.png
│ │ ├── Arch_AWS-Elastic-Disaster-Recovery_48.svg
│ │ ├── Arch_AWS-Snowball_48.png
│ │ ├── Arch_AWS-Snowball_48.svg
│ │ ├── Arch_AWS-Snowball-Edge_48.png
│ │ ├── Arch_AWS-Snowball-Edge_48.svg
│ │ ├── Arch_AWS-Storage-Gateway_48.png
│ │ └── Arch_AWS-Storage-Gateway_48.svg
│ └── 64
│ ├── .DS_Store
│ ├── Arch_Amazon-EFS_64.png
│ ├── Arch_Amazon-EFS_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-Elastic-Block-Store_64.png
│ ├── Arch_Amazon-Elastic-Block-Store_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-File-Cache_64.png
│ ├── Arch_Amazon-File-Cache_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-FSx_64.png
│ ├── Arch_Amazon-FSx_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-FSx-for-Lustre_64.png
│ ├── Arch_Amazon-FSx-for-Lustre_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_64.png
│ ├── Arch_Amazon-FSx-for-NetApp-ONTAP_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-FSx-for-OpenZFS_64.png
│ ├── Arch_Amazon-FSx-for-OpenZFS_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-FSx-for-WFS_64.png
│ ├── Arch_Amazon-FSx-for-WFS_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-S3-on-Outposts_64.png
│ ├── Arch_Amazon-S3-on-Outposts_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-Simple-Storage-Service_64.png
│ ├── Arch_Amazon-Simple-Storage-Service_64.svg
│ ├── [email protected]
│ ├── Arch_Amazon-Simple-Storage-Service-Glacier_64.png
│ ├── Arch_Amazon-Simple-Storage-Service-Glacier_64.svg
│ ├── [email protected]
│ ├── Arch_AWS-Backup_64.png
│ ├── Arch_AWS-Backup_64.svg
│ ├── [email protected]
│ ├── Arch_AWS-Elastic-Disaster-Recovery_64.png
│ ├── Arch_AWS-Elastic-Disaster-Recovery_64.svg
│ ├── [email protected]
│ ├── Arch_AWS-Snowball_64.png
│ ├── Arch_AWS-Snowball_64.svg
│ ├── [email protected]
│ ├── Arch_AWS-Snowball-Edge_64.png
│ ├── Arch_AWS-Snowball-Edge_64.svg
│ ├── [email protected]
│ ├── Arch_AWS-Storage-Gateway_64.png
│ ├── Arch_AWS-Storage-Gateway_64.svg
│ └── [email protected]
├── index.html
├── manifest.json
├── mocks
│ ├── mock-discovery-live.json
│ └── mock-generate-graph.json
├── robots.txt
└── static
├── css
│ ├── main.f8f47ec8.css
│ └── main.f8f47ec8.css.map
└── js
├── 1297.c349ec3c.chunk.js
├── 14.7ba48ec4.chunk.js
├── 14.7ba48ec4.chunk.js.LICENSE.txt
├── 14.7ba48ec4.chunk.js.map
├── 1409.d2c5ac18.chunk.js
├── 1457.10b2696f.chunk.js
├── 1595.2e8c74e3.chunk.js
├── 1595.2e8c74e3.chunk.js.LICENSE.txt
├── 1595.2e8c74e3.chunk.js.map
├── 1707.279d4917.chunk.js
├── 1707.279d4917.chunk.js.map
├── 2019.3e4e6398.chunk.js
├── 2019.3e4e6398.chunk.js.map
├── 2038.86d3ba27.chunk.js
├── 2038.86d3ba27.chunk.js.map
├── 2374.220d0c1c.chunk.js
├── 2374.220d0c1c.chunk.js.LICENSE.txt
├── 2374.220d0c1c.chunk.js.map
├── 2491.6dc3b41c.chunk.js
├── 2491.6dc3b41c.chunk.js.map
├── 3025.e856e271.chunk.js
├── 3025.e856e271.chunk.js.LICENSE.txt
├── 3025.e856e271.chunk.js.map
├── 3119.2c9023ad.chunk.js
├── 3119.2c9023ad.chunk.js.LICENSE.txt
├── 3119.2c9023ad.chunk.js.map
├── 3290.6c752b7b.chunk.js
├── 3290.6c752b7b.chunk.js.map
├── 3345.719283e7.chunk.js
├── 3345.719283e7.chunk.js.map
├── 349.2456c1b6.chunk.js
├── 349.2456c1b6.chunk.js.map
├── 3641.87d0bf7c.chunk.js
├── 3641.87d0bf7c.chunk.js.map
├── 3705.1bb92025.chunk.js
├── 3705.1bb92025.chunk.js.map
├── 3750.c184e3e3.chunk.js
├── 3750.c184e3e3.chunk.js.map
├── 3817.79a57e5e.chunk.js
├── 3817.79a57e5e.chunk.js.map
├── 4114.eea3c770.chunk.js
├── 4114.eea3c770.chunk.js.map
├── 4135.b88aaf7b.chunk.js
├── 4147.5f8e8649.chunk.js
├── 4191.3ed02494.chunk.js
├── 4191.3ed02494.chunk.js.map
├── 4487.fec1d877.chunk.js
├── 4570.ce64aedb.chunk.js
├── 4570.ce64aedb.chunk.js.map
├── 490.a05b6059.chunk.js
├── 490.a05b6059.chunk.js.map
├── 5009.1a2aa685.chunk.js
├── 5009.1a2aa685.chunk.js.LICENSE.txt
├── 5009.1a2aa685.chunk.js.map
├── 5502.14766ceb.chunk.js
├── 5502.14766ceb.chunk.js.map
├── 62.b40b6fbd.chunk.js
├── 62.b40b6fbd.chunk.js.map
├── 6453.8c3fba0e.chunk.js
├── 6453.8c3fba0e.chunk.js.map
├── 6455.8e6b5278.chunk.js
├── 6455.8e6b5278.chunk.js.map
├── 646.6aac5035.chunk.js
├── 646.6aac5035.chunk.js.LICENSE.txt
├── 646.6aac5035.chunk.js.map
├── 6516.3948f7b4.chunk.js
├── 6516.3948f7b4.chunk.js.map
├── 6725.6ad72d9d.chunk.js
├── 6823.e10e9817.chunk.js
├── 6823.e10e9817.chunk.js.map
├── 6865.afd592a9.chunk.js
├── 6865.afd592a9.chunk.js.map
├── 6977.4218876a.chunk.js
├── 6977.4218876a.chunk.js.LICENSE.txt
├── 6977.4218876a.chunk.js.map
├── 7069.6c60b97c.chunk.js
├── 7069.6c60b97c.chunk.js.map
├── 7513.37f12f0e.chunk.js
├── 7513.37f12f0e.chunk.js.map
├── 7550.0cfdabcf.chunk.js
├── 7550.0cfdabcf.chunk.js.map
├── 7841.37a92b31.chunk.js
├── 7841.37a92b31.chunk.js.map
├── 7854.ed7e04cc.chunk.js
├── 7854.ed7e04cc.chunk.js.map
├── 8151.87df400e.chunk.js
├── 8151.87df400e.chunk.js.map
├── 8195.55a334cf.chunk.js
├── 8195.55a334cf.chunk.js.map
├── 8218.b7de3259.chunk.js
├── 8218.b7de3259.chunk.js.map
├── 8234.f2f9a7db.chunk.js
├── 8234.f2f9a7db.chunk.js.map
├── 8332.9aa74d00.chunk.js
├── 8332.9aa74d00.chunk.js.map
├── 8449.676bcc94.chunk.js
├── 8449.676bcc94.chunk.js.map
├── 8660.1c56263e.chunk.js
├── 8660.1c56263e.chunk.js.map
├── 9413.aea20916.chunk.js
├── 9413.aea20916.chunk.js.map
├── 9448.cd4e8095.chunk.js
├── 9448.cd4e8095.chunk.js.map
├── 9459.753274fe.chunk.js
├── 9459.753274fe.chunk.js.map
├── 9573.5ba95804.chunk.js
├── 9573.5ba95804.chunk.js.map
├── 9664.9e69f3bc.chunk.js
├── 9664.9e69f3bc.chunk.js.map
├── 9844.6366c533.chunk.js
├── 9844.6366c533.chunk.js.map
├── main.af8efd6b.js
├── main.af8efd6b.js.LICENSE.txt
└── main.af8efd6b.js.map
```
# Files
--------------------------------------------------------------------------------
/pkg/agent/agent_test.go:
--------------------------------------------------------------------------------
```go
1 | package agent
2 |
3 | import (
4 | "context"
5 | "encoding/json"
6 | "fmt"
7 | "os"
8 | "path/filepath"
9 | "strings"
10 | "testing"
11 | "time"
12 |
13 | "github.com/tmc/langchaingo/llms"
14 | "github.com/tmc/langchaingo/llms/googleai"
15 | "github.com/versus-control/ai-infrastructure-agent/internal/config"
16 | "github.com/versus-control/ai-infrastructure-agent/internal/logging"
17 | "github.com/versus-control/ai-infrastructure-agent/pkg/agent/mocks"
18 | "github.com/versus-control/ai-infrastructure-agent/pkg/types"
19 | )
20 |
21 | // === Helper Functions for Setting Up Real AI and Comprehensive Mock MCP Tools ===
22 |
23 | func setupRealConfiguration() (*config.Config, error) {
24 | // Load the actual config from configuration file
25 | cfg, err := config.Load()
26 | if err != nil {
27 | return nil, fmt.Errorf("failed to load configuration: %w", err)
28 | }
29 |
30 | // Ensure we're using Gemini for this test
31 | cfg.Agent.Provider = "gemini"
32 | cfg.Agent.MaxTokens = 20000
33 | cfg.Agent.Model = "gemini-2.5-flash-lite" // Use a valid model name
34 | cfg.Agent.EnableDebug = true
35 |
36 | return cfg, nil
37 | }
38 |
39 | func setupRealLLMClient(cfg *config.Config) (llms.Model, error) {
40 | switch cfg.Agent.Provider {
41 | case "gemini":
42 | apiKey := os.Getenv("GEMINI_API_KEY")
43 | if apiKey == "" {
44 | return nil, fmt.Errorf("You need an auth option to use this client.")
45 | }
46 | // Pass the API key and model to the googleai client
47 | return googleai.New(context.Background(),
48 | googleai.WithAPIKey(apiKey),
49 | googleai.WithDefaultModel(cfg.Agent.Model))
50 | default:
51 | return nil, fmt.Errorf("unsupported LLM provider: %s", cfg.Agent.Provider)
52 | }
53 | }
54 |
55 | func setupAgentWithRealAI(cfg *config.Config, llmClient llms.Model) (*StateAwareAgent, *mocks.MockTestSuite, error) {
56 | // Create logger
57 | logger := logging.NewLogger("test", cfg.Logging.Level)
58 |
59 | // Initialize mock test suite with real component integration
60 | mockSuite, err := mocks.NewMockTestSuite("us-west-2")
61 | if err != nil {
62 | return nil, nil, fmt.Errorf("failed to create mock test suite: %w", err)
63 | }
64 |
65 | // Create agent with real AI but mock infrastructure components
66 | agent := &StateAwareAgent{
67 | llm: llmClient,
68 | config: &cfg.Agent,
69 | awsConfig: &cfg.AWS,
70 | Logger: logger,
71 |
72 | // MCP from mock suite
73 | resourceMappings: make(map[string]string),
74 | mcpTools: make(map[string]MCPToolInfo),
75 | mcpResources: make(map[string]MCPResourceInfo),
76 |
77 | // Enable test mode to use mock MCP capabilities
78 | testMode: true,
79 |
80 | // Set mock MCP server for test mode
81 | mockMCPServer: mockSuite.MCPServer,
82 |
83 | // Use real configuration-driven components from mock suite
84 | patternMatcher: mockSuite.StateManager.GetPatternMatcher(),
85 | fieldResolver: mockSuite.StateManager.GetFieldResolver(),
86 |
87 | extractionConfig: mockSuite.StateManager.GetExtractionConfig(),
88 | idExtractor: mockSuite.StateManager.GetIDExtractor(),
89 | }
90 |
91 | return agent, mockSuite, nil
92 | }
93 |
94 | // == Prompts ==
95 |
96 | // Comprehensive VPC Infrastructure
97 | func comprehensiveVPCPrompt() string {
98 | // Comprehensive VPC infrastructure prompt
99 | prompt := `Create a complete production-ready VPC infrastructure on AWS with the following requirements:
100 |
101 | NETWORK ARCHITECTURE:
102 | - VPC with CIDR 10.0.0.0/16 in us-west-2
103 | - 6 subnets across 3 availability zones:
104 | * 2 public subnets (10.0.1.0/24, 10.0.2.0/24) for load balancers
105 | * 2 private subnets (10.0.11.0/24, 10.0.12.0/24) for application servers
106 | * 2 database subnets (10.0.21.0/24, 10.0.22.0/24) for RDS instances
107 | - Internet Gateway for public access
108 | - 2 NAT Gateways in public subnets for private subnet internet access
109 | - Route tables with proper routing
110 |
111 | COMPUTE & SECURITY:
112 | - Application Load Balancer in public subnets
113 | - Auto Scaling Group with t3.medium instances in private subnets
114 | - Launch Template with latest Amazon Linux 2 AMI
115 | - Security Groups with least privilege access
116 | - Target Group for ALB health checks
117 |
118 | DATABASE:
119 | - RDS MySQL instance in database subnets
120 | - Database security group allowing access only from app servers
121 | - Multi-AZ deployment for high availability
122 |
123 | VALIDATION:
124 | - Validate all resources are properly configured
125 | - Test connectivity between components
126 | - Verify security group rules are correct
127 |
128 | Please create a detailed execution plan with all necessary steps, proper dependencies, and real AWS API calls where needed.`
129 |
130 | return prompt
131 | }
132 |
133 | // Comprehensive EC2 Infrastructure
134 | func comprehensiveEC2Prompt() string {
135 | prompt := `Create an EC2 for hosting an Apache Server with a dedicated security group that allows inbound HTTP (port 80) and SSH (port 22) traffic.`
136 |
137 | return prompt
138 | }
139 |
140 | // Comprehensive VPC with EC2 Infrastructure
141 | func comprehensiveVPCwithEC2Prompt() string {
142 | prompt := `Create a production VPC with a CIDR block of 10.0.0.0/16 across two availability zones. Set up public subnets (10.0.1.0/24 and 10.0.2.0/24) for internet-facing load balancers. Create private subnets for application servers (10.0.11.0/24 and 10.0.12.0/24): Configure Internet Gateway and NAT Gateway for proper routing. Create an EC2 for hosting an Apache Server with a dedicated security group that allows inbound HTTP (port 80) and SSH (port 22) traffic in public subnets.`
143 |
144 | return prompt
145 | }
146 |
147 | // Comprehensive EC2 Infrastructure
148 | func comprehensiveEC2withALBPrompt() string {
149 | prompt := `I need to deploy a web application infrastructure on AWS with the following requirements:
150 |
151 | - Create an EC2 for hosting an Apache Server with a dedicated security group that allows inbound HTTP (port 80) and SSH (port 22) traffic.
152 | - Create an Application Load Balancer across public subnets in front of the EC2 instance with a security group that allows inbound HTTP (port 80) traffic from the internet.`
153 |
154 | return prompt
155 | }
156 |
157 | // Comprehensive Three-Tier Infrastructure
158 | func comprehensiveThreeLayerPrompt() string {
159 | prompt := `I need to deploy a complete production-ready three-tier web application infrastructure on AWS with the following requirements:
160 |
161 | Network Foundation (Phase 1):
162 | - Create a production VPC with a CIDR block of 10.0.0.0/16 across two availability zones.
163 | - Set up public subnets (10.0.1.0/24 and 10.0.2.0/24) for internet-facing load balancers.
164 | - Create private subnets for application servers (10.0.11.0/24 and 10.0.12.0/24).
165 | - Set up dedicated database subnets (10.0.21.0/24 and 10.0.22.0/24)
166 | - Configure Internet Gateway and NAT Gateway for proper routing.
167 |
168 | Security Architecture (Phase 2):
169 | - Create defense-in-depth security with tiered security groups
170 | - Load balancer security group allowing HTTP/HTTPS from internet (0.0.0.0/0)
171 | - Application server security group accepting traffic only from load balancer
172 | - Database security group allowing MySQL (port 3306) only from application servers
173 |
174 | Load Balancer Tier (Phase 3):
175 | - Deploy Application Load Balancer across public subnets in both AZs
176 | - Configure target group with health checks on /health endpoint
177 | - Set up HTTP listener (port 80) with proper health check thresholds
178 | - Health check: 30s interval, 5s timeout, 2 healthy/3 unhealthy thresholds
179 |
180 | Auto Scaling Application Tier (Phase 4):
181 | - Create launch template with t3.medium instances
182 | - Use Amazon Linux 2 AMI with Apache/PHP web server
183 | - Configure user data script to install web server and health check endpoint
184 | - Set up Auto Scaling Group: min 2, max 10, desired 4 instances
185 | - Deploy across private application subnets in both AZs
186 | - Integrate with load balancer target group for automatic registration
187 | - Use ELB health checks with 300s grace period
188 |
189 | Database Infrastructure (Phase 5):
190 | - Create RDS MySQL 8.0 database with Multi-AZ deployment
191 | - Use db.t3.medium instance class with 100GB GP3 storage
192 | - Enable encryption at rest and Performance Insights
193 | - Configure automated backups: 7-day retention, 3-4 AM backup window
194 | - Set maintenance window: Sunday 4-5 AM
195 | - Deploy across database subnets in both AZs
196 |
197 | Additional Requirements:
198 | - Tag all resources with Environment=production, Application=three-tier-web-app
199 | - Use consistent naming convention with environment and tier identifiers
200 | - Ensure high availability across multiple availability zones
201 | - Follow AWS Well-Architected Framework principles
202 | - Configure proper resource dependencies and creation order
203 |
204 | Please deploy this complete infrastructure stack and provide me with the key resource IDs and endpoints once deployment is complete.`
205 |
206 | return prompt
207 | }
208 |
209 | // Comprehensive Serverless Infrastructure
210 | func comprehensiveServerlessPrompt() string {
211 | prompt := `Deploy a complete serverless application infrastructure on AWS with the following specifications:
212 |
213 | API Layer:
214 | - Create an API Gateway REST API with regional endpoint
215 | - Define resources and methods: GET /items, POST /items, GET /items/{id}
216 | - Enable CORS for all methods
217 | - Set up usage plan with throttling: 100 requests/second burst, 50 requests/second steady
218 |
219 | Compute Layer:
220 | - Create three Lambda functions in Node.js 20.x runtime
221 | - Function 1: listItems - GET all items from DynamoDB
222 | - Function 2: createItem - POST new item to DynamoDB
223 | - Function 3: getItem - GET single item by ID
224 | - Configure 128MB memory, 10s timeout for each
225 | - Use environment variables for DynamoDB table name
226 | - Integrate each function with corresponding API Gateway methods
227 | - Enable Lambda function URLs for testing
228 |
229 | Database Layer:
230 | - Provision DynamoDB table named 'Items' with partition key 'id' (string)
231 | - Add global secondary index on 'category' attribute
232 | - Set provisioned capacity: 5 read/write capacity units
233 | - Enable point-in-time recovery and auto-scaling (min 5, max 100)
234 | - Encrypt with AWS-managed KMS key
235 |
236 | Security and Authentication:
237 | - Create Cognito User Pool for user authentication
238 | - Add app client with OAuth flows enabled
239 | - Configure API Gateway authorizer using Cognito
240 | - Apply authorizer to all API methods except public GET /items
241 |
242 | Monitoring and Logging:
243 | - Enable X-Ray tracing for API Gateway and Lambda
244 | - Create CloudWatch Log Groups for each Lambda with 7-day retention
245 | - Set up CloudWatch alarms for Lambda errors (>0) and API 5xx errors (>1%)
246 |
247 | Additional Requirements:
248 | - Deploy in us-east-1 region
249 | - Tag all resources with Environment=production, Application=serverless-app
250 | - Ensure IAM roles follow least privilege: Lambda role with DynamoDB access only
251 | - Provide API endpoint and test commands after deployment
252 |
253 | Create a step-by-step execution plan including all AWS API calls, resource dependencies, and validation steps.`
254 |
255 | return prompt
256 | }
257 |
258 | // Comprehensive EKS Infrastructure
259 | func comprehensiveEKSPrompt() string {
260 | prompt := `Set up a production-ready Kubernetes cluster on AWS EKS with these requirements:
261 |
262 | Cluster Foundation:
263 | - Create EKS cluster version 1.30 in us-west-2
264 | - Enable public and private endpoint access
265 | - Configure cluster logging: api, audit, authenticator, controllerManager, scheduler
266 |
267 | Networking:
268 | - Use existing VPC or create new with CIDR 10.100.0.0/16
269 | - Public subnets: 10.100.1.0/24, 10.100.2.0/24
270 | - Private subnets: 10.100.11.0/24, 10.100.12.0/24
271 | - Ensure proper route tables and security groups for cluster communication
272 |
273 | Node Groups:
274 | - Managed node group with t3.medium instances
275 | - Min 2, max 10, desired 3 nodes
276 | - Use Amazon Linux 2 EKS-optimized AMI
277 | - Enable auto-scaling and cluster autoscaler
278 | - Add labels: role=worker
279 |
280 | Add-ons:
281 | - Install CoreDNS, kube-proxy, VPC CNI
282 | - Add EBS CSI driver for persistent storage
283 | - Deploy AWS Load Balancer Controller
284 |
285 | Security:
286 | - Create IAM roles for cluster and nodes with least privilege
287 | - Enable IRSA (IAM Roles for Service Accounts)
288 | - Configure security groups to allow only necessary ports
289 |
290 | Monitoring:
291 | - Enable EKS Control Plane logging to CloudWatch
292 | - Install Prometheus and Grafana for cluster monitoring
293 | - Set up alerts for node CPU >80% and pod evictions
294 |
295 | Deployment Validation:
296 | - Deploy sample nginx deployment and service (type LoadBalancer)
297 | - Verify external access to the service
298 | - Check cluster health and node status
299 |
300 | Provide a detailed plan with sequential steps, AWS CLI commands where applicable, and resource verification.`
301 |
302 | return prompt
303 | }
304 |
305 | // Comprehensive S3 with CloudFront Infrastructure
306 | func comprehensiveS3CloudFrontPrompt() string {
307 | prompt := `Build a global static website hosting infrastructure on AWS:
308 |
309 | Storage Layer:
310 | - Create S3 bucket for website assets in us-east-1
311 | - Enable versioning and server-side encryption (SSE-S3)
312 | - Set bucket policy for public read access
313 | - Upload sample index.html and error.html
314 |
315 | Distribution Layer:
316 | - Create CloudFront distribution with S3 as origin
317 | - Configure default root object: index.html
318 | - Enable HTTP/2 and IPv6
319 | - Set price class: Use All Edge Locations
320 | - Configure error pages: 404 -> error.html (HTTP 200)
321 |
322 | Security:
323 | - Create Origin Access Control (OAC) for S3
324 | - Update S3 bucket policy to allow only CloudFront
325 | - Enable WAF web ACL with AWS managed rules for common exploits
326 |
327 | Domain and SSL:
328 | - Assume domain example.com in Route 53
329 | - Create ACM certificate for *.example.com
330 | - Configure CloudFront alternate domain names
331 | - Set up Route 53 A record alias to CloudFront
332 |
333 | Logging and Monitoring:
334 | - Enable CloudFront standard logging to S3
335 | - Create CloudWatch alarms for BytesDownloaded > threshold
336 | - Set S3 access logging
337 |
338 | Additional Features:
339 | - Enable compression for text/* MIME types
340 | - Set cache behavior: TTL min 0, default 1 day, max 1 year
341 | - Add geo-restriction whitelist: US, CA
342 |
343 | Deploy the infrastructure and provide the CloudFront domain name, S3 bucket name, and test URLs.`
344 |
345 | return prompt
346 | }
347 |
348 | // Comprehensive ECS Infrastructure
349 | func comprehensiveECSPrompt() string {
350 | prompt := `Deploy a containerized application on AWS ECS with Fargate:
351 |
352 | Cluster Setup:
353 | - Create ECS cluster in us-east-1
354 | - Enable Container Insights for monitoring
355 |
356 | Networking:
357 | - Use VPC with public and private subnets across 2 AZs
358 | - CIDR: 10.20.0.0/16
359 | - Public: 10.20.1.0/24, 10.20.2.0/24
360 | - Private: 10.20.11.0/24, 10.20.12.0/24
361 | - Internet Gateway and NAT for outbound
362 |
363 | Task Definition:
364 | - Fargate launch type
365 | - Task: 0.5 vCPU, 1GB memory
366 | - Container: nginx:latest, port 80
367 | - Add environment variables if needed
368 | - Enable AWS Logs driver
369 |
370 | Service:
371 | - Create ECS service with 2 desired tasks
372 | - Deploy in private subnets
373 | - Enable auto-scaling: min 2, max 10, CPU target 70%
374 | - Integrate with Application Load Balancer
375 |
376 | Load Balancer:
377 | - Internet-facing ALB in public subnets
378 | - HTTP listener port 80
379 | - Target group with health check on /
380 | - Security group: allow 80 from 0.0.0.0/0
381 |
382 | Database (Optional Integration):
383 | - RDS PostgreSQL in private subnets
384 | - Allow access from ECS security group on port 5432
385 |
386 | Security:
387 | - ECS task role with S3 read access (if needed)
388 | - Security groups with least privilege
389 |
390 | Validation:
391 | - Verify service is running and accessible via ALB
392 | - Scale tasks and check auto-scaling
393 |
394 | Provide execution plan with all steps, dependencies, and final endpoints.`
395 |
396 | return prompt
397 | }
398 |
399 | // Comprehensive Monitoring and Logging Infrastructure
400 | func comprehensiveMonitoringPrompt() string {
401 | prompt := `Set up comprehensive monitoring and logging for an existing AWS infrastructure:
402 |
403 | Core Services:
404 | - Enable CloudWatch for all supported resources
405 | - Create CloudTrail trail for management events, multi-region
406 | - Configure S3 bucket for CloudTrail logs with lifecycle policy (30 days to Glacier)
407 |
408 | Alarms and Dashboards:
409 | - Create CloudWatch alarms:
410 | - EC2 CPU >80% for 5 minutes
411 | - ALB 5xx errors >5 in 1 minute
412 | - RDS free storage <20%
413 | - Build CloudWatch dashboard with widgets for CPU, network, errors
414 |
415 | Logging:
416 | - Set up centralized logging with CloudWatch Logs
417 | - Create log groups for EC2, Lambda, ECS with 14-day retention
418 | - Enable VPC Flow Logs to CloudWatch Logs group
419 |
420 | Advanced Monitoring:
421 | - Enable X-Ray for application tracing (API Gateway, Lambda, ECS)
422 | - Set up Synthetics canaries for endpoint monitoring (every 5 min)
423 | - Configure EventBridge rules for critical events (e.g., instance termination)
424 |
425 | Notifications:
426 | - Create SNS topic for alarms
427 | - Subscribe email endpoint
428 | - Integrate with alarms for notifications
429 |
430 | Security Monitoring:
431 | - Enable GuardDuty for threat detection
432 | - Configure Config rules for compliance (e.g., encrypted volumes)
433 | - Set up Security Hub with CIS benchmarks
434 |
435 | Deploy in us-west-2, tag resources with Monitoring=true, and provide dashboard URL and alarm names.`
436 |
437 | return prompt
438 | }
439 |
440 | // === Test Suites ===
441 |
442 | // TestComprehensiveExecutionPipeline tests all aspects of the execution pipeline
443 | func TestComprehensiveExecutionPipeline(t *testing.T) {
444 | t.Run("RealAIWithComprehensiveEC2Prompt", func(t *testing.T) {
445 | testRealAIWithComprehensiveEC2Prompt(t)
446 | })
447 | t.Run("RealAIWithComprehensiveVPCPrompt", func(t *testing.T) {
448 | testRealAIWithComprehensiveVPCPrompt(t)
449 | })
450 | t.Run("RealAIWithComprehensiveVPCwithEC2Prompt", func(t *testing.T) {
451 | testRealAIWithComprehensiveVPCwithEC2Prompt(t)
452 | })
453 | t.Run("RealAIWithComprehensiveThreeLayerPrompt", func(t *testing.T) {
454 | testRealAIWithComprehensiveThreeLayerPrompt(t)
455 | })
456 | // == State Handling Test ==
457 | t.Run("RealAIWithRealStateEC2AndALBPrompt", func(t *testing.T) {
458 | testRealAIWithRealStateEC2AndALBPrompt(t)
459 | })
460 | }
461 |
462 | func testRealAIWithComprehensiveEC2Prompt(t *testing.T) {
463 | // Comprehensive VPC infrastructure prompt
464 | comprehensivePrompt := comprehensiveEC2Prompt()
465 |
466 | // Setup test configuration
467 | cfg, err := setupRealConfiguration()
468 | if err != nil {
469 | t.Fatalf("Failed to setup real configuration: %v", err)
470 | }
471 |
472 | // Setup real LLM client
473 | llmClient, err := setupRealLLMClient(cfg)
474 | if err != nil {
475 | t.Fatalf("Failed to setup real LLM client: %v", err)
476 | }
477 |
478 | // Setup test agent with real AI and comprehensive mock infrastructure
479 | agent, mockSuite, err := setupAgentWithRealAI(cfg, llmClient)
480 | if err != nil {
481 | t.Fatalf("Failed to setup test agent: %v", err)
482 | }
483 | // defer mockSuite.Reset()
484 |
485 | // Create decision context using mock state manager
486 | emptyState := &types.InfrastructureState{
487 | Resources: make(map[string]*types.ResourceState),
488 | }
489 |
490 | decisionContext := &DecisionContext{
491 | Request: comprehensivePrompt,
492 | CurrentState: emptyState,
493 | DiscoveredState: []*types.ResourceState{},
494 | Conflicts: []*types.ConflictResolution{},
495 | DeploymentOrder: []string{},
496 | ResourceCorrelation: make(map[string]*ResourceMatch),
497 | }
498 |
499 | t.Logf("🚀 Starting comprehensive execution pipeline test with real AI integration and mock infrastructure...")
500 |
501 | // Step 1: Test AI Decision Making
502 | t.Logf("📡 Step 1: Making real AI API call to process comprehensive infrastructure request...")
503 |
504 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute*3)
505 | defer cancel()
506 |
507 | decisionID := "test-comprehensive-decision"
508 | decision, err := agent.generateDecisionWithPlan(ctx, decisionID, comprehensivePrompt, decisionContext)
509 | if err != nil {
510 | t.Fatalf("❌ Real AI API call failed: %v", err)
511 | }
512 |
513 | t.Logf("✅ Step 1 Complete: AI generated decision with %d execution steps", len(decision.ExecutionPlan))
514 |
515 | // Step 2: Validate AI-Generated Plan Structure
516 | t.Logf("🔍 Step 2: Validating AI-generated execution plan structure...")
517 | validateExecutionPlanStructure(t, agent, decision)
518 | t.Logf("✅ Step 2 Complete: Execution plan structure is valid")
519 |
520 | // Step 3: Execute Full Flow with Mock Infrastructure
521 | t.Logf("⚙️ Step 3: Executing full infrastructure plan using mock functions...")
522 | testExecuteFullPlanWithMocks(t, agent, mockSuite, decision)
523 | t.Logf("✅ Step 3 Complete: Full plan execution completed successfully")
524 |
525 | // Step 4: Validate Mock Integration
526 | t.Logf("🔬 Step 4: Validating mock infrastructure integration...")
527 | testValidateMockIntegration(t, mockSuite, decision)
528 | t.Logf("✅ Step 4 Complete: Mock integration validated")
529 |
530 | t.Logf("🎉 All tests completed successfully! AI + Mock infrastructure integration validated.")
531 | }
532 |
533 | func testRealAIWithComprehensiveVPCPrompt(t *testing.T) {
534 | // Comprehensive VPC infrastructure prompt
535 | comprehensivePrompt := comprehensiveVPCPrompt()
536 |
537 | // Setup test configuration
538 | cfg, err := setupRealConfiguration()
539 | if err != nil {
540 | t.Fatalf("Failed to setup real configuration: %v", err)
541 | }
542 |
543 | // Setup real LLM client
544 | llmClient, err := setupRealLLMClient(cfg)
545 | if err != nil {
546 | t.Fatalf("Failed to setup real LLM client: %v", err)
547 | }
548 |
549 | // Setup test agent with real AI and comprehensive mock infrastructure
550 | agent, mockSuite, err := setupAgentWithRealAI(cfg, llmClient)
551 | if err != nil {
552 | t.Fatalf("Failed to setup test agent: %v", err)
553 | }
554 | // defer mockSuite.Reset()
555 |
556 | // Create decision context using mock state manager
557 | emptyState := &types.InfrastructureState{
558 | Resources: make(map[string]*types.ResourceState),
559 | }
560 |
561 | decisionContext := &DecisionContext{
562 | Request: comprehensivePrompt,
563 | CurrentState: emptyState,
564 | DiscoveredState: []*types.ResourceState{},
565 | Conflicts: []*types.ConflictResolution{},
566 | DeploymentOrder: []string{},
567 | ResourceCorrelation: make(map[string]*ResourceMatch),
568 | }
569 |
570 | t.Logf("🚀 Starting comprehensive execution pipeline test with real AI integration and mock infrastructure...")
571 |
572 | // Step 1: Test AI Decision Making
573 | t.Logf("📡 Step 1: Making real AI API call to process comprehensive infrastructure request...")
574 |
575 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute*3)
576 | defer cancel()
577 |
578 | decisionID := "test-comprehensive-decision"
579 | decision, err := agent.generateDecisionWithPlan(ctx, decisionID, comprehensivePrompt, decisionContext)
580 | if err != nil {
581 | t.Fatalf("❌ Real AI API call failed: %v", err)
582 | }
583 |
584 | t.Logf("✅ Step 1 Complete: AI generated decision with %d execution steps", len(decision.ExecutionPlan))
585 |
586 | // Step 2: Validate AI-Generated Plan Structure
587 | t.Logf("🔍 Step 2: Validating AI-generated execution plan structure...")
588 | validateExecutionPlanStructure(t, agent, decision)
589 | t.Logf("✅ Step 2 Complete: Execution plan structure is valid")
590 |
591 | // Step 3: Execute Full Flow with Mock Infrastructure
592 | t.Logf("⚙️ Step 3: Executing full infrastructure plan using mock functions...")
593 | testExecuteFullPlanWithMocks(t, agent, mockSuite, decision)
594 | t.Logf("✅ Step 3 Complete: Full plan execution completed successfully")
595 |
596 | // Step 4: Validate Mock Integration
597 | t.Logf("🔬 Step 4: Validating mock infrastructure integration...")
598 | testValidateMockIntegration(t, mockSuite, decision)
599 | t.Logf("✅ Step 4 Complete: Mock integration validated")
600 |
601 | t.Logf("🎉 All tests completed successfully! AI + Mock infrastructure integration validated.")
602 | }
603 |
604 | func testRealAIWithComprehensiveVPCwithEC2Prompt(t *testing.T) {
605 | // Comprehensive VPC infrastructure prompt
606 | comprehensivePrompt := comprehensiveVPCwithEC2Prompt()
607 |
608 | // Setup test configuration
609 | cfg, err := setupRealConfiguration()
610 | if err != nil {
611 | t.Fatalf("Failed to setup real configuration: %v", err)
612 | }
613 |
614 | // Setup real LLM client
615 | llmClient, err := setupRealLLMClient(cfg)
616 | if err != nil {
617 | t.Fatalf("Failed to setup real LLM client: %v", err)
618 | }
619 |
620 | // Setup test agent with real AI and comprehensive mock infrastructure
621 | agent, mockSuite, err := setupAgentWithRealAI(cfg, llmClient)
622 | if err != nil {
623 | t.Fatalf("Failed to setup test agent: %v", err)
624 | }
625 | // defer mockSuite.Reset()
626 |
627 | // Create decision context using mock state manager
628 | emptyState := &types.InfrastructureState{
629 | Resources: make(map[string]*types.ResourceState),
630 | }
631 |
632 | decisionContext := &DecisionContext{
633 | Request: comprehensivePrompt,
634 | CurrentState: emptyState,
635 | DiscoveredState: []*types.ResourceState{},
636 | Conflicts: []*types.ConflictResolution{},
637 | DeploymentOrder: []string{},
638 | ResourceCorrelation: make(map[string]*ResourceMatch),
639 | }
640 |
641 | t.Logf("🚀 Starting comprehensive execution pipeline test with real AI integration and mock infrastructure...")
642 |
643 | // Step 1: Test AI Decision Making
644 | t.Logf("📡 Step 1: Making real AI API call to process comprehensive infrastructure request...")
645 |
646 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute*3)
647 | defer cancel()
648 |
649 | decisionID := "test-comprehensive-decision"
650 | decision, err := agent.generateDecisionWithPlan(ctx, decisionID, comprehensivePrompt, decisionContext)
651 | if err != nil {
652 | t.Fatalf("❌ Real AI API call failed: %v", err)
653 | }
654 |
655 | t.Logf("✅ Step 1 Complete: AI generated decision with %d execution steps", len(decision.ExecutionPlan))
656 |
657 | // Step 2: Validate AI-Generated Plan Structure
658 | t.Logf("🔍 Step 2: Validating AI-generated execution plan structure...")
659 | validateExecutionPlanStructure(t, agent, decision)
660 | t.Logf("✅ Step 2 Complete: Execution plan structure is valid")
661 |
662 | // Step 3: Enhanced Pre-Execution Validation
663 | t.Logf("🔬 Step 3: Enhanced pre-execution validation...")
664 | testEnhancedPreExecutionValidation(t, agent, mockSuite, decision)
665 | t.Logf("✅ Step 3 Complete: Pre-execution validation passed")
666 |
667 | // Step 4: Execute Full Flow with Mock Infrastructure
668 | t.Logf("⚙️ Step 4: Executing full infrastructure plan using mock functions...")
669 | testExecuteFullPlanWithMocks(t, agent, mockSuite, decision)
670 | t.Logf("✅ Step 4 Complete: Full plan execution completed successfully")
671 |
672 | // Step 5: Enhanced Post-Execution Validation
673 | t.Logf("🔍 Step 5: Enhanced post-execution validation...")
674 | testEnhancedPostExecutionValidation(t, agent, mockSuite, decision)
675 | t.Logf("✅ Step 5 Complete: Post-execution validation passed")
676 |
677 | // Step 6: Error Scenario Testing
678 | t.Logf("🚨 Step 6: Testing error scenarios...")
679 | testErrorScenarios(t, agent, mockSuite, decision)
680 | t.Logf("✅ Step 6 Complete: Error scenarios tested")
681 |
682 | // Step 7: Infrastructure Reality Checks
683 | t.Logf("🏗️ Step 7: Running infrastructure reality checks...")
684 | testInfrastructureRealityCheck(t, agent, mockSuite, decision)
685 | t.Logf("✅ Step 7 Complete: Infrastructure reality checks passed")
686 |
687 | // Step 8: Web UI Flow Simulation
688 | t.Logf("🌐 Step 8: Simulating Web UI flow...")
689 | testWebUIFlowSimulation(t, agent, mockSuite, decision)
690 | t.Logf("✅ Step 8 Complete: Web UI flow simulation passed")
691 |
692 | // Step 9: Validate Mock Integration
693 | t.Logf("🔬 Step 9: Validating mock infrastructure integration...")
694 | testValidateMockIntegration(t, mockSuite, decision)
695 | t.Logf("✅ Step 9 Complete: Mock integration validated")
696 |
697 | t.Logf("🎉 All tests completed successfully! Enhanced AI + Mock infrastructure integration validated.")
698 | }
699 |
700 | // === Test Function for EC2 with ALB Prompt with State Handling ===
701 |
702 | func testRealAIWithRealStateEC2AndALBPrompt(t *testing.T) {
703 | // EC2 with ALB infrastructure prompt
704 | comprehensivePrompt := comprehensiveEC2withALBPrompt()
705 |
706 | // Setup test configuration
707 | cfg, err := setupRealConfiguration()
708 | if err != nil {
709 | t.Fatalf("Failed to setup real configuration: %v", err)
710 | }
711 |
712 | // Setup real LLM client
713 | llmClient, err := setupRealLLMClient(cfg)
714 | if err != nil {
715 | t.Fatalf("Failed to setup real LLM client: %v", err)
716 | }
717 |
718 | // Setup test agent with real AI and comprehensive mock infrastructure
719 | agent, mockSuite, err := setupAgentWithRealAI(cfg, llmClient)
720 | if err != nil {
721 | t.Fatalf("Failed to setup test agent: %v", err)
722 | }
723 |
724 | // Load existing infrastructure state from sample file
725 | t.Logf("📋 Loading existing infrastructure state from states/infrastructure-state-t01.json...")
726 | existingState, err := loadInfrastructureStateFromFile("states/infrastructure-state-t01.json")
727 | if err != nil {
728 | // If state file doesn't exist or can't be loaded, use empty state
729 | t.Fatalf("⚠️ Could not load existing state file (%v), using empty state for test", err)
730 | } else {
731 | t.Logf("✅ Successfully loaded existing state with %d resources", len(existingState.Resources))
732 |
733 | // Log some of the existing resources to verify proper loading
734 | resourceCount := 0
735 | for resourceID, resource := range existingState.Resources {
736 | if resourceCount < 3 { // Only log first 3 for brevity
737 | t.Logf("📦 Existing resource: %s (type: %s, status: %s)", resourceID, resource.Type, resource.Status)
738 | }
739 | resourceCount++
740 | }
741 | if resourceCount > 3 {
742 | t.Logf("📦 ... and %d more existing resources", resourceCount-3)
743 | }
744 |
745 | // Load the state into mock infrastructure and populate resource mappings
746 | t.Logf("🔄 Loading state into mock infrastructure for dependency resolution...")
747 | if err := mockSuite.LoadExistingState(existingState.Resources, agent); err != nil {
748 | t.Fatalf("❌ Failed to load state into mock infrastructure: %v", err)
749 | }
750 | t.Logf("✅ State loaded into mock infrastructure with %d resource mappings", len(mockSuite.ResourceMappings))
751 | }
752 |
753 | // Create decision context using the loaded state - this is key for testing state handling
754 | decisionContext := &DecisionContext{
755 | Request: comprehensivePrompt,
756 | CurrentState: existingState, // Pass the loaded state here
757 | DiscoveredState: []*types.ResourceState{},
758 | Conflicts: []*types.ConflictResolution{},
759 | DeploymentOrder: []string{},
760 | ResourceCorrelation: make(map[string]*ResourceMatch),
761 | }
762 |
763 | t.Logf("🚀 Starting comprehensive EC2 with ALB test with real AI and existing state context...")
764 |
765 | // Step 1: Test AI Decision Making with Existing State Context
766 | t.Logf("📡 Step 1: Making real AI API call with existing state context for EC2+ALB infrastructure...")
767 |
768 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute*3)
769 | defer cancel()
770 |
771 | decisionID := "test-ec2-alb-decision-with-state"
772 | decision, err := agent.generateDecisionWithPlan(ctx, decisionID, comprehensivePrompt, decisionContext)
773 | if err != nil {
774 | t.Fatalf("❌ Real AI API call failed: %v", err)
775 | }
776 |
777 | t.Logf("✅ Step 1 Complete: AI generated decision with %d execution steps (with state context)", len(decision.ExecutionPlan))
778 |
779 | // Log decision summary for verification
780 | t.Logf("📝 Decision Action: %s", decision.Action)
781 | t.Logf("🧠 Decision Reasoning: %s", decision.Reasoning)
782 | if decision.Resource != "" {
783 | t.Logf("📦 Primary Resource: %s", decision.Resource)
784 | }
785 |
786 | // Step 2: Validate AI-Generated Plan Structure for EC2+ALB
787 | t.Logf("🔍 Step 2: Validating AI-generated execution plan for EC2+ALB infrastructure...")
788 | validateExecutionPlanStructureForEC2ALB(t, decision, existingState)
789 | t.Logf("✅ Step 2 Complete: Execution plan structure validated for EC2+ALB")
790 |
791 | // Step 3: Test State-Aware Planning Logic
792 | t.Logf("🧠 Step 3: Testing AI state-aware planning logic...")
793 | testStateAwarePlanningLogic(t, decision, existingState, comprehensivePrompt)
794 | t.Logf("✅ Step 3 Complete: State-aware planning logic validated")
795 |
796 | // Step 4: Execute Full Flow with Mock Infrastructure
797 | t.Logf("⚙️ Step 4: Executing full EC2+ALB plan using mock functions...")
798 | testExecuteFullPlanWithMocks(t, agent, mockSuite, decision)
799 | t.Logf("✅ Step 4 Complete: Full plan execution completed successfully")
800 |
801 | // Step 5: Validate Mock Integration
802 | t.Logf("🔬 Step 5: Validating mock infrastructure integration...")
803 | testValidateMockIntegration(t, mockSuite, decision)
804 | t.Logf("✅ Step 5 Complete: Mock integration validated")
805 |
806 | // Step 6: Test Idempotency and State Consistency
807 | t.Logf("🔄 Step 6: Testing idempotency with existing state...")
808 | testIdempotencyWithExistingState(t, agent, mockSuite, decisionContext, comprehensivePrompt)
809 | t.Logf("✅ Step 6 Complete: Idempotency and state consistency validated")
810 |
811 | t.Logf("🎉 All EC2+ALB with state handling tests completed successfully!")
812 | }
813 |
814 | // === Helper Function ===
815 |
816 | // loadInfrastructureStateFromFile loads an existing infrastructure state from a JSON file
817 | func loadInfrastructureStateFromFile(filePath string) (*types.InfrastructureState, error) {
818 | dir, _ := os.Getwd()
819 |
820 | // Navigate to project root by looking for go.mod file
821 | for {
822 | if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
823 | break
824 | }
825 | parent := filepath.Dir(dir)
826 | if parent == dir {
827 | // Reached root directory, use current dir
828 | break
829 | }
830 | dir = parent
831 | }
832 |
833 | // Read state file
834 | data, err := os.ReadFile(filepath.Join(dir, filePath))
835 | if err != nil {
836 | return nil, fmt.Errorf("failed to read state file %s: %w", filePath, err)
837 | }
838 |
839 | // Parse state
840 | var state types.InfrastructureState
841 | if err := json.Unmarshal(data, &state); err != nil {
842 | return nil, fmt.Errorf("failed to parse state file %s: %w", filePath, err)
843 | }
844 |
845 | return &state, nil
846 | }
847 |
848 | // validateExecutionPlanStructureForEC2ALB validates the plan structure specifically for EC2+ALB resources
849 | func validateExecutionPlanStructureForEC2ALB(t *testing.T, decision *types.AgentDecision, existingState *types.InfrastructureState) {
850 | if len(decision.ExecutionPlan) == 0 {
851 | t.Fatal("❌ AI generated empty execution plan")
852 | }
853 |
854 | // Validate basic plan structure
855 | planValidActions := map[string]bool{
856 | "create": true,
857 | "query": true,
858 | // "update": true,
859 | // "delete": true,
860 | // "validate": true,
861 | }
862 |
863 | for _, planStep := range decision.ExecutionPlan {
864 | if !planValidActions[planStep.Action] {
865 | t.Fatalf("❌ Invalid plan action: %s", planStep.Action)
866 | }
867 | }
868 |
869 | // Check for EC2+ALB specific components
870 | foundComponents := make(map[string]bool)
871 | expectedEC2ALBComponents := []string{"ec2", "security", "load", "balancer", "target", "group"}
872 |
873 | for _, step := range decision.ExecutionPlan {
874 | // Check basic step structure
875 | if step.ID == "" {
876 | t.Errorf("❌ Step missing ID: %+v", step)
877 | }
878 | if step.Name == "" {
879 | t.Errorf("❌ Step missing Name: %+v", step)
880 | }
881 | if step.Action == "" {
882 | t.Errorf("❌ Step missing Action: %+v", step)
883 | }
884 |
885 | // Check for expected EC2+ALB components
886 | stepText := step.Name + " " + step.Description + " " + step.ResourceID
887 | for _, component := range expectedEC2ALBComponents {
888 | if strings.Contains(strings.ToLower(stepText), strings.ToLower(component)) {
889 | foundComponents[component] = true
890 | }
891 | }
892 |
893 | t.Logf("📋 Step: %s | Action: %s | Resource: %s", step.Name, step.Action, step.ResourceID)
894 | }
895 |
896 | // Verify we found key EC2+ALB components
897 | missingComponents := []string{}
898 | for _, component := range expectedEC2ALBComponents {
899 | if !foundComponents[component] {
900 | missingComponents = append(missingComponents, component)
901 | }
902 | }
903 |
904 | if len(missingComponents) > 0 {
905 | t.Logf("⚠️ Warning: Some expected EC2+ALB components not found in plan: %v", missingComponents)
906 | t.Logf("📝 This may be acceptable if AI structured the plan differently")
907 | }
908 |
909 | // Log analysis of existing state impact
910 | if len(existingState.Resources) > 0 {
911 | t.Logf("🔍 Plan generated with %d existing resources in context", len(existingState.Resources))
912 | } else {
913 | t.Logf("🔍 Plan generated with empty state context")
914 | }
915 | }
916 |
917 | // testStateAwarePlanningLogic validates that the AI properly considered existing state
918 | func testStateAwarePlanningLogic(t *testing.T, decision *types.AgentDecision, existingState *types.InfrastructureState, prompt string) {
919 | // Check if AI decision mentions handling existing resources
920 | decisionText := decision.Reasoning + " " + decision.Action
921 |
922 | if len(existingState.Resources) > 0 {
923 | // AI should show awareness of existing infrastructure
924 | hasStateAwareness := strings.Contains(strings.ToLower(decisionText), "existing") ||
925 | strings.Contains(strings.ToLower(decisionText), "current") ||
926 | strings.Contains(strings.ToLower(decisionText), "already") ||
927 | strings.Contains(strings.ToLower(decisionText), "present")
928 |
929 | if hasStateAwareness {
930 | t.Logf("✅ AI demonstrated awareness of existing infrastructure state")
931 | } else {
932 | t.Logf("⚠️ AI may not have explicitly mentioned existing state (this could still be acceptable)")
933 | }
934 | }
935 |
936 | // Check that the plan is reasonable given the prompt requirements
937 | promptLower := strings.ToLower(prompt)
938 | requiresEC2 := strings.Contains(promptLower, "ec2")
939 | requiresALB := strings.Contains(promptLower, "load balancer") || strings.Contains(promptLower, "alb")
940 |
941 | if requiresEC2 {
942 | hasEC2Plan := false
943 | for _, step := range decision.ExecutionPlan {
944 | stepText := strings.ToLower(step.Name + " " + step.Description)
945 | if strings.Contains(stepText, "ec2") || strings.Contains(stepText, "instance") {
946 | hasEC2Plan = true
947 | break
948 | }
949 | }
950 | if hasEC2Plan {
951 | t.Logf("✅ Plan includes EC2 components as required")
952 | } else {
953 | t.Logf("⚠️ Plan may not include explicit EC2 components")
954 | }
955 | }
956 |
957 | if requiresALB {
958 | hasALBPlan := false
959 | for _, step := range decision.ExecutionPlan {
960 | stepText := strings.ToLower(step.Name + " " + step.Description)
961 | if strings.Contains(stepText, "load") || strings.Contains(stepText, "balancer") || strings.Contains(stepText, "alb") {
962 | hasALBPlan = true
963 | break
964 | }
965 | }
966 | if hasALBPlan {
967 | t.Logf("✅ Plan includes ALB components as required")
968 | } else {
969 | t.Logf("⚠️ Plan may not include explicit ALB components")
970 | }
971 | }
972 | }
973 |
974 | // testIdempotencyWithExistingState tests that the AI handles idempotency correctly
975 | func testIdempotencyWithExistingState(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite,
976 | decisionContext *DecisionContext, prompt string) {
977 |
978 | t.Logf("🔄 Testing idempotency by running the same request again...")
979 |
980 | // Execute the same request again to test idempotency
981 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute*2)
982 | defer cancel()
983 |
984 | secondDecisionID := "test-idempotency-decision"
985 | secondDecision, err := agent.generateDecisionWithPlan(ctx, secondDecisionID, prompt, decisionContext)
986 | if err != nil {
987 | t.Errorf("❌ Second AI API call for idempotency test failed: %v", err)
988 | return
989 | }
990 |
991 | // Compare decisions to check for consistency
992 | t.Logf("🔍 Comparing decisions for consistency...")
993 | t.Logf("📊 First decision had %d steps", len(decisionContext.CurrentState.Resources))
994 | t.Logf("📊 Second decision has %d steps", len(secondDecision.ExecutionPlan))
995 |
996 | // The AI should potentially recognize that resources may already exist
997 | // or provide a plan that handles the existing state appropriately
998 | if len(secondDecision.ExecutionPlan) == 0 {
999 | t.Logf("✅ AI recognized no additional changes needed (perfect idempotency)")
1000 | } else {
1001 | t.Logf("📝 AI generated %d steps for the repeat request", len(secondDecision.ExecutionPlan))
1002 | t.Logf("📝 This may indicate the AI is planning to create/update resources appropriately")
1003 | }
1004 |
1005 | // Log the reasoning for the second decision
1006 | if secondDecision.Reasoning != "" {
1007 | t.Logf("🧠 AI reasoning for repeat request: %s", secondDecision.Reasoning)
1008 | }
1009 | }
1010 |
1011 | // testInfrastructureRealityCheck performs reality checks that simulate issues seen in actual AWS deployments
1012 | func testInfrastructureRealityCheck(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1013 | t.Logf("🏗️ Running infrastructure reality checks...")
1014 |
1015 | // Reality Check 1: VPC CIDR Block Validation
1016 | t.Logf("🔍 Reality Check 1: VPC CIDR validation...")
1017 | for _, step := range decision.ExecutionPlan {
1018 | if step.Action == "create" && strings.Contains(strings.ToLower(step.Name), "vpc") {
1019 | if cidr, exists := step.Parameters["cidrBlock"]; exists {
1020 | if cidrStr, ok := cidr.(string); ok {
1021 | if !isValidCIDR(cidrStr) {
1022 | t.Errorf("❌ Invalid CIDR block in step %s: %s", step.ID, cidrStr)
1023 | }
1024 | }
1025 | }
1026 | }
1027 | }
1028 |
1029 | // Reality Check 2: Subnet CIDR Overlap Detection
1030 | t.Logf("🔍 Reality Check 2: Subnet CIDR overlap detection...")
1031 | subnetCIDRs := make(map[string]string)
1032 | for _, step := range decision.ExecutionPlan {
1033 | if step.Action == "create" && strings.Contains(strings.ToLower(step.Name), "subnet") {
1034 | if cidr, exists := step.Parameters["cidrBlock"]; exists {
1035 | if cidrStr, ok := cidr.(string); ok {
1036 | if existingStep, exists := subnetCIDRs[cidrStr]; exists {
1037 | t.Errorf("❌ CIDR overlap detected: Step %s and %s both use %s", step.ID, existingStep, cidrStr)
1038 | }
1039 | subnetCIDRs[cidrStr] = step.ID
1040 | }
1041 | }
1042 | }
1043 | }
1044 |
1045 | // Reality Check 3: Availability Zone Distribution
1046 | t.Logf("🔍 Reality Check 3: Availability zone distribution...")
1047 | azUsage := make(map[string]int)
1048 | for _, step := range decision.ExecutionPlan {
1049 | if step.Action == "create" && strings.Contains(strings.ToLower(step.Name), "subnet") {
1050 | if az, exists := step.Parameters["availabilityZone"]; exists {
1051 | if azStr, ok := az.(string); ok {
1052 | azUsage[azStr]++
1053 | }
1054 | }
1055 | }
1056 | }
1057 | if len(azUsage) < 2 {
1058 | t.Logf("⚠️ Warning: Infrastructure should use multiple AZs for high availability")
1059 | }
1060 |
1061 | // Reality Check 4: Security Group Rule Validation
1062 | t.Logf("🔍 Reality Check 4: Security group rule validation...")
1063 | for _, step := range decision.ExecutionPlan {
1064 | if step.Action == "create" && strings.Contains(strings.ToLower(step.Name), "security") {
1065 | if cidrIp, exists := step.Parameters["cidrIp"]; exists {
1066 | if cidrIp == "0.0.0.0/0" {
1067 | t.Logf("⚠️ Security Warning: Step %s allows access from anywhere (0.0.0.0/0)", step.ID)
1068 | }
1069 | }
1070 | }
1071 | }
1072 |
1073 | // Reality Check 5: Resource Naming Consistency
1074 | t.Logf("🔍 Reality Check 5: Resource naming consistency...")
1075 | namePatterns := make(map[string]int)
1076 | for _, step := range decision.ExecutionPlan {
1077 | if tags, exists := step.Parameters["tags"]; exists {
1078 | if tagMap, ok := tags.(map[string]interface{}); ok {
1079 | if name, exists := tagMap["Name"]; exists {
1080 | if nameStr, ok := name.(string); ok {
1081 | // Extract naming pattern
1082 | parts := strings.Split(nameStr, "-")
1083 | if len(parts) > 1 {
1084 | pattern := parts[0] // e.g., "production" from "production-vpc"
1085 | namePatterns[pattern]++
1086 | }
1087 | }
1088 | }
1089 | }
1090 | }
1091 | }
1092 |
1093 | if len(namePatterns) > 1 {
1094 | t.Logf("⚠️ Warning: Multiple naming patterns detected: %v", namePatterns)
1095 | }
1096 |
1097 | t.Logf("✅ Infrastructure reality checks completed")
1098 | }
1099 |
1100 | // isValidCIDR performs basic CIDR validation
1101 | func isValidCIDR(cidr string) bool {
1102 | // Basic validation - in real implementation would use net.ParseCIDR
1103 | if !strings.Contains(cidr, "/") {
1104 | return false
1105 | }
1106 | parts := strings.Split(cidr, "/")
1107 | if len(parts) != 2 {
1108 | return false
1109 | }
1110 |
1111 | // Check for common valid patterns
1112 | validPatterns := []string{
1113 | "10.", "172.", "192.168.", "0.0.0.0"} // Private IP ranges + default route
1114 |
1115 | for _, pattern := range validPatterns {
1116 | if strings.HasPrefix(parts[0], pattern) {
1117 | return true
1118 | }
1119 | }
1120 |
1121 | return false
1122 | }
1123 |
1124 | // testWebUIFlowSimulation simulates the exact flow that would happen in the web UI
1125 | func testWebUIFlowSimulation(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1126 | t.Logf("🌐 Running Web UI flow simulation...")
1127 |
1128 | // Simulate Web UI Step 1: Process Request (already done in main test)
1129 | t.Logf("✅ Step 1: Process Request - Already completed")
1130 |
1131 | // Simulate Web UI Step 2: Plan Validation (user reviews plan)
1132 | t.Logf("🔍 Step 2: Simulating plan review and validation...")
1133 |
1134 | // Check if plan has reasonable number of steps (not too many, not too few)
1135 | if len(decision.ExecutionPlan) < 5 {
1136 | t.Logf("⚠️ Warning: Plan has very few steps (%d) - might be incomplete", len(decision.ExecutionPlan))
1137 | }
1138 | if len(decision.ExecutionPlan) > 50 {
1139 | t.Logf("⚠️ Warning: Plan has many steps (%d) - might be overly complex", len(decision.ExecutionPlan))
1140 | }
1141 |
1142 | // Simulate Web UI Step 3: Execution with progress updates
1143 | t.Logf("⚙️ Step 3: Simulating execution with WebSocket progress updates...")
1144 |
1145 | // Create a channel to simulate WebSocket updates
1146 | progressChan := make(chan *types.ExecutionUpdate, 100)
1147 | defer close(progressChan)
1148 |
1149 | // Start a goroutine to consume progress updates (like WebSocket would)
1150 | go func() {
1151 | updateCount := 0
1152 | for update := range progressChan {
1153 | updateCount++
1154 | if updateCount <= 5 { // Log first few updates to avoid spam
1155 | t.Logf("📡 Progress Update %d: %s - %s", updateCount, update.Type, update.Message)
1156 | }
1157 | }
1158 | t.Logf("📡 Total progress updates received: %d", updateCount)
1159 | }()
1160 |
1161 | // Simulate execution with progress reporting
1162 | ctx := context.Background()
1163 | execution, err := agent.ExecuteConfirmedPlanWithDryRun(ctx, decision, progressChan, true) // dry run
1164 | if err != nil {
1165 | t.Errorf("❌ Simulated execution failed: %v", err)
1166 | return
1167 | }
1168 |
1169 | if execution.Status != "completed" {
1170 | t.Errorf("❌ Execution did not complete successfully: %s", execution.Status)
1171 | }
1172 |
1173 | // Simulate Web UI Step 4: Post-execution state verification
1174 | t.Logf("🔍 Step 4: Simulating post-execution state verification...")
1175 |
1176 | // This would be called by the web UI to refresh the dashboard
1177 | ctx2 := context.Background()
1178 | _, err = mockSuite.MCPServer.CallTool(ctx2, "analyze-infrastructure-state", map[string]interface{}{
1179 | "include_drift_detection": true,
1180 | "detailed_analysis": true,
1181 | })
1182 | if err != nil {
1183 | t.Errorf("❌ Post-execution state analysis failed: %v", err)
1184 | }
1185 |
1186 | t.Logf("✅ Web UI flow simulation completed successfully")
1187 | }
1188 |
1189 | func testRealAIWithComprehensiveThreeLayerPrompt(t *testing.T) {
1190 | // Comprehensive Three-Tier infrastructure prompt
1191 | comprehensivePrompt := comprehensiveThreeLayerPrompt()
1192 |
1193 | // Setup test configuration
1194 | cfg, err := setupRealConfiguration()
1195 | if err != nil {
1196 | t.Fatalf("Failed to setup real configuration: %v", err)
1197 | }
1198 |
1199 | // Setup real LLM client
1200 | llmClient, err := setupRealLLMClient(cfg)
1201 | if err != nil {
1202 | t.Fatalf("Failed to setup real LLM client: %v", err)
1203 | }
1204 |
1205 | // Setup test agent with real AI and comprehensive mock infrastructure
1206 | agent, mockSuite, err := setupAgentWithRealAI(cfg, llmClient)
1207 | if err != nil {
1208 | t.Fatalf("Failed to setup test agent: %v", err)
1209 | }
1210 | // defer mockSuite.Reset()
1211 |
1212 | // Create decision context using mock state manager
1213 | emptyState := &types.InfrastructureState{
1214 | Resources: make(map[string]*types.ResourceState),
1215 | }
1216 |
1217 | decisionContext := &DecisionContext{
1218 | Request: comprehensivePrompt,
1219 | CurrentState: emptyState,
1220 | DiscoveredState: []*types.ResourceState{},
1221 | Conflicts: []*types.ConflictResolution{},
1222 | DeploymentOrder: []string{},
1223 | ResourceCorrelation: make(map[string]*ResourceMatch),
1224 | }
1225 |
1226 | t.Logf("🚀 Starting comprehensive three-tier execution pipeline test with real AI integration and mock infrastructure...")
1227 |
1228 | // Step 1: Test AI Decision Making
1229 | t.Logf("📡 Step 1: Making real AI API call to process comprehensive three-tier infrastructure request...")
1230 |
1231 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5) // Extended timeout for complex infrastructure
1232 | defer cancel()
1233 |
1234 | decisionID := "test-comprehensive-three-tier-decision"
1235 | decision, err := agent.generateDecisionWithPlan(ctx, decisionID, comprehensivePrompt, decisionContext)
1236 | if err != nil {
1237 | t.Fatalf("❌ Real AI API call failed: %v", err)
1238 | }
1239 |
1240 | t.Logf("✅ Step 1 Complete: AI generated decision with %d execution steps", len(decision.ExecutionPlan))
1241 |
1242 | // Step 2: Validate AI-Generated Plan Structure
1243 | t.Logf("🔍 Step 2: Validating AI-generated execution plan structure...")
1244 | validateExecutionPlanStructure(t, agent, decision)
1245 | t.Logf("✅ Step 2 Complete: Execution plan structure is valid")
1246 |
1247 | // Step 3: Execute Full Flow with Mock Infrastructure
1248 | t.Logf("⚙️ Step 3: Executing full infrastructure plan using mock functions...")
1249 | testExecuteFullPlanWithMocks(t, agent, mockSuite, decision)
1250 | t.Logf("✅ Step 3 Complete: Full plan execution completed successfully")
1251 |
1252 | // Step 4: Validate Mock Integration
1253 | t.Logf("🔬 Step 4: Validating mock infrastructure integration...")
1254 | testValidateMockIntegration(t, mockSuite, decision)
1255 | t.Logf("✅ Step 4 Complete: Mock integration validated")
1256 |
1257 | t.Logf("🎉 All tests completed successfully! Three-tier AI + Mock infrastructure integration validated.")
1258 | }
1259 |
1260 | func validateExecutionPlanStructure(t *testing.T, agent *StateAwareAgent, decision *types.AgentDecision) {
1261 | if len(decision.ExecutionPlan) == 0 {
1262 | t.Fatal("❌ AI generated empty execution plan")
1263 | }
1264 |
1265 | planValidActions := map[string]bool{
1266 | "create": true,
1267 | "query": true,
1268 | "modify": true,
1269 | // "delete": true,
1270 | // "validate": true,
1271 | }
1272 |
1273 | // Get available MCP tools for validation
1274 | agent.capabilityMutex.RLock()
1275 | availableTools := make(map[string]bool)
1276 | for toolName := range agent.mcpTools {
1277 | availableTools[toolName] = true
1278 | }
1279 | agent.capabilityMutex.RUnlock()
1280 |
1281 | // Validate each plan step
1282 | for i, planStep := range decision.ExecutionPlan {
1283 | // Validate action type
1284 | if !planValidActions[planStep.Action] {
1285 | t.Fatalf("❌ Invalid plan action '%s' in step %d (%s)", planStep.Action, i+1, planStep.ID)
1286 | }
1287 |
1288 | // Validate MCP tool exists if specified
1289 | if planStep.MCPTool != "" {
1290 | if !availableTools[planStep.MCPTool] {
1291 | availableToolsList := make([]string, 0, len(availableTools))
1292 | for tool := range availableTools {
1293 | availableToolsList = append(availableToolsList, tool)
1294 | }
1295 |
1296 | t.Fatalf("❌ Invalid MCP tool '%s' in step %d (%s): tool not found in discovered capabilities. Available tools: %v",
1297 | planStep.MCPTool, i+1, planStep.ID, availableToolsList)
1298 | }
1299 | }
1300 | }
1301 |
1302 | // Validate plan has expected infrastructure components
1303 | foundComponents := make(map[string]bool)
1304 | expectedComponents := []string{"vpc", "subnet", "gateway", "route", "security"}
1305 |
1306 | for _, step := range decision.ExecutionPlan {
1307 | // Check basic step structure
1308 | if step.ID == "" {
1309 | t.Errorf("❌ Step missing ID: %+v", step)
1310 | }
1311 | if step.Name == "" {
1312 | t.Errorf("❌ Step missing Name: %+v", step)
1313 | }
1314 | if step.Action == "" {
1315 | t.Errorf("❌ Step missing Action: %+v", step)
1316 | }
1317 |
1318 | // Check for expected infrastructure components
1319 | stepText := step.Name + " " + step.Description + " " + step.ResourceID
1320 | for _, component := range expectedComponents {
1321 | if strings.Contains(strings.ToLower(stepText), strings.ToLower(component)) {
1322 | foundComponents[component] = true
1323 | }
1324 | }
1325 |
1326 | t.Logf("📋 Step: %s | Action: %s | Resource: %s", step.Name, step.Action, step.ResourceID)
1327 | }
1328 |
1329 | // Verify we found key infrastructure components
1330 | missingComponents := []string{}
1331 | for _, component := range expectedComponents {
1332 | if !foundComponents[component] {
1333 | missingComponents = append(missingComponents, component)
1334 | }
1335 | }
1336 |
1337 | if len(missingComponents) > 0 {
1338 | t.Logf("⚠️ Warning: Some expected components not found in plan: %v", missingComponents)
1339 | t.Logf("📝 This may be okay if AI structured the plan differently")
1340 | }
1341 | }
1342 |
1343 | // testExecuteFullPlanWithMocks executes the AI-generated plan using mock infrastructure
1344 | // This simulates the same flow as ExecuteConfirmedPlanWithDryRun but with mock tools
1345 | func testExecuteFullPlanWithMocks(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1346 | t.Logf("🚀 Executing %d plan steps with mock infrastructure...", len(decision.ExecutionPlan))
1347 |
1348 | // Create mock execution tracking like the real ExecuteConfirmedPlanWithDryRun
1349 | execution := &types.PlanExecution{
1350 | ID: "mock-execution-" + decision.ID,
1351 | Name: fmt.Sprintf("Execute %s", decision.Action),
1352 | Status: "running",
1353 | StartedAt: time.Now(),
1354 | Steps: []*types.ExecutionStep{},
1355 | Changes: []*types.ChangeDetection{},
1356 | Errors: []string{},
1357 | }
1358 |
1359 | t.Logf("📊 Created execution plan: ID=%s, Status=%s", execution.ID, execution.Status)
1360 |
1361 | // Execute each step like the real executeExecutionStep function
1362 | for i, planStep := range decision.ExecutionPlan {
1363 | t.Logf("⚙️ Step %d/%d: Executing %s action on %s", i+1, len(decision.ExecutionPlan), planStep.Action, planStep.ResourceID)
1364 |
1365 | startTime := time.Now()
1366 |
1367 | // Create execution step tracking (mirroring real executeExecutionStep)
1368 | executionStep := &types.ExecutionStep{
1369 | ID: planStep.ID,
1370 | Name: planStep.Name,
1371 | Status: "running",
1372 | Resource: planStep.ResourceID,
1373 | Action: planStep.Action,
1374 | StartedAt: &startTime,
1375 | }
1376 |
1377 | // Execute step using mock infrastructure (mirroring the real action switch)
1378 | var result map[string]interface{}
1379 | var err error
1380 |
1381 | switch planStep.Action {
1382 | case "create":
1383 | result, err = agent.executeCreateAction(planStep, nil, execution.ID)
1384 | case "update":
1385 | result, err = testExecuteUpdateActionWithMocks(t, mockSuite, planStep)
1386 | case "delete":
1387 | result, err = testExecuteDeleteActionWithMocks(t, mockSuite, planStep)
1388 | case "validate":
1389 | result, err = testExecuteValidateActionWithMocks(t, mockSuite, planStep)
1390 | case "query":
1391 | result, err = agent.executeQueryAction(planStep, nil, execution.ID)
1392 | default:
1393 | err = fmt.Errorf("unknown action type: %s", planStep.Action)
1394 | }
1395 |
1396 | // Complete step tracking (mirroring real execution)
1397 | endTime := time.Now()
1398 | executionStep.CompletedAt = &endTime
1399 | executionStep.Duration = endTime.Sub(startTime)
1400 |
1401 | if err != nil {
1402 | executionStep.Status = "failed"
1403 | executionStep.Error = err.Error()
1404 | execution.Errors = append(execution.Errors, err.Error())
1405 |
1406 | // Check if this is a mock validation error that we can tolerate
1407 | if strings.Contains(err.Error(), "invalid subnet ID format") ||
1408 | strings.Contains(err.Error(), "validation error for parameter") ||
1409 | strings.Contains(err.Error(), "mock MCP tool call failed") {
1410 | t.Logf("⚠️ Step %d failed with mock validation error (expected): %v", i+1, err)
1411 | } else {
1412 | t.Errorf("❌ Step %d failed: %v", i+1, err)
1413 | }
1414 | } else {
1415 | executionStep.Status = "completed"
1416 | executionStep.Output = result
1417 | t.Logf("✅ Step %d completed successfully in %v", i+1, executionStep.Duration)
1418 | }
1419 |
1420 | execution.Steps = append(execution.Steps, executionStep)
1421 | }
1422 |
1423 | // Complete execution tracking
1424 | // completedAt := time.Now()
1425 | // execution.CompletedAt = &completedAt
1426 |
1427 | // Count serious errors (non-mock validation errors)
1428 | seriousErrorCount := 0
1429 | mockValidationErrorCount := 0
1430 |
1431 | for _, errMsg := range execution.Errors {
1432 | if strings.Contains(errMsg, "invalid subnet ID format") ||
1433 | strings.Contains(errMsg, "validation error for parameter") ||
1434 | strings.Contains(errMsg, "mock MCP tool call failed") {
1435 | mockValidationErrorCount++
1436 | } else {
1437 | seriousErrorCount++
1438 | }
1439 | }
1440 |
1441 | if seriousErrorCount > 0 {
1442 | execution.Status = "failed"
1443 | t.Fatalf("❌ Execution completed with %d serious errors", seriousErrorCount)
1444 | } else {
1445 | execution.Status = "completed"
1446 | if mockValidationErrorCount > 0 {
1447 | t.Logf("✅ Execution completed successfully with %d steps (%d mock validation errors tolerated)", len(execution.Steps), mockValidationErrorCount)
1448 | } else {
1449 | t.Logf("✅ Execution completed successfully with %d steps", len(execution.Steps))
1450 | }
1451 | }
1452 | }
1453 |
1454 | // testExecuteUpdateActionWithMocks simulates update operations
1455 | func testExecuteUpdateActionWithMocks(t *testing.T, mockSuite *mocks.MockTestSuite, planStep *types.ExecutionPlanStep) (map[string]interface{}, error) {
1456 | t.Logf("🔄 Updating %s resource: %s", planStep.ResourceID, planStep.Name)
1457 |
1458 | // Mock update via state management
1459 | testResource := &types.ResourceState{
1460 | ID: "mock-" + planStep.ResourceID,
1461 | Type: planStep.ResourceID,
1462 | Status: "updated",
1463 | Properties: planStep.Parameters,
1464 | }
1465 |
1466 | mockSuite.StateManager.AddResource(testResource)
1467 |
1468 | return map[string]interface{}{
1469 | "action": "update",
1470 | "resource_id": testResource.ID,
1471 | "status": "completed",
1472 | }, nil
1473 | }
1474 |
1475 | // testExecuteDeleteActionWithMocks simulates delete operations
1476 | func testExecuteDeleteActionWithMocks(t *testing.T, mockSuite *mocks.MockTestSuite, planStep *types.ExecutionPlanStep) (map[string]interface{}, error) {
1477 | t.Logf("🗑️ Deleting %s resource: %s", planStep.ResourceID, planStep.Name)
1478 |
1479 | return map[string]interface{}{
1480 | "action": "delete",
1481 | "resource_id": "mock-" + planStep.ResourceID,
1482 | "status": "completed",
1483 | }, nil
1484 | }
1485 |
1486 | // testExecuteValidateActionWithMocks simulates validation operations
1487 | func testExecuteValidateActionWithMocks(t *testing.T, mockSuite *mocks.MockTestSuite, planStep *types.ExecutionPlanStep) (map[string]interface{}, error) {
1488 | t.Logf("✅ Validating %s resource: %s", planStep.ResourceID, planStep.Name)
1489 |
1490 | return map[string]interface{}{
1491 | "action": "validate",
1492 | "resource_id": "mock-" + planStep.ResourceID,
1493 | "validation_result": "passed",
1494 | }, nil
1495 | }
1496 |
1497 | // testValidateMockIntegration validates that mock infrastructure components are working correctly
1498 | func testValidateMockIntegration(t *testing.T, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1499 | t.Logf("🔍 Validating mock infrastructure integration...")
1500 |
1501 | // Test 1: Mock MCP Server Integration
1502 | t.Logf("📡 Testing Mock MCP Server...")
1503 | ctx := context.Background()
1504 | testResult, err := mockSuite.MCPServer.CallTool(ctx, "describe_vpcs", map[string]interface{}{})
1505 | if err != nil {
1506 | t.Errorf("❌ Mock MCP Server failed: %v", err)
1507 | } else {
1508 | t.Logf("✅ Mock MCP Server working: %v", testResult != nil)
1509 | }
1510 |
1511 | // Test 2: Mock State Manager Integration
1512 | t.Logf("💾 Testing Mock State Manager...")
1513 | testResource := &types.ResourceState{
1514 | ID: "test-validation-resource",
1515 | Type: "vpc",
1516 | Status: "active",
1517 | Properties: map[string]interface{}{
1518 | "cidr": "10.0.0.0/16",
1519 | },
1520 | }
1521 | mockSuite.StateManager.AddResource(testResource)
1522 |
1523 | // Verify resource was added
1524 | resources := mockSuite.StateManager.GetResources()
1525 | found := false
1526 | for _, resource := range resources {
1527 | if resource.ID == "test-validation-resource" {
1528 | found = true
1529 | break
1530 | }
1531 | }
1532 |
1533 | if !found {
1534 | t.Error("❌ Mock State Manager failed to store resource")
1535 | } else {
1536 | t.Logf("✅ Mock State Manager working: stored %d resources", len(resources))
1537 | }
1538 |
1539 | // Test 3: Mock AWS Client Integration
1540 | t.Logf("☁️ Testing Mock AWS Client...")
1541 | mockSuite.AWSClient.AddDefaultTestData()
1542 | // Just verify it doesn't panic - AWS client functionality is tested in its own unit tests
1543 | t.Logf("✅ Mock AWS Client working")
1544 |
1545 | // Note: Retrieval registry tests removed - retrieval functions are deprecated
1546 | // All resource queries now use MCP tools with "query" action
1547 |
1548 | t.Logf("✅ All mock integration tests passed!")
1549 | }
1550 |
1551 | // testEnhancedPreExecutionValidation performs comprehensive validation before execution
1552 | func testEnhancedPreExecutionValidation(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1553 | t.Logf("🔍 Running enhanced pre-execution validation...")
1554 |
1555 | // Test 1: Validate Resource ID Uniqueness in Plan
1556 | t.Logf("🔍 Test 1: Validating resource ID uniqueness...")
1557 | resourceIDs := make(map[string]bool)
1558 | for _, step := range decision.ExecutionPlan {
1559 | if step.ResourceID == "" {
1560 | t.Errorf("❌ Step %s has empty ResourceID", step.ID)
1561 | continue
1562 | }
1563 | if resourceIDs[step.ResourceID] {
1564 | t.Logf("⚠️ Warning: Duplicate ResourceID '%s' found in plan - this could cause state conflicts", step.ResourceID)
1565 | }
1566 | resourceIDs[step.ResourceID] = true
1567 | }
1568 | t.Logf("✅ Resource ID uniqueness check completed")
1569 |
1570 | // Test 2: Validate Dependency Resolution Logic
1571 | t.Logf("🔍 Test 2: Validating dependency resolution...")
1572 | for _, step := range decision.ExecutionPlan {
1573 | // Check if step has dependency references
1574 | if step.Parameters != nil {
1575 | validateDependencyReferences(t, step, decision.ExecutionPlan)
1576 | }
1577 | }
1578 | t.Logf("✅ Dependency resolution validation completed")
1579 |
1580 | // Test 3: Validate Parameter Completeness
1581 | t.Logf("🔍 Test 3: Validating parameter completeness...")
1582 | for _, step := range decision.ExecutionPlan {
1583 | validateParameterCompleteness(t, step)
1584 | }
1585 | t.Logf("✅ Parameter completeness validation completed")
1586 |
1587 | // Test 4: Validate Tool Availability
1588 | t.Logf("🔍 Test 4: Validating tool availability...")
1589 | for _, step := range decision.ExecutionPlan {
1590 | if step.Action == "create" && step.MCPTool != "" {
1591 | // Simulate checking if tool exists in mock MCP server
1592 | ctx := context.Background()
1593 | _, err := mockSuite.MCPServer.CallTool(ctx, step.MCPTool, map[string]interface{}{})
1594 | if err != nil && !strings.Contains(err.Error(), "validation") {
1595 | t.Errorf("❌ Tool '%s' not available in MCP server: %v", step.MCPTool, err)
1596 | }
1597 | }
1598 | }
1599 | t.Logf("✅ Tool availability validation completed")
1600 | }
1601 |
1602 | // testEnhancedPostExecutionValidation performs comprehensive validation after execution
1603 | func testEnhancedPostExecutionValidation(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1604 | t.Logf("🔍 Running enhanced post-execution validation...")
1605 |
1606 | // Test 1: Validate State Consistency
1607 | t.Logf("🔍 Test 1: Validating state consistency...")
1608 | resources := mockSuite.StateManager.GetResources()
1609 |
1610 | // Create a map for quick lookup
1611 | resourceMap := make(map[string]*types.ResourceState)
1612 | for _, resource := range resources {
1613 | resourceMap[resource.ID] = resource
1614 | }
1615 |
1616 | // Check if all created resources are in state
1617 | expectedResources := 0
1618 | for _, step := range decision.ExecutionPlan {
1619 | if step.Action == "create" {
1620 | expectedResources++
1621 | }
1622 | }
1623 |
1624 | if len(resources) == 0 {
1625 | t.Errorf("❌ No resources found in state after execution")
1626 | }
1627 | t.Logf("✅ Found %d resources in state (expected approximately %d)", len(resources), expectedResources)
1628 |
1629 | // Test 2: Validate Resource Dependencies in State
1630 | t.Logf("🔍 Test 2: Validating resource dependencies in state...")
1631 | for _, step := range decision.ExecutionPlan {
1632 | if len(step.DependsOn) > 0 {
1633 | // Verify dependencies exist in state
1634 | for _, depID := range step.DependsOn {
1635 | found := false
1636 | for _, resource := range resources {
1637 | if resource.ID == depID || strings.Contains(resource.ID, depID) {
1638 | found = true
1639 | break
1640 | }
1641 | }
1642 | if !found {
1643 | t.Logf("⚠️ Warning: Dependency '%s' for step '%s' not found in final state", depID, step.ID)
1644 | }
1645 | }
1646 | }
1647 | }
1648 | t.Logf("✅ Resource dependency validation completed")
1649 |
1650 | // Test 3: Validate Resource Properties
1651 | t.Logf("🔍 Test 3: Validating resource properties...")
1652 | for _, resource := range resources {
1653 | if resource.Type == "" {
1654 | t.Errorf("❌ Resource %s has empty type", resource.ID)
1655 | }
1656 | if resource.Status == "" {
1657 | t.Errorf("❌ Resource %s has empty status", resource.ID)
1658 | }
1659 | if resource.Properties == nil {
1660 | t.Logf("⚠️ Warning: Resource %s has nil properties", resource.ID)
1661 | }
1662 | }
1663 | t.Logf("✅ Resource properties validation completed")
1664 |
1665 | // Test 4: Simulate Web UI State Retrieval
1666 | t.Logf("🔍 Test 4: Simulating web UI state retrieval...")
1667 | ctx := context.Background()
1668 | _, err := mockSuite.MCPServer.CallTool(ctx, "analyze-infrastructure-state", map[string]interface{}{
1669 | "include_drift_detection": true,
1670 | "detailed_analysis": true,
1671 | })
1672 | if err != nil {
1673 | t.Errorf("❌ Failed to analyze infrastructure state: %v", err)
1674 | } else {
1675 | t.Logf("✅ Infrastructure state analysis successful")
1676 | }
1677 | }
1678 |
1679 | // testErrorScenarios tests various error scenarios that could occur in actual execution
1680 | func testErrorScenarios(t *testing.T, agent *StateAwareAgent, mockSuite *mocks.MockTestSuite, decision *types.AgentDecision) {
1681 | t.Logf("🚨 Running error scenario testing...")
1682 |
1683 | // Test 1: Simulate AWS API Errors
1684 | t.Logf("🚨 Test 1: Simulating AWS API errors...")
1685 |
1686 | // Enable error simulation on mock client
1687 | mockSuite.AWSClient.EnableErrorSimulation(0.3) // 30% error rate
1688 | defer mockSuite.AWSClient.DisableErrorSimulation()
1689 |
1690 | // Try executing a simple step with error simulation
1691 | if len(decision.ExecutionPlan) > 0 {
1692 | firstStep := decision.ExecutionPlan[0]
1693 | t.Logf("🚨 Testing error resilience with step: %s", firstStep.Name)
1694 |
1695 | // Create a mock execution context
1696 | execution := &types.PlanExecution{
1697 | ID: "error-test-execution",
1698 | Status: "running",
1699 | Steps: []*types.ExecutionStep{},
1700 | }
1701 |
1702 | // Execute step with error simulation
1703 | var result map[string]interface{}
1704 | var err error
1705 |
1706 | if firstStep.Action == "create" {
1707 | result, err = agent.executeCreateAction(firstStep, nil, execution.ID)
1708 | }
1709 |
1710 | if err != nil {
1711 | t.Logf("✅ Error simulation working: got expected error: %v", err)
1712 | } else {
1713 | t.Logf("✅ Step completed despite error simulation: %v", result != nil)
1714 | }
1715 | }
1716 |
1717 | // Test 2: Simulate Dependency Resolution Failures
1718 | t.Logf("🚨 Test 2: Simulating dependency resolution failures...")
1719 |
1720 | // Create a step with invalid dependency reference
1721 | invalidStep := &types.ExecutionPlanStep{
1722 | ID: "test-invalid-dependency",
1723 | Name: "Test Invalid Dependency",
1724 | Action: "create",
1725 | ResourceID: "test-resource",
1726 | Parameters: map[string]interface{}{
1727 | "vpcId": "{{non-existent-step.resourceId}}",
1728 | },
1729 | DependsOn: []string{"non-existent-step"},
1730 | }
1731 |
1732 | // Try to resolve dependencies - should fail gracefully
1733 | t.Logf("🚨 Testing invalid dependency: %s", invalidStep.Parameters["vpcId"])
1734 |
1735 | // Test 3: Simulate State Corruption
1736 | t.Logf("🚨 Test 3: Simulating state corruption scenarios...")
1737 |
1738 | // Add a resource with invalid data to state
1739 | corruptedResource := &types.ResourceState{
1740 | ID: "corrupted-resource",
1741 | Type: "", // Empty type should cause issues
1742 | Status: "unknown",
1743 | Properties: map[string]interface{}{
1744 | "invalid": make(chan int), // Non-serializable data
1745 | },
1746 | }
1747 |
1748 | // Try adding corrupted resource (should handle gracefully)
1749 | mockSuite.StateManager.AddResource(corruptedResource)
1750 |
1751 | // Test 4: Simulate Network/Timeout Scenarios
1752 | t.Logf("🚨 Test 4: Simulating timeout scenarios...")
1753 |
1754 | // Create a context with very short timeout
1755 | shortCtx, cancel := context.WithTimeout(context.Background(), time.Millisecond*1)
1756 | defer cancel()
1757 |
1758 | // Try to make an API call with short timeout
1759 | _, err := mockSuite.MCPServer.CallTool(shortCtx, "list-vpcs", map[string]interface{}{})
1760 | if err != nil {
1761 | t.Logf("✅ Timeout handling working: %v", err)
1762 | }
1763 |
1764 | t.Logf("✅ Error scenario testing completed")
1765 | }
1766 |
1767 | // validateDependencyReferences validates dependency references in step parameters
1768 | func validateDependencyReferences(t *testing.T, step *types.ExecutionPlanStep, allSteps []*types.ExecutionPlanStep) {
1769 | // Create a map of all step IDs for validation
1770 | stepMap := make(map[string]*types.ExecutionPlanStep)
1771 | for _, s := range allSteps {
1772 | stepMap[s.ID] = s
1773 | }
1774 |
1775 | // Check parameters for dependency references
1776 | for key, value := range step.Parameters {
1777 | if strVal, ok := value.(string); ok {
1778 | // Look for dependency references like {{step-id.resourceId}}
1779 | if strings.HasPrefix(strVal, "{{") && strings.HasSuffix(strVal, "}}") {
1780 | ref := strings.TrimPrefix(strings.TrimSuffix(strVal, "}}"), "{{")
1781 | parts := strings.Split(ref, ".")
1782 | if len(parts) > 0 {
1783 | refStepID := parts[0]
1784 | if _, exists := stepMap[refStepID]; !exists {
1785 | t.Errorf("❌ Step %s parameter %s references non-existent step: %s", step.ID, key, refStepID)
1786 | }
1787 | }
1788 | }
1789 | }
1790 | }
1791 | }
1792 |
1793 | // validateParameterCompleteness validates that steps have required parameters
1794 | func validateParameterCompleteness(t *testing.T, step *types.ExecutionPlanStep) {
1795 | // Define required parameters for common actions
1796 | requiredParams := map[string][]string{
1797 | "create-vpc": {"cidrBlock"},
1798 | "create-subnet": {"vpcId", "cidrBlock"},
1799 | "create-security-group": {"vpcId", "groupName"},
1800 | "create-ec2-instance": {"imageId", "instanceType"},
1801 | }
1802 |
1803 | if step.MCPTool != "" {
1804 | if required, exists := requiredParams[step.MCPTool]; exists {
1805 | for _, param := range required {
1806 | // Check both Parameters and ToolParameters
1807 | hasParam := false
1808 | if _, exists := step.Parameters[param]; exists {
1809 | hasParam = true
1810 | }
1811 | if step.ToolParameters != nil {
1812 | if _, exists := step.ToolParameters[param]; exists {
1813 | hasParam = true
1814 | }
1815 | }
1816 |
1817 | if !hasParam {
1818 | t.Errorf("❌ Step %s missing required parameter: %s", step.ID, param)
1819 | }
1820 | }
1821 | }
1822 | }
1823 | }
1824 |
```