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    /// Attach a container runtime so `RunInstances` boots real containers.
916    /// Passing `None` leaves the service in metadata-only mode.
917    pub fn with_runtime(mut self, runtime: Option<Arc<Ec2Runtime>>) -> Self {
918        self.runtime = runtime;
919        self
920    }
921
922    /// Attach a persistence snapshot store so control-plane mutations are
923    /// written through to disk. Backing containers are reconciled separately on
924    /// restart via [`Ec2Service::recover_persisted_containers`].
925    pub fn with_snapshot_store(mut self, store: Arc<dyn SnapshotStore>) -> Self {
926        self.snapshot_store = Some(store);
927        self
928    }
929
930    /// Persist current state as a snapshot. Held across the
931    /// clone-serialize-write sequence to prevent stale-last writes, with serde
932    /// + file I/O offloaded to the blocking pool.
933    async fn save_snapshot(&self) {
934        save_ec2_snapshot(
935            &self.state,
936            self.snapshot_store.clone(),
937            &self.snapshot_lock,
938        )
939        .await;
940    }
941
942    /// Build a hook that persists the current EC2 state when invoked, or `None`
943    /// in memory mode. The CloudFormation provisioner mutates `state` directly
944    /// and uses this to write a CFN-provisioned resource through to disk, the
945    /// same way a direct mutating API call would.
946    pub fn snapshot_hook(&self) -> Option<fakecloud_persistence::SnapshotHook> {
947        let store = self.snapshot_store.clone()?;
948        let state = self.state.clone();
949        let lock = self.snapshot_lock.clone();
950        Some(Arc::new(move || {
951            let state = state.clone();
952            let store = store.clone();
953            let lock = lock.clone();
954            Box::pin(async move {
955                save_ec2_snapshot(&state, Some(store), &lock).await;
956            })
957        }))
958    }
959
960    /// Clone the shared state handle so the server can expose read-only
961    /// introspection endpoints (`GET /_fakecloud/ec2/instances`).
962    pub fn shared_state(&self) -> SharedEc2State {
963        self.state.clone()
964    }
965
966    /// Re-derive the security-group/NACL firewall model from current state and
967    /// (re)apply it via the runtime's nftables enforcer (#1745 phase 3).
968    ///
969    /// Cheap no-op when there's no runtime or enforcement is disabled — the
970    /// common case — so it's safe to call liberally after any mutation that can
971    /// change the ruleset (RunInstances, Terminate, Authorize/Revoke,
972    /// network-ACL edits). Runs in the background so it never blocks the API
973    /// response.
974    pub(crate) fn spawn_firewall_reconcile(&self) {
975        let Some(runtime) = self.runtime.clone() else {
976            return;
977        };
978        if !runtime.network_isolation_enforced() {
979            return;
980        }
981        let state = self.state.clone();
982        tokio::spawn(async move {
983            firewall_model::reconcile(&state, &runtime).await;
984        });
985    }
986
987    /// Rebuild the backing-container runtime state for persisted instances
988    /// after a fakecloud restart, mirroring RDS/ElastiCache
989    /// `recover_persisted_containers`.
990    ///
991    /// On an ungraceful restart the new process has a new PID, so the shared
992    /// reaper removes every EC2 container labeled with the *previous* PID; an
993    /// instance that persisted as `running` with a `container_id` would
994    /// otherwise be left pointing at a removed container, with every
995    /// subsequent Stop/Start/Reboot/Terminate a silent no-op (bug-hunt
996    /// 2026-06-15 finding 0.3). For each such instance we flip it to `pending`
997    /// and spawn a fresh backing container in the background, reconciling it to
998    /// `running` (with the new id/IP) when it's up, or `stopped` on failure.
999    /// Instances persisted as `stopped`/`terminated` are left as-is —
1000    /// StartInstances revives the former. No-op when no runtime is configured
1001    /// or there are no instances to recover.
1002    pub async fn recover_persisted_containers(&self) {
1003        let Some(runtime) = self.runtime.clone() else {
1004            return;
1005        };
1006
1007        struct Pending {
1008            account_id: String,
1009            id: String,
1010            user_data: Option<String>,
1011            tags: std::collections::BTreeMap<String, String>,
1012            network: Option<crate::runtime::InstanceNetwork>,
1013        }
1014
1015        let pending: Vec<Pending> = {
1016            let mut accounts = self.state.write();
1017            let mut out = Vec::new();
1018            for (_, state) in accounts.iter_mut() {
1019                let account_id = state.account_id.clone();
1020                // Snapshot the tag map first so we don't hold two borrows of
1021                // `state` at once when re-deriving per-instance Pod tags.
1022                let tag_snapshot: std::collections::BTreeMap<String, Vec<crate::state::Tag>> =
1023                    state.tags.clone();
1024                // Which subnets are public (have an IGW default route), computed
1025                // before the mutable instance loop so we can re-derive each
1026                // recovered instance's `internal` flag without a second borrow.
1027                let public_subnets: std::collections::HashSet<String> = state
1028                    .subnets
1029                    .keys()
1030                    .filter(|sid| crate::defaults::subnet_is_public(state, sid))
1031                    .cloned()
1032                    .collect();
1033                for (id, inst) in state.instances.iter_mut() {
1034                    // Only running/pending instances need a live container; the
1035                    // stale container_id is dropped (the reaper removed it).
1036                    if !matches!(inst.state_name.as_str(), "running" | "pending") {
1037                        continue;
1038                    }
1039                    let tags = tag_snapshot
1040                        .get(id)
1041                        .map(|t| {
1042                            t.iter()
1043                                .map(|tag| (tag.key.clone(), tag.value.clone()))
1044                                .collect()
1045                        })
1046                        .unwrap_or_default();
1047                    let network =
1048                        inst.subnet_id
1049                            .clone()
1050                            .map(|sid| crate::runtime::InstanceNetwork {
1051                                internal: !public_subnets.contains(&sid),
1052                                subnet_id: sid,
1053                            });
1054                    inst.state_code = 0;
1055                    inst.state_name = "pending".to_string();
1056                    inst.container_id = None;
1057                    out.push(Pending {
1058                        account_id: account_id.clone(),
1059                        id: id.clone(),
1060                        user_data: inst.user_data.clone(),
1061                        tags,
1062                        network,
1063                    });
1064                }
1065            }
1066            out
1067        };
1068
1069        if pending.is_empty() {
1070            return;
1071        }
1072        tracing::info!(
1073            count = pending.len(),
1074            "recovering backing containers for persisted ec2 instances",
1075        );
1076
1077        let mut handles = Vec::new();
1078        for p in pending {
1079            let runtime = runtime.clone();
1080            let state = self.state.clone();
1081            handles.push(tokio::spawn(async move {
1082                let running = runtime
1083                    .run_instance(
1084                        &p.account_id,
1085                        &p.id,
1086                        p.user_data.as_deref(),
1087                        &p.tags,
1088                        p.network.as_ref(),
1089                    )
1090                    .await;
1091                let reap = {
1092                    let mut accounts = state.write();
1093                    match (
1094                        accounts
1095                            .get_mut(&p.account_id)
1096                            .and_then(|s| s.instances.get_mut(&p.id)),
1097                        running,
1098                    ) {
1099                        (Some(inst), Ok(r)) => {
1100                            if inst.state_code == 48 {
1101                                // Terminated during recovery: drop the container.
1102                                true
1103                            } else {
1104                                inst.state_code = 16;
1105                                inst.state_name = "running".to_string();
1106                                inst.private_ip = r.private_ip;
1107                                inst.container_id = Some(r.container_id);
1108                                false
1109                            }
1110                        }
1111                        (Some(inst), Err(error)) => {
1112                            tracing::error!(
1113                                %error,
1114                                instance_id = %p.id,
1115                                "failed to recover ec2 backing container after restart",
1116                            );
1117                            inst.state_code = 80;
1118                            inst.state_name = "stopped".to_string();
1119                            inst.container_id = None;
1120                            false
1121                        }
1122                        // Deleted during recovery: stop the container we just
1123                        // started so it isn't orphaned (mirrors ElastiCache).
1124                        (None, Ok(_)) => true,
1125                        (None, Err(_)) => false,
1126                    }
1127                };
1128                if reap {
1129                    runtime.terminate_instance(&p.id).await;
1130                }
1131            }));
1132        }
1133
1134        // Once every instance is back up, (re)apply the security-group
1135        // firewall. The startup reaper cleared the previous process's nft
1136        // table / NetworkPolicies, and the per-instance recovery tasks above
1137        // don't reconcile — without this, recovered instances would run
1138        // unfiltered until some unrelated later op happened to trigger a
1139        // reconcile (#1745; bug-hunt 2026-06-18 finding 4.1). No-op when
1140        // enforcement is disabled.
1141        {
1142            let runtime = runtime.clone();
1143            let state = self.state.clone();
1144            tokio::spawn(async move {
1145                for h in handles {
1146                    let _ = h.await;
1147                }
1148                if runtime.network_isolation_enforced() {
1149                    firewall_model::reconcile(&state, &runtime).await;
1150                }
1151            });
1152        }
1153    }
1154}
1155
1156impl Default for Ec2Service {
1157    fn default() -> Self {
1158        Self::new()
1159    }
1160}
1161
1162/// Persist the current EC2 state as a snapshot. Offloads the serde + blocking
1163/// file write to the Tokio blocking pool. Noop when `store` is `None` (memory
1164/// mode). Shared by `Ec2Service::save_snapshot` and the CloudFormation
1165/// provisioner persist hook so both route through the same serialize-and-write
1166/// path. Backing containers are not serialized; they are reconciled on restart
1167/// via `Ec2Service::recover_persisted_containers`.
1168pub async fn save_ec2_snapshot(
1169    state: &SharedEc2State,
1170    store: Option<Arc<dyn SnapshotStore>>,
1171    lock: &AsyncMutex<()>,
1172) {
1173    let Some(store) = store else {
1174        return;
1175    };
1176    let _guard = lock.lock().await;
1177    let snapshot = Ec2Snapshot {
1178        schema_version: EC2_SNAPSHOT_SCHEMA_VERSION,
1179        accounts: Some(state.read().clone()),
1180    };
1181    let join = tokio::task::spawn_blocking(move || -> std::io::Result<()> {
1182        let bytes = serde_json::to_vec(&snapshot)
1183            .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e.to_string()))?;
1184        store.save(&bytes)
1185    })
1186    .await;
1187    match join {
1188        Ok(Ok(())) => {}
1189        Ok(Err(err)) => tracing::error!(%err, "failed to write ec2 snapshot"),
1190        Err(err) => tracing::error!(%err, "ec2 snapshot task panicked"),
1191    }
1192}
1193
1194#[async_trait]
1195impl AwsService for Ec2Service {
1196    fn service_name(&self) -> &str {
1197        "ec2"
1198    }
1199
1200    fn supported_actions(&self) -> &[&str] {
1201        SUPPORTED_ACTIONS
1202    }
1203
1204    async fn handle(&self, request: AwsRequest) -> Result<AwsResponse, AwsServiceError> {
1205        let mutates = is_mutating_action(&request.action);
1206        let result = match request.action.as_str() {
1207            "CreateTags" => tags::create_tags(self, &request),
1208            "DeleteTags" => tags::delete_tags(self, &request),
1209            "DescribeTags" => tags::describe_tags(self, &request),
1210            "DescribeRegions" => meta::describe_regions(self, &request),
1211            "DescribeAvailabilityZones" => meta::describe_availability_zones(self, &request),
1212            "DescribeAccountAttributes" => meta::describe_account_attributes(self, &request),
1213            "CreateVpc" => vpc::create_vpc(self, &request),
1214            "CreateDefaultVpc" => vpc::create_default_vpc(self, &request),
1215            "DeleteVpc" => vpc::delete_vpc(self, &request),
1216            "DescribeVpcs" => vpc::describe_vpcs(self, &request),
1217            "ModifyVpcAttribute" => vpc::modify_vpc_attribute(self, &request),
1218            "DescribeVpcAttribute" => vpc::describe_vpc_attribute(self, &request),
1219            "ModifyVpcTenancy" => vpc::modify_vpc_tenancy(self, &request),
1220            "AssociateVpcCidrBlock" => vpc::associate_vpc_cidr_block(self, &request),
1221            "DisassociateVpcCidrBlock" => vpc::disassociate_vpc_cidr_block(self, &request),
1222            "CreateDhcpOptions" => dhcp::create_dhcp_options(self, &request),
1223            "DeleteDhcpOptions" => dhcp::delete_dhcp_options(self, &request),
1224            "DescribeDhcpOptions" => dhcp::describe_dhcp_options(self, &request),
1225            "AssociateDhcpOptions" => dhcp::associate_dhcp_options(self, &request),
1226            "CreateSubnet" => subnet::create_subnet(self, &request),
1227            "CreateDefaultSubnet" => subnet::create_default_subnet(self, &request),
1228            "CreateSecondarySubnet" => subnet::create_secondary_subnet(self, &request),
1229            "DeleteSubnet" => subnet::delete_subnet(self, &request),
1230            "DeleteSecondarySubnet" => subnet::delete_secondary_subnet(self, &request),
1231            "DescribeSubnets" => subnet::describe_subnets(self, &request),
1232            "DescribeSecondarySubnets" => subnet::describe_secondary_subnets(self, &request),
1233            "ModifySubnetAttribute" => subnet::modify_subnet_attribute(self, &request),
1234            "AssociateSubnetCidrBlock" => subnet::associate_subnet_cidr_block(self, &request),
1235            "DisassociateSubnetCidrBlock" => subnet::disassociate_subnet_cidr_block(self, &request),
1236            "CreateSubnetCidrReservation" => subnet::create_subnet_cidr_reservation(self, &request),
1237            "DeleteSubnetCidrReservation" => subnet::delete_subnet_cidr_reservation(self, &request),
1238            "GetSubnetCidrReservations" => subnet::get_subnet_cidr_reservations(self, &request),
1239            "CreateSecurityGroup" => sg::create_security_group(self, &request),
1240            "DeleteSecurityGroup" => sg::delete_security_group(self, &request),
1241            "DescribeSecurityGroups" => sg::describe_security_groups(self, &request),
1242            "AuthorizeSecurityGroupIngress" => sg::authorize_security_group_ingress(self, &request),
1243            "AuthorizeSecurityGroupEgress" => sg::authorize_security_group_egress(self, &request),
1244            "RevokeSecurityGroupIngress" => sg::revoke_security_group_ingress(self, &request),
1245            "RevokeSecurityGroupEgress" => sg::revoke_security_group_egress(self, &request),
1246            "DescribeSecurityGroupRules" => sg::describe_security_group_rules(self, &request),
1247            "ModifySecurityGroupRules" => sg::modify_security_group_rules(self, &request),
1248            "UpdateSecurityGroupRuleDescriptionsIngress" => {
1249                sg::update_rule_descriptions_ingress(self, &request)
1250            }
1251            "UpdateSecurityGroupRuleDescriptionsEgress" => {
1252                sg::update_rule_descriptions_egress(self, &request)
1253            }
1254            "AssociateSecurityGroupVpc" => sg::associate_security_group_vpc(self, &request),
1255            "DisassociateSecurityGroupVpc" => sg::disassociate_security_group_vpc(self, &request),
1256            "DescribeSecurityGroupVpcAssociations" => {
1257                sg::describe_security_group_vpc_associations(self, &request)
1258            }
1259            "GetSecurityGroupsForVpc" => sg::get_security_groups_for_vpc(self, &request),
1260            "DescribeStaleSecurityGroups" => sg::describe_stale_security_groups(self, &request),
1261            "DescribeSecurityGroupReferences" => {
1262                sg::describe_security_group_references(self, &request)
1263            }
1264            "CreateRouteTable" => routing::create_route_table(self, &request),
1265            "DeleteRouteTable" => routing::delete_route_table(self, &request),
1266            "DescribeRouteTables" => routing::describe_route_tables(self, &request),
1267            "CreateRoute" => routing::create_route(self, &request),
1268            "DeleteRoute" => routing::delete_route(self, &request),
1269            "ReplaceRoute" => routing::replace_route(self, &request),
1270            "AssociateRouteTable" => routing::associate_route_table(self, &request),
1271            "DisassociateRouteTable" => routing::disassociate_route_table(self, &request),
1272            "ReplaceRouteTableAssociation" => {
1273                routing::replace_route_table_association(self, &request)
1274            }
1275            "CreateInternetGateway" => routing::create_internet_gateway(self, &request),
1276            "DeleteInternetGateway" => routing::delete_internet_gateway(self, &request),
1277            "DescribeInternetGateways" => routing::describe_internet_gateways(self, &request),
1278            "AttachInternetGateway" => routing::attach_internet_gateway(self, &request),
1279            "DetachInternetGateway" => routing::detach_internet_gateway(self, &request),
1280            "CreateEgressOnlyInternetGateway" => routing::create_egress_only_igw(self, &request),
1281            "DeleteEgressOnlyInternetGateway" => routing::delete_egress_only_igw(self, &request),
1282            "DescribeEgressOnlyInternetGateways" => {
1283                routing::describe_egress_only_igws(self, &request)
1284            }
1285            "CreateNatGateway" => routing::create_nat_gateway(self, &request),
1286            "DeleteNatGateway" => routing::delete_nat_gateway(self, &request),
1287            "DescribeNatGateways" => routing::describe_nat_gateways(self, &request),
1288            "AssignPrivateNatGatewayAddress" => {
1289                routing::assign_private_nat_gateway_address(self, &request)
1290            }
1291            "AssociateNatGatewayAddress" => routing::associate_nat_gateway_address(self, &request),
1292            "DisassociateNatGatewayAddress" => {
1293                routing::disassociate_nat_gateway_address(self, &request)
1294            }
1295            "UnassignPrivateNatGatewayAddress" => {
1296                routing::unassign_private_nat_gateway_address(self, &request)
1297            }
1298            "AllocateAddress" => eip::allocate_address(self, &request),
1299            "ReleaseAddress" => eip::release_address(self, &request),
1300            "DescribeAddresses" => eip::describe_addresses(self, &request),
1301            "AssociateAddress" => eip::associate_address(self, &request),
1302            "DisassociateAddress" => eip::disassociate_address(self, &request),
1303            "DescribeAddressesAttribute" => eip::describe_addresses_attribute(self, &request),
1304            "ModifyAddressAttribute" => eip::modify_address_attribute(self, &request),
1305            "ResetAddressAttribute" => eip::reset_address_attribute(self, &request),
1306            "MoveAddressToVpc" => eip::move_address_to_vpc(self, &request),
1307            "RestoreAddressToClassic" => eip::restore_address_to_classic(self, &request),
1308            "AcceptAddressTransfer" => eip::accept_address_transfer(self, &request),
1309            "EnableAddressTransfer" => eip::enable_address_transfer(self, &request),
1310            "DisableAddressTransfer" => eip::disable_address_transfer(self, &request),
1311            "DescribeAddressTransfers" => eip::describe_address_transfers(self, &request),
1312            "DescribeMovingAddresses" => eip::describe_moving_addresses(self, &request),
1313            "CreateKeyPair" => eip::create_key_pair(self, &request),
1314            "ImportKeyPair" => eip::import_key_pair(self, &request),
1315            "DeleteKeyPair" => eip::delete_key_pair(self, &request),
1316            "DescribeKeyPairs" => eip::describe_key_pairs(self, &request),
1317            "CreatePlacementGroup" => eip::create_placement_group(self, &request),
1318            "DeletePlacementGroup" => eip::delete_placement_group(self, &request),
1319            "DescribePlacementGroups" => eip::describe_placement_groups(self, &request),
1320            "GetGroupsForCapacityReservation" => {
1321                eip::get_groups_for_capacity_reservation(self, &request)
1322            }
1323            "CreateNetworkInterface" => eni::create_network_interface(self, &request),
1324            "DeleteNetworkInterface" => eni::delete_network_interface(self, &request),
1325            "DescribeNetworkInterfaces" => eni::describe_network_interfaces(self, &request),
1326            "AttachNetworkInterface" => eni::attach_network_interface(self, &request),
1327            "DetachNetworkInterface" => eni::detach_network_interface(self, &request),
1328            "ModifyNetworkInterfaceAttribute" => {
1329                eni::modify_network_interface_attribute(self, &request)
1330            }
1331            "ResetNetworkInterfaceAttribute" => {
1332                eni::reset_network_interface_attribute(self, &request)
1333            }
1334            "DescribeNetworkInterfaceAttribute" => {
1335                eni::describe_network_interface_attribute(self, &request)
1336            }
1337            "CreateNetworkInterfacePermission" => {
1338                eni::create_network_interface_permission(self, &request)
1339            }
1340            "DeleteNetworkInterfacePermission" => {
1341                eni::delete_network_interface_permission(self, &request)
1342            }
1343            "DescribeNetworkInterfacePermissions" => {
1344                eni::describe_network_interface_permissions(self, &request)
1345            }
1346            "AssignPrivateIpAddresses" => eni::assign_private_ip_addresses(self, &request),
1347            "UnassignPrivateIpAddresses" => eni::unassign_private_ip_addresses(self, &request),
1348            "AssignIpv6Addresses" => eni::assign_ipv6_addresses(self, &request),
1349            "UnassignIpv6Addresses" => eni::unassign_ipv6_addresses(self, &request),
1350            "RunInstances" => instance::run_instances(self, &request).await,
1351            "StartInstances" => instance::start_instances(self, &request).await,
1352            "StopInstances" => instance::stop_instances(self, &request).await,
1353            "RebootInstances" => instance::reboot_instances(self, &request).await,
1354            "TerminateInstances" => instance::terminate_instances(self, &request).await,
1355            "MonitorInstances" => instance::monitor_instances(self, &request),
1356            "UnmonitorInstances" => instance::unmonitor_instances(self, &request),
1357            "DescribeInstances" => instance::describe_instances(self, &request),
1358            "DescribeInstanceStatus" => instance::describe_instance_status(self, &request),
1359            "DescribeInstanceTypes" => instance::describe_instance_types(self, &request),
1360            "GetInstanceTypesFromInstanceRequirements" => {
1361                instance::get_instance_types_from_requirements(self, &request)
1362            }
1363            "DescribeInstanceAttribute" => instance::describe_instance_attribute(self, &request),
1364            "ModifyInstanceAttribute" => instance::modify_instance_attribute(self, &request),
1365            "ResetInstanceAttribute" => instance::reset_instance_attribute(self, &request),
1366            "ModifyInstancePlacement" => instance::modify_instance_placement(self, &request),
1367            "ModifyInstanceMetadataOptions" => {
1368                instance::modify_instance_metadata_options(self, &request)
1369            }
1370            "ModifyInstanceMaintenanceOptions" => {
1371                instance::modify_instance_maintenance_options(self, &request)
1372            }
1373            "ModifyInstanceCpuOptions" => instance::modify_instance_cpu_options(self, &request),
1374            "ModifyInstanceNetworkPerformanceOptions" => {
1375                instance::modify_instance_network_performance_options(self, &request)
1376            }
1377            "ModifyInstanceEventStartTime" => {
1378                instance::modify_instance_event_start_time(self, &request)
1379            }
1380            "DescribeInstanceCreditSpecifications" => {
1381                instance::describe_instance_credit_specifications(self, &request)
1382            }
1383            "ModifyInstanceCreditSpecification" => {
1384                instance::modify_instance_credit_specification(self, &request)
1385            }
1386            "GetInstanceMetadataDefaults" => {
1387                instance::get_instance_metadata_defaults(self, &request)
1388            }
1389            "ModifyInstanceMetadataDefaults" => {
1390                instance::modify_instance_metadata_defaults(self, &request)
1391            }
1392            "RegisterInstanceEventNotificationAttributes" => {
1393                instance::register_event_notification_attributes(self, &request)
1394            }
1395            "DeregisterInstanceEventNotificationAttributes" => {
1396                instance::deregister_event_notification_attributes(self, &request)
1397            }
1398            "DescribeInstanceEventNotificationAttributes" => {
1399                instance::describe_event_notification_attributes(self, &request)
1400            }
1401            "ReportInstanceStatus" => instance::report_instance_status(self, &request),
1402            "DescribeInstanceTopology" => instance::describe_instance_topology(self, &request),
1403            "CreateVolume" => volume::create_volume(self, &request),
1404            "DeleteVolume" => volume::delete_volume(self, &request),
1405            "DescribeVolumes" => volume::describe_volumes(self, &request),
1406            "AttachVolume" => volume::attach_volume(self, &request),
1407            "DetachVolume" => volume::detach_volume(self, &request),
1408            "ModifyVolume" => volume::modify_volume(self, &request),
1409            "DescribeVolumesModifications" => {
1410                volume::describe_volumes_modifications(self, &request)
1411            }
1412            "DescribeVolumeStatus" => volume::describe_volume_status(self, &request),
1413            "DescribeVolumeAttribute" => volume::describe_volume_attribute(self, &request),
1414            "ModifyVolumeAttribute" => volume::modify_volume_attribute(self, &request),
1415            "EnableVolumeIO" => volume::enable_volume_io(self, &request),
1416            "ListVolumesInRecycleBin" => volume::list_volumes_in_recycle_bin(self, &request),
1417            "RestoreVolumeFromRecycleBin" => {
1418                volume::restore_volume_from_recycle_bin(self, &request)
1419            }
1420            "GetEbsEncryptionByDefault" => volume::get_ebs_encryption_by_default(self, &request),
1421            "EnableEbsEncryptionByDefault" => {
1422                volume::enable_ebs_encryption_by_default(self, &request)
1423            }
1424            "DisableEbsEncryptionByDefault" => {
1425                volume::disable_ebs_encryption_by_default(self, &request)
1426            }
1427            "GetEbsDefaultKmsKeyId" => volume::get_ebs_default_kms_key_id(self, &request),
1428            "ModifyEbsDefaultKmsKeyId" => volume::modify_ebs_default_kms_key_id(self, &request),
1429            "ResetEbsDefaultKmsKeyId" => volume::reset_ebs_default_kms_key_id(self, &request),
1430            "CreateSnapshot" => snapshot::create_snapshot(self, &request),
1431            "CreateSnapshots" => snapshot::create_snapshots(self, &request),
1432            "DeleteSnapshot" => snapshot::delete_snapshot(self, &request),
1433            "DescribeSnapshots" => snapshot::describe_snapshots(self, &request),
1434            "CopySnapshot" => snapshot::copy_snapshot(self, &request),
1435            "DescribeSnapshotAttribute" => snapshot::describe_snapshot_attribute(self, &request),
1436            "ModifySnapshotAttribute" => snapshot::modify_snapshot_attribute(self, &request),
1437            "ResetSnapshotAttribute" => snapshot::reset_snapshot_attribute(self, &request),
1438            "ModifySnapshotTier" => snapshot::modify_snapshot_tier(self, &request),
1439            "DescribeSnapshotTierStatus" => snapshot::describe_snapshot_tier_status(self, &request),
1440            "RestoreSnapshotTier" => snapshot::restore_snapshot_tier(self, &request),
1441            "ListSnapshotsInRecycleBin" => snapshot::list_snapshots_in_recycle_bin(self, &request),
1442            "RestoreSnapshotFromRecycleBin" => {
1443                snapshot::restore_snapshot_from_recycle_bin(self, &request)
1444            }
1445            "LockSnapshot" => snapshot::lock_snapshot(self, &request),
1446            "UnlockSnapshot" => snapshot::unlock_snapshot(self, &request),
1447            "DescribeLockedSnapshots" => snapshot::describe_locked_snapshots(self, &request),
1448            "GetSnapshotBlockPublicAccessState" => {
1449                snapshot::get_snapshot_block_public_access_state(self, &request)
1450            }
1451            "EnableSnapshotBlockPublicAccess" => {
1452                snapshot::enable_snapshot_block_public_access(self, &request)
1453            }
1454            "DisableSnapshotBlockPublicAccess" => {
1455                snapshot::disable_snapshot_block_public_access(self, &request)
1456            }
1457            "EnableFastSnapshotRestores" => snapshot::enable_fast_snapshot_restores(self, &request),
1458            "DisableFastSnapshotRestores" => {
1459                snapshot::disable_fast_snapshot_restores(self, &request)
1460            }
1461            "DescribeFastSnapshotRestores" => {
1462                snapshot::describe_fast_snapshot_restores(self, &request)
1463            }
1464            "CreateImage" => image::create_image(self, &request),
1465            "RegisterImage" => image::register_image(self, &request),
1466            "DeregisterImage" => image::deregister_image(self, &request),
1467            "DescribeImages" => image::describe_images(self, &request),
1468            "CopyImage" => image::copy_image(self, &request),
1469            "DescribeImageAttribute" => image::describe_image_attribute(self, &request),
1470            "ModifyImageAttribute" => image::modify_image_attribute(self, &request),
1471            "ResetImageAttribute" => image::reset_image_attribute(self, &request),
1472            "EnableImage" => image::enable_image(self, &request),
1473            "DisableImage" => image::disable_image(self, &request),
1474            "AttachImageWatermark" => image::attach_image_watermark(self, &request),
1475            "DetachImageWatermark" => image::detach_image_watermark(self, &request),
1476            "EnableImageDeprecation" => image::enable_image_deprecation(self, &request),
1477            "DisableImageDeprecation" => image::disable_image_deprecation(self, &request),
1478            "EnableImageDeregistrationProtection" => {
1479                image::enable_image_deregistration_protection(self, &request)
1480            }
1481            "DisableImageDeregistrationProtection" => {
1482                image::disable_image_deregistration_protection(self, &request)
1483            }
1484            "CancelImageLaunchPermission" => image::cancel_image_launch_permission(self, &request),
1485            "RestoreImageFromRecycleBin" => image::restore_image_from_recycle_bin(self, &request),
1486            "ListImagesInRecycleBin" => image::list_images_in_recycle_bin(self, &request),
1487            "EnableImageBlockPublicAccess" => {
1488                image::enable_image_block_public_access(self, &request)
1489            }
1490            "DisableImageBlockPublicAccess" => {
1491                image::disable_image_block_public_access(self, &request)
1492            }
1493            "GetImageBlockPublicAccessState" => {
1494                image::get_image_block_public_access_state(self, &request)
1495            }
1496            "EnableAllowedImagesSettings" => image::enable_allowed_images_settings(self, &request),
1497            "DisableAllowedImagesSettings" => {
1498                image::disable_allowed_images_settings(self, &request)
1499            }
1500            "GetAllowedImagesSettings" => image::get_allowed_images_settings(self, &request),
1501            "ReplaceImageCriteriaInAllowedImagesSettings" => {
1502                image::replace_image_criteria_in_allowed_images_settings(self, &request)
1503            }
1504            "CreateStoreImageTask" => image::create_store_image_task(self, &request),
1505            "DescribeStoreImageTasks" => image::describe_store_image_tasks(self, &request),
1506            "CreateRestoreImageTask" => image::create_restore_image_task(self, &request),
1507            "DescribeFastLaunchImages" => image::describe_fast_launch_images(self, &request),
1508            "CreateNetworkAcl" => nacl::create_network_acl(self, &request),
1509            "DeleteNetworkAcl" => nacl::delete_network_acl(self, &request),
1510            "DescribeNetworkAcls" => nacl::describe_network_acls(self, &request),
1511            "CreateNetworkAclEntry" => nacl::create_network_acl_entry(self, &request),
1512            "DeleteNetworkAclEntry" => nacl::delete_network_acl_entry(self, &request),
1513            "ReplaceNetworkAclEntry" => nacl::replace_network_acl_entry(self, &request),
1514            "ReplaceNetworkAclAssociation" => nacl::replace_network_acl_association(self, &request),
1515            "CreateVpcPeeringConnection" => nacl::create_vpc_peering_connection(self, &request),
1516            "DeleteVpcPeeringConnection" => nacl::delete_vpc_peering_connection(self, &request),
1517            "DescribeVpcPeeringConnections" => {
1518                nacl::describe_vpc_peering_connections(self, &request)
1519            }
1520            "AcceptVpcPeeringConnection" => nacl::accept_vpc_peering_connection(self, &request),
1521            "RejectVpcPeeringConnection" => nacl::reject_vpc_peering_connection(self, &request),
1522            "ModifyVpcPeeringConnectionOptions" => {
1523                nacl::modify_vpc_peering_connection_options(self, &request)
1524            }
1525            "CreateVpcEndpoint" => endpoint::create_vpc_endpoint(self, &request),
1526            "DeleteVpcEndpoints" => endpoint::delete_vpc_endpoints(self, &request),
1527            "DescribeVpcEndpoints" => endpoint::describe_vpc_endpoints(self, &request),
1528            "ModifyVpcEndpoint" => endpoint::modify_vpc_endpoint(self, &request),
1529            "DescribeVpcEndpointServices" => {
1530                endpoint::describe_vpc_endpoint_services(self, &request)
1531            }
1532            "DescribeVpcEndpointConnections" => {
1533                endpoint::describe_vpc_endpoint_connections(self, &request)
1534            }
1535            "AcceptVpcEndpointConnections" => {
1536                endpoint::accept_vpc_endpoint_connections(self, &request)
1537            }
1538            "RejectVpcEndpointConnections" => {
1539                endpoint::reject_vpc_endpoint_connections(self, &request)
1540            }
1541            "CreateVpcEndpointServiceConfiguration" => {
1542                endpoint::create_vpc_endpoint_service_configuration(self, &request)
1543            }
1544            "DeleteVpcEndpointServiceConfigurations" => {
1545                endpoint::delete_vpc_endpoint_service_configurations(self, &request)
1546            }
1547            "DescribeVpcEndpointServiceConfigurations" => {
1548                endpoint::describe_vpc_endpoint_service_configurations(self, &request)
1549            }
1550            "ModifyVpcEndpointServiceConfiguration" => {
1551                endpoint::modify_vpc_endpoint_service_configuration(self, &request)
1552            }
1553            "DescribeVpcEndpointServicePermissions" => {
1554                endpoint::describe_vpc_endpoint_service_permissions(self, &request)
1555            }
1556            "ModifyVpcEndpointServicePermissions" => {
1557                endpoint::modify_vpc_endpoint_service_permissions(self, &request)
1558            }
1559            "ModifyVpcEndpointServicePayerResponsibility" => {
1560                endpoint::modify_vpc_endpoint_service_payer_responsibility(self, &request)
1561            }
1562            "StartVpcEndpointServicePrivateDnsVerification" => {
1563                endpoint::start_vpc_endpoint_service_private_dns_verification(self, &request)
1564            }
1565            "CreateVpcEndpointConnectionNotification" => {
1566                endpoint::create_vpc_endpoint_connection_notification(self, &request)
1567            }
1568            "DeleteVpcEndpointConnectionNotifications" => {
1569                endpoint::delete_vpc_endpoint_connection_notifications(self, &request)
1570            }
1571            "DescribeVpcEndpointConnectionNotifications" => {
1572                endpoint::describe_vpc_endpoint_connection_notifications(self, &request)
1573            }
1574            "ModifyVpcEndpointConnectionNotification" => {
1575                endpoint::modify_vpc_endpoint_connection_notification(self, &request)
1576            }
1577            "DescribeVpcEndpointAssociations" => {
1578                endpoint::describe_vpc_endpoint_associations(self, &request)
1579            }
1580            "CreateFlowLogs" => endpoint::create_flow_logs(self, &request),
1581            "DeleteFlowLogs" => endpoint::delete_flow_logs(self, &request),
1582            "DescribeFlowLogs" => endpoint::describe_flow_logs(self, &request),
1583            "GetFlowLogsIntegrationTemplate" => {
1584                endpoint::get_flow_logs_integration_template(self, &request)
1585            }
1586            "CreateLaunchTemplate" => fleet::create_launch_template(self, &request),
1587            "CreateLaunchTemplateVersion" => fleet::create_launch_template_version(self, &request),
1588            "DeleteLaunchTemplate" => fleet::delete_launch_template(self, &request),
1589            "DeleteLaunchTemplateVersions" => {
1590                fleet::delete_launch_template_versions(self, &request)
1591            }
1592            "DescribeLaunchTemplates" => fleet::describe_launch_templates(self, &request),
1593            "DescribeLaunchTemplateVersions" => {
1594                fleet::describe_launch_template_versions(self, &request)
1595            }
1596            "GetLaunchTemplateData" => fleet::get_launch_template_data(self, &request),
1597            "ModifyLaunchTemplate" => fleet::modify_launch_template(self, &request),
1598            "RequestSpotInstances" => fleet::request_spot_instances(self, &request),
1599            "DescribeSpotInstanceRequests" => {
1600                fleet::describe_spot_instance_requests(self, &request)
1601            }
1602            "CancelSpotInstanceRequests" => fleet::cancel_spot_instance_requests(self, &request),
1603            "RequestSpotFleet" => fleet::request_spot_fleet(self, &request),
1604            "DescribeSpotFleetRequests" => fleet::describe_spot_fleet_requests(self, &request),
1605            "CancelSpotFleetRequests" => fleet::cancel_spot_fleet_requests(self, &request),
1606            "ModifySpotFleetRequest" => fleet::modify_spot_fleet_request(self, &request),
1607            "DescribeSpotFleetInstances" => fleet::describe_spot_fleet_instances(self, &request),
1608            "DescribeSpotFleetRequestHistory" => {
1609                fleet::describe_spot_fleet_request_history(self, &request)
1610            }
1611            "DescribeSpotPriceHistory" => fleet::describe_spot_price_history(self, &request),
1612            "GetSpotPlacementScores" => fleet::get_spot_placement_scores(self, &request),
1613            "CreateSpotDatafeedSubscription" => {
1614                fleet::create_spot_datafeed_subscription(self, &request)
1615            }
1616            "DeleteSpotDatafeedSubscription" => {
1617                fleet::delete_spot_datafeed_subscription(self, &request)
1618            }
1619            "DescribeSpotDatafeedSubscription" => {
1620                fleet::describe_spot_datafeed_subscription(self, &request)
1621            }
1622            "CreateFleet" => fleet::create_fleet(self, &request),
1623            "DeleteFleets" => fleet::delete_fleets(self, &request),
1624            "DescribeFleets" => fleet::describe_fleets(self, &request),
1625            "ModifyFleet" => fleet::modify_fleet(self, &request),
1626            "DescribeFleetHistory" => fleet::describe_fleet_history(self, &request),
1627            "DescribeFleetInstances" => fleet::describe_fleet_instances(self, &request),
1628            "CreateCapacityReservation" => capacity::create_capacity_reservation(self, &request),
1629            "CancelCapacityReservation" => capacity::cancel_capacity_reservation(self, &request),
1630            "DescribeCapacityReservations" => {
1631                capacity::describe_capacity_reservations(self, &request)
1632            }
1633            "ModifyCapacityReservation" => capacity::modify_capacity_reservation(self, &request),
1634            "GetCapacityReservationUsage" => {
1635                capacity::get_capacity_reservation_usage(self, &request)
1636            }
1637            "CreateCapacityReservationFleet" => {
1638                capacity::create_capacity_reservation_fleet(self, &request)
1639            }
1640            "CancelCapacityReservationFleets" => {
1641                capacity::cancel_capacity_reservation_fleets(self, &request)
1642            }
1643            "DescribeCapacityReservationFleets" => {
1644                capacity::describe_capacity_reservation_fleets(self, &request)
1645            }
1646            "ModifyCapacityReservationFleet" => {
1647                capacity::modify_capacity_reservation_fleet(self, &request)
1648            }
1649            "ModifyInstanceCapacityReservationAttributes" => {
1650                capacity::modify_instance_capacity_reservation_attributes(self, &request)
1651            }
1652            "CreateCapacityReservationBySplitting" => {
1653                capacity::create_capacity_reservation_by_splitting(self, &request)
1654            }
1655            "MoveCapacityReservationInstances" => {
1656                capacity::move_capacity_reservation_instances(self, &request)
1657            }
1658            "DescribeCapacityReservationBillingRequests" => {
1659                capacity::describe_capacity_reservation_billing_requests(self, &request)
1660            }
1661            "AssociateCapacityReservationBillingOwner" => {
1662                capacity::associate_capacity_reservation_billing_owner(self, &request)
1663            }
1664            "DisassociateCapacityReservationBillingOwner" => {
1665                capacity::disassociate_capacity_reservation_billing_owner(self, &request)
1666            }
1667            "AcceptCapacityReservationBillingOwnership" => {
1668                capacity::accept_capacity_reservation_billing_ownership(self, &request)
1669            }
1670            "RejectCapacityReservationBillingOwnership" => {
1671                capacity::reject_capacity_reservation_billing_ownership(self, &request)
1672            }
1673            "DescribeCapacityBlockOfferings" => {
1674                capacity::describe_capacity_block_offerings(self, &request)
1675            }
1676            "DescribeCapacityBlocks" => capacity::describe_capacity_blocks(self, &request),
1677            "PurchaseCapacityBlock" => capacity::purchase_capacity_block(self, &request),
1678            "DescribeCapacityBlockStatus" => {
1679                capacity::describe_capacity_block_status(self, &request)
1680            }
1681            "DescribeCapacityBlockExtensionHistory" => {
1682                capacity::describe_capacity_block_extension_history(self, &request)
1683            }
1684            "DescribeCapacityBlockExtensionOfferings" => {
1685                capacity::describe_capacity_block_extension_offerings(self, &request)
1686            }
1687            "PurchaseCapacityBlockExtension" => {
1688                capacity::purchase_capacity_block_extension(self, &request)
1689            }
1690            "DescribeCapacityReservationTopology" => {
1691                capacity::describe_capacity_reservation_topology(self, &request)
1692            }
1693            "CreateInterruptibleCapacityReservationAllocation" => {
1694                capacity::create_interruptible_capacity_reservation_allocation(self, &request)
1695            }
1696            "UpdateInterruptibleCapacityReservationAllocation" => {
1697                capacity::update_interruptible_capacity_reservation_allocation(self, &request)
1698            }
1699            "DescribeReservedInstances" => reserved::describe_reserved_instances(self, &request),
1700            "DescribeReservedInstancesOfferings" => {
1701                reserved::describe_reserved_instances_offerings(self, &request)
1702            }
1703            "PurchaseReservedInstancesOffering" => {
1704                reserved::purchase_reserved_instances_offering(self, &request)
1705            }
1706            "DescribeReservedInstancesListings" => {
1707                reserved::describe_reserved_instances_listings(self, &request)
1708            }
1709            "CreateReservedInstancesListing" => {
1710                reserved::create_reserved_instances_listing(self, &request)
1711            }
1712            "CancelReservedInstancesListing" => {
1713                reserved::cancel_reserved_instances_listing(self, &request)
1714            }
1715            "DescribeReservedInstancesModifications" => {
1716                reserved::describe_reserved_instances_modifications(self, &request)
1717            }
1718            "ModifyReservedInstances" => reserved::modify_reserved_instances(self, &request),
1719            "GetReservedInstancesExchangeQuote" => {
1720                reserved::get_reserved_instances_exchange_quote(self, &request)
1721            }
1722            "AcceptReservedInstancesExchangeQuote" => {
1723                reserved::accept_reserved_instances_exchange_quote(self, &request)
1724            }
1725            "DeleteQueuedReservedInstances" => {
1726                reserved::delete_queued_reserved_instances(self, &request)
1727            }
1728            "AllocateHosts" => reserved::allocate_hosts(self, &request),
1729            "DescribeHosts" => reserved::describe_hosts(self, &request),
1730            "ModifyHosts" => reserved::modify_hosts(self, &request),
1731            "ReleaseHosts" => reserved::release_hosts(self, &request),
1732            "DescribeMacHosts" => reserved::describe_mac_hosts(self, &request),
1733            "CreateTransitGateway" => tgw::create_transit_gateway(self, &request),
1734            "DeleteTransitGateway" => tgw::delete_transit_gateway(self, &request),
1735            "DescribeTransitGateways" => tgw::describe_transit_gateways(self, &request),
1736            "ModifyTransitGateway" => tgw::modify_transit_gateway(self, &request),
1737            "CreateTransitGatewayVpcAttachment" => {
1738                tgw::create_transit_gateway_vpc_attachment(self, &request)
1739            }
1740            "DeleteTransitGatewayVpcAttachment" => {
1741                tgw::delete_transit_gateway_vpc_attachment(self, &request)
1742            }
1743            "DescribeTransitGatewayVpcAttachments" => {
1744                tgw::describe_transit_gateway_vpc_attachments(self, &request)
1745            }
1746            "ModifyTransitGatewayVpcAttachment" => {
1747                tgw::modify_transit_gateway_vpc_attachment(self, &request)
1748            }
1749            "AcceptTransitGatewayVpcAttachment" => {
1750                tgw::accept_transit_gateway_vpc_attachment(self, &request)
1751            }
1752            "RejectTransitGatewayVpcAttachment" => {
1753                tgw::reject_transit_gateway_vpc_attachment(self, &request)
1754            }
1755            "DescribeTransitGatewayAttachments" => {
1756                tgw::describe_transit_gateway_attachments(self, &request)
1757            }
1758            "CreateTransitGatewayRouteTable" => {
1759                tgw::create_transit_gateway_route_table(self, &request)
1760            }
1761            "DeleteTransitGatewayRouteTable" => {
1762                tgw::delete_transit_gateway_route_table(self, &request)
1763            }
1764            "DescribeTransitGatewayRouteTables" => {
1765                tgw::describe_transit_gateway_route_tables(self, &request)
1766            }
1767            "AssociateTransitGatewayRouteTable" => {
1768                tgw::associate_transit_gateway_route_table(self, &request)
1769            }
1770            "DisassociateTransitGatewayRouteTable" => {
1771                tgw::disassociate_transit_gateway_route_table(self, &request)
1772            }
1773            "EnableTransitGatewayRouteTablePropagation" => {
1774                tgw::enable_transit_gateway_route_table_propagation(self, &request)
1775            }
1776            "DisableTransitGatewayRouteTablePropagation" => {
1777                tgw::disable_transit_gateway_route_table_propagation(self, &request)
1778            }
1779            "CreateTransitGatewayRoute" => tgw::create_transit_gateway_route(self, &request),
1780            "DeleteTransitGatewayRoute" => tgw::delete_transit_gateway_route(self, &request),
1781            "ReplaceTransitGatewayRoute" => tgw::replace_transit_gateway_route(self, &request),
1782            "SearchTransitGatewayRoutes" => tgw::search_transit_gateway_routes(self, &request),
1783            "ExportTransitGatewayRoutes" => tgw::export_transit_gateway_routes(self, &request),
1784            "GetTransitGatewayRouteTableAssociations" => {
1785                tgw::get_transit_gateway_route_table_associations(self, &request)
1786            }
1787            "GetTransitGatewayRouteTablePropagations" => {
1788                tgw::get_transit_gateway_route_table_propagations(self, &request)
1789            }
1790            "GetTransitGatewayAttachmentPropagations" => {
1791                tgw::get_transit_gateway_attachment_propagations(self, &request)
1792            }
1793            "CreateTransitGatewayPrefixListReference" => {
1794                tgw::create_transit_gateway_prefix_list_reference(self, &request)
1795            }
1796            "DeleteTransitGatewayPrefixListReference" => {
1797                tgw::delete_transit_gateway_prefix_list_reference(self, &request)
1798            }
1799            "ModifyTransitGatewayPrefixListReference" => {
1800                tgw::modify_transit_gateway_prefix_list_reference(self, &request)
1801            }
1802            "GetTransitGatewayPrefixListReferences" => {
1803                tgw::get_transit_gateway_prefix_list_references(self, &request)
1804            }
1805            "CreateTransitGatewayPeeringAttachment" => {
1806                tgw_peering::create_transit_gateway_peering_attachment(self, &request)
1807            }
1808            "DeleteTransitGatewayPeeringAttachment" => {
1809                tgw_peering::delete_transit_gateway_peering_attachment(self, &request)
1810            }
1811            "DescribeTransitGatewayPeeringAttachments" => {
1812                tgw_peering::describe_transit_gateway_peering_attachments(self, &request)
1813            }
1814            "AcceptTransitGatewayPeeringAttachment" => {
1815                tgw_peering::accept_transit_gateway_peering_attachment(self, &request)
1816            }
1817            "RejectTransitGatewayPeeringAttachment" => {
1818                tgw_peering::reject_transit_gateway_peering_attachment(self, &request)
1819            }
1820            "CreateTransitGatewayConnect" => {
1821                tgw_peering::create_transit_gateway_connect(self, &request)
1822            }
1823            "DeleteTransitGatewayConnect" => {
1824                tgw_peering::delete_transit_gateway_connect(self, &request)
1825            }
1826            "DescribeTransitGatewayConnects" => {
1827                tgw_peering::describe_transit_gateway_connects(self, &request)
1828            }
1829            "CreateTransitGatewayConnectPeer" => {
1830                tgw_peering::create_transit_gateway_connect_peer(self, &request)
1831            }
1832            "DeleteTransitGatewayConnectPeer" => {
1833                tgw_peering::delete_transit_gateway_connect_peer(self, &request)
1834            }
1835            "DescribeTransitGatewayConnectPeers" => {
1836                tgw_peering::describe_transit_gateway_connect_peers(self, &request)
1837            }
1838            "CreateTransitGatewayPolicyTable" => {
1839                tgw_peering::create_transit_gateway_policy_table(self, &request)
1840            }
1841            "DeleteTransitGatewayPolicyTable" => {
1842                tgw_peering::delete_transit_gateway_policy_table(self, &request)
1843            }
1844            "DescribeTransitGatewayPolicyTables" => {
1845                tgw_peering::describe_transit_gateway_policy_tables(self, &request)
1846            }
1847            "AssociateTransitGatewayPolicyTable" => {
1848                tgw_peering::associate_transit_gateway_policy_table(self, &request)
1849            }
1850            "DisassociateTransitGatewayPolicyTable" => {
1851                tgw_peering::disassociate_transit_gateway_policy_table(self, &request)
1852            }
1853            "GetTransitGatewayPolicyTableAssociations" => {
1854                tgw_peering::get_transit_gateway_policy_table_associations(self, &request)
1855            }
1856            "GetTransitGatewayPolicyTableEntries" => {
1857                tgw_peering::get_transit_gateway_policy_table_entries(self, &request)
1858            }
1859            "CreateTransitGatewayRouteTableAnnouncement" => {
1860                tgw_peering::create_transit_gateway_route_table_announcement(self, &request)
1861            }
1862            "DeleteTransitGatewayRouteTableAnnouncement" => {
1863                tgw_peering::delete_transit_gateway_route_table_announcement(self, &request)
1864            }
1865            "DescribeTransitGatewayRouteTableAnnouncements" => {
1866                tgw_peering::describe_transit_gateway_route_table_announcements(self, &request)
1867            }
1868            "CreateTransitGatewayMulticastDomain" => {
1869                tgw_mcast::create_transit_gateway_multicast_domain(self, &request)
1870            }
1871            "DeleteTransitGatewayMulticastDomain" => {
1872                tgw_mcast::delete_transit_gateway_multicast_domain(self, &request)
1873            }
1874            "DescribeTransitGatewayMulticastDomains" => {
1875                tgw_mcast::describe_transit_gateway_multicast_domains(self, &request)
1876            }
1877            "AssociateTransitGatewayMulticastDomain" => {
1878                tgw_mcast::associate_transit_gateway_multicast_domain(self, &request)
1879            }
1880            "DisassociateTransitGatewayMulticastDomain" => {
1881                tgw_mcast::disassociate_transit_gateway_multicast_domain(self, &request)
1882            }
1883            "AcceptTransitGatewayMulticastDomainAssociations" => {
1884                tgw_mcast::accept_transit_gateway_multicast_domain_associations(self, &request)
1885            }
1886            "RejectTransitGatewayMulticastDomainAssociations" => {
1887                tgw_mcast::reject_transit_gateway_multicast_domain_associations(self, &request)
1888            }
1889            "GetTransitGatewayMulticastDomainAssociations" => {
1890                tgw_mcast::get_transit_gateway_multicast_domain_associations(self, &request)
1891            }
1892            "RegisterTransitGatewayMulticastGroupMembers" => {
1893                tgw_mcast::register_transit_gateway_multicast_group_members(self, &request)
1894            }
1895            "RegisterTransitGatewayMulticastGroupSources" => {
1896                tgw_mcast::register_transit_gateway_multicast_group_sources(self, &request)
1897            }
1898            "DeregisterTransitGatewayMulticastGroupMembers" => {
1899                tgw_mcast::deregister_transit_gateway_multicast_group_members(self, &request)
1900            }
1901            "DeregisterTransitGatewayMulticastGroupSources" => {
1902                tgw_mcast::deregister_transit_gateway_multicast_group_sources(self, &request)
1903            }
1904            "SearchTransitGatewayMulticastGroups" => {
1905                tgw_mcast::search_transit_gateway_multicast_groups(self, &request)
1906            }
1907            "CreateTransitGatewayMeteringPolicy" => {
1908                tgw_mcast::create_transit_gateway_metering_policy(self, &request)
1909            }
1910            "DeleteTransitGatewayMeteringPolicy" => {
1911                tgw_mcast::delete_transit_gateway_metering_policy(self, &request)
1912            }
1913            "DescribeTransitGatewayMeteringPolicies" => {
1914                tgw_mcast::describe_transit_gateway_metering_policies(self, &request)
1915            }
1916            "ModifyTransitGatewayMeteringPolicy" => {
1917                tgw_mcast::modify_transit_gateway_metering_policy(self, &request)
1918            }
1919            "CreateTransitGatewayMeteringPolicyEntry" => {
1920                tgw_mcast::create_transit_gateway_metering_policy_entry(self, &request)
1921            }
1922            "DeleteTransitGatewayMeteringPolicyEntry" => {
1923                tgw_mcast::delete_transit_gateway_metering_policy_entry(self, &request)
1924            }
1925            "GetTransitGatewayMeteringPolicyEntries" => {
1926                tgw_mcast::get_transit_gateway_metering_policy_entries(self, &request)
1927            }
1928            "AcceptTransitGatewayClientVpnAttachment" => {
1929                tgw_mcast::accept_transit_gateway_client_vpn_attachment(self, &request)
1930            }
1931            "DeleteTransitGatewayClientVpnAttachment" => {
1932                tgw_mcast::delete_transit_gateway_client_vpn_attachment(self, &request)
1933            }
1934            "RejectTransitGatewayClientVpnAttachment" => {
1935                tgw_mcast::reject_transit_gateway_client_vpn_attachment(self, &request)
1936            }
1937            "CreateCustomerGateway" => vpn::create_customer_gateway(self, &request),
1938            "DeleteCustomerGateway" => vpn::delete_customer_gateway(self, &request),
1939            "DescribeCustomerGateways" => vpn::describe_customer_gateways(self, &request),
1940            "CreateVpnGateway" => vpn::create_vpn_gateway(self, &request),
1941            "DeleteVpnGateway" => vpn::delete_vpn_gateway(self, &request),
1942            "DescribeVpnGateways" => vpn::describe_vpn_gateways(self, &request),
1943            "AttachVpnGateway" => vpn::attach_vpn_gateway(self, &request),
1944            "DetachVpnGateway" => vpn::detach_vpn_gateway(self, &request),
1945            "CreateVpnConnection" => vpn::create_vpn_connection(self, &request),
1946            "DeleteVpnConnection" => vpn::delete_vpn_connection(self, &request),
1947            "DescribeVpnConnections" => vpn::describe_vpn_connections(self, &request),
1948            "ModifyVpnConnection" => vpn::modify_vpn_connection(self, &request),
1949            "ModifyVpnConnectionOptions" => vpn::modify_vpn_connection_options(self, &request),
1950            "CreateVpnConnectionRoute" => vpn::create_vpn_connection_route(self, &request),
1951            "DeleteVpnConnectionRoute" => vpn::delete_vpn_connection_route(self, &request),
1952            "ModifyVpnTunnelOptions" => vpn::modify_vpn_tunnel_options(self, &request),
1953            "ModifyVpnTunnelCertificate" => vpn::modify_vpn_tunnel_certificate(self, &request),
1954            "ReplaceVpnTunnel" => vpn::replace_vpn_tunnel(self, &request),
1955            "GetActiveVpnTunnelStatus" => vpn::get_active_vpn_tunnel_status(self, &request),
1956            "GetVpnTunnelReplacementStatus" => {
1957                vpn::get_vpn_tunnel_replacement_status(self, &request)
1958            }
1959            "GetVpnConnectionDeviceTypes" => vpn::get_vpn_connection_device_types(self, &request),
1960            "GetVpnConnectionDeviceSampleConfiguration" => {
1961                vpn::get_vpn_connection_device_sample_configuration(self, &request)
1962            }
1963            "CreateVpnConcentrator" => vpn::create_vpn_concentrator(self, &request),
1964            "DeleteVpnConcentrator" => vpn::delete_vpn_concentrator(self, &request),
1965            "DescribeVpnConcentrators" => vpn::describe_vpn_concentrators(self, &request),
1966            "CreateClientVpnEndpoint" => cvpn::create_client_vpn_endpoint(self, &request),
1967            "DeleteClientVpnEndpoint" => cvpn::delete_client_vpn_endpoint(self, &request),
1968            "DescribeClientVpnEndpoints" => cvpn::describe_client_vpn_endpoints(self, &request),
1969            "ModifyClientVpnEndpoint" => cvpn::modify_client_vpn_endpoint(self, &request),
1970            "CreateClientVpnRoute" => cvpn::create_client_vpn_route(self, &request),
1971            "DeleteClientVpnRoute" => cvpn::delete_client_vpn_route(self, &request),
1972            "DescribeClientVpnRoutes" => cvpn::describe_client_vpn_routes(self, &request),
1973            "AuthorizeClientVpnIngress" => cvpn::authorize_client_vpn_ingress(self, &request),
1974            "RevokeClientVpnIngress" => cvpn::revoke_client_vpn_ingress(self, &request),
1975            "DescribeClientVpnAuthorizationRules" => {
1976                cvpn::describe_client_vpn_authorization_rules(self, &request)
1977            }
1978            "AssociateClientVpnTargetNetwork" => {
1979                cvpn::associate_client_vpn_target_network(self, &request)
1980            }
1981            "DisassociateClientVpnTargetNetwork" => {
1982                cvpn::disassociate_client_vpn_target_network(self, &request)
1983            }
1984            "DescribeClientVpnTargetNetworks" => {
1985                cvpn::describe_client_vpn_target_networks(self, &request)
1986            }
1987            "ApplySecurityGroupsToClientVpnTargetNetwork" => {
1988                cvpn::apply_security_groups_to_client_vpn_target_network(self, &request)
1989            }
1990            "DescribeClientVpnConnections" => cvpn::describe_client_vpn_connections(self, &request),
1991            "TerminateClientVpnConnections" => {
1992                cvpn::terminate_client_vpn_connections(self, &request)
1993            }
1994            "ExportClientVpnClientCertificateRevocationList" => {
1995                cvpn::export_client_vpn_client_certificate_revocation_list(self, &request)
1996            }
1997            "ExportClientVpnClientConfiguration" => {
1998                cvpn::export_client_vpn_client_configuration(self, &request)
1999            }
2000            "ImportClientVpnClientCertificateRevocationList" => {
2001                cvpn::import_client_vpn_client_certificate_revocation_list(self, &request)
2002            }
2003            "CreateIpam" => ipam::create_ipam(self, &request),
2004            "DeleteIpam" => ipam::delete_ipam(self, &request),
2005            "DescribeIpams" => ipam::describe_ipams(self, &request),
2006            "ModifyIpam" => ipam::modify_ipam(self, &request),
2007            "CreateIpamScope" => ipam::create_ipam_scope(self, &request),
2008            "DeleteIpamScope" => ipam::delete_ipam_scope(self, &request),
2009            "DescribeIpamScopes" => ipam::describe_ipam_scopes(self, &request),
2010            "ModifyIpamScope" => ipam::modify_ipam_scope(self, &request),
2011            "CreateIpamPool" => ipam::create_ipam_pool(self, &request),
2012            "DeleteIpamPool" => ipam::delete_ipam_pool(self, &request),
2013            "DescribeIpamPools" => ipam::describe_ipam_pools(self, &request),
2014            "ModifyIpamPool" => ipam::modify_ipam_pool(self, &request),
2015            "ProvisionIpamPoolCidr" => ipam::provision_ipam_pool_cidr(self, &request),
2016            "DeprovisionIpamPoolCidr" => ipam::deprovision_ipam_pool_cidr(self, &request),
2017            "GetIpamPoolCidrs" => ipam::get_ipam_pool_cidrs(self, &request),
2018            "AllocateIpamPoolCidr" => ipam::allocate_ipam_pool_cidr(self, &request),
2019            "ReleaseIpamPoolAllocation" => ipam::release_ipam_pool_allocation(self, &request),
2020            "GetIpamPoolAllocations" => ipam::get_ipam_pool_allocations(self, &request),
2021            "GetIpamResourceCidrs" => ipam::get_ipam_resource_cidrs(self, &request),
2022            "ModifyIpamResourceCidr" => ipam::modify_ipam_resource_cidr(self, &request),
2023            "GetIpamAddressHistory" => ipam::get_ipam_address_history(self, &request),
2024            "EnableIpamOrganizationAdminAccount" => {
2025                ipam::enable_ipam_organization_admin_account(self, &request)
2026            }
2027            "DisableIpamOrganizationAdminAccount" => {
2028                ipam::disable_ipam_organization_admin_account(self, &request)
2029            }
2030            "CreateIpamResourceDiscovery" => {
2031                ipam_discovery::create_ipam_resource_discovery(self, &request)
2032            }
2033            "DeleteIpamResourceDiscovery" => {
2034                ipam_discovery::delete_ipam_resource_discovery(self, &request)
2035            }
2036            "DescribeIpamResourceDiscoveries" => {
2037                ipam_discovery::describe_ipam_resource_discoveries(self, &request)
2038            }
2039            "ModifyIpamResourceDiscovery" => {
2040                ipam_discovery::modify_ipam_resource_discovery(self, &request)
2041            }
2042            "AssociateIpamResourceDiscovery" => {
2043                ipam_discovery::associate_ipam_resource_discovery(self, &request)
2044            }
2045            "DisassociateIpamResourceDiscovery" => {
2046                ipam_discovery::disassociate_ipam_resource_discovery(self, &request)
2047            }
2048            "DescribeIpamResourceDiscoveryAssociations" => {
2049                ipam_discovery::describe_ipam_resource_discovery_associations(self, &request)
2050            }
2051            "GetIpamDiscoveredAccounts" => {
2052                ipam_discovery::get_ipam_discovered_accounts(self, &request)
2053            }
2054            "GetIpamDiscoveredPublicAddresses" => {
2055                ipam_discovery::get_ipam_discovered_public_addresses(self, &request)
2056            }
2057            "GetIpamDiscoveredResourceCidrs" => {
2058                ipam_discovery::get_ipam_discovered_resource_cidrs(self, &request)
2059            }
2060            "AssociateIpamByoasn" => ipam_discovery::associate_ipam_byoasn(self, &request),
2061            "DisassociateIpamByoasn" => ipam_discovery::disassociate_ipam_byoasn(self, &request),
2062            "ProvisionIpamByoasn" => ipam_discovery::provision_ipam_byoasn(self, &request),
2063            "DeprovisionIpamByoasn" => ipam_discovery::deprovision_ipam_byoasn(self, &request),
2064            "DescribeIpamByoasn" => ipam_discovery::describe_ipam_byoasn(self, &request),
2065            "MoveByoipCidrToIpam" => ipam_discovery::move_byoip_cidr_to_ipam(self, &request),
2066            "CreateIpamExternalResourceVerificationToken" => {
2067                ipam_discovery::create_ipam_external_resource_verification_token(self, &request)
2068            }
2069            "DeleteIpamExternalResourceVerificationToken" => {
2070                ipam_discovery::delete_ipam_external_resource_verification_token(self, &request)
2071            }
2072            "DescribeIpamExternalResourceVerificationTokens" => {
2073                ipam_discovery::describe_ipam_external_resource_verification_tokens(self, &request)
2074            }
2075            "CreateIpamPolicy" => ipam_policy::create_ipam_policy(self, &request),
2076            "DeleteIpamPolicy" => ipam_policy::delete_ipam_policy(self, &request),
2077            "DescribeIpamPolicies" => ipam_policy::describe_ipam_policies(self, &request),
2078            "EnableIpamPolicy" => ipam_policy::enable_ipam_policy(self, &request),
2079            "DisableIpamPolicy" => ipam_policy::disable_ipam_policy(self, &request),
2080            "GetEnabledIpamPolicy" => ipam_policy::get_enabled_ipam_policy(self, &request),
2081            "GetIpamPolicyAllocationRules" => {
2082                ipam_policy::get_ipam_policy_allocation_rules(self, &request)
2083            }
2084            "ModifyIpamPolicyAllocationRules" => {
2085                ipam_policy::modify_ipam_policy_allocation_rules(self, &request)
2086            }
2087            "GetIpamPolicyOrganizationTargets" => {
2088                ipam_policy::get_ipam_policy_organization_targets(self, &request)
2089            }
2090            "CreateIpamPrefixListResolver" => {
2091                ipam_policy::create_ipam_prefix_list_resolver(self, &request)
2092            }
2093            "DeleteIpamPrefixListResolver" => {
2094                ipam_policy::delete_ipam_prefix_list_resolver(self, &request)
2095            }
2096            "DescribeIpamPrefixListResolvers" => {
2097                ipam_policy::describe_ipam_prefix_list_resolvers(self, &request)
2098            }
2099            "ModifyIpamPrefixListResolver" => {
2100                ipam_policy::modify_ipam_prefix_list_resolver(self, &request)
2101            }
2102            "CreateIpamPrefixListResolverTarget" => {
2103                ipam_policy::create_ipam_prefix_list_resolver_target(self, &request)
2104            }
2105            "DeleteIpamPrefixListResolverTarget" => {
2106                ipam_policy::delete_ipam_prefix_list_resolver_target(self, &request)
2107            }
2108            "DescribeIpamPrefixListResolverTargets" => {
2109                ipam_policy::describe_ipam_prefix_list_resolver_targets(self, &request)
2110            }
2111            "ModifyIpamPrefixListResolverTarget" => {
2112                ipam_policy::modify_ipam_prefix_list_resolver_target(self, &request)
2113            }
2114            "GetIpamPrefixListResolverRules" => {
2115                ipam_policy::get_ipam_prefix_list_resolver_rules(self, &request)
2116            }
2117            "GetIpamPrefixListResolverVersions" => {
2118                ipam_policy::get_ipam_prefix_list_resolver_versions(self, &request)
2119            }
2120            "GetIpamPrefixListResolverVersionEntries" => {
2121                ipam_policy::get_ipam_prefix_list_resolver_version_entries(self, &request)
2122            }
2123            "CreateVerifiedAccessInstance" => va::create_verified_access_instance(self, &request),
2124            "DeleteVerifiedAccessInstance" => va::delete_verified_access_instance(self, &request),
2125            "DescribeVerifiedAccessInstances" => {
2126                va::describe_verified_access_instances(self, &request)
2127            }
2128            "ModifyVerifiedAccessInstance" => va::modify_verified_access_instance(self, &request),
2129            "CreateVerifiedAccessTrustProvider" => {
2130                va::create_verified_access_trust_provider(self, &request)
2131            }
2132            "DeleteVerifiedAccessTrustProvider" => {
2133                va::delete_verified_access_trust_provider(self, &request)
2134            }
2135            "DescribeVerifiedAccessTrustProviders" => {
2136                va::describe_verified_access_trust_providers(self, &request)
2137            }
2138            "ModifyVerifiedAccessTrustProvider" => {
2139                va::modify_verified_access_trust_provider(self, &request)
2140            }
2141            "AttachVerifiedAccessTrustProvider" => {
2142                va::attach_verified_access_trust_provider(self, &request)
2143            }
2144            "DetachVerifiedAccessTrustProvider" => {
2145                va::detach_verified_access_trust_provider(self, &request)
2146            }
2147            "CreateVerifiedAccessGroup" => va::create_verified_access_group(self, &request),
2148            "DeleteVerifiedAccessGroup" => va::delete_verified_access_group(self, &request),
2149            "DescribeVerifiedAccessGroups" => va::describe_verified_access_groups(self, &request),
2150            "ModifyVerifiedAccessGroup" => va::modify_verified_access_group(self, &request),
2151            "GetVerifiedAccessGroupPolicy" => va::get_verified_access_group_policy(self, &request),
2152            "ModifyVerifiedAccessGroupPolicy" => {
2153                va::modify_verified_access_group_policy(self, &request)
2154            }
2155            "CreateVerifiedAccessEndpoint" => va::create_verified_access_endpoint(self, &request),
2156            "DeleteVerifiedAccessEndpoint" => va::delete_verified_access_endpoint(self, &request),
2157            "DescribeVerifiedAccessEndpoints" => {
2158                va::describe_verified_access_endpoints(self, &request)
2159            }
2160            "ModifyVerifiedAccessEndpoint" => va::modify_verified_access_endpoint(self, &request),
2161            "GetVerifiedAccessEndpointPolicy" => {
2162                va::get_verified_access_endpoint_policy(self, &request)
2163            }
2164            "ModifyVerifiedAccessEndpointPolicy" => {
2165                va::modify_verified_access_endpoint_policy(self, &request)
2166            }
2167            "GetVerifiedAccessEndpointTargets" => {
2168                va::get_verified_access_endpoint_targets(self, &request)
2169            }
2170            "DescribeVerifiedAccessInstanceLoggingConfigurations" => {
2171                va::describe_verified_access_instance_logging_configurations(self, &request)
2172            }
2173            "ModifyVerifiedAccessInstanceLoggingConfiguration" => {
2174                va::modify_verified_access_instance_logging_configuration(self, &request)
2175            }
2176            "ExportVerifiedAccessInstanceClientConfiguration" => {
2177                va::export_verified_access_instance_client_configuration(self, &request)
2178            }
2179            "CreateNetworkInsightsPath" => ni::create_network_insights_path(self, &request),
2180            "DeleteNetworkInsightsPath" => ni::delete_network_insights_path(self, &request),
2181            "DescribeNetworkInsightsPaths" => ni::describe_network_insights_paths(self, &request),
2182            "StartNetworkInsightsAnalysis" => ni::start_network_insights_analysis(self, &request),
2183            "DeleteNetworkInsightsAnalysis" => ni::delete_network_insights_analysis(self, &request),
2184            "DescribeNetworkInsightsAnalyses" => {
2185                ni::describe_network_insights_analyses(self, &request)
2186            }
2187            "CreateNetworkInsightsAccessScope" => {
2188                ni::create_network_insights_access_scope(self, &request)
2189            }
2190            "DeleteNetworkInsightsAccessScope" => {
2191                ni::delete_network_insights_access_scope(self, &request)
2192            }
2193            "DescribeNetworkInsightsAccessScopes" => {
2194                ni::describe_network_insights_access_scopes(self, &request)
2195            }
2196            "GetNetworkInsightsAccessScopeContent" => {
2197                ni::get_network_insights_access_scope_content(self, &request)
2198            }
2199            "StartNetworkInsightsAccessScopeAnalysis" => {
2200                ni::start_network_insights_access_scope_analysis(self, &request)
2201            }
2202            "DeleteNetworkInsightsAccessScopeAnalysis" => {
2203                ni::delete_network_insights_access_scope_analysis(self, &request)
2204            }
2205            "DescribeNetworkInsightsAccessScopeAnalyses" => {
2206                ni::describe_network_insights_access_scope_analyses(self, &request)
2207            }
2208            "GetNetworkInsightsAccessScopeAnalysisFindings" => {
2209                ni::get_network_insights_access_scope_analysis_findings(self, &request)
2210            }
2211            "CreateCarrierGateway" => lgw::create_carrier_gateway(self, &request),
2212            "DeleteCarrierGateway" => lgw::delete_carrier_gateway(self, &request),
2213            "DescribeCarrierGateways" => lgw::describe_carrier_gateways(self, &request),
2214            "CreateCoipPool" => lgw::create_coip_pool(self, &request),
2215            "DeleteCoipPool" => lgw::delete_coip_pool(self, &request),
2216            "DescribeCoipPools" => lgw::describe_coip_pools(self, &request),
2217            "CreateCoipCidr" => lgw::create_coip_cidr(self, &request),
2218            "DeleteCoipCidr" => lgw::delete_coip_cidr(self, &request),
2219            "GetCoipPoolUsage" => lgw::get_coip_pool_usage(self, &request),
2220            "CreateLocalGatewayRouteTable" => lgw::create_local_gateway_route_table(self, &request),
2221            "DeleteLocalGatewayRouteTable" => lgw::delete_local_gateway_route_table(self, &request),
2222            "DescribeLocalGatewayRouteTables" => {
2223                lgw::describe_local_gateway_route_tables(self, &request)
2224            }
2225            "CreateLocalGatewayRoute" => lgw::create_local_gateway_route(self, &request),
2226            "DeleteLocalGatewayRoute" => lgw::delete_local_gateway_route(self, &request),
2227            "ModifyLocalGatewayRoute" => lgw::modify_local_gateway_route(self, &request),
2228            "SearchLocalGatewayRoutes" => lgw::search_local_gateway_routes(self, &request),
2229            "CreateLocalGatewayRouteTableVpcAssociation" => {
2230                lgw::create_local_gateway_route_table_vpc_association(self, &request)
2231            }
2232            "DeleteLocalGatewayRouteTableVpcAssociation" => {
2233                lgw::delete_local_gateway_route_table_vpc_association(self, &request)
2234            }
2235            "DescribeLocalGatewayRouteTableVpcAssociations" => {
2236                lgw::describe_local_gateway_route_table_vpc_associations(self, &request)
2237            }
2238            "CreateLocalGatewayVirtualInterface" => {
2239                lgw::create_local_gateway_virtual_interface(self, &request)
2240            }
2241            "DeleteLocalGatewayVirtualInterface" => {
2242                lgw::delete_local_gateway_virtual_interface(self, &request)
2243            }
2244            "DescribeLocalGatewayVirtualInterfaces" => {
2245                lgw::describe_local_gateway_virtual_interfaces(self, &request)
2246            }
2247            "CreateLocalGatewayVirtualInterfaceGroup" => {
2248                lgw::create_local_gateway_virtual_interface_group(self, &request)
2249            }
2250            "DeleteLocalGatewayVirtualInterfaceGroup" => {
2251                lgw::delete_local_gateway_virtual_interface_group(self, &request)
2252            }
2253            "DescribeLocalGatewayVirtualInterfaceGroups" => {
2254                lgw::describe_local_gateway_virtual_interface_groups(self, &request)
2255            }
2256            "CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation" => {
2257                lgw::create_local_gateway_route_table_virtual_interface_group_association(
2258                    self, &request,
2259                )
2260            }
2261            "DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation" => {
2262                lgw::delete_local_gateway_route_table_virtual_interface_group_association(
2263                    self, &request,
2264                )
2265            }
2266            "DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations" => {
2267                lgw::describe_local_gateway_route_table_virtual_interface_group_associations(
2268                    self, &request,
2269                )
2270            }
2271            "DescribeLocalGateways" => lgw::describe_local_gateways(self, &request),
2272            "CreateInstanceConnectEndpoint" => {
2273                ice::create_instance_connect_endpoint(self, &request)
2274            }
2275            "DeleteInstanceConnectEndpoint" => {
2276                ice::delete_instance_connect_endpoint(self, &request)
2277            }
2278            "DescribeInstanceConnectEndpoints" => {
2279                ice::describe_instance_connect_endpoints(self, &request)
2280            }
2281            "ModifyInstanceConnectEndpoint" => {
2282                ice::modify_instance_connect_endpoint(self, &request)
2283            }
2284            "EnableFastLaunch" => ice::enable_fast_launch(self, &request),
2285            "DisableFastLaunch" => ice::disable_fast_launch(self, &request),
2286            "EnableSerialConsoleAccess" => ice::enable_serial_console_access(self, &request),
2287            "DisableSerialConsoleAccess" => ice::disable_serial_console_access(self, &request),
2288            "GetSerialConsoleAccessStatus" => ice::get_serial_console_access_status(self, &request),
2289            "GetConsoleOutput" => ice::get_console_output(self, &request).await,
2290            "GetConsoleScreenshot" => ice::get_console_screenshot(self, &request),
2291            "GetPasswordData" => ice::get_password_data(self, &request),
2292            "AdvertiseByoipCidr" => rest::advertise_byoip_cidr(self, &request),
2293            "AssociateEnclaveCertificateIamRole" => {
2294                rest::associate_enclave_certificate_iam_role(self, &request)
2295            }
2296            "AssociateIamInstanceProfile" => rest::associate_iam_instance_profile(self, &request),
2297            "AssociateInstanceEventWindow" => rest::associate_instance_event_window(self, &request),
2298            "AssociateRouteServer" => rest::associate_route_server(self, &request),
2299            "AssociateTrunkInterface" => rest::associate_trunk_interface(self, &request),
2300            "AttachClassicLinkVpc" => rest::attach_classic_link_vpc(self, &request),
2301            "BundleInstance" => rest::bundle_instance(self, &request),
2302            "CancelBundleTask" => rest::cancel_bundle_task(self, &request),
2303            "CancelConversionTask" => rest::cancel_conversion_task(self, &request),
2304            "CancelDeclarativePoliciesReport" => {
2305                rest::cancel_declarative_policies_report(self, &request)
2306            }
2307            "CancelExportTask" => rest::cancel_export_task(self, &request),
2308            "CancelImportTask" => rest::cancel_import_task(self, &request),
2309            "ConfirmProductInstance" => rest::confirm_product_instance(self, &request),
2310            "CopyFpgaImage" => rest::copy_fpga_image(self, &request),
2311            "CopyVolumes" => rest::copy_volumes(self, &request),
2312            "CreateCapacityManagerDataExport" => {
2313                rest::create_capacity_manager_data_export(self, &request)
2314            }
2315            "CreateDelegateMacVolumeOwnershipTask" => {
2316                rest::create_delegate_mac_volume_ownership_task(self, &request)
2317            }
2318            "CreateFpgaImage" => rest::create_fpga_image(self, &request),
2319            "CreateImageUsageReport" => rest::create_image_usage_report(self, &request),
2320            "CreateInstanceEventWindow" => rest::create_instance_event_window(self, &request),
2321            "CreateInstanceExportTask" => rest::create_instance_export_task(self, &request),
2322            "CreateMacSystemIntegrityProtectionModificationTask" => {
2323                rest::create_mac_system_integrity_protection_modification_task(self, &request)
2324            }
2325            "CreateManagedPrefixList" => rest::create_managed_prefix_list(self, &request),
2326            "CreatePublicIpv4Pool" => rest::create_public_ipv4_pool(self, &request),
2327            "CreateReplaceRootVolumeTask" => rest::create_replace_root_volume_task(self, &request),
2328            "CreateRouteServer" => rest::create_route_server(self, &request),
2329            "CreateRouteServerEndpoint" => rest::create_route_server_endpoint(self, &request),
2330            "CreateRouteServerPeer" => rest::create_route_server_peer(self, &request),
2331            "CreateSecondaryNetwork" => rest::create_secondary_network(self, &request),
2332            "CreateTrafficMirrorFilter" => rest::create_traffic_mirror_filter(self, &request),
2333            "CreateTrafficMirrorFilterRule" => {
2334                rest::create_traffic_mirror_filter_rule(self, &request)
2335            }
2336            "CreateTrafficMirrorSession" => rest::create_traffic_mirror_session(self, &request),
2337            "CreateTrafficMirrorTarget" => rest::create_traffic_mirror_target(self, &request),
2338            "CreateVpcBlockPublicAccessExclusion" => {
2339                rest::create_vpc_block_public_access_exclusion(self, &request)
2340            }
2341            "CreateVpcEncryptionControl" => rest::create_vpc_encryption_control(self, &request),
2342            "DeleteCapacityManagerDataExport" => {
2343                rest::delete_capacity_manager_data_export(self, &request)
2344            }
2345            "DeleteFpgaImage" => rest::delete_fpga_image(self, &request),
2346            "DeleteImageUsageReport" => rest::delete_image_usage_report(self, &request),
2347            "DeleteInstanceEventWindow" => rest::delete_instance_event_window(self, &request),
2348            "DeleteManagedPrefixList" => rest::delete_managed_prefix_list(self, &request),
2349            "DeletePublicIpv4Pool" => rest::delete_public_ipv4_pool(self, &request),
2350            "DeleteRouteServer" => rest::delete_route_server(self, &request),
2351            "DeleteRouteServerEndpoint" => rest::delete_route_server_endpoint(self, &request),
2352            "DeleteRouteServerPeer" => rest::delete_route_server_peer(self, &request),
2353            "DeleteSecondaryNetwork" => rest::delete_secondary_network(self, &request),
2354            "DeleteTrafficMirrorFilter" => rest::delete_traffic_mirror_filter(self, &request),
2355            "DeleteTrafficMirrorFilterRule" => {
2356                rest::delete_traffic_mirror_filter_rule(self, &request)
2357            }
2358            "DeleteTrafficMirrorSession" => rest::delete_traffic_mirror_session(self, &request),
2359            "DeleteTrafficMirrorTarget" => rest::delete_traffic_mirror_target(self, &request),
2360            "DeleteVpcBlockPublicAccessExclusion" => {
2361                rest::delete_vpc_block_public_access_exclusion(self, &request)
2362            }
2363            "DeleteVpcEncryptionControl" => rest::delete_vpc_encryption_control(self, &request),
2364            "DeprovisionByoipCidr" => rest::deprovision_byoip_cidr(self, &request),
2365            "DeprovisionPublicIpv4PoolCidr" => {
2366                rest::deprovision_public_ipv4_pool_cidr(self, &request)
2367            }
2368            "DescribeAggregateIdFormat" => rest::describe_aggregate_id_format(self, &request),
2369            "DescribeAwsNetworkPerformanceMetricSubscriptions" => {
2370                rest::describe_aws_network_performance_metric_subscriptions(self, &request)
2371            }
2372            "DescribeBundleTasks" => rest::describe_bundle_tasks(self, &request),
2373            "DescribeByoipCidrs" => rest::describe_byoip_cidrs(self, &request),
2374            "DescribeCapacityManagerDataExports" => {
2375                rest::describe_capacity_manager_data_exports(self, &request)
2376            }
2377            "DescribeClassicLinkInstances" => rest::describe_classic_link_instances(self, &request),
2378            "DescribeConversionTasks" => rest::describe_conversion_tasks(self, &request),
2379            "DescribeDeclarativePoliciesReports" => {
2380                rest::describe_declarative_policies_reports(self, &request)
2381            }
2382            "DescribeElasticGpus" => rest::describe_elastic_gpus(self, &request),
2383            "DescribeExportImageTasks" => rest::describe_export_image_tasks(self, &request),
2384            "DescribeExportTasks" => rest::describe_export_tasks(self, &request),
2385            "DescribeFpgaImageAttribute" => rest::describe_fpga_image_attribute(self, &request),
2386            "DescribeFpgaImages" => rest::describe_fpga_images(self, &request),
2387            "DescribeHostReservationOfferings" => {
2388                rest::describe_host_reservation_offerings(self, &request)
2389            }
2390            "DescribeHostReservations" => rest::describe_host_reservations(self, &request),
2391            "DescribeIamInstanceProfileAssociations" => {
2392                rest::describe_iam_instance_profile_associations(self, &request)
2393            }
2394            "DescribeIdFormat" => rest::describe_id_format(self, &request),
2395            "DescribeIdentityIdFormat" => rest::describe_identity_id_format(self, &request),
2396            "DescribeImageReferences" => rest::describe_image_references(self, &request),
2397            "DescribeImageUsageReportEntries" => {
2398                rest::describe_image_usage_report_entries(self, &request)
2399            }
2400            "DescribeImageUsageReports" => rest::describe_image_usage_reports(self, &request),
2401            "DescribeImportImageTasks" => rest::describe_import_image_tasks(self, &request),
2402            "DescribeImportSnapshotTasks" => rest::describe_import_snapshot_tasks(self, &request),
2403            "DescribeInstanceEventWindows" => rest::describe_instance_event_windows(self, &request),
2404            "DescribeInstanceImageMetadata" => {
2405                rest::describe_instance_image_metadata(self, &request)
2406            }
2407            "DescribeInstanceSqlHaHistoryStates" => {
2408                rest::describe_instance_sql_ha_history_states(self, &request)
2409            }
2410            "DescribeInstanceSqlHaStates" => rest::describe_instance_sql_ha_states(self, &request),
2411            "DescribeInstanceTypeOfferings" => {
2412                rest::describe_instance_type_offerings(self, &request)
2413            }
2414            "DescribeIpv6Pools" => rest::describe_ipv6_pools(self, &request),
2415            "DescribeMacModificationTasks" => rest::describe_mac_modification_tasks(self, &request),
2416            "DescribeManagedPrefixLists" => rest::describe_managed_prefix_lists(self, &request),
2417            "DescribeOutpostLags" => rest::describe_outpost_lags(self, &request),
2418            "DescribePrefixLists" => rest::describe_prefix_lists(self, &request),
2419            "DescribePrincipalIdFormat" => rest::describe_principal_id_format(self, &request),
2420            "DescribePublicIpv4Pools" => rest::describe_public_ipv4_pools(self, &request),
2421            "DescribeReplaceRootVolumeTasks" => {
2422                rest::describe_replace_root_volume_tasks(self, &request)
2423            }
2424            "DescribeRouteServerEndpoints" => rest::describe_route_server_endpoints(self, &request),
2425            "DescribeRouteServerPeers" => rest::describe_route_server_peers(self, &request),
2426            "DescribeRouteServers" => rest::describe_route_servers(self, &request),
2427            "DescribeScheduledInstanceAvailability" => {
2428                rest::describe_scheduled_instance_availability(self, &request)
2429            }
2430            "DescribeScheduledInstances" => rest::describe_scheduled_instances(self, &request),
2431            "DescribeSecondaryInterfaces" => rest::describe_secondary_interfaces(self, &request),
2432            "DescribeSecondaryNetworks" => rest::describe_secondary_networks(self, &request),
2433            "DescribeServiceLinkVirtualInterfaces" => {
2434                rest::describe_service_link_virtual_interfaces(self, &request)
2435            }
2436            "DescribeTrafficMirrorFilterRules" => {
2437                rest::describe_traffic_mirror_filter_rules(self, &request)
2438            }
2439            "DescribeTrafficMirrorFilters" => rest::describe_traffic_mirror_filters(self, &request),
2440            "DescribeTrafficMirrorSessions" => {
2441                rest::describe_traffic_mirror_sessions(self, &request)
2442            }
2443            "DescribeTrafficMirrorTargets" => rest::describe_traffic_mirror_targets(self, &request),
2444            "DescribeTrunkInterfaceAssociations" => {
2445                rest::describe_trunk_interface_associations(self, &request)
2446            }
2447            "DescribeVpcBlockPublicAccessExclusions" => {
2448                rest::describe_vpc_block_public_access_exclusions(self, &request)
2449            }
2450            "DescribeVpcBlockPublicAccessOptions" => {
2451                rest::describe_vpc_block_public_access_options(self, &request)
2452            }
2453            "DescribeVpcClassicLink" => rest::describe_vpc_classic_link(self, &request),
2454            "DescribeVpcClassicLinkDnsSupport" => {
2455                rest::describe_vpc_classic_link_dns_support(self, &request)
2456            }
2457            "DescribeVpcEncryptionControls" => {
2458                rest::describe_vpc_encryption_controls(self, &request)
2459            }
2460            "DetachClassicLinkVpc" => rest::detach_classic_link_vpc(self, &request),
2461            "DisableAwsNetworkPerformanceMetricSubscription" => {
2462                rest::disable_aws_network_performance_metric_subscription(self, &request)
2463            }
2464            "DisableCapacityManager" => rest::disable_capacity_manager(self, &request),
2465            "DisableInstanceSqlHaStandbyDetections" => {
2466                rest::disable_instance_sql_ha_standby_detections(self, &request)
2467            }
2468            "DisableRouteServerPropagation" => {
2469                rest::disable_route_server_propagation(self, &request)
2470            }
2471            "DisableVgwRoutePropagation" => rest::disable_vgw_route_propagation(self, &request),
2472            "DisableVpcClassicLink" => rest::disable_vpc_classic_link(self, &request),
2473            "DisableVpcClassicLinkDnsSupport" => {
2474                rest::disable_vpc_classic_link_dns_support(self, &request)
2475            }
2476            "DisassociateEnclaveCertificateIamRole" => {
2477                rest::disassociate_enclave_certificate_iam_role(self, &request)
2478            }
2479            "DisassociateIamInstanceProfile" => {
2480                rest::disassociate_iam_instance_profile(self, &request)
2481            }
2482            "DisassociateInstanceEventWindow" => {
2483                rest::disassociate_instance_event_window(self, &request)
2484            }
2485            "DisassociateRouteServer" => rest::disassociate_route_server(self, &request),
2486            "DisassociateTrunkInterface" => rest::disassociate_trunk_interface(self, &request),
2487            "EnableAwsNetworkPerformanceMetricSubscription" => {
2488                rest::enable_aws_network_performance_metric_subscription(self, &request)
2489            }
2490            "EnableCapacityManager" => rest::enable_capacity_manager(self, &request),
2491            "EnableInstanceSqlHaStandbyDetections" => {
2492                rest::enable_instance_sql_ha_standby_detections(self, &request)
2493            }
2494            "EnableReachabilityAnalyzerOrganizationSharing" => {
2495                rest::enable_reachability_analyzer_organization_sharing(self, &request)
2496            }
2497            "EnableRouteServerPropagation" => rest::enable_route_server_propagation(self, &request),
2498            "EnableVgwRoutePropagation" => rest::enable_vgw_route_propagation(self, &request),
2499            "EnableVpcClassicLink" => rest::enable_vpc_classic_link(self, &request),
2500            "EnableVpcClassicLinkDnsSupport" => {
2501                rest::enable_vpc_classic_link_dns_support(self, &request)
2502            }
2503            "ExportImage" => rest::export_image(self, &request),
2504            "GetAssociatedEnclaveCertificateIamRoles" => {
2505                rest::get_associated_enclave_certificate_iam_roles(self, &request)
2506            }
2507            "GetAssociatedIpv6PoolCidrs" => rest::get_associated_ipv6_pool_cidrs(self, &request),
2508            "GetAwsNetworkPerformanceData" => {
2509                rest::get_aws_network_performance_data(self, &request)
2510            }
2511            "GetCapacityManagerAttributes" => rest::get_capacity_manager_attributes(self, &request),
2512            "GetCapacityManagerMetricData" => {
2513                rest::get_capacity_manager_metric_data(self, &request)
2514            }
2515            "GetCapacityManagerMetricDimensions" => {
2516                rest::get_capacity_manager_metric_dimensions(self, &request)
2517            }
2518            "GetCapacityManagerMonitoredTagKeys" => {
2519                rest::get_capacity_manager_monitored_tag_keys(self, &request)
2520            }
2521            "GetDeclarativePoliciesReportSummary" => {
2522                rest::get_declarative_policies_report_summary(self, &request)
2523            }
2524            "GetDefaultCreditSpecification" => {
2525                rest::get_default_credit_specification(self, &request)
2526            }
2527            "GetHostReservationPurchasePreview" => {
2528                rest::get_host_reservation_purchase_preview(self, &request)
2529            }
2530            "GetImageAncestry" => rest::get_image_ancestry(self, &request),
2531            "GetInstanceTpmEkPub" => rest::get_instance_tpm_ek_pub(self, &request),
2532            "GetInstanceUefiData" => rest::get_instance_uefi_data(self, &request),
2533            "GetManagedPrefixListAssociations" => {
2534                rest::get_managed_prefix_list_associations(self, &request)
2535            }
2536            "GetManagedPrefixListEntries" => rest::get_managed_prefix_list_entries(self, &request),
2537            "GetManagedResourceVisibility" => rest::get_managed_resource_visibility(self, &request),
2538            "GetRouteServerAssociations" => rest::get_route_server_associations(self, &request),
2539            "GetRouteServerPropagations" => rest::get_route_server_propagations(self, &request),
2540            "GetRouteServerRoutingDatabase" => {
2541                rest::get_route_server_routing_database(self, &request)
2542            }
2543            "GetVpcResourcesBlockingEncryptionEnforcement" => {
2544                rest::get_vpc_resources_blocking_encryption_enforcement(self, &request)
2545            }
2546            "ImportImage" => rest::import_image(self, &request),
2547            "ImportInstance" => rest::import_instance(self, &request),
2548            "ImportSnapshot" => rest::import_snapshot(self, &request),
2549            "ImportVolume" => rest::import_volume(self, &request),
2550            "ModifyAvailabilityZoneGroup" => rest::modify_availability_zone_group(self, &request),
2551            "ModifyDefaultCreditSpecification" => {
2552                rest::modify_default_credit_specification(self, &request)
2553            }
2554            "ModifyFpgaImageAttribute" => rest::modify_fpga_image_attribute(self, &request),
2555            "ModifyIdFormat" => rest::modify_id_format(self, &request),
2556            "ModifyIdentityIdFormat" => rest::modify_identity_id_format(self, &request),
2557            "ModifyInstanceEventWindow" => rest::modify_instance_event_window(self, &request),
2558            "ModifyManagedPrefixList" => rest::modify_managed_prefix_list(self, &request),
2559            "ModifyManagedResourceVisibility" => {
2560                rest::modify_managed_resource_visibility(self, &request)
2561            }
2562            "ModifyPrivateDnsNameOptions" => rest::modify_private_dns_name_options(self, &request),
2563            "ModifyPublicIpDnsNameOptions" => {
2564                rest::modify_public_ip_dns_name_options(self, &request)
2565            }
2566            "ModifyRouteServer" => rest::modify_route_server(self, &request),
2567            "ModifyTrafficMirrorFilterNetworkServices" => {
2568                rest::modify_traffic_mirror_filter_network_services(self, &request)
2569            }
2570            "ModifyTrafficMirrorFilterRule" => {
2571                rest::modify_traffic_mirror_filter_rule(self, &request)
2572            }
2573            "ModifyTrafficMirrorSession" => rest::modify_traffic_mirror_session(self, &request),
2574            "ModifyVpcBlockPublicAccessExclusion" => {
2575                rest::modify_vpc_block_public_access_exclusion(self, &request)
2576            }
2577            "ModifyVpcBlockPublicAccessOptions" => {
2578                rest::modify_vpc_block_public_access_options(self, &request)
2579            }
2580            "ModifyVpcEncryptionControl" => rest::modify_vpc_encryption_control(self, &request),
2581            "ProvisionByoipCidr" => rest::provision_byoip_cidr(self, &request),
2582            "ProvisionPublicIpv4PoolCidr" => rest::provision_public_ipv4_pool_cidr(self, &request),
2583            "PurchaseHostReservation" => rest::purchase_host_reservation(self, &request),
2584            "PurchaseScheduledInstances" => rest::purchase_scheduled_instances(self, &request),
2585            "ReplaceIamInstanceProfileAssociation" => {
2586                rest::replace_iam_instance_profile_association(self, &request)
2587            }
2588            "ResetFpgaImageAttribute" => rest::reset_fpga_image_attribute(self, &request),
2589            "RestoreManagedPrefixListVersion" => {
2590                rest::restore_managed_prefix_list_version(self, &request)
2591            }
2592            "RunScheduledInstances" => rest::run_scheduled_instances(self, &request),
2593            "SendDiagnosticInterrupt" => rest::send_diagnostic_interrupt(self, &request),
2594            "StartDeclarativePoliciesReport" => {
2595                rest::start_declarative_policies_report(self, &request)
2596            }
2597            "UpdateCapacityManagerMonitoredTagKeys" => {
2598                rest::update_capacity_manager_monitored_tag_keys(self, &request)
2599            }
2600            "UpdateCapacityManagerOrganizationsAccess" => {
2601                rest::update_capacity_manager_organizations_access(self, &request)
2602            }
2603            "WithdrawByoipCidr" => rest::withdraw_byoip_cidr(self, &request),
2604            // Model ops absent from the vendored SDK client; tested via raw query.
2605            "CreateCapacityReservationCancellationQuote" => {
2606                rest::create_capacity_reservation_cancellation_quote(self, &request)
2607            }
2608            "DescribeCapacityReservationCancellationQuotes" => {
2609                rest::describe_capacity_reservation_cancellation_quotes(self, &request)
2610            }
2611            "DescribeIpamPoolAllocations" => rest::describe_ipam_pool_allocations(self, &request),
2612            "ModifyIpamPoolAllocation" => rest::modify_ipam_pool_allocation(self, &request),
2613            other => Err(AwsServiceError::aws_error(
2614                StatusCode::BAD_REQUEST,
2615                "InvalidAction",
2616                format!("The action {other} is not valid for this web service."),
2617            )),
2618        };
2619        if mutates && matches!(result.as_ref(), Ok(resp) if resp.status.is_success()) {
2620            self.save_snapshot().await;
2621        }
2622        result
2623    }
2624}
2625
2626impl Ec2Service {
2627    /// Render an `ec2Query` response for `action` with `body` as the inner XML.
2628    pub(crate) fn respond(action: &str, request_id: &str, body: &str) -> AwsResponse {
2629        AwsResponse::xml(
2630            StatusCode::OK,
2631            fakecloud_aws::ec2query::ec2_response(action, request_id, body),
2632        )
2633    }
2634}