Skip to main content

fakecloud_ec2/service/
mod.rs

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