This is page 98 of 104. 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.bedrock.yaml.example ├── config.gemini.yaml.example ├── config.openai.yaml.example ├── config.yaml ├── Dockerfile ├── docs │ ├── _sidebar.md │ ├── .nojekyll │ ├── api-key-setup │ │ ├── aws-bedrock-nova-setup.md │ │ ├── gemini-api-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 │ │ ├── simple-demo.svg │ │ ├── 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_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_agent_extensions.go │ │ ├── react_error_context.go │ │ ├── react_recovery_engine.go │ │ ├── react_recovery_types.go │ │ ├── resources │ │ │ ├── field_resolver.go │ │ │ ├── id_extractor.go │ │ │ └── pattern_matcher.go │ │ └── types.go │ ├── api │ │ └── server.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 │ └── 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 ├── robots.txt └── static ├── css │ ├── main.c910004d.css │ └── main.c910004d.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.f10cd903.chunk.js ├── 1595.f10cd903.chunk.js.LICENSE.txt ├── 1595.f10cd903.chunk.js.map ├── 1707.26c2b146.chunk.js ├── 1707.26c2b146.chunk.js.map ├── 2019.3e4e6398.chunk.js ├── 2019.3e4e6398.chunk.js.map ├── 2038.86d3ba27.chunk.js ├── 2038.86d3ba27.chunk.js.map ├── 2374.75cb7c60.chunk.js ├── 2374.75cb7c60.chunk.js.LICENSE.txt ├── 2374.75cb7c60.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 ├── 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.02ce9149.chunk.js ├── 7069.02ce9149.chunk.js.map ├── 7513.37f12f0e.chunk.js ├── 7513.37f12f0e.chunk.js.map ├── 7550.0cfdabcf.chunk.js ├── 7550.0cfdabcf.chunk.js.map ├── 7681.ee495de8.chunk.js ├── 7681.ee495de8.chunk.js.LICENSE.txt ├── 7681.ee495de8.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.7fdeafe8.chunk.js ├── 8660.7fdeafe8.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.4cda12e2.js ├── main.4cda12e2.js.LICENSE.txt └── main.4cda12e2.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 | // "update": 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 | ```