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