Skip to main content

fakecloud_ec2/service/
mod.rs

1//! EC2 service entrypoint: `ec2Query` dispatch over the per-account state.
2
3mod capacity;
4mod cvpn;
5mod dhcp;
6mod eip;
7mod endpoint;
8mod eni;
9mod firewall_model;
10mod fleet;
11mod ice;
12mod image;
13mod instance;
14mod ipam;
15mod ipam_discovery;
16mod ipam_policy;
17mod lgw;
18mod meta;
19mod nacl;
20mod ni;
21mod reserved;
22mod rest;
23mod routing;
24mod sg;
25mod snapshot;
26mod subnet;
27mod tags;
28mod tgw;
29mod tgw_mcast;
30mod tgw_peering;
31mod va;
32mod volume;
33mod vpc;
34mod vpn;
35
36use async_trait::async_trait;
37use http::StatusCode;
38use parking_lot::RwLock;
39use std::sync::Arc;
40
41use tokio::sync::Mutex as AsyncMutex;
42
43use fakecloud_core::multi_account::MultiAccountState;
44use fakecloud_core::service::{AwsRequest, AwsResponse, AwsService, AwsServiceError};
45use fakecloud_persistence::SnapshotStore;
46
47use crate::runtime::Ec2Runtime;
48use crate::state::{Ec2Snapshot, SharedEc2State, EC2_SNAPSHOT_SCHEMA_VERSION};
49
50/// EC2 read actions all start with `Describe`, `Get`, `Search`, or `List`;
51/// every other action mutates state. The inverse formulation guarantees no
52/// mutation is ever missed, and the hot-path reads (Describe*) are excluded so
53/// polling never triggers a snapshot write.
54fn is_mutating_action(action: &str) -> bool {
55    !(action.starts_with("Describe")
56        || action.starts_with("Get")
57        || action.starts_with("Search")
58        || action.starts_with("List"))
59}
60
61/// Every EC2 action this build implements. The conformance audit cross-checks
62/// this list against the handwritten `#[test_action("ec2", …)]` tests, so an
63/// action added here without a test fails the build. Grows one resource-family
64/// batch at a time toward full 767-op parity.
65pub const SUPPORTED_ACTIONS: &[&str] = &[
66    // Tagging subsystem (shared by every resource family)
67    "CreateTags",
68    "DeleteTags",
69    "DescribeTags",
70    // Region / AZ / account describe primitives
71    "DescribeRegions",
72    "DescribeAvailabilityZones",
73    "DescribeAccountAttributes",
74    // VPCs
75    "CreateVpc",
76    "CreateDefaultVpc",
77    "DeleteVpc",
78    "DescribeVpcs",
79    "ModifyVpcAttribute",
80    "DescribeVpcAttribute",
81    "ModifyVpcTenancy",
82    "AssociateVpcCidrBlock",
83    "DisassociateVpcCidrBlock",
84    // DHCP options
85    "CreateDhcpOptions",
86    "DeleteDhcpOptions",
87    "DescribeDhcpOptions",
88    "AssociateDhcpOptions",
89    // Subnets
90    "CreateSubnet",
91    "CreateDefaultSubnet",
92    "CreateSecondarySubnet",
93    "DeleteSubnet",
94    "DeleteSecondarySubnet",
95    "DescribeSubnets",
96    "DescribeSecondarySubnets",
97    "ModifySubnetAttribute",
98    "AssociateSubnetCidrBlock",
99    "DisassociateSubnetCidrBlock",
100    "CreateSubnetCidrReservation",
101    "DeleteSubnetCidrReservation",
102    "GetSubnetCidrReservations",
103    // Security groups
104    "CreateSecurityGroup",
105    "DeleteSecurityGroup",
106    "DescribeSecurityGroups",
107    "AuthorizeSecurityGroupIngress",
108    "AuthorizeSecurityGroupEgress",
109    "RevokeSecurityGroupIngress",
110    "RevokeSecurityGroupEgress",
111    "DescribeSecurityGroupRules",
112    "ModifySecurityGroupRules",
113    "UpdateSecurityGroupRuleDescriptionsIngress",
114    "UpdateSecurityGroupRuleDescriptionsEgress",
115    "AssociateSecurityGroupVpc",
116    "DisassociateSecurityGroupVpc",
117    "DescribeSecurityGroupVpcAssociations",
118    "GetSecurityGroupsForVpc",
119    "DescribeStaleSecurityGroups",
120    "DescribeSecurityGroupReferences",
121    // Route tables
122    "CreateRouteTable",
123    "DeleteRouteTable",
124    "DescribeRouteTables",
125    "CreateRoute",
126    "DeleteRoute",
127    "ReplaceRoute",
128    "AssociateRouteTable",
129    "DisassociateRouteTable",
130    "ReplaceRouteTableAssociation",
131    // Internet gateways
132    "CreateInternetGateway",
133    "DeleteInternetGateway",
134    "DescribeInternetGateways",
135    "AttachInternetGateway",
136    "DetachInternetGateway",
137    // Egress-only internet gateways
138    "CreateEgressOnlyInternetGateway",
139    "DeleteEgressOnlyInternetGateway",
140    "DescribeEgressOnlyInternetGateways",
141    // NAT gateways
142    "CreateNatGateway",
143    "DeleteNatGateway",
144    "DescribeNatGateways",
145    "AssignPrivateNatGatewayAddress",
146    "AssociateNatGatewayAddress",
147    "DisassociateNatGatewayAddress",
148    "UnassignPrivateNatGatewayAddress",
149    // Elastic IPs
150    "AllocateAddress",
151    "ReleaseAddress",
152    "DescribeAddresses",
153    "AssociateAddress",
154    "DisassociateAddress",
155    "DescribeAddressesAttribute",
156    "ModifyAddressAttribute",
157    "ResetAddressAttribute",
158    "MoveAddressToVpc",
159    "RestoreAddressToClassic",
160    "AcceptAddressTransfer",
161    "EnableAddressTransfer",
162    "DisableAddressTransfer",
163    "DescribeAddressTransfers",
164    "DescribeMovingAddresses",
165    // Key pairs
166    "CreateKeyPair",
167    "ImportKeyPair",
168    "DeleteKeyPair",
169    "DescribeKeyPairs",
170    // Placement groups
171    "CreatePlacementGroup",
172    "DeletePlacementGroup",
173    "DescribePlacementGroups",
174    "GetGroupsForCapacityReservation",
175    // Network interfaces
176    "CreateNetworkInterface",
177    "DeleteNetworkInterface",
178    "DescribeNetworkInterfaces",
179    "AttachNetworkInterface",
180    "DetachNetworkInterface",
181    "ModifyNetworkInterfaceAttribute",
182    "ResetNetworkInterfaceAttribute",
183    "DescribeNetworkInterfaceAttribute",
184    "CreateNetworkInterfacePermission",
185    "DeleteNetworkInterfacePermission",
186    "DescribeNetworkInterfacePermissions",
187    "AssignPrivateIpAddresses",
188    "UnassignPrivateIpAddresses",
189    "AssignIpv6Addresses",
190    "UnassignIpv6Addresses",
191    // Instances
192    "RunInstances",
193    "StartInstances",
194    "StopInstances",
195    "RebootInstances",
196    "TerminateInstances",
197    "MonitorInstances",
198    "UnmonitorInstances",
199    "DescribeInstances",
200    "DescribeInstanceStatus",
201    "DescribeInstanceTypes",
202    "GetInstanceTypesFromInstanceRequirements",
203    "DescribeInstanceAttribute",
204    "ModifyInstanceAttribute",
205    "ResetInstanceAttribute",
206    "ModifyInstancePlacement",
207    "ModifyInstanceMetadataOptions",
208    "ModifyInstanceMaintenanceOptions",
209    "ModifyInstanceCpuOptions",
210    "ModifyInstanceNetworkPerformanceOptions",
211    "ModifyInstanceEventStartTime",
212    "DescribeInstanceCreditSpecifications",
213    "ModifyInstanceCreditSpecification",
214    "GetInstanceMetadataDefaults",
215    "ModifyInstanceMetadataDefaults",
216    "RegisterInstanceEventNotificationAttributes",
217    "DeregisterInstanceEventNotificationAttributes",
218    "DescribeInstanceEventNotificationAttributes",
219    "ReportInstanceStatus",
220    "DescribeInstanceTopology",
221    // EBS volumes
222    "CreateVolume",
223    "DeleteVolume",
224    "DescribeVolumes",
225    "AttachVolume",
226    "DetachVolume",
227    "ModifyVolume",
228    "DescribeVolumesModifications",
229    "DescribeVolumeStatus",
230    "DescribeVolumeAttribute",
231    "ModifyVolumeAttribute",
232    "EnableVolumeIO",
233    "ListVolumesInRecycleBin",
234    "RestoreVolumeFromRecycleBin",
235    // EBS encryption defaults
236    "GetEbsEncryptionByDefault",
237    "EnableEbsEncryptionByDefault",
238    "DisableEbsEncryptionByDefault",
239    "GetEbsDefaultKmsKeyId",
240    "ModifyEbsDefaultKmsKeyId",
241    "ResetEbsDefaultKmsKeyId",
242    // EBS snapshots
243    "CreateSnapshot",
244    "CreateSnapshots",
245    "DeleteSnapshot",
246    "DescribeSnapshots",
247    "CopySnapshot",
248    "DescribeSnapshotAttribute",
249    "ModifySnapshotAttribute",
250    "ResetSnapshotAttribute",
251    "ModifySnapshotTier",
252    "DescribeSnapshotTierStatus",
253    "RestoreSnapshotTier",
254    "ListSnapshotsInRecycleBin",
255    "RestoreSnapshotFromRecycleBin",
256    "LockSnapshot",
257    "UnlockSnapshot",
258    "DescribeLockedSnapshots",
259    "GetSnapshotBlockPublicAccessState",
260    "EnableSnapshotBlockPublicAccess",
261    "DisableSnapshotBlockPublicAccess",
262    "EnableFastSnapshotRestores",
263    "DisableFastSnapshotRestores",
264    "DescribeFastSnapshotRestores",
265    // AMIs (images)
266    "CreateImage",
267    "RegisterImage",
268    "DeregisterImage",
269    "DescribeImages",
270    "CopyImage",
271    "DescribeImageAttribute",
272    "ModifyImageAttribute",
273    "ResetImageAttribute",
274    "EnableImage",
275    "DisableImage",
276    "AttachImageWatermark",
277    "DetachImageWatermark",
278    "EnableImageDeprecation",
279    "DisableImageDeprecation",
280    "EnableImageDeregistrationProtection",
281    "DisableImageDeregistrationProtection",
282    "CancelImageLaunchPermission",
283    "RestoreImageFromRecycleBin",
284    "ListImagesInRecycleBin",
285    "EnableImageBlockPublicAccess",
286    "DisableImageBlockPublicAccess",
287    "GetImageBlockPublicAccessState",
288    "EnableAllowedImagesSettings",
289    "DisableAllowedImagesSettings",
290    "GetAllowedImagesSettings",
291    "ReplaceImageCriteriaInAllowedImagesSettings",
292    "CreateStoreImageTask",
293    "DescribeStoreImageTasks",
294    "CreateRestoreImageTask",
295    "DescribeFastLaunchImages",
296    // Network ACLs
297    "CreateNetworkAcl",
298    "DeleteNetworkAcl",
299    "DescribeNetworkAcls",
300    "CreateNetworkAclEntry",
301    "DeleteNetworkAclEntry",
302    "ReplaceNetworkAclEntry",
303    "ReplaceNetworkAclAssociation",
304    // VPC peering
305    "CreateVpcPeeringConnection",
306    "DeleteVpcPeeringConnection",
307    "DescribeVpcPeeringConnections",
308    "AcceptVpcPeeringConnection",
309    "RejectVpcPeeringConnection",
310    "ModifyVpcPeeringConnectionOptions",
311    // VPC endpoints
312    "CreateVpcEndpoint",
313    "DeleteVpcEndpoints",
314    "DescribeVpcEndpoints",
315    "ModifyVpcEndpoint",
316    "DescribeVpcEndpointServices",
317    "DescribeVpcEndpointConnections",
318    "AcceptVpcEndpointConnections",
319    "RejectVpcEndpointConnections",
320    "CreateVpcEndpointServiceConfiguration",
321    "DeleteVpcEndpointServiceConfigurations",
322    "DescribeVpcEndpointServiceConfigurations",
323    "ModifyVpcEndpointServiceConfiguration",
324    "DescribeVpcEndpointServicePermissions",
325    "ModifyVpcEndpointServicePermissions",
326    "ModifyVpcEndpointServicePayerResponsibility",
327    "StartVpcEndpointServicePrivateDnsVerification",
328    "CreateVpcEndpointConnectionNotification",
329    "DeleteVpcEndpointConnectionNotifications",
330    "DescribeVpcEndpointConnectionNotifications",
331    "ModifyVpcEndpointConnectionNotification",
332    "DescribeVpcEndpointAssociations",
333    // Flow logs
334    "CreateFlowLogs",
335    "DeleteFlowLogs",
336    "DescribeFlowLogs",
337    "GetFlowLogsIntegrationTemplate",
338    // Launch templates
339    "CreateLaunchTemplate",
340    "CreateLaunchTemplateVersion",
341    "DeleteLaunchTemplate",
342    "DeleteLaunchTemplateVersions",
343    "DescribeLaunchTemplates",
344    "DescribeLaunchTemplateVersions",
345    "GetLaunchTemplateData",
346    "ModifyLaunchTemplate",
347    // Spot instances + fleet
348    "RequestSpotInstances",
349    "DescribeSpotInstanceRequests",
350    "CancelSpotInstanceRequests",
351    "RequestSpotFleet",
352    "DescribeSpotFleetRequests",
353    "CancelSpotFleetRequests",
354    "ModifySpotFleetRequest",
355    "DescribeSpotFleetInstances",
356    "DescribeSpotFleetRequestHistory",
357    "DescribeSpotPriceHistory",
358    "GetSpotPlacementScores",
359    "CreateSpotDatafeedSubscription",
360    "DeleteSpotDatafeedSubscription",
361    "DescribeSpotDatafeedSubscription",
362    // EC2 fleets
363    "CreateFleet",
364    "DeleteFleets",
365    "DescribeFleets",
366    "ModifyFleet",
367    "DescribeFleetHistory",
368    "DescribeFleetInstances",
369    // Capacity reservations
370    "CreateCapacityReservation",
371    "CancelCapacityReservation",
372    "DescribeCapacityReservations",
373    "ModifyCapacityReservation",
374    "GetCapacityReservationUsage",
375    "CreateCapacityReservationFleet",
376    "CancelCapacityReservationFleets",
377    "DescribeCapacityReservationFleets",
378    "ModifyCapacityReservationFleet",
379    "ModifyInstanceCapacityReservationAttributes",
380    "CreateCapacityReservationBySplitting",
381    "MoveCapacityReservationInstances",
382    "DescribeCapacityReservationBillingRequests",
383    "AssociateCapacityReservationBillingOwner",
384    "DisassociateCapacityReservationBillingOwner",
385    "AcceptCapacityReservationBillingOwnership",
386    "RejectCapacityReservationBillingOwnership",
387    "DescribeCapacityBlockOfferings",
388    "DescribeCapacityBlocks",
389    "PurchaseCapacityBlock",
390    "DescribeCapacityBlockStatus",
391    "DescribeCapacityBlockExtensionHistory",
392    "DescribeCapacityBlockExtensionOfferings",
393    "PurchaseCapacityBlockExtension",
394    "DescribeCapacityReservationTopology",
395    "CreateInterruptibleCapacityReservationAllocation",
396    "UpdateInterruptibleCapacityReservationAllocation",
397    // Reserved instances
398    "DescribeReservedInstances",
399    "DescribeReservedInstancesOfferings",
400    "PurchaseReservedInstancesOffering",
401    "DescribeReservedInstancesListings",
402    "CreateReservedInstancesListing",
403    "CancelReservedInstancesListing",
404    "DescribeReservedInstancesModifications",
405    "ModifyReservedInstances",
406    "GetReservedInstancesExchangeQuote",
407    "AcceptReservedInstancesExchangeQuote",
408    "DeleteQueuedReservedInstances",
409    // Dedicated hosts
410    "AllocateHosts",
411    "DescribeHosts",
412    "ModifyHosts",
413    "ReleaseHosts",
414    "DescribeMacHosts",
415    // Transit gateway core
416    "CreateTransitGateway",
417    "DeleteTransitGateway",
418    "DescribeTransitGateways",
419    "ModifyTransitGateway",
420    "CreateTransitGatewayVpcAttachment",
421    "DeleteTransitGatewayVpcAttachment",
422    "DescribeTransitGatewayVpcAttachments",
423    "ModifyTransitGatewayVpcAttachment",
424    "AcceptTransitGatewayVpcAttachment",
425    "RejectTransitGatewayVpcAttachment",
426    "DescribeTransitGatewayAttachments",
427    "CreateTransitGatewayRouteTable",
428    "DeleteTransitGatewayRouteTable",
429    "DescribeTransitGatewayRouteTables",
430    "AssociateTransitGatewayRouteTable",
431    "DisassociateTransitGatewayRouteTable",
432    "EnableTransitGatewayRouteTablePropagation",
433    "DisableTransitGatewayRouteTablePropagation",
434    "CreateTransitGatewayRoute",
435    "DeleteTransitGatewayRoute",
436    "ReplaceTransitGatewayRoute",
437    "SearchTransitGatewayRoutes",
438    "ExportTransitGatewayRoutes",
439    "GetTransitGatewayRouteTableAssociations",
440    "GetTransitGatewayRouteTablePropagations",
441    "GetTransitGatewayAttachmentPropagations",
442    "CreateTransitGatewayPrefixListReference",
443    "DeleteTransitGatewayPrefixListReference",
444    "ModifyTransitGatewayPrefixListReference",
445    "GetTransitGatewayPrefixListReferences",
446    // Transit gateway peering / connect / policy / announcements
447    "CreateTransitGatewayPeeringAttachment",
448    "DeleteTransitGatewayPeeringAttachment",
449    "DescribeTransitGatewayPeeringAttachments",
450    "AcceptTransitGatewayPeeringAttachment",
451    "RejectTransitGatewayPeeringAttachment",
452    "CreateTransitGatewayConnect",
453    "DeleteTransitGatewayConnect",
454    "DescribeTransitGatewayConnects",
455    "CreateTransitGatewayConnectPeer",
456    "DeleteTransitGatewayConnectPeer",
457    "DescribeTransitGatewayConnectPeers",
458    "CreateTransitGatewayPolicyTable",
459    "DeleteTransitGatewayPolicyTable",
460    "DescribeTransitGatewayPolicyTables",
461    "AssociateTransitGatewayPolicyTable",
462    "DisassociateTransitGatewayPolicyTable",
463    "GetTransitGatewayPolicyTableAssociations",
464    "GetTransitGatewayPolicyTableEntries",
465    "CreateTransitGatewayRouteTableAnnouncement",
466    "DeleteTransitGatewayRouteTableAnnouncement",
467    "DescribeTransitGatewayRouteTableAnnouncements",
468    // Transit gateway multicast / metering / client-vpn-attach
469    "CreateTransitGatewayMulticastDomain",
470    "DeleteTransitGatewayMulticastDomain",
471    "DescribeTransitGatewayMulticastDomains",
472    "AssociateTransitGatewayMulticastDomain",
473    "DisassociateTransitGatewayMulticastDomain",
474    "AcceptTransitGatewayMulticastDomainAssociations",
475    "RejectTransitGatewayMulticastDomainAssociations",
476    "GetTransitGatewayMulticastDomainAssociations",
477    "RegisterTransitGatewayMulticastGroupMembers",
478    "RegisterTransitGatewayMulticastGroupSources",
479    "DeregisterTransitGatewayMulticastGroupMembers",
480    "DeregisterTransitGatewayMulticastGroupSources",
481    "SearchTransitGatewayMulticastGroups",
482    "CreateTransitGatewayMeteringPolicy",
483    "DeleteTransitGatewayMeteringPolicy",
484    "DescribeTransitGatewayMeteringPolicies",
485    "ModifyTransitGatewayMeteringPolicy",
486    "CreateTransitGatewayMeteringPolicyEntry",
487    "DeleteTransitGatewayMeteringPolicyEntry",
488    "GetTransitGatewayMeteringPolicyEntries",
489    "AcceptTransitGatewayClientVpnAttachment",
490    "DeleteTransitGatewayClientVpnAttachment",
491    "RejectTransitGatewayClientVpnAttachment",
492    // Site-to-Site VPN
493    "CreateCustomerGateway",
494    "DeleteCustomerGateway",
495    "DescribeCustomerGateways",
496    "CreateVpnGateway",
497    "DeleteVpnGateway",
498    "DescribeVpnGateways",
499    "AttachVpnGateway",
500    "DetachVpnGateway",
501    "CreateVpnConnection",
502    "DeleteVpnConnection",
503    "DescribeVpnConnections",
504    "ModifyVpnConnection",
505    "ModifyVpnConnectionOptions",
506    "CreateVpnConnectionRoute",
507    "DeleteVpnConnectionRoute",
508    "ModifyVpnTunnelOptions",
509    "ModifyVpnTunnelCertificate",
510    "ReplaceVpnTunnel",
511    "GetActiveVpnTunnelStatus",
512    "GetVpnTunnelReplacementStatus",
513    "GetVpnConnectionDeviceTypes",
514    "GetVpnConnectionDeviceSampleConfiguration",
515    "CreateVpnConcentrator",
516    "DeleteVpnConcentrator",
517    "DescribeVpnConcentrators",
518    // Client VPN
519    "CreateClientVpnEndpoint",
520    "DeleteClientVpnEndpoint",
521    "DescribeClientVpnEndpoints",
522    "ModifyClientVpnEndpoint",
523    "CreateClientVpnRoute",
524    "DeleteClientVpnRoute",
525    "DescribeClientVpnRoutes",
526    "AuthorizeClientVpnIngress",
527    "RevokeClientVpnIngress",
528    "DescribeClientVpnAuthorizationRules",
529    "AssociateClientVpnTargetNetwork",
530    "DisassociateClientVpnTargetNetwork",
531    "DescribeClientVpnTargetNetworks",
532    "ApplySecurityGroupsToClientVpnTargetNetwork",
533    "DescribeClientVpnConnections",
534    "TerminateClientVpnConnections",
535    "ExportClientVpnClientCertificateRevocationList",
536    "ExportClientVpnClientConfiguration",
537    "ImportClientVpnClientCertificateRevocationList",
538    // IPAM core
539    "CreateIpam",
540    "DeleteIpam",
541    "DescribeIpams",
542    "ModifyIpam",
543    "CreateIpamScope",
544    "DeleteIpamScope",
545    "DescribeIpamScopes",
546    "ModifyIpamScope",
547    "CreateIpamPool",
548    "DeleteIpamPool",
549    "DescribeIpamPools",
550    "ModifyIpamPool",
551    "ProvisionIpamPoolCidr",
552    "DeprovisionIpamPoolCidr",
553    "GetIpamPoolCidrs",
554    "AllocateIpamPoolCidr",
555    "ReleaseIpamPoolAllocation",
556    "GetIpamPoolAllocations",
557    "GetIpamResourceCidrs",
558    "ModifyIpamResourceCidr",
559    "GetIpamAddressHistory",
560    "EnableIpamOrganizationAdminAccount",
561    "DisableIpamOrganizationAdminAccount",
562    // IPAM resource discovery / BYOASN / BYOIP / external tokens
563    "CreateIpamResourceDiscovery",
564    "DeleteIpamResourceDiscovery",
565    "DescribeIpamResourceDiscoveries",
566    "ModifyIpamResourceDiscovery",
567    "AssociateIpamResourceDiscovery",
568    "DisassociateIpamResourceDiscovery",
569    "DescribeIpamResourceDiscoveryAssociations",
570    "GetIpamDiscoveredAccounts",
571    "GetIpamDiscoveredPublicAddresses",
572    "GetIpamDiscoveredResourceCidrs",
573    "AssociateIpamByoasn",
574    "DisassociateIpamByoasn",
575    "ProvisionIpamByoasn",
576    "DeprovisionIpamByoasn",
577    "DescribeIpamByoasn",
578    "MoveByoipCidrToIpam",
579    "CreateIpamExternalResourceVerificationToken",
580    "DeleteIpamExternalResourceVerificationToken",
581    "DescribeIpamExternalResourceVerificationTokens",
582    // IPAM policies + prefix-list resolvers
583    "CreateIpamPolicy",
584    "DeleteIpamPolicy",
585    "DescribeIpamPolicies",
586    "EnableIpamPolicy",
587    "DisableIpamPolicy",
588    "GetEnabledIpamPolicy",
589    "GetIpamPolicyAllocationRules",
590    "ModifyIpamPolicyAllocationRules",
591    "GetIpamPolicyOrganizationTargets",
592    "CreateIpamPrefixListResolver",
593    "DeleteIpamPrefixListResolver",
594    "DescribeIpamPrefixListResolvers",
595    "ModifyIpamPrefixListResolver",
596    "CreateIpamPrefixListResolverTarget",
597    "DeleteIpamPrefixListResolverTarget",
598    "DescribeIpamPrefixListResolverTargets",
599    "ModifyIpamPrefixListResolverTarget",
600    "GetIpamPrefixListResolverRules",
601    "GetIpamPrefixListResolverVersions",
602    "GetIpamPrefixListResolverVersionEntries",
603    // Verified Access
604    "CreateVerifiedAccessInstance",
605    "DeleteVerifiedAccessInstance",
606    "DescribeVerifiedAccessInstances",
607    "ModifyVerifiedAccessInstance",
608    "CreateVerifiedAccessTrustProvider",
609    "DeleteVerifiedAccessTrustProvider",
610    "DescribeVerifiedAccessTrustProviders",
611    "ModifyVerifiedAccessTrustProvider",
612    "AttachVerifiedAccessTrustProvider",
613    "DetachVerifiedAccessTrustProvider",
614    "CreateVerifiedAccessGroup",
615    "DeleteVerifiedAccessGroup",
616    "DescribeVerifiedAccessGroups",
617    "ModifyVerifiedAccessGroup",
618    "GetVerifiedAccessGroupPolicy",
619    "ModifyVerifiedAccessGroupPolicy",
620    "CreateVerifiedAccessEndpoint",
621    "DeleteVerifiedAccessEndpoint",
622    "DescribeVerifiedAccessEndpoints",
623    "ModifyVerifiedAccessEndpoint",
624    "GetVerifiedAccessEndpointPolicy",
625    "ModifyVerifiedAccessEndpointPolicy",
626    "GetVerifiedAccessEndpointTargets",
627    "DescribeVerifiedAccessInstanceLoggingConfigurations",
628    "ModifyVerifiedAccessInstanceLoggingConfiguration",
629    "ExportVerifiedAccessInstanceClientConfiguration",
630    // Network Insights
631    "CreateNetworkInsightsPath",
632    "DeleteNetworkInsightsPath",
633    "DescribeNetworkInsightsPaths",
634    "StartNetworkInsightsAnalysis",
635    "DeleteNetworkInsightsAnalysis",
636    "DescribeNetworkInsightsAnalyses",
637    "CreateNetworkInsightsAccessScope",
638    "DeleteNetworkInsightsAccessScope",
639    "DescribeNetworkInsightsAccessScopes",
640    "GetNetworkInsightsAccessScopeContent",
641    "StartNetworkInsightsAccessScopeAnalysis",
642    "DeleteNetworkInsightsAccessScopeAnalysis",
643    "DescribeNetworkInsightsAccessScopeAnalyses",
644    "GetNetworkInsightsAccessScopeAnalysisFindings",
645    // Outpost / local gateway / CoIP / carrier
646    "CreateCarrierGateway",
647    "DeleteCarrierGateway",
648    "DescribeCarrierGateways",
649    "CreateCoipPool",
650    "DeleteCoipPool",
651    "DescribeCoipPools",
652    "CreateCoipCidr",
653    "DeleteCoipCidr",
654    "GetCoipPoolUsage",
655    "CreateLocalGatewayRouteTable",
656    "DeleteLocalGatewayRouteTable",
657    "DescribeLocalGatewayRouteTables",
658    "CreateLocalGatewayRoute",
659    "DeleteLocalGatewayRoute",
660    "ModifyLocalGatewayRoute",
661    "SearchLocalGatewayRoutes",
662    "CreateLocalGatewayRouteTableVpcAssociation",
663    "DeleteLocalGatewayRouteTableVpcAssociation",
664    "DescribeLocalGatewayRouteTableVpcAssociations",
665    "CreateLocalGatewayVirtualInterface",
666    "DeleteLocalGatewayVirtualInterface",
667    "DescribeLocalGatewayVirtualInterfaces",
668    "CreateLocalGatewayVirtualInterfaceGroup",
669    "DeleteLocalGatewayVirtualInterfaceGroup",
670    "DescribeLocalGatewayVirtualInterfaceGroups",
671    "CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation",
672    "DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation",
673    "DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations",
674    "DescribeLocalGateways",
675    // Instance Connect / fast launch / serial console / console output
676    "CreateInstanceConnectEndpoint",
677    "DeleteInstanceConnectEndpoint",
678    "DescribeInstanceConnectEndpoints",
679    "ModifyInstanceConnectEndpoint",
680    "EnableFastLaunch",
681    "DisableFastLaunch",
682    "EnableSerialConsoleAccess",
683    "DisableSerialConsoleAccess",
684    "GetSerialConsoleAccessStatus",
685    "GetConsoleOutput",
686    "GetConsoleScreenshot",
687    "GetPasswordData",
688    // Remainder sweep (long tail -> full 767-op parity)
689    "CreateCapacityReservationCancellationQuote",
690    "DescribeCapacityReservationCancellationQuotes",
691    "DescribeIpamPoolAllocations",
692    "ModifyIpamPoolAllocation",
693    "AdvertiseByoipCidr",
694    "AssociateEnclaveCertificateIamRole",
695    "AssociateIamInstanceProfile",
696    "AssociateInstanceEventWindow",
697    "AssociateRouteServer",
698    "AssociateTrunkInterface",
699    "AttachClassicLinkVpc",
700    "BundleInstance",
701    "CancelBundleTask",
702    "CancelConversionTask",
703    "CancelDeclarativePoliciesReport",
704    "CancelExportTask",
705    "CancelImportTask",
706    "ConfirmProductInstance",
707    "CopyFpgaImage",
708    "CopyVolumes",
709    "CreateCapacityManagerDataExport",
710    "CreateDelegateMacVolumeOwnershipTask",
711    "CreateFpgaImage",
712    "CreateImageUsageReport",
713    "CreateInstanceEventWindow",
714    "CreateInstanceExportTask",
715    "CreateMacSystemIntegrityProtectionModificationTask",
716    "CreateManagedPrefixList",
717    "CreatePublicIpv4Pool",
718    "CreateReplaceRootVolumeTask",
719    "CreateRouteServer",
720    "CreateRouteServerEndpoint",
721    "CreateRouteServerPeer",
722    "CreateSecondaryNetwork",
723    "CreateTrafficMirrorFilter",
724    "CreateTrafficMirrorFilterRule",
725    "CreateTrafficMirrorSession",
726    "CreateTrafficMirrorTarget",
727    "CreateVpcBlockPublicAccessExclusion",
728    "CreateVpcEncryptionControl",
729    "DeleteCapacityManagerDataExport",
730    "DeleteFpgaImage",
731    "DeleteImageUsageReport",
732    "DeleteInstanceEventWindow",
733    "DeleteManagedPrefixList",
734    "DeletePublicIpv4Pool",
735    "DeleteRouteServer",
736    "DeleteRouteServerEndpoint",
737    "DeleteRouteServerPeer",
738    "DeleteSecondaryNetwork",
739    "DeleteTrafficMirrorFilter",
740    "DeleteTrafficMirrorFilterRule",
741    "DeleteTrafficMirrorSession",
742    "DeleteTrafficMirrorTarget",
743    "DeleteVpcBlockPublicAccessExclusion",
744    "DeleteVpcEncryptionControl",
745    "DeprovisionByoipCidr",
746    "DeprovisionPublicIpv4PoolCidr",
747    "DescribeAggregateIdFormat",
748    "DescribeAwsNetworkPerformanceMetricSubscriptions",
749    "DescribeBundleTasks",
750    "DescribeByoipCidrs",
751    "DescribeCapacityManagerDataExports",
752    "DescribeClassicLinkInstances",
753    "DescribeConversionTasks",
754    "DescribeDeclarativePoliciesReports",
755    "DescribeElasticGpus",
756    "DescribeExportImageTasks",
757    "DescribeExportTasks",
758    "DescribeFpgaImageAttribute",
759    "DescribeFpgaImages",
760    "DescribeHostReservationOfferings",
761    "DescribeHostReservations",
762    "DescribeIamInstanceProfileAssociations",
763    "DescribeIdFormat",
764    "DescribeIdentityIdFormat",
765    "DescribeImageReferences",
766    "DescribeImageUsageReportEntries",
767    "DescribeImageUsageReports",
768    "DescribeImportImageTasks",
769    "DescribeImportSnapshotTasks",
770    "DescribeInstanceEventWindows",
771    "DescribeInstanceImageMetadata",
772    "DescribeInstanceSqlHaHistoryStates",
773    "DescribeInstanceSqlHaStates",
774    "DescribeInstanceTypeOfferings",
775    "DescribeIpv6Pools",
776    "DescribeMacModificationTasks",
777    "DescribeManagedPrefixLists",
778    "DescribeOutpostLags",
779    "DescribePrefixLists",
780    "DescribePrincipalIdFormat",
781    "DescribePublicIpv4Pools",
782    "DescribeReplaceRootVolumeTasks",
783    "DescribeRouteServerEndpoints",
784    "DescribeRouteServerPeers",
785    "DescribeRouteServers",
786    "DescribeScheduledInstanceAvailability",
787    "DescribeScheduledInstances",
788    "DescribeSecondaryInterfaces",
789    "DescribeSecondaryNetworks",
790    "DescribeServiceLinkVirtualInterfaces",
791    "DescribeTrafficMirrorFilterRules",
792    "DescribeTrafficMirrorFilters",
793    "DescribeTrafficMirrorSessions",
794    "DescribeTrafficMirrorTargets",
795    "DescribeTrunkInterfaceAssociations",
796    "DescribeVpcBlockPublicAccessExclusions",
797    "DescribeVpcBlockPublicAccessOptions",
798    "DescribeVpcClassicLink",
799    "DescribeVpcClassicLinkDnsSupport",
800    "DescribeVpcEncryptionControls",
801    "DetachClassicLinkVpc",
802    "DisableAwsNetworkPerformanceMetricSubscription",
803    "DisableCapacityManager",
804    "DisableInstanceSqlHaStandbyDetections",
805    "DisableRouteServerPropagation",
806    "DisableVgwRoutePropagation",
807    "DisableVpcClassicLink",
808    "DisableVpcClassicLinkDnsSupport",
809    "DisassociateEnclaveCertificateIamRole",
810    "DisassociateIamInstanceProfile",
811    "DisassociateInstanceEventWindow",
812    "DisassociateRouteServer",
813    "DisassociateTrunkInterface",
814    "EnableAwsNetworkPerformanceMetricSubscription",
815    "EnableCapacityManager",
816    "EnableInstanceSqlHaStandbyDetections",
817    "EnableReachabilityAnalyzerOrganizationSharing",
818    "EnableRouteServerPropagation",
819    "EnableVgwRoutePropagation",
820    "EnableVpcClassicLink",
821    "EnableVpcClassicLinkDnsSupport",
822    "ExportImage",
823    "GetAssociatedEnclaveCertificateIamRoles",
824    "GetAssociatedIpv6PoolCidrs",
825    "GetAwsNetworkPerformanceData",
826    "GetCapacityManagerAttributes",
827    "GetCapacityManagerMetricData",
828    "GetCapacityManagerMetricDimensions",
829    "GetCapacityManagerMonitoredTagKeys",
830    "GetDeclarativePoliciesReportSummary",
831    "GetDefaultCreditSpecification",
832    "GetHostReservationPurchasePreview",
833    "GetImageAncestry",
834    "GetInstanceTpmEkPub",
835    "GetInstanceUefiData",
836    "GetManagedPrefixListAssociations",
837    "GetManagedPrefixListEntries",
838    "GetManagedResourceVisibility",
839    "GetRouteServerAssociations",
840    "GetRouteServerPropagations",
841    "GetRouteServerRoutingDatabase",
842    "GetVpcResourcesBlockingEncryptionEnforcement",
843    "ImportImage",
844    "ImportInstance",
845    "ImportSnapshot",
846    "ImportVolume",
847    "ModifyAvailabilityZoneGroup",
848    "ModifyDefaultCreditSpecification",
849    "ModifyFpgaImageAttribute",
850    "ModifyIdFormat",
851    "ModifyIdentityIdFormat",
852    "ModifyInstanceEventWindow",
853    "ModifyManagedPrefixList",
854    "ModifyManagedResourceVisibility",
855    "ModifyPrivateDnsNameOptions",
856    "ModifyPublicIpDnsNameOptions",
857    "ModifyRouteServer",
858    "ModifyTrafficMirrorFilterNetworkServices",
859    "ModifyTrafficMirrorFilterRule",
860    "ModifyTrafficMirrorSession",
861    "ModifyVpcBlockPublicAccessExclusion",
862    "ModifyVpcBlockPublicAccessOptions",
863    "ModifyVpcEncryptionControl",
864    "ProvisionByoipCidr",
865    "ProvisionPublicIpv4PoolCidr",
866    "PurchaseHostReservation",
867    "PurchaseScheduledInstances",
868    "ReplaceIamInstanceProfileAssociation",
869    "ResetFpgaImageAttribute",
870    "RestoreManagedPrefixListVersion",
871    "RunScheduledInstances",
872    "SendDiagnosticInterrupt",
873    "StartDeclarativePoliciesReport",
874    "UpdateCapacityManagerMonitoredTagKeys",
875    "UpdateCapacityManagerOrganizationsAccess",
876    "WithdrawByoipCidr",
877];
878
879/// Amazon EC2 service.
880pub struct Ec2Service {
881    pub(crate) state: SharedEc2State,
882    /// Optional container runtime backing instances with real containers.
883    /// `None` runs the metadata-only control plane (no Docker/Podman/k8s).
884    pub(crate) runtime: Option<Arc<Ec2Runtime>>,
885    pub(crate) snapshot_store: Option<Arc<dyn SnapshotStore>>,
886    pub(crate) snapshot_lock: Arc<AsyncMutex<()>>,
887}
888
889impl Ec2Service {
890    /// Construct a service over a fresh, empty account-partitioned state.
891    pub fn new() -> Self {
892        Self {
893            state: Arc::new(RwLock::new(MultiAccountState::new(
894                "000000000000",
895                "us-east-1",
896                "",
897            ))),
898            runtime: None,
899            snapshot_store: None,
900            snapshot_lock: Arc::new(AsyncMutex::new(())),
901        }
902    }
903
904    /// Construct a service over a shared state handle (used by the server so
905    /// persistence/snapshots can be wired in later batches).
906    pub fn with_state(state: SharedEc2State) -> Self {
907        Self {
908            state,
909            runtime: None,
910            snapshot_store: None,
911            snapshot_lock: Arc::new(AsyncMutex::new(())),
912        }
913    }
914
915    /// Synchronous dispatch for the subset of EC2 control-plane actions the
916    /// CloudFormation provisioner needs (VPC/Subnet/SecurityGroup/RouteTable/
917    /// InternetGateway create + delete). Routing through the real handlers
918    /// keeps CFN-provisioned EC2 resources identical to API-created ones
919    /// (default SG/NACL/route-table, id formats, tags) instead of re-deriving
920    /// them. None of these actions need the container runtime.
921    pub fn provision_sync(&self, request: &AwsRequest) -> Result<AwsResponse, AwsServiceError> {
922        match request.action.as_str() {
923            "CreateVpc" => vpc::create_vpc(self, request),
924            "DeleteVpc" => vpc::delete_vpc(self, request),
925            "CreateSubnet" => subnet::create_subnet(self, request),
926            "DeleteSubnet" => subnet::delete_subnet(self, request),
927            "CreateSecurityGroup" => sg::create_security_group(self, request),
928            "DeleteSecurityGroup" => sg::delete_security_group(self, request),
929            "CreateRouteTable" => routing::create_route_table(self, request),
930            "DeleteRouteTable" => routing::delete_route_table(self, request),
931            "CreateInternetGateway" => routing::create_internet_gateway(self, request),
932            "DeleteInternetGateway" => routing::delete_internet_gateway(self, request),
933            other => Err(AwsServiceError::action_not_implemented("ec2", other)),
934        }
935    }
936
937    /// Attach a container runtime so `RunInstances` boots real containers.
938    /// Passing `None` leaves the service in metadata-only mode.
939    pub fn with_runtime(mut self, runtime: Option<Arc<Ec2Runtime>>) -> Self {
940        self.runtime = runtime;
941        self
942    }
943
944    /// Attach a persistence snapshot store so control-plane mutations are
945    /// written through to disk. Backing containers are reconciled separately on
946    /// restart via [`Ec2Service::recover_persisted_containers`].
947    pub fn with_snapshot_store(mut self, store: Arc<dyn SnapshotStore>) -> Self {
948        self.snapshot_store = Some(store);
949        self
950    }
951
952    /// Persist current state as a snapshot. Held across the
953    /// clone-serialize-write sequence to prevent stale-last writes, with serde
954    /// + file I/O offloaded to the blocking pool.
955    async fn save_snapshot(&self) {
956        save_ec2_snapshot(
957            &self.state,
958            self.snapshot_store.clone(),
959            &self.snapshot_lock,
960        )
961        .await;
962    }
963
964    /// Build a hook that persists the current EC2 state when invoked, or `None`
965    /// in memory mode. The CloudFormation provisioner mutates `state` directly
966    /// and uses this to write a CFN-provisioned resource through to disk, the
967    /// same way a direct mutating API call would.
968    pub fn snapshot_hook(&self) -> Option<fakecloud_persistence::SnapshotHook> {
969        let store = self.snapshot_store.clone()?;
970        let state = self.state.clone();
971        let lock = self.snapshot_lock.clone();
972        Some(Arc::new(move || {
973            let state = state.clone();
974            let store = store.clone();
975            let lock = lock.clone();
976            Box::pin(async move {
977                save_ec2_snapshot(&state, Some(store), &lock).await;
978            })
979        }))
980    }
981
982    /// Clone the shared state handle so the server can expose read-only
983    /// introspection endpoints (`GET /_fakecloud/ec2/instances`).
984    pub fn shared_state(&self) -> SharedEc2State {
985        self.state.clone()
986    }
987
988    /// Re-derive the security-group/NACL firewall model from current state and
989    /// (re)apply it via the runtime's nftables enforcer (#1745 phase 3).
990    ///
991    /// Cheap no-op when there's no runtime or enforcement is disabled — the
992    /// common case — so it's safe to call liberally after any mutation that can
993    /// change the ruleset (RunInstances, Terminate, Authorize/Revoke,
994    /// network-ACL edits). Runs in the background so it never blocks the API
995    /// response.
996    pub(crate) fn spawn_firewall_reconcile(&self) {
997        let Some(runtime) = self.runtime.clone() else {
998            return;
999        };
1000        if !runtime.network_isolation_enforced() {
1001            return;
1002        }
1003        let state = self.state.clone();
1004        tokio::spawn(async move {
1005            firewall_model::reconcile(&state, &runtime).await;
1006        });
1007    }
1008
1009    /// Rebuild the backing-container runtime state for persisted instances
1010    /// after a fakecloud restart, mirroring RDS/ElastiCache
1011    /// `recover_persisted_containers`.
1012    ///
1013    /// On an ungraceful restart the new process has a new PID, so the shared
1014    /// reaper removes every EC2 container labeled with the *previous* PID; an
1015    /// instance that persisted as `running` with a `container_id` would
1016    /// otherwise be left pointing at a removed container, with every
1017    /// subsequent Stop/Start/Reboot/Terminate a silent no-op (bug-hunt
1018    /// 2026-06-15 finding 0.3). For each such instance we flip it to `pending`
1019    /// and spawn a fresh backing container in the background, reconciling it to
1020    /// `running` (with the new id/IP) when it's up, or `stopped` on failure.
1021    /// Instances persisted as `stopped`/`terminated` are left as-is —
1022    /// StartInstances revives the former. No-op when no runtime is configured
1023    /// or there are no instances to recover.
1024    pub async fn recover_persisted_containers(&self) {
1025        let Some(runtime) = self.runtime.clone() else {
1026            return;
1027        };
1028
1029        struct Pending {
1030            account_id: String,
1031            id: String,
1032            user_data: Option<String>,
1033            tags: std::collections::BTreeMap<String, String>,
1034            network: Option<crate::runtime::InstanceNetwork>,
1035        }
1036
1037        let pending: Vec<Pending> = {
1038            let mut accounts = self.state.write();
1039            let mut out = Vec::new();
1040            for (_, state) in accounts.iter_mut() {
1041                let account_id = state.account_id.clone();
1042                // Snapshot the tag map first so we don't hold two borrows of
1043                // `state` at once when re-deriving per-instance Pod tags.
1044                let tag_snapshot: std::collections::BTreeMap<String, Vec<crate::state::Tag>> =
1045                    state.tags.clone();
1046                // Which subnets are public (have an IGW default route), computed
1047                // before the mutable instance loop so we can re-derive each
1048                // recovered instance's `internal` flag without a second borrow.
1049                let public_subnets: std::collections::HashSet<String> = state
1050                    .subnets
1051                    .keys()
1052                    .filter(|sid| crate::defaults::subnet_is_public(state, sid))
1053                    .cloned()
1054                    .collect();
1055                for (id, inst) in state.instances.iter_mut() {
1056                    // Only running/pending instances need a live container; the
1057                    // stale container_id is dropped (the reaper removed it).
1058                    if !matches!(inst.state_name.as_str(), "running" | "pending") {
1059                        continue;
1060                    }
1061                    let tags = tag_snapshot
1062                        .get(id)
1063                        .map(|t| {
1064                            t.iter()
1065                                .map(|tag| (tag.key.clone(), tag.value.clone()))
1066                                .collect()
1067                        })
1068                        .unwrap_or_default();
1069                    let network =
1070                        inst.subnet_id
1071                            .clone()
1072                            .map(|sid| crate::runtime::InstanceNetwork {
1073                                internal: !public_subnets.contains(&sid),
1074                                subnet_id: sid,
1075                            });
1076                    inst.state_code = 0;
1077                    inst.state_name = "pending".to_string();
1078                    inst.container_id = None;
1079                    out.push(Pending {
1080                        account_id: account_id.clone(),
1081                        id: id.clone(),
1082                        user_data: inst.user_data.clone(),
1083                        tags,
1084                        network,
1085                    });
1086                }
1087            }
1088            out
1089        };
1090
1091        if pending.is_empty() {
1092            return;
1093        }
1094        tracing::info!(
1095            count = pending.len(),
1096            "recovering backing containers for persisted ec2 instances",
1097        );
1098
1099        let mut handles = Vec::new();
1100        for p in pending {
1101            let runtime = runtime.clone();
1102            let state = self.state.clone();
1103            handles.push(tokio::spawn(async move {
1104                let running = runtime
1105                    .run_instance(
1106                        &p.account_id,
1107                        &p.id,
1108                        p.user_data.as_deref(),
1109                        &p.tags,
1110                        p.network.as_ref(),
1111                    )
1112                    .await;
1113                let reap = {
1114                    let mut accounts = state.write();
1115                    match (
1116                        accounts
1117                            .get_mut(&p.account_id)
1118                            .and_then(|s| s.instances.get_mut(&p.id)),
1119                        running,
1120                    ) {
1121                        (Some(inst), Ok(r)) => {
1122                            if inst.state_code == 48 {
1123                                // Terminated during recovery: drop the container.
1124                                true
1125                            } else {
1126                                inst.state_code = 16;
1127                                inst.state_name = "running".to_string();
1128                                inst.private_ip = r.private_ip;
1129                                inst.container_id = Some(r.container_id);
1130                                false
1131                            }
1132                        }
1133                        (Some(inst), Err(error)) => {
1134                            tracing::error!(
1135                                %error,
1136                                instance_id = %p.id,
1137                                "failed to recover ec2 backing container after restart",
1138                            );
1139                            inst.state_code = 80;
1140                            inst.state_name = "stopped".to_string();
1141                            inst.container_id = None;
1142                            false
1143                        }
1144                        // Deleted during recovery: stop the container we just
1145                        // started so it isn't orphaned (mirrors ElastiCache).
1146                        (None, Ok(_)) => true,
1147                        (None, Err(_)) => false,
1148                    }
1149                };
1150                if reap {
1151                    runtime.terminate_instance(&p.id).await;
1152                }
1153            }));
1154        }
1155
1156        // Once every instance is back up, (re)apply the security-group
1157        // firewall. The startup reaper cleared the previous process's nft
1158        // table / NetworkPolicies, and the per-instance recovery tasks above
1159        // don't reconcile — without this, recovered instances would run
1160        // unfiltered until some unrelated later op happened to trigger a
1161        // reconcile (#1745; bug-hunt 2026-06-18 finding 4.1). No-op when
1162        // enforcement is disabled.
1163        {
1164            let runtime = runtime.clone();
1165            let state = self.state.clone();
1166            tokio::spawn(async move {
1167                for h in handles {
1168                    let _ = h.await;
1169                }
1170                if runtime.network_isolation_enforced() {
1171                    firewall_model::reconcile(&state, &runtime).await;
1172                }
1173            });
1174        }
1175    }
1176}
1177
1178impl Default for Ec2Service {
1179    fn default() -> Self {
1180        Self::new()
1181    }
1182}
1183
1184/// Persist the current EC2 state as a snapshot. Offloads the serde + blocking
1185/// file write to the Tokio blocking pool. Noop when `store` is `None` (memory
1186/// mode). Shared by `Ec2Service::save_snapshot` and the CloudFormation
1187/// provisioner persist hook so both route through the same serialize-and-write
1188/// path. Backing containers are not serialized; they are reconciled on restart
1189/// via `Ec2Service::recover_persisted_containers`.
1190pub async fn save_ec2_snapshot(
1191    state: &SharedEc2State,
1192    store: Option<Arc<dyn SnapshotStore>>,
1193    lock: &AsyncMutex<()>,
1194) {
1195    let Some(store) = store else {
1196        return;
1197    };
1198    let _guard = lock.lock().await;
1199    let snapshot = Ec2Snapshot {
1200        schema_version: EC2_SNAPSHOT_SCHEMA_VERSION,
1201        accounts: Some(state.read().clone()),
1202    };
1203    let join = tokio::task::spawn_blocking(move || -> std::io::Result<()> {
1204        let bytes = serde_json::to_vec(&snapshot)
1205            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e.to_string()))?;
1206        store.save(&bytes)
1207    })
1208    .await;
1209    match join {
1210        Ok(Ok(())) => {}
1211        Ok(Err(err)) => tracing::error!(%err, "failed to write ec2 snapshot"),
1212        Err(err) => tracing::error!(%err, "ec2 snapshot task panicked"),
1213    }
1214}
1215
1216#[async_trait]
1217impl AwsService for Ec2Service {
1218    fn service_name(&self) -> &str {
1219        "ec2"
1220    }
1221
1222    fn supported_actions(&self) -> &[&str] {
1223        SUPPORTED_ACTIONS
1224    }
1225
1226    async fn handle(&self, request: AwsRequest) -> Result<AwsResponse, AwsServiceError> {
1227        let mutates = is_mutating_action(&request.action);
1228        let result = match request.action.as_str() {
1229            "CreateTags" => tags::create_tags(self, &request),
1230            "DeleteTags" => tags::delete_tags(self, &request),
1231            "DescribeTags" => tags::describe_tags(self, &request),
1232            "DescribeRegions" => meta::describe_regions(self, &request),
1233            "DescribeAvailabilityZones" => meta::describe_availability_zones(self, &request),
1234            "DescribeAccountAttributes" => meta::describe_account_attributes(self, &request),
1235            "CreateVpc" => vpc::create_vpc(self, &request),
1236            "CreateDefaultVpc" => vpc::create_default_vpc(self, &request),
1237            "DeleteVpc" => vpc::delete_vpc(self, &request),
1238            "DescribeVpcs" => vpc::describe_vpcs(self, &request),
1239            "ModifyVpcAttribute" => vpc::modify_vpc_attribute(self, &request),
1240            "DescribeVpcAttribute" => vpc::describe_vpc_attribute(self, &request),
1241            "ModifyVpcTenancy" => vpc::modify_vpc_tenancy(self, &request),
1242            "AssociateVpcCidrBlock" => vpc::associate_vpc_cidr_block(self, &request),
1243            "DisassociateVpcCidrBlock" => vpc::disassociate_vpc_cidr_block(self, &request),
1244            "CreateDhcpOptions" => dhcp::create_dhcp_options(self, &request),
1245            "DeleteDhcpOptions" => dhcp::delete_dhcp_options(self, &request),
1246            "DescribeDhcpOptions" => dhcp::describe_dhcp_options(self, &request),
1247            "AssociateDhcpOptions" => dhcp::associate_dhcp_options(self, &request),
1248            "CreateSubnet" => subnet::create_subnet(self, &request),
1249            "CreateDefaultSubnet" => subnet::create_default_subnet(self, &request),
1250            "CreateSecondarySubnet" => subnet::create_secondary_subnet(self, &request),
1251            "DeleteSubnet" => subnet::delete_subnet(self, &request),
1252            "DeleteSecondarySubnet" => subnet::delete_secondary_subnet(self, &request),
1253            "DescribeSubnets" => subnet::describe_subnets(self, &request),
1254            "DescribeSecondarySubnets" => subnet::describe_secondary_subnets(self, &request),
1255            "ModifySubnetAttribute" => subnet::modify_subnet_attribute(self, &request),
1256            "AssociateSubnetCidrBlock" => subnet::associate_subnet_cidr_block(self, &request),
1257            "DisassociateSubnetCidrBlock" => subnet::disassociate_subnet_cidr_block(self, &request),
1258            "CreateSubnetCidrReservation" => subnet::create_subnet_cidr_reservation(self, &request),
1259            "DeleteSubnetCidrReservation" => subnet::delete_subnet_cidr_reservation(self, &request),
1260            "GetSubnetCidrReservations" => subnet::get_subnet_cidr_reservations(self, &request),
1261            "CreateSecurityGroup" => sg::create_security_group(self, &request),
1262            "DeleteSecurityGroup" => sg::delete_security_group(self, &request),
1263            "DescribeSecurityGroups" => sg::describe_security_groups(self, &request),
1264            "AuthorizeSecurityGroupIngress" => sg::authorize_security_group_ingress(self, &request),
1265            "AuthorizeSecurityGroupEgress" => sg::authorize_security_group_egress(self, &request),
1266            "RevokeSecurityGroupIngress" => sg::revoke_security_group_ingress(self, &request),
1267            "RevokeSecurityGroupEgress" => sg::revoke_security_group_egress(self, &request),
1268            "DescribeSecurityGroupRules" => sg::describe_security_group_rules(self, &request),
1269            "ModifySecurityGroupRules" => sg::modify_security_group_rules(self, &request),
1270            "UpdateSecurityGroupRuleDescriptionsIngress" => {
1271                sg::update_rule_descriptions_ingress(self, &request)
1272            }
1273            "UpdateSecurityGroupRuleDescriptionsEgress" => {
1274                sg::update_rule_descriptions_egress(self, &request)
1275            }
1276            "AssociateSecurityGroupVpc" => sg::associate_security_group_vpc(self, &request),
1277            "DisassociateSecurityGroupVpc" => sg::disassociate_security_group_vpc(self, &request),
1278            "DescribeSecurityGroupVpcAssociations" => {
1279                sg::describe_security_group_vpc_associations(self, &request)
1280            }
1281            "GetSecurityGroupsForVpc" => sg::get_security_groups_for_vpc(self, &request),
1282            "DescribeStaleSecurityGroups" => sg::describe_stale_security_groups(self, &request),
1283            "DescribeSecurityGroupReferences" => {
1284                sg::describe_security_group_references(self, &request)
1285            }
1286            "CreateRouteTable" => routing::create_route_table(self, &request),
1287            "DeleteRouteTable" => routing::delete_route_table(self, &request),
1288            "DescribeRouteTables" => routing::describe_route_tables(self, &request),
1289            "CreateRoute" => routing::create_route(self, &request),
1290            "DeleteRoute" => routing::delete_route(self, &request),
1291            "ReplaceRoute" => routing::replace_route(self, &request),
1292            "AssociateRouteTable" => routing::associate_route_table(self, &request),
1293            "DisassociateRouteTable" => routing::disassociate_route_table(self, &request),
1294            "ReplaceRouteTableAssociation" => {
1295                routing::replace_route_table_association(self, &request)
1296            }
1297            "CreateInternetGateway" => routing::create_internet_gateway(self, &request),
1298            "DeleteInternetGateway" => routing::delete_internet_gateway(self, &request),
1299            "DescribeInternetGateways" => routing::describe_internet_gateways(self, &request),
1300            "AttachInternetGateway" => routing::attach_internet_gateway(self, &request),
1301            "DetachInternetGateway" => routing::detach_internet_gateway(self, &request),
1302            "CreateEgressOnlyInternetGateway" => routing::create_egress_only_igw(self, &request),
1303            "DeleteEgressOnlyInternetGateway" => routing::delete_egress_only_igw(self, &request),
1304            "DescribeEgressOnlyInternetGateways" => {
1305                routing::describe_egress_only_igws(self, &request)
1306            }
1307            "CreateNatGateway" => routing::create_nat_gateway(self, &request),
1308            "DeleteNatGateway" => routing::delete_nat_gateway(self, &request),
1309            "DescribeNatGateways" => routing::describe_nat_gateways(self, &request),
1310            "AssignPrivateNatGatewayAddress" => {
1311                routing::assign_private_nat_gateway_address(self, &request)
1312            }
1313            "AssociateNatGatewayAddress" => routing::associate_nat_gateway_address(self, &request),
1314            "DisassociateNatGatewayAddress" => {
1315                routing::disassociate_nat_gateway_address(self, &request)
1316            }
1317            "UnassignPrivateNatGatewayAddress" => {
1318                routing::unassign_private_nat_gateway_address(self, &request)
1319            }
1320            "AllocateAddress" => eip::allocate_address(self, &request),
1321            "ReleaseAddress" => eip::release_address(self, &request),
1322            "DescribeAddresses" => eip::describe_addresses(self, &request),
1323            "AssociateAddress" => eip::associate_address(self, &request),
1324            "DisassociateAddress" => eip::disassociate_address(self, &request),
1325            "DescribeAddressesAttribute" => eip::describe_addresses_attribute(self, &request),
1326            "ModifyAddressAttribute" => eip::modify_address_attribute(self, &request),
1327            "ResetAddressAttribute" => eip::reset_address_attribute(self, &request),
1328            "MoveAddressToVpc" => eip::move_address_to_vpc(self, &request),
1329            "RestoreAddressToClassic" => eip::restore_address_to_classic(self, &request),
1330            "AcceptAddressTransfer" => eip::accept_address_transfer(self, &request),
1331            "EnableAddressTransfer" => eip::enable_address_transfer(self, &request),
1332            "DisableAddressTransfer" => eip::disable_address_transfer(self, &request),
1333            "DescribeAddressTransfers" => eip::describe_address_transfers(self, &request),
1334            "DescribeMovingAddresses" => eip::describe_moving_addresses(self, &request),
1335            "CreateKeyPair" => eip::create_key_pair(self, &request),
1336            "ImportKeyPair" => eip::import_key_pair(self, &request),
1337            "DeleteKeyPair" => eip::delete_key_pair(self, &request),
1338            "DescribeKeyPairs" => eip::describe_key_pairs(self, &request),
1339            "CreatePlacementGroup" => eip::create_placement_group(self, &request),
1340            "DeletePlacementGroup" => eip::delete_placement_group(self, &request),
1341            "DescribePlacementGroups" => eip::describe_placement_groups(self, &request),
1342            "GetGroupsForCapacityReservation" => {
1343                eip::get_groups_for_capacity_reservation(self, &request)
1344            }
1345            "CreateNetworkInterface" => eni::create_network_interface(self, &request),
1346            "DeleteNetworkInterface" => eni::delete_network_interface(self, &request),
1347            "DescribeNetworkInterfaces" => eni::describe_network_interfaces(self, &request),
1348            "AttachNetworkInterface" => eni::attach_network_interface(self, &request),
1349            "DetachNetworkInterface" => eni::detach_network_interface(self, &request),
1350            "ModifyNetworkInterfaceAttribute" => {
1351                eni::modify_network_interface_attribute(self, &request)
1352            }
1353            "ResetNetworkInterfaceAttribute" => {
1354                eni::reset_network_interface_attribute(self, &request)
1355            }
1356            "DescribeNetworkInterfaceAttribute" => {
1357                eni::describe_network_interface_attribute(self, &request)
1358            }
1359            "CreateNetworkInterfacePermission" => {
1360                eni::create_network_interface_permission(self, &request)
1361            }
1362            "DeleteNetworkInterfacePermission" => {
1363                eni::delete_network_interface_permission(self, &request)
1364            }
1365            "DescribeNetworkInterfacePermissions" => {
1366                eni::describe_network_interface_permissions(self, &request)
1367            }
1368            "AssignPrivateIpAddresses" => eni::assign_private_ip_addresses(self, &request),
1369            "UnassignPrivateIpAddresses" => eni::unassign_private_ip_addresses(self, &request),
1370            "AssignIpv6Addresses" => eni::assign_ipv6_addresses(self, &request),
1371            "UnassignIpv6Addresses" => eni::unassign_ipv6_addresses(self, &request),
1372            "RunInstances" => instance::run_instances(self, &request).await,
1373            "StartInstances" => instance::start_instances(self, &request).await,
1374            "StopInstances" => instance::stop_instances(self, &request).await,
1375            "RebootInstances" => instance::reboot_instances(self, &request).await,
1376            "TerminateInstances" => instance::terminate_instances(self, &request).await,
1377            "MonitorInstances" => instance::monitor_instances(self, &request),
1378            "UnmonitorInstances" => instance::unmonitor_instances(self, &request),
1379            "DescribeInstances" => instance::describe_instances(self, &request),
1380            "DescribeInstanceStatus" => instance::describe_instance_status(self, &request),
1381            "DescribeInstanceTypes" => instance::describe_instance_types(self, &request),
1382            "GetInstanceTypesFromInstanceRequirements" => {
1383                instance::get_instance_types_from_requirements(self, &request)
1384            }
1385            "DescribeInstanceAttribute" => instance::describe_instance_attribute(self, &request),
1386            "ModifyInstanceAttribute" => instance::modify_instance_attribute(self, &request),
1387            "ResetInstanceAttribute" => instance::reset_instance_attribute(self, &request),
1388            "ModifyInstancePlacement" => instance::modify_instance_placement(self, &request),
1389            "ModifyInstanceMetadataOptions" => {
1390                instance::modify_instance_metadata_options(self, &request)
1391            }
1392            "ModifyInstanceMaintenanceOptions" => {
1393                instance::modify_instance_maintenance_options(self, &request)
1394            }
1395            "ModifyInstanceCpuOptions" => instance::modify_instance_cpu_options(self, &request),
1396            "ModifyInstanceNetworkPerformanceOptions" => {
1397                instance::modify_instance_network_performance_options(self, &request)
1398            }
1399            "ModifyInstanceEventStartTime" => {
1400                instance::modify_instance_event_start_time(self, &request)
1401            }
1402            "DescribeInstanceCreditSpecifications" => {
1403                instance::describe_instance_credit_specifications(self, &request)
1404            }
1405            "ModifyInstanceCreditSpecification" => {
1406                instance::modify_instance_credit_specification(self, &request)
1407            }
1408            "GetInstanceMetadataDefaults" => {
1409                instance::get_instance_metadata_defaults(self, &request)
1410            }
1411            "ModifyInstanceMetadataDefaults" => {
1412                instance::modify_instance_metadata_defaults(self, &request)
1413            }
1414            "RegisterInstanceEventNotificationAttributes" => {
1415                instance::register_event_notification_attributes(self, &request)
1416            }
1417            "DeregisterInstanceEventNotificationAttributes" => {
1418                instance::deregister_event_notification_attributes(self, &request)
1419            }
1420            "DescribeInstanceEventNotificationAttributes" => {
1421                instance::describe_event_notification_attributes(self, &request)
1422            }
1423            "ReportInstanceStatus" => instance::report_instance_status(self, &request),
1424            "DescribeInstanceTopology" => instance::describe_instance_topology(self, &request),
1425            "CreateVolume" => volume::create_volume(self, &request),
1426            "DeleteVolume" => volume::delete_volume(self, &request),
1427            "DescribeVolumes" => volume::describe_volumes(self, &request),
1428            "AttachVolume" => volume::attach_volume(self, &request),
1429            "DetachVolume" => volume::detach_volume(self, &request),
1430            "ModifyVolume" => volume::modify_volume(self, &request),
1431            "DescribeVolumesModifications" => {
1432                volume::describe_volumes_modifications(self, &request)
1433            }
1434            "DescribeVolumeStatus" => volume::describe_volume_status(self, &request),
1435            "DescribeVolumeAttribute" => volume::describe_volume_attribute(self, &request),
1436            "ModifyVolumeAttribute" => volume::modify_volume_attribute(self, &request),
1437            "EnableVolumeIO" => volume::enable_volume_io(self, &request),
1438            "ListVolumesInRecycleBin" => volume::list_volumes_in_recycle_bin(self, &request),
1439            "RestoreVolumeFromRecycleBin" => {
1440                volume::restore_volume_from_recycle_bin(self, &request)
1441            }
1442            "GetEbsEncryptionByDefault" => volume::get_ebs_encryption_by_default(self, &request),
1443            "EnableEbsEncryptionByDefault" => {
1444                volume::enable_ebs_encryption_by_default(self, &request)
1445            }
1446            "DisableEbsEncryptionByDefault" => {
1447                volume::disable_ebs_encryption_by_default(self, &request)
1448            }
1449            "GetEbsDefaultKmsKeyId" => volume::get_ebs_default_kms_key_id(self, &request),
1450            "ModifyEbsDefaultKmsKeyId" => volume::modify_ebs_default_kms_key_id(self, &request),
1451            "ResetEbsDefaultKmsKeyId" => volume::reset_ebs_default_kms_key_id(self, &request),
1452            "CreateSnapshot" => snapshot::create_snapshot(self, &request),
1453            "CreateSnapshots" => snapshot::create_snapshots(self, &request),
1454            "DeleteSnapshot" => snapshot::delete_snapshot(self, &request),
1455            "DescribeSnapshots" => snapshot::describe_snapshots(self, &request),
1456            "CopySnapshot" => snapshot::copy_snapshot(self, &request),
1457            "DescribeSnapshotAttribute" => snapshot::describe_snapshot_attribute(self, &request),
1458            "ModifySnapshotAttribute" => snapshot::modify_snapshot_attribute(self, &request),
1459            "ResetSnapshotAttribute" => snapshot::reset_snapshot_attribute(self, &request),
1460            "ModifySnapshotTier" => snapshot::modify_snapshot_tier(self, &request),
1461            "DescribeSnapshotTierStatus" => snapshot::describe_snapshot_tier_status(self, &request),
1462            "RestoreSnapshotTier" => snapshot::restore_snapshot_tier(self, &request),
1463            "ListSnapshotsInRecycleBin" => snapshot::list_snapshots_in_recycle_bin(self, &request),
1464            "RestoreSnapshotFromRecycleBin" => {
1465                snapshot::restore_snapshot_from_recycle_bin(self, &request)
1466            }
1467            "LockSnapshot" => snapshot::lock_snapshot(self, &request),
1468            "UnlockSnapshot" => snapshot::unlock_snapshot(self, &request),
1469            "DescribeLockedSnapshots" => snapshot::describe_locked_snapshots(self, &request),
1470            "GetSnapshotBlockPublicAccessState" => {
1471                snapshot::get_snapshot_block_public_access_state(self, &request)
1472            }
1473            "EnableSnapshotBlockPublicAccess" => {
1474                snapshot::enable_snapshot_block_public_access(self, &request)
1475            }
1476            "DisableSnapshotBlockPublicAccess" => {
1477                snapshot::disable_snapshot_block_public_access(self, &request)
1478            }
1479            "EnableFastSnapshotRestores" => snapshot::enable_fast_snapshot_restores(self, &request),
1480            "DisableFastSnapshotRestores" => {
1481                snapshot::disable_fast_snapshot_restores(self, &request)
1482            }
1483            "DescribeFastSnapshotRestores" => {
1484                snapshot::describe_fast_snapshot_restores(self, &request)
1485            }
1486            "CreateImage" => image::create_image(self, &request),
1487            "RegisterImage" => image::register_image(self, &request),
1488            "DeregisterImage" => image::deregister_image(self, &request),
1489            "DescribeImages" => image::describe_images(self, &request),
1490            "CopyImage" => image::copy_image(self, &request),
1491            "DescribeImageAttribute" => image::describe_image_attribute(self, &request),
1492            "ModifyImageAttribute" => image::modify_image_attribute(self, &request),
1493            "ResetImageAttribute" => image::reset_image_attribute(self, &request),
1494            "EnableImage" => image::enable_image(self, &request),
1495            "DisableImage" => image::disable_image(self, &request),
1496            "AttachImageWatermark" => image::attach_image_watermark(self, &request),
1497            "DetachImageWatermark" => image::detach_image_watermark(self, &request),
1498            "EnableImageDeprecation" => image::enable_image_deprecation(self, &request),
1499            "DisableImageDeprecation" => image::disable_image_deprecation(self, &request),
1500            "EnableImageDeregistrationProtection" => {
1501                image::enable_image_deregistration_protection(self, &request)
1502            }
1503            "DisableImageDeregistrationProtection" => {
1504                image::disable_image_deregistration_protection(self, &request)
1505            }
1506            "CancelImageLaunchPermission" => image::cancel_image_launch_permission(self, &request),
1507            "RestoreImageFromRecycleBin" => image::restore_image_from_recycle_bin(self, &request),
1508            "ListImagesInRecycleBin" => image::list_images_in_recycle_bin(self, &request),
1509            "EnableImageBlockPublicAccess" => {
1510                image::enable_image_block_public_access(self, &request)
1511            }
1512            "DisableImageBlockPublicAccess" => {
1513                image::disable_image_block_public_access(self, &request)
1514            }
1515            "GetImageBlockPublicAccessState" => {
1516                image::get_image_block_public_access_state(self, &request)
1517            }
1518            "EnableAllowedImagesSettings" => image::enable_allowed_images_settings(self, &request),
1519            "DisableAllowedImagesSettings" => {
1520                image::disable_allowed_images_settings(self, &request)
1521            }
1522            "GetAllowedImagesSettings" => image::get_allowed_images_settings(self, &request),
1523            "ReplaceImageCriteriaInAllowedImagesSettings" => {
1524                image::replace_image_criteria_in_allowed_images_settings(self, &request)
1525            }
1526            "CreateStoreImageTask" => image::create_store_image_task(self, &request),
1527            "DescribeStoreImageTasks" => image::describe_store_image_tasks(self, &request),
1528            "CreateRestoreImageTask" => image::create_restore_image_task(self, &request),
1529            "DescribeFastLaunchImages" => image::describe_fast_launch_images(self, &request),
1530            "CreateNetworkAcl" => nacl::create_network_acl(self, &request),
1531            "DeleteNetworkAcl" => nacl::delete_network_acl(self, &request),
1532            "DescribeNetworkAcls" => nacl::describe_network_acls(self, &request),
1533            "CreateNetworkAclEntry" => nacl::create_network_acl_entry(self, &request),
1534            "DeleteNetworkAclEntry" => nacl::delete_network_acl_entry(self, &request),
1535            "ReplaceNetworkAclEntry" => nacl::replace_network_acl_entry(self, &request),
1536            "ReplaceNetworkAclAssociation" => nacl::replace_network_acl_association(self, &request),
1537            "CreateVpcPeeringConnection" => nacl::create_vpc_peering_connection(self, &request),
1538            "DeleteVpcPeeringConnection" => nacl::delete_vpc_peering_connection(self, &request),
1539            "DescribeVpcPeeringConnections" => {
1540                nacl::describe_vpc_peering_connections(self, &request)
1541            }
1542            "AcceptVpcPeeringConnection" => nacl::accept_vpc_peering_connection(self, &request),
1543            "RejectVpcPeeringConnection" => nacl::reject_vpc_peering_connection(self, &request),
1544            "ModifyVpcPeeringConnectionOptions" => {
1545                nacl::modify_vpc_peering_connection_options(self, &request)
1546            }
1547            "CreateVpcEndpoint" => endpoint::create_vpc_endpoint(self, &request),
1548            "DeleteVpcEndpoints" => endpoint::delete_vpc_endpoints(self, &request),
1549            "DescribeVpcEndpoints" => endpoint::describe_vpc_endpoints(self, &request),
1550            "ModifyVpcEndpoint" => endpoint::modify_vpc_endpoint(self, &request),
1551            "DescribeVpcEndpointServices" => {
1552                endpoint::describe_vpc_endpoint_services(self, &request)
1553            }
1554            "DescribeVpcEndpointConnections" => {
1555                endpoint::describe_vpc_endpoint_connections(self, &request)
1556            }
1557            "AcceptVpcEndpointConnections" => {
1558                endpoint::accept_vpc_endpoint_connections(self, &request)
1559            }
1560            "RejectVpcEndpointConnections" => {
1561                endpoint::reject_vpc_endpoint_connections(self, &request)
1562            }
1563            "CreateVpcEndpointServiceConfiguration" => {
1564                endpoint::create_vpc_endpoint_service_configuration(self, &request)
1565            }
1566            "DeleteVpcEndpointServiceConfigurations" => {
1567                endpoint::delete_vpc_endpoint_service_configurations(self, &request)
1568            }
1569            "DescribeVpcEndpointServiceConfigurations" => {
1570                endpoint::describe_vpc_endpoint_service_configurations(self, &request)
1571            }
1572            "ModifyVpcEndpointServiceConfiguration" => {
1573                endpoint::modify_vpc_endpoint_service_configuration(self, &request)
1574            }
1575            "DescribeVpcEndpointServicePermissions" => {
1576                endpoint::describe_vpc_endpoint_service_permissions(self, &request)
1577            }
1578            "ModifyVpcEndpointServicePermissions" => {
1579                endpoint::modify_vpc_endpoint_service_permissions(self, &request)
1580            }
1581            "ModifyVpcEndpointServicePayerResponsibility" => {
1582                endpoint::modify_vpc_endpoint_service_payer_responsibility(self, &request)
1583            }
1584            "StartVpcEndpointServicePrivateDnsVerification" => {
1585                endpoint::start_vpc_endpoint_service_private_dns_verification(self, &request)
1586            }
1587            "CreateVpcEndpointConnectionNotification" => {
1588                endpoint::create_vpc_endpoint_connection_notification(self, &request)
1589            }
1590            "DeleteVpcEndpointConnectionNotifications" => {
1591                endpoint::delete_vpc_endpoint_connection_notifications(self, &request)
1592            }
1593            "DescribeVpcEndpointConnectionNotifications" => {
1594                endpoint::describe_vpc_endpoint_connection_notifications(self, &request)
1595            }
1596            "ModifyVpcEndpointConnectionNotification" => {
1597                endpoint::modify_vpc_endpoint_connection_notification(self, &request)
1598            }
1599            "DescribeVpcEndpointAssociations" => {
1600                endpoint::describe_vpc_endpoint_associations(self, &request)
1601            }
1602            "CreateFlowLogs" => endpoint::create_flow_logs(self, &request),
1603            "DeleteFlowLogs" => endpoint::delete_flow_logs(self, &request),
1604            "DescribeFlowLogs" => endpoint::describe_flow_logs(self, &request),
1605            "GetFlowLogsIntegrationTemplate" => {
1606                endpoint::get_flow_logs_integration_template(self, &request)
1607            }
1608            "CreateLaunchTemplate" => fleet::create_launch_template(self, &request),
1609            "CreateLaunchTemplateVersion" => fleet::create_launch_template_version(self, &request),
1610            "DeleteLaunchTemplate" => fleet::delete_launch_template(self, &request),
1611            "DeleteLaunchTemplateVersions" => {
1612                fleet::delete_launch_template_versions(self, &request)
1613            }
1614            "DescribeLaunchTemplates" => fleet::describe_launch_templates(self, &request),
1615            "DescribeLaunchTemplateVersions" => {
1616                fleet::describe_launch_template_versions(self, &request)
1617            }
1618            "GetLaunchTemplateData" => fleet::get_launch_template_data(self, &request),
1619            "ModifyLaunchTemplate" => fleet::modify_launch_template(self, &request),
1620            "RequestSpotInstances" => fleet::request_spot_instances(self, &request),
1621            "DescribeSpotInstanceRequests" => {
1622                fleet::describe_spot_instance_requests(self, &request)
1623            }
1624            "CancelSpotInstanceRequests" => fleet::cancel_spot_instance_requests(self, &request),
1625            "RequestSpotFleet" => fleet::request_spot_fleet(self, &request),
1626            "DescribeSpotFleetRequests" => fleet::describe_spot_fleet_requests(self, &request),
1627            "CancelSpotFleetRequests" => fleet::cancel_spot_fleet_requests(self, &request),
1628            "ModifySpotFleetRequest" => fleet::modify_spot_fleet_request(self, &request),
1629            "DescribeSpotFleetInstances" => fleet::describe_spot_fleet_instances(self, &request),
1630            "DescribeSpotFleetRequestHistory" => {
1631                fleet::describe_spot_fleet_request_history(self, &request)
1632            }
1633            "DescribeSpotPriceHistory" => fleet::describe_spot_price_history(self, &request),
1634            "GetSpotPlacementScores" => fleet::get_spot_placement_scores(self, &request),
1635            "CreateSpotDatafeedSubscription" => {
1636                fleet::create_spot_datafeed_subscription(self, &request)
1637            }
1638            "DeleteSpotDatafeedSubscription" => {
1639                fleet::delete_spot_datafeed_subscription(self, &request)
1640            }
1641            "DescribeSpotDatafeedSubscription" => {
1642                fleet::describe_spot_datafeed_subscription(self, &request)
1643            }
1644            "CreateFleet" => fleet::create_fleet(self, &request),
1645            "DeleteFleets" => fleet::delete_fleets(self, &request),
1646            "DescribeFleets" => fleet::describe_fleets(self, &request),
1647            "ModifyFleet" => fleet::modify_fleet(self, &request),
1648            "DescribeFleetHistory" => fleet::describe_fleet_history(self, &request),
1649            "DescribeFleetInstances" => fleet::describe_fleet_instances(self, &request),
1650            "CreateCapacityReservation" => capacity::create_capacity_reservation(self, &request),
1651            "CancelCapacityReservation" => capacity::cancel_capacity_reservation(self, &request),
1652            "DescribeCapacityReservations" => {
1653                capacity::describe_capacity_reservations(self, &request)
1654            }
1655            "ModifyCapacityReservation" => capacity::modify_capacity_reservation(self, &request),
1656            "GetCapacityReservationUsage" => {
1657                capacity::get_capacity_reservation_usage(self, &request)
1658            }
1659            "CreateCapacityReservationFleet" => {
1660                capacity::create_capacity_reservation_fleet(self, &request)
1661            }
1662            "CancelCapacityReservationFleets" => {
1663                capacity::cancel_capacity_reservation_fleets(self, &request)
1664            }
1665            "DescribeCapacityReservationFleets" => {
1666                capacity::describe_capacity_reservation_fleets(self, &request)
1667            }
1668            "ModifyCapacityReservationFleet" => {
1669                capacity::modify_capacity_reservation_fleet(self, &request)
1670            }
1671            "ModifyInstanceCapacityReservationAttributes" => {
1672                capacity::modify_instance_capacity_reservation_attributes(self, &request)
1673            }
1674            "CreateCapacityReservationBySplitting" => {
1675                capacity::create_capacity_reservation_by_splitting(self, &request)
1676            }
1677            "MoveCapacityReservationInstances" => {
1678                capacity::move_capacity_reservation_instances(self, &request)
1679            }
1680            "DescribeCapacityReservationBillingRequests" => {
1681                capacity::describe_capacity_reservation_billing_requests(self, &request)
1682            }
1683            "AssociateCapacityReservationBillingOwner" => {
1684                capacity::associate_capacity_reservation_billing_owner(self, &request)
1685            }
1686            "DisassociateCapacityReservationBillingOwner" => {
1687                capacity::disassociate_capacity_reservation_billing_owner(self, &request)
1688            }
1689            "AcceptCapacityReservationBillingOwnership" => {
1690                capacity::accept_capacity_reservation_billing_ownership(self, &request)
1691            }
1692            "RejectCapacityReservationBillingOwnership" => {
1693                capacity::reject_capacity_reservation_billing_ownership(self, &request)
1694            }
1695            "DescribeCapacityBlockOfferings" => {
1696                capacity::describe_capacity_block_offerings(self, &request)
1697            }
1698            "DescribeCapacityBlocks" => capacity::describe_capacity_blocks(self, &request),
1699            "PurchaseCapacityBlock" => capacity::purchase_capacity_block(self, &request),
1700            "DescribeCapacityBlockStatus" => {
1701                capacity::describe_capacity_block_status(self, &request)
1702            }
1703            "DescribeCapacityBlockExtensionHistory" => {
1704                capacity::describe_capacity_block_extension_history(self, &request)
1705            }
1706            "DescribeCapacityBlockExtensionOfferings" => {
1707                capacity::describe_capacity_block_extension_offerings(self, &request)
1708            }
1709            "PurchaseCapacityBlockExtension" => {
1710                capacity::purchase_capacity_block_extension(self, &request)
1711            }
1712            "DescribeCapacityReservationTopology" => {
1713                capacity::describe_capacity_reservation_topology(self, &request)
1714            }
1715            "CreateInterruptibleCapacityReservationAllocation" => {
1716                capacity::create_interruptible_capacity_reservation_allocation(self, &request)
1717            }
1718            "UpdateInterruptibleCapacityReservationAllocation" => {
1719                capacity::update_interruptible_capacity_reservation_allocation(self, &request)
1720            }
1721            "DescribeReservedInstances" => reserved::describe_reserved_instances(self, &request),
1722            "DescribeReservedInstancesOfferings" => {
1723                reserved::describe_reserved_instances_offerings(self, &request)
1724            }
1725            "PurchaseReservedInstancesOffering" => {
1726                reserved::purchase_reserved_instances_offering(self, &request)
1727            }
1728            "DescribeReservedInstancesListings" => {
1729                reserved::describe_reserved_instances_listings(self, &request)
1730            }
1731            "CreateReservedInstancesListing" => {
1732                reserved::create_reserved_instances_listing(self, &request)
1733            }
1734            "CancelReservedInstancesListing" => {
1735                reserved::cancel_reserved_instances_listing(self, &request)
1736            }
1737            "DescribeReservedInstancesModifications" => {
1738                reserved::describe_reserved_instances_modifications(self, &request)
1739            }
1740            "ModifyReservedInstances" => reserved::modify_reserved_instances(self, &request),
1741            "GetReservedInstancesExchangeQuote" => {
1742                reserved::get_reserved_instances_exchange_quote(self, &request)
1743            }
1744            "AcceptReservedInstancesExchangeQuote" => {
1745                reserved::accept_reserved_instances_exchange_quote(self, &request)
1746            }
1747            "DeleteQueuedReservedInstances" => {
1748                reserved::delete_queued_reserved_instances(self, &request)
1749            }
1750            "AllocateHosts" => reserved::allocate_hosts(self, &request),
1751            "DescribeHosts" => reserved::describe_hosts(self, &request),
1752            "ModifyHosts" => reserved::modify_hosts(self, &request),
1753            "ReleaseHosts" => reserved::release_hosts(self, &request),
1754            "DescribeMacHosts" => reserved::describe_mac_hosts(self, &request),
1755            "CreateTransitGateway" => tgw::create_transit_gateway(self, &request),
1756            "DeleteTransitGateway" => tgw::delete_transit_gateway(self, &request),
1757            "DescribeTransitGateways" => tgw::describe_transit_gateways(self, &request),
1758            "ModifyTransitGateway" => tgw::modify_transit_gateway(self, &request),
1759            "CreateTransitGatewayVpcAttachment" => {
1760                tgw::create_transit_gateway_vpc_attachment(self, &request)
1761            }
1762            "DeleteTransitGatewayVpcAttachment" => {
1763                tgw::delete_transit_gateway_vpc_attachment(self, &request)
1764            }
1765            "DescribeTransitGatewayVpcAttachments" => {
1766                tgw::describe_transit_gateway_vpc_attachments(self, &request)
1767            }
1768            "ModifyTransitGatewayVpcAttachment" => {
1769                tgw::modify_transit_gateway_vpc_attachment(self, &request)
1770            }
1771            "AcceptTransitGatewayVpcAttachment" => {
1772                tgw::accept_transit_gateway_vpc_attachment(self, &request)
1773            }
1774            "RejectTransitGatewayVpcAttachment" => {
1775                tgw::reject_transit_gateway_vpc_attachment(self, &request)
1776            }
1777            "DescribeTransitGatewayAttachments" => {
1778                tgw::describe_transit_gateway_attachments(self, &request)
1779            }
1780            "CreateTransitGatewayRouteTable" => {
1781                tgw::create_transit_gateway_route_table(self, &request)
1782            }
1783            "DeleteTransitGatewayRouteTable" => {
1784                tgw::delete_transit_gateway_route_table(self, &request)
1785            }
1786            "DescribeTransitGatewayRouteTables" => {
1787                tgw::describe_transit_gateway_route_tables(self, &request)
1788            }
1789            "AssociateTransitGatewayRouteTable" => {
1790                tgw::associate_transit_gateway_route_table(self, &request)
1791            }
1792            "DisassociateTransitGatewayRouteTable" => {
1793                tgw::disassociate_transit_gateway_route_table(self, &request)
1794            }
1795            "EnableTransitGatewayRouteTablePropagation" => {
1796                tgw::enable_transit_gateway_route_table_propagation(self, &request)
1797            }
1798            "DisableTransitGatewayRouteTablePropagation" => {
1799                tgw::disable_transit_gateway_route_table_propagation(self, &request)
1800            }
1801            "CreateTransitGatewayRoute" => tgw::create_transit_gateway_route(self, &request),
1802            "DeleteTransitGatewayRoute" => tgw::delete_transit_gateway_route(self, &request),
1803            "ReplaceTransitGatewayRoute" => tgw::replace_transit_gateway_route(self, &request),
1804            "SearchTransitGatewayRoutes" => tgw::search_transit_gateway_routes(self, &request),
1805            "ExportTransitGatewayRoutes" => tgw::export_transit_gateway_routes(self, &request),
1806            "GetTransitGatewayRouteTableAssociations" => {
1807                tgw::get_transit_gateway_route_table_associations(self, &request)
1808            }
1809            "GetTransitGatewayRouteTablePropagations" => {
1810                tgw::get_transit_gateway_route_table_propagations(self, &request)
1811            }
1812            "GetTransitGatewayAttachmentPropagations" => {
1813                tgw::get_transit_gateway_attachment_propagations(self, &request)
1814            }
1815            "CreateTransitGatewayPrefixListReference" => {
1816                tgw::create_transit_gateway_prefix_list_reference(self, &request)
1817            }
1818            "DeleteTransitGatewayPrefixListReference" => {
1819                tgw::delete_transit_gateway_prefix_list_reference(self, &request)
1820            }
1821            "ModifyTransitGatewayPrefixListReference" => {
1822                tgw::modify_transit_gateway_prefix_list_reference(self, &request)
1823            }
1824            "GetTransitGatewayPrefixListReferences" => {
1825                tgw::get_transit_gateway_prefix_list_references(self, &request)
1826            }
1827            "CreateTransitGatewayPeeringAttachment" => {
1828                tgw_peering::create_transit_gateway_peering_attachment(self, &request)
1829            }
1830            "DeleteTransitGatewayPeeringAttachment" => {
1831                tgw_peering::delete_transit_gateway_peering_attachment(self, &request)
1832            }
1833            "DescribeTransitGatewayPeeringAttachments" => {
1834                tgw_peering::describe_transit_gateway_peering_attachments(self, &request)
1835            }
1836            "AcceptTransitGatewayPeeringAttachment" => {
1837                tgw_peering::accept_transit_gateway_peering_attachment(self, &request)
1838            }
1839            "RejectTransitGatewayPeeringAttachment" => {
1840                tgw_peering::reject_transit_gateway_peering_attachment(self, &request)
1841            }
1842            "CreateTransitGatewayConnect" => {
1843                tgw_peering::create_transit_gateway_connect(self, &request)
1844            }
1845            "DeleteTransitGatewayConnect" => {
1846                tgw_peering::delete_transit_gateway_connect(self, &request)
1847            }
1848            "DescribeTransitGatewayConnects" => {
1849                tgw_peering::describe_transit_gateway_connects(self, &request)
1850            }
1851            "CreateTransitGatewayConnectPeer" => {
1852                tgw_peering::create_transit_gateway_connect_peer(self, &request)
1853            }
1854            "DeleteTransitGatewayConnectPeer" => {
1855                tgw_peering::delete_transit_gateway_connect_peer(self, &request)
1856            }
1857            "DescribeTransitGatewayConnectPeers" => {
1858                tgw_peering::describe_transit_gateway_connect_peers(self, &request)
1859            }
1860            "CreateTransitGatewayPolicyTable" => {
1861                tgw_peering::create_transit_gateway_policy_table(self, &request)
1862            }
1863            "DeleteTransitGatewayPolicyTable" => {
1864                tgw_peering::delete_transit_gateway_policy_table(self, &request)
1865            }
1866            "DescribeTransitGatewayPolicyTables" => {
1867                tgw_peering::describe_transit_gateway_policy_tables(self, &request)
1868            }
1869            "AssociateTransitGatewayPolicyTable" => {
1870                tgw_peering::associate_transit_gateway_policy_table(self, &request)
1871            }
1872            "DisassociateTransitGatewayPolicyTable" => {
1873                tgw_peering::disassociate_transit_gateway_policy_table(self, &request)
1874            }
1875            "GetTransitGatewayPolicyTableAssociations" => {
1876                tgw_peering::get_transit_gateway_policy_table_associations(self, &request)
1877            }
1878            "GetTransitGatewayPolicyTableEntries" => {
1879                tgw_peering::get_transit_gateway_policy_table_entries(self, &request)
1880            }
1881            "CreateTransitGatewayRouteTableAnnouncement" => {
1882                tgw_peering::create_transit_gateway_route_table_announcement(self, &request)
1883            }
1884            "DeleteTransitGatewayRouteTableAnnouncement" => {
1885                tgw_peering::delete_transit_gateway_route_table_announcement(self, &request)
1886            }
1887            "DescribeTransitGatewayRouteTableAnnouncements" => {
1888                tgw_peering::describe_transit_gateway_route_table_announcements(self, &request)
1889            }
1890            "CreateTransitGatewayMulticastDomain" => {
1891                tgw_mcast::create_transit_gateway_multicast_domain(self, &request)
1892            }
1893            "DeleteTransitGatewayMulticastDomain" => {
1894                tgw_mcast::delete_transit_gateway_multicast_domain(self, &request)
1895            }
1896            "DescribeTransitGatewayMulticastDomains" => {
1897                tgw_mcast::describe_transit_gateway_multicast_domains(self, &request)
1898            }
1899            "AssociateTransitGatewayMulticastDomain" => {
1900                tgw_mcast::associate_transit_gateway_multicast_domain(self, &request)
1901            }
1902            "DisassociateTransitGatewayMulticastDomain" => {
1903                tgw_mcast::disassociate_transit_gateway_multicast_domain(self, &request)
1904            }
1905            "AcceptTransitGatewayMulticastDomainAssociations" => {
1906                tgw_mcast::accept_transit_gateway_multicast_domain_associations(self, &request)
1907            }
1908            "RejectTransitGatewayMulticastDomainAssociations" => {
1909                tgw_mcast::reject_transit_gateway_multicast_domain_associations(self, &request)
1910            }
1911            "GetTransitGatewayMulticastDomainAssociations" => {
1912                tgw_mcast::get_transit_gateway_multicast_domain_associations(self, &request)
1913            }
1914            "RegisterTransitGatewayMulticastGroupMembers" => {
1915                tgw_mcast::register_transit_gateway_multicast_group_members(self, &request)
1916            }
1917            "RegisterTransitGatewayMulticastGroupSources" => {
1918                tgw_mcast::register_transit_gateway_multicast_group_sources(self, &request)
1919            }
1920            "DeregisterTransitGatewayMulticastGroupMembers" => {
1921                tgw_mcast::deregister_transit_gateway_multicast_group_members(self, &request)
1922            }
1923            "DeregisterTransitGatewayMulticastGroupSources" => {
1924                tgw_mcast::deregister_transit_gateway_multicast_group_sources(self, &request)
1925            }
1926            "SearchTransitGatewayMulticastGroups" => {
1927                tgw_mcast::search_transit_gateway_multicast_groups(self, &request)
1928            }
1929            "CreateTransitGatewayMeteringPolicy" => {
1930                tgw_mcast::create_transit_gateway_metering_policy(self, &request)
1931            }
1932            "DeleteTransitGatewayMeteringPolicy" => {
1933                tgw_mcast::delete_transit_gateway_metering_policy(self, &request)
1934            }
1935            "DescribeTransitGatewayMeteringPolicies" => {
1936                tgw_mcast::describe_transit_gateway_metering_policies(self, &request)
1937            }
1938            "ModifyTransitGatewayMeteringPolicy" => {
1939                tgw_mcast::modify_transit_gateway_metering_policy(self, &request)
1940            }
1941            "CreateTransitGatewayMeteringPolicyEntry" => {
1942                tgw_mcast::create_transit_gateway_metering_policy_entry(self, &request)
1943            }
1944            "DeleteTransitGatewayMeteringPolicyEntry" => {
1945                tgw_mcast::delete_transit_gateway_metering_policy_entry(self, &request)
1946            }
1947            "GetTransitGatewayMeteringPolicyEntries" => {
1948                tgw_mcast::get_transit_gateway_metering_policy_entries(self, &request)
1949            }
1950            "AcceptTransitGatewayClientVpnAttachment" => {
1951                tgw_mcast::accept_transit_gateway_client_vpn_attachment(self, &request)
1952            }
1953            "DeleteTransitGatewayClientVpnAttachment" => {
1954                tgw_mcast::delete_transit_gateway_client_vpn_attachment(self, &request)
1955            }
1956            "RejectTransitGatewayClientVpnAttachment" => {
1957                tgw_mcast::reject_transit_gateway_client_vpn_attachment(self, &request)
1958            }
1959            "CreateCustomerGateway" => vpn::create_customer_gateway(self, &request),
1960            "DeleteCustomerGateway" => vpn::delete_customer_gateway(self, &request),
1961            "DescribeCustomerGateways" => vpn::describe_customer_gateways(self, &request),
1962            "CreateVpnGateway" => vpn::create_vpn_gateway(self, &request),
1963            "DeleteVpnGateway" => vpn::delete_vpn_gateway(self, &request),
1964            "DescribeVpnGateways" => vpn::describe_vpn_gateways(self, &request),
1965            "AttachVpnGateway" => vpn::attach_vpn_gateway(self, &request),
1966            "DetachVpnGateway" => vpn::detach_vpn_gateway(self, &request),
1967            "CreateVpnConnection" => vpn::create_vpn_connection(self, &request),
1968            "DeleteVpnConnection" => vpn::delete_vpn_connection(self, &request),
1969            "DescribeVpnConnections" => vpn::describe_vpn_connections(self, &request),
1970            "ModifyVpnConnection" => vpn::modify_vpn_connection(self, &request),
1971            "ModifyVpnConnectionOptions" => vpn::modify_vpn_connection_options(self, &request),
1972            "CreateVpnConnectionRoute" => vpn::create_vpn_connection_route(self, &request),
1973            "DeleteVpnConnectionRoute" => vpn::delete_vpn_connection_route(self, &request),
1974            "ModifyVpnTunnelOptions" => vpn::modify_vpn_tunnel_options(self, &request),
1975            "ModifyVpnTunnelCertificate" => vpn::modify_vpn_tunnel_certificate(self, &request),
1976            "ReplaceVpnTunnel" => vpn::replace_vpn_tunnel(self, &request),
1977            "GetActiveVpnTunnelStatus" => vpn::get_active_vpn_tunnel_status(self, &request),
1978            "GetVpnTunnelReplacementStatus" => {
1979                vpn::get_vpn_tunnel_replacement_status(self, &request)
1980            }
1981            "GetVpnConnectionDeviceTypes" => vpn::get_vpn_connection_device_types(self, &request),
1982            "GetVpnConnectionDeviceSampleConfiguration" => {
1983                vpn::get_vpn_connection_device_sample_configuration(self, &request)
1984            }
1985            "CreateVpnConcentrator" => vpn::create_vpn_concentrator(self, &request),
1986            "DeleteVpnConcentrator" => vpn::delete_vpn_concentrator(self, &request),
1987            "DescribeVpnConcentrators" => vpn::describe_vpn_concentrators(self, &request),
1988            "CreateClientVpnEndpoint" => cvpn::create_client_vpn_endpoint(self, &request),
1989            "DeleteClientVpnEndpoint" => cvpn::delete_client_vpn_endpoint(self, &request),
1990            "DescribeClientVpnEndpoints" => cvpn::describe_client_vpn_endpoints(self, &request),
1991            "ModifyClientVpnEndpoint" => cvpn::modify_client_vpn_endpoint(self, &request),
1992            "CreateClientVpnRoute" => cvpn::create_client_vpn_route(self, &request),
1993            "DeleteClientVpnRoute" => cvpn::delete_client_vpn_route(self, &request),
1994            "DescribeClientVpnRoutes" => cvpn::describe_client_vpn_routes(self, &request),
1995            "AuthorizeClientVpnIngress" => cvpn::authorize_client_vpn_ingress(self, &request),
1996            "RevokeClientVpnIngress" => cvpn::revoke_client_vpn_ingress(self, &request),
1997            "DescribeClientVpnAuthorizationRules" => {
1998                cvpn::describe_client_vpn_authorization_rules(self, &request)
1999            }
2000            "AssociateClientVpnTargetNetwork" => {
2001                cvpn::associate_client_vpn_target_network(self, &request)
2002            }
2003            "DisassociateClientVpnTargetNetwork" => {
2004                cvpn::disassociate_client_vpn_target_network(self, &request)
2005            }
2006            "DescribeClientVpnTargetNetworks" => {
2007                cvpn::describe_client_vpn_target_networks(self, &request)
2008            }
2009            "ApplySecurityGroupsToClientVpnTargetNetwork" => {
2010                cvpn::apply_security_groups_to_client_vpn_target_network(self, &request)
2011            }
2012            "DescribeClientVpnConnections" => cvpn::describe_client_vpn_connections(self, &request),
2013            "TerminateClientVpnConnections" => {
2014                cvpn::terminate_client_vpn_connections(self, &request)
2015            }
2016            "ExportClientVpnClientCertificateRevocationList" => {
2017                cvpn::export_client_vpn_client_certificate_revocation_list(self, &request)
2018            }
2019            "ExportClientVpnClientConfiguration" => {
2020                cvpn::export_client_vpn_client_configuration(self, &request)
2021            }
2022            "ImportClientVpnClientCertificateRevocationList" => {
2023                cvpn::import_client_vpn_client_certificate_revocation_list(self, &request)
2024            }
2025            "CreateIpam" => ipam::create_ipam(self, &request),
2026            "DeleteIpam" => ipam::delete_ipam(self, &request),
2027            "DescribeIpams" => ipam::describe_ipams(self, &request),
2028            "ModifyIpam" => ipam::modify_ipam(self, &request),
2029            "CreateIpamScope" => ipam::create_ipam_scope(self, &request),
2030            "DeleteIpamScope" => ipam::delete_ipam_scope(self, &request),
2031            "DescribeIpamScopes" => ipam::describe_ipam_scopes(self, &request),
2032            "ModifyIpamScope" => ipam::modify_ipam_scope(self, &request),
2033            "CreateIpamPool" => ipam::create_ipam_pool(self, &request),
2034            "DeleteIpamPool" => ipam::delete_ipam_pool(self, &request),
2035            "DescribeIpamPools" => ipam::describe_ipam_pools(self, &request),
2036            "ModifyIpamPool" => ipam::modify_ipam_pool(self, &request),
2037            "ProvisionIpamPoolCidr" => ipam::provision_ipam_pool_cidr(self, &request),
2038            "DeprovisionIpamPoolCidr" => ipam::deprovision_ipam_pool_cidr(self, &request),
2039            "GetIpamPoolCidrs" => ipam::get_ipam_pool_cidrs(self, &request),
2040            "AllocateIpamPoolCidr" => ipam::allocate_ipam_pool_cidr(self, &request),
2041            "ReleaseIpamPoolAllocation" => ipam::release_ipam_pool_allocation(self, &request),
2042            "GetIpamPoolAllocations" => ipam::get_ipam_pool_allocations(self, &request),
2043            "GetIpamResourceCidrs" => ipam::get_ipam_resource_cidrs(self, &request),
2044            "ModifyIpamResourceCidr" => ipam::modify_ipam_resource_cidr(self, &request),
2045            "GetIpamAddressHistory" => ipam::get_ipam_address_history(self, &request),
2046            "EnableIpamOrganizationAdminAccount" => {
2047                ipam::enable_ipam_organization_admin_account(self, &request)
2048            }
2049            "DisableIpamOrganizationAdminAccount" => {
2050                ipam::disable_ipam_organization_admin_account(self, &request)
2051            }
2052            "CreateIpamResourceDiscovery" => {
2053                ipam_discovery::create_ipam_resource_discovery(self, &request)
2054            }
2055            "DeleteIpamResourceDiscovery" => {
2056                ipam_discovery::delete_ipam_resource_discovery(self, &request)
2057            }
2058            "DescribeIpamResourceDiscoveries" => {
2059                ipam_discovery::describe_ipam_resource_discoveries(self, &request)
2060            }
2061            "ModifyIpamResourceDiscovery" => {
2062                ipam_discovery::modify_ipam_resource_discovery(self, &request)
2063            }
2064            "AssociateIpamResourceDiscovery" => {
2065                ipam_discovery::associate_ipam_resource_discovery(self, &request)
2066            }
2067            "DisassociateIpamResourceDiscovery" => {
2068                ipam_discovery::disassociate_ipam_resource_discovery(self, &request)
2069            }
2070            "DescribeIpamResourceDiscoveryAssociations" => {
2071                ipam_discovery::describe_ipam_resource_discovery_associations(self, &request)
2072            }
2073            "GetIpamDiscoveredAccounts" => {
2074                ipam_discovery::get_ipam_discovered_accounts(self, &request)
2075            }
2076            "GetIpamDiscoveredPublicAddresses" => {
2077                ipam_discovery::get_ipam_discovered_public_addresses(self, &request)
2078            }
2079            "GetIpamDiscoveredResourceCidrs" => {
2080                ipam_discovery::get_ipam_discovered_resource_cidrs(self, &request)
2081            }
2082            "AssociateIpamByoasn" => ipam_discovery::associate_ipam_byoasn(self, &request),
2083            "DisassociateIpamByoasn" => ipam_discovery::disassociate_ipam_byoasn(self, &request),
2084            "ProvisionIpamByoasn" => ipam_discovery::provision_ipam_byoasn(self, &request),
2085            "DeprovisionIpamByoasn" => ipam_discovery::deprovision_ipam_byoasn(self, &request),
2086            "DescribeIpamByoasn" => ipam_discovery::describe_ipam_byoasn(self, &request),
2087            "MoveByoipCidrToIpam" => ipam_discovery::move_byoip_cidr_to_ipam(self, &request),
2088            "CreateIpamExternalResourceVerificationToken" => {
2089                ipam_discovery::create_ipam_external_resource_verification_token(self, &request)
2090            }
2091            "DeleteIpamExternalResourceVerificationToken" => {
2092                ipam_discovery::delete_ipam_external_resource_verification_token(self, &request)
2093            }
2094            "DescribeIpamExternalResourceVerificationTokens" => {
2095                ipam_discovery::describe_ipam_external_resource_verification_tokens(self, &request)
2096            }
2097            "CreateIpamPolicy" => ipam_policy::create_ipam_policy(self, &request),
2098            "DeleteIpamPolicy" => ipam_policy::delete_ipam_policy(self, &request),
2099            "DescribeIpamPolicies" => ipam_policy::describe_ipam_policies(self, &request),
2100            "EnableIpamPolicy" => ipam_policy::enable_ipam_policy(self, &request),
2101            "DisableIpamPolicy" => ipam_policy::disable_ipam_policy(self, &request),
2102            "GetEnabledIpamPolicy" => ipam_policy::get_enabled_ipam_policy(self, &request),
2103            "GetIpamPolicyAllocationRules" => {
2104                ipam_policy::get_ipam_policy_allocation_rules(self, &request)
2105            }
2106            "ModifyIpamPolicyAllocationRules" => {
2107                ipam_policy::modify_ipam_policy_allocation_rules(self, &request)
2108            }
2109            "GetIpamPolicyOrganizationTargets" => {
2110                ipam_policy::get_ipam_policy_organization_targets(self, &request)
2111            }
2112            "CreateIpamPrefixListResolver" => {
2113                ipam_policy::create_ipam_prefix_list_resolver(self, &request)
2114            }
2115            "DeleteIpamPrefixListResolver" => {
2116                ipam_policy::delete_ipam_prefix_list_resolver(self, &request)
2117            }
2118            "DescribeIpamPrefixListResolvers" => {
2119                ipam_policy::describe_ipam_prefix_list_resolvers(self, &request)
2120            }
2121            "ModifyIpamPrefixListResolver" => {
2122                ipam_policy::modify_ipam_prefix_list_resolver(self, &request)
2123            }
2124            "CreateIpamPrefixListResolverTarget" => {
2125                ipam_policy::create_ipam_prefix_list_resolver_target(self, &request)
2126            }
2127            "DeleteIpamPrefixListResolverTarget" => {
2128                ipam_policy::delete_ipam_prefix_list_resolver_target(self, &request)
2129            }
2130            "DescribeIpamPrefixListResolverTargets" => {
2131                ipam_policy::describe_ipam_prefix_list_resolver_targets(self, &request)
2132            }
2133            "ModifyIpamPrefixListResolverTarget" => {
2134                ipam_policy::modify_ipam_prefix_list_resolver_target(self, &request)
2135            }
2136            "GetIpamPrefixListResolverRules" => {
2137                ipam_policy::get_ipam_prefix_list_resolver_rules(self, &request)
2138            }
2139            "GetIpamPrefixListResolverVersions" => {
2140                ipam_policy::get_ipam_prefix_list_resolver_versions(self, &request)
2141            }
2142            "GetIpamPrefixListResolverVersionEntries" => {
2143                ipam_policy::get_ipam_prefix_list_resolver_version_entries(self, &request)
2144            }
2145            "CreateVerifiedAccessInstance" => va::create_verified_access_instance(self, &request),
2146            "DeleteVerifiedAccessInstance" => va::delete_verified_access_instance(self, &request),
2147            "DescribeVerifiedAccessInstances" => {
2148                va::describe_verified_access_instances(self, &request)
2149            }
2150            "ModifyVerifiedAccessInstance" => va::modify_verified_access_instance(self, &request),
2151            "CreateVerifiedAccessTrustProvider" => {
2152                va::create_verified_access_trust_provider(self, &request)
2153            }
2154            "DeleteVerifiedAccessTrustProvider" => {
2155                va::delete_verified_access_trust_provider(self, &request)
2156            }
2157            "DescribeVerifiedAccessTrustProviders" => {
2158                va::describe_verified_access_trust_providers(self, &request)
2159            }
2160            "ModifyVerifiedAccessTrustProvider" => {
2161                va::modify_verified_access_trust_provider(self, &request)
2162            }
2163            "AttachVerifiedAccessTrustProvider" => {
2164                va::attach_verified_access_trust_provider(self, &request)
2165            }
2166            "DetachVerifiedAccessTrustProvider" => {
2167                va::detach_verified_access_trust_provider(self, &request)
2168            }
2169            "CreateVerifiedAccessGroup" => va::create_verified_access_group(self, &request),
2170            "DeleteVerifiedAccessGroup" => va::delete_verified_access_group(self, &request),
2171            "DescribeVerifiedAccessGroups" => va::describe_verified_access_groups(self, &request),
2172            "ModifyVerifiedAccessGroup" => va::modify_verified_access_group(self, &request),
2173            "GetVerifiedAccessGroupPolicy" => va::get_verified_access_group_policy(self, &request),
2174            "ModifyVerifiedAccessGroupPolicy" => {
2175                va::modify_verified_access_group_policy(self, &request)
2176            }
2177            "CreateVerifiedAccessEndpoint" => va::create_verified_access_endpoint(self, &request),
2178            "DeleteVerifiedAccessEndpoint" => va::delete_verified_access_endpoint(self, &request),
2179            "DescribeVerifiedAccessEndpoints" => {
2180                va::describe_verified_access_endpoints(self, &request)
2181            }
2182            "ModifyVerifiedAccessEndpoint" => va::modify_verified_access_endpoint(self, &request),
2183            "GetVerifiedAccessEndpointPolicy" => {
2184                va::get_verified_access_endpoint_policy(self, &request)
2185            }
2186            "ModifyVerifiedAccessEndpointPolicy" => {
2187                va::modify_verified_access_endpoint_policy(self, &request)
2188            }
2189            "GetVerifiedAccessEndpointTargets" => {
2190                va::get_verified_access_endpoint_targets(self, &request)
2191            }
2192            "DescribeVerifiedAccessInstanceLoggingConfigurations" => {
2193                va::describe_verified_access_instance_logging_configurations(self, &request)
2194            }
2195            "ModifyVerifiedAccessInstanceLoggingConfiguration" => {
2196                va::modify_verified_access_instance_logging_configuration(self, &request)
2197            }
2198            "ExportVerifiedAccessInstanceClientConfiguration" => {
2199                va::export_verified_access_instance_client_configuration(self, &request)
2200            }
2201            "CreateNetworkInsightsPath" => ni::create_network_insights_path(self, &request),
2202            "DeleteNetworkInsightsPath" => ni::delete_network_insights_path(self, &request),
2203            "DescribeNetworkInsightsPaths" => ni::describe_network_insights_paths(self, &request),
2204            "StartNetworkInsightsAnalysis" => ni::start_network_insights_analysis(self, &request),
2205            "DeleteNetworkInsightsAnalysis" => ni::delete_network_insights_analysis(self, &request),
2206            "DescribeNetworkInsightsAnalyses" => {
2207                ni::describe_network_insights_analyses(self, &request)
2208            }
2209            "CreateNetworkInsightsAccessScope" => {
2210                ni::create_network_insights_access_scope(self, &request)
2211            }
2212            "DeleteNetworkInsightsAccessScope" => {
2213                ni::delete_network_insights_access_scope(self, &request)
2214            }
2215            "DescribeNetworkInsightsAccessScopes" => {
2216                ni::describe_network_insights_access_scopes(self, &request)
2217            }
2218            "GetNetworkInsightsAccessScopeContent" => {
2219                ni::get_network_insights_access_scope_content(self, &request)
2220            }
2221            "StartNetworkInsightsAccessScopeAnalysis" => {
2222                ni::start_network_insights_access_scope_analysis(self, &request)
2223            }
2224            "DeleteNetworkInsightsAccessScopeAnalysis" => {
2225                ni::delete_network_insights_access_scope_analysis(self, &request)
2226            }
2227            "DescribeNetworkInsightsAccessScopeAnalyses" => {
2228                ni::describe_network_insights_access_scope_analyses(self, &request)
2229            }
2230            "GetNetworkInsightsAccessScopeAnalysisFindings" => {
2231                ni::get_network_insights_access_scope_analysis_findings(self, &request)
2232            }
2233            "CreateCarrierGateway" => lgw::create_carrier_gateway(self, &request),
2234            "DeleteCarrierGateway" => lgw::delete_carrier_gateway(self, &request),
2235            "DescribeCarrierGateways" => lgw::describe_carrier_gateways(self, &request),
2236            "CreateCoipPool" => lgw::create_coip_pool(self, &request),
2237            "DeleteCoipPool" => lgw::delete_coip_pool(self, &request),
2238            "DescribeCoipPools" => lgw::describe_coip_pools(self, &request),
2239            "CreateCoipCidr" => lgw::create_coip_cidr(self, &request),
2240            "DeleteCoipCidr" => lgw::delete_coip_cidr(self, &request),
2241            "GetCoipPoolUsage" => lgw::get_coip_pool_usage(self, &request),
2242            "CreateLocalGatewayRouteTable" => lgw::create_local_gateway_route_table(self, &request),
2243            "DeleteLocalGatewayRouteTable" => lgw::delete_local_gateway_route_table(self, &request),
2244            "DescribeLocalGatewayRouteTables" => {
2245                lgw::describe_local_gateway_route_tables(self, &request)
2246            }
2247            "CreateLocalGatewayRoute" => lgw::create_local_gateway_route(self, &request),
2248            "DeleteLocalGatewayRoute" => lgw::delete_local_gateway_route(self, &request),
2249            "ModifyLocalGatewayRoute" => lgw::modify_local_gateway_route(self, &request),
2250            "SearchLocalGatewayRoutes" => lgw::search_local_gateway_routes(self, &request),
2251            "CreateLocalGatewayRouteTableVpcAssociation" => {
2252                lgw::create_local_gateway_route_table_vpc_association(self, &request)
2253            }
2254            "DeleteLocalGatewayRouteTableVpcAssociation" => {
2255                lgw::delete_local_gateway_route_table_vpc_association(self, &request)
2256            }
2257            "DescribeLocalGatewayRouteTableVpcAssociations" => {
2258                lgw::describe_local_gateway_route_table_vpc_associations(self, &request)
2259            }
2260            "CreateLocalGatewayVirtualInterface" => {
2261                lgw::create_local_gateway_virtual_interface(self, &request)
2262            }
2263            "DeleteLocalGatewayVirtualInterface" => {
2264                lgw::delete_local_gateway_virtual_interface(self, &request)
2265            }
2266            "DescribeLocalGatewayVirtualInterfaces" => {
2267                lgw::describe_local_gateway_virtual_interfaces(self, &request)
2268            }
2269            "CreateLocalGatewayVirtualInterfaceGroup" => {
2270                lgw::create_local_gateway_virtual_interface_group(self, &request)
2271            }
2272            "DeleteLocalGatewayVirtualInterfaceGroup" => {
2273                lgw::delete_local_gateway_virtual_interface_group(self, &request)
2274            }
2275            "DescribeLocalGatewayVirtualInterfaceGroups" => {
2276                lgw::describe_local_gateway_virtual_interface_groups(self, &request)
2277            }
2278            "CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation" => {
2279                lgw::create_local_gateway_route_table_virtual_interface_group_association(
2280                    self, &request,
2281                )
2282            }
2283            "DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation" => {
2284                lgw::delete_local_gateway_route_table_virtual_interface_group_association(
2285                    self, &request,
2286                )
2287            }
2288            "DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations" => {
2289                lgw::describe_local_gateway_route_table_virtual_interface_group_associations(
2290                    self, &request,
2291                )
2292            }
2293            "DescribeLocalGateways" => lgw::describe_local_gateways(self, &request),
2294            "CreateInstanceConnectEndpoint" => {
2295                ice::create_instance_connect_endpoint(self, &request)
2296            }
2297            "DeleteInstanceConnectEndpoint" => {
2298                ice::delete_instance_connect_endpoint(self, &request)
2299            }
2300            "DescribeInstanceConnectEndpoints" => {
2301                ice::describe_instance_connect_endpoints(self, &request)
2302            }
2303            "ModifyInstanceConnectEndpoint" => {
2304                ice::modify_instance_connect_endpoint(self, &request)
2305            }
2306            "EnableFastLaunch" => ice::enable_fast_launch(self, &request),
2307            "DisableFastLaunch" => ice::disable_fast_launch(self, &request),
2308            "EnableSerialConsoleAccess" => ice::enable_serial_console_access(self, &request),
2309            "DisableSerialConsoleAccess" => ice::disable_serial_console_access(self, &request),
2310            "GetSerialConsoleAccessStatus" => ice::get_serial_console_access_status(self, &request),
2311            "GetConsoleOutput" => ice::get_console_output(self, &request).await,
2312            "GetConsoleScreenshot" => ice::get_console_screenshot(self, &request),
2313            "GetPasswordData" => ice::get_password_data(self, &request),
2314            "AdvertiseByoipCidr" => rest::advertise_byoip_cidr(self, &request),
2315            "AssociateEnclaveCertificateIamRole" => {
2316                rest::associate_enclave_certificate_iam_role(self, &request)
2317            }
2318            "AssociateIamInstanceProfile" => rest::associate_iam_instance_profile(self, &request),
2319            "AssociateInstanceEventWindow" => rest::associate_instance_event_window(self, &request),
2320            "AssociateRouteServer" => rest::associate_route_server(self, &request),
2321            "AssociateTrunkInterface" => rest::associate_trunk_interface(self, &request),
2322            "AttachClassicLinkVpc" => rest::attach_classic_link_vpc(self, &request),
2323            "BundleInstance" => rest::bundle_instance(self, &request),
2324            "CancelBundleTask" => rest::cancel_bundle_task(self, &request),
2325            "CancelConversionTask" => rest::cancel_conversion_task(self, &request),
2326            "CancelDeclarativePoliciesReport" => {
2327                rest::cancel_declarative_policies_report(self, &request)
2328            }
2329            "CancelExportTask" => rest::cancel_export_task(self, &request),
2330            "CancelImportTask" => rest::cancel_import_task(self, &request),
2331            "ConfirmProductInstance" => rest::confirm_product_instance(self, &request),
2332            "CopyFpgaImage" => rest::copy_fpga_image(self, &request),
2333            "CopyVolumes" => rest::copy_volumes(self, &request),
2334            "CreateCapacityManagerDataExport" => {
2335                rest::create_capacity_manager_data_export(self, &request)
2336            }
2337            "CreateDelegateMacVolumeOwnershipTask" => {
2338                rest::create_delegate_mac_volume_ownership_task(self, &request)
2339            }
2340            "CreateFpgaImage" => rest::create_fpga_image(self, &request),
2341            "CreateImageUsageReport" => rest::create_image_usage_report(self, &request),
2342            "CreateInstanceEventWindow" => rest::create_instance_event_window(self, &request),
2343            "CreateInstanceExportTask" => rest::create_instance_export_task(self, &request),
2344            "CreateMacSystemIntegrityProtectionModificationTask" => {
2345                rest::create_mac_system_integrity_protection_modification_task(self, &request)
2346            }
2347            "CreateManagedPrefixList" => rest::create_managed_prefix_list(self, &request),
2348            "CreatePublicIpv4Pool" => rest::create_public_ipv4_pool(self, &request),
2349            "CreateReplaceRootVolumeTask" => rest::create_replace_root_volume_task(self, &request),
2350            "CreateRouteServer" => rest::create_route_server(self, &request),
2351            "CreateRouteServerEndpoint" => rest::create_route_server_endpoint(self, &request),
2352            "CreateRouteServerPeer" => rest::create_route_server_peer(self, &request),
2353            "CreateSecondaryNetwork" => rest::create_secondary_network(self, &request),
2354            "CreateTrafficMirrorFilter" => rest::create_traffic_mirror_filter(self, &request),
2355            "CreateTrafficMirrorFilterRule" => {
2356                rest::create_traffic_mirror_filter_rule(self, &request)
2357            }
2358            "CreateTrafficMirrorSession" => rest::create_traffic_mirror_session(self, &request),
2359            "CreateTrafficMirrorTarget" => rest::create_traffic_mirror_target(self, &request),
2360            "CreateVpcBlockPublicAccessExclusion" => {
2361                rest::create_vpc_block_public_access_exclusion(self, &request)
2362            }
2363            "CreateVpcEncryptionControl" => rest::create_vpc_encryption_control(self, &request),
2364            "DeleteCapacityManagerDataExport" => {
2365                rest::delete_capacity_manager_data_export(self, &request)
2366            }
2367            "DeleteFpgaImage" => rest::delete_fpga_image(self, &request),
2368            "DeleteImageUsageReport" => rest::delete_image_usage_report(self, &request),
2369            "DeleteInstanceEventWindow" => rest::delete_instance_event_window(self, &request),
2370            "DeleteManagedPrefixList" => rest::delete_managed_prefix_list(self, &request),
2371            "DeletePublicIpv4Pool" => rest::delete_public_ipv4_pool(self, &request),
2372            "DeleteRouteServer" => rest::delete_route_server(self, &request),
2373            "DeleteRouteServerEndpoint" => rest::delete_route_server_endpoint(self, &request),
2374            "DeleteRouteServerPeer" => rest::delete_route_server_peer(self, &request),
2375            "DeleteSecondaryNetwork" => rest::delete_secondary_network(self, &request),
2376            "DeleteTrafficMirrorFilter" => rest::delete_traffic_mirror_filter(self, &request),
2377            "DeleteTrafficMirrorFilterRule" => {
2378                rest::delete_traffic_mirror_filter_rule(self, &request)
2379            }
2380            "DeleteTrafficMirrorSession" => rest::delete_traffic_mirror_session(self, &request),
2381            "DeleteTrafficMirrorTarget" => rest::delete_traffic_mirror_target(self, &request),
2382            "DeleteVpcBlockPublicAccessExclusion" => {
2383                rest::delete_vpc_block_public_access_exclusion(self, &request)
2384            }
2385            "DeleteVpcEncryptionControl" => rest::delete_vpc_encryption_control(self, &request),
2386            "DeprovisionByoipCidr" => rest::deprovision_byoip_cidr(self, &request),
2387            "DeprovisionPublicIpv4PoolCidr" => {
2388                rest::deprovision_public_ipv4_pool_cidr(self, &request)
2389            }
2390            "DescribeAggregateIdFormat" => rest::describe_aggregate_id_format(self, &request),
2391            "DescribeAwsNetworkPerformanceMetricSubscriptions" => {
2392                rest::describe_aws_network_performance_metric_subscriptions(self, &request)
2393            }
2394            "DescribeBundleTasks" => rest::describe_bundle_tasks(self, &request),
2395            "DescribeByoipCidrs" => rest::describe_byoip_cidrs(self, &request),
2396            "DescribeCapacityManagerDataExports" => {
2397                rest::describe_capacity_manager_data_exports(self, &request)
2398            }
2399            "DescribeClassicLinkInstances" => rest::describe_classic_link_instances(self, &request),
2400            "DescribeConversionTasks" => rest::describe_conversion_tasks(self, &request),
2401            "DescribeDeclarativePoliciesReports" => {
2402                rest::describe_declarative_policies_reports(self, &request)
2403            }
2404            "DescribeElasticGpus" => rest::describe_elastic_gpus(self, &request),
2405            "DescribeExportImageTasks" => rest::describe_export_image_tasks(self, &request),
2406            "DescribeExportTasks" => rest::describe_export_tasks(self, &request),
2407            "DescribeFpgaImageAttribute" => rest::describe_fpga_image_attribute(self, &request),
2408            "DescribeFpgaImages" => rest::describe_fpga_images(self, &request),
2409            "DescribeHostReservationOfferings" => {
2410                rest::describe_host_reservation_offerings(self, &request)
2411            }
2412            "DescribeHostReservations" => rest::describe_host_reservations(self, &request),
2413            "DescribeIamInstanceProfileAssociations" => {
2414                rest::describe_iam_instance_profile_associations(self, &request)
2415            }
2416            "DescribeIdFormat" => rest::describe_id_format(self, &request),
2417            "DescribeIdentityIdFormat" => rest::describe_identity_id_format(self, &request),
2418            "DescribeImageReferences" => rest::describe_image_references(self, &request),
2419            "DescribeImageUsageReportEntries" => {
2420                rest::describe_image_usage_report_entries(self, &request)
2421            }
2422            "DescribeImageUsageReports" => rest::describe_image_usage_reports(self, &request),
2423            "DescribeImportImageTasks" => rest::describe_import_image_tasks(self, &request),
2424            "DescribeImportSnapshotTasks" => rest::describe_import_snapshot_tasks(self, &request),
2425            "DescribeInstanceEventWindows" => rest::describe_instance_event_windows(self, &request),
2426            "DescribeInstanceImageMetadata" => {
2427                rest::describe_instance_image_metadata(self, &request)
2428            }
2429            "DescribeInstanceSqlHaHistoryStates" => {
2430                rest::describe_instance_sql_ha_history_states(self, &request)
2431            }
2432            "DescribeInstanceSqlHaStates" => rest::describe_instance_sql_ha_states(self, &request),
2433            "DescribeInstanceTypeOfferings" => {
2434                rest::describe_instance_type_offerings(self, &request)
2435            }
2436            "DescribeIpv6Pools" => rest::describe_ipv6_pools(self, &request),
2437            "DescribeMacModificationTasks" => rest::describe_mac_modification_tasks(self, &request),
2438            "DescribeManagedPrefixLists" => rest::describe_managed_prefix_lists(self, &request),
2439            "DescribeOutpostLags" => rest::describe_outpost_lags(self, &request),
2440            "DescribePrefixLists" => rest::describe_prefix_lists(self, &request),
2441            "DescribePrincipalIdFormat" => rest::describe_principal_id_format(self, &request),
2442            "DescribePublicIpv4Pools" => rest::describe_public_ipv4_pools(self, &request),
2443            "DescribeReplaceRootVolumeTasks" => {
2444                rest::describe_replace_root_volume_tasks(self, &request)
2445            }
2446            "DescribeRouteServerEndpoints" => rest::describe_route_server_endpoints(self, &request),
2447            "DescribeRouteServerPeers" => rest::describe_route_server_peers(self, &request),
2448            "DescribeRouteServers" => rest::describe_route_servers(self, &request),
2449            "DescribeScheduledInstanceAvailability" => {
2450                rest::describe_scheduled_instance_availability(self, &request)
2451            }
2452            "DescribeScheduledInstances" => rest::describe_scheduled_instances(self, &request),
2453            "DescribeSecondaryInterfaces" => rest::describe_secondary_interfaces(self, &request),
2454            "DescribeSecondaryNetworks" => rest::describe_secondary_networks(self, &request),
2455            "DescribeServiceLinkVirtualInterfaces" => {
2456                rest::describe_service_link_virtual_interfaces(self, &request)
2457            }
2458            "DescribeTrafficMirrorFilterRules" => {
2459                rest::describe_traffic_mirror_filter_rules(self, &request)
2460            }
2461            "DescribeTrafficMirrorFilters" => rest::describe_traffic_mirror_filters(self, &request),
2462            "DescribeTrafficMirrorSessions" => {
2463                rest::describe_traffic_mirror_sessions(self, &request)
2464            }
2465            "DescribeTrafficMirrorTargets" => rest::describe_traffic_mirror_targets(self, &request),
2466            "DescribeTrunkInterfaceAssociations" => {
2467                rest::describe_trunk_interface_associations(self, &request)
2468            }
2469            "DescribeVpcBlockPublicAccessExclusions" => {
2470                rest::describe_vpc_block_public_access_exclusions(self, &request)
2471            }
2472            "DescribeVpcBlockPublicAccessOptions" => {
2473                rest::describe_vpc_block_public_access_options(self, &request)
2474            }
2475            "DescribeVpcClassicLink" => rest::describe_vpc_classic_link(self, &request),
2476            "DescribeVpcClassicLinkDnsSupport" => {
2477                rest::describe_vpc_classic_link_dns_support(self, &request)
2478            }
2479            "DescribeVpcEncryptionControls" => {
2480                rest::describe_vpc_encryption_controls(self, &request)
2481            }
2482            "DetachClassicLinkVpc" => rest::detach_classic_link_vpc(self, &request),
2483            "DisableAwsNetworkPerformanceMetricSubscription" => {
2484                rest::disable_aws_network_performance_metric_subscription(self, &request)
2485            }
2486            "DisableCapacityManager" => rest::disable_capacity_manager(self, &request),
2487            "DisableInstanceSqlHaStandbyDetections" => {
2488                rest::disable_instance_sql_ha_standby_detections(self, &request)
2489            }
2490            "DisableRouteServerPropagation" => {
2491                rest::disable_route_server_propagation(self, &request)
2492            }
2493            "DisableVgwRoutePropagation" => rest::disable_vgw_route_propagation(self, &request),
2494            "DisableVpcClassicLink" => rest::disable_vpc_classic_link(self, &request),
2495            "DisableVpcClassicLinkDnsSupport" => {
2496                rest::disable_vpc_classic_link_dns_support(self, &request)
2497            }
2498            "DisassociateEnclaveCertificateIamRole" => {
2499                rest::disassociate_enclave_certificate_iam_role(self, &request)
2500            }
2501            "DisassociateIamInstanceProfile" => {
2502                rest::disassociate_iam_instance_profile(self, &request)
2503            }
2504            "DisassociateInstanceEventWindow" => {
2505                rest::disassociate_instance_event_window(self, &request)
2506            }
2507            "DisassociateRouteServer" => rest::disassociate_route_server(self, &request),
2508            "DisassociateTrunkInterface" => rest::disassociate_trunk_interface(self, &request),
2509            "EnableAwsNetworkPerformanceMetricSubscription" => {
2510                rest::enable_aws_network_performance_metric_subscription(self, &request)
2511            }
2512            "EnableCapacityManager" => rest::enable_capacity_manager(self, &request),
2513            "EnableInstanceSqlHaStandbyDetections" => {
2514                rest::enable_instance_sql_ha_standby_detections(self, &request)
2515            }
2516            "EnableReachabilityAnalyzerOrganizationSharing" => {
2517                rest::enable_reachability_analyzer_organization_sharing(self, &request)
2518            }
2519            "EnableRouteServerPropagation" => rest::enable_route_server_propagation(self, &request),
2520            "EnableVgwRoutePropagation" => rest::enable_vgw_route_propagation(self, &request),
2521            "EnableVpcClassicLink" => rest::enable_vpc_classic_link(self, &request),
2522            "EnableVpcClassicLinkDnsSupport" => {
2523                rest::enable_vpc_classic_link_dns_support(self, &request)
2524            }
2525            "ExportImage" => rest::export_image(self, &request),
2526            "GetAssociatedEnclaveCertificateIamRoles" => {
2527                rest::get_associated_enclave_certificate_iam_roles(self, &request)
2528            }
2529            "GetAssociatedIpv6PoolCidrs" => rest::get_associated_ipv6_pool_cidrs(self, &request),
2530            "GetAwsNetworkPerformanceData" => {
2531                rest::get_aws_network_performance_data(self, &request)
2532            }
2533            "GetCapacityManagerAttributes" => rest::get_capacity_manager_attributes(self, &request),
2534            "GetCapacityManagerMetricData" => {
2535                rest::get_capacity_manager_metric_data(self, &request)
2536            }
2537            "GetCapacityManagerMetricDimensions" => {
2538                rest::get_capacity_manager_metric_dimensions(self, &request)
2539            }
2540            "GetCapacityManagerMonitoredTagKeys" => {
2541                rest::get_capacity_manager_monitored_tag_keys(self, &request)
2542            }
2543            "GetDeclarativePoliciesReportSummary" => {
2544                rest::get_declarative_policies_report_summary(self, &request)
2545            }
2546            "GetDefaultCreditSpecification" => {
2547                rest::get_default_credit_specification(self, &request)
2548            }
2549            "GetHostReservationPurchasePreview" => {
2550                rest::get_host_reservation_purchase_preview(self, &request)
2551            }
2552            "GetImageAncestry" => rest::get_image_ancestry(self, &request),
2553            "GetInstanceTpmEkPub" => rest::get_instance_tpm_ek_pub(self, &request),
2554            "GetInstanceUefiData" => rest::get_instance_uefi_data(self, &request),
2555            "GetManagedPrefixListAssociations" => {
2556                rest::get_managed_prefix_list_associations(self, &request)
2557            }
2558            "GetManagedPrefixListEntries" => rest::get_managed_prefix_list_entries(self, &request),
2559            "GetManagedResourceVisibility" => rest::get_managed_resource_visibility(self, &request),
2560            "GetRouteServerAssociations" => rest::get_route_server_associations(self, &request),
2561            "GetRouteServerPropagations" => rest::get_route_server_propagations(self, &request),
2562            "GetRouteServerRoutingDatabase" => {
2563                rest::get_route_server_routing_database(self, &request)
2564            }
2565            "GetVpcResourcesBlockingEncryptionEnforcement" => {
2566                rest::get_vpc_resources_blocking_encryption_enforcement(self, &request)
2567            }
2568            "ImportImage" => rest::import_image(self, &request),
2569            "ImportInstance" => rest::import_instance(self, &request),
2570            "ImportSnapshot" => rest::import_snapshot(self, &request),
2571            "ImportVolume" => rest::import_volume(self, &request),
2572            "ModifyAvailabilityZoneGroup" => rest::modify_availability_zone_group(self, &request),
2573            "ModifyDefaultCreditSpecification" => {
2574                rest::modify_default_credit_specification(self, &request)
2575            }
2576            "ModifyFpgaImageAttribute" => rest::modify_fpga_image_attribute(self, &request),
2577            "ModifyIdFormat" => rest::modify_id_format(self, &request),
2578            "ModifyIdentityIdFormat" => rest::modify_identity_id_format(self, &request),
2579            "ModifyInstanceEventWindow" => rest::modify_instance_event_window(self, &request),
2580            "ModifyManagedPrefixList" => rest::modify_managed_prefix_list(self, &request),
2581            "ModifyManagedResourceVisibility" => {
2582                rest::modify_managed_resource_visibility(self, &request)
2583            }
2584            "ModifyPrivateDnsNameOptions" => rest::modify_private_dns_name_options(self, &request),
2585            "ModifyPublicIpDnsNameOptions" => {
2586                rest::modify_public_ip_dns_name_options(self, &request)
2587            }
2588            "ModifyRouteServer" => rest::modify_route_server(self, &request),
2589            "ModifyTrafficMirrorFilterNetworkServices" => {
2590                rest::modify_traffic_mirror_filter_network_services(self, &request)
2591            }
2592            "ModifyTrafficMirrorFilterRule" => {
2593                rest::modify_traffic_mirror_filter_rule(self, &request)
2594            }
2595            "ModifyTrafficMirrorSession" => rest::modify_traffic_mirror_session(self, &request),
2596            "ModifyVpcBlockPublicAccessExclusion" => {
2597                rest::modify_vpc_block_public_access_exclusion(self, &request)
2598            }
2599            "ModifyVpcBlockPublicAccessOptions" => {
2600                rest::modify_vpc_block_public_access_options(self, &request)
2601            }
2602            "ModifyVpcEncryptionControl" => rest::modify_vpc_encryption_control(self, &request),
2603            "ProvisionByoipCidr" => rest::provision_byoip_cidr(self, &request),
2604            "ProvisionPublicIpv4PoolCidr" => rest::provision_public_ipv4_pool_cidr(self, &request),
2605            "PurchaseHostReservation" => rest::purchase_host_reservation(self, &request),
2606            "PurchaseScheduledInstances" => rest::purchase_scheduled_instances(self, &request),
2607            "ReplaceIamInstanceProfileAssociation" => {
2608                rest::replace_iam_instance_profile_association(self, &request)
2609            }
2610            "ResetFpgaImageAttribute" => rest::reset_fpga_image_attribute(self, &request),
2611            "RestoreManagedPrefixListVersion" => {
2612                rest::restore_managed_prefix_list_version(self, &request)
2613            }
2614            "RunScheduledInstances" => rest::run_scheduled_instances(self, &request),
2615            "SendDiagnosticInterrupt" => rest::send_diagnostic_interrupt(self, &request),
2616            "StartDeclarativePoliciesReport" => {
2617                rest::start_declarative_policies_report(self, &request)
2618            }
2619            "UpdateCapacityManagerMonitoredTagKeys" => {
2620                rest::update_capacity_manager_monitored_tag_keys(self, &request)
2621            }
2622            "UpdateCapacityManagerOrganizationsAccess" => {
2623                rest::update_capacity_manager_organizations_access(self, &request)
2624            }
2625            "WithdrawByoipCidr" => rest::withdraw_byoip_cidr(self, &request),
2626            // Model ops absent from the vendored SDK client; tested via raw query.
2627            "CreateCapacityReservationCancellationQuote" => {
2628                rest::create_capacity_reservation_cancellation_quote(self, &request)
2629            }
2630            "DescribeCapacityReservationCancellationQuotes" => {
2631                rest::describe_capacity_reservation_cancellation_quotes(self, &request)
2632            }
2633            "DescribeIpamPoolAllocations" => rest::describe_ipam_pool_allocations(self, &request),
2634            "ModifyIpamPoolAllocation" => rest::modify_ipam_pool_allocation(self, &request),
2635            other => Err(AwsServiceError::aws_error(
2636                StatusCode::BAD_REQUEST,
2637                "InvalidAction",
2638                format!("The action {other} is not valid for this web service."),
2639            )),
2640        };
2641        if mutates && matches!(result.as_ref(), Ok(resp) if resp.status.is_success()) {
2642            self.save_snapshot().await;
2643        }
2644        result
2645    }
2646}
2647
2648impl Ec2Service {
2649    /// Render an `ec2Query` response for `action` with `body` as the inner XML.
2650    pub(crate) fn respond(action: &str, request_id: &str, body: &str) -> AwsResponse {
2651        AwsResponse::xml(
2652            StatusCode::OK,
2653            fakecloud_aws::ec2query::ec2_response(action, request_id, body),
2654        )
2655    }
2656}