This is page 99 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/mocks/mcp_server_mock.go: -------------------------------------------------------------------------------- ```go 1 | package mocks 2 | 3 | import ( 4 | "context" 5 | "encoding/json" 6 | "fmt" 7 | "strings" 8 | "sync" 9 | 10 | "github.com/mark3labs/mcp-go/mcp" 11 | "github.com/versus-control/ai-infrastructure-agent/internal/logging" 12 | "github.com/versus-control/ai-infrastructure-agent/pkg/aws" 13 | "github.com/versus-control/ai-infrastructure-agent/pkg/interfaces" 14 | "github.com/versus-control/ai-infrastructure-agent/pkg/types" 15 | ) 16 | 17 | // MockMCPServer implements a mock MCP server for testing 18 | type MockMCPServer struct { 19 | logger *logging.Logger 20 | tools map[string]interfaces.MCPTool 21 | resources map[string]*types.AWSResource 22 | stateManager *MockStateManager 23 | awsClient *MockAWSClient 24 | mutex sync.RWMutex 25 | 26 | // Response configuration 27 | simulateErrors map[string]error 28 | customResponses map[string]*mcp.CallToolResult 29 | } 30 | 31 | // NewMockMCPServer creates a new mock MCP server 32 | func NewMockMCPServer(logger *logging.Logger) *MockMCPServer { 33 | return &MockMCPServer{ 34 | logger: logger, 35 | tools: make(map[string]interfaces.MCPTool), 36 | resources: make(map[string]*types.AWSResource), 37 | stateManager: NewMockStateManager(), 38 | awsClient: nil, // Will be set via SetAWSClient 39 | simulateErrors: make(map[string]error), 40 | customResponses: make(map[string]*mcp.CallToolResult), 41 | } 42 | } 43 | 44 | // NewMockMCPServerWithAWSClient creates a new mock MCP server with AWS client 45 | func NewMockMCPServerWithAWSClient(logger *logging.Logger, awsClient *MockAWSClient) *MockMCPServer { 46 | return &MockMCPServer{ 47 | logger: logger, 48 | tools: make(map[string]interfaces.MCPTool), 49 | resources: make(map[string]*types.AWSResource), 50 | stateManager: NewMockStateManager(), 51 | awsClient: awsClient, 52 | simulateErrors: make(map[string]error), 53 | customResponses: make(map[string]*mcp.CallToolResult), 54 | } 55 | } 56 | 57 | // SetAWSClient sets the AWS client for the mock server 58 | func (m *MockMCPServer) SetAWSClient(awsClient *MockAWSClient) { 59 | m.mutex.Lock() 60 | defer m.mutex.Unlock() 61 | m.awsClient = awsClient 62 | } 63 | 64 | // Execute implements the MCPTool interface for the mock server itself 65 | func (m *MockMCPServer) Execute(ctx context.Context, arguments map[string]interface{}) (*mcp.CallToolResult, error) { 66 | // This method allows the MockMCPServer to be used as an MCPTool 67 | // It delegates to CallTool with a default tool name if provided in arguments 68 | if toolName, ok := arguments["tool_name"].(string); ok { 69 | // Remove tool_name from arguments before calling the tool 70 | toolArgs := make(map[string]interface{}) 71 | for k, v := range arguments { 72 | if k != "tool_name" { 73 | toolArgs[k] = v 74 | } 75 | } 76 | return m.CallTool(ctx, toolName, toolArgs) 77 | } 78 | 79 | return &mcp.CallToolResult{ 80 | IsError: true, 81 | Content: []mcp.Content{ 82 | &mcp.TextContent{ 83 | Type: "text", 84 | Text: "MockMCPServer Execute requires 'tool_name' parameter", 85 | }, 86 | }, 87 | }, nil 88 | } 89 | 90 | // Name implements MCPTool interface 91 | func (m *MockMCPServer) Name() string { 92 | return "mock-mcp-server" 93 | } 94 | 95 | // Description implements MCPTool interface 96 | func (m *MockMCPServer) Description() string { 97 | return "Mock MCP server for testing" 98 | } 99 | 100 | // Category implements MCPTool interface 101 | func (m *MockMCPServer) Category() string { 102 | return "testing" 103 | } 104 | 105 | // GetInputSchema implements MCPTool interface 106 | func (m *MockMCPServer) GetInputSchema() map[string]interface{} { 107 | return map[string]interface{}{ 108 | "type": "object", 109 | "properties": map[string]interface{}{ 110 | "tool_name": map[string]interface{}{ 111 | "type": "string", 112 | "description": "Name of the tool to execute", 113 | }, 114 | }, 115 | "required": []string{"tool_name"}, 116 | } 117 | } 118 | 119 | // GetOutputSchema implements MCPTool interface 120 | func (m *MockMCPServer) GetOutputSchema() map[string]interface{} { 121 | return map[string]interface{}{ 122 | "type": "object", 123 | "description": "Tool execution result", 124 | } 125 | } 126 | 127 | // GetExamples implements MCPTool interface 128 | func (m *MockMCPServer) GetExamples() []interfaces.ToolExample { 129 | return []interfaces.ToolExample{ 130 | { 131 | Description: "Execute a mock tool", 132 | Arguments: map[string]interface{}{ 133 | "tool_name": "create-vpc", 134 | "name": "test-vpc", 135 | "cidrBlock": "10.0.0.0/16", 136 | }, 137 | Expected: "VPC creation result", 138 | }, 139 | } 140 | } 141 | 142 | // ValidateArguments implements MCPTool interface 143 | func (m *MockMCPServer) ValidateArguments(arguments map[string]interface{}) error { 144 | if _, ok := arguments["tool_name"]; !ok { 145 | return fmt.Errorf("tool_name is required") 146 | } 147 | return nil 148 | } 149 | 150 | // RegisterTool registers a tool with the mock server 151 | func (m *MockMCPServer) RegisterTool(tool interfaces.MCPTool) error { 152 | m.mutex.Lock() 153 | defer m.mutex.Unlock() 154 | 155 | m.tools[tool.Name()] = tool 156 | m.logger.Info("Registered mock tool", "tool", tool.Name()) 157 | return nil 158 | } 159 | 160 | // CallTool simulates calling an MCP tool 161 | func (m *MockMCPServer) CallTool(ctx context.Context, toolName string, arguments map[string]interface{}) (*mcp.CallToolResult, error) { 162 | m.mutex.RLock() 163 | defer m.mutex.RUnlock() 164 | 165 | // Check for simulated errors 166 | if err, exists := m.simulateErrors[toolName]; exists { 167 | return nil, err 168 | } 169 | 170 | // Check for custom responses 171 | if response, exists := m.customResponses[toolName]; exists { 172 | return response, nil 173 | } 174 | 175 | // Check if tool exists 176 | tool, exists := m.tools[toolName] 177 | if !exists { 178 | // Generate default mock response for common tools 179 | return m.generateMockToolResponse(toolName, arguments) 180 | } 181 | 182 | // Execute the actual tool with mocked dependencies 183 | return tool.Execute(ctx, arguments) 184 | } 185 | 186 | // generateMockToolResponse generates default responses for common AWS tools 187 | func (m *MockMCPServer) generateMockToolResponse(toolName string, arguments map[string]interface{}) (*mcp.CallToolResult, error) { 188 | // If AWS client is available, use AWS client versions for better integration 189 | if m.awsClient != nil { 190 | return m.generateMockToolResponseWithAWSClient(toolName, arguments) 191 | } 192 | 193 | // Fallback to static responses when no AWS client is available 194 | return m.generateMockToolResponseFallback(toolName, arguments) 195 | } 196 | 197 | // generateMockToolResponseWithAWSClient uses AWS client for realistic mock responses 198 | func (m *MockMCPServer) generateMockToolResponseWithAWSClient(toolName string, arguments map[string]interface{}) (*mcp.CallToolResult, error) { 199 | switch { 200 | // VPC Tools 201 | case toolName == "create-vpc": 202 | return m.mockCreateVPCWithAWSClient(arguments) 203 | case toolName == "list-vpcs": 204 | return m.mockListVPCsWithAWSClient(arguments) 205 | case toolName == "get-default-vpc": 206 | return m.mockGetDefaultVPC(arguments) 207 | 208 | // Subnet Tools 209 | case toolName == "create-subnet": 210 | return m.mockCreateSubnetWithAWSClient(arguments) 211 | case toolName == "create-private-subnet": 212 | return m.mockCreatePrivateSubnet(arguments) 213 | case toolName == "create-public-subnet": 214 | return m.mockCreatePublicSubnet(arguments) 215 | case toolName == "list-subnets": 216 | return m.mockListSubnets(arguments) 217 | case toolName == "list-subnets-for-alb": 218 | return m.mockSelectSubnetsForALB(arguments) 219 | 220 | // Networking Infrastructure Tools 221 | case toolName == "create-internet-gateway": 222 | return m.mockCreateInternetGateway(arguments) 223 | case toolName == "create-nat-gateway": 224 | return m.mockCreateNATGateway(arguments) 225 | case toolName == "create-public-route-table": 226 | return m.mockCreatePublicRouteTable(arguments) 227 | case toolName == "create-private-route-table": 228 | return m.mockCreatePrivateRouteTable(arguments) 229 | case toolName == "associate-route-table": 230 | return m.mockAssociateRouteTable(arguments) 231 | case toolName == "add-route": 232 | return m.mockAddRoute(arguments) 233 | 234 | // EC2 Tools 235 | case toolName == "create-ec2-instance": 236 | return m.mockCreateEC2InstanceWithAWSClient(arguments) 237 | case toolName == "list-ec2-instances": 238 | return m.mockListEC2Instances(arguments) 239 | case toolName == "start-ec2-instance": 240 | return m.mockStartEC2Instance(arguments) 241 | case toolName == "stop-ec2-instance": 242 | return m.mockStopEC2Instance(arguments) 243 | case toolName == "terminate-ec2-instance": 244 | return m.mockTerminateEC2Instance(arguments) 245 | case toolName == "create-ami-from-instance": 246 | return m.mockCreateAMIFromInstance(arguments) 247 | case toolName == "list-amis": 248 | return m.mockListAMIs(arguments) 249 | case toolName == "get-latest-ami": 250 | return m.mockGetLatestAMI(arguments) 251 | case toolName == "get-latest-amazon-linux-ami": 252 | return m.mockGetLatestAmazonLinuxAMI(arguments) 253 | case toolName == "get-latest-ubuntu-ami": 254 | return m.mockGetLatestUbuntuAMI(arguments) 255 | 256 | // Load Balancer Tools 257 | case toolName == "create-load-balancer": 258 | return m.mockCreateLoadBalancer(arguments) 259 | case toolName == "create-target-group": 260 | return m.mockCreateTargetGroup(arguments) 261 | case toolName == "create-listener": 262 | return m.mockCreateListener(arguments) 263 | case toolName == "list-load-balancers": 264 | return m.mockListLoadBalancers(arguments) 265 | case toolName == "list-target-groups": 266 | return m.mockListTargetGroups(arguments) 267 | case toolName == "register-targets": 268 | return m.mockRegisterTargets(arguments) 269 | case toolName == "deregister-targets": 270 | return m.mockDeregisterTargets(arguments) 271 | 272 | // RDS Tools 273 | case toolName == "create-db-subnet-group": 274 | return m.mockCreateDBSubnetGroup(arguments) 275 | case toolName == "create-db-instance": 276 | return m.mockCreateDBInstance(arguments) 277 | case toolName == "start-db-instance": 278 | return m.mockStartDBInstance(arguments) 279 | case toolName == "stop-db-instance": 280 | return m.mockStopDBInstance(arguments) 281 | case toolName == "delete-db-instance": 282 | return m.mockDeleteDBInstance(arguments) 283 | case toolName == "create-db-snapshot": 284 | return m.mockCreateDBSnapshot(arguments) 285 | case toolName == "list-db-instances": 286 | return m.mockListDBInstances(arguments) 287 | case toolName == "list-db-snapshots": 288 | return m.mockListDBSnapshots(arguments) 289 | 290 | // Security Group Tools 291 | case toolName == "create-security-group": 292 | return m.mockCreateSecurityGroup(arguments) 293 | case toolName == "list-security-groups": 294 | return m.mockListSecurityGroups(arguments) 295 | case toolName == "add-security-group-ingress-rule": 296 | return m.mockAddSecurityGroupIngressRule(arguments) 297 | case toolName == "add-security-group-egress-rule": 298 | return m.mockAddSecurityGroupEgressRule(arguments) 299 | case toolName == "delete-security-group": 300 | return m.mockDeleteSecurityGroup(arguments) 301 | 302 | // Auto Scaling Tools 303 | case toolName == "create-launch-template": 304 | return m.mockCreateLaunchTemplate(arguments) 305 | case toolName == "create-auto-scaling-group": 306 | return m.mockCreateAutoScalingGroup(arguments) 307 | case toolName == "list-auto-scaling-groups": 308 | return m.mockListAutoScalingGroups(arguments) 309 | case toolName == "list-launch-templates": 310 | return m.mockListLaunchTemplates(arguments) 311 | 312 | // State Tools 313 | case toolName == "export-infrastructure-state": 314 | return m.mockExportInfrastructureState(arguments) 315 | case toolName == "analyze-infrastructure-state": 316 | return m.mockAnalyzeInfrastructureState(arguments) 317 | case toolName == "visualize-dependency-graph": 318 | return m.mockVisualizeDependencyGraph(arguments) 319 | case toolName == "detect-infrastructure-conflicts": 320 | return m.mockDetectInfrastructureConflicts(arguments) 321 | case toolName == "plan-infrastructure-deployment": 322 | return m.mockPlanInfrastructureDeployment(arguments) 323 | case toolName == "add-resource-to-state": 324 | return m.mockAddResourceToState(arguments) 325 | case toolName == "save-state": 326 | return m.mockSaveState(arguments) 327 | 328 | // Utility Tools 329 | case toolName == "get-availability-zones": 330 | return m.mockGetAvailabilityZones(arguments) 331 | 332 | default: 333 | return &mcp.CallToolResult{ 334 | IsError: true, 335 | Content: []mcp.Content{ 336 | &mcp.TextContent{ 337 | Type: "text", 338 | Text: fmt.Sprintf("Mock tool '%s' not implemented", toolName), 339 | }, 340 | }, 341 | }, nil 342 | } 343 | } 344 | 345 | // generateMockToolResponseFallback provides static responses when no AWS client is available 346 | func (m *MockMCPServer) generateMockToolResponseFallback(toolName string, arguments map[string]interface{}) (*mcp.CallToolResult, error) { 347 | switch { 348 | // VPC Tools 349 | case toolName == "create-vpc": 350 | return m.mockCreateVPC(arguments) 351 | case toolName == "list-vpcs": 352 | return m.mockListVPCs(arguments) 353 | case toolName == "get-default-vpc": 354 | return m.mockGetDefaultVPC(arguments) 355 | 356 | // Subnet Tools 357 | case toolName == "create-subnet": 358 | return m.mockCreateSubnet(arguments) 359 | case toolName == "create-private-subnet": 360 | return m.mockCreatePrivateSubnet(arguments) 361 | case toolName == "create-public-subnet": 362 | return m.mockCreatePublicSubnet(arguments) 363 | case toolName == "list-subnets": 364 | return m.mockListSubnets(arguments) 365 | case toolName == "list-subnets-for-alb": 366 | return m.mockSelectSubnetsForALB(arguments) 367 | 368 | // Networking Infrastructure Tools 369 | case toolName == "create-internet-gateway": 370 | return m.mockCreateInternetGateway(arguments) 371 | case toolName == "create-nat-gateway": 372 | return m.mockCreateNATGateway(arguments) 373 | case toolName == "create-public-route-table": 374 | return m.mockCreatePublicRouteTable(arguments) 375 | case toolName == "create-private-route-table": 376 | return m.mockCreatePrivateRouteTable(arguments) 377 | case toolName == "associate-route-table": 378 | return m.mockAssociateRouteTable(arguments) 379 | case toolName == "add-route": 380 | return m.mockAddRoute(arguments) 381 | 382 | // EC2 Tools 383 | case toolName == "create-ec2-instance": 384 | return m.mockCreateEC2Instance(arguments) 385 | case toolName == "list-ec2-instances": 386 | return m.mockListEC2Instances(arguments) 387 | case toolName == "start-ec2-instance": 388 | return m.mockStartEC2Instance(arguments) 389 | case toolName == "stop-ec2-instance": 390 | return m.mockStopEC2Instance(arguments) 391 | case toolName == "terminate-ec2-instance": 392 | return m.mockTerminateEC2Instance(arguments) 393 | case toolName == "create-ami-from-instance": 394 | return m.mockCreateAMIFromInstance(arguments) 395 | case toolName == "list-amis": 396 | return m.mockListAMIs(arguments) 397 | case toolName == "get-latest-ami": 398 | return m.mockGetLatestAMI(arguments) 399 | case toolName == "get-latest-amazon-linux-ami": 400 | return m.mockGetLatestAmazonLinuxAMI(arguments) 401 | case toolName == "get-latest-ubuntu-ami": 402 | return m.mockGetLatestUbuntuAMI(arguments) 403 | 404 | // Load Balancer Tools 405 | case toolName == "create-load-balancer": 406 | return m.mockCreateLoadBalancer(arguments) 407 | case toolName == "create-target-group": 408 | return m.mockCreateTargetGroup(arguments) 409 | case toolName == "create-listener": 410 | return m.mockCreateListener(arguments) 411 | case toolName == "list-load-balancers": 412 | return m.mockListLoadBalancers(arguments) 413 | case toolName == "list-target-groups": 414 | return m.mockListTargetGroups(arguments) 415 | case toolName == "register-targets": 416 | return m.mockRegisterTargets(arguments) 417 | case toolName == "deregister-targets": 418 | return m.mockDeregisterTargets(arguments) 419 | 420 | // RDS Tools 421 | case toolName == "create-db-subnet-group": 422 | return m.mockCreateDBSubnetGroup(arguments) 423 | case toolName == "create-db-instance": 424 | return m.mockCreateDBInstance(arguments) 425 | case toolName == "start-db-instance": 426 | return m.mockStartDBInstance(arguments) 427 | case toolName == "stop-db-instance": 428 | return m.mockStopDBInstance(arguments) 429 | case toolName == "delete-db-instance": 430 | return m.mockDeleteDBInstance(arguments) 431 | case toolName == "create-db-snapshot": 432 | return m.mockCreateDBSnapshot(arguments) 433 | case toolName == "list-db-instances": 434 | return m.mockListDBInstances(arguments) 435 | case toolName == "list-db-snapshots": 436 | return m.mockListDBSnapshots(arguments) 437 | 438 | // Security Group Tools 439 | case toolName == "create-security-group": 440 | return m.mockCreateSecurityGroup(arguments) 441 | case toolName == "list-security-groups": 442 | return m.mockListSecurityGroups(arguments) 443 | case toolName == "add-security-group-ingress-rule": 444 | return m.mockAddSecurityGroupIngressRule(arguments) 445 | case toolName == "add-security-group-egress-rule": 446 | return m.mockAddSecurityGroupEgressRule(arguments) 447 | case toolName == "delete-security-group": 448 | return m.mockDeleteSecurityGroup(arguments) 449 | 450 | // Auto Scaling Tools 451 | case toolName == "create-launch-template": 452 | return m.mockCreateLaunchTemplate(arguments) 453 | case toolName == "create-auto-scaling-group": 454 | return m.mockCreateAutoScalingGroup(arguments) 455 | case toolName == "list-auto-scaling-groups": 456 | return m.mockListAutoScalingGroups(arguments) 457 | case toolName == "list-launch-templates": 458 | return m.mockListLaunchTemplates(arguments) 459 | 460 | // State Tools 461 | case toolName == "export-infrastructure-state": 462 | return m.mockExportInfrastructureState(arguments) 463 | case toolName == "analyze-infrastructure-state": 464 | return m.mockAnalyzeInfrastructureState(arguments) 465 | case toolName == "visualize-dependency-graph": 466 | return m.mockVisualizeDependencyGraph(arguments) 467 | case toolName == "detect-infrastructure-conflicts": 468 | return m.mockDetectInfrastructureConflicts(arguments) 469 | case toolName == "plan-infrastructure-deployment": 470 | return m.mockPlanInfrastructureDeployment(arguments) 471 | case toolName == "add-resource-to-state": 472 | return m.mockAddResourceToState(arguments) 473 | case toolName == "save-state": 474 | return m.mockSaveState(arguments) 475 | 476 | // Utility Tools 477 | case toolName == "get-availability-zones": 478 | return m.mockGetAvailabilityZones(arguments) 479 | 480 | default: 481 | return &mcp.CallToolResult{ 482 | IsError: true, 483 | Content: []mcp.Content{ 484 | &mcp.TextContent{ 485 | Type: "text", 486 | Text: fmt.Sprintf("Mock tool '%s' not implemented", toolName), 487 | }, 488 | }, 489 | }, nil 490 | } 491 | } 492 | 493 | // VPC Mock Responses 494 | func (m *MockMCPServer) mockCreateVPC(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 495 | name, _ := arguments["name"].(string) 496 | cidrBlock, _ := arguments["cidrBlock"].(string) 497 | 498 | if name == "" { 499 | name = "test-vpc" 500 | } 501 | if cidrBlock == "" { 502 | cidrBlock = "10.0.0.0/16" 503 | } 504 | 505 | vpcId := m.generateMockResourceId("vpc") 506 | 507 | response := map[string]interface{}{ 508 | "vpcId": vpcId, 509 | "name": name, 510 | "cidrBlock": cidrBlock, 511 | "state": "available", 512 | "isDefault": false, 513 | "resource": map[string]interface{}{ 514 | "id": vpcId, 515 | "type": "vpc", 516 | "name": name, 517 | }, 518 | } 519 | 520 | // Store resource for later retrieval 521 | m.resources[vpcId] = &types.AWSResource{ 522 | ID: vpcId, 523 | Type: "vpc", 524 | Details: map[string]interface{}{ 525 | "name": name, 526 | "cidrBlock": cidrBlock, 527 | "state": "available", 528 | }, 529 | } 530 | 531 | return m.createSuccessResponse(fmt.Sprintf("VPC '%s' created successfully", name), response) 532 | } 533 | 534 | // mockCreateVPCWithAWSClient uses the MockAWSClient for VPC creation 535 | func (m *MockMCPServer) mockCreateVPCWithAWSClient(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 536 | name, _ := arguments["name"].(string) 537 | cidrBlock, _ := arguments["cidrBlock"].(string) 538 | 539 | if name == "" { 540 | name = "test-vpc" 541 | } 542 | if cidrBlock == "" { 543 | cidrBlock = "10.0.0.0/16" 544 | } 545 | 546 | // Use the actual AWS mock client 547 | params := aws.CreateVPCParams{ 548 | CidrBlock: cidrBlock, 549 | Name: name, 550 | Tags: map[string]string{ 551 | "Name": name, 552 | }, 553 | } 554 | 555 | ctx := context.Background() 556 | awsResource, err := m.awsClient.CreateVPC(ctx, params) 557 | if err != nil { 558 | return &mcp.CallToolResult{ 559 | IsError: true, 560 | Content: []mcp.Content{ 561 | &mcp.TextContent{ 562 | Type: "text", 563 | Text: fmt.Sprintf("Failed to create VPC: %v", err), 564 | }, 565 | }, 566 | }, err 567 | } 568 | 569 | response := map[string]interface{}{ 570 | "vpcId": awsResource.ID, 571 | "name": name, 572 | "cidrBlock": cidrBlock, 573 | "state": awsResource.State, 574 | "isDefault": false, 575 | "resource": map[string]interface{}{ 576 | "id": awsResource.ID, 577 | "type": awsResource.Type, 578 | "name": name, 579 | "region": awsResource.Region, 580 | }, 581 | } 582 | 583 | return m.createSuccessResponse(fmt.Sprintf("VPC '%s' created successfully", name), response) 584 | } 585 | 586 | func (m *MockMCPServer) mockListVPCs(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 587 | vpcs := []map[string]interface{}{ 588 | { 589 | "vpcId": "vpc-default123", 590 | "name": "default-vpc", 591 | "cidrBlock": "172.31.0.0/16", 592 | "state": "available", 593 | "isDefault": true, 594 | }, 595 | { 596 | "vpcId": "vpc-prod123", 597 | "name": "production-vpc", 598 | "cidrBlock": "10.0.0.0/16", 599 | "state": "available", 600 | "isDefault": false, 601 | }, 602 | } 603 | 604 | response := map[string]interface{}{ 605 | "vpcs": vpcs, 606 | "count": len(vpcs), 607 | } 608 | 609 | return m.createSuccessResponse(fmt.Sprintf("Found %d VPCs", len(vpcs)), response) 610 | } 611 | 612 | // mockListVPCsWithAWSClient uses the MockAWSClient for VPC listing 613 | func (m *MockMCPServer) mockListVPCsWithAWSClient(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 614 | ctx := context.Background() 615 | awsVPCs, err := m.awsClient.DescribeVPCs(ctx) 616 | if err != nil { 617 | return &mcp.CallToolResult{ 618 | IsError: true, 619 | Content: []mcp.Content{ 620 | &mcp.TextContent{ 621 | Type: "text", 622 | Text: fmt.Sprintf("Failed to list VPCs: %v", err), 623 | }, 624 | }, 625 | }, err 626 | } 627 | 628 | vpcs := make([]map[string]interface{}, 0, len(awsVPCs)) 629 | for _, vpc := range awsVPCs { 630 | vpcs = append(vpcs, map[string]interface{}{ 631 | "vpcId": vpc.ID, 632 | "name": vpc.Details["name"], 633 | "cidrBlock": vpc.Details["cidrBlock"], 634 | "state": vpc.State, 635 | "isDefault": false, // Mock doesn't track default VPCs 636 | }) 637 | } 638 | 639 | response := map[string]interface{}{ 640 | "vpcs": vpcs, 641 | "count": len(vpcs), 642 | } 643 | 644 | return m.createSuccessResponse(fmt.Sprintf("Found %d VPCs", len(vpcs)), response) 645 | } 646 | 647 | func (m *MockMCPServer) mockGetDefaultVPC(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 648 | response := map[string]interface{}{ 649 | "value": "vpc-default123", 650 | "vpcId": "vpc-default123", 651 | "name": "default-vpc", 652 | "cidrBlock": "172.31.0.0/16", 653 | "state": "available", 654 | "source": "aws_api_call", 655 | } 656 | 657 | return m.createSuccessResponse("Found default VPC", response) 658 | } 659 | 660 | // Subnet Mock Responses 661 | func (m *MockMCPServer) mockCreateSubnet(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 662 | name, _ := arguments["name"].(string) 663 | vpcId, _ := arguments["vpcId"].(string) 664 | cidrBlock, _ := arguments["cidrBlock"].(string) 665 | availabilityZone, _ := arguments["availabilityZone"].(string) 666 | 667 | if name == "" { 668 | name = "test-subnet" 669 | } 670 | if vpcId == "" { 671 | vpcId = "vpc-default123" 672 | } 673 | if cidrBlock == "" { 674 | cidrBlock = "10.0.1.0/24" 675 | } 676 | if availabilityZone == "" { 677 | availabilityZone = "us-west-2a" 678 | } 679 | 680 | subnetId := m.generateMockResourceId("subnet") 681 | 682 | response := map[string]interface{}{ 683 | "subnetId": subnetId, 684 | "name": name, 685 | "vpcId": vpcId, 686 | "cidrBlock": cidrBlock, 687 | "availabilityZone": availabilityZone, 688 | "state": "available", 689 | "resource": map[string]interface{}{ 690 | "id": subnetId, 691 | "type": "subnet", 692 | "name": name, 693 | }, 694 | } 695 | 696 | return m.createSuccessResponse(fmt.Sprintf("Subnet '%s' created successfully", name), response) 697 | } 698 | 699 | // mockCreateSubnetWithAWSClient uses the MockAWSClient for subnet creation 700 | func (m *MockMCPServer) mockCreateSubnetWithAWSClient(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 701 | name, _ := arguments["name"].(string) 702 | vpcId, _ := arguments["vpcId"].(string) 703 | cidrBlock, _ := arguments["cidrBlock"].(string) 704 | availabilityZone, _ := arguments["availabilityZone"].(string) 705 | 706 | if name == "" { 707 | name = "test-subnet" 708 | } 709 | if vpcId == "" { 710 | vpcId = "vpc-default123" 711 | } 712 | if cidrBlock == "" { 713 | cidrBlock = "10.0.1.0/24" 714 | } 715 | if availabilityZone == "" { 716 | availabilityZone = "us-west-2a" 717 | } 718 | 719 | // Use the actual AWS mock client 720 | params := aws.CreateSubnetParams{ 721 | VpcID: vpcId, 722 | CidrBlock: cidrBlock, 723 | AvailabilityZone: availabilityZone, 724 | Name: name, 725 | } 726 | 727 | ctx := context.Background() 728 | awsResource, err := m.awsClient.CreateSubnet(ctx, params) 729 | if err != nil { 730 | return &mcp.CallToolResult{ 731 | IsError: true, 732 | Content: []mcp.Content{ 733 | &mcp.TextContent{ 734 | Type: "text", 735 | Text: fmt.Sprintf("Failed to create subnet: %v", err), 736 | }, 737 | }, 738 | }, err 739 | } 740 | 741 | response := map[string]interface{}{ 742 | "subnetId": awsResource.ID, 743 | "name": name, 744 | "vpcId": vpcId, 745 | "cidrBlock": cidrBlock, 746 | "availabilityZone": availabilityZone, 747 | "state": awsResource.State, 748 | "resource": map[string]interface{}{ 749 | "id": awsResource.ID, 750 | "type": awsResource.Type, 751 | "name": name, 752 | "region": awsResource.Region, 753 | }, 754 | } 755 | 756 | return m.createSuccessResponse(fmt.Sprintf("Subnet '%s' created successfully", name), response) 757 | } 758 | 759 | func (m *MockMCPServer) mockSelectSubnetsForALB(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 760 | scheme, _ := arguments["scheme"].(string) 761 | vpcId, _ := arguments["vpcId"].(string) 762 | 763 | if vpcId == "" { 764 | vpcId = "vpc-default123" 765 | } 766 | 767 | subnetIds := []string{"subnet-12345", "subnet-67890"} 768 | 769 | response := map[string]interface{}{ 770 | "subnetIds": subnetIds, 771 | "vpcId": vpcId, 772 | "scheme": scheme, 773 | "count": len(subnetIds), 774 | } 775 | 776 | responseText, _ := json.Marshal(response) 777 | return &mcp.CallToolResult{ 778 | IsError: false, 779 | Content: []mcp.Content{ 780 | &mcp.TextContent{ 781 | Type: "text", 782 | Text: string(responseText), 783 | }, 784 | }, 785 | }, nil 786 | } 787 | 788 | // EC2 Mock Responses 789 | func (m *MockMCPServer) mockGetLatestAMI(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 790 | response := map[string]interface{}{ 791 | "value": "ami-latest123", 792 | "imageId": "ami-latest123", 793 | "name": "amzn2-ami-hvm-2.0.20231101.0-x86_64-gp2", 794 | "description": "Amazon Linux 2 AMI", 795 | "source": "aws_api_call", 796 | } 797 | 798 | return m.createSuccessResponse("Found latest AMI", response) 799 | } 800 | 801 | func (m *MockMCPServer) mockCreateEC2Instance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 802 | name, _ := arguments["name"].(string) 803 | imageId, _ := arguments["imageId"].(string) 804 | instanceType, _ := arguments["instanceType"].(string) 805 | 806 | if name == "" { 807 | name = "test-instance" 808 | } 809 | if imageId == "" { 810 | imageId = "ami-latest123" 811 | } 812 | if instanceType == "" { 813 | instanceType = "t3.medium" 814 | } 815 | 816 | instanceId := m.generateMockResourceId("i") 817 | 818 | response := map[string]interface{}{ 819 | "instanceId": instanceId, 820 | "name": name, 821 | "imageId": imageId, 822 | "instanceType": instanceType, 823 | "state": "running", 824 | "resource": map[string]interface{}{ 825 | "id": instanceId, 826 | "type": "ec2_instance", 827 | "name": name, 828 | }, 829 | } 830 | 831 | return m.createSuccessResponse(fmt.Sprintf("EC2 instance '%s' created successfully", name), response) 832 | } 833 | 834 | // mockCreateEC2InstanceWithAWSClient uses the MockAWSClient for EC2 instance creation 835 | func (m *MockMCPServer) mockCreateEC2InstanceWithAWSClient(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 836 | name, _ := arguments["name"].(string) 837 | imageId, _ := arguments["imageId"].(string) 838 | instanceType, _ := arguments["instanceType"].(string) 839 | keyName, _ := arguments["keyName"].(string) 840 | securityGroupId, _ := arguments["securityGroupId"].(string) 841 | subnetId, _ := arguments["subnetId"].(string) 842 | 843 | if name == "" { 844 | name = "test-instance" 845 | } 846 | if imageId == "" { 847 | imageId = "ami-12345678" // Valid mock AMI ID format 848 | } 849 | if instanceType == "" { 850 | instanceType = "t3.micro" 851 | } 852 | 853 | // Use the actual AWS mock client 854 | params := aws.CreateInstanceParams{ 855 | ImageID: imageId, 856 | InstanceType: instanceType, 857 | KeyName: keyName, 858 | SecurityGroupID: securityGroupId, 859 | SubnetID: subnetId, 860 | } 861 | 862 | ctx := context.Background() 863 | awsResource, err := m.awsClient.CreateEC2Instance(ctx, params) 864 | if err != nil { 865 | return &mcp.CallToolResult{ 866 | IsError: true, 867 | Content: []mcp.Content{ 868 | &mcp.TextContent{ 869 | Type: "text", 870 | Text: fmt.Sprintf("Failed to create EC2 instance: %v", err), 871 | }, 872 | }, 873 | }, err 874 | } 875 | 876 | response := map[string]interface{}{ 877 | "instanceId": awsResource.ID, 878 | "name": name, 879 | "imageId": imageId, 880 | "instanceType": instanceType, 881 | "state": awsResource.State, 882 | "resource": map[string]interface{}{ 883 | "id": awsResource.ID, 884 | "type": awsResource.Type, 885 | "name": name, 886 | "region": awsResource.Region, 887 | }, 888 | } 889 | 890 | return m.createSuccessResponse(fmt.Sprintf("EC2 instance '%s' created successfully", name), response) 891 | } 892 | 893 | // Load Balancer Mock Responses 894 | func (m *MockMCPServer) mockCreateLoadBalancer(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 895 | name, _ := arguments["name"].(string) 896 | scheme, _ := arguments["scheme"].(string) 897 | lbType, _ := arguments["type"].(string) 898 | 899 | if name == "" { 900 | name = "test-alb" 901 | } 902 | if scheme == "" { 903 | scheme = "internet-facing" 904 | } 905 | if lbType == "" { 906 | lbType = "application" 907 | } 908 | 909 | loadBalancerArn := fmt.Sprintf("arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/%s/%s", 910 | name, m.generateMockResourceId("")) 911 | 912 | response := map[string]interface{}{ 913 | "name": name, 914 | "scheme": scheme, 915 | "type": lbType, 916 | "loadBalancerId": loadBalancerArn, 917 | "loadBalancerArn": loadBalancerArn, 918 | "arn": loadBalancerArn, 919 | "resource": map[string]interface{}{ 920 | "id": loadBalancerArn, 921 | "type": "load_balancer", 922 | "name": name, 923 | }, 924 | } 925 | 926 | return m.createSuccessResponse(fmt.Sprintf("Load balancer '%s' created successfully", name), response) 927 | } 928 | 929 | func (m *MockMCPServer) mockCreateTargetGroup(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 930 | name, _ := arguments["name"].(string) 931 | vpcId, _ := arguments["vpcId"].(string) 932 | protocol, _ := arguments["protocol"].(string) 933 | port, _ := arguments["port"].(float64) 934 | 935 | if name == "" { 936 | name = "test-tg" 937 | } 938 | if vpcId == "" { 939 | vpcId = "vpc-default123" 940 | } 941 | if protocol == "" { 942 | protocol = "HTTP" 943 | } 944 | if port == 0 { 945 | port = 80 946 | } 947 | 948 | targetGroupArn := fmt.Sprintf("arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/%s/%s", 949 | name, m.generateMockResourceId("")) 950 | 951 | response := map[string]interface{}{ 952 | "name": name, 953 | "vpcId": vpcId, 954 | "protocol": protocol, 955 | "port": int(port), 956 | "targetGroupId": targetGroupArn, 957 | "targetGroupArn": targetGroupArn, 958 | "arn": targetGroupArn, 959 | "resource": map[string]interface{}{ 960 | "id": targetGroupArn, 961 | "type": "target_group", 962 | "name": name, 963 | }, 964 | } 965 | 966 | return m.createSuccessResponse(fmt.Sprintf("Target group '%s' created successfully", name), response) 967 | } 968 | 969 | // State Mock Responses 970 | func (m *MockMCPServer) mockExportInfrastructureState(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 971 | return m.stateManager.ExportState(arguments) 972 | } 973 | 974 | // Utility Mock Responses 975 | func (m *MockMCPServer) mockGetAvailabilityZones(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 976 | zones := []string{"ap-southeast-1a", "ap-southeast-1b", "ap-southeast-1c"} 977 | 978 | response := map[string]interface{}{ 979 | "zones": zones, 980 | "count": len(zones), 981 | "allZones": zones, 982 | "allCount": len(zones), 983 | "availabilityZone": zones[0], // First AZ for {{step-id.availabilityZone}} resolution 984 | "value": zones[0], // For {{step-id.resourceId}} resolution 985 | "zone_names": zones, // Alternative access pattern 986 | } 987 | 988 | return m.createSuccessResponse(fmt.Sprintf("Retrieved %d availability zones", len(zones)), response) 989 | } 990 | 991 | // Utility methods 992 | func (m *MockMCPServer) generateMockResourceId(prefix string) string { 993 | if prefix == "" { 994 | return fmt.Sprintf("%08d", len(m.resources)+1) 995 | } 996 | return fmt.Sprintf("%s-%08d", prefix, len(m.resources)+1) 997 | } 998 | 999 | func (m *MockMCPServer) createSuccessResponse(message string, data interface{}) (*mcp.CallToolResult, error) { 1000 | responseData, _ := json.Marshal(data) 1001 | 1002 | return &mcp.CallToolResult{ 1003 | IsError: false, 1004 | Content: []mcp.Content{ 1005 | &mcp.TextContent{ 1006 | Type: "text", 1007 | Text: string(responseData), 1008 | }, 1009 | }, 1010 | }, nil 1011 | } 1012 | 1013 | // Configuration methods 1014 | func (m *MockMCPServer) SimulateError(toolName string, err error) { 1015 | m.mutex.Lock() 1016 | defer m.mutex.Unlock() 1017 | m.simulateErrors[toolName] = err 1018 | } 1019 | 1020 | func (m *MockMCPServer) SetCustomResponse(toolName string, response *mcp.CallToolResult) { 1021 | m.mutex.Lock() 1022 | defer m.mutex.Unlock() 1023 | m.customResponses[toolName] = response 1024 | } 1025 | 1026 | func (m *MockMCPServer) ClearError(toolName string) { 1027 | m.mutex.Lock() 1028 | defer m.mutex.Unlock() 1029 | delete(m.simulateErrors, toolName) 1030 | } 1031 | 1032 | func (m *MockMCPServer) ClearAllErrors() { 1033 | m.mutex.Lock() 1034 | defer m.mutex.Unlock() 1035 | m.simulateErrors = make(map[string]error) 1036 | } 1037 | 1038 | // Additional mock methods for missing implementations 1039 | func (m *MockMCPServer) mockListSubnets(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1040 | subnets := []map[string]interface{}{ 1041 | { 1042 | "subnetId": "subnet-0def123abc456789", 1043 | "name": "default-subnet", 1044 | "vpcId": "vpc-default123", 1045 | "cidrBlock": "172.31.1.0/24", 1046 | "availabilityZone": "us-west-2a", 1047 | "state": "available", 1048 | }, 1049 | { 1050 | "subnetId": "subnet-12345", 1051 | "name": "public-subnet-1", 1052 | "vpcId": "vpc-prod123", 1053 | "cidrBlock": "10.0.1.0/24", 1054 | "availabilityZone": "us-west-2a", 1055 | "state": "available", 1056 | }, 1057 | } 1058 | 1059 | // Extract subnet IDs for dependency resolution 1060 | subnetIDs := []string{"subnet-0def123abc456789", "subnet-0abc12345678"} 1061 | 1062 | response := map[string]interface{}{ 1063 | "subnets": subnets, // Subnet details 1064 | "subnetId": subnetIDs[0], // First subnet for dependency resolution 1065 | "value": subnetIDs[0], // For {{step-id.resourceId}} resolution 1066 | "subnet_ids": subnetIDs, // Full list for comprehensive access 1067 | } 1068 | 1069 | return m.createSuccessResponse(fmt.Sprintf("Found %d subnets", len(subnets)), response) 1070 | } 1071 | 1072 | func (m *MockMCPServer) mockListEC2Instances(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1073 | instances := []map[string]interface{}{ 1074 | { 1075 | "instanceId": "i-sample123", 1076 | "name": "sample-instance", 1077 | "imageId": "ami-latest123", 1078 | "instanceType": "t3.medium", 1079 | "state": "running", 1080 | }, 1081 | } 1082 | 1083 | response := map[string]interface{}{ 1084 | "instances": instances, 1085 | "count": len(instances), 1086 | } 1087 | 1088 | return m.createSuccessResponse(fmt.Sprintf("Found %d instances", len(instances)), response) 1089 | } 1090 | 1091 | func (m *MockMCPServer) mockCreateSecurityGroup(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1092 | name, _ := arguments["name"].(string) 1093 | vpcId, _ := arguments["vpcId"].(string) 1094 | description, _ := arguments["description"].(string) 1095 | 1096 | if name == "" { 1097 | name = "test-sg" 1098 | } 1099 | if vpcId == "" { 1100 | vpcId = "vpc-default123" 1101 | } 1102 | if description == "" { 1103 | description = "Test security group" 1104 | } 1105 | 1106 | groupId := m.generateMockResourceId("sg") 1107 | 1108 | response := map[string]interface{}{ 1109 | "groupId": groupId, 1110 | "securityGroupId": groupId, 1111 | "name": name, 1112 | "vpcId": vpcId, 1113 | "description": description, 1114 | "resource": map[string]interface{}{ 1115 | "id": groupId, 1116 | "type": "security_group", 1117 | "name": name, 1118 | }, 1119 | } 1120 | 1121 | return m.createSuccessResponse(fmt.Sprintf("Security group '%s' created successfully", name), response) 1122 | } 1123 | 1124 | func (m *MockMCPServer) mockCreateListener(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1125 | loadBalancerArn, _ := arguments["loadBalancerArn"].(string) 1126 | targetGroupArn, _ := arguments["targetGroupArn"].(string) 1127 | protocol, _ := arguments["protocol"].(string) 1128 | port, _ := arguments["port"].(float64) 1129 | 1130 | if protocol == "" { 1131 | protocol = "HTTP" 1132 | } 1133 | if port == 0 { 1134 | port = 80 1135 | } 1136 | 1137 | // Validate ARN formats - be lenient for testing, allow mock IDs 1138 | if loadBalancerArn != "" && !strings.HasPrefix(loadBalancerArn, "arn:aws:elasticloadbalancing:") && !strings.HasPrefix(loadBalancerArn, "mock-") { 1139 | return &mcp.CallToolResult{ 1140 | IsError: true, 1141 | Content: []mcp.Content{ 1142 | &mcp.TextContent{ 1143 | Type: "text", 1144 | Text: fmt.Sprintf("loadBalancerArn must be in ARN format, received: '%s'", loadBalancerArn), 1145 | }, 1146 | }, 1147 | }, nil 1148 | } 1149 | 1150 | if targetGroupArn != "" && !strings.HasPrefix(targetGroupArn, "arn:aws:elasticloadbalancing:") && !strings.HasPrefix(targetGroupArn, "mock-") { 1151 | return &mcp.CallToolResult{ 1152 | IsError: true, 1153 | Content: []mcp.Content{ 1154 | &mcp.TextContent{ 1155 | Type: "text", 1156 | Text: fmt.Sprintf("targetGroupArn must be in ARN format, received: '%s'", targetGroupArn), 1157 | }, 1158 | }, 1159 | }, nil 1160 | } 1161 | 1162 | listenerId := m.generateMockResourceId("listener") 1163 | 1164 | response := map[string]interface{}{ 1165 | "loadBalancerArn": loadBalancerArn, 1166 | "targetGroupArn": targetGroupArn, 1167 | "protocol": protocol, 1168 | "port": int(port), 1169 | "listenerId": listenerId, 1170 | "resource": map[string]interface{}{ 1171 | "id": listenerId, 1172 | "type": "listener", 1173 | }, 1174 | } 1175 | 1176 | return m.createSuccessResponse("Listener created successfully", response) 1177 | } 1178 | 1179 | // ==== Missing EC2 Mock Methods ==== 1180 | 1181 | func (m *MockMCPServer) mockStartEC2Instance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1182 | instanceId, _ := arguments["instanceId"].(string) 1183 | 1184 | if instanceId == "" { 1185 | return &mcp.CallToolResult{ 1186 | IsError: true, 1187 | Content: []mcp.Content{ 1188 | &mcp.TextContent{ 1189 | Type: "text", 1190 | Text: "instanceId is required", 1191 | }, 1192 | }, 1193 | }, nil 1194 | } 1195 | 1196 | response := map[string]interface{}{ 1197 | "instanceId": instanceId, 1198 | "previousState": "stopped", 1199 | "currentState": "running", 1200 | "resource": map[string]interface{}{ 1201 | "id": instanceId, 1202 | "type": "ec2_instance", 1203 | }, 1204 | } 1205 | 1206 | return m.createSuccessResponse(fmt.Sprintf("Instance %s started successfully", instanceId), response) 1207 | } 1208 | 1209 | func (m *MockMCPServer) mockStopEC2Instance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1210 | instanceId, _ := arguments["instanceId"].(string) 1211 | 1212 | if instanceId == "" { 1213 | return &mcp.CallToolResult{ 1214 | IsError: true, 1215 | Content: []mcp.Content{ 1216 | &mcp.TextContent{ 1217 | Type: "text", 1218 | Text: "instanceId is required", 1219 | }, 1220 | }, 1221 | }, nil 1222 | } 1223 | 1224 | response := map[string]interface{}{ 1225 | "instanceId": instanceId, 1226 | "previousState": "running", 1227 | "currentState": "stopped", 1228 | "resource": map[string]interface{}{ 1229 | "id": instanceId, 1230 | "type": "ec2_instance", 1231 | }, 1232 | } 1233 | 1234 | return m.createSuccessResponse(fmt.Sprintf("Instance %s stopped successfully", instanceId), response) 1235 | } 1236 | 1237 | func (m *MockMCPServer) mockTerminateEC2Instance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1238 | instanceId, _ := arguments["instanceId"].(string) 1239 | 1240 | if instanceId == "" { 1241 | return &mcp.CallToolResult{ 1242 | IsError: true, 1243 | Content: []mcp.Content{ 1244 | &mcp.TextContent{ 1245 | Type: "text", 1246 | Text: "instanceId is required", 1247 | }, 1248 | }, 1249 | }, nil 1250 | } 1251 | 1252 | response := map[string]interface{}{ 1253 | "instanceId": instanceId, 1254 | "previousState": "running", 1255 | "currentState": "terminated", 1256 | "resource": map[string]interface{}{ 1257 | "id": instanceId, 1258 | "type": "ec2_instance", 1259 | }, 1260 | } 1261 | 1262 | return m.createSuccessResponse(fmt.Sprintf("Instance %s terminated successfully", instanceId), response) 1263 | } 1264 | 1265 | func (m *MockMCPServer) mockCreateAMIFromInstance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1266 | instanceId, _ := arguments["instanceId"].(string) 1267 | name, _ := arguments["name"].(string) 1268 | description, _ := arguments["description"].(string) 1269 | 1270 | if instanceId == "" { 1271 | return &mcp.CallToolResult{ 1272 | IsError: true, 1273 | Content: []mcp.Content{ 1274 | &mcp.TextContent{ 1275 | Type: "text", 1276 | Text: "instanceId is required", 1277 | }, 1278 | }, 1279 | }, nil 1280 | } 1281 | 1282 | if name == "" { 1283 | name = "custom-ami-" + m.generateMockResourceId("ami") 1284 | } 1285 | 1286 | amiId := m.generateMockResourceId("ami") 1287 | 1288 | response := map[string]interface{}{ 1289 | "imageId": amiId, 1290 | "name": name, 1291 | "description": description, 1292 | "sourceInstanceId": instanceId, 1293 | "state": "available", 1294 | "resource": map[string]interface{}{ 1295 | "id": amiId, 1296 | "type": "ami", 1297 | "name": name, 1298 | }, 1299 | } 1300 | 1301 | return m.createSuccessResponse(fmt.Sprintf("AMI %s created from instance %s", amiId, instanceId), response) 1302 | } 1303 | 1304 | func (m *MockMCPServer) mockListAMIs(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1305 | amis := []map[string]interface{}{ 1306 | { 1307 | "imageId": "ami-latest123", 1308 | "name": "amzn2-ami-hvm-2.0.20231101.0-x86_64-gp2", 1309 | "description": "Amazon Linux 2 AMI", 1310 | "state": "available", 1311 | "public": true, 1312 | }, 1313 | { 1314 | "imageId": "ami-0abc123def456789", 1315 | "name": "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20231020", 1316 | "description": "Canonical, Ubuntu, 22.04 LTS, amd64 jammy image", 1317 | "state": "available", 1318 | "public": true, 1319 | }, 1320 | } 1321 | 1322 | response := map[string]interface{}{ 1323 | "images": amis, 1324 | "count": len(amis), 1325 | } 1326 | 1327 | return m.createSuccessResponse(fmt.Sprintf("Found %d AMIs", len(amis)), response) 1328 | } 1329 | 1330 | func (m *MockMCPServer) mockGetLatestAmazonLinuxAMI(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1331 | response := map[string]interface{}{ 1332 | "amiId": "ami-latest123", 1333 | "imageId": "ami-latest123", 1334 | "name": "amzn2-ami-hvm-2.0.20231101.0-x86_64-gp2", 1335 | "description": "Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type", 1336 | "osType": "Linux", 1337 | "platform": "amazon-linux", 1338 | "architecture": "x86_64", 1339 | "state": "available", 1340 | "resource": map[string]interface{}{ 1341 | "id": "ami-latest123", 1342 | "type": "ami", 1343 | }, 1344 | } 1345 | 1346 | return m.createSuccessResponse("Found latest Amazon Linux 2 AMI: ami-latest123", response) 1347 | } 1348 | 1349 | func (m *MockMCPServer) mockGetLatestUbuntuAMI(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1350 | architecture, _ := arguments["architecture"].(string) 1351 | if architecture == "" { 1352 | architecture = "x86_64" 1353 | } 1354 | 1355 | response := map[string]interface{}{ 1356 | "amiId": "ami-0abc123def456789", 1357 | "imageId": "ami-0abc123def456789", 1358 | "name": "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20231020", 1359 | "description": "Canonical, Ubuntu, 22.04 LTS, amd64 jammy image build on 2023-10-20", 1360 | "osType": "Linux", 1361 | "platform": "ubuntu", 1362 | "architecture": architecture, 1363 | "state": "available", 1364 | "resource": map[string]interface{}{ 1365 | "id": "ami-0abc123def456789", 1366 | "type": "ami", 1367 | }, 1368 | } 1369 | 1370 | return m.createSuccessResponse("Found latest Ubuntu LTS AMI: ami-0abc123def456789", response) 1371 | } 1372 | 1373 | // ==== Missing Networking Mock Methods ==== 1374 | 1375 | func (m *MockMCPServer) mockCreatePrivateSubnet(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1376 | vpcId, _ := arguments["vpcId"].(string) 1377 | cidrBlock, _ := arguments["cidrBlock"].(string) 1378 | availabilityZone, _ := arguments["availabilityZone"].(string) 1379 | name, _ := arguments["name"].(string) 1380 | 1381 | if vpcId == "" || cidrBlock == "" { 1382 | return &mcp.CallToolResult{ 1383 | IsError: true, 1384 | Content: []mcp.Content{ 1385 | &mcp.TextContent{ 1386 | Type: "text", 1387 | Text: "vpcId and cidrBlock are required", 1388 | }, 1389 | }, 1390 | }, nil 1391 | } 1392 | 1393 | if name == "" { 1394 | name = "private-subnet" 1395 | } 1396 | if availabilityZone == "" { 1397 | availabilityZone = "us-west-2a" 1398 | } 1399 | 1400 | subnetId := m.generateMockResourceId("subnet") 1401 | 1402 | response := map[string]interface{}{ 1403 | "subnetId": subnetId, 1404 | "vpcId": vpcId, 1405 | "cidrBlock": cidrBlock, 1406 | "availabilityZone": availabilityZone, 1407 | "name": name, 1408 | "mapPublicIpOnLaunch": false, 1409 | "state": "available", 1410 | "subnetType": "private", 1411 | "resource": map[string]interface{}{ 1412 | "id": subnetId, 1413 | "type": "subnet", 1414 | "name": name, 1415 | }, 1416 | } 1417 | 1418 | return m.createSuccessResponse(fmt.Sprintf("Private subnet '%s' created successfully", name), response) 1419 | } 1420 | 1421 | func (m *MockMCPServer) mockCreatePublicSubnet(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1422 | vpcId, _ := arguments["vpcId"].(string) 1423 | cidrBlock, _ := arguments["cidrBlock"].(string) 1424 | availabilityZone, _ := arguments["availabilityZone"].(string) 1425 | name, _ := arguments["name"].(string) 1426 | 1427 | if vpcId == "" || cidrBlock == "" { 1428 | return &mcp.CallToolResult{ 1429 | IsError: true, 1430 | Content: []mcp.Content{ 1431 | &mcp.TextContent{ 1432 | Type: "text", 1433 | Text: "vpcId and cidrBlock are required", 1434 | }, 1435 | }, 1436 | }, nil 1437 | } 1438 | 1439 | if name == "" { 1440 | name = "public-subnet" 1441 | } 1442 | if availabilityZone == "" { 1443 | availabilityZone = "us-west-2a" 1444 | } 1445 | 1446 | subnetId := m.generateMockResourceId("subnet") 1447 | 1448 | response := map[string]interface{}{ 1449 | "subnetId": subnetId, 1450 | "vpcId": vpcId, 1451 | "cidrBlock": cidrBlock, 1452 | "availabilityZone": availabilityZone, 1453 | "name": name, 1454 | "mapPublicIpOnLaunch": true, 1455 | "state": "available", 1456 | "subnetType": "public", 1457 | "resource": map[string]interface{}{ 1458 | "id": subnetId, 1459 | "type": "subnet", 1460 | "name": name, 1461 | }, 1462 | } 1463 | 1464 | return m.createSuccessResponse(fmt.Sprintf("Public subnet '%s' created successfully", name), response) 1465 | } 1466 | 1467 | func (m *MockMCPServer) mockCreateInternetGateway(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1468 | name, _ := arguments["name"].(string) 1469 | vpcId, _ := arguments["vpcId"].(string) 1470 | 1471 | if name == "" { 1472 | name = "test-igw" 1473 | } 1474 | 1475 | igwId := m.generateMockResourceId("igw") 1476 | 1477 | response := map[string]interface{}{ 1478 | "internetGatewayId": igwId, 1479 | "name": name, 1480 | "state": "available", 1481 | "resource": map[string]interface{}{ 1482 | "id": igwId, 1483 | "type": "internet_gateway", 1484 | "name": name, 1485 | }, 1486 | } 1487 | 1488 | if vpcId != "" { 1489 | response["vpcId"] = vpcId 1490 | response["attachmentState"] = "attached" 1491 | } 1492 | 1493 | return m.createSuccessResponse(fmt.Sprintf("Internet gateway '%s' created successfully", name), response) 1494 | } 1495 | 1496 | func (m *MockMCPServer) mockCreateNATGateway(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1497 | subnetId, _ := arguments["subnetId"].(string) 1498 | name, _ := arguments["name"].(string) 1499 | 1500 | if subnetId == "" { 1501 | return &mcp.CallToolResult{ 1502 | IsError: true, 1503 | Content: []mcp.Content{ 1504 | &mcp.TextContent{ 1505 | Type: "text", 1506 | Text: "subnetId is required", 1507 | }, 1508 | }, 1509 | }, nil 1510 | } 1511 | 1512 | if name == "" { 1513 | name = "test-nat-gw" 1514 | } 1515 | 1516 | natGwId := m.generateMockResourceId("nat") 1517 | eipId := m.generateMockResourceId("eip") 1518 | 1519 | response := map[string]interface{}{ 1520 | "natGatewayId": natGwId, 1521 | "subnetId": subnetId, 1522 | "name": name, 1523 | "state": "available", 1524 | "publicIp": "1.2.3.4", 1525 | "allocationId": eipId, 1526 | "resource": map[string]interface{}{ 1527 | "id": natGwId, 1528 | "type": "nat_gateway", 1529 | "name": name, 1530 | }, 1531 | } 1532 | 1533 | return m.createSuccessResponse(fmt.Sprintf("NAT gateway '%s' created successfully", name), response) 1534 | } 1535 | 1536 | func (m *MockMCPServer) mockCreatePublicRouteTable(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1537 | vpcId, _ := arguments["vpcId"].(string) 1538 | name, _ := arguments["name"].(string) 1539 | 1540 | if vpcId == "" { 1541 | return &mcp.CallToolResult{ 1542 | IsError: true, 1543 | Content: []mcp.Content{ 1544 | &mcp.TextContent{ 1545 | Type: "text", 1546 | Text: "vpcId is required", 1547 | }, 1548 | }, 1549 | }, nil 1550 | } 1551 | 1552 | if name == "" { 1553 | name = "public-route-table" 1554 | } 1555 | 1556 | routeTableId := m.generateMockResourceId("rtb") 1557 | 1558 | response := map[string]interface{}{ 1559 | "routeTableId": routeTableId, 1560 | "vpcId": vpcId, 1561 | "name": name, 1562 | "routeType": "public", 1563 | "resource": map[string]interface{}{ 1564 | "id": routeTableId, 1565 | "type": "route_table", 1566 | "name": name, 1567 | }, 1568 | } 1569 | 1570 | return m.createSuccessResponse(fmt.Sprintf("Public route table '%s' created successfully", name), response) 1571 | } 1572 | 1573 | func (m *MockMCPServer) mockCreatePrivateRouteTable(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1574 | vpcId, _ := arguments["vpcId"].(string) 1575 | name, _ := arguments["name"].(string) 1576 | 1577 | if vpcId == "" { 1578 | return &mcp.CallToolResult{ 1579 | IsError: true, 1580 | Content: []mcp.Content{ 1581 | &mcp.TextContent{ 1582 | Type: "text", 1583 | Text: "vpcId is required", 1584 | }, 1585 | }, 1586 | }, nil 1587 | } 1588 | 1589 | if name == "" { 1590 | name = "private-route-table" 1591 | } 1592 | 1593 | routeTableId := m.generateMockResourceId("rtb") 1594 | 1595 | response := map[string]interface{}{ 1596 | "routeTableId": routeTableId, 1597 | "vpcId": vpcId, 1598 | "name": name, 1599 | "routeType": "private", 1600 | "resource": map[string]interface{}{ 1601 | "id": routeTableId, 1602 | "type": "route_table", 1603 | "name": name, 1604 | }, 1605 | } 1606 | 1607 | return m.createSuccessResponse(fmt.Sprintf("Private route table '%s' created successfully", name), response) 1608 | } 1609 | 1610 | func (m *MockMCPServer) mockAssociateRouteTable(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1611 | routeTableId, _ := arguments["routeTableId"].(string) 1612 | subnetId, _ := arguments["subnetId"].(string) 1613 | 1614 | if routeTableId == "" || subnetId == "" { 1615 | return &mcp.CallToolResult{ 1616 | IsError: true, 1617 | Content: []mcp.Content{ 1618 | &mcp.TextContent{ 1619 | Type: "text", 1620 | Text: "routeTableId and subnetId are required", 1621 | }, 1622 | }, 1623 | }, nil 1624 | } 1625 | 1626 | associationId := m.generateMockResourceId("rtbassoc") 1627 | 1628 | response := map[string]interface{}{ 1629 | "associationId": associationId, 1630 | "routeTableId": routeTableId, 1631 | "subnetId": subnetId, 1632 | "resource": map[string]interface{}{ 1633 | "id": associationId, 1634 | "type": "route_table_association", 1635 | }, 1636 | } 1637 | 1638 | return m.createSuccessResponse("Route table associated successfully", response) 1639 | } 1640 | 1641 | func (m *MockMCPServer) mockAddRoute(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1642 | routeTableId, _ := arguments["routeTableId"].(string) 1643 | destinationCidrBlock, _ := arguments["destinationCidrBlock"].(string) 1644 | gatewayId, _ := arguments["gatewayId"].(string) 1645 | natGatewayId, _ := arguments["natGatewayId"].(string) 1646 | 1647 | if routeTableId == "" || destinationCidrBlock == "" { 1648 | return &mcp.CallToolResult{ 1649 | IsError: true, 1650 | Content: []mcp.Content{ 1651 | &mcp.TextContent{ 1652 | Type: "text", 1653 | Text: "routeTableId and destinationCidrBlock are required", 1654 | }, 1655 | }, 1656 | }, nil 1657 | } 1658 | 1659 | if gatewayId == "" && natGatewayId == "" { 1660 | return &mcp.CallToolResult{ 1661 | IsError: true, 1662 | Content: []mcp.Content{ 1663 | &mcp.TextContent{ 1664 | Type: "text", 1665 | Text: "either gatewayId or natGatewayId must be specified", 1666 | }, 1667 | }, 1668 | }, nil 1669 | } 1670 | 1671 | response := map[string]interface{}{ 1672 | "routeTableId": routeTableId, 1673 | "destinationCidrBlock": destinationCidrBlock, 1674 | "state": "active", 1675 | } 1676 | 1677 | if gatewayId != "" { 1678 | response["gatewayId"] = gatewayId 1679 | response["targetType"] = "gateway" 1680 | } 1681 | if natGatewayId != "" { 1682 | response["natGatewayId"] = natGatewayId 1683 | response["targetType"] = "nat-gateway" 1684 | } 1685 | 1686 | return m.createSuccessResponse("Route added successfully", response) 1687 | } 1688 | 1689 | // ==== Missing Security Group Mock Methods ==== 1690 | 1691 | func (m *MockMCPServer) mockListSecurityGroups(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1692 | vpcId, _ := arguments["vpcId"].(string) 1693 | 1694 | securityGroups := []map[string]interface{}{ 1695 | { 1696 | "groupId": "sg-default123", 1697 | "groupName": "default", 1698 | "description": "default VPC security group", 1699 | "vpcId": "vpc-default123", 1700 | "inboundRules": []map[string]interface{}{ 1701 | { 1702 | "protocol": "-1", 1703 | "fromPort": -1, 1704 | "toPort": -1, 1705 | "source": "sg-default123", 1706 | }, 1707 | }, 1708 | "outboundRules": []map[string]interface{}{ 1709 | { 1710 | "protocol": "-1", 1711 | "fromPort": -1, 1712 | "toPort": -1, 1713 | "destination": "0.0.0.0/0", 1714 | }, 1715 | }, 1716 | }, 1717 | { 1718 | "groupId": "sg-web123", 1719 | "groupName": "web-tier", 1720 | "description": "Web tier security group", 1721 | "vpcId": "vpc-prod123", 1722 | "inboundRules": []map[string]interface{}{ 1723 | { 1724 | "protocol": "tcp", 1725 | "fromPort": 80, 1726 | "toPort": 80, 1727 | "source": "0.0.0.0/0", 1728 | }, 1729 | { 1730 | "protocol": "tcp", 1731 | "fromPort": 443, 1732 | "toPort": 443, 1733 | "source": "0.0.0.0/0", 1734 | }, 1735 | }, 1736 | }, 1737 | } 1738 | 1739 | // Filter by VPC if specified 1740 | if vpcId != "" { 1741 | filteredGroups := []map[string]interface{}{} 1742 | for _, sg := range securityGroups { 1743 | if sg["vpcId"].(string) == vpcId { 1744 | filteredGroups = append(filteredGroups, sg) 1745 | } 1746 | } 1747 | securityGroups = filteredGroups 1748 | } 1749 | 1750 | response := map[string]interface{}{ 1751 | "securityGroups": securityGroups, 1752 | "count": len(securityGroups), 1753 | } 1754 | 1755 | return m.createSuccessResponse(fmt.Sprintf("Found %d security groups", len(securityGroups)), response) 1756 | } 1757 | 1758 | func (m *MockMCPServer) mockAddSecurityGroupIngressRule(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1759 | groupId, _ := arguments["groupId"].(string) 1760 | protocol, _ := arguments["protocol"].(string) 1761 | fromPort, _ := arguments["fromPort"].(float64) 1762 | toPort, _ := arguments["toPort"].(float64) 1763 | cidrBlock, _ := arguments["cidrBlock"].(string) 1764 | sourceGroupId, _ := arguments["sourceGroupId"].(string) 1765 | 1766 | if groupId == "" { 1767 | return &mcp.CallToolResult{ 1768 | IsError: true, 1769 | Content: []mcp.Content{ 1770 | &mcp.TextContent{ 1771 | Type: "text", 1772 | Text: "groupId is required", 1773 | }, 1774 | }, 1775 | }, nil 1776 | } 1777 | 1778 | if protocol == "" { 1779 | protocol = "tcp" 1780 | } 1781 | 1782 | rule := map[string]interface{}{ 1783 | "protocol": protocol, 1784 | "fromPort": int(fromPort), 1785 | "toPort": int(toPort), 1786 | } 1787 | 1788 | if cidrBlock != "" { 1789 | rule["source"] = cidrBlock 1790 | } else if sourceGroupId != "" { 1791 | rule["source"] = sourceGroupId 1792 | } else { 1793 | rule["source"] = "0.0.0.0/0" 1794 | } 1795 | 1796 | response := map[string]interface{}{ 1797 | "groupId": groupId, 1798 | "direction": "ingress", 1799 | "rule": rule, 1800 | } 1801 | 1802 | return m.createSuccessResponse("Ingress rule added successfully", response) 1803 | } 1804 | 1805 | func (m *MockMCPServer) mockAddSecurityGroupEgressRule(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1806 | groupId, _ := arguments["groupId"].(string) 1807 | protocol, _ := arguments["protocol"].(string) 1808 | fromPort, _ := arguments["fromPort"].(float64) 1809 | toPort, _ := arguments["toPort"].(float64) 1810 | cidrBlock, _ := arguments["cidrBlock"].(string) 1811 | destinationGroupId, _ := arguments["destinationGroupId"].(string) 1812 | 1813 | if groupId == "" { 1814 | return &mcp.CallToolResult{ 1815 | IsError: true, 1816 | Content: []mcp.Content{ 1817 | &mcp.TextContent{ 1818 | Type: "text", 1819 | Text: "groupId is required", 1820 | }, 1821 | }, 1822 | }, nil 1823 | } 1824 | 1825 | if protocol == "" { 1826 | protocol = "tcp" 1827 | } 1828 | 1829 | rule := map[string]interface{}{ 1830 | "protocol": protocol, 1831 | "fromPort": int(fromPort), 1832 | "toPort": int(toPort), 1833 | } 1834 | 1835 | if cidrBlock != "" { 1836 | rule["destination"] = cidrBlock 1837 | } else if destinationGroupId != "" { 1838 | rule["destination"] = destinationGroupId 1839 | } else { 1840 | rule["destination"] = "0.0.0.0/0" 1841 | } 1842 | 1843 | response := map[string]interface{}{ 1844 | "groupId": groupId, 1845 | "direction": "egress", 1846 | "rule": rule, 1847 | } 1848 | 1849 | return m.createSuccessResponse("Egress rule added successfully", response) 1850 | } 1851 | 1852 | func (m *MockMCPServer) mockDeleteSecurityGroup(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1853 | groupId, _ := arguments["groupId"].(string) 1854 | 1855 | if groupId == "" { 1856 | return &mcp.CallToolResult{ 1857 | IsError: true, 1858 | Content: []mcp.Content{ 1859 | &mcp.TextContent{ 1860 | Type: "text", 1861 | Text: "groupId is required", 1862 | }, 1863 | }, 1864 | }, nil 1865 | } 1866 | 1867 | // Simulate validation - cannot delete default group 1868 | if strings.Contains(groupId, "default") { 1869 | return &mcp.CallToolResult{ 1870 | IsError: true, 1871 | Content: []mcp.Content{ 1872 | &mcp.TextContent{ 1873 | Type: "text", 1874 | Text: "Cannot delete default security group", 1875 | }, 1876 | }, 1877 | }, nil 1878 | } 1879 | 1880 | response := map[string]interface{}{ 1881 | "groupId": groupId, 1882 | "status": "deleted", 1883 | } 1884 | 1885 | return m.createSuccessResponse(fmt.Sprintf("Security group %s deleted successfully", groupId), response) 1886 | } 1887 | 1888 | // ==== Missing Auto Scaling Mock Methods ==== 1889 | 1890 | func (m *MockMCPServer) mockCreateLaunchTemplate(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1891 | name, _ := arguments["name"].(string) 1892 | imageId, _ := arguments["imageId"].(string) 1893 | instanceType, _ := arguments["instanceType"].(string) 1894 | securityGroupIds, _ := arguments["securityGroupIds"].([]interface{}) 1895 | 1896 | if name == "" { 1897 | name = "test-launch-template" 1898 | } 1899 | if imageId == "" { 1900 | imageId = "ami-latest123" 1901 | } 1902 | if instanceType == "" { 1903 | instanceType = "t3.micro" 1904 | } 1905 | 1906 | templateId := m.generateMockResourceId("lt") 1907 | 1908 | // Convert securityGroupIds to string slice 1909 | var sgIds []string 1910 | for _, sgId := range securityGroupIds { 1911 | if id, ok := sgId.(string); ok { 1912 | sgIds = append(sgIds, id) 1913 | } 1914 | } 1915 | 1916 | response := map[string]interface{}{ 1917 | "launchTemplateId": templateId, 1918 | "name": name, 1919 | "imageId": imageId, 1920 | "instanceType": instanceType, 1921 | "securityGroupIds": sgIds, 1922 | "latestVersionNumber": 1, 1923 | "resource": map[string]interface{}{ 1924 | "id": templateId, 1925 | "type": "launch_template", 1926 | "name": name, 1927 | }, 1928 | } 1929 | 1930 | return m.createSuccessResponse(fmt.Sprintf("Launch template '%s' created successfully", name), response) 1931 | } 1932 | 1933 | func (m *MockMCPServer) mockCreateAutoScalingGroup(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1934 | name, _ := arguments["name"].(string) 1935 | launchTemplateId, _ := arguments["launchTemplateId"].(string) 1936 | subnetIds, _ := arguments["subnetIds"].([]interface{}) 1937 | minSize, _ := arguments["minSize"].(float64) 1938 | maxSize, _ := arguments["maxSize"].(float64) 1939 | desiredCapacity, _ := arguments["desiredCapacity"].(float64) 1940 | 1941 | if name == "" { 1942 | name = "test-asg" 1943 | } 1944 | // Be lenient for testing - generate a mock template ID if not provided 1945 | if launchTemplateId == "" { 1946 | launchTemplateId = m.generateMockResourceId("launch-template") 1947 | } 1948 | 1949 | asgArn := fmt.Sprintf("arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:%s:autoScalingGroupName/%s", 1950 | m.generateMockResourceId("asg"), name) 1951 | 1952 | // Convert subnetIds to string slice 1953 | var subnets []string 1954 | for _, subnetId := range subnetIds { 1955 | if id, ok := subnetId.(string); ok { 1956 | subnets = append(subnets, id) 1957 | } 1958 | } 1959 | 1960 | response := map[string]interface{}{ 1961 | "autoScalingGroupName": name, 1962 | "autoScalingGroupArn": asgArn, 1963 | "launchTemplateId": launchTemplateId, 1964 | "subnetIds": subnets, 1965 | "minSize": int(minSize), 1966 | "maxSize": int(maxSize), 1967 | "desiredCapacity": int(desiredCapacity), 1968 | "resource": map[string]interface{}{ 1969 | "id": asgArn, 1970 | "type": "auto_scaling_group", 1971 | "name": name, 1972 | }, 1973 | } 1974 | 1975 | return m.createSuccessResponse(fmt.Sprintf("Auto scaling group '%s' created successfully", name), response) 1976 | } 1977 | 1978 | func (m *MockMCPServer) mockListAutoScalingGroups(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 1979 | groups := []map[string]interface{}{ 1980 | { 1981 | "autoScalingGroupName": "web-tier-asg", 1982 | "autoScalingGroupArn": "arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:uuid:autoScalingGroupName/web-tier-asg", 1983 | "launchTemplateId": "lt-sample123", 1984 | "minSize": 1, 1985 | "maxSize": 3, 1986 | "desiredCapacity": 2, 1987 | "availabilityZones": []string{"us-west-2a", "us-west-2b"}, 1988 | }, 1989 | } 1990 | 1991 | response := map[string]interface{}{ 1992 | "autoScalingGroups": groups, 1993 | "count": len(groups), 1994 | } 1995 | 1996 | return m.createSuccessResponse(fmt.Sprintf("Found %d auto scaling groups", len(groups)), response) 1997 | } 1998 | 1999 | func (m *MockMCPServer) mockListLaunchTemplates(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2000 | templates := []map[string]interface{}{ 2001 | { 2002 | "launchTemplateId": "lt-sample123", 2003 | "name": "web-server-template", 2004 | "latestVersionNumber": 1, 2005 | "defaultVersionNumber": 1, 2006 | "imageId": "ami-latest123", 2007 | "instanceType": "t3.medium", 2008 | }, 2009 | } 2010 | 2011 | response := map[string]interface{}{ 2012 | "launchTemplates": templates, 2013 | "count": len(templates), 2014 | } 2015 | 2016 | return m.createSuccessResponse(fmt.Sprintf("Found %d launch templates", len(templates)), response) 2017 | } 2018 | 2019 | // ==== Missing Load Balancer Mock Methods ==== 2020 | 2021 | func (m *MockMCPServer) mockListLoadBalancers(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2022 | loadBalancers := []map[string]interface{}{ 2023 | { 2024 | "loadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/test-alb/1234567890123456", 2025 | "loadBalancerName": "test-alb", 2026 | "scheme": "internet-facing", 2027 | "vpcId": "vpc-prod123", 2028 | "type": "application", 2029 | "state": "active", 2030 | "dnsName": "test-alb-123456789.us-west-2.elb.amazonaws.com", 2031 | }, 2032 | } 2033 | 2034 | response := map[string]interface{}{ 2035 | "loadBalancers": loadBalancers, 2036 | "count": len(loadBalancers), 2037 | } 2038 | 2039 | return m.createSuccessResponse(fmt.Sprintf("Found %d load balancers", len(loadBalancers)), response) 2040 | } 2041 | 2042 | func (m *MockMCPServer) mockListTargetGroups(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2043 | targetGroups := []map[string]interface{}{ 2044 | { 2045 | "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/web-servers/1234567890123456", 2046 | "targetGroupName": "web-servers", 2047 | "protocol": "HTTP", 2048 | "port": 80, 2049 | "vpcId": "vpc-prod123", 2050 | "targetType": "instance", 2051 | "healthCheckPath": "/health", 2052 | }, 2053 | } 2054 | 2055 | response := map[string]interface{}{ 2056 | "targetGroups": targetGroups, 2057 | "count": len(targetGroups), 2058 | } 2059 | 2060 | return m.createSuccessResponse(fmt.Sprintf("Found %d target groups", len(targetGroups)), response) 2061 | } 2062 | 2063 | func (m *MockMCPServer) mockRegisterTargets(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2064 | targetGroupArn, _ := arguments["targetGroupArn"].(string) 2065 | targets, _ := arguments["targets"].([]interface{}) 2066 | 2067 | if targetGroupArn == "" { 2068 | return &mcp.CallToolResult{ 2069 | IsError: true, 2070 | Content: []mcp.Content{ 2071 | &mcp.TextContent{ 2072 | Type: "text", 2073 | Text: "targetGroupArn is required", 2074 | }, 2075 | }, 2076 | }, nil 2077 | } 2078 | 2079 | var targetList []string 2080 | for _, target := range targets { 2081 | if targetStr, ok := target.(string); ok { 2082 | targetList = append(targetList, targetStr) 2083 | } 2084 | } 2085 | 2086 | response := map[string]interface{}{ 2087 | "targetGroupArn": targetGroupArn, 2088 | "targets": targetList, 2089 | "status": "registered", 2090 | } 2091 | 2092 | return m.createSuccessResponse(fmt.Sprintf("Registered %d targets", len(targetList)), response) 2093 | } 2094 | 2095 | func (m *MockMCPServer) mockDeregisterTargets(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2096 | targetGroupArn, _ := arguments["targetGroupArn"].(string) 2097 | targets, _ := arguments["targets"].([]interface{}) 2098 | 2099 | if targetGroupArn == "" { 2100 | return &mcp.CallToolResult{ 2101 | IsError: true, 2102 | Content: []mcp.Content{ 2103 | &mcp.TextContent{ 2104 | Type: "text", 2105 | Text: "targetGroupArn is required", 2106 | }, 2107 | }, 2108 | }, nil 2109 | } 2110 | 2111 | var targetList []string 2112 | for _, target := range targets { 2113 | if targetStr, ok := target.(string); ok { 2114 | targetList = append(targetList, targetStr) 2115 | } 2116 | } 2117 | 2118 | response := map[string]interface{}{ 2119 | "targetGroupArn": targetGroupArn, 2120 | "targets": targetList, 2121 | "status": "deregistered", 2122 | } 2123 | 2124 | return m.createSuccessResponse(fmt.Sprintf("Deregistered %d targets", len(targetList)), response) 2125 | } 2126 | 2127 | // ==== Missing RDS Mock Methods ==== 2128 | 2129 | func (m *MockMCPServer) mockCreateDBSubnetGroup(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2130 | name, _ := arguments["name"].(string) 2131 | description, _ := arguments["description"].(string) 2132 | subnetIds, _ := arguments["subnetIds"].([]interface{}) 2133 | 2134 | if name == "" { 2135 | name = "test-db-subnet-group" 2136 | } 2137 | if description == "" { 2138 | description = "Test database subnet group" 2139 | } 2140 | 2141 | // Convert subnetIds to string slice 2142 | var subnets []string 2143 | for _, subnetId := range subnetIds { 2144 | if id, ok := subnetId.(string); ok { 2145 | subnets = append(subnets, id) 2146 | } 2147 | } 2148 | 2149 | if len(subnets) == 0 { 2150 | return &mcp.CallToolResult{ 2151 | IsError: true, 2152 | Content: []mcp.Content{ 2153 | &mcp.TextContent{ 2154 | Type: "text", 2155 | Text: "At least one subnet ID is required", 2156 | }, 2157 | }, 2158 | }, nil 2159 | } 2160 | 2161 | response := map[string]interface{}{ 2162 | "dbSubnetGroupName": name, 2163 | "description": description, 2164 | "subnetIds": subnets, 2165 | "vpcId": "vpc-prod123", 2166 | "dbSubnetGroupStatus": "Complete", 2167 | "resource": map[string]interface{}{ 2168 | "id": name, 2169 | "type": "db_subnet_group", 2170 | "name": name, 2171 | }, 2172 | } 2173 | 2174 | return m.createSuccessResponse(fmt.Sprintf("DB subnet group '%s' created successfully", name), response) 2175 | } 2176 | 2177 | func (m *MockMCPServer) mockCreateDBInstance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2178 | dbInstanceIdentifier, _ := arguments["dbInstanceIdentifier"].(string) 2179 | dbInstanceClass, _ := arguments["dbInstanceClass"].(string) 2180 | engine, _ := arguments["engine"].(string) 2181 | masterUsername, _ := arguments["masterUsername"].(string) 2182 | dbSubnetGroupName, _ := arguments["dbSubnetGroupName"].(string) 2183 | allocatedStorage, _ := arguments["allocatedStorage"].(float64) 2184 | 2185 | if dbInstanceIdentifier == "" { 2186 | dbInstanceIdentifier = "test-db-instance" 2187 | } 2188 | if dbInstanceClass == "" { 2189 | dbInstanceClass = "db.t3.micro" 2190 | } 2191 | if engine == "" { 2192 | engine = "mysql" 2193 | } 2194 | if masterUsername == "" { 2195 | masterUsername = "admin" 2196 | } 2197 | if allocatedStorage == 0 { 2198 | allocatedStorage = 20 2199 | } 2200 | 2201 | endpoint := fmt.Sprintf("%s.cluster-xyz.us-west-2.rds.amazonaws.com", dbInstanceIdentifier) 2202 | dbArn := fmt.Sprintf("arn:aws:rds:us-west-2:123456789012:db:%s", dbInstanceIdentifier) 2203 | 2204 | response := map[string]interface{}{ 2205 | "dbInstanceIdentifier": dbInstanceIdentifier, 2206 | "dbInstanceClass": dbInstanceClass, 2207 | "engine": engine, 2208 | "dbInstanceStatus": "available", 2209 | "masterUsername": masterUsername, 2210 | "allocatedStorage": int(allocatedStorage), 2211 | "dbSubnetGroupName": dbSubnetGroupName, 2212 | "endpoint": endpoint, 2213 | "port": 3306, 2214 | "dbInstanceArn": dbArn, 2215 | "resource": map[string]interface{}{ 2216 | "id": dbInstanceIdentifier, 2217 | "type": "db_instance", 2218 | "name": dbInstanceIdentifier, 2219 | }, 2220 | } 2221 | 2222 | return m.createSuccessResponse(fmt.Sprintf("DB instance '%s' created successfully", dbInstanceIdentifier), response) 2223 | } 2224 | 2225 | func (m *MockMCPServer) mockStartDBInstance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2226 | dbInstanceIdentifier, _ := arguments["dbInstanceIdentifier"].(string) 2227 | 2228 | if dbInstanceIdentifier == "" { 2229 | return &mcp.CallToolResult{ 2230 | IsError: true, 2231 | Content: []mcp.Content{ 2232 | &mcp.TextContent{ 2233 | Type: "text", 2234 | Text: "dbInstanceIdentifier is required", 2235 | }, 2236 | }, 2237 | }, nil 2238 | } 2239 | 2240 | response := map[string]interface{}{ 2241 | "dbInstanceIdentifier": dbInstanceIdentifier, 2242 | "previousStatus": "stopped", 2243 | "currentStatus": "starting", 2244 | "resource": map[string]interface{}{ 2245 | "id": dbInstanceIdentifier, 2246 | "type": "db_instance", 2247 | }, 2248 | } 2249 | 2250 | return m.createSuccessResponse(fmt.Sprintf("DB instance '%s' started successfully", dbInstanceIdentifier), response) 2251 | } 2252 | 2253 | func (m *MockMCPServer) mockStopDBInstance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2254 | dbInstanceIdentifier, _ := arguments["dbInstanceIdentifier"].(string) 2255 | 2256 | if dbInstanceIdentifier == "" { 2257 | return &mcp.CallToolResult{ 2258 | IsError: true, 2259 | Content: []mcp.Content{ 2260 | &mcp.TextContent{ 2261 | Type: "text", 2262 | Text: "dbInstanceIdentifier is required", 2263 | }, 2264 | }, 2265 | }, nil 2266 | } 2267 | 2268 | response := map[string]interface{}{ 2269 | "dbInstanceIdentifier": dbInstanceIdentifier, 2270 | "previousStatus": "available", 2271 | "currentStatus": "stopping", 2272 | "resource": map[string]interface{}{ 2273 | "id": dbInstanceIdentifier, 2274 | "type": "db_instance", 2275 | }, 2276 | } 2277 | 2278 | return m.createSuccessResponse(fmt.Sprintf("DB instance '%s' stopped successfully", dbInstanceIdentifier), response) 2279 | } 2280 | 2281 | func (m *MockMCPServer) mockDeleteDBInstance(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2282 | dbInstanceIdentifier, _ := arguments["dbInstanceIdentifier"].(string) 2283 | skipFinalSnapshot, _ := arguments["skipFinalSnapshot"].(bool) 2284 | 2285 | if dbInstanceIdentifier == "" { 2286 | return &mcp.CallToolResult{ 2287 | IsError: true, 2288 | Content: []mcp.Content{ 2289 | &mcp.TextContent{ 2290 | Type: "text", 2291 | Text: "dbInstanceIdentifier is required", 2292 | }, 2293 | }, 2294 | }, nil 2295 | } 2296 | 2297 | response := map[string]interface{}{ 2298 | "dbInstanceIdentifier": dbInstanceIdentifier, 2299 | "currentStatus": "deleting", 2300 | "skipFinalSnapshot": skipFinalSnapshot, 2301 | "resource": map[string]interface{}{ 2302 | "id": dbInstanceIdentifier, 2303 | "type": "db_instance", 2304 | }, 2305 | } 2306 | 2307 | return m.createSuccessResponse(fmt.Sprintf("DB instance '%s' deletion initiated", dbInstanceIdentifier), response) 2308 | } 2309 | 2310 | func (m *MockMCPServer) mockCreateDBSnapshot(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2311 | dbSnapshotIdentifier, _ := arguments["dbSnapshotIdentifier"].(string) 2312 | dbInstanceIdentifier, _ := arguments["dbInstanceIdentifier"].(string) 2313 | 2314 | if dbSnapshotIdentifier == "" || dbInstanceIdentifier == "" { 2315 | return &mcp.CallToolResult{ 2316 | IsError: true, 2317 | Content: []mcp.Content{ 2318 | &mcp.TextContent{ 2319 | Type: "text", 2320 | Text: "Both dbSnapshotIdentifier and dbInstanceIdentifier are required", 2321 | }, 2322 | }, 2323 | }, nil 2324 | } 2325 | 2326 | snapshotArn := fmt.Sprintf("arn:aws:rds:us-west-2:123456789012:snapshot:%s", dbSnapshotIdentifier) 2327 | 2328 | response := map[string]interface{}{ 2329 | "dbSnapshotIdentifier": dbSnapshotIdentifier, 2330 | "dbInstanceIdentifier": dbInstanceIdentifier, 2331 | "status": "creating", 2332 | "snapshotType": "manual", 2333 | "dbSnapshotArn": snapshotArn, 2334 | "resource": map[string]interface{}{ 2335 | "id": dbSnapshotIdentifier, 2336 | "type": "db_snapshot", 2337 | "name": dbSnapshotIdentifier, 2338 | }, 2339 | } 2340 | 2341 | return m.createSuccessResponse(fmt.Sprintf("DB snapshot '%s' creation initiated", dbSnapshotIdentifier), response) 2342 | } 2343 | 2344 | func (m *MockMCPServer) mockListDBInstances(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2345 | instances := []map[string]interface{}{ 2346 | { 2347 | "dbInstanceIdentifier": "production-mysql", 2348 | "dbInstanceClass": "db.t3.medium", 2349 | "engine": "mysql", 2350 | "dbInstanceStatus": "available", 2351 | "allocatedStorage": 100, 2352 | "endpoint": "production-mysql.cluster-xyz.us-west-2.rds.amazonaws.com", 2353 | "port": 3306, 2354 | }, 2355 | { 2356 | "dbInstanceIdentifier": "test-postgres", 2357 | "dbInstanceClass": "db.t3.micro", 2358 | "engine": "postgres", 2359 | "dbInstanceStatus": "available", 2360 | "allocatedStorage": 20, 2361 | "endpoint": "test-postgres.cluster-abc.us-west-2.rds.amazonaws.com", 2362 | "port": 5432, 2363 | }, 2364 | } 2365 | 2366 | response := map[string]interface{}{ 2367 | "dbInstances": instances, 2368 | "count": len(instances), 2369 | } 2370 | 2371 | return m.createSuccessResponse(fmt.Sprintf("Found %d DB instances", len(instances)), response) 2372 | } 2373 | 2374 | func (m *MockMCPServer) mockListDBSnapshots(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2375 | snapshots := []map[string]interface{}{ 2376 | { 2377 | "dbSnapshotIdentifier": "production-mysql-snapshot-2023-10-01", 2378 | "dbInstanceIdentifier": "production-mysql", 2379 | "status": "available", 2380 | "snapshotType": "manual", 2381 | "allocatedStorage": 100, 2382 | }, 2383 | } 2384 | 2385 | response := map[string]interface{}{ 2386 | "dbSnapshots": snapshots, 2387 | "count": len(snapshots), 2388 | } 2389 | 2390 | return m.createSuccessResponse(fmt.Sprintf("Found %d DB snapshots", len(snapshots)), response) 2391 | } 2392 | 2393 | // ==== Missing State Management Mock Methods ==== 2394 | 2395 | func (m *MockMCPServer) mockAnalyzeInfrastructureState(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2396 | includeMetrics, _ := arguments["includeMetrics"].(bool) 2397 | 2398 | analysis := map[string]interface{}{ 2399 | "totalResources": 15, 2400 | "resourcesByType": map[string]int{ 2401 | "vpc": 2, 2402 | "subnet": 4, 2403 | "ec2_instance": 3, 2404 | "security_group": 3, 2405 | "load_balancer": 1, 2406 | "target_group": 1, 2407 | "db_instance": 1, 2408 | }, 2409 | "healthStatus": "healthy", 2410 | "warnings": []string{ 2411 | "Security group sg-web123 has overly permissive ingress rules", 2412 | }, 2413 | "recommendations": []string{ 2414 | "Consider enabling VPC Flow Logs for better network monitoring", 2415 | "Review security group rules for least privilege access", 2416 | }, 2417 | } 2418 | 2419 | if includeMetrics { 2420 | analysis["metrics"] = map[string]interface{}{ 2421 | "averageResourceAge": "30 days", 2422 | "resourceUtilization": "75%", 2423 | "complianceScore": 85, 2424 | } 2425 | } 2426 | 2427 | response := map[string]interface{}{ 2428 | "analysis": analysis, 2429 | } 2430 | 2431 | return m.createSuccessResponse("Infrastructure state analyzed successfully", response) 2432 | } 2433 | 2434 | func (m *MockMCPServer) mockVisualizeDependencyGraph(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2435 | format, _ := arguments["format"].(string) 2436 | if format == "" { 2437 | format = "mermaid" 2438 | } 2439 | 2440 | var visualization string 2441 | if format == "mermaid" { 2442 | visualization = `graph TD 2443 | VPC[vpc-prod123] --> Subnet1[subnet-web-1] 2444 | VPC --> Subnet2[subnet-web-2] 2445 | Subnet1 --> ALB[test-alb] 2446 | Subnet2 --> ALB 2447 | ALB --> TG[web-servers] 2448 | TG --> EC2_1[i-web-1] 2449 | TG --> EC2_2[i-web-2] 2450 | VPC --> SG[sg-web123] 2451 | SG --> EC2_1 2452 | SG --> EC2_2` 2453 | } else { 2454 | visualization = "Dependency graph visualization not available for format: " + format 2455 | } 2456 | 2457 | response := map[string]interface{}{ 2458 | "format": format, 2459 | "visualization": visualization, 2460 | "nodeCount": 8, 2461 | "edgeCount": 10, 2462 | } 2463 | 2464 | return m.createSuccessResponse("Dependency graph generated successfully", response) 2465 | } 2466 | 2467 | func (m *MockMCPServer) mockDetectInfrastructureConflicts(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2468 | conflicts := []map[string]interface{}{ 2469 | { 2470 | "type": "security_group_overlap", 2471 | "severity": "medium", 2472 | "resources": []string{"sg-web123", "sg-app123"}, 2473 | "description": "Security groups have overlapping port ranges that may cause confusion", 2474 | "recommendation": "Review and consolidate security group rules", 2475 | }, 2476 | { 2477 | "type": "subnet_cidr_conflict", 2478 | "severity": "low", 2479 | "resources": []string{"subnet-web-1", "subnet-db-1"}, 2480 | "description": "Subnets are in different availability zones but have similar naming", 2481 | "recommendation": "Use consistent naming convention for subnets", 2482 | }, 2483 | } 2484 | 2485 | response := map[string]interface{}{ 2486 | "conflicts": conflicts, 2487 | "conflictCount": len(conflicts), 2488 | "severityCounts": map[string]int{ 2489 | "high": 0, 2490 | "medium": 1, 2491 | "low": 1, 2492 | }, 2493 | } 2494 | 2495 | return m.createSuccessResponse(fmt.Sprintf("Found %d infrastructure conflicts", len(conflicts)), response) 2496 | } 2497 | 2498 | func (m *MockMCPServer) mockPlanInfrastructureDeployment(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2499 | dryRun, _ := arguments["dryRun"].(bool) 2500 | 2501 | plan := map[string]interface{}{ 2502 | "totalSteps": 8, 2503 | "estimatedDuration": "15 minutes", 2504 | "steps": []map[string]interface{}{ 2505 | { 2506 | "step": 1, 2507 | "action": "create", 2508 | "resourceType": "vpc", 2509 | "resourceName": "production-vpc", 2510 | "dependencies": []string{}, 2511 | }, 2512 | { 2513 | "step": 2, 2514 | "action": "create", 2515 | "resourceType": "subnet", 2516 | "resourceName": "web-subnet-1", 2517 | "dependencies": []string{"production-vpc"}, 2518 | }, 2519 | { 2520 | "step": 3, 2521 | "action": "create", 2522 | "resourceType": "subnet", 2523 | "resourceName": "web-subnet-2", 2524 | "dependencies": []string{"production-vpc"}, 2525 | }, 2526 | { 2527 | "step": 4, 2528 | "action": "create", 2529 | "resourceType": "security_group", 2530 | "resourceName": "web-sg", 2531 | "dependencies": []string{"production-vpc"}, 2532 | }, 2533 | { 2534 | "step": 5, 2535 | "action": "create", 2536 | "resourceType": "load_balancer", 2537 | "resourceName": "web-alb", 2538 | "dependencies": []string{"web-subnet-1", "web-subnet-2", "web-sg"}, 2539 | }, 2540 | }, 2541 | "warnings": []string{ 2542 | "This deployment will create resources that incur AWS charges", 2543 | }, 2544 | } 2545 | 2546 | if dryRun { 2547 | plan["mode"] = "dry-run" 2548 | plan["status"] = "planned" 2549 | } else { 2550 | plan["mode"] = "execute" 2551 | plan["status"] = "ready" 2552 | } 2553 | 2554 | response := map[string]interface{}{ 2555 | "deploymentPlan": plan, 2556 | } 2557 | 2558 | return m.createSuccessResponse("Deployment plan generated successfully", response) 2559 | } 2560 | 2561 | func (m *MockMCPServer) mockAddResourceToState(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2562 | resourceId, _ := arguments["resource_id"].(string) 2563 | resourceType, _ := arguments["resource_type"].(string) 2564 | resourceData, _ := arguments["properties"].(map[string]interface{}) 2565 | 2566 | if resourceId == "" || resourceType == "" { 2567 | return &mcp.CallToolResult{ 2568 | IsError: true, 2569 | Content: []mcp.Content{ 2570 | &mcp.TextContent{ 2571 | Type: "text", 2572 | Text: "resourceId and resourceType are required", 2573 | }, 2574 | }, 2575 | }, nil 2576 | } 2577 | 2578 | // Add to mock state manager 2579 | resource := &types.AWSResource{ 2580 | ID: resourceId, 2581 | Type: resourceType, 2582 | Details: resourceData, 2583 | } 2584 | 2585 | m.resources[resourceId] = resource 2586 | 2587 | response := map[string]interface{}{ 2588 | "resourceId": resourceId, 2589 | "resourceType": resourceType, 2590 | "status": "added_to_state", 2591 | "resource": resource, 2592 | } 2593 | 2594 | return m.createSuccessResponse(fmt.Sprintf("Resource %s added to state successfully", resourceId), response) 2595 | } 2596 | 2597 | func (m *MockMCPServer) mockSaveState(arguments map[string]interface{}) (*mcp.CallToolResult, error) { 2598 | filePath, _ := arguments["filePath"].(string) 2599 | if filePath == "" { 2600 | filePath = "infrastructure-state-test.json" 2601 | } 2602 | 2603 | resourceCount := len(m.resources) 2604 | 2605 | response := map[string]interface{}{ 2606 | "filePath": filePath, 2607 | "resourceCount": resourceCount, 2608 | "timestamp": "2023-10-20T10:30:00Z", 2609 | "status": "saved", 2610 | } 2611 | 2612 | return m.createSuccessResponse(fmt.Sprintf("State saved to %s with %d resources", filePath, resourceCount), response) 2613 | } 2614 | 2615 | // ==== Mock Configuration Methods ==== 2616 | 2617 | // SetError configures error simulation for a specific tool 2618 | func (m *MockMCPServer) SetError(toolName string, err error) { 2619 | m.mutex.Lock() 2620 | defer m.mutex.Unlock() 2621 | m.simulateErrors[toolName] = err 2622 | } 2623 | ```