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