diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon App Mesh SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2019-01-25@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-appmesh)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.AppMesh](http://hackage.haskell.org/package/amazonka-appmesh/docs/Amazonka-AppMesh.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-appmesh` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-appmesh.cabal b/amazonka-appmesh.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-appmesh.cabal
@@ -0,0 +1,283 @@
+cabal-version:      2.2
+name:               amazonka-appmesh
+version:            2.0
+synopsis:           Amazon App Mesh SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2019-01-25@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.AppMesh.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.AppMesh" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-appmesh
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.AppMesh
+    Amazonka.AppMesh.CreateGatewayRoute
+    Amazonka.AppMesh.CreateMesh
+    Amazonka.AppMesh.CreateRoute
+    Amazonka.AppMesh.CreateVirtualGateway
+    Amazonka.AppMesh.CreateVirtualNode
+    Amazonka.AppMesh.CreateVirtualRouter
+    Amazonka.AppMesh.CreateVirtualService
+    Amazonka.AppMesh.DeleteGatewayRoute
+    Amazonka.AppMesh.DeleteMesh
+    Amazonka.AppMesh.DeleteRoute
+    Amazonka.AppMesh.DeleteVirtualGateway
+    Amazonka.AppMesh.DeleteVirtualNode
+    Amazonka.AppMesh.DeleteVirtualRouter
+    Amazonka.AppMesh.DeleteVirtualService
+    Amazonka.AppMesh.DescribeGatewayRoute
+    Amazonka.AppMesh.DescribeMesh
+    Amazonka.AppMesh.DescribeRoute
+    Amazonka.AppMesh.DescribeVirtualGateway
+    Amazonka.AppMesh.DescribeVirtualNode
+    Amazonka.AppMesh.DescribeVirtualRouter
+    Amazonka.AppMesh.DescribeVirtualService
+    Amazonka.AppMesh.Lens
+    Amazonka.AppMesh.ListGatewayRoutes
+    Amazonka.AppMesh.ListMeshes
+    Amazonka.AppMesh.ListRoutes
+    Amazonka.AppMesh.ListTagsForResource
+    Amazonka.AppMesh.ListVirtualGateways
+    Amazonka.AppMesh.ListVirtualNodes
+    Amazonka.AppMesh.ListVirtualRouters
+    Amazonka.AppMesh.ListVirtualServices
+    Amazonka.AppMesh.TagResource
+    Amazonka.AppMesh.Types
+    Amazonka.AppMesh.Types.AccessLog
+    Amazonka.AppMesh.Types.AwsCloudMapInstanceAttribute
+    Amazonka.AppMesh.Types.AwsCloudMapServiceDiscovery
+    Amazonka.AppMesh.Types.Backend
+    Amazonka.AppMesh.Types.BackendDefaults
+    Amazonka.AppMesh.Types.ClientPolicy
+    Amazonka.AppMesh.Types.ClientPolicyTls
+    Amazonka.AppMesh.Types.ClientTlsCertificate
+    Amazonka.AppMesh.Types.DefaultGatewayRouteRewrite
+    Amazonka.AppMesh.Types.DnsResponseType
+    Amazonka.AppMesh.Types.DnsServiceDiscovery
+    Amazonka.AppMesh.Types.Duration
+    Amazonka.AppMesh.Types.DurationUnit
+    Amazonka.AppMesh.Types.EgressFilter
+    Amazonka.AppMesh.Types.EgressFilterType
+    Amazonka.AppMesh.Types.FileAccessLog
+    Amazonka.AppMesh.Types.GatewayRouteData
+    Amazonka.AppMesh.Types.GatewayRouteHostnameMatch
+    Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite
+    Amazonka.AppMesh.Types.GatewayRouteRef
+    Amazonka.AppMesh.Types.GatewayRouteSpec
+    Amazonka.AppMesh.Types.GatewayRouteStatus
+    Amazonka.AppMesh.Types.GatewayRouteStatusCode
+    Amazonka.AppMesh.Types.GatewayRouteTarget
+    Amazonka.AppMesh.Types.GatewayRouteVirtualService
+    Amazonka.AppMesh.Types.GrpcGatewayRoute
+    Amazonka.AppMesh.Types.GrpcGatewayRouteAction
+    Amazonka.AppMesh.Types.GrpcGatewayRouteMatch
+    Amazonka.AppMesh.Types.GrpcGatewayRouteMetadata
+    Amazonka.AppMesh.Types.GrpcGatewayRouteRewrite
+    Amazonka.AppMesh.Types.GrpcMetadataMatchMethod
+    Amazonka.AppMesh.Types.GrpcRetryPolicy
+    Amazonka.AppMesh.Types.GrpcRetryPolicyEvent
+    Amazonka.AppMesh.Types.GrpcRoute
+    Amazonka.AppMesh.Types.GrpcRouteAction
+    Amazonka.AppMesh.Types.GrpcRouteMatch
+    Amazonka.AppMesh.Types.GrpcRouteMetadata
+    Amazonka.AppMesh.Types.GrpcRouteMetadataMatchMethod
+    Amazonka.AppMesh.Types.GrpcTimeout
+    Amazonka.AppMesh.Types.HeaderMatchMethod
+    Amazonka.AppMesh.Types.HealthCheckPolicy
+    Amazonka.AppMesh.Types.HttpGatewayRoute
+    Amazonka.AppMesh.Types.HttpGatewayRouteAction
+    Amazonka.AppMesh.Types.HttpGatewayRouteHeader
+    Amazonka.AppMesh.Types.HttpGatewayRouteMatch
+    Amazonka.AppMesh.Types.HttpGatewayRoutePathRewrite
+    Amazonka.AppMesh.Types.HttpGatewayRoutePrefixRewrite
+    Amazonka.AppMesh.Types.HttpGatewayRouteRewrite
+    Amazonka.AppMesh.Types.HttpMethod
+    Amazonka.AppMesh.Types.HttpPathMatch
+    Amazonka.AppMesh.Types.HttpQueryParameter
+    Amazonka.AppMesh.Types.HttpRetryPolicy
+    Amazonka.AppMesh.Types.HttpRoute
+    Amazonka.AppMesh.Types.HttpRouteAction
+    Amazonka.AppMesh.Types.HttpRouteHeader
+    Amazonka.AppMesh.Types.HttpRouteMatch
+    Amazonka.AppMesh.Types.HttpScheme
+    Amazonka.AppMesh.Types.HttpTimeout
+    Amazonka.AppMesh.Types.IpPreference
+    Amazonka.AppMesh.Types.JsonFormatRef
+    Amazonka.AppMesh.Types.Listener
+    Amazonka.AppMesh.Types.ListenerTimeout
+    Amazonka.AppMesh.Types.ListenerTls
+    Amazonka.AppMesh.Types.ListenerTlsAcmCertificate
+    Amazonka.AppMesh.Types.ListenerTlsCertificate
+    Amazonka.AppMesh.Types.ListenerTlsFileCertificate
+    Amazonka.AppMesh.Types.ListenerTlsMode
+    Amazonka.AppMesh.Types.ListenerTlsSdsCertificate
+    Amazonka.AppMesh.Types.ListenerTlsValidationContext
+    Amazonka.AppMesh.Types.ListenerTlsValidationContextTrust
+    Amazonka.AppMesh.Types.Logging
+    Amazonka.AppMesh.Types.LoggingFormat
+    Amazonka.AppMesh.Types.MatchRange
+    Amazonka.AppMesh.Types.MeshData
+    Amazonka.AppMesh.Types.MeshRef
+    Amazonka.AppMesh.Types.MeshServiceDiscovery
+    Amazonka.AppMesh.Types.MeshSpec
+    Amazonka.AppMesh.Types.MeshStatus
+    Amazonka.AppMesh.Types.MeshStatusCode
+    Amazonka.AppMesh.Types.OutlierDetection
+    Amazonka.AppMesh.Types.PortMapping
+    Amazonka.AppMesh.Types.PortProtocol
+    Amazonka.AppMesh.Types.QueryParameterMatch
+    Amazonka.AppMesh.Types.ResourceMetadata
+    Amazonka.AppMesh.Types.RouteData
+    Amazonka.AppMesh.Types.RouteRef
+    Amazonka.AppMesh.Types.RouteSpec
+    Amazonka.AppMesh.Types.RouteStatus
+    Amazonka.AppMesh.Types.RouteStatusCode
+    Amazonka.AppMesh.Types.ServiceDiscovery
+    Amazonka.AppMesh.Types.SubjectAlternativeNameMatchers
+    Amazonka.AppMesh.Types.SubjectAlternativeNames
+    Amazonka.AppMesh.Types.TagRef
+    Amazonka.AppMesh.Types.TcpRetryPolicyEvent
+    Amazonka.AppMesh.Types.TcpRoute
+    Amazonka.AppMesh.Types.TcpRouteAction
+    Amazonka.AppMesh.Types.TcpRouteMatch
+    Amazonka.AppMesh.Types.TcpTimeout
+    Amazonka.AppMesh.Types.TlsValidationContext
+    Amazonka.AppMesh.Types.TlsValidationContextAcmTrust
+    Amazonka.AppMesh.Types.TlsValidationContextFileTrust
+    Amazonka.AppMesh.Types.TlsValidationContextSdsTrust
+    Amazonka.AppMesh.Types.TlsValidationContextTrust
+    Amazonka.AppMesh.Types.VirtualGatewayAccessLog
+    Amazonka.AppMesh.Types.VirtualGatewayBackendDefaults
+    Amazonka.AppMesh.Types.VirtualGatewayClientPolicy
+    Amazonka.AppMesh.Types.VirtualGatewayClientPolicyTls
+    Amazonka.AppMesh.Types.VirtualGatewayClientTlsCertificate
+    Amazonka.AppMesh.Types.VirtualGatewayConnectionPool
+    Amazonka.AppMesh.Types.VirtualGatewayData
+    Amazonka.AppMesh.Types.VirtualGatewayFileAccessLog
+    Amazonka.AppMesh.Types.VirtualGatewayGrpcConnectionPool
+    Amazonka.AppMesh.Types.VirtualGatewayHealthCheckPolicy
+    Amazonka.AppMesh.Types.VirtualGatewayHttp2ConnectionPool
+    Amazonka.AppMesh.Types.VirtualGatewayHttpConnectionPool
+    Amazonka.AppMesh.Types.VirtualGatewayListener
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTls
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsAcmCertificate
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsCertificate
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsMode
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContext
+    Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContextTrust
+    Amazonka.AppMesh.Types.VirtualGatewayLogging
+    Amazonka.AppMesh.Types.VirtualGatewayPortMapping
+    Amazonka.AppMesh.Types.VirtualGatewayPortProtocol
+    Amazonka.AppMesh.Types.VirtualGatewayRef
+    Amazonka.AppMesh.Types.VirtualGatewaySpec
+    Amazonka.AppMesh.Types.VirtualGatewayStatus
+    Amazonka.AppMesh.Types.VirtualGatewayStatusCode
+    Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContext
+    Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextAcmTrust
+    Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust
+    Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust
+    Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextTrust
+    Amazonka.AppMesh.Types.VirtualNodeConnectionPool
+    Amazonka.AppMesh.Types.VirtualNodeData
+    Amazonka.AppMesh.Types.VirtualNodeGrpcConnectionPool
+    Amazonka.AppMesh.Types.VirtualNodeHttp2ConnectionPool
+    Amazonka.AppMesh.Types.VirtualNodeHttpConnectionPool
+    Amazonka.AppMesh.Types.VirtualNodeRef
+    Amazonka.AppMesh.Types.VirtualNodeServiceProvider
+    Amazonka.AppMesh.Types.VirtualNodeSpec
+    Amazonka.AppMesh.Types.VirtualNodeStatus
+    Amazonka.AppMesh.Types.VirtualNodeStatusCode
+    Amazonka.AppMesh.Types.VirtualNodeTcpConnectionPool
+    Amazonka.AppMesh.Types.VirtualRouterData
+    Amazonka.AppMesh.Types.VirtualRouterListener
+    Amazonka.AppMesh.Types.VirtualRouterRef
+    Amazonka.AppMesh.Types.VirtualRouterServiceProvider
+    Amazonka.AppMesh.Types.VirtualRouterSpec
+    Amazonka.AppMesh.Types.VirtualRouterStatus
+    Amazonka.AppMesh.Types.VirtualRouterStatusCode
+    Amazonka.AppMesh.Types.VirtualServiceBackend
+    Amazonka.AppMesh.Types.VirtualServiceData
+    Amazonka.AppMesh.Types.VirtualServiceProvider
+    Amazonka.AppMesh.Types.VirtualServiceRef
+    Amazonka.AppMesh.Types.VirtualServiceSpec
+    Amazonka.AppMesh.Types.VirtualServiceStatus
+    Amazonka.AppMesh.Types.VirtualServiceStatusCode
+    Amazonka.AppMesh.Types.WeightedTarget
+    Amazonka.AppMesh.UntagResource
+    Amazonka.AppMesh.UpdateGatewayRoute
+    Amazonka.AppMesh.UpdateMesh
+    Amazonka.AppMesh.UpdateRoute
+    Amazonka.AppMesh.UpdateVirtualGateway
+    Amazonka.AppMesh.UpdateVirtualNode
+    Amazonka.AppMesh.UpdateVirtualRouter
+    Amazonka.AppMesh.UpdateVirtualService
+    Amazonka.AppMesh.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-appmesh-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.AppMesh
+    Test.Amazonka.AppMesh.Internal
+    Test.Amazonka.Gen.AppMesh
+
+  build-depends:
+    , amazonka-appmesh
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateGatewayRoute.yaml b/fixture/CreateGatewayRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGatewayRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateGatewayRouteResponse.proto b/fixture/CreateGatewayRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGatewayRouteResponse.proto
diff --git a/fixture/CreateMesh.yaml b/fixture/CreateMesh.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMesh.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateMeshResponse.proto b/fixture/CreateMeshResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMeshResponse.proto
diff --git a/fixture/CreateRoute.yaml b/fixture/CreateRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateRouteResponse.proto b/fixture/CreateRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRouteResponse.proto
diff --git a/fixture/CreateVirtualGateway.yaml b/fixture/CreateVirtualGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateVirtualGatewayResponse.proto b/fixture/CreateVirtualGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualGatewayResponse.proto
diff --git a/fixture/CreateVirtualNode.yaml b/fixture/CreateVirtualNode.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualNode.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateVirtualNodeResponse.proto b/fixture/CreateVirtualNodeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualNodeResponse.proto
diff --git a/fixture/CreateVirtualRouter.yaml b/fixture/CreateVirtualRouter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualRouter.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateVirtualRouterResponse.proto b/fixture/CreateVirtualRouterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualRouterResponse.proto
diff --git a/fixture/CreateVirtualService.yaml b/fixture/CreateVirtualService.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualService.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateVirtualServiceResponse.proto b/fixture/CreateVirtualServiceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualServiceResponse.proto
diff --git a/fixture/DeleteGatewayRoute.yaml b/fixture/DeleteGatewayRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGatewayRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteGatewayRouteResponse.proto b/fixture/DeleteGatewayRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGatewayRouteResponse.proto
diff --git a/fixture/DeleteMesh.yaml b/fixture/DeleteMesh.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMesh.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteMeshResponse.proto b/fixture/DeleteMeshResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMeshResponse.proto
diff --git a/fixture/DeleteRoute.yaml b/fixture/DeleteRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteRouteResponse.proto b/fixture/DeleteRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRouteResponse.proto
diff --git a/fixture/DeleteVirtualGateway.yaml b/fixture/DeleteVirtualGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteVirtualGatewayResponse.proto b/fixture/DeleteVirtualGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualGatewayResponse.proto
diff --git a/fixture/DeleteVirtualNode.yaml b/fixture/DeleteVirtualNode.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualNode.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteVirtualNodeResponse.proto b/fixture/DeleteVirtualNodeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualNodeResponse.proto
diff --git a/fixture/DeleteVirtualRouter.yaml b/fixture/DeleteVirtualRouter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualRouter.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteVirtualRouterResponse.proto b/fixture/DeleteVirtualRouterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualRouterResponse.proto
diff --git a/fixture/DeleteVirtualService.yaml b/fixture/DeleteVirtualService.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualService.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteVirtualServiceResponse.proto b/fixture/DeleteVirtualServiceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualServiceResponse.proto
diff --git a/fixture/DescribeGatewayRoute.yaml b/fixture/DescribeGatewayRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGatewayRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeGatewayRouteResponse.proto b/fixture/DescribeGatewayRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGatewayRouteResponse.proto
diff --git a/fixture/DescribeMesh.yaml b/fixture/DescribeMesh.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeMesh.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeMeshResponse.proto b/fixture/DescribeMeshResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeMeshResponse.proto
diff --git a/fixture/DescribeRoute.yaml b/fixture/DescribeRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeRouteResponse.proto b/fixture/DescribeRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRouteResponse.proto
diff --git a/fixture/DescribeVirtualGateway.yaml b/fixture/DescribeVirtualGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeVirtualGatewayResponse.proto b/fixture/DescribeVirtualGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualGatewayResponse.proto
diff --git a/fixture/DescribeVirtualNode.yaml b/fixture/DescribeVirtualNode.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualNode.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeVirtualNodeResponse.proto b/fixture/DescribeVirtualNodeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualNodeResponse.proto
diff --git a/fixture/DescribeVirtualRouter.yaml b/fixture/DescribeVirtualRouter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualRouter.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeVirtualRouterResponse.proto b/fixture/DescribeVirtualRouterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualRouterResponse.proto
diff --git a/fixture/DescribeVirtualService.yaml b/fixture/DescribeVirtualService.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualService.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeVirtualServiceResponse.proto b/fixture/DescribeVirtualServiceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualServiceResponse.proto
diff --git a/fixture/ListGatewayRoutes.yaml b/fixture/ListGatewayRoutes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGatewayRoutes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListGatewayRoutesResponse.proto b/fixture/ListGatewayRoutesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGatewayRoutesResponse.proto
diff --git a/fixture/ListMeshes.yaml b/fixture/ListMeshes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListMeshes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListMeshesResponse.proto b/fixture/ListMeshesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListMeshesResponse.proto
diff --git a/fixture/ListRoutes.yaml b/fixture/ListRoutes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRoutes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListRoutesResponse.proto b/fixture/ListRoutesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRoutesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/ListVirtualGateways.yaml b/fixture/ListVirtualGateways.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualGateways.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVirtualGatewaysResponse.proto b/fixture/ListVirtualGatewaysResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualGatewaysResponse.proto
diff --git a/fixture/ListVirtualNodes.yaml b/fixture/ListVirtualNodes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualNodes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVirtualNodesResponse.proto b/fixture/ListVirtualNodesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualNodesResponse.proto
diff --git a/fixture/ListVirtualRouters.yaml b/fixture/ListVirtualRouters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualRouters.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVirtualRoutersResponse.proto b/fixture/ListVirtualRoutersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualRoutersResponse.proto
diff --git a/fixture/ListVirtualServices.yaml b/fixture/ListVirtualServices.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualServices.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListVirtualServicesResponse.proto b/fixture/ListVirtualServicesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualServicesResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateGatewayRoute.yaml b/fixture/UpdateGatewayRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGatewayRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateGatewayRouteResponse.proto b/fixture/UpdateGatewayRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGatewayRouteResponse.proto
diff --git a/fixture/UpdateMesh.yaml b/fixture/UpdateMesh.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMesh.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateMeshResponse.proto b/fixture/UpdateMeshResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMeshResponse.proto
diff --git a/fixture/UpdateRoute.yaml b/fixture/UpdateRoute.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRoute.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateRouteResponse.proto b/fixture/UpdateRouteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRouteResponse.proto
diff --git a/fixture/UpdateVirtualGateway.yaml b/fixture/UpdateVirtualGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateVirtualGatewayResponse.proto b/fixture/UpdateVirtualGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualGatewayResponse.proto
diff --git a/fixture/UpdateVirtualNode.yaml b/fixture/UpdateVirtualNode.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualNode.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateVirtualNodeResponse.proto b/fixture/UpdateVirtualNodeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualNodeResponse.proto
diff --git a/fixture/UpdateVirtualRouter.yaml b/fixture/UpdateVirtualRouter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualRouter.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateVirtualRouterResponse.proto b/fixture/UpdateVirtualRouterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualRouterResponse.proto
diff --git a/fixture/UpdateVirtualService.yaml b/fixture/UpdateVirtualService.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualService.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/appmesh/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  appmesh.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateVirtualServiceResponse.proto b/fixture/UpdateVirtualServiceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVirtualServiceResponse.proto
diff --git a/gen/Amazonka/AppMesh.hs b/gen/Amazonka/AppMesh.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh.hs
@@ -0,0 +1,1002 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.AppMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2019-01-25@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- App Mesh is a service mesh based on the Envoy proxy that makes it easy
+-- to monitor and control microservices. App Mesh standardizes how your
+-- microservices communicate, giving you end-to-end visibility and helping
+-- to ensure high availability for your applications.
+--
+-- App Mesh gives you consistent visibility and network traffic controls
+-- for every microservice in an application. You can use App Mesh with
+-- Amazon Web Services Fargate, Amazon ECS, Amazon EKS, Kubernetes on
+-- Amazon Web Services, and Amazon EC2.
+--
+-- App Mesh supports microservice applications that use service discovery
+-- naming for their components. For more information about service
+-- discovery on Amazon ECS, see
+-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html Service Discovery>
+-- in the /Amazon Elastic Container Service Developer Guide/. Kubernetes
+-- @kube-dns@ and @coredns@ are supported. For more information, see
+-- <https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ DNS for Services and Pods>
+-- in the Kubernetes documentation.
+module Amazonka.AppMesh
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** BadRequestException
+    _BadRequestException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** ForbiddenException
+    _ForbiddenException,
+
+    -- ** InternalServerErrorException
+    _InternalServerErrorException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** NotFoundException
+    _NotFoundException,
+
+    -- ** ResourceInUseException
+    _ResourceInUseException,
+
+    -- ** ServiceUnavailableException
+    _ServiceUnavailableException,
+
+    -- ** TooManyRequestsException
+    _TooManyRequestsException,
+
+    -- ** TooManyTagsException
+    _TooManyTagsException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateGatewayRoute
+    CreateGatewayRoute (CreateGatewayRoute'),
+    newCreateGatewayRoute,
+    CreateGatewayRouteResponse (CreateGatewayRouteResponse'),
+    newCreateGatewayRouteResponse,
+
+    -- ** CreateMesh
+    CreateMesh (CreateMesh'),
+    newCreateMesh,
+    CreateMeshResponse (CreateMeshResponse'),
+    newCreateMeshResponse,
+
+    -- ** CreateRoute
+    CreateRoute (CreateRoute'),
+    newCreateRoute,
+    CreateRouteResponse (CreateRouteResponse'),
+    newCreateRouteResponse,
+
+    -- ** CreateVirtualGateway
+    CreateVirtualGateway (CreateVirtualGateway'),
+    newCreateVirtualGateway,
+    CreateVirtualGatewayResponse (CreateVirtualGatewayResponse'),
+    newCreateVirtualGatewayResponse,
+
+    -- ** CreateVirtualNode
+    CreateVirtualNode (CreateVirtualNode'),
+    newCreateVirtualNode,
+    CreateVirtualNodeResponse (CreateVirtualNodeResponse'),
+    newCreateVirtualNodeResponse,
+
+    -- ** CreateVirtualRouter
+    CreateVirtualRouter (CreateVirtualRouter'),
+    newCreateVirtualRouter,
+    CreateVirtualRouterResponse (CreateVirtualRouterResponse'),
+    newCreateVirtualRouterResponse,
+
+    -- ** CreateVirtualService
+    CreateVirtualService (CreateVirtualService'),
+    newCreateVirtualService,
+    CreateVirtualServiceResponse (CreateVirtualServiceResponse'),
+    newCreateVirtualServiceResponse,
+
+    -- ** DeleteGatewayRoute
+    DeleteGatewayRoute (DeleteGatewayRoute'),
+    newDeleteGatewayRoute,
+    DeleteGatewayRouteResponse (DeleteGatewayRouteResponse'),
+    newDeleteGatewayRouteResponse,
+
+    -- ** DeleteMesh
+    DeleteMesh (DeleteMesh'),
+    newDeleteMesh,
+    DeleteMeshResponse (DeleteMeshResponse'),
+    newDeleteMeshResponse,
+
+    -- ** DeleteRoute
+    DeleteRoute (DeleteRoute'),
+    newDeleteRoute,
+    DeleteRouteResponse (DeleteRouteResponse'),
+    newDeleteRouteResponse,
+
+    -- ** DeleteVirtualGateway
+    DeleteVirtualGateway (DeleteVirtualGateway'),
+    newDeleteVirtualGateway,
+    DeleteVirtualGatewayResponse (DeleteVirtualGatewayResponse'),
+    newDeleteVirtualGatewayResponse,
+
+    -- ** DeleteVirtualNode
+    DeleteVirtualNode (DeleteVirtualNode'),
+    newDeleteVirtualNode,
+    DeleteVirtualNodeResponse (DeleteVirtualNodeResponse'),
+    newDeleteVirtualNodeResponse,
+
+    -- ** DeleteVirtualRouter
+    DeleteVirtualRouter (DeleteVirtualRouter'),
+    newDeleteVirtualRouter,
+    DeleteVirtualRouterResponse (DeleteVirtualRouterResponse'),
+    newDeleteVirtualRouterResponse,
+
+    -- ** DeleteVirtualService
+    DeleteVirtualService (DeleteVirtualService'),
+    newDeleteVirtualService,
+    DeleteVirtualServiceResponse (DeleteVirtualServiceResponse'),
+    newDeleteVirtualServiceResponse,
+
+    -- ** DescribeGatewayRoute
+    DescribeGatewayRoute (DescribeGatewayRoute'),
+    newDescribeGatewayRoute,
+    DescribeGatewayRouteResponse (DescribeGatewayRouteResponse'),
+    newDescribeGatewayRouteResponse,
+
+    -- ** DescribeMesh
+    DescribeMesh (DescribeMesh'),
+    newDescribeMesh,
+    DescribeMeshResponse (DescribeMeshResponse'),
+    newDescribeMeshResponse,
+
+    -- ** DescribeRoute
+    DescribeRoute (DescribeRoute'),
+    newDescribeRoute,
+    DescribeRouteResponse (DescribeRouteResponse'),
+    newDescribeRouteResponse,
+
+    -- ** DescribeVirtualGateway
+    DescribeVirtualGateway (DescribeVirtualGateway'),
+    newDescribeVirtualGateway,
+    DescribeVirtualGatewayResponse (DescribeVirtualGatewayResponse'),
+    newDescribeVirtualGatewayResponse,
+
+    -- ** DescribeVirtualNode
+    DescribeVirtualNode (DescribeVirtualNode'),
+    newDescribeVirtualNode,
+    DescribeVirtualNodeResponse (DescribeVirtualNodeResponse'),
+    newDescribeVirtualNodeResponse,
+
+    -- ** DescribeVirtualRouter
+    DescribeVirtualRouter (DescribeVirtualRouter'),
+    newDescribeVirtualRouter,
+    DescribeVirtualRouterResponse (DescribeVirtualRouterResponse'),
+    newDescribeVirtualRouterResponse,
+
+    -- ** DescribeVirtualService
+    DescribeVirtualService (DescribeVirtualService'),
+    newDescribeVirtualService,
+    DescribeVirtualServiceResponse (DescribeVirtualServiceResponse'),
+    newDescribeVirtualServiceResponse,
+
+    -- ** ListGatewayRoutes (Paginated)
+    ListGatewayRoutes (ListGatewayRoutes'),
+    newListGatewayRoutes,
+    ListGatewayRoutesResponse (ListGatewayRoutesResponse'),
+    newListGatewayRoutesResponse,
+
+    -- ** ListMeshes (Paginated)
+    ListMeshes (ListMeshes'),
+    newListMeshes,
+    ListMeshesResponse (ListMeshesResponse'),
+    newListMeshesResponse,
+
+    -- ** ListRoutes (Paginated)
+    ListRoutes (ListRoutes'),
+    newListRoutes,
+    ListRoutesResponse (ListRoutesResponse'),
+    newListRoutesResponse,
+
+    -- ** ListTagsForResource (Paginated)
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ListVirtualGateways (Paginated)
+    ListVirtualGateways (ListVirtualGateways'),
+    newListVirtualGateways,
+    ListVirtualGatewaysResponse (ListVirtualGatewaysResponse'),
+    newListVirtualGatewaysResponse,
+
+    -- ** ListVirtualNodes (Paginated)
+    ListVirtualNodes (ListVirtualNodes'),
+    newListVirtualNodes,
+    ListVirtualNodesResponse (ListVirtualNodesResponse'),
+    newListVirtualNodesResponse,
+
+    -- ** ListVirtualRouters (Paginated)
+    ListVirtualRouters (ListVirtualRouters'),
+    newListVirtualRouters,
+    ListVirtualRoutersResponse (ListVirtualRoutersResponse'),
+    newListVirtualRoutersResponse,
+
+    -- ** ListVirtualServices (Paginated)
+    ListVirtualServices (ListVirtualServices'),
+    newListVirtualServices,
+    ListVirtualServicesResponse (ListVirtualServicesResponse'),
+    newListVirtualServicesResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateGatewayRoute
+    UpdateGatewayRoute (UpdateGatewayRoute'),
+    newUpdateGatewayRoute,
+    UpdateGatewayRouteResponse (UpdateGatewayRouteResponse'),
+    newUpdateGatewayRouteResponse,
+
+    -- ** UpdateMesh
+    UpdateMesh (UpdateMesh'),
+    newUpdateMesh,
+    UpdateMeshResponse (UpdateMeshResponse'),
+    newUpdateMeshResponse,
+
+    -- ** UpdateRoute
+    UpdateRoute (UpdateRoute'),
+    newUpdateRoute,
+    UpdateRouteResponse (UpdateRouteResponse'),
+    newUpdateRouteResponse,
+
+    -- ** UpdateVirtualGateway
+    UpdateVirtualGateway (UpdateVirtualGateway'),
+    newUpdateVirtualGateway,
+    UpdateVirtualGatewayResponse (UpdateVirtualGatewayResponse'),
+    newUpdateVirtualGatewayResponse,
+
+    -- ** UpdateVirtualNode
+    UpdateVirtualNode (UpdateVirtualNode'),
+    newUpdateVirtualNode,
+    UpdateVirtualNodeResponse (UpdateVirtualNodeResponse'),
+    newUpdateVirtualNodeResponse,
+
+    -- ** UpdateVirtualRouter
+    UpdateVirtualRouter (UpdateVirtualRouter'),
+    newUpdateVirtualRouter,
+    UpdateVirtualRouterResponse (UpdateVirtualRouterResponse'),
+    newUpdateVirtualRouterResponse,
+
+    -- ** UpdateVirtualService
+    UpdateVirtualService (UpdateVirtualService'),
+    newUpdateVirtualService,
+    UpdateVirtualServiceResponse (UpdateVirtualServiceResponse'),
+    newUpdateVirtualServiceResponse,
+
+    -- * Types
+
+    -- ** DefaultGatewayRouteRewrite
+    DefaultGatewayRouteRewrite (..),
+
+    -- ** DnsResponseType
+    DnsResponseType (..),
+
+    -- ** DurationUnit
+    DurationUnit (..),
+
+    -- ** EgressFilterType
+    EgressFilterType (..),
+
+    -- ** GatewayRouteStatusCode
+    GatewayRouteStatusCode (..),
+
+    -- ** GrpcRetryPolicyEvent
+    GrpcRetryPolicyEvent (..),
+
+    -- ** HttpMethod
+    HttpMethod (..),
+
+    -- ** HttpScheme
+    HttpScheme (..),
+
+    -- ** IpPreference
+    IpPreference (..),
+
+    -- ** ListenerTlsMode
+    ListenerTlsMode (..),
+
+    -- ** MeshStatusCode
+    MeshStatusCode (..),
+
+    -- ** PortProtocol
+    PortProtocol (..),
+
+    -- ** RouteStatusCode
+    RouteStatusCode (..),
+
+    -- ** TcpRetryPolicyEvent
+    TcpRetryPolicyEvent (..),
+
+    -- ** VirtualGatewayListenerTlsMode
+    VirtualGatewayListenerTlsMode (..),
+
+    -- ** VirtualGatewayPortProtocol
+    VirtualGatewayPortProtocol (..),
+
+    -- ** VirtualGatewayStatusCode
+    VirtualGatewayStatusCode (..),
+
+    -- ** VirtualNodeStatusCode
+    VirtualNodeStatusCode (..),
+
+    -- ** VirtualRouterStatusCode
+    VirtualRouterStatusCode (..),
+
+    -- ** VirtualServiceStatusCode
+    VirtualServiceStatusCode (..),
+
+    -- ** AccessLog
+    AccessLog (AccessLog'),
+    newAccessLog,
+
+    -- ** AwsCloudMapInstanceAttribute
+    AwsCloudMapInstanceAttribute (AwsCloudMapInstanceAttribute'),
+    newAwsCloudMapInstanceAttribute,
+
+    -- ** AwsCloudMapServiceDiscovery
+    AwsCloudMapServiceDiscovery (AwsCloudMapServiceDiscovery'),
+    newAwsCloudMapServiceDiscovery,
+
+    -- ** Backend
+    Backend (Backend'),
+    newBackend,
+
+    -- ** BackendDefaults
+    BackendDefaults (BackendDefaults'),
+    newBackendDefaults,
+
+    -- ** ClientPolicy
+    ClientPolicy (ClientPolicy'),
+    newClientPolicy,
+
+    -- ** ClientPolicyTls
+    ClientPolicyTls (ClientPolicyTls'),
+    newClientPolicyTls,
+
+    -- ** ClientTlsCertificate
+    ClientTlsCertificate (ClientTlsCertificate'),
+    newClientTlsCertificate,
+
+    -- ** DnsServiceDiscovery
+    DnsServiceDiscovery (DnsServiceDiscovery'),
+    newDnsServiceDiscovery,
+
+    -- ** Duration
+    Duration (Duration'),
+    newDuration,
+
+    -- ** EgressFilter
+    EgressFilter (EgressFilter'),
+    newEgressFilter,
+
+    -- ** FileAccessLog
+    FileAccessLog (FileAccessLog'),
+    newFileAccessLog,
+
+    -- ** GatewayRouteData
+    GatewayRouteData (GatewayRouteData'),
+    newGatewayRouteData,
+
+    -- ** GatewayRouteHostnameMatch
+    GatewayRouteHostnameMatch (GatewayRouteHostnameMatch'),
+    newGatewayRouteHostnameMatch,
+
+    -- ** GatewayRouteHostnameRewrite
+    GatewayRouteHostnameRewrite (GatewayRouteHostnameRewrite'),
+    newGatewayRouteHostnameRewrite,
+
+    -- ** GatewayRouteRef
+    GatewayRouteRef (GatewayRouteRef'),
+    newGatewayRouteRef,
+
+    -- ** GatewayRouteSpec
+    GatewayRouteSpec (GatewayRouteSpec'),
+    newGatewayRouteSpec,
+
+    -- ** GatewayRouteStatus
+    GatewayRouteStatus (GatewayRouteStatus'),
+    newGatewayRouteStatus,
+
+    -- ** GatewayRouteTarget
+    GatewayRouteTarget (GatewayRouteTarget'),
+    newGatewayRouteTarget,
+
+    -- ** GatewayRouteVirtualService
+    GatewayRouteVirtualService (GatewayRouteVirtualService'),
+    newGatewayRouteVirtualService,
+
+    -- ** GrpcGatewayRoute
+    GrpcGatewayRoute (GrpcGatewayRoute'),
+    newGrpcGatewayRoute,
+
+    -- ** GrpcGatewayRouteAction
+    GrpcGatewayRouteAction (GrpcGatewayRouteAction'),
+    newGrpcGatewayRouteAction,
+
+    -- ** GrpcGatewayRouteMatch
+    GrpcGatewayRouteMatch (GrpcGatewayRouteMatch'),
+    newGrpcGatewayRouteMatch,
+
+    -- ** GrpcGatewayRouteMetadata
+    GrpcGatewayRouteMetadata (GrpcGatewayRouteMetadata'),
+    newGrpcGatewayRouteMetadata,
+
+    -- ** GrpcGatewayRouteRewrite
+    GrpcGatewayRouteRewrite (GrpcGatewayRouteRewrite'),
+    newGrpcGatewayRouteRewrite,
+
+    -- ** GrpcMetadataMatchMethod
+    GrpcMetadataMatchMethod (GrpcMetadataMatchMethod'),
+    newGrpcMetadataMatchMethod,
+
+    -- ** GrpcRetryPolicy
+    GrpcRetryPolicy (GrpcRetryPolicy'),
+    newGrpcRetryPolicy,
+
+    -- ** GrpcRoute
+    GrpcRoute (GrpcRoute'),
+    newGrpcRoute,
+
+    -- ** GrpcRouteAction
+    GrpcRouteAction (GrpcRouteAction'),
+    newGrpcRouteAction,
+
+    -- ** GrpcRouteMatch
+    GrpcRouteMatch (GrpcRouteMatch'),
+    newGrpcRouteMatch,
+
+    -- ** GrpcRouteMetadata
+    GrpcRouteMetadata (GrpcRouteMetadata'),
+    newGrpcRouteMetadata,
+
+    -- ** GrpcRouteMetadataMatchMethod
+    GrpcRouteMetadataMatchMethod (GrpcRouteMetadataMatchMethod'),
+    newGrpcRouteMetadataMatchMethod,
+
+    -- ** GrpcTimeout
+    GrpcTimeout (GrpcTimeout'),
+    newGrpcTimeout,
+
+    -- ** HeaderMatchMethod
+    HeaderMatchMethod (HeaderMatchMethod'),
+    newHeaderMatchMethod,
+
+    -- ** HealthCheckPolicy
+    HealthCheckPolicy (HealthCheckPolicy'),
+    newHealthCheckPolicy,
+
+    -- ** HttpGatewayRoute
+    HttpGatewayRoute (HttpGatewayRoute'),
+    newHttpGatewayRoute,
+
+    -- ** HttpGatewayRouteAction
+    HttpGatewayRouteAction (HttpGatewayRouteAction'),
+    newHttpGatewayRouteAction,
+
+    -- ** HttpGatewayRouteHeader
+    HttpGatewayRouteHeader (HttpGatewayRouteHeader'),
+    newHttpGatewayRouteHeader,
+
+    -- ** HttpGatewayRouteMatch
+    HttpGatewayRouteMatch (HttpGatewayRouteMatch'),
+    newHttpGatewayRouteMatch,
+
+    -- ** HttpGatewayRoutePathRewrite
+    HttpGatewayRoutePathRewrite (HttpGatewayRoutePathRewrite'),
+    newHttpGatewayRoutePathRewrite,
+
+    -- ** HttpGatewayRoutePrefixRewrite
+    HttpGatewayRoutePrefixRewrite (HttpGatewayRoutePrefixRewrite'),
+    newHttpGatewayRoutePrefixRewrite,
+
+    -- ** HttpGatewayRouteRewrite
+    HttpGatewayRouteRewrite (HttpGatewayRouteRewrite'),
+    newHttpGatewayRouteRewrite,
+
+    -- ** HttpPathMatch
+    HttpPathMatch (HttpPathMatch'),
+    newHttpPathMatch,
+
+    -- ** HttpQueryParameter
+    HttpQueryParameter (HttpQueryParameter'),
+    newHttpQueryParameter,
+
+    -- ** HttpRetryPolicy
+    HttpRetryPolicy (HttpRetryPolicy'),
+    newHttpRetryPolicy,
+
+    -- ** HttpRoute
+    HttpRoute (HttpRoute'),
+    newHttpRoute,
+
+    -- ** HttpRouteAction
+    HttpRouteAction (HttpRouteAction'),
+    newHttpRouteAction,
+
+    -- ** HttpRouteHeader
+    HttpRouteHeader (HttpRouteHeader'),
+    newHttpRouteHeader,
+
+    -- ** HttpRouteMatch
+    HttpRouteMatch (HttpRouteMatch'),
+    newHttpRouteMatch,
+
+    -- ** HttpTimeout
+    HttpTimeout (HttpTimeout'),
+    newHttpTimeout,
+
+    -- ** JsonFormatRef
+    JsonFormatRef (JsonFormatRef'),
+    newJsonFormatRef,
+
+    -- ** Listener
+    Listener (Listener'),
+    newListener,
+
+    -- ** ListenerTimeout
+    ListenerTimeout (ListenerTimeout'),
+    newListenerTimeout,
+
+    -- ** ListenerTls
+    ListenerTls (ListenerTls'),
+    newListenerTls,
+
+    -- ** ListenerTlsAcmCertificate
+    ListenerTlsAcmCertificate (ListenerTlsAcmCertificate'),
+    newListenerTlsAcmCertificate,
+
+    -- ** ListenerTlsCertificate
+    ListenerTlsCertificate (ListenerTlsCertificate'),
+    newListenerTlsCertificate,
+
+    -- ** ListenerTlsFileCertificate
+    ListenerTlsFileCertificate (ListenerTlsFileCertificate'),
+    newListenerTlsFileCertificate,
+
+    -- ** ListenerTlsSdsCertificate
+    ListenerTlsSdsCertificate (ListenerTlsSdsCertificate'),
+    newListenerTlsSdsCertificate,
+
+    -- ** ListenerTlsValidationContext
+    ListenerTlsValidationContext (ListenerTlsValidationContext'),
+    newListenerTlsValidationContext,
+
+    -- ** ListenerTlsValidationContextTrust
+    ListenerTlsValidationContextTrust (ListenerTlsValidationContextTrust'),
+    newListenerTlsValidationContextTrust,
+
+    -- ** Logging
+    Logging (Logging'),
+    newLogging,
+
+    -- ** LoggingFormat
+    LoggingFormat (LoggingFormat'),
+    newLoggingFormat,
+
+    -- ** MatchRange
+    MatchRange (MatchRange'),
+    newMatchRange,
+
+    -- ** MeshData
+    MeshData (MeshData'),
+    newMeshData,
+
+    -- ** MeshRef
+    MeshRef (MeshRef'),
+    newMeshRef,
+
+    -- ** MeshServiceDiscovery
+    MeshServiceDiscovery (MeshServiceDiscovery'),
+    newMeshServiceDiscovery,
+
+    -- ** MeshSpec
+    MeshSpec (MeshSpec'),
+    newMeshSpec,
+
+    -- ** MeshStatus
+    MeshStatus (MeshStatus'),
+    newMeshStatus,
+
+    -- ** OutlierDetection
+    OutlierDetection (OutlierDetection'),
+    newOutlierDetection,
+
+    -- ** PortMapping
+    PortMapping (PortMapping'),
+    newPortMapping,
+
+    -- ** QueryParameterMatch
+    QueryParameterMatch (QueryParameterMatch'),
+    newQueryParameterMatch,
+
+    -- ** ResourceMetadata
+    ResourceMetadata (ResourceMetadata'),
+    newResourceMetadata,
+
+    -- ** RouteData
+    RouteData (RouteData'),
+    newRouteData,
+
+    -- ** RouteRef
+    RouteRef (RouteRef'),
+    newRouteRef,
+
+    -- ** RouteSpec
+    RouteSpec (RouteSpec'),
+    newRouteSpec,
+
+    -- ** RouteStatus
+    RouteStatus (RouteStatus'),
+    newRouteStatus,
+
+    -- ** ServiceDiscovery
+    ServiceDiscovery (ServiceDiscovery'),
+    newServiceDiscovery,
+
+    -- ** SubjectAlternativeNameMatchers
+    SubjectAlternativeNameMatchers (SubjectAlternativeNameMatchers'),
+    newSubjectAlternativeNameMatchers,
+
+    -- ** SubjectAlternativeNames
+    SubjectAlternativeNames (SubjectAlternativeNames'),
+    newSubjectAlternativeNames,
+
+    -- ** TagRef
+    TagRef (TagRef'),
+    newTagRef,
+
+    -- ** TcpRoute
+    TcpRoute (TcpRoute'),
+    newTcpRoute,
+
+    -- ** TcpRouteAction
+    TcpRouteAction (TcpRouteAction'),
+    newTcpRouteAction,
+
+    -- ** TcpRouteMatch
+    TcpRouteMatch (TcpRouteMatch'),
+    newTcpRouteMatch,
+
+    -- ** TcpTimeout
+    TcpTimeout (TcpTimeout'),
+    newTcpTimeout,
+
+    -- ** TlsValidationContext
+    TlsValidationContext (TlsValidationContext'),
+    newTlsValidationContext,
+
+    -- ** TlsValidationContextAcmTrust
+    TlsValidationContextAcmTrust (TlsValidationContextAcmTrust'),
+    newTlsValidationContextAcmTrust,
+
+    -- ** TlsValidationContextFileTrust
+    TlsValidationContextFileTrust (TlsValidationContextFileTrust'),
+    newTlsValidationContextFileTrust,
+
+    -- ** TlsValidationContextSdsTrust
+    TlsValidationContextSdsTrust (TlsValidationContextSdsTrust'),
+    newTlsValidationContextSdsTrust,
+
+    -- ** TlsValidationContextTrust
+    TlsValidationContextTrust (TlsValidationContextTrust'),
+    newTlsValidationContextTrust,
+
+    -- ** VirtualGatewayAccessLog
+    VirtualGatewayAccessLog (VirtualGatewayAccessLog'),
+    newVirtualGatewayAccessLog,
+
+    -- ** VirtualGatewayBackendDefaults
+    VirtualGatewayBackendDefaults (VirtualGatewayBackendDefaults'),
+    newVirtualGatewayBackendDefaults,
+
+    -- ** VirtualGatewayClientPolicy
+    VirtualGatewayClientPolicy (VirtualGatewayClientPolicy'),
+    newVirtualGatewayClientPolicy,
+
+    -- ** VirtualGatewayClientPolicyTls
+    VirtualGatewayClientPolicyTls (VirtualGatewayClientPolicyTls'),
+    newVirtualGatewayClientPolicyTls,
+
+    -- ** VirtualGatewayClientTlsCertificate
+    VirtualGatewayClientTlsCertificate (VirtualGatewayClientTlsCertificate'),
+    newVirtualGatewayClientTlsCertificate,
+
+    -- ** VirtualGatewayConnectionPool
+    VirtualGatewayConnectionPool (VirtualGatewayConnectionPool'),
+    newVirtualGatewayConnectionPool,
+
+    -- ** VirtualGatewayData
+    VirtualGatewayData (VirtualGatewayData'),
+    newVirtualGatewayData,
+
+    -- ** VirtualGatewayFileAccessLog
+    VirtualGatewayFileAccessLog (VirtualGatewayFileAccessLog'),
+    newVirtualGatewayFileAccessLog,
+
+    -- ** VirtualGatewayGrpcConnectionPool
+    VirtualGatewayGrpcConnectionPool (VirtualGatewayGrpcConnectionPool'),
+    newVirtualGatewayGrpcConnectionPool,
+
+    -- ** VirtualGatewayHealthCheckPolicy
+    VirtualGatewayHealthCheckPolicy (VirtualGatewayHealthCheckPolicy'),
+    newVirtualGatewayHealthCheckPolicy,
+
+    -- ** VirtualGatewayHttp2ConnectionPool
+    VirtualGatewayHttp2ConnectionPool (VirtualGatewayHttp2ConnectionPool'),
+    newVirtualGatewayHttp2ConnectionPool,
+
+    -- ** VirtualGatewayHttpConnectionPool
+    VirtualGatewayHttpConnectionPool (VirtualGatewayHttpConnectionPool'),
+    newVirtualGatewayHttpConnectionPool,
+
+    -- ** VirtualGatewayListener
+    VirtualGatewayListener (VirtualGatewayListener'),
+    newVirtualGatewayListener,
+
+    -- ** VirtualGatewayListenerTls
+    VirtualGatewayListenerTls (VirtualGatewayListenerTls'),
+    newVirtualGatewayListenerTls,
+
+    -- ** VirtualGatewayListenerTlsAcmCertificate
+    VirtualGatewayListenerTlsAcmCertificate (VirtualGatewayListenerTlsAcmCertificate'),
+    newVirtualGatewayListenerTlsAcmCertificate,
+
+    -- ** VirtualGatewayListenerTlsCertificate
+    VirtualGatewayListenerTlsCertificate (VirtualGatewayListenerTlsCertificate'),
+    newVirtualGatewayListenerTlsCertificate,
+
+    -- ** VirtualGatewayListenerTlsFileCertificate
+    VirtualGatewayListenerTlsFileCertificate (VirtualGatewayListenerTlsFileCertificate'),
+    newVirtualGatewayListenerTlsFileCertificate,
+
+    -- ** VirtualGatewayListenerTlsSdsCertificate
+    VirtualGatewayListenerTlsSdsCertificate (VirtualGatewayListenerTlsSdsCertificate'),
+    newVirtualGatewayListenerTlsSdsCertificate,
+
+    -- ** VirtualGatewayListenerTlsValidationContext
+    VirtualGatewayListenerTlsValidationContext (VirtualGatewayListenerTlsValidationContext'),
+    newVirtualGatewayListenerTlsValidationContext,
+
+    -- ** VirtualGatewayListenerTlsValidationContextTrust
+    VirtualGatewayListenerTlsValidationContextTrust (VirtualGatewayListenerTlsValidationContextTrust'),
+    newVirtualGatewayListenerTlsValidationContextTrust,
+
+    -- ** VirtualGatewayLogging
+    VirtualGatewayLogging (VirtualGatewayLogging'),
+    newVirtualGatewayLogging,
+
+    -- ** VirtualGatewayPortMapping
+    VirtualGatewayPortMapping (VirtualGatewayPortMapping'),
+    newVirtualGatewayPortMapping,
+
+    -- ** VirtualGatewayRef
+    VirtualGatewayRef (VirtualGatewayRef'),
+    newVirtualGatewayRef,
+
+    -- ** VirtualGatewaySpec
+    VirtualGatewaySpec (VirtualGatewaySpec'),
+    newVirtualGatewaySpec,
+
+    -- ** VirtualGatewayStatus
+    VirtualGatewayStatus (VirtualGatewayStatus'),
+    newVirtualGatewayStatus,
+
+    -- ** VirtualGatewayTlsValidationContext
+    VirtualGatewayTlsValidationContext (VirtualGatewayTlsValidationContext'),
+    newVirtualGatewayTlsValidationContext,
+
+    -- ** VirtualGatewayTlsValidationContextAcmTrust
+    VirtualGatewayTlsValidationContextAcmTrust (VirtualGatewayTlsValidationContextAcmTrust'),
+    newVirtualGatewayTlsValidationContextAcmTrust,
+
+    -- ** VirtualGatewayTlsValidationContextFileTrust
+    VirtualGatewayTlsValidationContextFileTrust (VirtualGatewayTlsValidationContextFileTrust'),
+    newVirtualGatewayTlsValidationContextFileTrust,
+
+    -- ** VirtualGatewayTlsValidationContextSdsTrust
+    VirtualGatewayTlsValidationContextSdsTrust (VirtualGatewayTlsValidationContextSdsTrust'),
+    newVirtualGatewayTlsValidationContextSdsTrust,
+
+    -- ** VirtualGatewayTlsValidationContextTrust
+    VirtualGatewayTlsValidationContextTrust (VirtualGatewayTlsValidationContextTrust'),
+    newVirtualGatewayTlsValidationContextTrust,
+
+    -- ** VirtualNodeConnectionPool
+    VirtualNodeConnectionPool (VirtualNodeConnectionPool'),
+    newVirtualNodeConnectionPool,
+
+    -- ** VirtualNodeData
+    VirtualNodeData (VirtualNodeData'),
+    newVirtualNodeData,
+
+    -- ** VirtualNodeGrpcConnectionPool
+    VirtualNodeGrpcConnectionPool (VirtualNodeGrpcConnectionPool'),
+    newVirtualNodeGrpcConnectionPool,
+
+    -- ** VirtualNodeHttp2ConnectionPool
+    VirtualNodeHttp2ConnectionPool (VirtualNodeHttp2ConnectionPool'),
+    newVirtualNodeHttp2ConnectionPool,
+
+    -- ** VirtualNodeHttpConnectionPool
+    VirtualNodeHttpConnectionPool (VirtualNodeHttpConnectionPool'),
+    newVirtualNodeHttpConnectionPool,
+
+    -- ** VirtualNodeRef
+    VirtualNodeRef (VirtualNodeRef'),
+    newVirtualNodeRef,
+
+    -- ** VirtualNodeServiceProvider
+    VirtualNodeServiceProvider (VirtualNodeServiceProvider'),
+    newVirtualNodeServiceProvider,
+
+    -- ** VirtualNodeSpec
+    VirtualNodeSpec (VirtualNodeSpec'),
+    newVirtualNodeSpec,
+
+    -- ** VirtualNodeStatus
+    VirtualNodeStatus (VirtualNodeStatus'),
+    newVirtualNodeStatus,
+
+    -- ** VirtualNodeTcpConnectionPool
+    VirtualNodeTcpConnectionPool (VirtualNodeTcpConnectionPool'),
+    newVirtualNodeTcpConnectionPool,
+
+    -- ** VirtualRouterData
+    VirtualRouterData (VirtualRouterData'),
+    newVirtualRouterData,
+
+    -- ** VirtualRouterListener
+    VirtualRouterListener (VirtualRouterListener'),
+    newVirtualRouterListener,
+
+    -- ** VirtualRouterRef
+    VirtualRouterRef (VirtualRouterRef'),
+    newVirtualRouterRef,
+
+    -- ** VirtualRouterServiceProvider
+    VirtualRouterServiceProvider (VirtualRouterServiceProvider'),
+    newVirtualRouterServiceProvider,
+
+    -- ** VirtualRouterSpec
+    VirtualRouterSpec (VirtualRouterSpec'),
+    newVirtualRouterSpec,
+
+    -- ** VirtualRouterStatus
+    VirtualRouterStatus (VirtualRouterStatus'),
+    newVirtualRouterStatus,
+
+    -- ** VirtualServiceBackend
+    VirtualServiceBackend (VirtualServiceBackend'),
+    newVirtualServiceBackend,
+
+    -- ** VirtualServiceData
+    VirtualServiceData (VirtualServiceData'),
+    newVirtualServiceData,
+
+    -- ** VirtualServiceProvider
+    VirtualServiceProvider (VirtualServiceProvider'),
+    newVirtualServiceProvider,
+
+    -- ** VirtualServiceRef
+    VirtualServiceRef (VirtualServiceRef'),
+    newVirtualServiceRef,
+
+    -- ** VirtualServiceSpec
+    VirtualServiceSpec (VirtualServiceSpec'),
+    newVirtualServiceSpec,
+
+    -- ** VirtualServiceStatus
+    VirtualServiceStatus (VirtualServiceStatus'),
+    newVirtualServiceStatus,
+
+    -- ** WeightedTarget
+    WeightedTarget (WeightedTarget'),
+    newWeightedTarget,
+  )
+where
+
+import Amazonka.AppMesh.CreateGatewayRoute
+import Amazonka.AppMesh.CreateMesh
+import Amazonka.AppMesh.CreateRoute
+import Amazonka.AppMesh.CreateVirtualGateway
+import Amazonka.AppMesh.CreateVirtualNode
+import Amazonka.AppMesh.CreateVirtualRouter
+import Amazonka.AppMesh.CreateVirtualService
+import Amazonka.AppMesh.DeleteGatewayRoute
+import Amazonka.AppMesh.DeleteMesh
+import Amazonka.AppMesh.DeleteRoute
+import Amazonka.AppMesh.DeleteVirtualGateway
+import Amazonka.AppMesh.DeleteVirtualNode
+import Amazonka.AppMesh.DeleteVirtualRouter
+import Amazonka.AppMesh.DeleteVirtualService
+import Amazonka.AppMesh.DescribeGatewayRoute
+import Amazonka.AppMesh.DescribeMesh
+import Amazonka.AppMesh.DescribeRoute
+import Amazonka.AppMesh.DescribeVirtualGateway
+import Amazonka.AppMesh.DescribeVirtualNode
+import Amazonka.AppMesh.DescribeVirtualRouter
+import Amazonka.AppMesh.DescribeVirtualService
+import Amazonka.AppMesh.Lens
+import Amazonka.AppMesh.ListGatewayRoutes
+import Amazonka.AppMesh.ListMeshes
+import Amazonka.AppMesh.ListRoutes
+import Amazonka.AppMesh.ListTagsForResource
+import Amazonka.AppMesh.ListVirtualGateways
+import Amazonka.AppMesh.ListVirtualNodes
+import Amazonka.AppMesh.ListVirtualRouters
+import Amazonka.AppMesh.ListVirtualServices
+import Amazonka.AppMesh.TagResource
+import Amazonka.AppMesh.Types
+import Amazonka.AppMesh.UntagResource
+import Amazonka.AppMesh.UpdateGatewayRoute
+import Amazonka.AppMesh.UpdateMesh
+import Amazonka.AppMesh.UpdateRoute
+import Amazonka.AppMesh.UpdateVirtualGateway
+import Amazonka.AppMesh.UpdateVirtualNode
+import Amazonka.AppMesh.UpdateVirtualRouter
+import Amazonka.AppMesh.UpdateVirtualService
+import Amazonka.AppMesh.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'AppMesh'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/AppMesh/CreateGatewayRoute.hs b/gen/Amazonka/AppMesh/CreateGatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateGatewayRoute.hs
@@ -0,0 +1,310 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateGatewayRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a gateway route.
+--
+-- A gateway route is attached to a virtual gateway and routes traffic to
+-- an existing virtual service. If a route matches a request, it can
+-- distribute traffic to a target virtual service.
+--
+-- For more information about gateway routes, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/gateway-routes.html Gateway routes>.
+module Amazonka.AppMesh.CreateGatewayRoute
+  ( -- * Creating a Request
+    CreateGatewayRoute (..),
+    newCreateGatewayRoute,
+
+    -- * Request Lenses
+    createGatewayRoute_clientToken,
+    createGatewayRoute_meshOwner,
+    createGatewayRoute_tags,
+    createGatewayRoute_gatewayRouteName,
+    createGatewayRoute_meshName,
+    createGatewayRoute_spec,
+    createGatewayRoute_virtualGatewayName,
+
+    -- * Destructuring the Response
+    CreateGatewayRouteResponse (..),
+    newCreateGatewayRouteResponse,
+
+    -- * Response Lenses
+    createGatewayRouteResponse_httpStatus,
+    createGatewayRouteResponse_gatewayRoute,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateGatewayRoute' smart constructor.
+data CreateGatewayRoute = CreateGatewayRoute'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then the account that you specify must share
+    -- the mesh with your account before you can create the resource in the
+    -- service mesh. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | Optional metadata that you can apply to the gateway route to assist with
+    -- categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name to use for the gateway route.
+    gatewayRouteName :: Prelude.Text,
+    -- | The name of the service mesh to create the gateway route in.
+    meshName :: Prelude.Text,
+    -- | The gateway route specification to apply.
+    spec :: GatewayRouteSpec,
+    -- | The name of the virtual gateway to associate the gateway route with. If
+    -- the virtual gateway is in a shared mesh, then you must be the owner of
+    -- the virtual gateway resource.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGatewayRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createGatewayRoute_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'createGatewayRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'tags', 'createGatewayRoute_tags' - Optional metadata that you can apply to the gateway route to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'gatewayRouteName', 'createGatewayRoute_gatewayRouteName' - The name to use for the gateway route.
+--
+-- 'meshName', 'createGatewayRoute_meshName' - The name of the service mesh to create the gateway route in.
+--
+-- 'spec', 'createGatewayRoute_spec' - The gateway route specification to apply.
+--
+-- 'virtualGatewayName', 'createGatewayRoute_virtualGatewayName' - The name of the virtual gateway to associate the gateway route with. If
+-- the virtual gateway is in a shared mesh, then you must be the owner of
+-- the virtual gateway resource.
+newCreateGatewayRoute ::
+  -- | 'gatewayRouteName'
+  Prelude.Text ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  GatewayRouteSpec ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  CreateGatewayRoute
+newCreateGatewayRoute
+  pGatewayRouteName_
+  pMeshName_
+  pSpec_
+  pVirtualGatewayName_ =
+    CreateGatewayRoute'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        gatewayRouteName = pGatewayRouteName_,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createGatewayRoute_clientToken :: Lens.Lens' CreateGatewayRoute (Prelude.Maybe Prelude.Text)
+createGatewayRoute_clientToken = Lens.lens (\CreateGatewayRoute' {clientToken} -> clientToken) (\s@CreateGatewayRoute' {} a -> s {clientToken = a} :: CreateGatewayRoute)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+createGatewayRoute_meshOwner :: Lens.Lens' CreateGatewayRoute (Prelude.Maybe Prelude.Text)
+createGatewayRoute_meshOwner = Lens.lens (\CreateGatewayRoute' {meshOwner} -> meshOwner) (\s@CreateGatewayRoute' {} a -> s {meshOwner = a} :: CreateGatewayRoute)
+
+-- | Optional metadata that you can apply to the gateway route to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createGatewayRoute_tags :: Lens.Lens' CreateGatewayRoute (Prelude.Maybe [TagRef])
+createGatewayRoute_tags = Lens.lens (\CreateGatewayRoute' {tags} -> tags) (\s@CreateGatewayRoute' {} a -> s {tags = a} :: CreateGatewayRoute) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name to use for the gateway route.
+createGatewayRoute_gatewayRouteName :: Lens.Lens' CreateGatewayRoute Prelude.Text
+createGatewayRoute_gatewayRouteName = Lens.lens (\CreateGatewayRoute' {gatewayRouteName} -> gatewayRouteName) (\s@CreateGatewayRoute' {} a -> s {gatewayRouteName = a} :: CreateGatewayRoute)
+
+-- | The name of the service mesh to create the gateway route in.
+createGatewayRoute_meshName :: Lens.Lens' CreateGatewayRoute Prelude.Text
+createGatewayRoute_meshName = Lens.lens (\CreateGatewayRoute' {meshName} -> meshName) (\s@CreateGatewayRoute' {} a -> s {meshName = a} :: CreateGatewayRoute)
+
+-- | The gateway route specification to apply.
+createGatewayRoute_spec :: Lens.Lens' CreateGatewayRoute GatewayRouteSpec
+createGatewayRoute_spec = Lens.lens (\CreateGatewayRoute' {spec} -> spec) (\s@CreateGatewayRoute' {} a -> s {spec = a} :: CreateGatewayRoute)
+
+-- | The name of the virtual gateway to associate the gateway route with. If
+-- the virtual gateway is in a shared mesh, then you must be the owner of
+-- the virtual gateway resource.
+createGatewayRoute_virtualGatewayName :: Lens.Lens' CreateGatewayRoute Prelude.Text
+createGatewayRoute_virtualGatewayName = Lens.lens (\CreateGatewayRoute' {virtualGatewayName} -> virtualGatewayName) (\s@CreateGatewayRoute' {} a -> s {virtualGatewayName = a} :: CreateGatewayRoute)
+
+instance Core.AWSRequest CreateGatewayRoute where
+  type
+    AWSResponse CreateGatewayRoute =
+      CreateGatewayRouteResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateGatewayRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateGatewayRoute where
+  hashWithSalt _salt CreateGatewayRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` gatewayRouteName
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData CreateGatewayRoute where
+  rnf CreateGatewayRoute' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf gatewayRouteName
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders CreateGatewayRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateGatewayRoute where
+  toJSON CreateGatewayRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("gatewayRouteName" Data..= gatewayRouteName),
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath CreateGatewayRoute where
+  toPath CreateGatewayRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateway/",
+        Data.toBS virtualGatewayName,
+        "/gatewayRoutes"
+      ]
+
+instance Data.ToQuery CreateGatewayRoute where
+  toQuery CreateGatewayRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newCreateGatewayRouteResponse' smart constructor.
+data CreateGatewayRouteResponse = CreateGatewayRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your gateway route following the create call.
+    gatewayRoute :: GatewayRouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGatewayRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createGatewayRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayRoute', 'createGatewayRouteResponse_gatewayRoute' - The full description of your gateway route following the create call.
+newCreateGatewayRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayRoute'
+  GatewayRouteData ->
+  CreateGatewayRouteResponse
+newCreateGatewayRouteResponse
+  pHttpStatus_
+  pGatewayRoute_ =
+    CreateGatewayRouteResponse'
+      { httpStatus =
+          pHttpStatus_,
+        gatewayRoute = pGatewayRoute_
+      }
+
+-- | The response's http status code.
+createGatewayRouteResponse_httpStatus :: Lens.Lens' CreateGatewayRouteResponse Prelude.Int
+createGatewayRouteResponse_httpStatus = Lens.lens (\CreateGatewayRouteResponse' {httpStatus} -> httpStatus) (\s@CreateGatewayRouteResponse' {} a -> s {httpStatus = a} :: CreateGatewayRouteResponse)
+
+-- | The full description of your gateway route following the create call.
+createGatewayRouteResponse_gatewayRoute :: Lens.Lens' CreateGatewayRouteResponse GatewayRouteData
+createGatewayRouteResponse_gatewayRoute = Lens.lens (\CreateGatewayRouteResponse' {gatewayRoute} -> gatewayRoute) (\s@CreateGatewayRouteResponse' {} a -> s {gatewayRoute = a} :: CreateGatewayRouteResponse)
+
+instance Prelude.NFData CreateGatewayRouteResponse where
+  rnf CreateGatewayRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayRoute
diff --git a/gen/Amazonka/AppMesh/CreateMesh.hs b/gen/Amazonka/AppMesh/CreateMesh.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateMesh.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a service mesh.
+--
+-- A service mesh is a logical boundary for network traffic between
+-- services that are represented by resources within the mesh. After you
+-- create your service mesh, you can create virtual services, virtual
+-- nodes, virtual routers, and routes to distribute traffic between the
+-- applications in your mesh.
+--
+-- For more information about service meshes, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/meshes.html Service meshes>.
+module Amazonka.AppMesh.CreateMesh
+  ( -- * Creating a Request
+    CreateMesh (..),
+    newCreateMesh,
+
+    -- * Request Lenses
+    createMesh_clientToken,
+    createMesh_spec,
+    createMesh_tags,
+    createMesh_meshName,
+
+    -- * Destructuring the Response
+    CreateMeshResponse (..),
+    newCreateMeshResponse,
+
+    -- * Response Lenses
+    createMeshResponse_httpStatus,
+    createMeshResponse_mesh,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateMesh' smart constructor.
+data CreateMesh = CreateMesh'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The service mesh specification to apply.
+    spec :: Prelude.Maybe MeshSpec,
+    -- | Optional metadata that you can apply to the service mesh to assist with
+    -- categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name to use for the service mesh.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMesh' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createMesh_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'spec', 'createMesh_spec' - The service mesh specification to apply.
+--
+-- 'tags', 'createMesh_tags' - Optional metadata that you can apply to the service mesh to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'meshName', 'createMesh_meshName' - The name to use for the service mesh.
+newCreateMesh ::
+  -- | 'meshName'
+  Prelude.Text ->
+  CreateMesh
+newCreateMesh pMeshName_ =
+  CreateMesh'
+    { clientToken = Prelude.Nothing,
+      spec = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createMesh_clientToken :: Lens.Lens' CreateMesh (Prelude.Maybe Prelude.Text)
+createMesh_clientToken = Lens.lens (\CreateMesh' {clientToken} -> clientToken) (\s@CreateMesh' {} a -> s {clientToken = a} :: CreateMesh)
+
+-- | The service mesh specification to apply.
+createMesh_spec :: Lens.Lens' CreateMesh (Prelude.Maybe MeshSpec)
+createMesh_spec = Lens.lens (\CreateMesh' {spec} -> spec) (\s@CreateMesh' {} a -> s {spec = a} :: CreateMesh)
+
+-- | Optional metadata that you can apply to the service mesh to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createMesh_tags :: Lens.Lens' CreateMesh (Prelude.Maybe [TagRef])
+createMesh_tags = Lens.lens (\CreateMesh' {tags} -> tags) (\s@CreateMesh' {} a -> s {tags = a} :: CreateMesh) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name to use for the service mesh.
+createMesh_meshName :: Lens.Lens' CreateMesh Prelude.Text
+createMesh_meshName = Lens.lens (\CreateMesh' {meshName} -> meshName) (\s@CreateMesh' {} a -> s {meshName = a} :: CreateMesh)
+
+instance Core.AWSRequest CreateMesh where
+  type AWSResponse CreateMesh = CreateMeshResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateMeshResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateMesh where
+  hashWithSalt _salt CreateMesh' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData CreateMesh where
+  rnf CreateMesh' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders CreateMesh where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateMesh where
+  toJSON CreateMesh' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("spec" Data..=) Prelude.<$> spec,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("meshName" Data..= meshName)
+          ]
+      )
+
+instance Data.ToPath CreateMesh where
+  toPath = Prelude.const "/v20190125/meshes"
+
+instance Data.ToQuery CreateMesh where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newCreateMeshResponse' smart constructor.
+data CreateMeshResponse = CreateMeshResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your service mesh following the create call.
+    mesh :: MeshData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMeshResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createMeshResponse_httpStatus' - The response's http status code.
+--
+-- 'mesh', 'createMeshResponse_mesh' - The full description of your service mesh following the create call.
+newCreateMeshResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'mesh'
+  MeshData ->
+  CreateMeshResponse
+newCreateMeshResponse pHttpStatus_ pMesh_ =
+  CreateMeshResponse'
+    { httpStatus = pHttpStatus_,
+      mesh = pMesh_
+    }
+
+-- | The response's http status code.
+createMeshResponse_httpStatus :: Lens.Lens' CreateMeshResponse Prelude.Int
+createMeshResponse_httpStatus = Lens.lens (\CreateMeshResponse' {httpStatus} -> httpStatus) (\s@CreateMeshResponse' {} a -> s {httpStatus = a} :: CreateMeshResponse)
+
+-- | The full description of your service mesh following the create call.
+createMeshResponse_mesh :: Lens.Lens' CreateMeshResponse MeshData
+createMeshResponse_mesh = Lens.lens (\CreateMeshResponse' {mesh} -> mesh) (\s@CreateMeshResponse' {} a -> s {mesh = a} :: CreateMeshResponse)
+
+instance Prelude.NFData CreateMeshResponse where
+  rnf CreateMeshResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf mesh
diff --git a/gen/Amazonka/AppMesh/CreateRoute.hs b/gen/Amazonka/AppMesh/CreateRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateRoute.hs
@@ -0,0 +1,307 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a route that is associated with a virtual router.
+--
+-- You can route several different protocols and define a retry policy for
+-- a route. Traffic can be routed to one or more virtual nodes.
+--
+-- For more information about routes, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/routes.html Routes>.
+module Amazonka.AppMesh.CreateRoute
+  ( -- * Creating a Request
+    CreateRoute (..),
+    newCreateRoute,
+
+    -- * Request Lenses
+    createRoute_clientToken,
+    createRoute_meshOwner,
+    createRoute_tags,
+    createRoute_meshName,
+    createRoute_routeName,
+    createRoute_spec,
+    createRoute_virtualRouterName,
+
+    -- * Destructuring the Response
+    CreateRouteResponse (..),
+    newCreateRouteResponse,
+
+    -- * Response Lenses
+    createRouteResponse_httpStatus,
+    createRouteResponse_route,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateRoute' smart constructor.
+data CreateRoute = CreateRoute'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then the account that you specify must share
+    -- the mesh with your account before you can create the resource in the
+    -- service mesh. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | Optional metadata that you can apply to the route to assist with
+    -- categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name of the service mesh to create the route in.
+    meshName :: Prelude.Text,
+    -- | The name to use for the route.
+    routeName :: Prelude.Text,
+    -- | The route specification to apply.
+    spec :: RouteSpec,
+    -- | The name of the virtual router in which to create the route. If the
+    -- virtual router is in a shared mesh, then you must be the owner of the
+    -- virtual router resource.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createRoute_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'createRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'tags', 'createRoute_tags' - Optional metadata that you can apply to the route to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'meshName', 'createRoute_meshName' - The name of the service mesh to create the route in.
+--
+-- 'routeName', 'createRoute_routeName' - The name to use for the route.
+--
+-- 'spec', 'createRoute_spec' - The route specification to apply.
+--
+-- 'virtualRouterName', 'createRoute_virtualRouterName' - The name of the virtual router in which to create the route. If the
+-- virtual router is in a shared mesh, then you must be the owner of the
+-- virtual router resource.
+newCreateRoute ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'routeName'
+  Prelude.Text ->
+  -- | 'spec'
+  RouteSpec ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  CreateRoute
+newCreateRoute
+  pMeshName_
+  pRouteName_
+  pSpec_
+  pVirtualRouterName_ =
+    CreateRoute'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        meshName = pMeshName_,
+        routeName = pRouteName_,
+        spec = pSpec_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createRoute_clientToken :: Lens.Lens' CreateRoute (Prelude.Maybe Prelude.Text)
+createRoute_clientToken = Lens.lens (\CreateRoute' {clientToken} -> clientToken) (\s@CreateRoute' {} a -> s {clientToken = a} :: CreateRoute)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+createRoute_meshOwner :: Lens.Lens' CreateRoute (Prelude.Maybe Prelude.Text)
+createRoute_meshOwner = Lens.lens (\CreateRoute' {meshOwner} -> meshOwner) (\s@CreateRoute' {} a -> s {meshOwner = a} :: CreateRoute)
+
+-- | Optional metadata that you can apply to the route to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createRoute_tags :: Lens.Lens' CreateRoute (Prelude.Maybe [TagRef])
+createRoute_tags = Lens.lens (\CreateRoute' {tags} -> tags) (\s@CreateRoute' {} a -> s {tags = a} :: CreateRoute) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the service mesh to create the route in.
+createRoute_meshName :: Lens.Lens' CreateRoute Prelude.Text
+createRoute_meshName = Lens.lens (\CreateRoute' {meshName} -> meshName) (\s@CreateRoute' {} a -> s {meshName = a} :: CreateRoute)
+
+-- | The name to use for the route.
+createRoute_routeName :: Lens.Lens' CreateRoute Prelude.Text
+createRoute_routeName = Lens.lens (\CreateRoute' {routeName} -> routeName) (\s@CreateRoute' {} a -> s {routeName = a} :: CreateRoute)
+
+-- | The route specification to apply.
+createRoute_spec :: Lens.Lens' CreateRoute RouteSpec
+createRoute_spec = Lens.lens (\CreateRoute' {spec} -> spec) (\s@CreateRoute' {} a -> s {spec = a} :: CreateRoute)
+
+-- | The name of the virtual router in which to create the route. If the
+-- virtual router is in a shared mesh, then you must be the owner of the
+-- virtual router resource.
+createRoute_virtualRouterName :: Lens.Lens' CreateRoute Prelude.Text
+createRoute_virtualRouterName = Lens.lens (\CreateRoute' {virtualRouterName} -> virtualRouterName) (\s@CreateRoute' {} a -> s {virtualRouterName = a} :: CreateRoute)
+
+instance Core.AWSRequest CreateRoute where
+  type AWSResponse CreateRoute = CreateRouteResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateRoute where
+  hashWithSalt _salt CreateRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` routeName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData CreateRoute where
+  rnf CreateRoute' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf routeName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders CreateRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateRoute where
+  toJSON CreateRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("routeName" Data..= routeName),
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath CreateRoute where
+  toPath CreateRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouter/",
+        Data.toBS virtualRouterName,
+        "/routes"
+      ]
+
+instance Data.ToQuery CreateRoute where
+  toQuery CreateRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newCreateRouteResponse' smart constructor.
+data CreateRouteResponse = CreateRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your mesh following the create call.
+    route :: RouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'route', 'createRouteResponse_route' - The full description of your mesh following the create call.
+newCreateRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'route'
+  RouteData ->
+  CreateRouteResponse
+newCreateRouteResponse pHttpStatus_ pRoute_ =
+  CreateRouteResponse'
+    { httpStatus = pHttpStatus_,
+      route = pRoute_
+    }
+
+-- | The response's http status code.
+createRouteResponse_httpStatus :: Lens.Lens' CreateRouteResponse Prelude.Int
+createRouteResponse_httpStatus = Lens.lens (\CreateRouteResponse' {httpStatus} -> httpStatus) (\s@CreateRouteResponse' {} a -> s {httpStatus = a} :: CreateRouteResponse)
+
+-- | The full description of your mesh following the create call.
+createRouteResponse_route :: Lens.Lens' CreateRouteResponse RouteData
+createRouteResponse_route = Lens.lens (\CreateRouteResponse' {route} -> route) (\s@CreateRouteResponse' {} a -> s {route = a} :: CreateRouteResponse)
+
+instance Prelude.NFData CreateRouteResponse where
+  rnf CreateRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf route
diff --git a/gen/Amazonka/AppMesh/CreateVirtualGateway.hs b/gen/Amazonka/AppMesh/CreateVirtualGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateVirtualGateway.hs
@@ -0,0 +1,291 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateVirtualGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a virtual gateway.
+--
+-- A virtual gateway allows resources outside your mesh to communicate to
+-- resources that are inside your mesh. The virtual gateway represents an
+-- Envoy proxy running in an Amazon ECS task, in a Kubernetes service, or
+-- on an Amazon EC2 instance. Unlike a virtual node, which represents an
+-- Envoy running with an application, a virtual gateway represents Envoy
+-- deployed by itself.
+--
+-- For more information about virtual gateways, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_gateways.html Virtual gateways>.
+module Amazonka.AppMesh.CreateVirtualGateway
+  ( -- * Creating a Request
+    CreateVirtualGateway (..),
+    newCreateVirtualGateway,
+
+    -- * Request Lenses
+    createVirtualGateway_clientToken,
+    createVirtualGateway_meshOwner,
+    createVirtualGateway_tags,
+    createVirtualGateway_meshName,
+    createVirtualGateway_spec,
+    createVirtualGateway_virtualGatewayName,
+
+    -- * Destructuring the Response
+    CreateVirtualGatewayResponse (..),
+    newCreateVirtualGatewayResponse,
+
+    -- * Response Lenses
+    createVirtualGatewayResponse_httpStatus,
+    createVirtualGatewayResponse_virtualGateway,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateVirtualGateway' smart constructor.
+data CreateVirtualGateway = CreateVirtualGateway'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then the account that you specify must share
+    -- the mesh with your account before you can create the resource in the
+    -- service mesh. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | Optional metadata that you can apply to the virtual gateway to assist
+    -- with categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name of the service mesh to create the virtual gateway in.
+    meshName :: Prelude.Text,
+    -- | The virtual gateway specification to apply.
+    spec :: VirtualGatewaySpec,
+    -- | The name to use for the virtual gateway.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createVirtualGateway_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'createVirtualGateway_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'tags', 'createVirtualGateway_tags' - Optional metadata that you can apply to the virtual gateway to assist
+-- with categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'meshName', 'createVirtualGateway_meshName' - The name of the service mesh to create the virtual gateway in.
+--
+-- 'spec', 'createVirtualGateway_spec' - The virtual gateway specification to apply.
+--
+-- 'virtualGatewayName', 'createVirtualGateway_virtualGatewayName' - The name to use for the virtual gateway.
+newCreateVirtualGateway ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualGatewaySpec ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  CreateVirtualGateway
+newCreateVirtualGateway
+  pMeshName_
+  pSpec_
+  pVirtualGatewayName_ =
+    CreateVirtualGateway'
+      { clientToken =
+          Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createVirtualGateway_clientToken :: Lens.Lens' CreateVirtualGateway (Prelude.Maybe Prelude.Text)
+createVirtualGateway_clientToken = Lens.lens (\CreateVirtualGateway' {clientToken} -> clientToken) (\s@CreateVirtualGateway' {} a -> s {clientToken = a} :: CreateVirtualGateway)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+createVirtualGateway_meshOwner :: Lens.Lens' CreateVirtualGateway (Prelude.Maybe Prelude.Text)
+createVirtualGateway_meshOwner = Lens.lens (\CreateVirtualGateway' {meshOwner} -> meshOwner) (\s@CreateVirtualGateway' {} a -> s {meshOwner = a} :: CreateVirtualGateway)
+
+-- | Optional metadata that you can apply to the virtual gateway to assist
+-- with categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createVirtualGateway_tags :: Lens.Lens' CreateVirtualGateway (Prelude.Maybe [TagRef])
+createVirtualGateway_tags = Lens.lens (\CreateVirtualGateway' {tags} -> tags) (\s@CreateVirtualGateway' {} a -> s {tags = a} :: CreateVirtualGateway) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the service mesh to create the virtual gateway in.
+createVirtualGateway_meshName :: Lens.Lens' CreateVirtualGateway Prelude.Text
+createVirtualGateway_meshName = Lens.lens (\CreateVirtualGateway' {meshName} -> meshName) (\s@CreateVirtualGateway' {} a -> s {meshName = a} :: CreateVirtualGateway)
+
+-- | The virtual gateway specification to apply.
+createVirtualGateway_spec :: Lens.Lens' CreateVirtualGateway VirtualGatewaySpec
+createVirtualGateway_spec = Lens.lens (\CreateVirtualGateway' {spec} -> spec) (\s@CreateVirtualGateway' {} a -> s {spec = a} :: CreateVirtualGateway)
+
+-- | The name to use for the virtual gateway.
+createVirtualGateway_virtualGatewayName :: Lens.Lens' CreateVirtualGateway Prelude.Text
+createVirtualGateway_virtualGatewayName = Lens.lens (\CreateVirtualGateway' {virtualGatewayName} -> virtualGatewayName) (\s@CreateVirtualGateway' {} a -> s {virtualGatewayName = a} :: CreateVirtualGateway)
+
+instance Core.AWSRequest CreateVirtualGateway where
+  type
+    AWSResponse CreateVirtualGateway =
+      CreateVirtualGatewayResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVirtualGatewayResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateVirtualGateway where
+  hashWithSalt _salt CreateVirtualGateway' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData CreateVirtualGateway where
+  rnf CreateVirtualGateway' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders CreateVirtualGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVirtualGateway where
+  toJSON CreateVirtualGateway' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("spec" Data..= spec),
+            Prelude.Just
+              ("virtualGatewayName" Data..= virtualGatewayName)
+          ]
+      )
+
+instance Data.ToPath CreateVirtualGateway where
+  toPath CreateVirtualGateway' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateways"
+      ]
+
+instance Data.ToQuery CreateVirtualGateway where
+  toQuery CreateVirtualGateway' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newCreateVirtualGatewayResponse' smart constructor.
+data CreateVirtualGatewayResponse = CreateVirtualGatewayResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual gateway following the create call.
+    virtualGateway :: VirtualGatewayData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createVirtualGatewayResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualGateway', 'createVirtualGatewayResponse_virtualGateway' - The full description of your virtual gateway following the create call.
+newCreateVirtualGatewayResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualGateway'
+  VirtualGatewayData ->
+  CreateVirtualGatewayResponse
+newCreateVirtualGatewayResponse
+  pHttpStatus_
+  pVirtualGateway_ =
+    CreateVirtualGatewayResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualGateway = pVirtualGateway_
+      }
+
+-- | The response's http status code.
+createVirtualGatewayResponse_httpStatus :: Lens.Lens' CreateVirtualGatewayResponse Prelude.Int
+createVirtualGatewayResponse_httpStatus = Lens.lens (\CreateVirtualGatewayResponse' {httpStatus} -> httpStatus) (\s@CreateVirtualGatewayResponse' {} a -> s {httpStatus = a} :: CreateVirtualGatewayResponse)
+
+-- | The full description of your virtual gateway following the create call.
+createVirtualGatewayResponse_virtualGateway :: Lens.Lens' CreateVirtualGatewayResponse VirtualGatewayData
+createVirtualGatewayResponse_virtualGateway = Lens.lens (\CreateVirtualGatewayResponse' {virtualGateway} -> virtualGateway) (\s@CreateVirtualGatewayResponse' {} a -> s {virtualGateway = a} :: CreateVirtualGatewayResponse)
+
+instance Prelude.NFData CreateVirtualGatewayResponse where
+  rnf CreateVirtualGatewayResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualGateway
diff --git a/gen/Amazonka/AppMesh/CreateVirtualNode.hs b/gen/Amazonka/AppMesh/CreateVirtualNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateVirtualNode.hs
@@ -0,0 +1,314 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateVirtualNode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a virtual node within a service mesh.
+--
+-- A virtual node acts as a logical pointer to a particular task group,
+-- such as an Amazon ECS service or a Kubernetes deployment. When you
+-- create a virtual node, you can specify the service discovery information
+-- for your task group, and whether the proxy running in a task group will
+-- communicate with other proxies using Transport Layer Security (TLS).
+--
+-- You define a @listener@ for any inbound traffic that your virtual node
+-- expects. Any virtual service that your virtual node expects to
+-- communicate to is specified as a @backend@.
+--
+-- The response metadata for your new virtual node contains the @arn@ that
+-- is associated with the virtual node. Set this value to the full ARN; for
+-- example,
+-- @arn:aws:appmesh:us-west-2:123456789012:myMesh\/default\/virtualNode\/myApp@)
+-- as the @APPMESH_RESOURCE_ARN@ environment variable for your task
+-- group\'s Envoy proxy container in your task definition or pod spec. This
+-- is then mapped to the @node.id@ and @node.cluster@ Envoy parameters.
+--
+-- By default, App Mesh uses the name of the resource you specified in
+-- @APPMESH_RESOURCE_ARN@ when Envoy is referring to itself in metrics and
+-- traces. You can override this behavior by setting the
+-- @APPMESH_RESOURCE_CLUSTER@ environment variable with your own name.
+--
+-- For more information about virtual nodes, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_nodes.html Virtual nodes>.
+-- You must be using @1.15.0@ or later of the Envoy image when setting
+-- these variables. For more information aboutApp Mesh Envoy variables, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html Envoy image>
+-- in the App Mesh User Guide.
+module Amazonka.AppMesh.CreateVirtualNode
+  ( -- * Creating a Request
+    CreateVirtualNode (..),
+    newCreateVirtualNode,
+
+    -- * Request Lenses
+    createVirtualNode_clientToken,
+    createVirtualNode_meshOwner,
+    createVirtualNode_tags,
+    createVirtualNode_meshName,
+    createVirtualNode_spec,
+    createVirtualNode_virtualNodeName,
+
+    -- * Destructuring the Response
+    CreateVirtualNodeResponse (..),
+    newCreateVirtualNodeResponse,
+
+    -- * Response Lenses
+    createVirtualNodeResponse_httpStatus,
+    createVirtualNodeResponse_virtualNode,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateVirtualNode' smart constructor.
+data CreateVirtualNode = CreateVirtualNode'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then the account that you specify must share
+    -- the mesh with your account before you can create the resource in the
+    -- service mesh. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | Optional metadata that you can apply to the virtual node to assist with
+    -- categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name of the service mesh to create the virtual node in.
+    meshName :: Prelude.Text,
+    -- | The virtual node specification to apply.
+    spec :: VirtualNodeSpec,
+    -- | The name to use for the virtual node.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualNode' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createVirtualNode_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'createVirtualNode_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'tags', 'createVirtualNode_tags' - Optional metadata that you can apply to the virtual node to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'meshName', 'createVirtualNode_meshName' - The name of the service mesh to create the virtual node in.
+--
+-- 'spec', 'createVirtualNode_spec' - The virtual node specification to apply.
+--
+-- 'virtualNodeName', 'createVirtualNode_virtualNodeName' - The name to use for the virtual node.
+newCreateVirtualNode ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualNodeSpec ->
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  CreateVirtualNode
+newCreateVirtualNode
+  pMeshName_
+  pSpec_
+  pVirtualNodeName_ =
+    CreateVirtualNode'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualNodeName = pVirtualNodeName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createVirtualNode_clientToken :: Lens.Lens' CreateVirtualNode (Prelude.Maybe Prelude.Text)
+createVirtualNode_clientToken = Lens.lens (\CreateVirtualNode' {clientToken} -> clientToken) (\s@CreateVirtualNode' {} a -> s {clientToken = a} :: CreateVirtualNode)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+createVirtualNode_meshOwner :: Lens.Lens' CreateVirtualNode (Prelude.Maybe Prelude.Text)
+createVirtualNode_meshOwner = Lens.lens (\CreateVirtualNode' {meshOwner} -> meshOwner) (\s@CreateVirtualNode' {} a -> s {meshOwner = a} :: CreateVirtualNode)
+
+-- | Optional metadata that you can apply to the virtual node to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createVirtualNode_tags :: Lens.Lens' CreateVirtualNode (Prelude.Maybe [TagRef])
+createVirtualNode_tags = Lens.lens (\CreateVirtualNode' {tags} -> tags) (\s@CreateVirtualNode' {} a -> s {tags = a} :: CreateVirtualNode) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the service mesh to create the virtual node in.
+createVirtualNode_meshName :: Lens.Lens' CreateVirtualNode Prelude.Text
+createVirtualNode_meshName = Lens.lens (\CreateVirtualNode' {meshName} -> meshName) (\s@CreateVirtualNode' {} a -> s {meshName = a} :: CreateVirtualNode)
+
+-- | The virtual node specification to apply.
+createVirtualNode_spec :: Lens.Lens' CreateVirtualNode VirtualNodeSpec
+createVirtualNode_spec = Lens.lens (\CreateVirtualNode' {spec} -> spec) (\s@CreateVirtualNode' {} a -> s {spec = a} :: CreateVirtualNode)
+
+-- | The name to use for the virtual node.
+createVirtualNode_virtualNodeName :: Lens.Lens' CreateVirtualNode Prelude.Text
+createVirtualNode_virtualNodeName = Lens.lens (\CreateVirtualNode' {virtualNodeName} -> virtualNodeName) (\s@CreateVirtualNode' {} a -> s {virtualNodeName = a} :: CreateVirtualNode)
+
+instance Core.AWSRequest CreateVirtualNode where
+  type
+    AWSResponse CreateVirtualNode =
+      CreateVirtualNodeResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVirtualNodeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateVirtualNode where
+  hashWithSalt _salt CreateVirtualNode' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData CreateVirtualNode where
+  rnf CreateVirtualNode' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualNodeName
+
+instance Data.ToHeaders CreateVirtualNode where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVirtualNode where
+  toJSON CreateVirtualNode' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("spec" Data..= spec),
+            Prelude.Just
+              ("virtualNodeName" Data..= virtualNodeName)
+          ]
+      )
+
+instance Data.ToPath CreateVirtualNode where
+  toPath CreateVirtualNode' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualNodes"
+      ]
+
+instance Data.ToQuery CreateVirtualNode where
+  toQuery CreateVirtualNode' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newCreateVirtualNodeResponse' smart constructor.
+data CreateVirtualNodeResponse = CreateVirtualNodeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual node following the create call.
+    virtualNode :: VirtualNodeData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualNodeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createVirtualNodeResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualNode', 'createVirtualNodeResponse_virtualNode' - The full description of your virtual node following the create call.
+newCreateVirtualNodeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualNode'
+  VirtualNodeData ->
+  CreateVirtualNodeResponse
+newCreateVirtualNodeResponse
+  pHttpStatus_
+  pVirtualNode_ =
+    CreateVirtualNodeResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualNode = pVirtualNode_
+      }
+
+-- | The response's http status code.
+createVirtualNodeResponse_httpStatus :: Lens.Lens' CreateVirtualNodeResponse Prelude.Int
+createVirtualNodeResponse_httpStatus = Lens.lens (\CreateVirtualNodeResponse' {httpStatus} -> httpStatus) (\s@CreateVirtualNodeResponse' {} a -> s {httpStatus = a} :: CreateVirtualNodeResponse)
+
+-- | The full description of your virtual node following the create call.
+createVirtualNodeResponse_virtualNode :: Lens.Lens' CreateVirtualNodeResponse VirtualNodeData
+createVirtualNodeResponse_virtualNode = Lens.lens (\CreateVirtualNodeResponse' {virtualNode} -> virtualNode) (\s@CreateVirtualNodeResponse' {} a -> s {virtualNode = a} :: CreateVirtualNodeResponse)
+
+instance Prelude.NFData CreateVirtualNodeResponse where
+  rnf CreateVirtualNodeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualNode
diff --git a/gen/Amazonka/AppMesh/CreateVirtualRouter.hs b/gen/Amazonka/AppMesh/CreateVirtualRouter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateVirtualRouter.hs
@@ -0,0 +1,294 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateVirtualRouter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a virtual router within a service mesh.
+--
+-- Specify a @listener@ for any inbound traffic that your virtual router
+-- receives. Create a virtual router for each protocol and port that you
+-- need to route. Virtual routers handle traffic for one or more virtual
+-- services within your mesh. After you create your virtual router, create
+-- and associate routes for your virtual router that direct incoming
+-- requests to different virtual nodes.
+--
+-- For more information about virtual routers, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_routers.html Virtual routers>.
+module Amazonka.AppMesh.CreateVirtualRouter
+  ( -- * Creating a Request
+    CreateVirtualRouter (..),
+    newCreateVirtualRouter,
+
+    -- * Request Lenses
+    createVirtualRouter_clientToken,
+    createVirtualRouter_meshOwner,
+    createVirtualRouter_tags,
+    createVirtualRouter_meshName,
+    createVirtualRouter_spec,
+    createVirtualRouter_virtualRouterName,
+
+    -- * Destructuring the Response
+    CreateVirtualRouterResponse (..),
+    newCreateVirtualRouterResponse,
+
+    -- * Response Lenses
+    createVirtualRouterResponse_httpStatus,
+    createVirtualRouterResponse_virtualRouter,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateVirtualRouter' smart constructor.
+data CreateVirtualRouter = CreateVirtualRouter'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then the account that you specify must share
+    -- the mesh with your account before you can create the resource in the
+    -- service mesh. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | Optional metadata that you can apply to the virtual router to assist
+    -- with categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name of the service mesh to create the virtual router in.
+    meshName :: Prelude.Text,
+    -- | The virtual router specification to apply.
+    spec :: VirtualRouterSpec,
+    -- | The name to use for the virtual router.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualRouter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createVirtualRouter_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'createVirtualRouter_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'tags', 'createVirtualRouter_tags' - Optional metadata that you can apply to the virtual router to assist
+-- with categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'meshName', 'createVirtualRouter_meshName' - The name of the service mesh to create the virtual router in.
+--
+-- 'spec', 'createVirtualRouter_spec' - The virtual router specification to apply.
+--
+-- 'virtualRouterName', 'createVirtualRouter_virtualRouterName' - The name to use for the virtual router.
+newCreateVirtualRouter ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualRouterSpec ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  CreateVirtualRouter
+newCreateVirtualRouter
+  pMeshName_
+  pSpec_
+  pVirtualRouterName_ =
+    CreateVirtualRouter'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createVirtualRouter_clientToken :: Lens.Lens' CreateVirtualRouter (Prelude.Maybe Prelude.Text)
+createVirtualRouter_clientToken = Lens.lens (\CreateVirtualRouter' {clientToken} -> clientToken) (\s@CreateVirtualRouter' {} a -> s {clientToken = a} :: CreateVirtualRouter)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+createVirtualRouter_meshOwner :: Lens.Lens' CreateVirtualRouter (Prelude.Maybe Prelude.Text)
+createVirtualRouter_meshOwner = Lens.lens (\CreateVirtualRouter' {meshOwner} -> meshOwner) (\s@CreateVirtualRouter' {} a -> s {meshOwner = a} :: CreateVirtualRouter)
+
+-- | Optional metadata that you can apply to the virtual router to assist
+-- with categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createVirtualRouter_tags :: Lens.Lens' CreateVirtualRouter (Prelude.Maybe [TagRef])
+createVirtualRouter_tags = Lens.lens (\CreateVirtualRouter' {tags} -> tags) (\s@CreateVirtualRouter' {} a -> s {tags = a} :: CreateVirtualRouter) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the service mesh to create the virtual router in.
+createVirtualRouter_meshName :: Lens.Lens' CreateVirtualRouter Prelude.Text
+createVirtualRouter_meshName = Lens.lens (\CreateVirtualRouter' {meshName} -> meshName) (\s@CreateVirtualRouter' {} a -> s {meshName = a} :: CreateVirtualRouter)
+
+-- | The virtual router specification to apply.
+createVirtualRouter_spec :: Lens.Lens' CreateVirtualRouter VirtualRouterSpec
+createVirtualRouter_spec = Lens.lens (\CreateVirtualRouter' {spec} -> spec) (\s@CreateVirtualRouter' {} a -> s {spec = a} :: CreateVirtualRouter)
+
+-- | The name to use for the virtual router.
+createVirtualRouter_virtualRouterName :: Lens.Lens' CreateVirtualRouter Prelude.Text
+createVirtualRouter_virtualRouterName = Lens.lens (\CreateVirtualRouter' {virtualRouterName} -> virtualRouterName) (\s@CreateVirtualRouter' {} a -> s {virtualRouterName = a} :: CreateVirtualRouter)
+
+instance Core.AWSRequest CreateVirtualRouter where
+  type
+    AWSResponse CreateVirtualRouter =
+      CreateVirtualRouterResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVirtualRouterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateVirtualRouter where
+  hashWithSalt _salt CreateVirtualRouter' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData CreateVirtualRouter where
+  rnf CreateVirtualRouter' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders CreateVirtualRouter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVirtualRouter where
+  toJSON CreateVirtualRouter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("spec" Data..= spec),
+            Prelude.Just
+              ("virtualRouterName" Data..= virtualRouterName)
+          ]
+      )
+
+instance Data.ToPath CreateVirtualRouter where
+  toPath CreateVirtualRouter' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouters"
+      ]
+
+instance Data.ToQuery CreateVirtualRouter where
+  toQuery CreateVirtualRouter' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newCreateVirtualRouterResponse' smart constructor.
+data CreateVirtualRouterResponse = CreateVirtualRouterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual router following the create call.
+    virtualRouter :: VirtualRouterData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualRouterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createVirtualRouterResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualRouter', 'createVirtualRouterResponse_virtualRouter' - The full description of your virtual router following the create call.
+newCreateVirtualRouterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualRouter'
+  VirtualRouterData ->
+  CreateVirtualRouterResponse
+newCreateVirtualRouterResponse
+  pHttpStatus_
+  pVirtualRouter_ =
+    CreateVirtualRouterResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualRouter = pVirtualRouter_
+      }
+
+-- | The response's http status code.
+createVirtualRouterResponse_httpStatus :: Lens.Lens' CreateVirtualRouterResponse Prelude.Int
+createVirtualRouterResponse_httpStatus = Lens.lens (\CreateVirtualRouterResponse' {httpStatus} -> httpStatus) (\s@CreateVirtualRouterResponse' {} a -> s {httpStatus = a} :: CreateVirtualRouterResponse)
+
+-- | The full description of your virtual router following the create call.
+createVirtualRouterResponse_virtualRouter :: Lens.Lens' CreateVirtualRouterResponse VirtualRouterData
+createVirtualRouterResponse_virtualRouter = Lens.lens (\CreateVirtualRouterResponse' {virtualRouter} -> virtualRouter) (\s@CreateVirtualRouterResponse' {} a -> s {virtualRouter = a} :: CreateVirtualRouterResponse)
+
+instance Prelude.NFData CreateVirtualRouterResponse where
+  rnf CreateVirtualRouterResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualRouter
diff --git a/gen/Amazonka/AppMesh/CreateVirtualService.hs b/gen/Amazonka/AppMesh/CreateVirtualService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/CreateVirtualService.hs
@@ -0,0 +1,295 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.CreateVirtualService
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a virtual service within a service mesh.
+--
+-- A virtual service is an abstraction of a real service that is provided
+-- by a virtual node directly or indirectly by means of a virtual router.
+-- Dependent services call your virtual service by its
+-- @virtualServiceName@, and those requests are routed to the virtual node
+-- or virtual router that is specified as the provider for the virtual
+-- service.
+--
+-- For more information about virtual services, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_services.html Virtual services>.
+module Amazonka.AppMesh.CreateVirtualService
+  ( -- * Creating a Request
+    CreateVirtualService (..),
+    newCreateVirtualService,
+
+    -- * Request Lenses
+    createVirtualService_clientToken,
+    createVirtualService_meshOwner,
+    createVirtualService_tags,
+    createVirtualService_meshName,
+    createVirtualService_spec,
+    createVirtualService_virtualServiceName,
+
+    -- * Destructuring the Response
+    CreateVirtualServiceResponse (..),
+    newCreateVirtualServiceResponse,
+
+    -- * Response Lenses
+    createVirtualServiceResponse_httpStatus,
+    createVirtualServiceResponse_virtualService,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateVirtualService' smart constructor.
+data CreateVirtualService = CreateVirtualService'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then the account that you specify must share
+    -- the mesh with your account before you can create the resource in the
+    -- service mesh. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | Optional metadata that you can apply to the virtual service to assist
+    -- with categorization and organization. Each tag consists of a key and an
+    -- optional value, both of which you define. Tag keys can have a maximum
+    -- character length of 128 characters, and tag values can have a maximum
+    -- length of 256 characters.
+    tags :: Prelude.Maybe [TagRef],
+    -- | The name of the service mesh to create the virtual service in.
+    meshName :: Prelude.Text,
+    -- | The virtual service specification to apply.
+    spec :: VirtualServiceSpec,
+    -- | The name to use for the virtual service.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualService' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createVirtualService_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'createVirtualService_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'tags', 'createVirtualService_tags' - Optional metadata that you can apply to the virtual service to assist
+-- with categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- 'meshName', 'createVirtualService_meshName' - The name of the service mesh to create the virtual service in.
+--
+-- 'spec', 'createVirtualService_spec' - The virtual service specification to apply.
+--
+-- 'virtualServiceName', 'createVirtualService_virtualServiceName' - The name to use for the virtual service.
+newCreateVirtualService ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualServiceSpec ->
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  CreateVirtualService
+newCreateVirtualService
+  pMeshName_
+  pSpec_
+  pVirtualServiceName_ =
+    CreateVirtualService'
+      { clientToken =
+          Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualServiceName = pVirtualServiceName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+createVirtualService_clientToken :: Lens.Lens' CreateVirtualService (Prelude.Maybe Prelude.Text)
+createVirtualService_clientToken = Lens.lens (\CreateVirtualService' {clientToken} -> clientToken) (\s@CreateVirtualService' {} a -> s {clientToken = a} :: CreateVirtualService)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then the account that you specify must share
+-- the mesh with your account before you can create the resource in the
+-- service mesh. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+createVirtualService_meshOwner :: Lens.Lens' CreateVirtualService (Prelude.Maybe Prelude.Text)
+createVirtualService_meshOwner = Lens.lens (\CreateVirtualService' {meshOwner} -> meshOwner) (\s@CreateVirtualService' {} a -> s {meshOwner = a} :: CreateVirtualService)
+
+-- | Optional metadata that you can apply to the virtual service to assist
+-- with categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+createVirtualService_tags :: Lens.Lens' CreateVirtualService (Prelude.Maybe [TagRef])
+createVirtualService_tags = Lens.lens (\CreateVirtualService' {tags} -> tags) (\s@CreateVirtualService' {} a -> s {tags = a} :: CreateVirtualService) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the service mesh to create the virtual service in.
+createVirtualService_meshName :: Lens.Lens' CreateVirtualService Prelude.Text
+createVirtualService_meshName = Lens.lens (\CreateVirtualService' {meshName} -> meshName) (\s@CreateVirtualService' {} a -> s {meshName = a} :: CreateVirtualService)
+
+-- | The virtual service specification to apply.
+createVirtualService_spec :: Lens.Lens' CreateVirtualService VirtualServiceSpec
+createVirtualService_spec = Lens.lens (\CreateVirtualService' {spec} -> spec) (\s@CreateVirtualService' {} a -> s {spec = a} :: CreateVirtualService)
+
+-- | The name to use for the virtual service.
+createVirtualService_virtualServiceName :: Lens.Lens' CreateVirtualService Prelude.Text
+createVirtualService_virtualServiceName = Lens.lens (\CreateVirtualService' {virtualServiceName} -> virtualServiceName) (\s@CreateVirtualService' {} a -> s {virtualServiceName = a} :: CreateVirtualService)
+
+instance Core.AWSRequest CreateVirtualService where
+  type
+    AWSResponse CreateVirtualService =
+      CreateVirtualServiceResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVirtualServiceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateVirtualService where
+  hashWithSalt _salt CreateVirtualService' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData CreateVirtualService where
+  rnf CreateVirtualService' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualServiceName
+
+instance Data.ToHeaders CreateVirtualService where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVirtualService where
+  toJSON CreateVirtualService' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("spec" Data..= spec),
+            Prelude.Just
+              ("virtualServiceName" Data..= virtualServiceName)
+          ]
+      )
+
+instance Data.ToPath CreateVirtualService where
+  toPath CreateVirtualService' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualServices"
+      ]
+
+instance Data.ToQuery CreateVirtualService where
+  toQuery CreateVirtualService' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newCreateVirtualServiceResponse' smart constructor.
+data CreateVirtualServiceResponse = CreateVirtualServiceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual service following the create call.
+    virtualService :: VirtualServiceData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualServiceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createVirtualServiceResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualService', 'createVirtualServiceResponse_virtualService' - The full description of your virtual service following the create call.
+newCreateVirtualServiceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualService'
+  VirtualServiceData ->
+  CreateVirtualServiceResponse
+newCreateVirtualServiceResponse
+  pHttpStatus_
+  pVirtualService_ =
+    CreateVirtualServiceResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualService = pVirtualService_
+      }
+
+-- | The response's http status code.
+createVirtualServiceResponse_httpStatus :: Lens.Lens' CreateVirtualServiceResponse Prelude.Int
+createVirtualServiceResponse_httpStatus = Lens.lens (\CreateVirtualServiceResponse' {httpStatus} -> httpStatus) (\s@CreateVirtualServiceResponse' {} a -> s {httpStatus = a} :: CreateVirtualServiceResponse)
+
+-- | The full description of your virtual service following the create call.
+createVirtualServiceResponse_virtualService :: Lens.Lens' CreateVirtualServiceResponse VirtualServiceData
+createVirtualServiceResponse_virtualService = Lens.lens (\CreateVirtualServiceResponse' {virtualService} -> virtualService) (\s@CreateVirtualServiceResponse' {} a -> s {virtualService = a} :: CreateVirtualServiceResponse)
+
+instance Prelude.NFData CreateVirtualServiceResponse where
+  rnf CreateVirtualServiceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualService
diff --git a/gen/Amazonka/AppMesh/DeleteGatewayRoute.hs b/gen/Amazonka/AppMesh/DeleteGatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteGatewayRoute.hs
@@ -0,0 +1,226 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteGatewayRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing gateway route.
+module Amazonka.AppMesh.DeleteGatewayRoute
+  ( -- * Creating a Request
+    DeleteGatewayRoute (..),
+    newDeleteGatewayRoute,
+
+    -- * Request Lenses
+    deleteGatewayRoute_meshOwner,
+    deleteGatewayRoute_gatewayRouteName,
+    deleteGatewayRoute_meshName,
+    deleteGatewayRoute_virtualGatewayName,
+
+    -- * Destructuring the Response
+    DeleteGatewayRouteResponse (..),
+    newDeleteGatewayRouteResponse,
+
+    -- * Response Lenses
+    deleteGatewayRouteResponse_httpStatus,
+    deleteGatewayRouteResponse_gatewayRoute,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteGatewayRoute' smart constructor.
+data DeleteGatewayRoute = DeleteGatewayRoute'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the gateway route to delete.
+    gatewayRouteName :: Prelude.Text,
+    -- | The name of the service mesh to delete the gateway route from.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual gateway to delete the route from.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGatewayRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'deleteGatewayRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'gatewayRouteName', 'deleteGatewayRoute_gatewayRouteName' - The name of the gateway route to delete.
+--
+-- 'meshName', 'deleteGatewayRoute_meshName' - The name of the service mesh to delete the gateway route from.
+--
+-- 'virtualGatewayName', 'deleteGatewayRoute_virtualGatewayName' - The name of the virtual gateway to delete the route from.
+newDeleteGatewayRoute ::
+  -- | 'gatewayRouteName'
+  Prelude.Text ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  DeleteGatewayRoute
+newDeleteGatewayRoute
+  pGatewayRouteName_
+  pMeshName_
+  pVirtualGatewayName_ =
+    DeleteGatewayRoute'
+      { meshOwner = Prelude.Nothing,
+        gatewayRouteName = pGatewayRouteName_,
+        meshName = pMeshName_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+deleteGatewayRoute_meshOwner :: Lens.Lens' DeleteGatewayRoute (Prelude.Maybe Prelude.Text)
+deleteGatewayRoute_meshOwner = Lens.lens (\DeleteGatewayRoute' {meshOwner} -> meshOwner) (\s@DeleteGatewayRoute' {} a -> s {meshOwner = a} :: DeleteGatewayRoute)
+
+-- | The name of the gateway route to delete.
+deleteGatewayRoute_gatewayRouteName :: Lens.Lens' DeleteGatewayRoute Prelude.Text
+deleteGatewayRoute_gatewayRouteName = Lens.lens (\DeleteGatewayRoute' {gatewayRouteName} -> gatewayRouteName) (\s@DeleteGatewayRoute' {} a -> s {gatewayRouteName = a} :: DeleteGatewayRoute)
+
+-- | The name of the service mesh to delete the gateway route from.
+deleteGatewayRoute_meshName :: Lens.Lens' DeleteGatewayRoute Prelude.Text
+deleteGatewayRoute_meshName = Lens.lens (\DeleteGatewayRoute' {meshName} -> meshName) (\s@DeleteGatewayRoute' {} a -> s {meshName = a} :: DeleteGatewayRoute)
+
+-- | The name of the virtual gateway to delete the route from.
+deleteGatewayRoute_virtualGatewayName :: Lens.Lens' DeleteGatewayRoute Prelude.Text
+deleteGatewayRoute_virtualGatewayName = Lens.lens (\DeleteGatewayRoute' {virtualGatewayName} -> virtualGatewayName) (\s@DeleteGatewayRoute' {} a -> s {virtualGatewayName = a} :: DeleteGatewayRoute)
+
+instance Core.AWSRequest DeleteGatewayRoute where
+  type
+    AWSResponse DeleteGatewayRoute =
+      DeleteGatewayRouteResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteGatewayRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteGatewayRoute where
+  hashWithSalt _salt DeleteGatewayRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` gatewayRouteName
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData DeleteGatewayRoute where
+  rnf DeleteGatewayRoute' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf gatewayRouteName
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders DeleteGatewayRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteGatewayRoute where
+  toPath DeleteGatewayRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateway/",
+        Data.toBS virtualGatewayName,
+        "/gatewayRoutes/",
+        Data.toBS gatewayRouteName
+      ]
+
+instance Data.ToQuery DeleteGatewayRoute where
+  toQuery DeleteGatewayRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newDeleteGatewayRouteResponse' smart constructor.
+data DeleteGatewayRouteResponse = DeleteGatewayRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The gateway route that was deleted.
+    gatewayRoute :: GatewayRouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGatewayRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteGatewayRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayRoute', 'deleteGatewayRouteResponse_gatewayRoute' - The gateway route that was deleted.
+newDeleteGatewayRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayRoute'
+  GatewayRouteData ->
+  DeleteGatewayRouteResponse
+newDeleteGatewayRouteResponse
+  pHttpStatus_
+  pGatewayRoute_ =
+    DeleteGatewayRouteResponse'
+      { httpStatus =
+          pHttpStatus_,
+        gatewayRoute = pGatewayRoute_
+      }
+
+-- | The response's http status code.
+deleteGatewayRouteResponse_httpStatus :: Lens.Lens' DeleteGatewayRouteResponse Prelude.Int
+deleteGatewayRouteResponse_httpStatus = Lens.lens (\DeleteGatewayRouteResponse' {httpStatus} -> httpStatus) (\s@DeleteGatewayRouteResponse' {} a -> s {httpStatus = a} :: DeleteGatewayRouteResponse)
+
+-- | The gateway route that was deleted.
+deleteGatewayRouteResponse_gatewayRoute :: Lens.Lens' DeleteGatewayRouteResponse GatewayRouteData
+deleteGatewayRouteResponse_gatewayRoute = Lens.lens (\DeleteGatewayRouteResponse' {gatewayRoute} -> gatewayRoute) (\s@DeleteGatewayRouteResponse' {} a -> s {gatewayRoute = a} :: DeleteGatewayRouteResponse)
+
+instance Prelude.NFData DeleteGatewayRouteResponse where
+  rnf DeleteGatewayRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayRoute
diff --git a/gen/Amazonka/AppMesh/DeleteMesh.hs b/gen/Amazonka/AppMesh/DeleteMesh.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteMesh.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing service mesh.
+--
+-- You must delete all resources (virtual services, routes, virtual
+-- routers, and virtual nodes) in the service mesh before you can delete
+-- the mesh itself.
+module Amazonka.AppMesh.DeleteMesh
+  ( -- * Creating a Request
+    DeleteMesh (..),
+    newDeleteMesh,
+
+    -- * Request Lenses
+    deleteMesh_meshName,
+
+    -- * Destructuring the Response
+    DeleteMeshResponse (..),
+    newDeleteMeshResponse,
+
+    -- * Response Lenses
+    deleteMeshResponse_httpStatus,
+    deleteMeshResponse_mesh,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteMesh' smart constructor.
+data DeleteMesh = DeleteMesh'
+  { -- | The name of the service mesh to delete.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMesh' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'deleteMesh_meshName' - The name of the service mesh to delete.
+newDeleteMesh ::
+  -- | 'meshName'
+  Prelude.Text ->
+  DeleteMesh
+newDeleteMesh pMeshName_ =
+  DeleteMesh' {meshName = pMeshName_}
+
+-- | The name of the service mesh to delete.
+deleteMesh_meshName :: Lens.Lens' DeleteMesh Prelude.Text
+deleteMesh_meshName = Lens.lens (\DeleteMesh' {meshName} -> meshName) (\s@DeleteMesh' {} a -> s {meshName = a} :: DeleteMesh)
+
+instance Core.AWSRequest DeleteMesh where
+  type AWSResponse DeleteMesh = DeleteMeshResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteMeshResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteMesh where
+  hashWithSalt _salt DeleteMesh' {..} =
+    _salt `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData DeleteMesh where
+  rnf DeleteMesh' {..} = Prelude.rnf meshName
+
+instance Data.ToHeaders DeleteMesh where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteMesh where
+  toPath DeleteMesh' {..} =
+    Prelude.mconcat
+      ["/v20190125/meshes/", Data.toBS meshName]
+
+instance Data.ToQuery DeleteMesh where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newDeleteMeshResponse' smart constructor.
+data DeleteMeshResponse = DeleteMeshResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The service mesh that was deleted.
+    mesh :: MeshData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMeshResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteMeshResponse_httpStatus' - The response's http status code.
+--
+-- 'mesh', 'deleteMeshResponse_mesh' - The service mesh that was deleted.
+newDeleteMeshResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'mesh'
+  MeshData ->
+  DeleteMeshResponse
+newDeleteMeshResponse pHttpStatus_ pMesh_ =
+  DeleteMeshResponse'
+    { httpStatus = pHttpStatus_,
+      mesh = pMesh_
+    }
+
+-- | The response's http status code.
+deleteMeshResponse_httpStatus :: Lens.Lens' DeleteMeshResponse Prelude.Int
+deleteMeshResponse_httpStatus = Lens.lens (\DeleteMeshResponse' {httpStatus} -> httpStatus) (\s@DeleteMeshResponse' {} a -> s {httpStatus = a} :: DeleteMeshResponse)
+
+-- | The service mesh that was deleted.
+deleteMeshResponse_mesh :: Lens.Lens' DeleteMeshResponse MeshData
+deleteMeshResponse_mesh = Lens.lens (\DeleteMeshResponse' {mesh} -> mesh) (\s@DeleteMeshResponse' {} a -> s {mesh = a} :: DeleteMeshResponse)
+
+instance Prelude.NFData DeleteMeshResponse where
+  rnf DeleteMeshResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf mesh
diff --git a/gen/Amazonka/AppMesh/DeleteRoute.hs b/gen/Amazonka/AppMesh/DeleteRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteRoute.hs
@@ -0,0 +1,225 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing route.
+module Amazonka.AppMesh.DeleteRoute
+  ( -- * Creating a Request
+    DeleteRoute (..),
+    newDeleteRoute,
+
+    -- * Request Lenses
+    deleteRoute_meshOwner,
+    deleteRoute_meshName,
+    deleteRoute_routeName,
+    deleteRoute_virtualRouterName,
+
+    -- * Destructuring the Response
+    DeleteRouteResponse (..),
+    newDeleteRouteResponse,
+
+    -- * Response Lenses
+    deleteRouteResponse_httpStatus,
+    deleteRouteResponse_route,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteRoute' smart constructor.
+data DeleteRoute = DeleteRoute'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to delete the route in.
+    meshName :: Prelude.Text,
+    -- | The name of the route to delete.
+    routeName :: Prelude.Text,
+    -- | The name of the virtual router to delete the route in.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'deleteRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'deleteRoute_meshName' - The name of the service mesh to delete the route in.
+--
+-- 'routeName', 'deleteRoute_routeName' - The name of the route to delete.
+--
+-- 'virtualRouterName', 'deleteRoute_virtualRouterName' - The name of the virtual router to delete the route in.
+newDeleteRoute ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'routeName'
+  Prelude.Text ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  DeleteRoute
+newDeleteRoute
+  pMeshName_
+  pRouteName_
+  pVirtualRouterName_ =
+    DeleteRoute'
+      { meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        routeName = pRouteName_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+deleteRoute_meshOwner :: Lens.Lens' DeleteRoute (Prelude.Maybe Prelude.Text)
+deleteRoute_meshOwner = Lens.lens (\DeleteRoute' {meshOwner} -> meshOwner) (\s@DeleteRoute' {} a -> s {meshOwner = a} :: DeleteRoute)
+
+-- | The name of the service mesh to delete the route in.
+deleteRoute_meshName :: Lens.Lens' DeleteRoute Prelude.Text
+deleteRoute_meshName = Lens.lens (\DeleteRoute' {meshName} -> meshName) (\s@DeleteRoute' {} a -> s {meshName = a} :: DeleteRoute)
+
+-- | The name of the route to delete.
+deleteRoute_routeName :: Lens.Lens' DeleteRoute Prelude.Text
+deleteRoute_routeName = Lens.lens (\DeleteRoute' {routeName} -> routeName) (\s@DeleteRoute' {} a -> s {routeName = a} :: DeleteRoute)
+
+-- | The name of the virtual router to delete the route in.
+deleteRoute_virtualRouterName :: Lens.Lens' DeleteRoute Prelude.Text
+deleteRoute_virtualRouterName = Lens.lens (\DeleteRoute' {virtualRouterName} -> virtualRouterName) (\s@DeleteRoute' {} a -> s {virtualRouterName = a} :: DeleteRoute)
+
+instance Core.AWSRequest DeleteRoute where
+  type AWSResponse DeleteRoute = DeleteRouteResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteRoute where
+  hashWithSalt _salt DeleteRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` routeName
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData DeleteRoute where
+  rnf DeleteRoute' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf routeName
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders DeleteRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteRoute where
+  toPath DeleteRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouter/",
+        Data.toBS virtualRouterName,
+        "/routes/",
+        Data.toBS routeName
+      ]
+
+instance Data.ToQuery DeleteRoute where
+  toQuery DeleteRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDeleteRouteResponse' smart constructor.
+data DeleteRouteResponse = DeleteRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The route that was deleted.
+    route :: RouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'route', 'deleteRouteResponse_route' - The route that was deleted.
+newDeleteRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'route'
+  RouteData ->
+  DeleteRouteResponse
+newDeleteRouteResponse pHttpStatus_ pRoute_ =
+  DeleteRouteResponse'
+    { httpStatus = pHttpStatus_,
+      route = pRoute_
+    }
+
+-- | The response's http status code.
+deleteRouteResponse_httpStatus :: Lens.Lens' DeleteRouteResponse Prelude.Int
+deleteRouteResponse_httpStatus = Lens.lens (\DeleteRouteResponse' {httpStatus} -> httpStatus) (\s@DeleteRouteResponse' {} a -> s {httpStatus = a} :: DeleteRouteResponse)
+
+-- | The route that was deleted.
+deleteRouteResponse_route :: Lens.Lens' DeleteRouteResponse RouteData
+deleteRouteResponse_route = Lens.lens (\DeleteRouteResponse' {route} -> route) (\s@DeleteRouteResponse' {} a -> s {route = a} :: DeleteRouteResponse)
+
+instance Prelude.NFData DeleteRouteResponse where
+  rnf DeleteRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf route
diff --git a/gen/Amazonka/AppMesh/DeleteVirtualGateway.hs b/gen/Amazonka/AppMesh/DeleteVirtualGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteVirtualGateway.hs
@@ -0,0 +1,210 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteVirtualGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing virtual gateway. You cannot delete a virtual gateway
+-- if any gateway routes are associated to it.
+module Amazonka.AppMesh.DeleteVirtualGateway
+  ( -- * Creating a Request
+    DeleteVirtualGateway (..),
+    newDeleteVirtualGateway,
+
+    -- * Request Lenses
+    deleteVirtualGateway_meshOwner,
+    deleteVirtualGateway_meshName,
+    deleteVirtualGateway_virtualGatewayName,
+
+    -- * Destructuring the Response
+    DeleteVirtualGatewayResponse (..),
+    newDeleteVirtualGatewayResponse,
+
+    -- * Response Lenses
+    deleteVirtualGatewayResponse_httpStatus,
+    deleteVirtualGatewayResponse_virtualGateway,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteVirtualGateway' smart constructor.
+data DeleteVirtualGateway = DeleteVirtualGateway'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to delete the virtual gateway from.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual gateway to delete.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'deleteVirtualGateway_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'deleteVirtualGateway_meshName' - The name of the service mesh to delete the virtual gateway from.
+--
+-- 'virtualGatewayName', 'deleteVirtualGateway_virtualGatewayName' - The name of the virtual gateway to delete.
+newDeleteVirtualGateway ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  DeleteVirtualGateway
+newDeleteVirtualGateway
+  pMeshName_
+  pVirtualGatewayName_ =
+    DeleteVirtualGateway'
+      { meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+deleteVirtualGateway_meshOwner :: Lens.Lens' DeleteVirtualGateway (Prelude.Maybe Prelude.Text)
+deleteVirtualGateway_meshOwner = Lens.lens (\DeleteVirtualGateway' {meshOwner} -> meshOwner) (\s@DeleteVirtualGateway' {} a -> s {meshOwner = a} :: DeleteVirtualGateway)
+
+-- | The name of the service mesh to delete the virtual gateway from.
+deleteVirtualGateway_meshName :: Lens.Lens' DeleteVirtualGateway Prelude.Text
+deleteVirtualGateway_meshName = Lens.lens (\DeleteVirtualGateway' {meshName} -> meshName) (\s@DeleteVirtualGateway' {} a -> s {meshName = a} :: DeleteVirtualGateway)
+
+-- | The name of the virtual gateway to delete.
+deleteVirtualGateway_virtualGatewayName :: Lens.Lens' DeleteVirtualGateway Prelude.Text
+deleteVirtualGateway_virtualGatewayName = Lens.lens (\DeleteVirtualGateway' {virtualGatewayName} -> virtualGatewayName) (\s@DeleteVirtualGateway' {} a -> s {virtualGatewayName = a} :: DeleteVirtualGateway)
+
+instance Core.AWSRequest DeleteVirtualGateway where
+  type
+    AWSResponse DeleteVirtualGateway =
+      DeleteVirtualGatewayResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVirtualGatewayResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteVirtualGateway where
+  hashWithSalt _salt DeleteVirtualGateway' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData DeleteVirtualGateway where
+  rnf DeleteVirtualGateway' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders DeleteVirtualGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteVirtualGateway where
+  toPath DeleteVirtualGateway' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateways/",
+        Data.toBS virtualGatewayName
+      ]
+
+instance Data.ToQuery DeleteVirtualGateway where
+  toQuery DeleteVirtualGateway' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newDeleteVirtualGatewayResponse' smart constructor.
+data DeleteVirtualGatewayResponse = DeleteVirtualGatewayResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The virtual gateway that was deleted.
+    virtualGateway :: VirtualGatewayData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteVirtualGatewayResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualGateway', 'deleteVirtualGatewayResponse_virtualGateway' - The virtual gateway that was deleted.
+newDeleteVirtualGatewayResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualGateway'
+  VirtualGatewayData ->
+  DeleteVirtualGatewayResponse
+newDeleteVirtualGatewayResponse
+  pHttpStatus_
+  pVirtualGateway_ =
+    DeleteVirtualGatewayResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualGateway = pVirtualGateway_
+      }
+
+-- | The response's http status code.
+deleteVirtualGatewayResponse_httpStatus :: Lens.Lens' DeleteVirtualGatewayResponse Prelude.Int
+deleteVirtualGatewayResponse_httpStatus = Lens.lens (\DeleteVirtualGatewayResponse' {httpStatus} -> httpStatus) (\s@DeleteVirtualGatewayResponse' {} a -> s {httpStatus = a} :: DeleteVirtualGatewayResponse)
+
+-- | The virtual gateway that was deleted.
+deleteVirtualGatewayResponse_virtualGateway :: Lens.Lens' DeleteVirtualGatewayResponse VirtualGatewayData
+deleteVirtualGatewayResponse_virtualGateway = Lens.lens (\DeleteVirtualGatewayResponse' {virtualGateway} -> virtualGateway) (\s@DeleteVirtualGatewayResponse' {} a -> s {virtualGateway = a} :: DeleteVirtualGatewayResponse)
+
+instance Prelude.NFData DeleteVirtualGatewayResponse where
+  rnf DeleteVirtualGatewayResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualGateway
diff --git a/gen/Amazonka/AppMesh/DeleteVirtualNode.hs b/gen/Amazonka/AppMesh/DeleteVirtualNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteVirtualNode.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteVirtualNode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing virtual node.
+--
+-- You must delete any virtual services that list a virtual node as a
+-- service provider before you can delete the virtual node itself.
+module Amazonka.AppMesh.DeleteVirtualNode
+  ( -- * Creating a Request
+    DeleteVirtualNode (..),
+    newDeleteVirtualNode,
+
+    -- * Request Lenses
+    deleteVirtualNode_meshOwner,
+    deleteVirtualNode_meshName,
+    deleteVirtualNode_virtualNodeName,
+
+    -- * Destructuring the Response
+    DeleteVirtualNodeResponse (..),
+    newDeleteVirtualNodeResponse,
+
+    -- * Response Lenses
+    deleteVirtualNodeResponse_httpStatus,
+    deleteVirtualNodeResponse_virtualNode,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Deletes a virtual node input.
+--
+-- /See:/ 'newDeleteVirtualNode' smart constructor.
+data DeleteVirtualNode = DeleteVirtualNode'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to delete the virtual node in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual node to delete.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualNode' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'deleteVirtualNode_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'deleteVirtualNode_meshName' - The name of the service mesh to delete the virtual node in.
+--
+-- 'virtualNodeName', 'deleteVirtualNode_virtualNodeName' - The name of the virtual node to delete.
+newDeleteVirtualNode ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  DeleteVirtualNode
+newDeleteVirtualNode pMeshName_ pVirtualNodeName_ =
+  DeleteVirtualNode'
+    { meshOwner = Prelude.Nothing,
+      meshName = pMeshName_,
+      virtualNodeName = pVirtualNodeName_
+    }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+deleteVirtualNode_meshOwner :: Lens.Lens' DeleteVirtualNode (Prelude.Maybe Prelude.Text)
+deleteVirtualNode_meshOwner = Lens.lens (\DeleteVirtualNode' {meshOwner} -> meshOwner) (\s@DeleteVirtualNode' {} a -> s {meshOwner = a} :: DeleteVirtualNode)
+
+-- | The name of the service mesh to delete the virtual node in.
+deleteVirtualNode_meshName :: Lens.Lens' DeleteVirtualNode Prelude.Text
+deleteVirtualNode_meshName = Lens.lens (\DeleteVirtualNode' {meshName} -> meshName) (\s@DeleteVirtualNode' {} a -> s {meshName = a} :: DeleteVirtualNode)
+
+-- | The name of the virtual node to delete.
+deleteVirtualNode_virtualNodeName :: Lens.Lens' DeleteVirtualNode Prelude.Text
+deleteVirtualNode_virtualNodeName = Lens.lens (\DeleteVirtualNode' {virtualNodeName} -> virtualNodeName) (\s@DeleteVirtualNode' {} a -> s {virtualNodeName = a} :: DeleteVirtualNode)
+
+instance Core.AWSRequest DeleteVirtualNode where
+  type
+    AWSResponse DeleteVirtualNode =
+      DeleteVirtualNodeResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVirtualNodeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteVirtualNode where
+  hashWithSalt _salt DeleteVirtualNode' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData DeleteVirtualNode where
+  rnf DeleteVirtualNode' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualNodeName
+
+instance Data.ToHeaders DeleteVirtualNode where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteVirtualNode where
+  toPath DeleteVirtualNode' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualNodes/",
+        Data.toBS virtualNodeName
+      ]
+
+instance Data.ToQuery DeleteVirtualNode where
+  toQuery DeleteVirtualNode' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDeleteVirtualNodeResponse' smart constructor.
+data DeleteVirtualNodeResponse = DeleteVirtualNodeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The virtual node that was deleted.
+    virtualNode :: VirtualNodeData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualNodeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteVirtualNodeResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualNode', 'deleteVirtualNodeResponse_virtualNode' - The virtual node that was deleted.
+newDeleteVirtualNodeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualNode'
+  VirtualNodeData ->
+  DeleteVirtualNodeResponse
+newDeleteVirtualNodeResponse
+  pHttpStatus_
+  pVirtualNode_ =
+    DeleteVirtualNodeResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualNode = pVirtualNode_
+      }
+
+-- | The response's http status code.
+deleteVirtualNodeResponse_httpStatus :: Lens.Lens' DeleteVirtualNodeResponse Prelude.Int
+deleteVirtualNodeResponse_httpStatus = Lens.lens (\DeleteVirtualNodeResponse' {httpStatus} -> httpStatus) (\s@DeleteVirtualNodeResponse' {} a -> s {httpStatus = a} :: DeleteVirtualNodeResponse)
+
+-- | The virtual node that was deleted.
+deleteVirtualNodeResponse_virtualNode :: Lens.Lens' DeleteVirtualNodeResponse VirtualNodeData
+deleteVirtualNodeResponse_virtualNode = Lens.lens (\DeleteVirtualNodeResponse' {virtualNode} -> virtualNode) (\s@DeleteVirtualNodeResponse' {} a -> s {virtualNode = a} :: DeleteVirtualNodeResponse)
+
+instance Prelude.NFData DeleteVirtualNodeResponse where
+  rnf DeleteVirtualNodeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualNode
diff --git a/gen/Amazonka/AppMesh/DeleteVirtualRouter.hs b/gen/Amazonka/AppMesh/DeleteVirtualRouter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteVirtualRouter.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteVirtualRouter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing virtual router.
+--
+-- You must delete any routes associated with the virtual router before you
+-- can delete the router itself.
+module Amazonka.AppMesh.DeleteVirtualRouter
+  ( -- * Creating a Request
+    DeleteVirtualRouter (..),
+    newDeleteVirtualRouter,
+
+    -- * Request Lenses
+    deleteVirtualRouter_meshOwner,
+    deleteVirtualRouter_meshName,
+    deleteVirtualRouter_virtualRouterName,
+
+    -- * Destructuring the Response
+    DeleteVirtualRouterResponse (..),
+    newDeleteVirtualRouterResponse,
+
+    -- * Response Lenses
+    deleteVirtualRouterResponse_httpStatus,
+    deleteVirtualRouterResponse_virtualRouter,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteVirtualRouter' smart constructor.
+data DeleteVirtualRouter = DeleteVirtualRouter'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to delete the virtual router in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual router to delete.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualRouter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'deleteVirtualRouter_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'deleteVirtualRouter_meshName' - The name of the service mesh to delete the virtual router in.
+--
+-- 'virtualRouterName', 'deleteVirtualRouter_virtualRouterName' - The name of the virtual router to delete.
+newDeleteVirtualRouter ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  DeleteVirtualRouter
+newDeleteVirtualRouter pMeshName_ pVirtualRouterName_ =
+  DeleteVirtualRouter'
+    { meshOwner = Prelude.Nothing,
+      meshName = pMeshName_,
+      virtualRouterName = pVirtualRouterName_
+    }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+deleteVirtualRouter_meshOwner :: Lens.Lens' DeleteVirtualRouter (Prelude.Maybe Prelude.Text)
+deleteVirtualRouter_meshOwner = Lens.lens (\DeleteVirtualRouter' {meshOwner} -> meshOwner) (\s@DeleteVirtualRouter' {} a -> s {meshOwner = a} :: DeleteVirtualRouter)
+
+-- | The name of the service mesh to delete the virtual router in.
+deleteVirtualRouter_meshName :: Lens.Lens' DeleteVirtualRouter Prelude.Text
+deleteVirtualRouter_meshName = Lens.lens (\DeleteVirtualRouter' {meshName} -> meshName) (\s@DeleteVirtualRouter' {} a -> s {meshName = a} :: DeleteVirtualRouter)
+
+-- | The name of the virtual router to delete.
+deleteVirtualRouter_virtualRouterName :: Lens.Lens' DeleteVirtualRouter Prelude.Text
+deleteVirtualRouter_virtualRouterName = Lens.lens (\DeleteVirtualRouter' {virtualRouterName} -> virtualRouterName) (\s@DeleteVirtualRouter' {} a -> s {virtualRouterName = a} :: DeleteVirtualRouter)
+
+instance Core.AWSRequest DeleteVirtualRouter where
+  type
+    AWSResponse DeleteVirtualRouter =
+      DeleteVirtualRouterResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVirtualRouterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteVirtualRouter where
+  hashWithSalt _salt DeleteVirtualRouter' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData DeleteVirtualRouter where
+  rnf DeleteVirtualRouter' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders DeleteVirtualRouter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteVirtualRouter where
+  toPath DeleteVirtualRouter' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouters/",
+        Data.toBS virtualRouterName
+      ]
+
+instance Data.ToQuery DeleteVirtualRouter where
+  toQuery DeleteVirtualRouter' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDeleteVirtualRouterResponse' smart constructor.
+data DeleteVirtualRouterResponse = DeleteVirtualRouterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The virtual router that was deleted.
+    virtualRouter :: VirtualRouterData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualRouterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteVirtualRouterResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualRouter', 'deleteVirtualRouterResponse_virtualRouter' - The virtual router that was deleted.
+newDeleteVirtualRouterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualRouter'
+  VirtualRouterData ->
+  DeleteVirtualRouterResponse
+newDeleteVirtualRouterResponse
+  pHttpStatus_
+  pVirtualRouter_ =
+    DeleteVirtualRouterResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualRouter = pVirtualRouter_
+      }
+
+-- | The response's http status code.
+deleteVirtualRouterResponse_httpStatus :: Lens.Lens' DeleteVirtualRouterResponse Prelude.Int
+deleteVirtualRouterResponse_httpStatus = Lens.lens (\DeleteVirtualRouterResponse' {httpStatus} -> httpStatus) (\s@DeleteVirtualRouterResponse' {} a -> s {httpStatus = a} :: DeleteVirtualRouterResponse)
+
+-- | The virtual router that was deleted.
+deleteVirtualRouterResponse_virtualRouter :: Lens.Lens' DeleteVirtualRouterResponse VirtualRouterData
+deleteVirtualRouterResponse_virtualRouter = Lens.lens (\DeleteVirtualRouterResponse' {virtualRouter} -> virtualRouter) (\s@DeleteVirtualRouterResponse' {} a -> s {virtualRouter = a} :: DeleteVirtualRouterResponse)
+
+instance Prelude.NFData DeleteVirtualRouterResponse where
+  rnf DeleteVirtualRouterResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualRouter
diff --git a/gen/Amazonka/AppMesh/DeleteVirtualService.hs b/gen/Amazonka/AppMesh/DeleteVirtualService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DeleteVirtualService.hs
@@ -0,0 +1,213 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DeleteVirtualService
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an existing virtual service.
+module Amazonka.AppMesh.DeleteVirtualService
+  ( -- * Creating a Request
+    DeleteVirtualService (..),
+    newDeleteVirtualService,
+
+    -- * Request Lenses
+    deleteVirtualService_meshOwner,
+    deleteVirtualService_meshName,
+    deleteVirtualService_virtualServiceName,
+
+    -- * Destructuring the Response
+    DeleteVirtualServiceResponse (..),
+    newDeleteVirtualServiceResponse,
+
+    -- * Response Lenses
+    deleteVirtualServiceResponse_httpStatus,
+    deleteVirtualServiceResponse_virtualService,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteVirtualService' smart constructor.
+data DeleteVirtualService = DeleteVirtualService'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to delete the virtual service in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual service to delete.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualService' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'deleteVirtualService_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'deleteVirtualService_meshName' - The name of the service mesh to delete the virtual service in.
+--
+-- 'virtualServiceName', 'deleteVirtualService_virtualServiceName' - The name of the virtual service to delete.
+newDeleteVirtualService ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  DeleteVirtualService
+newDeleteVirtualService
+  pMeshName_
+  pVirtualServiceName_ =
+    DeleteVirtualService'
+      { meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        virtualServiceName = pVirtualServiceName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+deleteVirtualService_meshOwner :: Lens.Lens' DeleteVirtualService (Prelude.Maybe Prelude.Text)
+deleteVirtualService_meshOwner = Lens.lens (\DeleteVirtualService' {meshOwner} -> meshOwner) (\s@DeleteVirtualService' {} a -> s {meshOwner = a} :: DeleteVirtualService)
+
+-- | The name of the service mesh to delete the virtual service in.
+deleteVirtualService_meshName :: Lens.Lens' DeleteVirtualService Prelude.Text
+deleteVirtualService_meshName = Lens.lens (\DeleteVirtualService' {meshName} -> meshName) (\s@DeleteVirtualService' {} a -> s {meshName = a} :: DeleteVirtualService)
+
+-- | The name of the virtual service to delete.
+deleteVirtualService_virtualServiceName :: Lens.Lens' DeleteVirtualService Prelude.Text
+deleteVirtualService_virtualServiceName = Lens.lens (\DeleteVirtualService' {virtualServiceName} -> virtualServiceName) (\s@DeleteVirtualService' {} a -> s {virtualServiceName = a} :: DeleteVirtualService)
+
+instance Core.AWSRequest DeleteVirtualService where
+  type
+    AWSResponse DeleteVirtualService =
+      DeleteVirtualServiceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVirtualServiceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DeleteVirtualService where
+  hashWithSalt _salt DeleteVirtualService' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData DeleteVirtualService where
+  rnf DeleteVirtualService' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualServiceName
+
+instance Data.ToHeaders DeleteVirtualService where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteVirtualService where
+  toPath DeleteVirtualService' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualServices/",
+        Data.toBS virtualServiceName
+      ]
+
+instance Data.ToQuery DeleteVirtualService where
+  toQuery DeleteVirtualService' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDeleteVirtualServiceResponse' smart constructor.
+data DeleteVirtualServiceResponse = DeleteVirtualServiceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The virtual service that was deleted.
+    virtualService :: VirtualServiceData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualServiceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteVirtualServiceResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualService', 'deleteVirtualServiceResponse_virtualService' - The virtual service that was deleted.
+newDeleteVirtualServiceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualService'
+  VirtualServiceData ->
+  DeleteVirtualServiceResponse
+newDeleteVirtualServiceResponse
+  pHttpStatus_
+  pVirtualService_ =
+    DeleteVirtualServiceResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualService = pVirtualService_
+      }
+
+-- | The response's http status code.
+deleteVirtualServiceResponse_httpStatus :: Lens.Lens' DeleteVirtualServiceResponse Prelude.Int
+deleteVirtualServiceResponse_httpStatus = Lens.lens (\DeleteVirtualServiceResponse' {httpStatus} -> httpStatus) (\s@DeleteVirtualServiceResponse' {} a -> s {httpStatus = a} :: DeleteVirtualServiceResponse)
+
+-- | The virtual service that was deleted.
+deleteVirtualServiceResponse_virtualService :: Lens.Lens' DeleteVirtualServiceResponse VirtualServiceData
+deleteVirtualServiceResponse_virtualService = Lens.lens (\DeleteVirtualServiceResponse' {virtualService} -> virtualService) (\s@DeleteVirtualServiceResponse' {} a -> s {virtualService = a} :: DeleteVirtualServiceResponse)
+
+instance Prelude.NFData DeleteVirtualServiceResponse where
+  rnf DeleteVirtualServiceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualService
diff --git a/gen/Amazonka/AppMesh/DescribeGatewayRoute.hs b/gen/Amazonka/AppMesh/DescribeGatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeGatewayRoute.hs
@@ -0,0 +1,229 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeGatewayRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing gateway route.
+module Amazonka.AppMesh.DescribeGatewayRoute
+  ( -- * Creating a Request
+    DescribeGatewayRoute (..),
+    newDescribeGatewayRoute,
+
+    -- * Request Lenses
+    describeGatewayRoute_meshOwner,
+    describeGatewayRoute_gatewayRouteName,
+    describeGatewayRoute_meshName,
+    describeGatewayRoute_virtualGatewayName,
+
+    -- * Destructuring the Response
+    DescribeGatewayRouteResponse (..),
+    newDescribeGatewayRouteResponse,
+
+    -- * Response Lenses
+    describeGatewayRouteResponse_httpStatus,
+    describeGatewayRouteResponse_gatewayRoute,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeGatewayRoute' smart constructor.
+data DescribeGatewayRoute = DescribeGatewayRoute'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the gateway route to describe.
+    gatewayRouteName :: Prelude.Text,
+    -- | The name of the service mesh that the gateway route resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual gateway that the gateway route is associated
+    -- with.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGatewayRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeGatewayRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'gatewayRouteName', 'describeGatewayRoute_gatewayRouteName' - The name of the gateway route to describe.
+--
+-- 'meshName', 'describeGatewayRoute_meshName' - The name of the service mesh that the gateway route resides in.
+--
+-- 'virtualGatewayName', 'describeGatewayRoute_virtualGatewayName' - The name of the virtual gateway that the gateway route is associated
+-- with.
+newDescribeGatewayRoute ::
+  -- | 'gatewayRouteName'
+  Prelude.Text ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  DescribeGatewayRoute
+newDescribeGatewayRoute
+  pGatewayRouteName_
+  pMeshName_
+  pVirtualGatewayName_ =
+    DescribeGatewayRoute'
+      { meshOwner = Prelude.Nothing,
+        gatewayRouteName = pGatewayRouteName_,
+        meshName = pMeshName_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeGatewayRoute_meshOwner :: Lens.Lens' DescribeGatewayRoute (Prelude.Maybe Prelude.Text)
+describeGatewayRoute_meshOwner = Lens.lens (\DescribeGatewayRoute' {meshOwner} -> meshOwner) (\s@DescribeGatewayRoute' {} a -> s {meshOwner = a} :: DescribeGatewayRoute)
+
+-- | The name of the gateway route to describe.
+describeGatewayRoute_gatewayRouteName :: Lens.Lens' DescribeGatewayRoute Prelude.Text
+describeGatewayRoute_gatewayRouteName = Lens.lens (\DescribeGatewayRoute' {gatewayRouteName} -> gatewayRouteName) (\s@DescribeGatewayRoute' {} a -> s {gatewayRouteName = a} :: DescribeGatewayRoute)
+
+-- | The name of the service mesh that the gateway route resides in.
+describeGatewayRoute_meshName :: Lens.Lens' DescribeGatewayRoute Prelude.Text
+describeGatewayRoute_meshName = Lens.lens (\DescribeGatewayRoute' {meshName} -> meshName) (\s@DescribeGatewayRoute' {} a -> s {meshName = a} :: DescribeGatewayRoute)
+
+-- | The name of the virtual gateway that the gateway route is associated
+-- with.
+describeGatewayRoute_virtualGatewayName :: Lens.Lens' DescribeGatewayRoute Prelude.Text
+describeGatewayRoute_virtualGatewayName = Lens.lens (\DescribeGatewayRoute' {virtualGatewayName} -> virtualGatewayName) (\s@DescribeGatewayRoute' {} a -> s {virtualGatewayName = a} :: DescribeGatewayRoute)
+
+instance Core.AWSRequest DescribeGatewayRoute where
+  type
+    AWSResponse DescribeGatewayRoute =
+      DescribeGatewayRouteResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeGatewayRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeGatewayRoute where
+  hashWithSalt _salt DescribeGatewayRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` gatewayRouteName
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData DescribeGatewayRoute where
+  rnf DescribeGatewayRoute' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf gatewayRouteName
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders DescribeGatewayRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeGatewayRoute where
+  toPath DescribeGatewayRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateway/",
+        Data.toBS virtualGatewayName,
+        "/gatewayRoutes/",
+        Data.toBS gatewayRouteName
+      ]
+
+instance Data.ToQuery DescribeGatewayRoute where
+  toQuery DescribeGatewayRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newDescribeGatewayRouteResponse' smart constructor.
+data DescribeGatewayRouteResponse = DescribeGatewayRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your gateway route.
+    gatewayRoute :: GatewayRouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGatewayRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeGatewayRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayRoute', 'describeGatewayRouteResponse_gatewayRoute' - The full description of your gateway route.
+newDescribeGatewayRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayRoute'
+  GatewayRouteData ->
+  DescribeGatewayRouteResponse
+newDescribeGatewayRouteResponse
+  pHttpStatus_
+  pGatewayRoute_ =
+    DescribeGatewayRouteResponse'
+      { httpStatus =
+          pHttpStatus_,
+        gatewayRoute = pGatewayRoute_
+      }
+
+-- | The response's http status code.
+describeGatewayRouteResponse_httpStatus :: Lens.Lens' DescribeGatewayRouteResponse Prelude.Int
+describeGatewayRouteResponse_httpStatus = Lens.lens (\DescribeGatewayRouteResponse' {httpStatus} -> httpStatus) (\s@DescribeGatewayRouteResponse' {} a -> s {httpStatus = a} :: DescribeGatewayRouteResponse)
+
+-- | The full description of your gateway route.
+describeGatewayRouteResponse_gatewayRoute :: Lens.Lens' DescribeGatewayRouteResponse GatewayRouteData
+describeGatewayRouteResponse_gatewayRoute = Lens.lens (\DescribeGatewayRouteResponse' {gatewayRoute} -> gatewayRoute) (\s@DescribeGatewayRouteResponse' {} a -> s {gatewayRoute = a} :: DescribeGatewayRouteResponse)
+
+instance Prelude.NFData DescribeGatewayRouteResponse where
+  rnf DescribeGatewayRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayRoute
diff --git a/gen/Amazonka/AppMesh/DescribeMesh.hs b/gen/Amazonka/AppMesh/DescribeMesh.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeMesh.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing service mesh.
+module Amazonka.AppMesh.DescribeMesh
+  ( -- * Creating a Request
+    DescribeMesh (..),
+    newDescribeMesh,
+
+    -- * Request Lenses
+    describeMesh_meshOwner,
+    describeMesh_meshName,
+
+    -- * Destructuring the Response
+    DescribeMeshResponse (..),
+    newDescribeMeshResponse,
+
+    -- * Response Lenses
+    describeMeshResponse_httpStatus,
+    describeMeshResponse_mesh,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDescribeMesh' smart constructor.
+data DescribeMesh = DescribeMesh'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to describe.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeMesh' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeMesh_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'describeMesh_meshName' - The name of the service mesh to describe.
+newDescribeMesh ::
+  -- | 'meshName'
+  Prelude.Text ->
+  DescribeMesh
+newDescribeMesh pMeshName_ =
+  DescribeMesh'
+    { meshOwner = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeMesh_meshOwner :: Lens.Lens' DescribeMesh (Prelude.Maybe Prelude.Text)
+describeMesh_meshOwner = Lens.lens (\DescribeMesh' {meshOwner} -> meshOwner) (\s@DescribeMesh' {} a -> s {meshOwner = a} :: DescribeMesh)
+
+-- | The name of the service mesh to describe.
+describeMesh_meshName :: Lens.Lens' DescribeMesh Prelude.Text
+describeMesh_meshName = Lens.lens (\DescribeMesh' {meshName} -> meshName) (\s@DescribeMesh' {} a -> s {meshName = a} :: DescribeMesh)
+
+instance Core.AWSRequest DescribeMesh where
+  type AWSResponse DescribeMesh = DescribeMeshResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeMeshResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeMesh where
+  hashWithSalt _salt DescribeMesh' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData DescribeMesh where
+  rnf DescribeMesh' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders DescribeMesh where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeMesh where
+  toPath DescribeMesh' {..} =
+    Prelude.mconcat
+      ["/v20190125/meshes/", Data.toBS meshName]
+
+instance Data.ToQuery DescribeMesh where
+  toQuery DescribeMesh' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDescribeMeshResponse' smart constructor.
+data DescribeMeshResponse = DescribeMeshResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your service mesh.
+    mesh :: MeshData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeMeshResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeMeshResponse_httpStatus' - The response's http status code.
+--
+-- 'mesh', 'describeMeshResponse_mesh' - The full description of your service mesh.
+newDescribeMeshResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'mesh'
+  MeshData ->
+  DescribeMeshResponse
+newDescribeMeshResponse pHttpStatus_ pMesh_ =
+  DescribeMeshResponse'
+    { httpStatus = pHttpStatus_,
+      mesh = pMesh_
+    }
+
+-- | The response's http status code.
+describeMeshResponse_httpStatus :: Lens.Lens' DescribeMeshResponse Prelude.Int
+describeMeshResponse_httpStatus = Lens.lens (\DescribeMeshResponse' {httpStatus} -> httpStatus) (\s@DescribeMeshResponse' {} a -> s {httpStatus = a} :: DescribeMeshResponse)
+
+-- | The full description of your service mesh.
+describeMeshResponse_mesh :: Lens.Lens' DescribeMeshResponse MeshData
+describeMeshResponse_mesh = Lens.lens (\DescribeMeshResponse' {mesh} -> mesh) (\s@DescribeMeshResponse' {} a -> s {mesh = a} :: DescribeMeshResponse)
+
+instance Prelude.NFData DescribeMeshResponse where
+  rnf DescribeMeshResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf mesh
diff --git a/gen/Amazonka/AppMesh/DescribeRoute.hs b/gen/Amazonka/AppMesh/DescribeRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeRoute.hs
@@ -0,0 +1,227 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing route.
+module Amazonka.AppMesh.DescribeRoute
+  ( -- * Creating a Request
+    DescribeRoute (..),
+    newDescribeRoute,
+
+    -- * Request Lenses
+    describeRoute_meshOwner,
+    describeRoute_meshName,
+    describeRoute_routeName,
+    describeRoute_virtualRouterName,
+
+    -- * Destructuring the Response
+    DescribeRouteResponse (..),
+    newDescribeRouteResponse,
+
+    -- * Response Lenses
+    describeRouteResponse_httpStatus,
+    describeRouteResponse_route,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDescribeRoute' smart constructor.
+data DescribeRoute = DescribeRoute'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the route resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the route to describe.
+    routeName :: Prelude.Text,
+    -- | The name of the virtual router that the route is associated with.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'describeRoute_meshName' - The name of the service mesh that the route resides in.
+--
+-- 'routeName', 'describeRoute_routeName' - The name of the route to describe.
+--
+-- 'virtualRouterName', 'describeRoute_virtualRouterName' - The name of the virtual router that the route is associated with.
+newDescribeRoute ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'routeName'
+  Prelude.Text ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  DescribeRoute
+newDescribeRoute
+  pMeshName_
+  pRouteName_
+  pVirtualRouterName_ =
+    DescribeRoute'
+      { meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        routeName = pRouteName_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeRoute_meshOwner :: Lens.Lens' DescribeRoute (Prelude.Maybe Prelude.Text)
+describeRoute_meshOwner = Lens.lens (\DescribeRoute' {meshOwner} -> meshOwner) (\s@DescribeRoute' {} a -> s {meshOwner = a} :: DescribeRoute)
+
+-- | The name of the service mesh that the route resides in.
+describeRoute_meshName :: Lens.Lens' DescribeRoute Prelude.Text
+describeRoute_meshName = Lens.lens (\DescribeRoute' {meshName} -> meshName) (\s@DescribeRoute' {} a -> s {meshName = a} :: DescribeRoute)
+
+-- | The name of the route to describe.
+describeRoute_routeName :: Lens.Lens' DescribeRoute Prelude.Text
+describeRoute_routeName = Lens.lens (\DescribeRoute' {routeName} -> routeName) (\s@DescribeRoute' {} a -> s {routeName = a} :: DescribeRoute)
+
+-- | The name of the virtual router that the route is associated with.
+describeRoute_virtualRouterName :: Lens.Lens' DescribeRoute Prelude.Text
+describeRoute_virtualRouterName = Lens.lens (\DescribeRoute' {virtualRouterName} -> virtualRouterName) (\s@DescribeRoute' {} a -> s {virtualRouterName = a} :: DescribeRoute)
+
+instance Core.AWSRequest DescribeRoute where
+  type
+    AWSResponse DescribeRoute =
+      DescribeRouteResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeRoute where
+  hashWithSalt _salt DescribeRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` routeName
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData DescribeRoute where
+  rnf DescribeRoute' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf routeName
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders DescribeRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeRoute where
+  toPath DescribeRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouter/",
+        Data.toBS virtualRouterName,
+        "/routes/",
+        Data.toBS routeName
+      ]
+
+instance Data.ToQuery DescribeRoute where
+  toQuery DescribeRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDescribeRouteResponse' smart constructor.
+data DescribeRouteResponse = DescribeRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your route.
+    route :: RouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'route', 'describeRouteResponse_route' - The full description of your route.
+newDescribeRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'route'
+  RouteData ->
+  DescribeRouteResponse
+newDescribeRouteResponse pHttpStatus_ pRoute_ =
+  DescribeRouteResponse'
+    { httpStatus = pHttpStatus_,
+      route = pRoute_
+    }
+
+-- | The response's http status code.
+describeRouteResponse_httpStatus :: Lens.Lens' DescribeRouteResponse Prelude.Int
+describeRouteResponse_httpStatus = Lens.lens (\DescribeRouteResponse' {httpStatus} -> httpStatus) (\s@DescribeRouteResponse' {} a -> s {httpStatus = a} :: DescribeRouteResponse)
+
+-- | The full description of your route.
+describeRouteResponse_route :: Lens.Lens' DescribeRouteResponse RouteData
+describeRouteResponse_route = Lens.lens (\DescribeRouteResponse' {route} -> route) (\s@DescribeRouteResponse' {} a -> s {route = a} :: DescribeRouteResponse)
+
+instance Prelude.NFData DescribeRouteResponse where
+  rnf DescribeRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf route
diff --git a/gen/Amazonka/AppMesh/DescribeVirtualGateway.hs b/gen/Amazonka/AppMesh/DescribeVirtualGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeVirtualGateway.hs
@@ -0,0 +1,213 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeVirtualGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing virtual gateway.
+module Amazonka.AppMesh.DescribeVirtualGateway
+  ( -- * Creating a Request
+    DescribeVirtualGateway (..),
+    newDescribeVirtualGateway,
+
+    -- * Request Lenses
+    describeVirtualGateway_meshOwner,
+    describeVirtualGateway_meshName,
+    describeVirtualGateway_virtualGatewayName,
+
+    -- * Destructuring the Response
+    DescribeVirtualGatewayResponse (..),
+    newDescribeVirtualGatewayResponse,
+
+    -- * Response Lenses
+    describeVirtualGatewayResponse_httpStatus,
+    describeVirtualGatewayResponse_virtualGateway,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeVirtualGateway' smart constructor.
+data DescribeVirtualGateway = DescribeVirtualGateway'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the gateway route resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual gateway to describe.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeVirtualGateway_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'describeVirtualGateway_meshName' - The name of the service mesh that the gateway route resides in.
+--
+-- 'virtualGatewayName', 'describeVirtualGateway_virtualGatewayName' - The name of the virtual gateway to describe.
+newDescribeVirtualGateway ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  DescribeVirtualGateway
+newDescribeVirtualGateway
+  pMeshName_
+  pVirtualGatewayName_ =
+    DescribeVirtualGateway'
+      { meshOwner =
+          Prelude.Nothing,
+        meshName = pMeshName_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeVirtualGateway_meshOwner :: Lens.Lens' DescribeVirtualGateway (Prelude.Maybe Prelude.Text)
+describeVirtualGateway_meshOwner = Lens.lens (\DescribeVirtualGateway' {meshOwner} -> meshOwner) (\s@DescribeVirtualGateway' {} a -> s {meshOwner = a} :: DescribeVirtualGateway)
+
+-- | The name of the service mesh that the gateway route resides in.
+describeVirtualGateway_meshName :: Lens.Lens' DescribeVirtualGateway Prelude.Text
+describeVirtualGateway_meshName = Lens.lens (\DescribeVirtualGateway' {meshName} -> meshName) (\s@DescribeVirtualGateway' {} a -> s {meshName = a} :: DescribeVirtualGateway)
+
+-- | The name of the virtual gateway to describe.
+describeVirtualGateway_virtualGatewayName :: Lens.Lens' DescribeVirtualGateway Prelude.Text
+describeVirtualGateway_virtualGatewayName = Lens.lens (\DescribeVirtualGateway' {virtualGatewayName} -> virtualGatewayName) (\s@DescribeVirtualGateway' {} a -> s {virtualGatewayName = a} :: DescribeVirtualGateway)
+
+instance Core.AWSRequest DescribeVirtualGateway where
+  type
+    AWSResponse DescribeVirtualGateway =
+      DescribeVirtualGatewayResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeVirtualGatewayResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeVirtualGateway where
+  hashWithSalt _salt DescribeVirtualGateway' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData DescribeVirtualGateway where
+  rnf DescribeVirtualGateway' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders DescribeVirtualGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeVirtualGateway where
+  toPath DescribeVirtualGateway' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateways/",
+        Data.toBS virtualGatewayName
+      ]
+
+instance Data.ToQuery DescribeVirtualGateway where
+  toQuery DescribeVirtualGateway' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newDescribeVirtualGatewayResponse' smart constructor.
+data DescribeVirtualGatewayResponse = DescribeVirtualGatewayResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual gateway.
+    virtualGateway :: VirtualGatewayData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeVirtualGatewayResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualGateway', 'describeVirtualGatewayResponse_virtualGateway' - The full description of your virtual gateway.
+newDescribeVirtualGatewayResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualGateway'
+  VirtualGatewayData ->
+  DescribeVirtualGatewayResponse
+newDescribeVirtualGatewayResponse
+  pHttpStatus_
+  pVirtualGateway_ =
+    DescribeVirtualGatewayResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualGateway = pVirtualGateway_
+      }
+
+-- | The response's http status code.
+describeVirtualGatewayResponse_httpStatus :: Lens.Lens' DescribeVirtualGatewayResponse Prelude.Int
+describeVirtualGatewayResponse_httpStatus = Lens.lens (\DescribeVirtualGatewayResponse' {httpStatus} -> httpStatus) (\s@DescribeVirtualGatewayResponse' {} a -> s {httpStatus = a} :: DescribeVirtualGatewayResponse)
+
+-- | The full description of your virtual gateway.
+describeVirtualGatewayResponse_virtualGateway :: Lens.Lens' DescribeVirtualGatewayResponse VirtualGatewayData
+describeVirtualGatewayResponse_virtualGateway = Lens.lens (\DescribeVirtualGatewayResponse' {virtualGateway} -> virtualGateway) (\s@DescribeVirtualGatewayResponse' {} a -> s {virtualGateway = a} :: DescribeVirtualGatewayResponse)
+
+instance
+  Prelude.NFData
+    DescribeVirtualGatewayResponse
+  where
+  rnf DescribeVirtualGatewayResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualGateway
diff --git a/gen/Amazonka/AppMesh/DescribeVirtualNode.hs b/gen/Amazonka/AppMesh/DescribeVirtualNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeVirtualNode.hs
@@ -0,0 +1,211 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeVirtualNode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing virtual node.
+module Amazonka.AppMesh.DescribeVirtualNode
+  ( -- * Creating a Request
+    DescribeVirtualNode (..),
+    newDescribeVirtualNode,
+
+    -- * Request Lenses
+    describeVirtualNode_meshOwner,
+    describeVirtualNode_meshName,
+    describeVirtualNode_virtualNodeName,
+
+    -- * Destructuring the Response
+    DescribeVirtualNodeResponse (..),
+    newDescribeVirtualNodeResponse,
+
+    -- * Response Lenses
+    describeVirtualNodeResponse_httpStatus,
+    describeVirtualNodeResponse_virtualNode,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDescribeVirtualNode' smart constructor.
+data DescribeVirtualNode = DescribeVirtualNode'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual node resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual node to describe.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualNode' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeVirtualNode_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'describeVirtualNode_meshName' - The name of the service mesh that the virtual node resides in.
+--
+-- 'virtualNodeName', 'describeVirtualNode_virtualNodeName' - The name of the virtual node to describe.
+newDescribeVirtualNode ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  DescribeVirtualNode
+newDescribeVirtualNode pMeshName_ pVirtualNodeName_ =
+  DescribeVirtualNode'
+    { meshOwner = Prelude.Nothing,
+      meshName = pMeshName_,
+      virtualNodeName = pVirtualNodeName_
+    }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeVirtualNode_meshOwner :: Lens.Lens' DescribeVirtualNode (Prelude.Maybe Prelude.Text)
+describeVirtualNode_meshOwner = Lens.lens (\DescribeVirtualNode' {meshOwner} -> meshOwner) (\s@DescribeVirtualNode' {} a -> s {meshOwner = a} :: DescribeVirtualNode)
+
+-- | The name of the service mesh that the virtual node resides in.
+describeVirtualNode_meshName :: Lens.Lens' DescribeVirtualNode Prelude.Text
+describeVirtualNode_meshName = Lens.lens (\DescribeVirtualNode' {meshName} -> meshName) (\s@DescribeVirtualNode' {} a -> s {meshName = a} :: DescribeVirtualNode)
+
+-- | The name of the virtual node to describe.
+describeVirtualNode_virtualNodeName :: Lens.Lens' DescribeVirtualNode Prelude.Text
+describeVirtualNode_virtualNodeName = Lens.lens (\DescribeVirtualNode' {virtualNodeName} -> virtualNodeName) (\s@DescribeVirtualNode' {} a -> s {virtualNodeName = a} :: DescribeVirtualNode)
+
+instance Core.AWSRequest DescribeVirtualNode where
+  type
+    AWSResponse DescribeVirtualNode =
+      DescribeVirtualNodeResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeVirtualNodeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeVirtualNode where
+  hashWithSalt _salt DescribeVirtualNode' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData DescribeVirtualNode where
+  rnf DescribeVirtualNode' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualNodeName
+
+instance Data.ToHeaders DescribeVirtualNode where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeVirtualNode where
+  toPath DescribeVirtualNode' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualNodes/",
+        Data.toBS virtualNodeName
+      ]
+
+instance Data.ToQuery DescribeVirtualNode where
+  toQuery DescribeVirtualNode' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDescribeVirtualNodeResponse' smart constructor.
+data DescribeVirtualNodeResponse = DescribeVirtualNodeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual node.
+    virtualNode :: VirtualNodeData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualNodeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeVirtualNodeResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualNode', 'describeVirtualNodeResponse_virtualNode' - The full description of your virtual node.
+newDescribeVirtualNodeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualNode'
+  VirtualNodeData ->
+  DescribeVirtualNodeResponse
+newDescribeVirtualNodeResponse
+  pHttpStatus_
+  pVirtualNode_ =
+    DescribeVirtualNodeResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualNode = pVirtualNode_
+      }
+
+-- | The response's http status code.
+describeVirtualNodeResponse_httpStatus :: Lens.Lens' DescribeVirtualNodeResponse Prelude.Int
+describeVirtualNodeResponse_httpStatus = Lens.lens (\DescribeVirtualNodeResponse' {httpStatus} -> httpStatus) (\s@DescribeVirtualNodeResponse' {} a -> s {httpStatus = a} :: DescribeVirtualNodeResponse)
+
+-- | The full description of your virtual node.
+describeVirtualNodeResponse_virtualNode :: Lens.Lens' DescribeVirtualNodeResponse VirtualNodeData
+describeVirtualNodeResponse_virtualNode = Lens.lens (\DescribeVirtualNodeResponse' {virtualNode} -> virtualNode) (\s@DescribeVirtualNodeResponse' {} a -> s {virtualNode = a} :: DescribeVirtualNodeResponse)
+
+instance Prelude.NFData DescribeVirtualNodeResponse where
+  rnf DescribeVirtualNodeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualNode
diff --git a/gen/Amazonka/AppMesh/DescribeVirtualRouter.hs b/gen/Amazonka/AppMesh/DescribeVirtualRouter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeVirtualRouter.hs
@@ -0,0 +1,213 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeVirtualRouter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing virtual router.
+module Amazonka.AppMesh.DescribeVirtualRouter
+  ( -- * Creating a Request
+    DescribeVirtualRouter (..),
+    newDescribeVirtualRouter,
+
+    -- * Request Lenses
+    describeVirtualRouter_meshOwner,
+    describeVirtualRouter_meshName,
+    describeVirtualRouter_virtualRouterName,
+
+    -- * Destructuring the Response
+    DescribeVirtualRouterResponse (..),
+    newDescribeVirtualRouterResponse,
+
+    -- * Response Lenses
+    describeVirtualRouterResponse_httpStatus,
+    describeVirtualRouterResponse_virtualRouter,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDescribeVirtualRouter' smart constructor.
+data DescribeVirtualRouter = DescribeVirtualRouter'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual router resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual router to describe.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualRouter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeVirtualRouter_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'describeVirtualRouter_meshName' - The name of the service mesh that the virtual router resides in.
+--
+-- 'virtualRouterName', 'describeVirtualRouter_virtualRouterName' - The name of the virtual router to describe.
+newDescribeVirtualRouter ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  DescribeVirtualRouter
+newDescribeVirtualRouter
+  pMeshName_
+  pVirtualRouterName_ =
+    DescribeVirtualRouter'
+      { meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeVirtualRouter_meshOwner :: Lens.Lens' DescribeVirtualRouter (Prelude.Maybe Prelude.Text)
+describeVirtualRouter_meshOwner = Lens.lens (\DescribeVirtualRouter' {meshOwner} -> meshOwner) (\s@DescribeVirtualRouter' {} a -> s {meshOwner = a} :: DescribeVirtualRouter)
+
+-- | The name of the service mesh that the virtual router resides in.
+describeVirtualRouter_meshName :: Lens.Lens' DescribeVirtualRouter Prelude.Text
+describeVirtualRouter_meshName = Lens.lens (\DescribeVirtualRouter' {meshName} -> meshName) (\s@DescribeVirtualRouter' {} a -> s {meshName = a} :: DescribeVirtualRouter)
+
+-- | The name of the virtual router to describe.
+describeVirtualRouter_virtualRouterName :: Lens.Lens' DescribeVirtualRouter Prelude.Text
+describeVirtualRouter_virtualRouterName = Lens.lens (\DescribeVirtualRouter' {virtualRouterName} -> virtualRouterName) (\s@DescribeVirtualRouter' {} a -> s {virtualRouterName = a} :: DescribeVirtualRouter)
+
+instance Core.AWSRequest DescribeVirtualRouter where
+  type
+    AWSResponse DescribeVirtualRouter =
+      DescribeVirtualRouterResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeVirtualRouterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeVirtualRouter where
+  hashWithSalt _salt DescribeVirtualRouter' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData DescribeVirtualRouter where
+  rnf DescribeVirtualRouter' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders DescribeVirtualRouter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeVirtualRouter where
+  toPath DescribeVirtualRouter' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouters/",
+        Data.toBS virtualRouterName
+      ]
+
+instance Data.ToQuery DescribeVirtualRouter where
+  toQuery DescribeVirtualRouter' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDescribeVirtualRouterResponse' smart constructor.
+data DescribeVirtualRouterResponse = DescribeVirtualRouterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual router.
+    virtualRouter :: VirtualRouterData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualRouterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeVirtualRouterResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualRouter', 'describeVirtualRouterResponse_virtualRouter' - The full description of your virtual router.
+newDescribeVirtualRouterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualRouter'
+  VirtualRouterData ->
+  DescribeVirtualRouterResponse
+newDescribeVirtualRouterResponse
+  pHttpStatus_
+  pVirtualRouter_ =
+    DescribeVirtualRouterResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualRouter = pVirtualRouter_
+      }
+
+-- | The response's http status code.
+describeVirtualRouterResponse_httpStatus :: Lens.Lens' DescribeVirtualRouterResponse Prelude.Int
+describeVirtualRouterResponse_httpStatus = Lens.lens (\DescribeVirtualRouterResponse' {httpStatus} -> httpStatus) (\s@DescribeVirtualRouterResponse' {} a -> s {httpStatus = a} :: DescribeVirtualRouterResponse)
+
+-- | The full description of your virtual router.
+describeVirtualRouterResponse_virtualRouter :: Lens.Lens' DescribeVirtualRouterResponse VirtualRouterData
+describeVirtualRouterResponse_virtualRouter = Lens.lens (\DescribeVirtualRouterResponse' {virtualRouter} -> virtualRouter) (\s@DescribeVirtualRouterResponse' {} a -> s {virtualRouter = a} :: DescribeVirtualRouterResponse)
+
+instance Prelude.NFData DescribeVirtualRouterResponse where
+  rnf DescribeVirtualRouterResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualRouter
diff --git a/gen/Amazonka/AppMesh/DescribeVirtualService.hs b/gen/Amazonka/AppMesh/DescribeVirtualService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/DescribeVirtualService.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.DescribeVirtualService
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing virtual service.
+module Amazonka.AppMesh.DescribeVirtualService
+  ( -- * Creating a Request
+    DescribeVirtualService (..),
+    newDescribeVirtualService,
+
+    -- * Request Lenses
+    describeVirtualService_meshOwner,
+    describeVirtualService_meshName,
+    describeVirtualService_virtualServiceName,
+
+    -- * Destructuring the Response
+    DescribeVirtualServiceResponse (..),
+    newDescribeVirtualServiceResponse,
+
+    -- * Response Lenses
+    describeVirtualServiceResponse_httpStatus,
+    describeVirtualServiceResponse_virtualService,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDescribeVirtualService' smart constructor.
+data DescribeVirtualService = DescribeVirtualService'
+  { -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual service resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual service to describe.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualService' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshOwner', 'describeVirtualService_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'describeVirtualService_meshName' - The name of the service mesh that the virtual service resides in.
+--
+-- 'virtualServiceName', 'describeVirtualService_virtualServiceName' - The name of the virtual service to describe.
+newDescribeVirtualService ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  DescribeVirtualService
+newDescribeVirtualService
+  pMeshName_
+  pVirtualServiceName_ =
+    DescribeVirtualService'
+      { meshOwner =
+          Prelude.Nothing,
+        meshName = pMeshName_,
+        virtualServiceName = pVirtualServiceName_
+      }
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+describeVirtualService_meshOwner :: Lens.Lens' DescribeVirtualService (Prelude.Maybe Prelude.Text)
+describeVirtualService_meshOwner = Lens.lens (\DescribeVirtualService' {meshOwner} -> meshOwner) (\s@DescribeVirtualService' {} a -> s {meshOwner = a} :: DescribeVirtualService)
+
+-- | The name of the service mesh that the virtual service resides in.
+describeVirtualService_meshName :: Lens.Lens' DescribeVirtualService Prelude.Text
+describeVirtualService_meshName = Lens.lens (\DescribeVirtualService' {meshName} -> meshName) (\s@DescribeVirtualService' {} a -> s {meshName = a} :: DescribeVirtualService)
+
+-- | The name of the virtual service to describe.
+describeVirtualService_virtualServiceName :: Lens.Lens' DescribeVirtualService Prelude.Text
+describeVirtualService_virtualServiceName = Lens.lens (\DescribeVirtualService' {virtualServiceName} -> virtualServiceName) (\s@DescribeVirtualService' {} a -> s {virtualServiceName = a} :: DescribeVirtualService)
+
+instance Core.AWSRequest DescribeVirtualService where
+  type
+    AWSResponse DescribeVirtualService =
+      DescribeVirtualServiceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeVirtualServiceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeVirtualService where
+  hashWithSalt _salt DescribeVirtualService' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData DescribeVirtualService where
+  rnf DescribeVirtualService' {..} =
+    Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualServiceName
+
+instance Data.ToHeaders DescribeVirtualService where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeVirtualService where
+  toPath DescribeVirtualService' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualServices/",
+        Data.toBS virtualServiceName
+      ]
+
+instance Data.ToQuery DescribeVirtualService where
+  toQuery DescribeVirtualService' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newDescribeVirtualServiceResponse' smart constructor.
+data DescribeVirtualServiceResponse = DescribeVirtualServiceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The full description of your virtual service.
+    virtualService :: VirtualServiceData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualServiceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeVirtualServiceResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualService', 'describeVirtualServiceResponse_virtualService' - The full description of your virtual service.
+newDescribeVirtualServiceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualService'
+  VirtualServiceData ->
+  DescribeVirtualServiceResponse
+newDescribeVirtualServiceResponse
+  pHttpStatus_
+  pVirtualService_ =
+    DescribeVirtualServiceResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualService = pVirtualService_
+      }
+
+-- | The response's http status code.
+describeVirtualServiceResponse_httpStatus :: Lens.Lens' DescribeVirtualServiceResponse Prelude.Int
+describeVirtualServiceResponse_httpStatus = Lens.lens (\DescribeVirtualServiceResponse' {httpStatus} -> httpStatus) (\s@DescribeVirtualServiceResponse' {} a -> s {httpStatus = a} :: DescribeVirtualServiceResponse)
+
+-- | The full description of your virtual service.
+describeVirtualServiceResponse_virtualService :: Lens.Lens' DescribeVirtualServiceResponse VirtualServiceData
+describeVirtualServiceResponse_virtualService = Lens.lens (\DescribeVirtualServiceResponse' {virtualService} -> virtualService) (\s@DescribeVirtualServiceResponse' {} a -> s {virtualService = a} :: DescribeVirtualServiceResponse)
+
+instance
+  Prelude.NFData
+    DescribeVirtualServiceResponse
+  where
+  rnf DescribeVirtualServiceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualService
diff --git a/gen/Amazonka/AppMesh/Lens.hs b/gen/Amazonka/AppMesh/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Lens.hs
@@ -0,0 +1,1185 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Lens
+  ( -- * Operations
+
+    -- ** CreateGatewayRoute
+    createGatewayRoute_clientToken,
+    createGatewayRoute_meshOwner,
+    createGatewayRoute_tags,
+    createGatewayRoute_gatewayRouteName,
+    createGatewayRoute_meshName,
+    createGatewayRoute_spec,
+    createGatewayRoute_virtualGatewayName,
+    createGatewayRouteResponse_httpStatus,
+    createGatewayRouteResponse_gatewayRoute,
+
+    -- ** CreateMesh
+    createMesh_clientToken,
+    createMesh_spec,
+    createMesh_tags,
+    createMesh_meshName,
+    createMeshResponse_httpStatus,
+    createMeshResponse_mesh,
+
+    -- ** CreateRoute
+    createRoute_clientToken,
+    createRoute_meshOwner,
+    createRoute_tags,
+    createRoute_meshName,
+    createRoute_routeName,
+    createRoute_spec,
+    createRoute_virtualRouterName,
+    createRouteResponse_httpStatus,
+    createRouteResponse_route,
+
+    -- ** CreateVirtualGateway
+    createVirtualGateway_clientToken,
+    createVirtualGateway_meshOwner,
+    createVirtualGateway_tags,
+    createVirtualGateway_meshName,
+    createVirtualGateway_spec,
+    createVirtualGateway_virtualGatewayName,
+    createVirtualGatewayResponse_httpStatus,
+    createVirtualGatewayResponse_virtualGateway,
+
+    -- ** CreateVirtualNode
+    createVirtualNode_clientToken,
+    createVirtualNode_meshOwner,
+    createVirtualNode_tags,
+    createVirtualNode_meshName,
+    createVirtualNode_spec,
+    createVirtualNode_virtualNodeName,
+    createVirtualNodeResponse_httpStatus,
+    createVirtualNodeResponse_virtualNode,
+
+    -- ** CreateVirtualRouter
+    createVirtualRouter_clientToken,
+    createVirtualRouter_meshOwner,
+    createVirtualRouter_tags,
+    createVirtualRouter_meshName,
+    createVirtualRouter_spec,
+    createVirtualRouter_virtualRouterName,
+    createVirtualRouterResponse_httpStatus,
+    createVirtualRouterResponse_virtualRouter,
+
+    -- ** CreateVirtualService
+    createVirtualService_clientToken,
+    createVirtualService_meshOwner,
+    createVirtualService_tags,
+    createVirtualService_meshName,
+    createVirtualService_spec,
+    createVirtualService_virtualServiceName,
+    createVirtualServiceResponse_httpStatus,
+    createVirtualServiceResponse_virtualService,
+
+    -- ** DeleteGatewayRoute
+    deleteGatewayRoute_meshOwner,
+    deleteGatewayRoute_gatewayRouteName,
+    deleteGatewayRoute_meshName,
+    deleteGatewayRoute_virtualGatewayName,
+    deleteGatewayRouteResponse_httpStatus,
+    deleteGatewayRouteResponse_gatewayRoute,
+
+    -- ** DeleteMesh
+    deleteMesh_meshName,
+    deleteMeshResponse_httpStatus,
+    deleteMeshResponse_mesh,
+
+    -- ** DeleteRoute
+    deleteRoute_meshOwner,
+    deleteRoute_meshName,
+    deleteRoute_routeName,
+    deleteRoute_virtualRouterName,
+    deleteRouteResponse_httpStatus,
+    deleteRouteResponse_route,
+
+    -- ** DeleteVirtualGateway
+    deleteVirtualGateway_meshOwner,
+    deleteVirtualGateway_meshName,
+    deleteVirtualGateway_virtualGatewayName,
+    deleteVirtualGatewayResponse_httpStatus,
+    deleteVirtualGatewayResponse_virtualGateway,
+
+    -- ** DeleteVirtualNode
+    deleteVirtualNode_meshOwner,
+    deleteVirtualNode_meshName,
+    deleteVirtualNode_virtualNodeName,
+    deleteVirtualNodeResponse_httpStatus,
+    deleteVirtualNodeResponse_virtualNode,
+
+    -- ** DeleteVirtualRouter
+    deleteVirtualRouter_meshOwner,
+    deleteVirtualRouter_meshName,
+    deleteVirtualRouter_virtualRouterName,
+    deleteVirtualRouterResponse_httpStatus,
+    deleteVirtualRouterResponse_virtualRouter,
+
+    -- ** DeleteVirtualService
+    deleteVirtualService_meshOwner,
+    deleteVirtualService_meshName,
+    deleteVirtualService_virtualServiceName,
+    deleteVirtualServiceResponse_httpStatus,
+    deleteVirtualServiceResponse_virtualService,
+
+    -- ** DescribeGatewayRoute
+    describeGatewayRoute_meshOwner,
+    describeGatewayRoute_gatewayRouteName,
+    describeGatewayRoute_meshName,
+    describeGatewayRoute_virtualGatewayName,
+    describeGatewayRouteResponse_httpStatus,
+    describeGatewayRouteResponse_gatewayRoute,
+
+    -- ** DescribeMesh
+    describeMesh_meshOwner,
+    describeMesh_meshName,
+    describeMeshResponse_httpStatus,
+    describeMeshResponse_mesh,
+
+    -- ** DescribeRoute
+    describeRoute_meshOwner,
+    describeRoute_meshName,
+    describeRoute_routeName,
+    describeRoute_virtualRouterName,
+    describeRouteResponse_httpStatus,
+    describeRouteResponse_route,
+
+    -- ** DescribeVirtualGateway
+    describeVirtualGateway_meshOwner,
+    describeVirtualGateway_meshName,
+    describeVirtualGateway_virtualGatewayName,
+    describeVirtualGatewayResponse_httpStatus,
+    describeVirtualGatewayResponse_virtualGateway,
+
+    -- ** DescribeVirtualNode
+    describeVirtualNode_meshOwner,
+    describeVirtualNode_meshName,
+    describeVirtualNode_virtualNodeName,
+    describeVirtualNodeResponse_httpStatus,
+    describeVirtualNodeResponse_virtualNode,
+
+    -- ** DescribeVirtualRouter
+    describeVirtualRouter_meshOwner,
+    describeVirtualRouter_meshName,
+    describeVirtualRouter_virtualRouterName,
+    describeVirtualRouterResponse_httpStatus,
+    describeVirtualRouterResponse_virtualRouter,
+
+    -- ** DescribeVirtualService
+    describeVirtualService_meshOwner,
+    describeVirtualService_meshName,
+    describeVirtualService_virtualServiceName,
+    describeVirtualServiceResponse_httpStatus,
+    describeVirtualServiceResponse_virtualService,
+
+    -- ** ListGatewayRoutes
+    listGatewayRoutes_limit,
+    listGatewayRoutes_meshOwner,
+    listGatewayRoutes_nextToken,
+    listGatewayRoutes_meshName,
+    listGatewayRoutes_virtualGatewayName,
+    listGatewayRoutesResponse_nextToken,
+    listGatewayRoutesResponse_httpStatus,
+    listGatewayRoutesResponse_gatewayRoutes,
+
+    -- ** ListMeshes
+    listMeshes_limit,
+    listMeshes_nextToken,
+    listMeshesResponse_nextToken,
+    listMeshesResponse_httpStatus,
+    listMeshesResponse_meshes,
+
+    -- ** ListRoutes
+    listRoutes_limit,
+    listRoutes_meshOwner,
+    listRoutes_nextToken,
+    listRoutes_meshName,
+    listRoutes_virtualRouterName,
+    listRoutesResponse_nextToken,
+    listRoutesResponse_httpStatus,
+    listRoutesResponse_routes,
+
+    -- ** ListTagsForResource
+    listTagsForResource_limit,
+    listTagsForResource_nextToken,
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_nextToken,
+    listTagsForResourceResponse_httpStatus,
+    listTagsForResourceResponse_tags,
+
+    -- ** ListVirtualGateways
+    listVirtualGateways_limit,
+    listVirtualGateways_meshOwner,
+    listVirtualGateways_nextToken,
+    listVirtualGateways_meshName,
+    listVirtualGatewaysResponse_nextToken,
+    listVirtualGatewaysResponse_httpStatus,
+    listVirtualGatewaysResponse_virtualGateways,
+
+    -- ** ListVirtualNodes
+    listVirtualNodes_limit,
+    listVirtualNodes_meshOwner,
+    listVirtualNodes_nextToken,
+    listVirtualNodes_meshName,
+    listVirtualNodesResponse_nextToken,
+    listVirtualNodesResponse_httpStatus,
+    listVirtualNodesResponse_virtualNodes,
+
+    -- ** ListVirtualRouters
+    listVirtualRouters_limit,
+    listVirtualRouters_meshOwner,
+    listVirtualRouters_nextToken,
+    listVirtualRouters_meshName,
+    listVirtualRoutersResponse_nextToken,
+    listVirtualRoutersResponse_httpStatus,
+    listVirtualRoutersResponse_virtualRouters,
+
+    -- ** ListVirtualServices
+    listVirtualServices_limit,
+    listVirtualServices_meshOwner,
+    listVirtualServices_nextToken,
+    listVirtualServices_meshName,
+    listVirtualServicesResponse_nextToken,
+    listVirtualServicesResponse_httpStatus,
+    listVirtualServicesResponse_virtualServices,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateGatewayRoute
+    updateGatewayRoute_clientToken,
+    updateGatewayRoute_meshOwner,
+    updateGatewayRoute_gatewayRouteName,
+    updateGatewayRoute_meshName,
+    updateGatewayRoute_spec,
+    updateGatewayRoute_virtualGatewayName,
+    updateGatewayRouteResponse_httpStatus,
+    updateGatewayRouteResponse_gatewayRoute,
+
+    -- ** UpdateMesh
+    updateMesh_clientToken,
+    updateMesh_spec,
+    updateMesh_meshName,
+    updateMeshResponse_httpStatus,
+    updateMeshResponse_mesh,
+
+    -- ** UpdateRoute
+    updateRoute_clientToken,
+    updateRoute_meshOwner,
+    updateRoute_meshName,
+    updateRoute_routeName,
+    updateRoute_spec,
+    updateRoute_virtualRouterName,
+    updateRouteResponse_httpStatus,
+    updateRouteResponse_route,
+
+    -- ** UpdateVirtualGateway
+    updateVirtualGateway_clientToken,
+    updateVirtualGateway_meshOwner,
+    updateVirtualGateway_meshName,
+    updateVirtualGateway_spec,
+    updateVirtualGateway_virtualGatewayName,
+    updateVirtualGatewayResponse_httpStatus,
+    updateVirtualGatewayResponse_virtualGateway,
+
+    -- ** UpdateVirtualNode
+    updateVirtualNode_clientToken,
+    updateVirtualNode_meshOwner,
+    updateVirtualNode_meshName,
+    updateVirtualNode_spec,
+    updateVirtualNode_virtualNodeName,
+    updateVirtualNodeResponse_httpStatus,
+    updateVirtualNodeResponse_virtualNode,
+
+    -- ** UpdateVirtualRouter
+    updateVirtualRouter_clientToken,
+    updateVirtualRouter_meshOwner,
+    updateVirtualRouter_meshName,
+    updateVirtualRouter_spec,
+    updateVirtualRouter_virtualRouterName,
+    updateVirtualRouterResponse_httpStatus,
+    updateVirtualRouterResponse_virtualRouter,
+
+    -- ** UpdateVirtualService
+    updateVirtualService_clientToken,
+    updateVirtualService_meshOwner,
+    updateVirtualService_meshName,
+    updateVirtualService_spec,
+    updateVirtualService_virtualServiceName,
+    updateVirtualServiceResponse_httpStatus,
+    updateVirtualServiceResponse_virtualService,
+
+    -- * Types
+
+    -- ** AccessLog
+    accessLog_file,
+
+    -- ** AwsCloudMapInstanceAttribute
+    awsCloudMapInstanceAttribute_key,
+    awsCloudMapInstanceAttribute_value,
+
+    -- ** AwsCloudMapServiceDiscovery
+    awsCloudMapServiceDiscovery_attributes,
+    awsCloudMapServiceDiscovery_ipPreference,
+    awsCloudMapServiceDiscovery_namespaceName,
+    awsCloudMapServiceDiscovery_serviceName,
+
+    -- ** Backend
+    backend_virtualService,
+
+    -- ** BackendDefaults
+    backendDefaults_clientPolicy,
+
+    -- ** ClientPolicy
+    clientPolicy_tls,
+
+    -- ** ClientPolicyTls
+    clientPolicyTls_certificate,
+    clientPolicyTls_enforce,
+    clientPolicyTls_ports,
+    clientPolicyTls_validation,
+
+    -- ** ClientTlsCertificate
+    clientTlsCertificate_file,
+    clientTlsCertificate_sds,
+
+    -- ** DnsServiceDiscovery
+    dnsServiceDiscovery_ipPreference,
+    dnsServiceDiscovery_responseType,
+    dnsServiceDiscovery_hostname,
+
+    -- ** Duration
+    duration_unit,
+    duration_value,
+
+    -- ** EgressFilter
+    egressFilter_type,
+
+    -- ** FileAccessLog
+    fileAccessLog_format,
+    fileAccessLog_path,
+
+    -- ** GatewayRouteData
+    gatewayRouteData_gatewayRouteName,
+    gatewayRouteData_meshName,
+    gatewayRouteData_metadata,
+    gatewayRouteData_spec,
+    gatewayRouteData_status,
+    gatewayRouteData_virtualGatewayName,
+
+    -- ** GatewayRouteHostnameMatch
+    gatewayRouteHostnameMatch_exact,
+    gatewayRouteHostnameMatch_suffix,
+
+    -- ** GatewayRouteHostnameRewrite
+    gatewayRouteHostnameRewrite_defaultTargetHostname,
+
+    -- ** GatewayRouteRef
+    gatewayRouteRef_arn,
+    gatewayRouteRef_createdAt,
+    gatewayRouteRef_gatewayRouteName,
+    gatewayRouteRef_lastUpdatedAt,
+    gatewayRouteRef_meshName,
+    gatewayRouteRef_meshOwner,
+    gatewayRouteRef_resourceOwner,
+    gatewayRouteRef_version,
+    gatewayRouteRef_virtualGatewayName,
+
+    -- ** GatewayRouteSpec
+    gatewayRouteSpec_grpcRoute,
+    gatewayRouteSpec_http2Route,
+    gatewayRouteSpec_httpRoute,
+    gatewayRouteSpec_priority,
+
+    -- ** GatewayRouteStatus
+    gatewayRouteStatus_status,
+
+    -- ** GatewayRouteTarget
+    gatewayRouteTarget_port,
+    gatewayRouteTarget_virtualService,
+
+    -- ** GatewayRouteVirtualService
+    gatewayRouteVirtualService_virtualServiceName,
+
+    -- ** GrpcGatewayRoute
+    grpcGatewayRoute_action,
+    grpcGatewayRoute_match,
+
+    -- ** GrpcGatewayRouteAction
+    grpcGatewayRouteAction_rewrite,
+    grpcGatewayRouteAction_target,
+
+    -- ** GrpcGatewayRouteMatch
+    grpcGatewayRouteMatch_hostname,
+    grpcGatewayRouteMatch_metadata,
+    grpcGatewayRouteMatch_port,
+    grpcGatewayRouteMatch_serviceName,
+
+    -- ** GrpcGatewayRouteMetadata
+    grpcGatewayRouteMetadata_invert,
+    grpcGatewayRouteMetadata_match,
+    grpcGatewayRouteMetadata_name,
+
+    -- ** GrpcGatewayRouteRewrite
+    grpcGatewayRouteRewrite_hostname,
+
+    -- ** GrpcMetadataMatchMethod
+    grpcMetadataMatchMethod_exact,
+    grpcMetadataMatchMethod_prefix,
+    grpcMetadataMatchMethod_range,
+    grpcMetadataMatchMethod_regex,
+    grpcMetadataMatchMethod_suffix,
+
+    -- ** GrpcRetryPolicy
+    grpcRetryPolicy_grpcRetryEvents,
+    grpcRetryPolicy_httpRetryEvents,
+    grpcRetryPolicy_tcpRetryEvents,
+    grpcRetryPolicy_maxRetries,
+    grpcRetryPolicy_perRetryTimeout,
+
+    -- ** GrpcRoute
+    grpcRoute_retryPolicy,
+    grpcRoute_timeout,
+    grpcRoute_action,
+    grpcRoute_match,
+
+    -- ** GrpcRouteAction
+    grpcRouteAction_weightedTargets,
+
+    -- ** GrpcRouteMatch
+    grpcRouteMatch_metadata,
+    grpcRouteMatch_methodName,
+    grpcRouteMatch_port,
+    grpcRouteMatch_serviceName,
+
+    -- ** GrpcRouteMetadata
+    grpcRouteMetadata_invert,
+    grpcRouteMetadata_match,
+    grpcRouteMetadata_name,
+
+    -- ** GrpcRouteMetadataMatchMethod
+    grpcRouteMetadataMatchMethod_exact,
+    grpcRouteMetadataMatchMethod_prefix,
+    grpcRouteMetadataMatchMethod_range,
+    grpcRouteMetadataMatchMethod_regex,
+    grpcRouteMetadataMatchMethod_suffix,
+
+    -- ** GrpcTimeout
+    grpcTimeout_idle,
+    grpcTimeout_perRequest,
+
+    -- ** HeaderMatchMethod
+    headerMatchMethod_exact,
+    headerMatchMethod_prefix,
+    headerMatchMethod_range,
+    headerMatchMethod_regex,
+    headerMatchMethod_suffix,
+
+    -- ** HealthCheckPolicy
+    healthCheckPolicy_path,
+    healthCheckPolicy_port,
+    healthCheckPolicy_healthyThreshold,
+    healthCheckPolicy_intervalMillis,
+    healthCheckPolicy_protocol,
+    healthCheckPolicy_timeoutMillis,
+    healthCheckPolicy_unhealthyThreshold,
+
+    -- ** HttpGatewayRoute
+    httpGatewayRoute_action,
+    httpGatewayRoute_match,
+
+    -- ** HttpGatewayRouteAction
+    httpGatewayRouteAction_rewrite,
+    httpGatewayRouteAction_target,
+
+    -- ** HttpGatewayRouteHeader
+    httpGatewayRouteHeader_invert,
+    httpGatewayRouteHeader_match,
+    httpGatewayRouteHeader_name,
+
+    -- ** HttpGatewayRouteMatch
+    httpGatewayRouteMatch_headers,
+    httpGatewayRouteMatch_hostname,
+    httpGatewayRouteMatch_method,
+    httpGatewayRouteMatch_path,
+    httpGatewayRouteMatch_port,
+    httpGatewayRouteMatch_prefix,
+    httpGatewayRouteMatch_queryParameters,
+
+    -- ** HttpGatewayRoutePathRewrite
+    httpGatewayRoutePathRewrite_exact,
+
+    -- ** HttpGatewayRoutePrefixRewrite
+    httpGatewayRoutePrefixRewrite_defaultPrefix,
+    httpGatewayRoutePrefixRewrite_value,
+
+    -- ** HttpGatewayRouteRewrite
+    httpGatewayRouteRewrite_hostname,
+    httpGatewayRouteRewrite_path,
+    httpGatewayRouteRewrite_prefix,
+
+    -- ** HttpPathMatch
+    httpPathMatch_exact,
+    httpPathMatch_regex,
+
+    -- ** HttpQueryParameter
+    httpQueryParameter_match,
+    httpQueryParameter_name,
+
+    -- ** HttpRetryPolicy
+    httpRetryPolicy_httpRetryEvents,
+    httpRetryPolicy_tcpRetryEvents,
+    httpRetryPolicy_maxRetries,
+    httpRetryPolicy_perRetryTimeout,
+
+    -- ** HttpRoute
+    httpRoute_retryPolicy,
+    httpRoute_timeout,
+    httpRoute_action,
+    httpRoute_match,
+
+    -- ** HttpRouteAction
+    httpRouteAction_weightedTargets,
+
+    -- ** HttpRouteHeader
+    httpRouteHeader_invert,
+    httpRouteHeader_match,
+    httpRouteHeader_name,
+
+    -- ** HttpRouteMatch
+    httpRouteMatch_headers,
+    httpRouteMatch_method,
+    httpRouteMatch_path,
+    httpRouteMatch_port,
+    httpRouteMatch_prefix,
+    httpRouteMatch_queryParameters,
+    httpRouteMatch_scheme,
+
+    -- ** HttpTimeout
+    httpTimeout_idle,
+    httpTimeout_perRequest,
+
+    -- ** JsonFormatRef
+    jsonFormatRef_key,
+    jsonFormatRef_value,
+
+    -- ** Listener
+    listener_connectionPool,
+    listener_healthCheck,
+    listener_outlierDetection,
+    listener_timeout,
+    listener_tls,
+    listener_portMapping,
+
+    -- ** ListenerTimeout
+    listenerTimeout_grpc,
+    listenerTimeout_http,
+    listenerTimeout_http2,
+    listenerTimeout_tcp,
+
+    -- ** ListenerTls
+    listenerTls_validation,
+    listenerTls_certificate,
+    listenerTls_mode,
+
+    -- ** ListenerTlsAcmCertificate
+    listenerTlsAcmCertificate_certificateArn,
+
+    -- ** ListenerTlsCertificate
+    listenerTlsCertificate_acm,
+    listenerTlsCertificate_file,
+    listenerTlsCertificate_sds,
+
+    -- ** ListenerTlsFileCertificate
+    listenerTlsFileCertificate_certificateChain,
+    listenerTlsFileCertificate_privateKey,
+
+    -- ** ListenerTlsSdsCertificate
+    listenerTlsSdsCertificate_secretName,
+
+    -- ** ListenerTlsValidationContext
+    listenerTlsValidationContext_subjectAlternativeNames,
+    listenerTlsValidationContext_trust,
+
+    -- ** ListenerTlsValidationContextTrust
+    listenerTlsValidationContextTrust_file,
+    listenerTlsValidationContextTrust_sds,
+
+    -- ** Logging
+    logging_accessLog,
+
+    -- ** LoggingFormat
+    loggingFormat_json,
+    loggingFormat_text,
+
+    -- ** MatchRange
+    matchRange_end,
+    matchRange_start,
+
+    -- ** MeshData
+    meshData_meshName,
+    meshData_metadata,
+    meshData_spec,
+    meshData_status,
+
+    -- ** MeshRef
+    meshRef_arn,
+    meshRef_createdAt,
+    meshRef_lastUpdatedAt,
+    meshRef_meshName,
+    meshRef_meshOwner,
+    meshRef_resourceOwner,
+    meshRef_version,
+
+    -- ** MeshServiceDiscovery
+    meshServiceDiscovery_ipPreference,
+
+    -- ** MeshSpec
+    meshSpec_egressFilter,
+    meshSpec_serviceDiscovery,
+
+    -- ** MeshStatus
+    meshStatus_status,
+
+    -- ** OutlierDetection
+    outlierDetection_baseEjectionDuration,
+    outlierDetection_interval,
+    outlierDetection_maxEjectionPercent,
+    outlierDetection_maxServerErrors,
+
+    -- ** PortMapping
+    portMapping_port,
+    portMapping_protocol,
+
+    -- ** QueryParameterMatch
+    queryParameterMatch_exact,
+
+    -- ** ResourceMetadata
+    resourceMetadata_arn,
+    resourceMetadata_createdAt,
+    resourceMetadata_lastUpdatedAt,
+    resourceMetadata_meshOwner,
+    resourceMetadata_resourceOwner,
+    resourceMetadata_uid,
+    resourceMetadata_version,
+
+    -- ** RouteData
+    routeData_meshName,
+    routeData_metadata,
+    routeData_routeName,
+    routeData_spec,
+    routeData_status,
+    routeData_virtualRouterName,
+
+    -- ** RouteRef
+    routeRef_arn,
+    routeRef_createdAt,
+    routeRef_lastUpdatedAt,
+    routeRef_meshName,
+    routeRef_meshOwner,
+    routeRef_resourceOwner,
+    routeRef_routeName,
+    routeRef_version,
+    routeRef_virtualRouterName,
+
+    -- ** RouteSpec
+    routeSpec_grpcRoute,
+    routeSpec_http2Route,
+    routeSpec_httpRoute,
+    routeSpec_priority,
+    routeSpec_tcpRoute,
+
+    -- ** RouteStatus
+    routeStatus_status,
+
+    -- ** ServiceDiscovery
+    serviceDiscovery_awsCloudMap,
+    serviceDiscovery_dns,
+
+    -- ** SubjectAlternativeNameMatchers
+    subjectAlternativeNameMatchers_exact,
+
+    -- ** SubjectAlternativeNames
+    subjectAlternativeNames_match,
+
+    -- ** TagRef
+    tagRef_key,
+    tagRef_value,
+
+    -- ** TcpRoute
+    tcpRoute_match,
+    tcpRoute_timeout,
+    tcpRoute_action,
+
+    -- ** TcpRouteAction
+    tcpRouteAction_weightedTargets,
+
+    -- ** TcpRouteMatch
+    tcpRouteMatch_port,
+
+    -- ** TcpTimeout
+    tcpTimeout_idle,
+
+    -- ** TlsValidationContext
+    tlsValidationContext_subjectAlternativeNames,
+    tlsValidationContext_trust,
+
+    -- ** TlsValidationContextAcmTrust
+    tlsValidationContextAcmTrust_certificateAuthorityArns,
+
+    -- ** TlsValidationContextFileTrust
+    tlsValidationContextFileTrust_certificateChain,
+
+    -- ** TlsValidationContextSdsTrust
+    tlsValidationContextSdsTrust_secretName,
+
+    -- ** TlsValidationContextTrust
+    tlsValidationContextTrust_acm,
+    tlsValidationContextTrust_file,
+    tlsValidationContextTrust_sds,
+
+    -- ** VirtualGatewayAccessLog
+    virtualGatewayAccessLog_file,
+
+    -- ** VirtualGatewayBackendDefaults
+    virtualGatewayBackendDefaults_clientPolicy,
+
+    -- ** VirtualGatewayClientPolicy
+    virtualGatewayClientPolicy_tls,
+
+    -- ** VirtualGatewayClientPolicyTls
+    virtualGatewayClientPolicyTls_certificate,
+    virtualGatewayClientPolicyTls_enforce,
+    virtualGatewayClientPolicyTls_ports,
+    virtualGatewayClientPolicyTls_validation,
+
+    -- ** VirtualGatewayClientTlsCertificate
+    virtualGatewayClientTlsCertificate_file,
+    virtualGatewayClientTlsCertificate_sds,
+
+    -- ** VirtualGatewayConnectionPool
+    virtualGatewayConnectionPool_grpc,
+    virtualGatewayConnectionPool_http,
+    virtualGatewayConnectionPool_http2,
+
+    -- ** VirtualGatewayData
+    virtualGatewayData_meshName,
+    virtualGatewayData_metadata,
+    virtualGatewayData_spec,
+    virtualGatewayData_status,
+    virtualGatewayData_virtualGatewayName,
+
+    -- ** VirtualGatewayFileAccessLog
+    virtualGatewayFileAccessLog_format,
+    virtualGatewayFileAccessLog_path,
+
+    -- ** VirtualGatewayGrpcConnectionPool
+    virtualGatewayGrpcConnectionPool_maxRequests,
+
+    -- ** VirtualGatewayHealthCheckPolicy
+    virtualGatewayHealthCheckPolicy_path,
+    virtualGatewayHealthCheckPolicy_port,
+    virtualGatewayHealthCheckPolicy_healthyThreshold,
+    virtualGatewayHealthCheckPolicy_intervalMillis,
+    virtualGatewayHealthCheckPolicy_protocol,
+    virtualGatewayHealthCheckPolicy_timeoutMillis,
+    virtualGatewayHealthCheckPolicy_unhealthyThreshold,
+
+    -- ** VirtualGatewayHttp2ConnectionPool
+    virtualGatewayHttp2ConnectionPool_maxRequests,
+
+    -- ** VirtualGatewayHttpConnectionPool
+    virtualGatewayHttpConnectionPool_maxPendingRequests,
+    virtualGatewayHttpConnectionPool_maxConnections,
+
+    -- ** VirtualGatewayListener
+    virtualGatewayListener_connectionPool,
+    virtualGatewayListener_healthCheck,
+    virtualGatewayListener_tls,
+    virtualGatewayListener_portMapping,
+
+    -- ** VirtualGatewayListenerTls
+    virtualGatewayListenerTls_validation,
+    virtualGatewayListenerTls_certificate,
+    virtualGatewayListenerTls_mode,
+
+    -- ** VirtualGatewayListenerTlsAcmCertificate
+    virtualGatewayListenerTlsAcmCertificate_certificateArn,
+
+    -- ** VirtualGatewayListenerTlsCertificate
+    virtualGatewayListenerTlsCertificate_acm,
+    virtualGatewayListenerTlsCertificate_file,
+    virtualGatewayListenerTlsCertificate_sds,
+
+    -- ** VirtualGatewayListenerTlsFileCertificate
+    virtualGatewayListenerTlsFileCertificate_certificateChain,
+    virtualGatewayListenerTlsFileCertificate_privateKey,
+
+    -- ** VirtualGatewayListenerTlsSdsCertificate
+    virtualGatewayListenerTlsSdsCertificate_secretName,
+
+    -- ** VirtualGatewayListenerTlsValidationContext
+    virtualGatewayListenerTlsValidationContext_subjectAlternativeNames,
+    virtualGatewayListenerTlsValidationContext_trust,
+
+    -- ** VirtualGatewayListenerTlsValidationContextTrust
+    virtualGatewayListenerTlsValidationContextTrust_file,
+    virtualGatewayListenerTlsValidationContextTrust_sds,
+
+    -- ** VirtualGatewayLogging
+    virtualGatewayLogging_accessLog,
+
+    -- ** VirtualGatewayPortMapping
+    virtualGatewayPortMapping_port,
+    virtualGatewayPortMapping_protocol,
+
+    -- ** VirtualGatewayRef
+    virtualGatewayRef_arn,
+    virtualGatewayRef_createdAt,
+    virtualGatewayRef_lastUpdatedAt,
+    virtualGatewayRef_meshName,
+    virtualGatewayRef_meshOwner,
+    virtualGatewayRef_resourceOwner,
+    virtualGatewayRef_version,
+    virtualGatewayRef_virtualGatewayName,
+
+    -- ** VirtualGatewaySpec
+    virtualGatewaySpec_backendDefaults,
+    virtualGatewaySpec_logging,
+    virtualGatewaySpec_listeners,
+
+    -- ** VirtualGatewayStatus
+    virtualGatewayStatus_status,
+
+    -- ** VirtualGatewayTlsValidationContext
+    virtualGatewayTlsValidationContext_subjectAlternativeNames,
+    virtualGatewayTlsValidationContext_trust,
+
+    -- ** VirtualGatewayTlsValidationContextAcmTrust
+    virtualGatewayTlsValidationContextAcmTrust_certificateAuthorityArns,
+
+    -- ** VirtualGatewayTlsValidationContextFileTrust
+    virtualGatewayTlsValidationContextFileTrust_certificateChain,
+
+    -- ** VirtualGatewayTlsValidationContextSdsTrust
+    virtualGatewayTlsValidationContextSdsTrust_secretName,
+
+    -- ** VirtualGatewayTlsValidationContextTrust
+    virtualGatewayTlsValidationContextTrust_acm,
+    virtualGatewayTlsValidationContextTrust_file,
+    virtualGatewayTlsValidationContextTrust_sds,
+
+    -- ** VirtualNodeConnectionPool
+    virtualNodeConnectionPool_grpc,
+    virtualNodeConnectionPool_http,
+    virtualNodeConnectionPool_http2,
+    virtualNodeConnectionPool_tcp,
+
+    -- ** VirtualNodeData
+    virtualNodeData_meshName,
+    virtualNodeData_metadata,
+    virtualNodeData_spec,
+    virtualNodeData_status,
+    virtualNodeData_virtualNodeName,
+
+    -- ** VirtualNodeGrpcConnectionPool
+    virtualNodeGrpcConnectionPool_maxRequests,
+
+    -- ** VirtualNodeHttp2ConnectionPool
+    virtualNodeHttp2ConnectionPool_maxRequests,
+
+    -- ** VirtualNodeHttpConnectionPool
+    virtualNodeHttpConnectionPool_maxPendingRequests,
+    virtualNodeHttpConnectionPool_maxConnections,
+
+    -- ** VirtualNodeRef
+    virtualNodeRef_arn,
+    virtualNodeRef_createdAt,
+    virtualNodeRef_lastUpdatedAt,
+    virtualNodeRef_meshName,
+    virtualNodeRef_meshOwner,
+    virtualNodeRef_resourceOwner,
+    virtualNodeRef_version,
+    virtualNodeRef_virtualNodeName,
+
+    -- ** VirtualNodeServiceProvider
+    virtualNodeServiceProvider_virtualNodeName,
+
+    -- ** VirtualNodeSpec
+    virtualNodeSpec_backendDefaults,
+    virtualNodeSpec_backends,
+    virtualNodeSpec_listeners,
+    virtualNodeSpec_logging,
+    virtualNodeSpec_serviceDiscovery,
+
+    -- ** VirtualNodeStatus
+    virtualNodeStatus_status,
+
+    -- ** VirtualNodeTcpConnectionPool
+    virtualNodeTcpConnectionPool_maxConnections,
+
+    -- ** VirtualRouterData
+    virtualRouterData_meshName,
+    virtualRouterData_metadata,
+    virtualRouterData_spec,
+    virtualRouterData_status,
+    virtualRouterData_virtualRouterName,
+
+    -- ** VirtualRouterListener
+    virtualRouterListener_portMapping,
+
+    -- ** VirtualRouterRef
+    virtualRouterRef_arn,
+    virtualRouterRef_createdAt,
+    virtualRouterRef_lastUpdatedAt,
+    virtualRouterRef_meshName,
+    virtualRouterRef_meshOwner,
+    virtualRouterRef_resourceOwner,
+    virtualRouterRef_version,
+    virtualRouterRef_virtualRouterName,
+
+    -- ** VirtualRouterServiceProvider
+    virtualRouterServiceProvider_virtualRouterName,
+
+    -- ** VirtualRouterSpec
+    virtualRouterSpec_listeners,
+
+    -- ** VirtualRouterStatus
+    virtualRouterStatus_status,
+
+    -- ** VirtualServiceBackend
+    virtualServiceBackend_clientPolicy,
+    virtualServiceBackend_virtualServiceName,
+
+    -- ** VirtualServiceData
+    virtualServiceData_meshName,
+    virtualServiceData_metadata,
+    virtualServiceData_spec,
+    virtualServiceData_status,
+    virtualServiceData_virtualServiceName,
+
+    -- ** VirtualServiceProvider
+    virtualServiceProvider_virtualNode,
+    virtualServiceProvider_virtualRouter,
+
+    -- ** VirtualServiceRef
+    virtualServiceRef_arn,
+    virtualServiceRef_createdAt,
+    virtualServiceRef_lastUpdatedAt,
+    virtualServiceRef_meshName,
+    virtualServiceRef_meshOwner,
+    virtualServiceRef_resourceOwner,
+    virtualServiceRef_version,
+    virtualServiceRef_virtualServiceName,
+
+    -- ** VirtualServiceSpec
+    virtualServiceSpec_provider,
+
+    -- ** VirtualServiceStatus
+    virtualServiceStatus_status,
+
+    -- ** WeightedTarget
+    weightedTarget_port,
+    weightedTarget_virtualNode,
+    weightedTarget_weight,
+  )
+where
+
+import Amazonka.AppMesh.CreateGatewayRoute
+import Amazonka.AppMesh.CreateMesh
+import Amazonka.AppMesh.CreateRoute
+import Amazonka.AppMesh.CreateVirtualGateway
+import Amazonka.AppMesh.CreateVirtualNode
+import Amazonka.AppMesh.CreateVirtualRouter
+import Amazonka.AppMesh.CreateVirtualService
+import Amazonka.AppMesh.DeleteGatewayRoute
+import Amazonka.AppMesh.DeleteMesh
+import Amazonka.AppMesh.DeleteRoute
+import Amazonka.AppMesh.DeleteVirtualGateway
+import Amazonka.AppMesh.DeleteVirtualNode
+import Amazonka.AppMesh.DeleteVirtualRouter
+import Amazonka.AppMesh.DeleteVirtualService
+import Amazonka.AppMesh.DescribeGatewayRoute
+import Amazonka.AppMesh.DescribeMesh
+import Amazonka.AppMesh.DescribeRoute
+import Amazonka.AppMesh.DescribeVirtualGateway
+import Amazonka.AppMesh.DescribeVirtualNode
+import Amazonka.AppMesh.DescribeVirtualRouter
+import Amazonka.AppMesh.DescribeVirtualService
+import Amazonka.AppMesh.ListGatewayRoutes
+import Amazonka.AppMesh.ListMeshes
+import Amazonka.AppMesh.ListRoutes
+import Amazonka.AppMesh.ListTagsForResource
+import Amazonka.AppMesh.ListVirtualGateways
+import Amazonka.AppMesh.ListVirtualNodes
+import Amazonka.AppMesh.ListVirtualRouters
+import Amazonka.AppMesh.ListVirtualServices
+import Amazonka.AppMesh.TagResource
+import Amazonka.AppMesh.Types.AccessLog
+import Amazonka.AppMesh.Types.AwsCloudMapInstanceAttribute
+import Amazonka.AppMesh.Types.AwsCloudMapServiceDiscovery
+import Amazonka.AppMesh.Types.Backend
+import Amazonka.AppMesh.Types.BackendDefaults
+import Amazonka.AppMesh.Types.ClientPolicy
+import Amazonka.AppMesh.Types.ClientPolicyTls
+import Amazonka.AppMesh.Types.ClientTlsCertificate
+import Amazonka.AppMesh.Types.DnsServiceDiscovery
+import Amazonka.AppMesh.Types.Duration
+import Amazonka.AppMesh.Types.EgressFilter
+import Amazonka.AppMesh.Types.FileAccessLog
+import Amazonka.AppMesh.Types.GatewayRouteData
+import Amazonka.AppMesh.Types.GatewayRouteHostnameMatch
+import Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite
+import Amazonka.AppMesh.Types.GatewayRouteRef
+import Amazonka.AppMesh.Types.GatewayRouteSpec
+import Amazonka.AppMesh.Types.GatewayRouteStatus
+import Amazonka.AppMesh.Types.GatewayRouteTarget
+import Amazonka.AppMesh.Types.GatewayRouteVirtualService
+import Amazonka.AppMesh.Types.GrpcGatewayRoute
+import Amazonka.AppMesh.Types.GrpcGatewayRouteAction
+import Amazonka.AppMesh.Types.GrpcGatewayRouteMatch
+import Amazonka.AppMesh.Types.GrpcGatewayRouteMetadata
+import Amazonka.AppMesh.Types.GrpcGatewayRouteRewrite
+import Amazonka.AppMesh.Types.GrpcMetadataMatchMethod
+import Amazonka.AppMesh.Types.GrpcRetryPolicy
+import Amazonka.AppMesh.Types.GrpcRoute
+import Amazonka.AppMesh.Types.GrpcRouteAction
+import Amazonka.AppMesh.Types.GrpcRouteMatch
+import Amazonka.AppMesh.Types.GrpcRouteMetadata
+import Amazonka.AppMesh.Types.GrpcRouteMetadataMatchMethod
+import Amazonka.AppMesh.Types.GrpcTimeout
+import Amazonka.AppMesh.Types.HeaderMatchMethod
+import Amazonka.AppMesh.Types.HealthCheckPolicy
+import Amazonka.AppMesh.Types.HttpGatewayRoute
+import Amazonka.AppMesh.Types.HttpGatewayRouteAction
+import Amazonka.AppMesh.Types.HttpGatewayRouteHeader
+import Amazonka.AppMesh.Types.HttpGatewayRouteMatch
+import Amazonka.AppMesh.Types.HttpGatewayRoutePathRewrite
+import Amazonka.AppMesh.Types.HttpGatewayRoutePrefixRewrite
+import Amazonka.AppMesh.Types.HttpGatewayRouteRewrite
+import Amazonka.AppMesh.Types.HttpPathMatch
+import Amazonka.AppMesh.Types.HttpQueryParameter
+import Amazonka.AppMesh.Types.HttpRetryPolicy
+import Amazonka.AppMesh.Types.HttpRoute
+import Amazonka.AppMesh.Types.HttpRouteAction
+import Amazonka.AppMesh.Types.HttpRouteHeader
+import Amazonka.AppMesh.Types.HttpRouteMatch
+import Amazonka.AppMesh.Types.HttpTimeout
+import Amazonka.AppMesh.Types.JsonFormatRef
+import Amazonka.AppMesh.Types.Listener
+import Amazonka.AppMesh.Types.ListenerTimeout
+import Amazonka.AppMesh.Types.ListenerTls
+import Amazonka.AppMesh.Types.ListenerTlsAcmCertificate
+import Amazonka.AppMesh.Types.ListenerTlsCertificate
+import Amazonka.AppMesh.Types.ListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.ListenerTlsSdsCertificate
+import Amazonka.AppMesh.Types.ListenerTlsValidationContext
+import Amazonka.AppMesh.Types.ListenerTlsValidationContextTrust
+import Amazonka.AppMesh.Types.Logging
+import Amazonka.AppMesh.Types.LoggingFormat
+import Amazonka.AppMesh.Types.MatchRange
+import Amazonka.AppMesh.Types.MeshData
+import Amazonka.AppMesh.Types.MeshRef
+import Amazonka.AppMesh.Types.MeshServiceDiscovery
+import Amazonka.AppMesh.Types.MeshSpec
+import Amazonka.AppMesh.Types.MeshStatus
+import Amazonka.AppMesh.Types.OutlierDetection
+import Amazonka.AppMesh.Types.PortMapping
+import Amazonka.AppMesh.Types.QueryParameterMatch
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.RouteData
+import Amazonka.AppMesh.Types.RouteRef
+import Amazonka.AppMesh.Types.RouteSpec
+import Amazonka.AppMesh.Types.RouteStatus
+import Amazonka.AppMesh.Types.ServiceDiscovery
+import Amazonka.AppMesh.Types.SubjectAlternativeNameMatchers
+import Amazonka.AppMesh.Types.SubjectAlternativeNames
+import Amazonka.AppMesh.Types.TagRef
+import Amazonka.AppMesh.Types.TcpRoute
+import Amazonka.AppMesh.Types.TcpRouteAction
+import Amazonka.AppMesh.Types.TcpRouteMatch
+import Amazonka.AppMesh.Types.TcpTimeout
+import Amazonka.AppMesh.Types.TlsValidationContext
+import Amazonka.AppMesh.Types.TlsValidationContextAcmTrust
+import Amazonka.AppMesh.Types.TlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.TlsValidationContextSdsTrust
+import Amazonka.AppMesh.Types.TlsValidationContextTrust
+import Amazonka.AppMesh.Types.VirtualGatewayAccessLog
+import Amazonka.AppMesh.Types.VirtualGatewayBackendDefaults
+import Amazonka.AppMesh.Types.VirtualGatewayClientPolicy
+import Amazonka.AppMesh.Types.VirtualGatewayClientPolicyTls
+import Amazonka.AppMesh.Types.VirtualGatewayClientTlsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayData
+import Amazonka.AppMesh.Types.VirtualGatewayFileAccessLog
+import Amazonka.AppMesh.Types.VirtualGatewayGrpcConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHealthCheckPolicy
+import Amazonka.AppMesh.Types.VirtualGatewayHttp2ConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHttpConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayListener
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTls
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsAcmCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContext
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContextTrust
+import Amazonka.AppMesh.Types.VirtualGatewayLogging
+import Amazonka.AppMesh.Types.VirtualGatewayPortMapping
+import Amazonka.AppMesh.Types.VirtualGatewayRef
+import Amazonka.AppMesh.Types.VirtualGatewaySpec
+import Amazonka.AppMesh.Types.VirtualGatewayStatus
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContext
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextAcmTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextTrust
+import Amazonka.AppMesh.Types.VirtualNodeConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeData
+import Amazonka.AppMesh.Types.VirtualNodeGrpcConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeHttp2ConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeHttpConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeRef
+import Amazonka.AppMesh.Types.VirtualNodeServiceProvider
+import Amazonka.AppMesh.Types.VirtualNodeSpec
+import Amazonka.AppMesh.Types.VirtualNodeStatus
+import Amazonka.AppMesh.Types.VirtualNodeTcpConnectionPool
+import Amazonka.AppMesh.Types.VirtualRouterData
+import Amazonka.AppMesh.Types.VirtualRouterListener
+import Amazonka.AppMesh.Types.VirtualRouterRef
+import Amazonka.AppMesh.Types.VirtualRouterServiceProvider
+import Amazonka.AppMesh.Types.VirtualRouterSpec
+import Amazonka.AppMesh.Types.VirtualRouterStatus
+import Amazonka.AppMesh.Types.VirtualServiceBackend
+import Amazonka.AppMesh.Types.VirtualServiceData
+import Amazonka.AppMesh.Types.VirtualServiceProvider
+import Amazonka.AppMesh.Types.VirtualServiceRef
+import Amazonka.AppMesh.Types.VirtualServiceSpec
+import Amazonka.AppMesh.Types.VirtualServiceStatus
+import Amazonka.AppMesh.Types.WeightedTarget
+import Amazonka.AppMesh.UntagResource
+import Amazonka.AppMesh.UpdateGatewayRoute
+import Amazonka.AppMesh.UpdateMesh
+import Amazonka.AppMesh.UpdateRoute
+import Amazonka.AppMesh.UpdateVirtualGateway
+import Amazonka.AppMesh.UpdateVirtualNode
+import Amazonka.AppMesh.UpdateVirtualRouter
+import Amazonka.AppMesh.UpdateVirtualService
diff --git a/gen/Amazonka/AppMesh/ListGatewayRoutes.hs b/gen/Amazonka/AppMesh/ListGatewayRoutes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListGatewayRoutes.hs
@@ -0,0 +1,308 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListGatewayRoutes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing gateway routes that are associated to a
+-- virtual gateway.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListGatewayRoutes
+  ( -- * Creating a Request
+    ListGatewayRoutes (..),
+    newListGatewayRoutes,
+
+    -- * Request Lenses
+    listGatewayRoutes_limit,
+    listGatewayRoutes_meshOwner,
+    listGatewayRoutes_nextToken,
+    listGatewayRoutes_meshName,
+    listGatewayRoutes_virtualGatewayName,
+
+    -- * Destructuring the Response
+    ListGatewayRoutesResponse (..),
+    newListGatewayRoutesResponse,
+
+    -- * Response Lenses
+    listGatewayRoutesResponse_nextToken,
+    listGatewayRoutesResponse_httpStatus,
+    listGatewayRoutesResponse_gatewayRoutes,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListGatewayRoutes' smart constructor.
+data ListGatewayRoutes = ListGatewayRoutes'
+  { -- | The maximum number of results returned by @ListGatewayRoutes@ in
+    -- paginated output. When you use this parameter, @ListGatewayRoutes@
+    -- returns only @limit@ results in a single page along with a @nextToken@
+    -- response element. You can see the remaining results of the initial
+    -- request by sending another @ListGatewayRoutes@ request with the returned
+    -- @nextToken@ value. This value can be between 1 and 100. If you don\'t
+    -- use this parameter, @ListGatewayRoutes@ returns up to 100 results and a
+    -- @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListGatewayRoutes@ request where @limit@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to list gateway routes in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual gateway to list gateway routes in.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGatewayRoutes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listGatewayRoutes_limit' - The maximum number of results returned by @ListGatewayRoutes@ in
+-- paginated output. When you use this parameter, @ListGatewayRoutes@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListGatewayRoutes@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 100. If you don\'t
+-- use this parameter, @ListGatewayRoutes@ returns up to 100 results and a
+-- @nextToken@ value if applicable.
+--
+-- 'meshOwner', 'listGatewayRoutes_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'nextToken', 'listGatewayRoutes_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListGatewayRoutes@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- 'meshName', 'listGatewayRoutes_meshName' - The name of the service mesh to list gateway routes in.
+--
+-- 'virtualGatewayName', 'listGatewayRoutes_virtualGatewayName' - The name of the virtual gateway to list gateway routes in.
+newListGatewayRoutes ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  ListGatewayRoutes
+newListGatewayRoutes pMeshName_ pVirtualGatewayName_ =
+  ListGatewayRoutes'
+    { limit = Prelude.Nothing,
+      meshOwner = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      meshName = pMeshName_,
+      virtualGatewayName = pVirtualGatewayName_
+    }
+
+-- | The maximum number of results returned by @ListGatewayRoutes@ in
+-- paginated output. When you use this parameter, @ListGatewayRoutes@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListGatewayRoutes@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 100. If you don\'t
+-- use this parameter, @ListGatewayRoutes@ returns up to 100 results and a
+-- @nextToken@ value if applicable.
+listGatewayRoutes_limit :: Lens.Lens' ListGatewayRoutes (Prelude.Maybe Prelude.Natural)
+listGatewayRoutes_limit = Lens.lens (\ListGatewayRoutes' {limit} -> limit) (\s@ListGatewayRoutes' {} a -> s {limit = a} :: ListGatewayRoutes)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+listGatewayRoutes_meshOwner :: Lens.Lens' ListGatewayRoutes (Prelude.Maybe Prelude.Text)
+listGatewayRoutes_meshOwner = Lens.lens (\ListGatewayRoutes' {meshOwner} -> meshOwner) (\s@ListGatewayRoutes' {} a -> s {meshOwner = a} :: ListGatewayRoutes)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListGatewayRoutes@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+listGatewayRoutes_nextToken :: Lens.Lens' ListGatewayRoutes (Prelude.Maybe Prelude.Text)
+listGatewayRoutes_nextToken = Lens.lens (\ListGatewayRoutes' {nextToken} -> nextToken) (\s@ListGatewayRoutes' {} a -> s {nextToken = a} :: ListGatewayRoutes)
+
+-- | The name of the service mesh to list gateway routes in.
+listGatewayRoutes_meshName :: Lens.Lens' ListGatewayRoutes Prelude.Text
+listGatewayRoutes_meshName = Lens.lens (\ListGatewayRoutes' {meshName} -> meshName) (\s@ListGatewayRoutes' {} a -> s {meshName = a} :: ListGatewayRoutes)
+
+-- | The name of the virtual gateway to list gateway routes in.
+listGatewayRoutes_virtualGatewayName :: Lens.Lens' ListGatewayRoutes Prelude.Text
+listGatewayRoutes_virtualGatewayName = Lens.lens (\ListGatewayRoutes' {virtualGatewayName} -> virtualGatewayName) (\s@ListGatewayRoutes' {} a -> s {virtualGatewayName = a} :: ListGatewayRoutes)
+
+instance Core.AWSPager ListGatewayRoutes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listGatewayRoutesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listGatewayRoutesResponse_gatewayRoutes) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listGatewayRoutes_nextToken
+          Lens..~ rs
+          Lens.^? listGatewayRoutesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListGatewayRoutes where
+  type
+    AWSResponse ListGatewayRoutes =
+      ListGatewayRoutesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListGatewayRoutesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "gatewayRoutes" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListGatewayRoutes where
+  hashWithSalt _salt ListGatewayRoutes' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData ListGatewayRoutes where
+  rnf ListGatewayRoutes' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders ListGatewayRoutes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListGatewayRoutes where
+  toPath ListGatewayRoutes' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateway/",
+        Data.toBS virtualGatewayName,
+        "/gatewayRoutes"
+      ]
+
+instance Data.ToQuery ListGatewayRoutes where
+  toQuery ListGatewayRoutes' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "meshOwner" Data.=: meshOwner,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListGatewayRoutesResponse' smart constructor.
+data ListGatewayRoutesResponse = ListGatewayRoutesResponse'
+  { -- | The @nextToken@ value to include in a future @ListGatewayRoutes@
+    -- request. When the results of a @ListGatewayRoutes@ request exceed
+    -- @limit@, you can use this value to retrieve the next page of results.
+    -- This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing gateway routes for the specified service mesh and
+    -- virtual gateway.
+    gatewayRoutes :: [GatewayRouteRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGatewayRoutesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listGatewayRoutesResponse_nextToken' - The @nextToken@ value to include in a future @ListGatewayRoutes@
+-- request. When the results of a @ListGatewayRoutes@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listGatewayRoutesResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayRoutes', 'listGatewayRoutesResponse_gatewayRoutes' - The list of existing gateway routes for the specified service mesh and
+-- virtual gateway.
+newListGatewayRoutesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListGatewayRoutesResponse
+newListGatewayRoutesResponse pHttpStatus_ =
+  ListGatewayRoutesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      gatewayRoutes = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListGatewayRoutes@
+-- request. When the results of a @ListGatewayRoutes@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+listGatewayRoutesResponse_nextToken :: Lens.Lens' ListGatewayRoutesResponse (Prelude.Maybe Prelude.Text)
+listGatewayRoutesResponse_nextToken = Lens.lens (\ListGatewayRoutesResponse' {nextToken} -> nextToken) (\s@ListGatewayRoutesResponse' {} a -> s {nextToken = a} :: ListGatewayRoutesResponse)
+
+-- | The response's http status code.
+listGatewayRoutesResponse_httpStatus :: Lens.Lens' ListGatewayRoutesResponse Prelude.Int
+listGatewayRoutesResponse_httpStatus = Lens.lens (\ListGatewayRoutesResponse' {httpStatus} -> httpStatus) (\s@ListGatewayRoutesResponse' {} a -> s {httpStatus = a} :: ListGatewayRoutesResponse)
+
+-- | The list of existing gateway routes for the specified service mesh and
+-- virtual gateway.
+listGatewayRoutesResponse_gatewayRoutes :: Lens.Lens' ListGatewayRoutesResponse [GatewayRouteRef]
+listGatewayRoutesResponse_gatewayRoutes = Lens.lens (\ListGatewayRoutesResponse' {gatewayRoutes} -> gatewayRoutes) (\s@ListGatewayRoutesResponse' {} a -> s {gatewayRoutes = a} :: ListGatewayRoutesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListGatewayRoutesResponse where
+  rnf ListGatewayRoutesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayRoutes
diff --git a/gen/Amazonka/AppMesh/ListMeshes.hs b/gen/Amazonka/AppMesh/ListMeshes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListMeshes.hs
@@ -0,0 +1,256 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListMeshes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing service meshes.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListMeshes
+  ( -- * Creating a Request
+    ListMeshes (..),
+    newListMeshes,
+
+    -- * Request Lenses
+    listMeshes_limit,
+    listMeshes_nextToken,
+
+    -- * Destructuring the Response
+    ListMeshesResponse (..),
+    newListMeshesResponse,
+
+    -- * Response Lenses
+    listMeshesResponse_nextToken,
+    listMeshesResponse_httpStatus,
+    listMeshesResponse_meshes,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListMeshes' smart constructor.
+data ListMeshes = ListMeshes'
+  { -- | The maximum number of results returned by @ListMeshes@ in paginated
+    -- output. When you use this parameter, @ListMeshes@ returns only @limit@
+    -- results in a single page along with a @nextToken@ response element. You
+    -- can see the remaining results of the initial request by sending another
+    -- @ListMeshes@ request with the returned @nextToken@ value. This value can
+    -- be between 1 and 100. If you don\'t use this parameter, @ListMeshes@
+    -- returns up to 100 results and a @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated @ListMeshes@
+    -- request where @limit@ was used and the results exceeded the value of
+    -- that parameter. Pagination continues from the end of the previous
+    -- results that returned the @nextToken@ value.
+    --
+    -- This token should be treated as an opaque identifier that is used only
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMeshes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listMeshes_limit' - The maximum number of results returned by @ListMeshes@ in paginated
+-- output. When you use this parameter, @ListMeshes@ returns only @limit@
+-- results in a single page along with a @nextToken@ response element. You
+-- can see the remaining results of the initial request by sending another
+-- @ListMeshes@ request with the returned @nextToken@ value. This value can
+-- be between 1 and 100. If you don\'t use this parameter, @ListMeshes@
+-- returns up to 100 results and a @nextToken@ value if applicable.
+--
+-- 'nextToken', 'listMeshes_nextToken' - The @nextToken@ value returned from a previous paginated @ListMeshes@
+-- request where @limit@ was used and the results exceeded the value of
+-- that parameter. Pagination continues from the end of the previous
+-- results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is used only
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+newListMeshes ::
+  ListMeshes
+newListMeshes =
+  ListMeshes'
+    { limit = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results returned by @ListMeshes@ in paginated
+-- output. When you use this parameter, @ListMeshes@ returns only @limit@
+-- results in a single page along with a @nextToken@ response element. You
+-- can see the remaining results of the initial request by sending another
+-- @ListMeshes@ request with the returned @nextToken@ value. This value can
+-- be between 1 and 100. If you don\'t use this parameter, @ListMeshes@
+-- returns up to 100 results and a @nextToken@ value if applicable.
+listMeshes_limit :: Lens.Lens' ListMeshes (Prelude.Maybe Prelude.Natural)
+listMeshes_limit = Lens.lens (\ListMeshes' {limit} -> limit) (\s@ListMeshes' {} a -> s {limit = a} :: ListMeshes)
+
+-- | The @nextToken@ value returned from a previous paginated @ListMeshes@
+-- request where @limit@ was used and the results exceeded the value of
+-- that parameter. Pagination continues from the end of the previous
+-- results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is used only
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+listMeshes_nextToken :: Lens.Lens' ListMeshes (Prelude.Maybe Prelude.Text)
+listMeshes_nextToken = Lens.lens (\ListMeshes' {nextToken} -> nextToken) (\s@ListMeshes' {} a -> s {nextToken = a} :: ListMeshes)
+
+instance Core.AWSPager ListMeshes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listMeshesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listMeshesResponse_meshes) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listMeshes_nextToken
+          Lens..~ rs
+          Lens.^? listMeshesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListMeshes where
+  type AWSResponse ListMeshes = ListMeshesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListMeshesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "meshes" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListMeshes where
+  hashWithSalt _salt ListMeshes' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListMeshes where
+  rnf ListMeshes' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListMeshes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListMeshes where
+  toPath = Prelude.const "/v20190125/meshes"
+
+instance Data.ToQuery ListMeshes where
+  toQuery ListMeshes' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListMeshesResponse' smart constructor.
+data ListMeshesResponse = ListMeshesResponse'
+  { -- | The @nextToken@ value to include in a future @ListMeshes@ request. When
+    -- the results of a @ListMeshes@ request exceed @limit@, you can use this
+    -- value to retrieve the next page of results. This value is @null@ when
+    -- there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing service meshes.
+    meshes :: [MeshRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMeshesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listMeshesResponse_nextToken' - The @nextToken@ value to include in a future @ListMeshes@ request. When
+-- the results of a @ListMeshes@ request exceed @limit@, you can use this
+-- value to retrieve the next page of results. This value is @null@ when
+-- there are no more results to return.
+--
+-- 'httpStatus', 'listMeshesResponse_httpStatus' - The response's http status code.
+--
+-- 'meshes', 'listMeshesResponse_meshes' - The list of existing service meshes.
+newListMeshesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListMeshesResponse
+newListMeshesResponse pHttpStatus_ =
+  ListMeshesResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      meshes = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListMeshes@ request. When
+-- the results of a @ListMeshes@ request exceed @limit@, you can use this
+-- value to retrieve the next page of results. This value is @null@ when
+-- there are no more results to return.
+listMeshesResponse_nextToken :: Lens.Lens' ListMeshesResponse (Prelude.Maybe Prelude.Text)
+listMeshesResponse_nextToken = Lens.lens (\ListMeshesResponse' {nextToken} -> nextToken) (\s@ListMeshesResponse' {} a -> s {nextToken = a} :: ListMeshesResponse)
+
+-- | The response's http status code.
+listMeshesResponse_httpStatus :: Lens.Lens' ListMeshesResponse Prelude.Int
+listMeshesResponse_httpStatus = Lens.lens (\ListMeshesResponse' {httpStatus} -> httpStatus) (\s@ListMeshesResponse' {} a -> s {httpStatus = a} :: ListMeshesResponse)
+
+-- | The list of existing service meshes.
+listMeshesResponse_meshes :: Lens.Lens' ListMeshesResponse [MeshRef]
+listMeshesResponse_meshes = Lens.lens (\ListMeshesResponse' {meshes} -> meshes) (\s@ListMeshesResponse' {} a -> s {meshes = a} :: ListMeshesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListMeshesResponse where
+  rnf ListMeshesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf meshes
diff --git a/gen/Amazonka/AppMesh/ListRoutes.hs b/gen/Amazonka/AppMesh/ListRoutes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListRoutes.hs
@@ -0,0 +1,304 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListRoutes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing routes in a service mesh.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListRoutes
+  ( -- * Creating a Request
+    ListRoutes (..),
+    newListRoutes,
+
+    -- * Request Lenses
+    listRoutes_limit,
+    listRoutes_meshOwner,
+    listRoutes_nextToken,
+    listRoutes_meshName,
+    listRoutes_virtualRouterName,
+
+    -- * Destructuring the Response
+    ListRoutesResponse (..),
+    newListRoutesResponse,
+
+    -- * Response Lenses
+    listRoutesResponse_nextToken,
+    listRoutesResponse_httpStatus,
+    listRoutesResponse_routes,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListRoutes' smart constructor.
+data ListRoutes = ListRoutes'
+  { -- | The maximum number of results returned by @ListRoutes@ in paginated
+    -- output. When you use this parameter, @ListRoutes@ returns only @limit@
+    -- results in a single page along with a @nextToken@ response element. You
+    -- can see the remaining results of the initial request by sending another
+    -- @ListRoutes@ request with the returned @nextToken@ value. This value can
+    -- be between 1 and 100. If you don\'t use this parameter, @ListRoutes@
+    -- returns up to 100 results and a @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value returned from a previous paginated @ListRoutes@
+    -- request where @limit@ was used and the results exceeded the value of
+    -- that parameter. Pagination continues from the end of the previous
+    -- results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to list routes in.
+    meshName :: Prelude.Text,
+    -- | The name of the virtual router to list routes in.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRoutes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listRoutes_limit' - The maximum number of results returned by @ListRoutes@ in paginated
+-- output. When you use this parameter, @ListRoutes@ returns only @limit@
+-- results in a single page along with a @nextToken@ response element. You
+-- can see the remaining results of the initial request by sending another
+-- @ListRoutes@ request with the returned @nextToken@ value. This value can
+-- be between 1 and 100. If you don\'t use this parameter, @ListRoutes@
+-- returns up to 100 results and a @nextToken@ value if applicable.
+--
+-- 'meshOwner', 'listRoutes_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'nextToken', 'listRoutes_nextToken' - The @nextToken@ value returned from a previous paginated @ListRoutes@
+-- request where @limit@ was used and the results exceeded the value of
+-- that parameter. Pagination continues from the end of the previous
+-- results that returned the @nextToken@ value.
+--
+-- 'meshName', 'listRoutes_meshName' - The name of the service mesh to list routes in.
+--
+-- 'virtualRouterName', 'listRoutes_virtualRouterName' - The name of the virtual router to list routes in.
+newListRoutes ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  ListRoutes
+newListRoutes pMeshName_ pVirtualRouterName_ =
+  ListRoutes'
+    { limit = Prelude.Nothing,
+      meshOwner = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      meshName = pMeshName_,
+      virtualRouterName = pVirtualRouterName_
+    }
+
+-- | The maximum number of results returned by @ListRoutes@ in paginated
+-- output. When you use this parameter, @ListRoutes@ returns only @limit@
+-- results in a single page along with a @nextToken@ response element. You
+-- can see the remaining results of the initial request by sending another
+-- @ListRoutes@ request with the returned @nextToken@ value. This value can
+-- be between 1 and 100. If you don\'t use this parameter, @ListRoutes@
+-- returns up to 100 results and a @nextToken@ value if applicable.
+listRoutes_limit :: Lens.Lens' ListRoutes (Prelude.Maybe Prelude.Natural)
+listRoutes_limit = Lens.lens (\ListRoutes' {limit} -> limit) (\s@ListRoutes' {} a -> s {limit = a} :: ListRoutes)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+listRoutes_meshOwner :: Lens.Lens' ListRoutes (Prelude.Maybe Prelude.Text)
+listRoutes_meshOwner = Lens.lens (\ListRoutes' {meshOwner} -> meshOwner) (\s@ListRoutes' {} a -> s {meshOwner = a} :: ListRoutes)
+
+-- | The @nextToken@ value returned from a previous paginated @ListRoutes@
+-- request where @limit@ was used and the results exceeded the value of
+-- that parameter. Pagination continues from the end of the previous
+-- results that returned the @nextToken@ value.
+listRoutes_nextToken :: Lens.Lens' ListRoutes (Prelude.Maybe Prelude.Text)
+listRoutes_nextToken = Lens.lens (\ListRoutes' {nextToken} -> nextToken) (\s@ListRoutes' {} a -> s {nextToken = a} :: ListRoutes)
+
+-- | The name of the service mesh to list routes in.
+listRoutes_meshName :: Lens.Lens' ListRoutes Prelude.Text
+listRoutes_meshName = Lens.lens (\ListRoutes' {meshName} -> meshName) (\s@ListRoutes' {} a -> s {meshName = a} :: ListRoutes)
+
+-- | The name of the virtual router to list routes in.
+listRoutes_virtualRouterName :: Lens.Lens' ListRoutes Prelude.Text
+listRoutes_virtualRouterName = Lens.lens (\ListRoutes' {virtualRouterName} -> virtualRouterName) (\s@ListRoutes' {} a -> s {virtualRouterName = a} :: ListRoutes)
+
+instance Core.AWSPager ListRoutes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRoutesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listRoutesResponse_routes) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRoutes_nextToken
+          Lens..~ rs
+          Lens.^? listRoutesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRoutes where
+  type AWSResponse ListRoutes = ListRoutesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRoutesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "routes" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListRoutes where
+  hashWithSalt _salt ListRoutes' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData ListRoutes where
+  rnf ListRoutes' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders ListRoutes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListRoutes where
+  toPath ListRoutes' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouter/",
+        Data.toBS virtualRouterName,
+        "/routes"
+      ]
+
+instance Data.ToQuery ListRoutes where
+  toQuery ListRoutes' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "meshOwner" Data.=: meshOwner,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListRoutesResponse' smart constructor.
+data ListRoutesResponse = ListRoutesResponse'
+  { -- | The @nextToken@ value to include in a future @ListRoutes@ request. When
+    -- the results of a @ListRoutes@ request exceed @limit@, you can use this
+    -- value to retrieve the next page of results. This value is @null@ when
+    -- there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing routes for the specified service mesh and virtual
+    -- router.
+    routes :: [RouteRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRoutesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listRoutesResponse_nextToken' - The @nextToken@ value to include in a future @ListRoutes@ request. When
+-- the results of a @ListRoutes@ request exceed @limit@, you can use this
+-- value to retrieve the next page of results. This value is @null@ when
+-- there are no more results to return.
+--
+-- 'httpStatus', 'listRoutesResponse_httpStatus' - The response's http status code.
+--
+-- 'routes', 'listRoutesResponse_routes' - The list of existing routes for the specified service mesh and virtual
+-- router.
+newListRoutesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRoutesResponse
+newListRoutesResponse pHttpStatus_ =
+  ListRoutesResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      routes = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListRoutes@ request. When
+-- the results of a @ListRoutes@ request exceed @limit@, you can use this
+-- value to retrieve the next page of results. This value is @null@ when
+-- there are no more results to return.
+listRoutesResponse_nextToken :: Lens.Lens' ListRoutesResponse (Prelude.Maybe Prelude.Text)
+listRoutesResponse_nextToken = Lens.lens (\ListRoutesResponse' {nextToken} -> nextToken) (\s@ListRoutesResponse' {} a -> s {nextToken = a} :: ListRoutesResponse)
+
+-- | The response's http status code.
+listRoutesResponse_httpStatus :: Lens.Lens' ListRoutesResponse Prelude.Int
+listRoutesResponse_httpStatus = Lens.lens (\ListRoutesResponse' {httpStatus} -> httpStatus) (\s@ListRoutesResponse' {} a -> s {httpStatus = a} :: ListRoutesResponse)
+
+-- | The list of existing routes for the specified service mesh and virtual
+-- router.
+listRoutesResponse_routes :: Lens.Lens' ListRoutesResponse [RouteRef]
+listRoutesResponse_routes = Lens.lens (\ListRoutesResponse' {routes} -> routes) (\s@ListRoutesResponse' {} a -> s {routes = a} :: ListRoutesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListRoutesResponse where
+  rnf ListRoutesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf routes
diff --git a/gen/Amazonka/AppMesh/ListTagsForResource.hs b/gen/Amazonka/AppMesh/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListTagsForResource.hs
@@ -0,0 +1,269 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List the tags for an App Mesh resource.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_limit,
+    listTagsForResource_nextToken,
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_nextToken,
+    listTagsForResourceResponse_httpStatus,
+    listTagsForResourceResponse_tags,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The maximum number of tag results returned by @ListTagsForResource@ in
+    -- paginated output. When this parameter is used, @ListTagsForResource@
+    -- returns only @limit@ results in a single page along with a @nextToken@
+    -- response element. You can see the remaining results of the initial
+    -- request by sending another @ListTagsForResource@ request with the
+    -- returned @nextToken@ value. This value can be between 1 and 100. If you
+    -- don\'t use this parameter, @ListTagsForResource@ returns up to 100
+    -- results and a @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListTagsForResource@ request where @limit@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that identifies the resource to list the
+    -- tags for.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listTagsForResource_limit' - The maximum number of tag results returned by @ListTagsForResource@ in
+-- paginated output. When this parameter is used, @ListTagsForResource@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListTagsForResource@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListTagsForResource@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+--
+-- 'nextToken', 'listTagsForResource_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListTagsForResource@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) that identifies the resource to list the
+-- tags for.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource'
+    { limit = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      resourceArn = pResourceArn_
+    }
+
+-- | The maximum number of tag results returned by @ListTagsForResource@ in
+-- paginated output. When this parameter is used, @ListTagsForResource@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListTagsForResource@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListTagsForResource@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+listTagsForResource_limit :: Lens.Lens' ListTagsForResource (Prelude.Maybe Prelude.Natural)
+listTagsForResource_limit = Lens.lens (\ListTagsForResource' {limit} -> limit) (\s@ListTagsForResource' {} a -> s {limit = a} :: ListTagsForResource)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListTagsForResource@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+listTagsForResource_nextToken :: Lens.Lens' ListTagsForResource (Prelude.Maybe Prelude.Text)
+listTagsForResource_nextToken = Lens.lens (\ListTagsForResource' {nextToken} -> nextToken) (\s@ListTagsForResource' {} a -> s {nextToken = a} :: ListTagsForResource)
+
+-- | The Amazon Resource Name (ARN) that identifies the resource to list the
+-- tags for.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSPager ListTagsForResource where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTagsForResourceResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listTagsForResourceResponse_tags) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTagsForResource_nextToken
+          Lens..~ rs
+          Lens.^? listTagsForResourceResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/v20190125/tags"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery ListTagsForResource' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "nextToken" Data.=: nextToken,
+        "resourceArn" Data.=: resourceArn
+      ]
+
+-- |
+--
+-- /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The @nextToken@ value to include in a future @ListTagsForResource@
+    -- request. When the results of a @ListTagsForResource@ request exceed
+    -- @limit@, you can use this value to retrieve the next page of results.
+    -- This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The tags for the resource.
+    tags :: [TagRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listTagsForResourceResponse_nextToken' - The @nextToken@ value to include in a future @ListTagsForResource@
+-- request. When the results of a @ListTagsForResource@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags for the resource.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      tags = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListTagsForResource@
+-- request. When the results of a @ListTagsForResource@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+listTagsForResourceResponse_nextToken :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe Prelude.Text)
+listTagsForResourceResponse_nextToken = Lens.lens (\ListTagsForResourceResponse' {nextToken} -> nextToken) (\s@ListTagsForResourceResponse' {} a -> s {nextToken = a} :: ListTagsForResourceResponse)
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+-- | The tags for the resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse [TagRef]
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/AppMesh/ListVirtualGateways.hs b/gen/Amazonka/AppMesh/ListVirtualGateways.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListVirtualGateways.hs
@@ -0,0 +1,293 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListVirtualGateways
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing virtual gateways in a service mesh.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListVirtualGateways
+  ( -- * Creating a Request
+    ListVirtualGateways (..),
+    newListVirtualGateways,
+
+    -- * Request Lenses
+    listVirtualGateways_limit,
+    listVirtualGateways_meshOwner,
+    listVirtualGateways_nextToken,
+    listVirtualGateways_meshName,
+
+    -- * Destructuring the Response
+    ListVirtualGatewaysResponse (..),
+    newListVirtualGatewaysResponse,
+
+    -- * Response Lenses
+    listVirtualGatewaysResponse_nextToken,
+    listVirtualGatewaysResponse_httpStatus,
+    listVirtualGatewaysResponse_virtualGateways,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListVirtualGateways' smart constructor.
+data ListVirtualGateways = ListVirtualGateways'
+  { -- | The maximum number of results returned by @ListVirtualGateways@ in
+    -- paginated output. When you use this parameter, @ListVirtualGateways@
+    -- returns only @limit@ results in a single page along with a @nextToken@
+    -- response element. You can see the remaining results of the initial
+    -- request by sending another @ListVirtualGateways@ request with the
+    -- returned @nextToken@ value. This value can be between 1 and 100. If you
+    -- don\'t use this parameter, @ListVirtualGateways@ returns up to 100
+    -- results and a @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListVirtualGateways@ request where @limit@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to list virtual gateways in.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualGateways' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listVirtualGateways_limit' - The maximum number of results returned by @ListVirtualGateways@ in
+-- paginated output. When you use this parameter, @ListVirtualGateways@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualGateways@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListVirtualGateways@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+--
+-- 'meshOwner', 'listVirtualGateways_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'nextToken', 'listVirtualGateways_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListVirtualGateways@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- 'meshName', 'listVirtualGateways_meshName' - The name of the service mesh to list virtual gateways in.
+newListVirtualGateways ::
+  -- | 'meshName'
+  Prelude.Text ->
+  ListVirtualGateways
+newListVirtualGateways pMeshName_ =
+  ListVirtualGateways'
+    { limit = Prelude.Nothing,
+      meshOwner = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | The maximum number of results returned by @ListVirtualGateways@ in
+-- paginated output. When you use this parameter, @ListVirtualGateways@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualGateways@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListVirtualGateways@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+listVirtualGateways_limit :: Lens.Lens' ListVirtualGateways (Prelude.Maybe Prelude.Natural)
+listVirtualGateways_limit = Lens.lens (\ListVirtualGateways' {limit} -> limit) (\s@ListVirtualGateways' {} a -> s {limit = a} :: ListVirtualGateways)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+listVirtualGateways_meshOwner :: Lens.Lens' ListVirtualGateways (Prelude.Maybe Prelude.Text)
+listVirtualGateways_meshOwner = Lens.lens (\ListVirtualGateways' {meshOwner} -> meshOwner) (\s@ListVirtualGateways' {} a -> s {meshOwner = a} :: ListVirtualGateways)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListVirtualGateways@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+listVirtualGateways_nextToken :: Lens.Lens' ListVirtualGateways (Prelude.Maybe Prelude.Text)
+listVirtualGateways_nextToken = Lens.lens (\ListVirtualGateways' {nextToken} -> nextToken) (\s@ListVirtualGateways' {} a -> s {nextToken = a} :: ListVirtualGateways)
+
+-- | The name of the service mesh to list virtual gateways in.
+listVirtualGateways_meshName :: Lens.Lens' ListVirtualGateways Prelude.Text
+listVirtualGateways_meshName = Lens.lens (\ListVirtualGateways' {meshName} -> meshName) (\s@ListVirtualGateways' {} a -> s {meshName = a} :: ListVirtualGateways)
+
+instance Core.AWSPager ListVirtualGateways where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listVirtualGatewaysResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listVirtualGatewaysResponse_virtualGateways
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listVirtualGateways_nextToken
+          Lens..~ rs
+          Lens.^? listVirtualGatewaysResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListVirtualGateways where
+  type
+    AWSResponse ListVirtualGateways =
+      ListVirtualGatewaysResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVirtualGatewaysResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "virtualGateways"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListVirtualGateways where
+  hashWithSalt _salt ListVirtualGateways' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData ListVirtualGateways where
+  rnf ListVirtualGateways' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders ListVirtualGateways where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListVirtualGateways where
+  toPath ListVirtualGateways' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateways"
+      ]
+
+instance Data.ToQuery ListVirtualGateways where
+  toQuery ListVirtualGateways' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "meshOwner" Data.=: meshOwner,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListVirtualGatewaysResponse' smart constructor.
+data ListVirtualGatewaysResponse = ListVirtualGatewaysResponse'
+  { -- | The @nextToken@ value to include in a future @ListVirtualGateways@
+    -- request. When the results of a @ListVirtualGateways@ request exceed
+    -- @limit@, you can use this value to retrieve the next page of results.
+    -- This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing virtual gateways for the specified service mesh.
+    virtualGateways :: [VirtualGatewayRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualGatewaysResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVirtualGatewaysResponse_nextToken' - The @nextToken@ value to include in a future @ListVirtualGateways@
+-- request. When the results of a @ListVirtualGateways@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listVirtualGatewaysResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualGateways', 'listVirtualGatewaysResponse_virtualGateways' - The list of existing virtual gateways for the specified service mesh.
+newListVirtualGatewaysResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVirtualGatewaysResponse
+newListVirtualGatewaysResponse pHttpStatus_ =
+  ListVirtualGatewaysResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      virtualGateways = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListVirtualGateways@
+-- request. When the results of a @ListVirtualGateways@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+listVirtualGatewaysResponse_nextToken :: Lens.Lens' ListVirtualGatewaysResponse (Prelude.Maybe Prelude.Text)
+listVirtualGatewaysResponse_nextToken = Lens.lens (\ListVirtualGatewaysResponse' {nextToken} -> nextToken) (\s@ListVirtualGatewaysResponse' {} a -> s {nextToken = a} :: ListVirtualGatewaysResponse)
+
+-- | The response's http status code.
+listVirtualGatewaysResponse_httpStatus :: Lens.Lens' ListVirtualGatewaysResponse Prelude.Int
+listVirtualGatewaysResponse_httpStatus = Lens.lens (\ListVirtualGatewaysResponse' {httpStatus} -> httpStatus) (\s@ListVirtualGatewaysResponse' {} a -> s {httpStatus = a} :: ListVirtualGatewaysResponse)
+
+-- | The list of existing virtual gateways for the specified service mesh.
+listVirtualGatewaysResponse_virtualGateways :: Lens.Lens' ListVirtualGatewaysResponse [VirtualGatewayRef]
+listVirtualGatewaysResponse_virtualGateways = Lens.lens (\ListVirtualGatewaysResponse' {virtualGateways} -> virtualGateways) (\s@ListVirtualGatewaysResponse' {} a -> s {virtualGateways = a} :: ListVirtualGatewaysResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListVirtualGatewaysResponse where
+  rnf ListVirtualGatewaysResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualGateways
diff --git a/gen/Amazonka/AppMesh/ListVirtualNodes.hs b/gen/Amazonka/AppMesh/ListVirtualNodes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListVirtualNodes.hs
@@ -0,0 +1,292 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListVirtualNodes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing virtual nodes.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListVirtualNodes
+  ( -- * Creating a Request
+    ListVirtualNodes (..),
+    newListVirtualNodes,
+
+    -- * Request Lenses
+    listVirtualNodes_limit,
+    listVirtualNodes_meshOwner,
+    listVirtualNodes_nextToken,
+    listVirtualNodes_meshName,
+
+    -- * Destructuring the Response
+    ListVirtualNodesResponse (..),
+    newListVirtualNodesResponse,
+
+    -- * Response Lenses
+    listVirtualNodesResponse_nextToken,
+    listVirtualNodesResponse_httpStatus,
+    listVirtualNodesResponse_virtualNodes,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListVirtualNodes' smart constructor.
+data ListVirtualNodes = ListVirtualNodes'
+  { -- | The maximum number of results returned by @ListVirtualNodes@ in
+    -- paginated output. When you use this parameter, @ListVirtualNodes@
+    -- returns only @limit@ results in a single page along with a @nextToken@
+    -- response element. You can see the remaining results of the initial
+    -- request by sending another @ListVirtualNodes@ request with the returned
+    -- @nextToken@ value. This value can be between 1 and 100. If you don\'t
+    -- use this parameter, @ListVirtualNodes@ returns up to 100 results and a
+    -- @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListVirtualNodes@ request where @limit@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to list virtual nodes in.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualNodes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listVirtualNodes_limit' - The maximum number of results returned by @ListVirtualNodes@ in
+-- paginated output. When you use this parameter, @ListVirtualNodes@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualNodes@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 100. If you don\'t
+-- use this parameter, @ListVirtualNodes@ returns up to 100 results and a
+-- @nextToken@ value if applicable.
+--
+-- 'meshOwner', 'listVirtualNodes_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'nextToken', 'listVirtualNodes_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListVirtualNodes@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- 'meshName', 'listVirtualNodes_meshName' - The name of the service mesh to list virtual nodes in.
+newListVirtualNodes ::
+  -- | 'meshName'
+  Prelude.Text ->
+  ListVirtualNodes
+newListVirtualNodes pMeshName_ =
+  ListVirtualNodes'
+    { limit = Prelude.Nothing,
+      meshOwner = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | The maximum number of results returned by @ListVirtualNodes@ in
+-- paginated output. When you use this parameter, @ListVirtualNodes@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualNodes@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 100. If you don\'t
+-- use this parameter, @ListVirtualNodes@ returns up to 100 results and a
+-- @nextToken@ value if applicable.
+listVirtualNodes_limit :: Lens.Lens' ListVirtualNodes (Prelude.Maybe Prelude.Natural)
+listVirtualNodes_limit = Lens.lens (\ListVirtualNodes' {limit} -> limit) (\s@ListVirtualNodes' {} a -> s {limit = a} :: ListVirtualNodes)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+listVirtualNodes_meshOwner :: Lens.Lens' ListVirtualNodes (Prelude.Maybe Prelude.Text)
+listVirtualNodes_meshOwner = Lens.lens (\ListVirtualNodes' {meshOwner} -> meshOwner) (\s@ListVirtualNodes' {} a -> s {meshOwner = a} :: ListVirtualNodes)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListVirtualNodes@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+listVirtualNodes_nextToken :: Lens.Lens' ListVirtualNodes (Prelude.Maybe Prelude.Text)
+listVirtualNodes_nextToken = Lens.lens (\ListVirtualNodes' {nextToken} -> nextToken) (\s@ListVirtualNodes' {} a -> s {nextToken = a} :: ListVirtualNodes)
+
+-- | The name of the service mesh to list virtual nodes in.
+listVirtualNodes_meshName :: Lens.Lens' ListVirtualNodes Prelude.Text
+listVirtualNodes_meshName = Lens.lens (\ListVirtualNodes' {meshName} -> meshName) (\s@ListVirtualNodes' {} a -> s {meshName = a} :: ListVirtualNodes)
+
+instance Core.AWSPager ListVirtualNodes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listVirtualNodesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listVirtualNodesResponse_virtualNodes) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listVirtualNodes_nextToken
+          Lens..~ rs
+          Lens.^? listVirtualNodesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListVirtualNodes where
+  type
+    AWSResponse ListVirtualNodes =
+      ListVirtualNodesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVirtualNodesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "virtualNodes" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListVirtualNodes where
+  hashWithSalt _salt ListVirtualNodes' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData ListVirtualNodes where
+  rnf ListVirtualNodes' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders ListVirtualNodes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListVirtualNodes where
+  toPath ListVirtualNodes' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualNodes"
+      ]
+
+instance Data.ToQuery ListVirtualNodes where
+  toQuery ListVirtualNodes' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "meshOwner" Data.=: meshOwner,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListVirtualNodesResponse' smart constructor.
+data ListVirtualNodesResponse = ListVirtualNodesResponse'
+  { -- | The @nextToken@ value to include in a future @ListVirtualNodes@ request.
+    -- When the results of a @ListVirtualNodes@ request exceed @limit@, you can
+    -- use this value to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing virtual nodes for the specified service mesh.
+    virtualNodes :: [VirtualNodeRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualNodesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVirtualNodesResponse_nextToken' - The @nextToken@ value to include in a future @ListVirtualNodes@ request.
+-- When the results of a @ListVirtualNodes@ request exceed @limit@, you can
+-- use this value to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listVirtualNodesResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualNodes', 'listVirtualNodesResponse_virtualNodes' - The list of existing virtual nodes for the specified service mesh.
+newListVirtualNodesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVirtualNodesResponse
+newListVirtualNodesResponse pHttpStatus_ =
+  ListVirtualNodesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      virtualNodes = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListVirtualNodes@ request.
+-- When the results of a @ListVirtualNodes@ request exceed @limit@, you can
+-- use this value to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+listVirtualNodesResponse_nextToken :: Lens.Lens' ListVirtualNodesResponse (Prelude.Maybe Prelude.Text)
+listVirtualNodesResponse_nextToken = Lens.lens (\ListVirtualNodesResponse' {nextToken} -> nextToken) (\s@ListVirtualNodesResponse' {} a -> s {nextToken = a} :: ListVirtualNodesResponse)
+
+-- | The response's http status code.
+listVirtualNodesResponse_httpStatus :: Lens.Lens' ListVirtualNodesResponse Prelude.Int
+listVirtualNodesResponse_httpStatus = Lens.lens (\ListVirtualNodesResponse' {httpStatus} -> httpStatus) (\s@ListVirtualNodesResponse' {} a -> s {httpStatus = a} :: ListVirtualNodesResponse)
+
+-- | The list of existing virtual nodes for the specified service mesh.
+listVirtualNodesResponse_virtualNodes :: Lens.Lens' ListVirtualNodesResponse [VirtualNodeRef]
+listVirtualNodesResponse_virtualNodes = Lens.lens (\ListVirtualNodesResponse' {virtualNodes} -> virtualNodes) (\s@ListVirtualNodesResponse' {} a -> s {virtualNodes = a} :: ListVirtualNodesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListVirtualNodesResponse where
+  rnf ListVirtualNodesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualNodes
diff --git a/gen/Amazonka/AppMesh/ListVirtualRouters.hs b/gen/Amazonka/AppMesh/ListVirtualRouters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListVirtualRouters.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListVirtualRouters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing virtual routers in a service mesh.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListVirtualRouters
+  ( -- * Creating a Request
+    ListVirtualRouters (..),
+    newListVirtualRouters,
+
+    -- * Request Lenses
+    listVirtualRouters_limit,
+    listVirtualRouters_meshOwner,
+    listVirtualRouters_nextToken,
+    listVirtualRouters_meshName,
+
+    -- * Destructuring the Response
+    ListVirtualRoutersResponse (..),
+    newListVirtualRoutersResponse,
+
+    -- * Response Lenses
+    listVirtualRoutersResponse_nextToken,
+    listVirtualRoutersResponse_httpStatus,
+    listVirtualRoutersResponse_virtualRouters,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListVirtualRouters' smart constructor.
+data ListVirtualRouters = ListVirtualRouters'
+  { -- | The maximum number of results returned by @ListVirtualRouters@ in
+    -- paginated output. When you use this parameter, @ListVirtualRouters@
+    -- returns only @limit@ results in a single page along with a @nextToken@
+    -- response element. You can see the remaining results of the initial
+    -- request by sending another @ListVirtualRouters@ request with the
+    -- returned @nextToken@ value. This value can be between 1 and 100. If you
+    -- don\'t use this parameter, @ListVirtualRouters@ returns up to 100
+    -- results and a @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListVirtualRouters@ request where @limit@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to list virtual routers in.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualRouters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listVirtualRouters_limit' - The maximum number of results returned by @ListVirtualRouters@ in
+-- paginated output. When you use this parameter, @ListVirtualRouters@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualRouters@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListVirtualRouters@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+--
+-- 'meshOwner', 'listVirtualRouters_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'nextToken', 'listVirtualRouters_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListVirtualRouters@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- 'meshName', 'listVirtualRouters_meshName' - The name of the service mesh to list virtual routers in.
+newListVirtualRouters ::
+  -- | 'meshName'
+  Prelude.Text ->
+  ListVirtualRouters
+newListVirtualRouters pMeshName_ =
+  ListVirtualRouters'
+    { limit = Prelude.Nothing,
+      meshOwner = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | The maximum number of results returned by @ListVirtualRouters@ in
+-- paginated output. When you use this parameter, @ListVirtualRouters@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualRouters@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListVirtualRouters@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+listVirtualRouters_limit :: Lens.Lens' ListVirtualRouters (Prelude.Maybe Prelude.Natural)
+listVirtualRouters_limit = Lens.lens (\ListVirtualRouters' {limit} -> limit) (\s@ListVirtualRouters' {} a -> s {limit = a} :: ListVirtualRouters)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+listVirtualRouters_meshOwner :: Lens.Lens' ListVirtualRouters (Prelude.Maybe Prelude.Text)
+listVirtualRouters_meshOwner = Lens.lens (\ListVirtualRouters' {meshOwner} -> meshOwner) (\s@ListVirtualRouters' {} a -> s {meshOwner = a} :: ListVirtualRouters)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListVirtualRouters@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+listVirtualRouters_nextToken :: Lens.Lens' ListVirtualRouters (Prelude.Maybe Prelude.Text)
+listVirtualRouters_nextToken = Lens.lens (\ListVirtualRouters' {nextToken} -> nextToken) (\s@ListVirtualRouters' {} a -> s {nextToken = a} :: ListVirtualRouters)
+
+-- | The name of the service mesh to list virtual routers in.
+listVirtualRouters_meshName :: Lens.Lens' ListVirtualRouters Prelude.Text
+listVirtualRouters_meshName = Lens.lens (\ListVirtualRouters' {meshName} -> meshName) (\s@ListVirtualRouters' {} a -> s {meshName = a} :: ListVirtualRouters)
+
+instance Core.AWSPager ListVirtualRouters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listVirtualRoutersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listVirtualRoutersResponse_virtualRouters
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listVirtualRouters_nextToken
+          Lens..~ rs
+          Lens.^? listVirtualRoutersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListVirtualRouters where
+  type
+    AWSResponse ListVirtualRouters =
+      ListVirtualRoutersResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVirtualRoutersResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "virtualRouters"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListVirtualRouters where
+  hashWithSalt _salt ListVirtualRouters' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData ListVirtualRouters where
+  rnf ListVirtualRouters' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders ListVirtualRouters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListVirtualRouters where
+  toPath ListVirtualRouters' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouters"
+      ]
+
+instance Data.ToQuery ListVirtualRouters where
+  toQuery ListVirtualRouters' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "meshOwner" Data.=: meshOwner,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListVirtualRoutersResponse' smart constructor.
+data ListVirtualRoutersResponse = ListVirtualRoutersResponse'
+  { -- | The @nextToken@ value to include in a future @ListVirtualRouters@
+    -- request. When the results of a @ListVirtualRouters@ request exceed
+    -- @limit@, you can use this value to retrieve the next page of results.
+    -- This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing virtual routers for the specified service mesh.
+    virtualRouters :: [VirtualRouterRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualRoutersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVirtualRoutersResponse_nextToken' - The @nextToken@ value to include in a future @ListVirtualRouters@
+-- request. When the results of a @ListVirtualRouters@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listVirtualRoutersResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualRouters', 'listVirtualRoutersResponse_virtualRouters' - The list of existing virtual routers for the specified service mesh.
+newListVirtualRoutersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVirtualRoutersResponse
+newListVirtualRoutersResponse pHttpStatus_ =
+  ListVirtualRoutersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      virtualRouters = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListVirtualRouters@
+-- request. When the results of a @ListVirtualRouters@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+listVirtualRoutersResponse_nextToken :: Lens.Lens' ListVirtualRoutersResponse (Prelude.Maybe Prelude.Text)
+listVirtualRoutersResponse_nextToken = Lens.lens (\ListVirtualRoutersResponse' {nextToken} -> nextToken) (\s@ListVirtualRoutersResponse' {} a -> s {nextToken = a} :: ListVirtualRoutersResponse)
+
+-- | The response's http status code.
+listVirtualRoutersResponse_httpStatus :: Lens.Lens' ListVirtualRoutersResponse Prelude.Int
+listVirtualRoutersResponse_httpStatus = Lens.lens (\ListVirtualRoutersResponse' {httpStatus} -> httpStatus) (\s@ListVirtualRoutersResponse' {} a -> s {httpStatus = a} :: ListVirtualRoutersResponse)
+
+-- | The list of existing virtual routers for the specified service mesh.
+listVirtualRoutersResponse_virtualRouters :: Lens.Lens' ListVirtualRoutersResponse [VirtualRouterRef]
+listVirtualRoutersResponse_virtualRouters = Lens.lens (\ListVirtualRoutersResponse' {virtualRouters} -> virtualRouters) (\s@ListVirtualRoutersResponse' {} a -> s {virtualRouters = a} :: ListVirtualRoutersResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListVirtualRoutersResponse where
+  rnf ListVirtualRoutersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualRouters
diff --git a/gen/Amazonka/AppMesh/ListVirtualServices.hs b/gen/Amazonka/AppMesh/ListVirtualServices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/ListVirtualServices.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.ListVirtualServices
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of existing virtual services in a service mesh.
+--
+-- This operation returns paginated results.
+module Amazonka.AppMesh.ListVirtualServices
+  ( -- * Creating a Request
+    ListVirtualServices (..),
+    newListVirtualServices,
+
+    -- * Request Lenses
+    listVirtualServices_limit,
+    listVirtualServices_meshOwner,
+    listVirtualServices_nextToken,
+    listVirtualServices_meshName,
+
+    -- * Destructuring the Response
+    ListVirtualServicesResponse (..),
+    newListVirtualServicesResponse,
+
+    -- * Response Lenses
+    listVirtualServicesResponse_nextToken,
+    listVirtualServicesResponse_httpStatus,
+    listVirtualServicesResponse_virtualServices,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListVirtualServices' smart constructor.
+data ListVirtualServices = ListVirtualServices'
+  { -- | The maximum number of results returned by @ListVirtualServices@ in
+    -- paginated output. When you use this parameter, @ListVirtualServices@
+    -- returns only @limit@ results in a single page along with a @nextToken@
+    -- response element. You can see the remaining results of the initial
+    -- request by sending another @ListVirtualServices@ request with the
+    -- returned @nextToken@ value. This value can be between 1 and 100. If you
+    -- don\'t use this parameter, @ListVirtualServices@ returns up to 100
+    -- results and a @nextToken@ value if applicable.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListVirtualServices@ request where @limit@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh to list virtual services in.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualServices' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'limit', 'listVirtualServices_limit' - The maximum number of results returned by @ListVirtualServices@ in
+-- paginated output. When you use this parameter, @ListVirtualServices@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualServices@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListVirtualServices@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+--
+-- 'meshOwner', 'listVirtualServices_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'nextToken', 'listVirtualServices_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListVirtualServices@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- 'meshName', 'listVirtualServices_meshName' - The name of the service mesh to list virtual services in.
+newListVirtualServices ::
+  -- | 'meshName'
+  Prelude.Text ->
+  ListVirtualServices
+newListVirtualServices pMeshName_ =
+  ListVirtualServices'
+    { limit = Prelude.Nothing,
+      meshOwner = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | The maximum number of results returned by @ListVirtualServices@ in
+-- paginated output. When you use this parameter, @ListVirtualServices@
+-- returns only @limit@ results in a single page along with a @nextToken@
+-- response element. You can see the remaining results of the initial
+-- request by sending another @ListVirtualServices@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 100. If you
+-- don\'t use this parameter, @ListVirtualServices@ returns up to 100
+-- results and a @nextToken@ value if applicable.
+listVirtualServices_limit :: Lens.Lens' ListVirtualServices (Prelude.Maybe Prelude.Natural)
+listVirtualServices_limit = Lens.lens (\ListVirtualServices' {limit} -> limit) (\s@ListVirtualServices' {} a -> s {limit = a} :: ListVirtualServices)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+listVirtualServices_meshOwner :: Lens.Lens' ListVirtualServices (Prelude.Maybe Prelude.Text)
+listVirtualServices_meshOwner = Lens.lens (\ListVirtualServices' {meshOwner} -> meshOwner) (\s@ListVirtualServices' {} a -> s {meshOwner = a} :: ListVirtualServices)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListVirtualServices@ request where @limit@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+listVirtualServices_nextToken :: Lens.Lens' ListVirtualServices (Prelude.Maybe Prelude.Text)
+listVirtualServices_nextToken = Lens.lens (\ListVirtualServices' {nextToken} -> nextToken) (\s@ListVirtualServices' {} a -> s {nextToken = a} :: ListVirtualServices)
+
+-- | The name of the service mesh to list virtual services in.
+listVirtualServices_meshName :: Lens.Lens' ListVirtualServices Prelude.Text
+listVirtualServices_meshName = Lens.lens (\ListVirtualServices' {meshName} -> meshName) (\s@ListVirtualServices' {} a -> s {meshName = a} :: ListVirtualServices)
+
+instance Core.AWSPager ListVirtualServices where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listVirtualServicesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listVirtualServicesResponse_virtualServices
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listVirtualServices_nextToken
+          Lens..~ rs
+          Lens.^? listVirtualServicesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListVirtualServices where
+  type
+    AWSResponse ListVirtualServices =
+      ListVirtualServicesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVirtualServicesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "virtualServices"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListVirtualServices where
+  hashWithSalt _salt ListVirtualServices' {..} =
+    _salt
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData ListVirtualServices where
+  rnf ListVirtualServices' {..} =
+    Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders ListVirtualServices where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListVirtualServices where
+  toPath ListVirtualServices' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualServices"
+      ]
+
+instance Data.ToQuery ListVirtualServices where
+  toQuery ListVirtualServices' {..} =
+    Prelude.mconcat
+      [ "limit" Data.=: limit,
+        "meshOwner" Data.=: meshOwner,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListVirtualServicesResponse' smart constructor.
+data ListVirtualServicesResponse = ListVirtualServicesResponse'
+  { -- | The @nextToken@ value to include in a future @ListVirtualServices@
+    -- request. When the results of a @ListVirtualServices@ request exceed
+    -- @limit@, you can use this value to retrieve the next page of results.
+    -- This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of existing virtual services for the specified service mesh.
+    virtualServices :: [VirtualServiceRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualServicesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listVirtualServicesResponse_nextToken' - The @nextToken@ value to include in a future @ListVirtualServices@
+-- request. When the results of a @ListVirtualServices@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listVirtualServicesResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualServices', 'listVirtualServicesResponse_virtualServices' - The list of existing virtual services for the specified service mesh.
+newListVirtualServicesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVirtualServicesResponse
+newListVirtualServicesResponse pHttpStatus_ =
+  ListVirtualServicesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      virtualServices = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListVirtualServices@
+-- request. When the results of a @ListVirtualServices@ request exceed
+-- @limit@, you can use this value to retrieve the next page of results.
+-- This value is @null@ when there are no more results to return.
+listVirtualServicesResponse_nextToken :: Lens.Lens' ListVirtualServicesResponse (Prelude.Maybe Prelude.Text)
+listVirtualServicesResponse_nextToken = Lens.lens (\ListVirtualServicesResponse' {nextToken} -> nextToken) (\s@ListVirtualServicesResponse' {} a -> s {nextToken = a} :: ListVirtualServicesResponse)
+
+-- | The response's http status code.
+listVirtualServicesResponse_httpStatus :: Lens.Lens' ListVirtualServicesResponse Prelude.Int
+listVirtualServicesResponse_httpStatus = Lens.lens (\ListVirtualServicesResponse' {httpStatus} -> httpStatus) (\s@ListVirtualServicesResponse' {} a -> s {httpStatus = a} :: ListVirtualServicesResponse)
+
+-- | The list of existing virtual services for the specified service mesh.
+listVirtualServicesResponse_virtualServices :: Lens.Lens' ListVirtualServicesResponse [VirtualServiceRef]
+listVirtualServicesResponse_virtualServices = Lens.lens (\ListVirtualServicesResponse' {virtualServices} -> virtualServices) (\s@ListVirtualServicesResponse' {} a -> s {virtualServices = a} :: ListVirtualServicesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListVirtualServicesResponse where
+  rnf ListVirtualServicesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualServices
diff --git a/gen/Amazonka/AppMesh/TagResource.hs b/gen/Amazonka/AppMesh/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/TagResource.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates the specified tags to a resource with the specified
+-- @resourceArn@. If existing tags on a resource aren\'t specified in the
+-- request parameters, they aren\'t changed. When a resource is deleted,
+-- the tags associated with that resource are also deleted.
+module Amazonka.AppMesh.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource to add tags to.
+    resourceArn :: Prelude.Text,
+    -- | The tags to add to the resource. A tag is an array of key-value pairs.
+    -- Tag keys can have a maximum character length of 128 characters, and tag
+    -- values can have a maximum length of 256 characters.
+    tags :: [TagRef]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource to add tags to.
+--
+-- 'tags', 'tagResource_tags' - The tags to add to the resource. A tag is an array of key-value pairs.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource to add tags to.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags to add to the resource. A tag is an array of key-value pairs.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+tagResource_tags :: Lens.Lens' TagResource [TagRef]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/v20190125/tag"
+
+instance Data.ToQuery TagResource where
+  toQuery TagResource' {..} =
+    Prelude.mconcat ["resourceArn" Data.=: resourceArn]
+
+-- |
+--
+-- /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/AppMesh/Types.hs b/gen/Amazonka/AppMesh/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types.hs
@@ -0,0 +1,1379 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _BadRequestException,
+    _ConflictException,
+    _ForbiddenException,
+    _InternalServerErrorException,
+    _LimitExceededException,
+    _NotFoundException,
+    _ResourceInUseException,
+    _ServiceUnavailableException,
+    _TooManyRequestsException,
+    _TooManyTagsException,
+
+    -- * DefaultGatewayRouteRewrite
+    DefaultGatewayRouteRewrite (..),
+
+    -- * DnsResponseType
+    DnsResponseType (..),
+
+    -- * DurationUnit
+    DurationUnit (..),
+
+    -- * EgressFilterType
+    EgressFilterType (..),
+
+    -- * GatewayRouteStatusCode
+    GatewayRouteStatusCode (..),
+
+    -- * GrpcRetryPolicyEvent
+    GrpcRetryPolicyEvent (..),
+
+    -- * HttpMethod
+    HttpMethod (..),
+
+    -- * HttpScheme
+    HttpScheme (..),
+
+    -- * IpPreference
+    IpPreference (..),
+
+    -- * ListenerTlsMode
+    ListenerTlsMode (..),
+
+    -- * MeshStatusCode
+    MeshStatusCode (..),
+
+    -- * PortProtocol
+    PortProtocol (..),
+
+    -- * RouteStatusCode
+    RouteStatusCode (..),
+
+    -- * TcpRetryPolicyEvent
+    TcpRetryPolicyEvent (..),
+
+    -- * VirtualGatewayListenerTlsMode
+    VirtualGatewayListenerTlsMode (..),
+
+    -- * VirtualGatewayPortProtocol
+    VirtualGatewayPortProtocol (..),
+
+    -- * VirtualGatewayStatusCode
+    VirtualGatewayStatusCode (..),
+
+    -- * VirtualNodeStatusCode
+    VirtualNodeStatusCode (..),
+
+    -- * VirtualRouterStatusCode
+    VirtualRouterStatusCode (..),
+
+    -- * VirtualServiceStatusCode
+    VirtualServiceStatusCode (..),
+
+    -- * AccessLog
+    AccessLog (..),
+    newAccessLog,
+    accessLog_file,
+
+    -- * AwsCloudMapInstanceAttribute
+    AwsCloudMapInstanceAttribute (..),
+    newAwsCloudMapInstanceAttribute,
+    awsCloudMapInstanceAttribute_key,
+    awsCloudMapInstanceAttribute_value,
+
+    -- * AwsCloudMapServiceDiscovery
+    AwsCloudMapServiceDiscovery (..),
+    newAwsCloudMapServiceDiscovery,
+    awsCloudMapServiceDiscovery_attributes,
+    awsCloudMapServiceDiscovery_ipPreference,
+    awsCloudMapServiceDiscovery_namespaceName,
+    awsCloudMapServiceDiscovery_serviceName,
+
+    -- * Backend
+    Backend (..),
+    newBackend,
+    backend_virtualService,
+
+    -- * BackendDefaults
+    BackendDefaults (..),
+    newBackendDefaults,
+    backendDefaults_clientPolicy,
+
+    -- * ClientPolicy
+    ClientPolicy (..),
+    newClientPolicy,
+    clientPolicy_tls,
+
+    -- * ClientPolicyTls
+    ClientPolicyTls (..),
+    newClientPolicyTls,
+    clientPolicyTls_certificate,
+    clientPolicyTls_enforce,
+    clientPolicyTls_ports,
+    clientPolicyTls_validation,
+
+    -- * ClientTlsCertificate
+    ClientTlsCertificate (..),
+    newClientTlsCertificate,
+    clientTlsCertificate_file,
+    clientTlsCertificate_sds,
+
+    -- * DnsServiceDiscovery
+    DnsServiceDiscovery (..),
+    newDnsServiceDiscovery,
+    dnsServiceDiscovery_ipPreference,
+    dnsServiceDiscovery_responseType,
+    dnsServiceDiscovery_hostname,
+
+    -- * Duration
+    Duration (..),
+    newDuration,
+    duration_unit,
+    duration_value,
+
+    -- * EgressFilter
+    EgressFilter (..),
+    newEgressFilter,
+    egressFilter_type,
+
+    -- * FileAccessLog
+    FileAccessLog (..),
+    newFileAccessLog,
+    fileAccessLog_format,
+    fileAccessLog_path,
+
+    -- * GatewayRouteData
+    GatewayRouteData (..),
+    newGatewayRouteData,
+    gatewayRouteData_gatewayRouteName,
+    gatewayRouteData_meshName,
+    gatewayRouteData_metadata,
+    gatewayRouteData_spec,
+    gatewayRouteData_status,
+    gatewayRouteData_virtualGatewayName,
+
+    -- * GatewayRouteHostnameMatch
+    GatewayRouteHostnameMatch (..),
+    newGatewayRouteHostnameMatch,
+    gatewayRouteHostnameMatch_exact,
+    gatewayRouteHostnameMatch_suffix,
+
+    -- * GatewayRouteHostnameRewrite
+    GatewayRouteHostnameRewrite (..),
+    newGatewayRouteHostnameRewrite,
+    gatewayRouteHostnameRewrite_defaultTargetHostname,
+
+    -- * GatewayRouteRef
+    GatewayRouteRef (..),
+    newGatewayRouteRef,
+    gatewayRouteRef_arn,
+    gatewayRouteRef_createdAt,
+    gatewayRouteRef_gatewayRouteName,
+    gatewayRouteRef_lastUpdatedAt,
+    gatewayRouteRef_meshName,
+    gatewayRouteRef_meshOwner,
+    gatewayRouteRef_resourceOwner,
+    gatewayRouteRef_version,
+    gatewayRouteRef_virtualGatewayName,
+
+    -- * GatewayRouteSpec
+    GatewayRouteSpec (..),
+    newGatewayRouteSpec,
+    gatewayRouteSpec_grpcRoute,
+    gatewayRouteSpec_http2Route,
+    gatewayRouteSpec_httpRoute,
+    gatewayRouteSpec_priority,
+
+    -- * GatewayRouteStatus
+    GatewayRouteStatus (..),
+    newGatewayRouteStatus,
+    gatewayRouteStatus_status,
+
+    -- * GatewayRouteTarget
+    GatewayRouteTarget (..),
+    newGatewayRouteTarget,
+    gatewayRouteTarget_port,
+    gatewayRouteTarget_virtualService,
+
+    -- * GatewayRouteVirtualService
+    GatewayRouteVirtualService (..),
+    newGatewayRouteVirtualService,
+    gatewayRouteVirtualService_virtualServiceName,
+
+    -- * GrpcGatewayRoute
+    GrpcGatewayRoute (..),
+    newGrpcGatewayRoute,
+    grpcGatewayRoute_action,
+    grpcGatewayRoute_match,
+
+    -- * GrpcGatewayRouteAction
+    GrpcGatewayRouteAction (..),
+    newGrpcGatewayRouteAction,
+    grpcGatewayRouteAction_rewrite,
+    grpcGatewayRouteAction_target,
+
+    -- * GrpcGatewayRouteMatch
+    GrpcGatewayRouteMatch (..),
+    newGrpcGatewayRouteMatch,
+    grpcGatewayRouteMatch_hostname,
+    grpcGatewayRouteMatch_metadata,
+    grpcGatewayRouteMatch_port,
+    grpcGatewayRouteMatch_serviceName,
+
+    -- * GrpcGatewayRouteMetadata
+    GrpcGatewayRouteMetadata (..),
+    newGrpcGatewayRouteMetadata,
+    grpcGatewayRouteMetadata_invert,
+    grpcGatewayRouteMetadata_match,
+    grpcGatewayRouteMetadata_name,
+
+    -- * GrpcGatewayRouteRewrite
+    GrpcGatewayRouteRewrite (..),
+    newGrpcGatewayRouteRewrite,
+    grpcGatewayRouteRewrite_hostname,
+
+    -- * GrpcMetadataMatchMethod
+    GrpcMetadataMatchMethod (..),
+    newGrpcMetadataMatchMethod,
+    grpcMetadataMatchMethod_exact,
+    grpcMetadataMatchMethod_prefix,
+    grpcMetadataMatchMethod_range,
+    grpcMetadataMatchMethod_regex,
+    grpcMetadataMatchMethod_suffix,
+
+    -- * GrpcRetryPolicy
+    GrpcRetryPolicy (..),
+    newGrpcRetryPolicy,
+    grpcRetryPolicy_grpcRetryEvents,
+    grpcRetryPolicy_httpRetryEvents,
+    grpcRetryPolicy_tcpRetryEvents,
+    grpcRetryPolicy_maxRetries,
+    grpcRetryPolicy_perRetryTimeout,
+
+    -- * GrpcRoute
+    GrpcRoute (..),
+    newGrpcRoute,
+    grpcRoute_retryPolicy,
+    grpcRoute_timeout,
+    grpcRoute_action,
+    grpcRoute_match,
+
+    -- * GrpcRouteAction
+    GrpcRouteAction (..),
+    newGrpcRouteAction,
+    grpcRouteAction_weightedTargets,
+
+    -- * GrpcRouteMatch
+    GrpcRouteMatch (..),
+    newGrpcRouteMatch,
+    grpcRouteMatch_metadata,
+    grpcRouteMatch_methodName,
+    grpcRouteMatch_port,
+    grpcRouteMatch_serviceName,
+
+    -- * GrpcRouteMetadata
+    GrpcRouteMetadata (..),
+    newGrpcRouteMetadata,
+    grpcRouteMetadata_invert,
+    grpcRouteMetadata_match,
+    grpcRouteMetadata_name,
+
+    -- * GrpcRouteMetadataMatchMethod
+    GrpcRouteMetadataMatchMethod (..),
+    newGrpcRouteMetadataMatchMethod,
+    grpcRouteMetadataMatchMethod_exact,
+    grpcRouteMetadataMatchMethod_prefix,
+    grpcRouteMetadataMatchMethod_range,
+    grpcRouteMetadataMatchMethod_regex,
+    grpcRouteMetadataMatchMethod_suffix,
+
+    -- * GrpcTimeout
+    GrpcTimeout (..),
+    newGrpcTimeout,
+    grpcTimeout_idle,
+    grpcTimeout_perRequest,
+
+    -- * HeaderMatchMethod
+    HeaderMatchMethod (..),
+    newHeaderMatchMethod,
+    headerMatchMethod_exact,
+    headerMatchMethod_prefix,
+    headerMatchMethod_range,
+    headerMatchMethod_regex,
+    headerMatchMethod_suffix,
+
+    -- * HealthCheckPolicy
+    HealthCheckPolicy (..),
+    newHealthCheckPolicy,
+    healthCheckPolicy_path,
+    healthCheckPolicy_port,
+    healthCheckPolicy_healthyThreshold,
+    healthCheckPolicy_intervalMillis,
+    healthCheckPolicy_protocol,
+    healthCheckPolicy_timeoutMillis,
+    healthCheckPolicy_unhealthyThreshold,
+
+    -- * HttpGatewayRoute
+    HttpGatewayRoute (..),
+    newHttpGatewayRoute,
+    httpGatewayRoute_action,
+    httpGatewayRoute_match,
+
+    -- * HttpGatewayRouteAction
+    HttpGatewayRouteAction (..),
+    newHttpGatewayRouteAction,
+    httpGatewayRouteAction_rewrite,
+    httpGatewayRouteAction_target,
+
+    -- * HttpGatewayRouteHeader
+    HttpGatewayRouteHeader (..),
+    newHttpGatewayRouteHeader,
+    httpGatewayRouteHeader_invert,
+    httpGatewayRouteHeader_match,
+    httpGatewayRouteHeader_name,
+
+    -- * HttpGatewayRouteMatch
+    HttpGatewayRouteMatch (..),
+    newHttpGatewayRouteMatch,
+    httpGatewayRouteMatch_headers,
+    httpGatewayRouteMatch_hostname,
+    httpGatewayRouteMatch_method,
+    httpGatewayRouteMatch_path,
+    httpGatewayRouteMatch_port,
+    httpGatewayRouteMatch_prefix,
+    httpGatewayRouteMatch_queryParameters,
+
+    -- * HttpGatewayRoutePathRewrite
+    HttpGatewayRoutePathRewrite (..),
+    newHttpGatewayRoutePathRewrite,
+    httpGatewayRoutePathRewrite_exact,
+
+    -- * HttpGatewayRoutePrefixRewrite
+    HttpGatewayRoutePrefixRewrite (..),
+    newHttpGatewayRoutePrefixRewrite,
+    httpGatewayRoutePrefixRewrite_defaultPrefix,
+    httpGatewayRoutePrefixRewrite_value,
+
+    -- * HttpGatewayRouteRewrite
+    HttpGatewayRouteRewrite (..),
+    newHttpGatewayRouteRewrite,
+    httpGatewayRouteRewrite_hostname,
+    httpGatewayRouteRewrite_path,
+    httpGatewayRouteRewrite_prefix,
+
+    -- * HttpPathMatch
+    HttpPathMatch (..),
+    newHttpPathMatch,
+    httpPathMatch_exact,
+    httpPathMatch_regex,
+
+    -- * HttpQueryParameter
+    HttpQueryParameter (..),
+    newHttpQueryParameter,
+    httpQueryParameter_match,
+    httpQueryParameter_name,
+
+    -- * HttpRetryPolicy
+    HttpRetryPolicy (..),
+    newHttpRetryPolicy,
+    httpRetryPolicy_httpRetryEvents,
+    httpRetryPolicy_tcpRetryEvents,
+    httpRetryPolicy_maxRetries,
+    httpRetryPolicy_perRetryTimeout,
+
+    -- * HttpRoute
+    HttpRoute (..),
+    newHttpRoute,
+    httpRoute_retryPolicy,
+    httpRoute_timeout,
+    httpRoute_action,
+    httpRoute_match,
+
+    -- * HttpRouteAction
+    HttpRouteAction (..),
+    newHttpRouteAction,
+    httpRouteAction_weightedTargets,
+
+    -- * HttpRouteHeader
+    HttpRouteHeader (..),
+    newHttpRouteHeader,
+    httpRouteHeader_invert,
+    httpRouteHeader_match,
+    httpRouteHeader_name,
+
+    -- * HttpRouteMatch
+    HttpRouteMatch (..),
+    newHttpRouteMatch,
+    httpRouteMatch_headers,
+    httpRouteMatch_method,
+    httpRouteMatch_path,
+    httpRouteMatch_port,
+    httpRouteMatch_prefix,
+    httpRouteMatch_queryParameters,
+    httpRouteMatch_scheme,
+
+    -- * HttpTimeout
+    HttpTimeout (..),
+    newHttpTimeout,
+    httpTimeout_idle,
+    httpTimeout_perRequest,
+
+    -- * JsonFormatRef
+    JsonFormatRef (..),
+    newJsonFormatRef,
+    jsonFormatRef_key,
+    jsonFormatRef_value,
+
+    -- * Listener
+    Listener (..),
+    newListener,
+    listener_connectionPool,
+    listener_healthCheck,
+    listener_outlierDetection,
+    listener_timeout,
+    listener_tls,
+    listener_portMapping,
+
+    -- * ListenerTimeout
+    ListenerTimeout (..),
+    newListenerTimeout,
+    listenerTimeout_grpc,
+    listenerTimeout_http,
+    listenerTimeout_http2,
+    listenerTimeout_tcp,
+
+    -- * ListenerTls
+    ListenerTls (..),
+    newListenerTls,
+    listenerTls_validation,
+    listenerTls_certificate,
+    listenerTls_mode,
+
+    -- * ListenerTlsAcmCertificate
+    ListenerTlsAcmCertificate (..),
+    newListenerTlsAcmCertificate,
+    listenerTlsAcmCertificate_certificateArn,
+
+    -- * ListenerTlsCertificate
+    ListenerTlsCertificate (..),
+    newListenerTlsCertificate,
+    listenerTlsCertificate_acm,
+    listenerTlsCertificate_file,
+    listenerTlsCertificate_sds,
+
+    -- * ListenerTlsFileCertificate
+    ListenerTlsFileCertificate (..),
+    newListenerTlsFileCertificate,
+    listenerTlsFileCertificate_certificateChain,
+    listenerTlsFileCertificate_privateKey,
+
+    -- * ListenerTlsSdsCertificate
+    ListenerTlsSdsCertificate (..),
+    newListenerTlsSdsCertificate,
+    listenerTlsSdsCertificate_secretName,
+
+    -- * ListenerTlsValidationContext
+    ListenerTlsValidationContext (..),
+    newListenerTlsValidationContext,
+    listenerTlsValidationContext_subjectAlternativeNames,
+    listenerTlsValidationContext_trust,
+
+    -- * ListenerTlsValidationContextTrust
+    ListenerTlsValidationContextTrust (..),
+    newListenerTlsValidationContextTrust,
+    listenerTlsValidationContextTrust_file,
+    listenerTlsValidationContextTrust_sds,
+
+    -- * Logging
+    Logging (..),
+    newLogging,
+    logging_accessLog,
+
+    -- * LoggingFormat
+    LoggingFormat (..),
+    newLoggingFormat,
+    loggingFormat_json,
+    loggingFormat_text,
+
+    -- * MatchRange
+    MatchRange (..),
+    newMatchRange,
+    matchRange_end,
+    matchRange_start,
+
+    -- * MeshData
+    MeshData (..),
+    newMeshData,
+    meshData_meshName,
+    meshData_metadata,
+    meshData_spec,
+    meshData_status,
+
+    -- * MeshRef
+    MeshRef (..),
+    newMeshRef,
+    meshRef_arn,
+    meshRef_createdAt,
+    meshRef_lastUpdatedAt,
+    meshRef_meshName,
+    meshRef_meshOwner,
+    meshRef_resourceOwner,
+    meshRef_version,
+
+    -- * MeshServiceDiscovery
+    MeshServiceDiscovery (..),
+    newMeshServiceDiscovery,
+    meshServiceDiscovery_ipPreference,
+
+    -- * MeshSpec
+    MeshSpec (..),
+    newMeshSpec,
+    meshSpec_egressFilter,
+    meshSpec_serviceDiscovery,
+
+    -- * MeshStatus
+    MeshStatus (..),
+    newMeshStatus,
+    meshStatus_status,
+
+    -- * OutlierDetection
+    OutlierDetection (..),
+    newOutlierDetection,
+    outlierDetection_baseEjectionDuration,
+    outlierDetection_interval,
+    outlierDetection_maxEjectionPercent,
+    outlierDetection_maxServerErrors,
+
+    -- * PortMapping
+    PortMapping (..),
+    newPortMapping,
+    portMapping_port,
+    portMapping_protocol,
+
+    -- * QueryParameterMatch
+    QueryParameterMatch (..),
+    newQueryParameterMatch,
+    queryParameterMatch_exact,
+
+    -- * ResourceMetadata
+    ResourceMetadata (..),
+    newResourceMetadata,
+    resourceMetadata_arn,
+    resourceMetadata_createdAt,
+    resourceMetadata_lastUpdatedAt,
+    resourceMetadata_meshOwner,
+    resourceMetadata_resourceOwner,
+    resourceMetadata_uid,
+    resourceMetadata_version,
+
+    -- * RouteData
+    RouteData (..),
+    newRouteData,
+    routeData_meshName,
+    routeData_metadata,
+    routeData_routeName,
+    routeData_spec,
+    routeData_status,
+    routeData_virtualRouterName,
+
+    -- * RouteRef
+    RouteRef (..),
+    newRouteRef,
+    routeRef_arn,
+    routeRef_createdAt,
+    routeRef_lastUpdatedAt,
+    routeRef_meshName,
+    routeRef_meshOwner,
+    routeRef_resourceOwner,
+    routeRef_routeName,
+    routeRef_version,
+    routeRef_virtualRouterName,
+
+    -- * RouteSpec
+    RouteSpec (..),
+    newRouteSpec,
+    routeSpec_grpcRoute,
+    routeSpec_http2Route,
+    routeSpec_httpRoute,
+    routeSpec_priority,
+    routeSpec_tcpRoute,
+
+    -- * RouteStatus
+    RouteStatus (..),
+    newRouteStatus,
+    routeStatus_status,
+
+    -- * ServiceDiscovery
+    ServiceDiscovery (..),
+    newServiceDiscovery,
+    serviceDiscovery_awsCloudMap,
+    serviceDiscovery_dns,
+
+    -- * SubjectAlternativeNameMatchers
+    SubjectAlternativeNameMatchers (..),
+    newSubjectAlternativeNameMatchers,
+    subjectAlternativeNameMatchers_exact,
+
+    -- * SubjectAlternativeNames
+    SubjectAlternativeNames (..),
+    newSubjectAlternativeNames,
+    subjectAlternativeNames_match,
+
+    -- * TagRef
+    TagRef (..),
+    newTagRef,
+    tagRef_key,
+    tagRef_value,
+
+    -- * TcpRoute
+    TcpRoute (..),
+    newTcpRoute,
+    tcpRoute_match,
+    tcpRoute_timeout,
+    tcpRoute_action,
+
+    -- * TcpRouteAction
+    TcpRouteAction (..),
+    newTcpRouteAction,
+    tcpRouteAction_weightedTargets,
+
+    -- * TcpRouteMatch
+    TcpRouteMatch (..),
+    newTcpRouteMatch,
+    tcpRouteMatch_port,
+
+    -- * TcpTimeout
+    TcpTimeout (..),
+    newTcpTimeout,
+    tcpTimeout_idle,
+
+    -- * TlsValidationContext
+    TlsValidationContext (..),
+    newTlsValidationContext,
+    tlsValidationContext_subjectAlternativeNames,
+    tlsValidationContext_trust,
+
+    -- * TlsValidationContextAcmTrust
+    TlsValidationContextAcmTrust (..),
+    newTlsValidationContextAcmTrust,
+    tlsValidationContextAcmTrust_certificateAuthorityArns,
+
+    -- * TlsValidationContextFileTrust
+    TlsValidationContextFileTrust (..),
+    newTlsValidationContextFileTrust,
+    tlsValidationContextFileTrust_certificateChain,
+
+    -- * TlsValidationContextSdsTrust
+    TlsValidationContextSdsTrust (..),
+    newTlsValidationContextSdsTrust,
+    tlsValidationContextSdsTrust_secretName,
+
+    -- * TlsValidationContextTrust
+    TlsValidationContextTrust (..),
+    newTlsValidationContextTrust,
+    tlsValidationContextTrust_acm,
+    tlsValidationContextTrust_file,
+    tlsValidationContextTrust_sds,
+
+    -- * VirtualGatewayAccessLog
+    VirtualGatewayAccessLog (..),
+    newVirtualGatewayAccessLog,
+    virtualGatewayAccessLog_file,
+
+    -- * VirtualGatewayBackendDefaults
+    VirtualGatewayBackendDefaults (..),
+    newVirtualGatewayBackendDefaults,
+    virtualGatewayBackendDefaults_clientPolicy,
+
+    -- * VirtualGatewayClientPolicy
+    VirtualGatewayClientPolicy (..),
+    newVirtualGatewayClientPolicy,
+    virtualGatewayClientPolicy_tls,
+
+    -- * VirtualGatewayClientPolicyTls
+    VirtualGatewayClientPolicyTls (..),
+    newVirtualGatewayClientPolicyTls,
+    virtualGatewayClientPolicyTls_certificate,
+    virtualGatewayClientPolicyTls_enforce,
+    virtualGatewayClientPolicyTls_ports,
+    virtualGatewayClientPolicyTls_validation,
+
+    -- * VirtualGatewayClientTlsCertificate
+    VirtualGatewayClientTlsCertificate (..),
+    newVirtualGatewayClientTlsCertificate,
+    virtualGatewayClientTlsCertificate_file,
+    virtualGatewayClientTlsCertificate_sds,
+
+    -- * VirtualGatewayConnectionPool
+    VirtualGatewayConnectionPool (..),
+    newVirtualGatewayConnectionPool,
+    virtualGatewayConnectionPool_grpc,
+    virtualGatewayConnectionPool_http,
+    virtualGatewayConnectionPool_http2,
+
+    -- * VirtualGatewayData
+    VirtualGatewayData (..),
+    newVirtualGatewayData,
+    virtualGatewayData_meshName,
+    virtualGatewayData_metadata,
+    virtualGatewayData_spec,
+    virtualGatewayData_status,
+    virtualGatewayData_virtualGatewayName,
+
+    -- * VirtualGatewayFileAccessLog
+    VirtualGatewayFileAccessLog (..),
+    newVirtualGatewayFileAccessLog,
+    virtualGatewayFileAccessLog_format,
+    virtualGatewayFileAccessLog_path,
+
+    -- * VirtualGatewayGrpcConnectionPool
+    VirtualGatewayGrpcConnectionPool (..),
+    newVirtualGatewayGrpcConnectionPool,
+    virtualGatewayGrpcConnectionPool_maxRequests,
+
+    -- * VirtualGatewayHealthCheckPolicy
+    VirtualGatewayHealthCheckPolicy (..),
+    newVirtualGatewayHealthCheckPolicy,
+    virtualGatewayHealthCheckPolicy_path,
+    virtualGatewayHealthCheckPolicy_port,
+    virtualGatewayHealthCheckPolicy_healthyThreshold,
+    virtualGatewayHealthCheckPolicy_intervalMillis,
+    virtualGatewayHealthCheckPolicy_protocol,
+    virtualGatewayHealthCheckPolicy_timeoutMillis,
+    virtualGatewayHealthCheckPolicy_unhealthyThreshold,
+
+    -- * VirtualGatewayHttp2ConnectionPool
+    VirtualGatewayHttp2ConnectionPool (..),
+    newVirtualGatewayHttp2ConnectionPool,
+    virtualGatewayHttp2ConnectionPool_maxRequests,
+
+    -- * VirtualGatewayHttpConnectionPool
+    VirtualGatewayHttpConnectionPool (..),
+    newVirtualGatewayHttpConnectionPool,
+    virtualGatewayHttpConnectionPool_maxPendingRequests,
+    virtualGatewayHttpConnectionPool_maxConnections,
+
+    -- * VirtualGatewayListener
+    VirtualGatewayListener (..),
+    newVirtualGatewayListener,
+    virtualGatewayListener_connectionPool,
+    virtualGatewayListener_healthCheck,
+    virtualGatewayListener_tls,
+    virtualGatewayListener_portMapping,
+
+    -- * VirtualGatewayListenerTls
+    VirtualGatewayListenerTls (..),
+    newVirtualGatewayListenerTls,
+    virtualGatewayListenerTls_validation,
+    virtualGatewayListenerTls_certificate,
+    virtualGatewayListenerTls_mode,
+
+    -- * VirtualGatewayListenerTlsAcmCertificate
+    VirtualGatewayListenerTlsAcmCertificate (..),
+    newVirtualGatewayListenerTlsAcmCertificate,
+    virtualGatewayListenerTlsAcmCertificate_certificateArn,
+
+    -- * VirtualGatewayListenerTlsCertificate
+    VirtualGatewayListenerTlsCertificate (..),
+    newVirtualGatewayListenerTlsCertificate,
+    virtualGatewayListenerTlsCertificate_acm,
+    virtualGatewayListenerTlsCertificate_file,
+    virtualGatewayListenerTlsCertificate_sds,
+
+    -- * VirtualGatewayListenerTlsFileCertificate
+    VirtualGatewayListenerTlsFileCertificate (..),
+    newVirtualGatewayListenerTlsFileCertificate,
+    virtualGatewayListenerTlsFileCertificate_certificateChain,
+    virtualGatewayListenerTlsFileCertificate_privateKey,
+
+    -- * VirtualGatewayListenerTlsSdsCertificate
+    VirtualGatewayListenerTlsSdsCertificate (..),
+    newVirtualGatewayListenerTlsSdsCertificate,
+    virtualGatewayListenerTlsSdsCertificate_secretName,
+
+    -- * VirtualGatewayListenerTlsValidationContext
+    VirtualGatewayListenerTlsValidationContext (..),
+    newVirtualGatewayListenerTlsValidationContext,
+    virtualGatewayListenerTlsValidationContext_subjectAlternativeNames,
+    virtualGatewayListenerTlsValidationContext_trust,
+
+    -- * VirtualGatewayListenerTlsValidationContextTrust
+    VirtualGatewayListenerTlsValidationContextTrust (..),
+    newVirtualGatewayListenerTlsValidationContextTrust,
+    virtualGatewayListenerTlsValidationContextTrust_file,
+    virtualGatewayListenerTlsValidationContextTrust_sds,
+
+    -- * VirtualGatewayLogging
+    VirtualGatewayLogging (..),
+    newVirtualGatewayLogging,
+    virtualGatewayLogging_accessLog,
+
+    -- * VirtualGatewayPortMapping
+    VirtualGatewayPortMapping (..),
+    newVirtualGatewayPortMapping,
+    virtualGatewayPortMapping_port,
+    virtualGatewayPortMapping_protocol,
+
+    -- * VirtualGatewayRef
+    VirtualGatewayRef (..),
+    newVirtualGatewayRef,
+    virtualGatewayRef_arn,
+    virtualGatewayRef_createdAt,
+    virtualGatewayRef_lastUpdatedAt,
+    virtualGatewayRef_meshName,
+    virtualGatewayRef_meshOwner,
+    virtualGatewayRef_resourceOwner,
+    virtualGatewayRef_version,
+    virtualGatewayRef_virtualGatewayName,
+
+    -- * VirtualGatewaySpec
+    VirtualGatewaySpec (..),
+    newVirtualGatewaySpec,
+    virtualGatewaySpec_backendDefaults,
+    virtualGatewaySpec_logging,
+    virtualGatewaySpec_listeners,
+
+    -- * VirtualGatewayStatus
+    VirtualGatewayStatus (..),
+    newVirtualGatewayStatus,
+    virtualGatewayStatus_status,
+
+    -- * VirtualGatewayTlsValidationContext
+    VirtualGatewayTlsValidationContext (..),
+    newVirtualGatewayTlsValidationContext,
+    virtualGatewayTlsValidationContext_subjectAlternativeNames,
+    virtualGatewayTlsValidationContext_trust,
+
+    -- * VirtualGatewayTlsValidationContextAcmTrust
+    VirtualGatewayTlsValidationContextAcmTrust (..),
+    newVirtualGatewayTlsValidationContextAcmTrust,
+    virtualGatewayTlsValidationContextAcmTrust_certificateAuthorityArns,
+
+    -- * VirtualGatewayTlsValidationContextFileTrust
+    VirtualGatewayTlsValidationContextFileTrust (..),
+    newVirtualGatewayTlsValidationContextFileTrust,
+    virtualGatewayTlsValidationContextFileTrust_certificateChain,
+
+    -- * VirtualGatewayTlsValidationContextSdsTrust
+    VirtualGatewayTlsValidationContextSdsTrust (..),
+    newVirtualGatewayTlsValidationContextSdsTrust,
+    virtualGatewayTlsValidationContextSdsTrust_secretName,
+
+    -- * VirtualGatewayTlsValidationContextTrust
+    VirtualGatewayTlsValidationContextTrust (..),
+    newVirtualGatewayTlsValidationContextTrust,
+    virtualGatewayTlsValidationContextTrust_acm,
+    virtualGatewayTlsValidationContextTrust_file,
+    virtualGatewayTlsValidationContextTrust_sds,
+
+    -- * VirtualNodeConnectionPool
+    VirtualNodeConnectionPool (..),
+    newVirtualNodeConnectionPool,
+    virtualNodeConnectionPool_grpc,
+    virtualNodeConnectionPool_http,
+    virtualNodeConnectionPool_http2,
+    virtualNodeConnectionPool_tcp,
+
+    -- * VirtualNodeData
+    VirtualNodeData (..),
+    newVirtualNodeData,
+    virtualNodeData_meshName,
+    virtualNodeData_metadata,
+    virtualNodeData_spec,
+    virtualNodeData_status,
+    virtualNodeData_virtualNodeName,
+
+    -- * VirtualNodeGrpcConnectionPool
+    VirtualNodeGrpcConnectionPool (..),
+    newVirtualNodeGrpcConnectionPool,
+    virtualNodeGrpcConnectionPool_maxRequests,
+
+    -- * VirtualNodeHttp2ConnectionPool
+    VirtualNodeHttp2ConnectionPool (..),
+    newVirtualNodeHttp2ConnectionPool,
+    virtualNodeHttp2ConnectionPool_maxRequests,
+
+    -- * VirtualNodeHttpConnectionPool
+    VirtualNodeHttpConnectionPool (..),
+    newVirtualNodeHttpConnectionPool,
+    virtualNodeHttpConnectionPool_maxPendingRequests,
+    virtualNodeHttpConnectionPool_maxConnections,
+
+    -- * VirtualNodeRef
+    VirtualNodeRef (..),
+    newVirtualNodeRef,
+    virtualNodeRef_arn,
+    virtualNodeRef_createdAt,
+    virtualNodeRef_lastUpdatedAt,
+    virtualNodeRef_meshName,
+    virtualNodeRef_meshOwner,
+    virtualNodeRef_resourceOwner,
+    virtualNodeRef_version,
+    virtualNodeRef_virtualNodeName,
+
+    -- * VirtualNodeServiceProvider
+    VirtualNodeServiceProvider (..),
+    newVirtualNodeServiceProvider,
+    virtualNodeServiceProvider_virtualNodeName,
+
+    -- * VirtualNodeSpec
+    VirtualNodeSpec (..),
+    newVirtualNodeSpec,
+    virtualNodeSpec_backendDefaults,
+    virtualNodeSpec_backends,
+    virtualNodeSpec_listeners,
+    virtualNodeSpec_logging,
+    virtualNodeSpec_serviceDiscovery,
+
+    -- * VirtualNodeStatus
+    VirtualNodeStatus (..),
+    newVirtualNodeStatus,
+    virtualNodeStatus_status,
+
+    -- * VirtualNodeTcpConnectionPool
+    VirtualNodeTcpConnectionPool (..),
+    newVirtualNodeTcpConnectionPool,
+    virtualNodeTcpConnectionPool_maxConnections,
+
+    -- * VirtualRouterData
+    VirtualRouterData (..),
+    newVirtualRouterData,
+    virtualRouterData_meshName,
+    virtualRouterData_metadata,
+    virtualRouterData_spec,
+    virtualRouterData_status,
+    virtualRouterData_virtualRouterName,
+
+    -- * VirtualRouterListener
+    VirtualRouterListener (..),
+    newVirtualRouterListener,
+    virtualRouterListener_portMapping,
+
+    -- * VirtualRouterRef
+    VirtualRouterRef (..),
+    newVirtualRouterRef,
+    virtualRouterRef_arn,
+    virtualRouterRef_createdAt,
+    virtualRouterRef_lastUpdatedAt,
+    virtualRouterRef_meshName,
+    virtualRouterRef_meshOwner,
+    virtualRouterRef_resourceOwner,
+    virtualRouterRef_version,
+    virtualRouterRef_virtualRouterName,
+
+    -- * VirtualRouterServiceProvider
+    VirtualRouterServiceProvider (..),
+    newVirtualRouterServiceProvider,
+    virtualRouterServiceProvider_virtualRouterName,
+
+    -- * VirtualRouterSpec
+    VirtualRouterSpec (..),
+    newVirtualRouterSpec,
+    virtualRouterSpec_listeners,
+
+    -- * VirtualRouterStatus
+    VirtualRouterStatus (..),
+    newVirtualRouterStatus,
+    virtualRouterStatus_status,
+
+    -- * VirtualServiceBackend
+    VirtualServiceBackend (..),
+    newVirtualServiceBackend,
+    virtualServiceBackend_clientPolicy,
+    virtualServiceBackend_virtualServiceName,
+
+    -- * VirtualServiceData
+    VirtualServiceData (..),
+    newVirtualServiceData,
+    virtualServiceData_meshName,
+    virtualServiceData_metadata,
+    virtualServiceData_spec,
+    virtualServiceData_status,
+    virtualServiceData_virtualServiceName,
+
+    -- * VirtualServiceProvider
+    VirtualServiceProvider (..),
+    newVirtualServiceProvider,
+    virtualServiceProvider_virtualNode,
+    virtualServiceProvider_virtualRouter,
+
+    -- * VirtualServiceRef
+    VirtualServiceRef (..),
+    newVirtualServiceRef,
+    virtualServiceRef_arn,
+    virtualServiceRef_createdAt,
+    virtualServiceRef_lastUpdatedAt,
+    virtualServiceRef_meshName,
+    virtualServiceRef_meshOwner,
+    virtualServiceRef_resourceOwner,
+    virtualServiceRef_version,
+    virtualServiceRef_virtualServiceName,
+
+    -- * VirtualServiceSpec
+    VirtualServiceSpec (..),
+    newVirtualServiceSpec,
+    virtualServiceSpec_provider,
+
+    -- * VirtualServiceStatus
+    VirtualServiceStatus (..),
+    newVirtualServiceStatus,
+    virtualServiceStatus_status,
+
+    -- * WeightedTarget
+    WeightedTarget (..),
+    newWeightedTarget,
+    weightedTarget_port,
+    weightedTarget_virtualNode,
+    weightedTarget_weight,
+  )
+where
+
+import Amazonka.AppMesh.Types.AccessLog
+import Amazonka.AppMesh.Types.AwsCloudMapInstanceAttribute
+import Amazonka.AppMesh.Types.AwsCloudMapServiceDiscovery
+import Amazonka.AppMesh.Types.Backend
+import Amazonka.AppMesh.Types.BackendDefaults
+import Amazonka.AppMesh.Types.ClientPolicy
+import Amazonka.AppMesh.Types.ClientPolicyTls
+import Amazonka.AppMesh.Types.ClientTlsCertificate
+import Amazonka.AppMesh.Types.DefaultGatewayRouteRewrite
+import Amazonka.AppMesh.Types.DnsResponseType
+import Amazonka.AppMesh.Types.DnsServiceDiscovery
+import Amazonka.AppMesh.Types.Duration
+import Amazonka.AppMesh.Types.DurationUnit
+import Amazonka.AppMesh.Types.EgressFilter
+import Amazonka.AppMesh.Types.EgressFilterType
+import Amazonka.AppMesh.Types.FileAccessLog
+import Amazonka.AppMesh.Types.GatewayRouteData
+import Amazonka.AppMesh.Types.GatewayRouteHostnameMatch
+import Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite
+import Amazonka.AppMesh.Types.GatewayRouteRef
+import Amazonka.AppMesh.Types.GatewayRouteSpec
+import Amazonka.AppMesh.Types.GatewayRouteStatus
+import Amazonka.AppMesh.Types.GatewayRouteStatusCode
+import Amazonka.AppMesh.Types.GatewayRouteTarget
+import Amazonka.AppMesh.Types.GatewayRouteVirtualService
+import Amazonka.AppMesh.Types.GrpcGatewayRoute
+import Amazonka.AppMesh.Types.GrpcGatewayRouteAction
+import Amazonka.AppMesh.Types.GrpcGatewayRouteMatch
+import Amazonka.AppMesh.Types.GrpcGatewayRouteMetadata
+import Amazonka.AppMesh.Types.GrpcGatewayRouteRewrite
+import Amazonka.AppMesh.Types.GrpcMetadataMatchMethod
+import Amazonka.AppMesh.Types.GrpcRetryPolicy
+import Amazonka.AppMesh.Types.GrpcRetryPolicyEvent
+import Amazonka.AppMesh.Types.GrpcRoute
+import Amazonka.AppMesh.Types.GrpcRouteAction
+import Amazonka.AppMesh.Types.GrpcRouteMatch
+import Amazonka.AppMesh.Types.GrpcRouteMetadata
+import Amazonka.AppMesh.Types.GrpcRouteMetadataMatchMethod
+import Amazonka.AppMesh.Types.GrpcTimeout
+import Amazonka.AppMesh.Types.HeaderMatchMethod
+import Amazonka.AppMesh.Types.HealthCheckPolicy
+import Amazonka.AppMesh.Types.HttpGatewayRoute
+import Amazonka.AppMesh.Types.HttpGatewayRouteAction
+import Amazonka.AppMesh.Types.HttpGatewayRouteHeader
+import Amazonka.AppMesh.Types.HttpGatewayRouteMatch
+import Amazonka.AppMesh.Types.HttpGatewayRoutePathRewrite
+import Amazonka.AppMesh.Types.HttpGatewayRoutePrefixRewrite
+import Amazonka.AppMesh.Types.HttpGatewayRouteRewrite
+import Amazonka.AppMesh.Types.HttpMethod
+import Amazonka.AppMesh.Types.HttpPathMatch
+import Amazonka.AppMesh.Types.HttpQueryParameter
+import Amazonka.AppMesh.Types.HttpRetryPolicy
+import Amazonka.AppMesh.Types.HttpRoute
+import Amazonka.AppMesh.Types.HttpRouteAction
+import Amazonka.AppMesh.Types.HttpRouteHeader
+import Amazonka.AppMesh.Types.HttpRouteMatch
+import Amazonka.AppMesh.Types.HttpScheme
+import Amazonka.AppMesh.Types.HttpTimeout
+import Amazonka.AppMesh.Types.IpPreference
+import Amazonka.AppMesh.Types.JsonFormatRef
+import Amazonka.AppMesh.Types.Listener
+import Amazonka.AppMesh.Types.ListenerTimeout
+import Amazonka.AppMesh.Types.ListenerTls
+import Amazonka.AppMesh.Types.ListenerTlsAcmCertificate
+import Amazonka.AppMesh.Types.ListenerTlsCertificate
+import Amazonka.AppMesh.Types.ListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.ListenerTlsMode
+import Amazonka.AppMesh.Types.ListenerTlsSdsCertificate
+import Amazonka.AppMesh.Types.ListenerTlsValidationContext
+import Amazonka.AppMesh.Types.ListenerTlsValidationContextTrust
+import Amazonka.AppMesh.Types.Logging
+import Amazonka.AppMesh.Types.LoggingFormat
+import Amazonka.AppMesh.Types.MatchRange
+import Amazonka.AppMesh.Types.MeshData
+import Amazonka.AppMesh.Types.MeshRef
+import Amazonka.AppMesh.Types.MeshServiceDiscovery
+import Amazonka.AppMesh.Types.MeshSpec
+import Amazonka.AppMesh.Types.MeshStatus
+import Amazonka.AppMesh.Types.MeshStatusCode
+import Amazonka.AppMesh.Types.OutlierDetection
+import Amazonka.AppMesh.Types.PortMapping
+import Amazonka.AppMesh.Types.PortProtocol
+import Amazonka.AppMesh.Types.QueryParameterMatch
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.RouteData
+import Amazonka.AppMesh.Types.RouteRef
+import Amazonka.AppMesh.Types.RouteSpec
+import Amazonka.AppMesh.Types.RouteStatus
+import Amazonka.AppMesh.Types.RouteStatusCode
+import Amazonka.AppMesh.Types.ServiceDiscovery
+import Amazonka.AppMesh.Types.SubjectAlternativeNameMatchers
+import Amazonka.AppMesh.Types.SubjectAlternativeNames
+import Amazonka.AppMesh.Types.TagRef
+import Amazonka.AppMesh.Types.TcpRetryPolicyEvent
+import Amazonka.AppMesh.Types.TcpRoute
+import Amazonka.AppMesh.Types.TcpRouteAction
+import Amazonka.AppMesh.Types.TcpRouteMatch
+import Amazonka.AppMesh.Types.TcpTimeout
+import Amazonka.AppMesh.Types.TlsValidationContext
+import Amazonka.AppMesh.Types.TlsValidationContextAcmTrust
+import Amazonka.AppMesh.Types.TlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.TlsValidationContextSdsTrust
+import Amazonka.AppMesh.Types.TlsValidationContextTrust
+import Amazonka.AppMesh.Types.VirtualGatewayAccessLog
+import Amazonka.AppMesh.Types.VirtualGatewayBackendDefaults
+import Amazonka.AppMesh.Types.VirtualGatewayClientPolicy
+import Amazonka.AppMesh.Types.VirtualGatewayClientPolicyTls
+import Amazonka.AppMesh.Types.VirtualGatewayClientTlsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayData
+import Amazonka.AppMesh.Types.VirtualGatewayFileAccessLog
+import Amazonka.AppMesh.Types.VirtualGatewayGrpcConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHealthCheckPolicy
+import Amazonka.AppMesh.Types.VirtualGatewayHttp2ConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHttpConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayListener
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTls
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsAcmCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsMode
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContext
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContextTrust
+import Amazonka.AppMesh.Types.VirtualGatewayLogging
+import Amazonka.AppMesh.Types.VirtualGatewayPortMapping
+import Amazonka.AppMesh.Types.VirtualGatewayPortProtocol
+import Amazonka.AppMesh.Types.VirtualGatewayRef
+import Amazonka.AppMesh.Types.VirtualGatewaySpec
+import Amazonka.AppMesh.Types.VirtualGatewayStatus
+import Amazonka.AppMesh.Types.VirtualGatewayStatusCode
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContext
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextAcmTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextTrust
+import Amazonka.AppMesh.Types.VirtualNodeConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeData
+import Amazonka.AppMesh.Types.VirtualNodeGrpcConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeHttp2ConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeHttpConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeRef
+import Amazonka.AppMesh.Types.VirtualNodeServiceProvider
+import Amazonka.AppMesh.Types.VirtualNodeSpec
+import Amazonka.AppMesh.Types.VirtualNodeStatus
+import Amazonka.AppMesh.Types.VirtualNodeStatusCode
+import Amazonka.AppMesh.Types.VirtualNodeTcpConnectionPool
+import Amazonka.AppMesh.Types.VirtualRouterData
+import Amazonka.AppMesh.Types.VirtualRouterListener
+import Amazonka.AppMesh.Types.VirtualRouterRef
+import Amazonka.AppMesh.Types.VirtualRouterServiceProvider
+import Amazonka.AppMesh.Types.VirtualRouterSpec
+import Amazonka.AppMesh.Types.VirtualRouterStatus
+import Amazonka.AppMesh.Types.VirtualRouterStatusCode
+import Amazonka.AppMesh.Types.VirtualServiceBackend
+import Amazonka.AppMesh.Types.VirtualServiceData
+import Amazonka.AppMesh.Types.VirtualServiceProvider
+import Amazonka.AppMesh.Types.VirtualServiceRef
+import Amazonka.AppMesh.Types.VirtualServiceSpec
+import Amazonka.AppMesh.Types.VirtualServiceStatus
+import Amazonka.AppMesh.Types.VirtualServiceStatusCode
+import Amazonka.AppMesh.Types.WeightedTarget
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2019-01-25@ of the Amazon App Mesh SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "AppMesh",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "appmesh",
+      Core.signingName = "appmesh",
+      Core.version = "2019-01-25",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "AppMesh",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | The request syntax was malformed. Check your request syntax and try
+-- again.
+_BadRequestException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_BadRequestException =
+  Core._MatchServiceError
+    defaultService
+    "BadRequestException"
+    Prelude.. Core.hasStatus 400
+
+-- | The request contains a client token that was used for a previous update
+-- resource call with different specifications. Try the request again with
+-- a new client token.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | You don\'t have permissions to perform this action.
+_ForbiddenException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ForbiddenException =
+  Core._MatchServiceError
+    defaultService
+    "ForbiddenException"
+    Prelude.. Core.hasStatus 403
+
+-- | The request processing has failed because of an unknown error,
+-- exception, or failure.
+_InternalServerErrorException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerErrorException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerErrorException"
+    Prelude.. Core.hasStatus 500
+
+-- | You have exceeded a service limit for your account. For more
+-- information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/service-quotas.html Service Limits>
+-- in the /App Mesh User Guide/.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+    Prelude.. Core.hasStatus 400
+
+-- | The specified resource doesn\'t exist. Check your request syntax and try
+-- again.
+_NotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "NotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | You can\'t delete the specified resource because it\'s in use or
+-- required by another resource.
+_ResourceInUseException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceInUseException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceInUseException"
+    Prelude.. Core.hasStatus 409
+
+-- | The request has failed due to a temporary failure of the service.
+_ServiceUnavailableException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceUnavailableException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceUnavailableException"
+    Prelude.. Core.hasStatus 503
+
+-- | The maximum request rate permitted by the App Mesh APIs has been
+-- exceeded for your account. For best results, use an increasing or
+-- variable sleep interval between requests.
+_TooManyRequestsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyRequestsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyRequestsException"
+    Prelude.. Core.hasStatus 429
+
+-- | The request exceeds the maximum allowed number of tags allowed per
+-- resource. The current limit is 50 user tags per resource. You must
+-- reduce the number of tags in the request. None of the tags in this
+-- request were applied.
+_TooManyTagsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagsException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/AppMesh/Types/AccessLog.hs b/gen/Amazonka/AppMesh/Types/AccessLog.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/AccessLog.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.AccessLog
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.AccessLog where
+
+import Amazonka.AppMesh.Types.FileAccessLog
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the access logging information for a virtual
+-- node.
+--
+-- /See:/ 'newAccessLog' smart constructor.
+data AccessLog = AccessLog'
+  { -- | The file object to send virtual node access logs to.
+    file :: Prelude.Maybe FileAccessLog
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AccessLog' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'accessLog_file' - The file object to send virtual node access logs to.
+newAccessLog ::
+  AccessLog
+newAccessLog = AccessLog' {file = Prelude.Nothing}
+
+-- | The file object to send virtual node access logs to.
+accessLog_file :: Lens.Lens' AccessLog (Prelude.Maybe FileAccessLog)
+accessLog_file = Lens.lens (\AccessLog' {file} -> file) (\s@AccessLog' {} a -> s {file = a} :: AccessLog)
+
+instance Data.FromJSON AccessLog where
+  parseJSON =
+    Data.withObject
+      "AccessLog"
+      (\x -> AccessLog' Prelude.<$> (x Data..:? "file"))
+
+instance Prelude.Hashable AccessLog where
+  hashWithSalt _salt AccessLog' {..} =
+    _salt `Prelude.hashWithSalt` file
+
+instance Prelude.NFData AccessLog where
+  rnf AccessLog' {..} = Prelude.rnf file
+
+instance Data.ToJSON AccessLog where
+  toJSON AccessLog' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("file" Data..=) Prelude.<$> file]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/AwsCloudMapInstanceAttribute.hs b/gen/Amazonka/AppMesh/Types/AwsCloudMapInstanceAttribute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/AwsCloudMapInstanceAttribute.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.AwsCloudMapInstanceAttribute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.AwsCloudMapInstanceAttribute where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the Cloud Map attribute information for your
+-- virtual node.
+--
+-- Cloud Map is not available in the eu-south-1 Region.
+--
+-- /See:/ 'newAwsCloudMapInstanceAttribute' smart constructor.
+data AwsCloudMapInstanceAttribute = AwsCloudMapInstanceAttribute'
+  { -- | The name of an Cloud Map service instance attribute key. Any Cloud Map
+    -- service instance that contains the specified key and value is returned.
+    key :: Prelude.Text,
+    -- | The value of an Cloud Map service instance attribute key. Any Cloud Map
+    -- service instance that contains the specified key and value is returned.
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AwsCloudMapInstanceAttribute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'awsCloudMapInstanceAttribute_key' - The name of an Cloud Map service instance attribute key. Any Cloud Map
+-- service instance that contains the specified key and value is returned.
+--
+-- 'value', 'awsCloudMapInstanceAttribute_value' - The value of an Cloud Map service instance attribute key. Any Cloud Map
+-- service instance that contains the specified key and value is returned.
+newAwsCloudMapInstanceAttribute ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  AwsCloudMapInstanceAttribute
+newAwsCloudMapInstanceAttribute pKey_ pValue_ =
+  AwsCloudMapInstanceAttribute'
+    { key = pKey_,
+      value = pValue_
+    }
+
+-- | The name of an Cloud Map service instance attribute key. Any Cloud Map
+-- service instance that contains the specified key and value is returned.
+awsCloudMapInstanceAttribute_key :: Lens.Lens' AwsCloudMapInstanceAttribute Prelude.Text
+awsCloudMapInstanceAttribute_key = Lens.lens (\AwsCloudMapInstanceAttribute' {key} -> key) (\s@AwsCloudMapInstanceAttribute' {} a -> s {key = a} :: AwsCloudMapInstanceAttribute)
+
+-- | The value of an Cloud Map service instance attribute key. Any Cloud Map
+-- service instance that contains the specified key and value is returned.
+awsCloudMapInstanceAttribute_value :: Lens.Lens' AwsCloudMapInstanceAttribute Prelude.Text
+awsCloudMapInstanceAttribute_value = Lens.lens (\AwsCloudMapInstanceAttribute' {value} -> value) (\s@AwsCloudMapInstanceAttribute' {} a -> s {value = a} :: AwsCloudMapInstanceAttribute)
+
+instance Data.FromJSON AwsCloudMapInstanceAttribute where
+  parseJSON =
+    Data.withObject
+      "AwsCloudMapInstanceAttribute"
+      ( \x ->
+          AwsCloudMapInstanceAttribute'
+            Prelude.<$> (x Data..: "key")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance
+  Prelude.Hashable
+    AwsCloudMapInstanceAttribute
+  where
+  hashWithSalt _salt AwsCloudMapInstanceAttribute' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData AwsCloudMapInstanceAttribute where
+  rnf AwsCloudMapInstanceAttribute' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON AwsCloudMapInstanceAttribute where
+  toJSON AwsCloudMapInstanceAttribute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("key" Data..= key),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/AwsCloudMapServiceDiscovery.hs b/gen/Amazonka/AppMesh/Types/AwsCloudMapServiceDiscovery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/AwsCloudMapServiceDiscovery.hs
@@ -0,0 +1,146 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.AwsCloudMapServiceDiscovery
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.AwsCloudMapServiceDiscovery where
+
+import Amazonka.AppMesh.Types.AwsCloudMapInstanceAttribute
+import Amazonka.AppMesh.Types.IpPreference
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the Cloud Map service discovery information
+-- for your virtual node.
+--
+-- Cloud Map is not available in the eu-south-1 Region.
+--
+-- /See:/ 'newAwsCloudMapServiceDiscovery' smart constructor.
+data AwsCloudMapServiceDiscovery = AwsCloudMapServiceDiscovery'
+  { -- | A string map that contains attributes with values that you can use to
+    -- filter instances by any custom attribute that you specified when you
+    -- registered the instance. Only instances that match all of the specified
+    -- key\/value pairs will be returned.
+    attributes :: Prelude.Maybe [AwsCloudMapInstanceAttribute],
+    -- | The preferred IP version that this virtual node uses. Setting the IP
+    -- preference on the virtual node only overrides the IP preference set for
+    -- the mesh on this specific node.
+    ipPreference :: Prelude.Maybe IpPreference,
+    -- | The name of the Cloud Map namespace to use.
+    namespaceName :: Prelude.Text,
+    -- | The name of the Cloud Map service to use.
+    serviceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AwsCloudMapServiceDiscovery' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attributes', 'awsCloudMapServiceDiscovery_attributes' - A string map that contains attributes with values that you can use to
+-- filter instances by any custom attribute that you specified when you
+-- registered the instance. Only instances that match all of the specified
+-- key\/value pairs will be returned.
+--
+-- 'ipPreference', 'awsCloudMapServiceDiscovery_ipPreference' - The preferred IP version that this virtual node uses. Setting the IP
+-- preference on the virtual node only overrides the IP preference set for
+-- the mesh on this specific node.
+--
+-- 'namespaceName', 'awsCloudMapServiceDiscovery_namespaceName' - The name of the Cloud Map namespace to use.
+--
+-- 'serviceName', 'awsCloudMapServiceDiscovery_serviceName' - The name of the Cloud Map service to use.
+newAwsCloudMapServiceDiscovery ::
+  -- | 'namespaceName'
+  Prelude.Text ->
+  -- | 'serviceName'
+  Prelude.Text ->
+  AwsCloudMapServiceDiscovery
+newAwsCloudMapServiceDiscovery
+  pNamespaceName_
+  pServiceName_ =
+    AwsCloudMapServiceDiscovery'
+      { attributes =
+          Prelude.Nothing,
+        ipPreference = Prelude.Nothing,
+        namespaceName = pNamespaceName_,
+        serviceName = pServiceName_
+      }
+
+-- | A string map that contains attributes with values that you can use to
+-- filter instances by any custom attribute that you specified when you
+-- registered the instance. Only instances that match all of the specified
+-- key\/value pairs will be returned.
+awsCloudMapServiceDiscovery_attributes :: Lens.Lens' AwsCloudMapServiceDiscovery (Prelude.Maybe [AwsCloudMapInstanceAttribute])
+awsCloudMapServiceDiscovery_attributes = Lens.lens (\AwsCloudMapServiceDiscovery' {attributes} -> attributes) (\s@AwsCloudMapServiceDiscovery' {} a -> s {attributes = a} :: AwsCloudMapServiceDiscovery) Prelude.. Lens.mapping Lens.coerced
+
+-- | The preferred IP version that this virtual node uses. Setting the IP
+-- preference on the virtual node only overrides the IP preference set for
+-- the mesh on this specific node.
+awsCloudMapServiceDiscovery_ipPreference :: Lens.Lens' AwsCloudMapServiceDiscovery (Prelude.Maybe IpPreference)
+awsCloudMapServiceDiscovery_ipPreference = Lens.lens (\AwsCloudMapServiceDiscovery' {ipPreference} -> ipPreference) (\s@AwsCloudMapServiceDiscovery' {} a -> s {ipPreference = a} :: AwsCloudMapServiceDiscovery)
+
+-- | The name of the Cloud Map namespace to use.
+awsCloudMapServiceDiscovery_namespaceName :: Lens.Lens' AwsCloudMapServiceDiscovery Prelude.Text
+awsCloudMapServiceDiscovery_namespaceName = Lens.lens (\AwsCloudMapServiceDiscovery' {namespaceName} -> namespaceName) (\s@AwsCloudMapServiceDiscovery' {} a -> s {namespaceName = a} :: AwsCloudMapServiceDiscovery)
+
+-- | The name of the Cloud Map service to use.
+awsCloudMapServiceDiscovery_serviceName :: Lens.Lens' AwsCloudMapServiceDiscovery Prelude.Text
+awsCloudMapServiceDiscovery_serviceName = Lens.lens (\AwsCloudMapServiceDiscovery' {serviceName} -> serviceName) (\s@AwsCloudMapServiceDiscovery' {} a -> s {serviceName = a} :: AwsCloudMapServiceDiscovery)
+
+instance Data.FromJSON AwsCloudMapServiceDiscovery where
+  parseJSON =
+    Data.withObject
+      "AwsCloudMapServiceDiscovery"
+      ( \x ->
+          AwsCloudMapServiceDiscovery'
+            Prelude.<$> (x Data..:? "attributes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ipPreference")
+            Prelude.<*> (x Data..: "namespaceName")
+            Prelude.<*> (x Data..: "serviceName")
+      )
+
+instance Prelude.Hashable AwsCloudMapServiceDiscovery where
+  hashWithSalt _salt AwsCloudMapServiceDiscovery' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributes
+      `Prelude.hashWithSalt` ipPreference
+      `Prelude.hashWithSalt` namespaceName
+      `Prelude.hashWithSalt` serviceName
+
+instance Prelude.NFData AwsCloudMapServiceDiscovery where
+  rnf AwsCloudMapServiceDiscovery' {..} =
+    Prelude.rnf attributes
+      `Prelude.seq` Prelude.rnf ipPreference
+      `Prelude.seq` Prelude.rnf namespaceName
+      `Prelude.seq` Prelude.rnf serviceName
+
+instance Data.ToJSON AwsCloudMapServiceDiscovery where
+  toJSON AwsCloudMapServiceDiscovery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("attributes" Data..=) Prelude.<$> attributes,
+            ("ipPreference" Data..=) Prelude.<$> ipPreference,
+            Prelude.Just ("namespaceName" Data..= namespaceName),
+            Prelude.Just ("serviceName" Data..= serviceName)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/Backend.hs b/gen/Amazonka/AppMesh/Types/Backend.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/Backend.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.Backend
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.Backend where
+
+import Amazonka.AppMesh.Types.VirtualServiceBackend
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the backends that a virtual node is expected
+-- to send outbound traffic to.
+--
+-- /See:/ 'newBackend' smart constructor.
+data Backend = Backend'
+  { -- | Specifies a virtual service to use as a backend.
+    virtualService :: Prelude.Maybe VirtualServiceBackend
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Backend' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'virtualService', 'backend_virtualService' - Specifies a virtual service to use as a backend.
+newBackend ::
+  Backend
+newBackend =
+  Backend' {virtualService = Prelude.Nothing}
+
+-- | Specifies a virtual service to use as a backend.
+backend_virtualService :: Lens.Lens' Backend (Prelude.Maybe VirtualServiceBackend)
+backend_virtualService = Lens.lens (\Backend' {virtualService} -> virtualService) (\s@Backend' {} a -> s {virtualService = a} :: Backend)
+
+instance Data.FromJSON Backend where
+  parseJSON =
+    Data.withObject
+      "Backend"
+      ( \x ->
+          Backend' Prelude.<$> (x Data..:? "virtualService")
+      )
+
+instance Prelude.Hashable Backend where
+  hashWithSalt _salt Backend' {..} =
+    _salt `Prelude.hashWithSalt` virtualService
+
+instance Prelude.NFData Backend where
+  rnf Backend' {..} = Prelude.rnf virtualService
+
+instance Data.ToJSON Backend where
+  toJSON Backend' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("virtualService" Data..=)
+              Prelude.<$> virtualService
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/BackendDefaults.hs b/gen/Amazonka/AppMesh/Types/BackendDefaults.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/BackendDefaults.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.BackendDefaults
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.BackendDefaults where
+
+import Amazonka.AppMesh.Types.ClientPolicy
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the default properties for a backend.
+--
+-- /See:/ 'newBackendDefaults' smart constructor.
+data BackendDefaults = BackendDefaults'
+  { -- | A reference to an object that represents a client policy.
+    clientPolicy :: Prelude.Maybe ClientPolicy
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BackendDefaults' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientPolicy', 'backendDefaults_clientPolicy' - A reference to an object that represents a client policy.
+newBackendDefaults ::
+  BackendDefaults
+newBackendDefaults =
+  BackendDefaults' {clientPolicy = Prelude.Nothing}
+
+-- | A reference to an object that represents a client policy.
+backendDefaults_clientPolicy :: Lens.Lens' BackendDefaults (Prelude.Maybe ClientPolicy)
+backendDefaults_clientPolicy = Lens.lens (\BackendDefaults' {clientPolicy} -> clientPolicy) (\s@BackendDefaults' {} a -> s {clientPolicy = a} :: BackendDefaults)
+
+instance Data.FromJSON BackendDefaults where
+  parseJSON =
+    Data.withObject
+      "BackendDefaults"
+      ( \x ->
+          BackendDefaults'
+            Prelude.<$> (x Data..:? "clientPolicy")
+      )
+
+instance Prelude.Hashable BackendDefaults where
+  hashWithSalt _salt BackendDefaults' {..} =
+    _salt `Prelude.hashWithSalt` clientPolicy
+
+instance Prelude.NFData BackendDefaults where
+  rnf BackendDefaults' {..} = Prelude.rnf clientPolicy
+
+instance Data.ToJSON BackendDefaults where
+  toJSON BackendDefaults' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientPolicy" Data..=) Prelude.<$> clientPolicy]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ClientPolicy.hs b/gen/Amazonka/AppMesh/Types/ClientPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ClientPolicy.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ClientPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ClientPolicy where
+
+import Amazonka.AppMesh.Types.ClientPolicyTls
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a client policy.
+--
+-- /See:/ 'newClientPolicy' smart constructor.
+data ClientPolicy = ClientPolicy'
+  { -- | A reference to an object that represents a Transport Layer Security
+    -- (TLS) client policy.
+    tls :: Prelude.Maybe ClientPolicyTls
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClientPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tls', 'clientPolicy_tls' - A reference to an object that represents a Transport Layer Security
+-- (TLS) client policy.
+newClientPolicy ::
+  ClientPolicy
+newClientPolicy =
+  ClientPolicy' {tls = Prelude.Nothing}
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) client policy.
+clientPolicy_tls :: Lens.Lens' ClientPolicy (Prelude.Maybe ClientPolicyTls)
+clientPolicy_tls = Lens.lens (\ClientPolicy' {tls} -> tls) (\s@ClientPolicy' {} a -> s {tls = a} :: ClientPolicy)
+
+instance Data.FromJSON ClientPolicy where
+  parseJSON =
+    Data.withObject
+      "ClientPolicy"
+      (\x -> ClientPolicy' Prelude.<$> (x Data..:? "tls"))
+
+instance Prelude.Hashable ClientPolicy where
+  hashWithSalt _salt ClientPolicy' {..} =
+    _salt `Prelude.hashWithSalt` tls
+
+instance Prelude.NFData ClientPolicy where
+  rnf ClientPolicy' {..} = Prelude.rnf tls
+
+instance Data.ToJSON ClientPolicy where
+  toJSON ClientPolicy' {..} =
+    Data.object
+      (Prelude.catMaybes [("tls" Data..=) Prelude.<$> tls])
diff --git a/gen/Amazonka/AppMesh/Types/ClientPolicyTls.hs b/gen/Amazonka/AppMesh/Types/ClientPolicyTls.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ClientPolicyTls.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ClientPolicyTls
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ClientPolicyTls where
+
+import Amazonka.AppMesh.Types.ClientTlsCertificate
+import Amazonka.AppMesh.Types.TlsValidationContext
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) client policy.
+--
+-- /See:/ 'newClientPolicyTls' smart constructor.
+data ClientPolicyTls = ClientPolicyTls'
+  { -- | A reference to an object that represents a client\'s TLS certificate.
+    certificate :: Prelude.Maybe ClientTlsCertificate,
+    -- | Whether the policy is enforced. The default is @True@, if a value isn\'t
+    -- specified.
+    enforce :: Prelude.Maybe Prelude.Bool,
+    -- | One or more ports that the policy is enforced for.
+    ports :: Prelude.Maybe [Prelude.Natural],
+    -- | A reference to an object that represents a TLS validation context.
+    validation :: TlsValidationContext
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClientPolicyTls' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificate', 'clientPolicyTls_certificate' - A reference to an object that represents a client\'s TLS certificate.
+--
+-- 'enforce', 'clientPolicyTls_enforce' - Whether the policy is enforced. The default is @True@, if a value isn\'t
+-- specified.
+--
+-- 'ports', 'clientPolicyTls_ports' - One or more ports that the policy is enforced for.
+--
+-- 'validation', 'clientPolicyTls_validation' - A reference to an object that represents a TLS validation context.
+newClientPolicyTls ::
+  -- | 'validation'
+  TlsValidationContext ->
+  ClientPolicyTls
+newClientPolicyTls pValidation_ =
+  ClientPolicyTls'
+    { certificate = Prelude.Nothing,
+      enforce = Prelude.Nothing,
+      ports = Prelude.Nothing,
+      validation = pValidation_
+    }
+
+-- | A reference to an object that represents a client\'s TLS certificate.
+clientPolicyTls_certificate :: Lens.Lens' ClientPolicyTls (Prelude.Maybe ClientTlsCertificate)
+clientPolicyTls_certificate = Lens.lens (\ClientPolicyTls' {certificate} -> certificate) (\s@ClientPolicyTls' {} a -> s {certificate = a} :: ClientPolicyTls)
+
+-- | Whether the policy is enforced. The default is @True@, if a value isn\'t
+-- specified.
+clientPolicyTls_enforce :: Lens.Lens' ClientPolicyTls (Prelude.Maybe Prelude.Bool)
+clientPolicyTls_enforce = Lens.lens (\ClientPolicyTls' {enforce} -> enforce) (\s@ClientPolicyTls' {} a -> s {enforce = a} :: ClientPolicyTls)
+
+-- | One or more ports that the policy is enforced for.
+clientPolicyTls_ports :: Lens.Lens' ClientPolicyTls (Prelude.Maybe [Prelude.Natural])
+clientPolicyTls_ports = Lens.lens (\ClientPolicyTls' {ports} -> ports) (\s@ClientPolicyTls' {} a -> s {ports = a} :: ClientPolicyTls) Prelude.. Lens.mapping Lens.coerced
+
+-- | A reference to an object that represents a TLS validation context.
+clientPolicyTls_validation :: Lens.Lens' ClientPolicyTls TlsValidationContext
+clientPolicyTls_validation = Lens.lens (\ClientPolicyTls' {validation} -> validation) (\s@ClientPolicyTls' {} a -> s {validation = a} :: ClientPolicyTls)
+
+instance Data.FromJSON ClientPolicyTls where
+  parseJSON =
+    Data.withObject
+      "ClientPolicyTls"
+      ( \x ->
+          ClientPolicyTls'
+            Prelude.<$> (x Data..:? "certificate")
+            Prelude.<*> (x Data..:? "enforce")
+            Prelude.<*> (x Data..:? "ports" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "validation")
+      )
+
+instance Prelude.Hashable ClientPolicyTls where
+  hashWithSalt _salt ClientPolicyTls' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificate
+      `Prelude.hashWithSalt` enforce
+      `Prelude.hashWithSalt` ports
+      `Prelude.hashWithSalt` validation
+
+instance Prelude.NFData ClientPolicyTls where
+  rnf ClientPolicyTls' {..} =
+    Prelude.rnf certificate
+      `Prelude.seq` Prelude.rnf enforce
+      `Prelude.seq` Prelude.rnf ports
+      `Prelude.seq` Prelude.rnf validation
+
+instance Data.ToJSON ClientPolicyTls where
+  toJSON ClientPolicyTls' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("certificate" Data..=) Prelude.<$> certificate,
+            ("enforce" Data..=) Prelude.<$> enforce,
+            ("ports" Data..=) Prelude.<$> ports,
+            Prelude.Just ("validation" Data..= validation)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ClientTlsCertificate.hs b/gen/Amazonka/AppMesh/Types/ClientTlsCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ClientTlsCertificate.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ClientTlsCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ClientTlsCertificate where
+
+import Amazonka.AppMesh.Types.ListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.ListenerTlsSdsCertificate
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the client\'s certificate.
+--
+-- /See:/ 'newClientTlsCertificate' smart constructor.
+data ClientTlsCertificate = ClientTlsCertificate'
+  { -- | An object that represents a local file certificate. The certificate must
+    -- meet specific requirements and you must have proxy authorization
+    -- enabled. For more information, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html Transport Layer Security (TLS)>.
+    file :: Prelude.Maybe ListenerTlsFileCertificate,
+    -- | A reference to an object that represents a client\'s TLS Secret
+    -- Discovery Service certificate.
+    sds :: Prelude.Maybe ListenerTlsSdsCertificate
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClientTlsCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'clientTlsCertificate_file' - An object that represents a local file certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html Transport Layer Security (TLS)>.
+--
+-- 'sds', 'clientTlsCertificate_sds' - A reference to an object that represents a client\'s TLS Secret
+-- Discovery Service certificate.
+newClientTlsCertificate ::
+  ClientTlsCertificate
+newClientTlsCertificate =
+  ClientTlsCertificate'
+    { file = Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | An object that represents a local file certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html Transport Layer Security (TLS)>.
+clientTlsCertificate_file :: Lens.Lens' ClientTlsCertificate (Prelude.Maybe ListenerTlsFileCertificate)
+clientTlsCertificate_file = Lens.lens (\ClientTlsCertificate' {file} -> file) (\s@ClientTlsCertificate' {} a -> s {file = a} :: ClientTlsCertificate)
+
+-- | A reference to an object that represents a client\'s TLS Secret
+-- Discovery Service certificate.
+clientTlsCertificate_sds :: Lens.Lens' ClientTlsCertificate (Prelude.Maybe ListenerTlsSdsCertificate)
+clientTlsCertificate_sds = Lens.lens (\ClientTlsCertificate' {sds} -> sds) (\s@ClientTlsCertificate' {} a -> s {sds = a} :: ClientTlsCertificate)
+
+instance Data.FromJSON ClientTlsCertificate where
+  parseJSON =
+    Data.withObject
+      "ClientTlsCertificate"
+      ( \x ->
+          ClientTlsCertificate'
+            Prelude.<$> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance Prelude.Hashable ClientTlsCertificate where
+  hashWithSalt _salt ClientTlsCertificate' {..} =
+    _salt
+      `Prelude.hashWithSalt` file
+      `Prelude.hashWithSalt` sds
+
+instance Prelude.NFData ClientTlsCertificate where
+  rnf ClientTlsCertificate' {..} =
+    Prelude.rnf file `Prelude.seq` Prelude.rnf sds
+
+instance Data.ToJSON ClientTlsCertificate where
+  toJSON ClientTlsCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/DefaultGatewayRouteRewrite.hs b/gen/Amazonka/AppMesh/Types/DefaultGatewayRouteRewrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/DefaultGatewayRouteRewrite.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.DefaultGatewayRouteRewrite
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.DefaultGatewayRouteRewrite
+  ( DefaultGatewayRouteRewrite
+      ( ..,
+        DefaultGatewayRouteRewrite_DISABLED,
+        DefaultGatewayRouteRewrite_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DefaultGatewayRouteRewrite = DefaultGatewayRouteRewrite'
+  { fromDefaultGatewayRouteRewrite ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DefaultGatewayRouteRewrite_DISABLED :: DefaultGatewayRouteRewrite
+pattern DefaultGatewayRouteRewrite_DISABLED = DefaultGatewayRouteRewrite' "DISABLED"
+
+pattern DefaultGatewayRouteRewrite_ENABLED :: DefaultGatewayRouteRewrite
+pattern DefaultGatewayRouteRewrite_ENABLED = DefaultGatewayRouteRewrite' "ENABLED"
+
+{-# COMPLETE
+  DefaultGatewayRouteRewrite_DISABLED,
+  DefaultGatewayRouteRewrite_ENABLED,
+  DefaultGatewayRouteRewrite'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/DnsResponseType.hs b/gen/Amazonka/AppMesh/Types/DnsResponseType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/DnsResponseType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.DnsResponseType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.DnsResponseType
+  ( DnsResponseType
+      ( ..,
+        DnsResponseType_ENDPOINTS,
+        DnsResponseType_LOADBALANCER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DnsResponseType = DnsResponseType'
+  { fromDnsResponseType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DnsResponseType_ENDPOINTS :: DnsResponseType
+pattern DnsResponseType_ENDPOINTS = DnsResponseType' "ENDPOINTS"
+
+pattern DnsResponseType_LOADBALANCER :: DnsResponseType
+pattern DnsResponseType_LOADBALANCER = DnsResponseType' "LOADBALANCER"
+
+{-# COMPLETE
+  DnsResponseType_ENDPOINTS,
+  DnsResponseType_LOADBALANCER,
+  DnsResponseType'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/DnsServiceDiscovery.hs b/gen/Amazonka/AppMesh/Types/DnsServiceDiscovery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/DnsServiceDiscovery.hs
@@ -0,0 +1,118 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.DnsServiceDiscovery
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.DnsServiceDiscovery where
+
+import Amazonka.AppMesh.Types.DnsResponseType
+import Amazonka.AppMesh.Types.IpPreference
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the DNS service discovery information for your
+-- virtual node.
+--
+-- /See:/ 'newDnsServiceDiscovery' smart constructor.
+data DnsServiceDiscovery = DnsServiceDiscovery'
+  { -- | The preferred IP version that this virtual node uses. Setting the IP
+    -- preference on the virtual node only overrides the IP preference set for
+    -- the mesh on this specific node.
+    ipPreference :: Prelude.Maybe IpPreference,
+    -- | Specifies the DNS response type for the virtual node.
+    responseType :: Prelude.Maybe DnsResponseType,
+    -- | Specifies the DNS service discovery hostname for the virtual node.
+    hostname :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DnsServiceDiscovery' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ipPreference', 'dnsServiceDiscovery_ipPreference' - The preferred IP version that this virtual node uses. Setting the IP
+-- preference on the virtual node only overrides the IP preference set for
+-- the mesh on this specific node.
+--
+-- 'responseType', 'dnsServiceDiscovery_responseType' - Specifies the DNS response type for the virtual node.
+--
+-- 'hostname', 'dnsServiceDiscovery_hostname' - Specifies the DNS service discovery hostname for the virtual node.
+newDnsServiceDiscovery ::
+  -- | 'hostname'
+  Prelude.Text ->
+  DnsServiceDiscovery
+newDnsServiceDiscovery pHostname_ =
+  DnsServiceDiscovery'
+    { ipPreference =
+        Prelude.Nothing,
+      responseType = Prelude.Nothing,
+      hostname = pHostname_
+    }
+
+-- | The preferred IP version that this virtual node uses. Setting the IP
+-- preference on the virtual node only overrides the IP preference set for
+-- the mesh on this specific node.
+dnsServiceDiscovery_ipPreference :: Lens.Lens' DnsServiceDiscovery (Prelude.Maybe IpPreference)
+dnsServiceDiscovery_ipPreference = Lens.lens (\DnsServiceDiscovery' {ipPreference} -> ipPreference) (\s@DnsServiceDiscovery' {} a -> s {ipPreference = a} :: DnsServiceDiscovery)
+
+-- | Specifies the DNS response type for the virtual node.
+dnsServiceDiscovery_responseType :: Lens.Lens' DnsServiceDiscovery (Prelude.Maybe DnsResponseType)
+dnsServiceDiscovery_responseType = Lens.lens (\DnsServiceDiscovery' {responseType} -> responseType) (\s@DnsServiceDiscovery' {} a -> s {responseType = a} :: DnsServiceDiscovery)
+
+-- | Specifies the DNS service discovery hostname for the virtual node.
+dnsServiceDiscovery_hostname :: Lens.Lens' DnsServiceDiscovery Prelude.Text
+dnsServiceDiscovery_hostname = Lens.lens (\DnsServiceDiscovery' {hostname} -> hostname) (\s@DnsServiceDiscovery' {} a -> s {hostname = a} :: DnsServiceDiscovery)
+
+instance Data.FromJSON DnsServiceDiscovery where
+  parseJSON =
+    Data.withObject
+      "DnsServiceDiscovery"
+      ( \x ->
+          DnsServiceDiscovery'
+            Prelude.<$> (x Data..:? "ipPreference")
+            Prelude.<*> (x Data..:? "responseType")
+            Prelude.<*> (x Data..: "hostname")
+      )
+
+instance Prelude.Hashable DnsServiceDiscovery where
+  hashWithSalt _salt DnsServiceDiscovery' {..} =
+    _salt
+      `Prelude.hashWithSalt` ipPreference
+      `Prelude.hashWithSalt` responseType
+      `Prelude.hashWithSalt` hostname
+
+instance Prelude.NFData DnsServiceDiscovery where
+  rnf DnsServiceDiscovery' {..} =
+    Prelude.rnf ipPreference
+      `Prelude.seq` Prelude.rnf responseType
+      `Prelude.seq` Prelude.rnf hostname
+
+instance Data.ToJSON DnsServiceDiscovery where
+  toJSON DnsServiceDiscovery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ipPreference" Data..=) Prelude.<$> ipPreference,
+            ("responseType" Data..=) Prelude.<$> responseType,
+            Prelude.Just ("hostname" Data..= hostname)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/Duration.hs b/gen/Amazonka/AppMesh/Types/Duration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/Duration.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.Duration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.Duration where
+
+import Amazonka.AppMesh.Types.DurationUnit
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a duration of time.
+--
+-- /See:/ 'newDuration' smart constructor.
+data Duration = Duration'
+  { -- | A unit of time.
+    unit :: Prelude.Maybe DurationUnit,
+    -- | A number of time units.
+    value :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Duration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'unit', 'duration_unit' - A unit of time.
+--
+-- 'value', 'duration_value' - A number of time units.
+newDuration ::
+  Duration
+newDuration =
+  Duration'
+    { unit = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | A unit of time.
+duration_unit :: Lens.Lens' Duration (Prelude.Maybe DurationUnit)
+duration_unit = Lens.lens (\Duration' {unit} -> unit) (\s@Duration' {} a -> s {unit = a} :: Duration)
+
+-- | A number of time units.
+duration_value :: Lens.Lens' Duration (Prelude.Maybe Prelude.Natural)
+duration_value = Lens.lens (\Duration' {value} -> value) (\s@Duration' {} a -> s {value = a} :: Duration)
+
+instance Data.FromJSON Duration where
+  parseJSON =
+    Data.withObject
+      "Duration"
+      ( \x ->
+          Duration'
+            Prelude.<$> (x Data..:? "unit")
+            Prelude.<*> (x Data..:? "value")
+      )
+
+instance Prelude.Hashable Duration where
+  hashWithSalt _salt Duration' {..} =
+    _salt
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Duration where
+  rnf Duration' {..} =
+    Prelude.rnf unit `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Duration where
+  toJSON Duration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("unit" Data..=) Prelude.<$> unit,
+            ("value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/DurationUnit.hs b/gen/Amazonka/AppMesh/Types/DurationUnit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/DurationUnit.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.DurationUnit
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.DurationUnit
+  ( DurationUnit
+      ( ..,
+        DurationUnit_Ms,
+        DurationUnit_S
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DurationUnit = DurationUnit'
+  { fromDurationUnit ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DurationUnit_Ms :: DurationUnit
+pattern DurationUnit_Ms = DurationUnit' "ms"
+
+pattern DurationUnit_S :: DurationUnit
+pattern DurationUnit_S = DurationUnit' "s"
+
+{-# COMPLETE
+  DurationUnit_Ms,
+  DurationUnit_S,
+  DurationUnit'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/EgressFilter.hs b/gen/Amazonka/AppMesh/Types/EgressFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/EgressFilter.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.EgressFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.EgressFilter where
+
+import Amazonka.AppMesh.Types.EgressFilterType
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the egress filter rules for a service mesh.
+--
+-- /See:/ 'newEgressFilter' smart constructor.
+data EgressFilter = EgressFilter'
+  { -- | The egress filter type. By default, the type is @DROP_ALL@, which allows
+    -- egress only from virtual nodes to other defined resources in the service
+    -- mesh (and any traffic to @*.amazonaws.com@ for Amazon Web Services API
+    -- calls). You can set the egress filter type to @ALLOW_ALL@ to allow
+    -- egress to any endpoint inside or outside of the service mesh.
+    type' :: EgressFilterType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EgressFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'type'', 'egressFilter_type' - The egress filter type. By default, the type is @DROP_ALL@, which allows
+-- egress only from virtual nodes to other defined resources in the service
+-- mesh (and any traffic to @*.amazonaws.com@ for Amazon Web Services API
+-- calls). You can set the egress filter type to @ALLOW_ALL@ to allow
+-- egress to any endpoint inside or outside of the service mesh.
+newEgressFilter ::
+  -- | 'type''
+  EgressFilterType ->
+  EgressFilter
+newEgressFilter pType_ =
+  EgressFilter' {type' = pType_}
+
+-- | The egress filter type. By default, the type is @DROP_ALL@, which allows
+-- egress only from virtual nodes to other defined resources in the service
+-- mesh (and any traffic to @*.amazonaws.com@ for Amazon Web Services API
+-- calls). You can set the egress filter type to @ALLOW_ALL@ to allow
+-- egress to any endpoint inside or outside of the service mesh.
+egressFilter_type :: Lens.Lens' EgressFilter EgressFilterType
+egressFilter_type = Lens.lens (\EgressFilter' {type'} -> type') (\s@EgressFilter' {} a -> s {type' = a} :: EgressFilter)
+
+instance Data.FromJSON EgressFilter where
+  parseJSON =
+    Data.withObject
+      "EgressFilter"
+      (\x -> EgressFilter' Prelude.<$> (x Data..: "type"))
+
+instance Prelude.Hashable EgressFilter where
+  hashWithSalt _salt EgressFilter' {..} =
+    _salt `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData EgressFilter where
+  rnf EgressFilter' {..} = Prelude.rnf type'
+
+instance Data.ToJSON EgressFilter where
+  toJSON EgressFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("type" Data..= type')]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/EgressFilterType.hs b/gen/Amazonka/AppMesh/Types/EgressFilterType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/EgressFilterType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.EgressFilterType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.EgressFilterType
+  ( EgressFilterType
+      ( ..,
+        EgressFilterType_ALLOW_ALL,
+        EgressFilterType_DROP_ALL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EgressFilterType = EgressFilterType'
+  { fromEgressFilterType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern EgressFilterType_ALLOW_ALL :: EgressFilterType
+pattern EgressFilterType_ALLOW_ALL = EgressFilterType' "ALLOW_ALL"
+
+pattern EgressFilterType_DROP_ALL :: EgressFilterType
+pattern EgressFilterType_DROP_ALL = EgressFilterType' "DROP_ALL"
+
+{-# COMPLETE
+  EgressFilterType_ALLOW_ALL,
+  EgressFilterType_DROP_ALL,
+  EgressFilterType'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/FileAccessLog.hs b/gen/Amazonka/AppMesh/Types/FileAccessLog.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/FileAccessLog.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.FileAccessLog
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.FileAccessLog where
+
+import Amazonka.AppMesh.Types.LoggingFormat
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents an access log file.
+--
+-- /See:/ 'newFileAccessLog' smart constructor.
+data FileAccessLog = FileAccessLog'
+  { -- | The specified format for the logs. The format is either @json_format@ or
+    -- @text_format@.
+    format :: Prelude.Maybe LoggingFormat,
+    -- | The file path to write access logs to. You can use @\/dev\/stdout@ to
+    -- send access logs to standard out and configure your Envoy container to
+    -- use a log driver, such as @awslogs@, to export the access logs to a log
+    -- storage service such as Amazon CloudWatch Logs. You can also specify a
+    -- path in the Envoy container\'s file system to write the files to disk.
+    --
+    -- >  <note> <p>The Envoy process must have write permissions to the path that you specify here. Otherwise, Envoy fails to bootstrap properly.</p> </note>
+    path :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FileAccessLog' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'format', 'fileAccessLog_format' - The specified format for the logs. The format is either @json_format@ or
+-- @text_format@.
+--
+-- 'path', 'fileAccessLog_path' - The file path to write access logs to. You can use @\/dev\/stdout@ to
+-- send access logs to standard out and configure your Envoy container to
+-- use a log driver, such as @awslogs@, to export the access logs to a log
+-- storage service such as Amazon CloudWatch Logs. You can also specify a
+-- path in the Envoy container\'s file system to write the files to disk.
+--
+-- >  <note> <p>The Envoy process must have write permissions to the path that you specify here. Otherwise, Envoy fails to bootstrap properly.</p> </note>
+newFileAccessLog ::
+  -- | 'path'
+  Prelude.Text ->
+  FileAccessLog
+newFileAccessLog pPath_ =
+  FileAccessLog'
+    { format = Prelude.Nothing,
+      path = pPath_
+    }
+
+-- | The specified format for the logs. The format is either @json_format@ or
+-- @text_format@.
+fileAccessLog_format :: Lens.Lens' FileAccessLog (Prelude.Maybe LoggingFormat)
+fileAccessLog_format = Lens.lens (\FileAccessLog' {format} -> format) (\s@FileAccessLog' {} a -> s {format = a} :: FileAccessLog)
+
+-- | The file path to write access logs to. You can use @\/dev\/stdout@ to
+-- send access logs to standard out and configure your Envoy container to
+-- use a log driver, such as @awslogs@, to export the access logs to a log
+-- storage service such as Amazon CloudWatch Logs. You can also specify a
+-- path in the Envoy container\'s file system to write the files to disk.
+--
+-- >  <note> <p>The Envoy process must have write permissions to the path that you specify here. Otherwise, Envoy fails to bootstrap properly.</p> </note>
+fileAccessLog_path :: Lens.Lens' FileAccessLog Prelude.Text
+fileAccessLog_path = Lens.lens (\FileAccessLog' {path} -> path) (\s@FileAccessLog' {} a -> s {path = a} :: FileAccessLog)
+
+instance Data.FromJSON FileAccessLog where
+  parseJSON =
+    Data.withObject
+      "FileAccessLog"
+      ( \x ->
+          FileAccessLog'
+            Prelude.<$> (x Data..:? "format")
+            Prelude.<*> (x Data..: "path")
+      )
+
+instance Prelude.Hashable FileAccessLog where
+  hashWithSalt _salt FileAccessLog' {..} =
+    _salt
+      `Prelude.hashWithSalt` format
+      `Prelude.hashWithSalt` path
+
+instance Prelude.NFData FileAccessLog where
+  rnf FileAccessLog' {..} =
+    Prelude.rnf format `Prelude.seq` Prelude.rnf path
+
+instance Data.ToJSON FileAccessLog where
+  toJSON FileAccessLog' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("format" Data..=) Prelude.<$> format,
+            Prelude.Just ("path" Data..= path)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteData.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteData.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteData where
+
+import Amazonka.AppMesh.Types.GatewayRouteSpec
+import Amazonka.AppMesh.Types.GatewayRouteStatus
+import Amazonka.AppMesh.Types.ResourceMetadata
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a gateway route returned by a describe
+-- operation.
+--
+-- /See:/ 'newGatewayRouteData' smart constructor.
+data GatewayRouteData = GatewayRouteData'
+  { -- | The name of the gateway route.
+    gatewayRouteName :: Prelude.Text,
+    -- | The name of the service mesh that the resource resides in.
+    meshName :: Prelude.Text,
+    metadata :: ResourceMetadata,
+    -- | The specifications of the gateway route.
+    spec :: GatewayRouteSpec,
+    -- | The status of the gateway route.
+    status :: GatewayRouteStatus,
+    -- | The virtual gateway that the gateway route is associated with.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayRouteName', 'gatewayRouteData_gatewayRouteName' - The name of the gateway route.
+--
+-- 'meshName', 'gatewayRouteData_meshName' - The name of the service mesh that the resource resides in.
+--
+-- 'metadata', 'gatewayRouteData_metadata' - Undocumented member.
+--
+-- 'spec', 'gatewayRouteData_spec' - The specifications of the gateway route.
+--
+-- 'status', 'gatewayRouteData_status' - The status of the gateway route.
+--
+-- 'virtualGatewayName', 'gatewayRouteData_virtualGatewayName' - The virtual gateway that the gateway route is associated with.
+newGatewayRouteData ::
+  -- | 'gatewayRouteName'
+  Prelude.Text ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'spec'
+  GatewayRouteSpec ->
+  -- | 'status'
+  GatewayRouteStatus ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  GatewayRouteData
+newGatewayRouteData
+  pGatewayRouteName_
+  pMeshName_
+  pMetadata_
+  pSpec_
+  pStatus_
+  pVirtualGatewayName_ =
+    GatewayRouteData'
+      { gatewayRouteName =
+          pGatewayRouteName_,
+        meshName = pMeshName_,
+        metadata = pMetadata_,
+        spec = pSpec_,
+        status = pStatus_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The name of the gateway route.
+gatewayRouteData_gatewayRouteName :: Lens.Lens' GatewayRouteData Prelude.Text
+gatewayRouteData_gatewayRouteName = Lens.lens (\GatewayRouteData' {gatewayRouteName} -> gatewayRouteName) (\s@GatewayRouteData' {} a -> s {gatewayRouteName = a} :: GatewayRouteData)
+
+-- | The name of the service mesh that the resource resides in.
+gatewayRouteData_meshName :: Lens.Lens' GatewayRouteData Prelude.Text
+gatewayRouteData_meshName = Lens.lens (\GatewayRouteData' {meshName} -> meshName) (\s@GatewayRouteData' {} a -> s {meshName = a} :: GatewayRouteData)
+
+-- | Undocumented member.
+gatewayRouteData_metadata :: Lens.Lens' GatewayRouteData ResourceMetadata
+gatewayRouteData_metadata = Lens.lens (\GatewayRouteData' {metadata} -> metadata) (\s@GatewayRouteData' {} a -> s {metadata = a} :: GatewayRouteData)
+
+-- | The specifications of the gateway route.
+gatewayRouteData_spec :: Lens.Lens' GatewayRouteData GatewayRouteSpec
+gatewayRouteData_spec = Lens.lens (\GatewayRouteData' {spec} -> spec) (\s@GatewayRouteData' {} a -> s {spec = a} :: GatewayRouteData)
+
+-- | The status of the gateway route.
+gatewayRouteData_status :: Lens.Lens' GatewayRouteData GatewayRouteStatus
+gatewayRouteData_status = Lens.lens (\GatewayRouteData' {status} -> status) (\s@GatewayRouteData' {} a -> s {status = a} :: GatewayRouteData)
+
+-- | The virtual gateway that the gateway route is associated with.
+gatewayRouteData_virtualGatewayName :: Lens.Lens' GatewayRouteData Prelude.Text
+gatewayRouteData_virtualGatewayName = Lens.lens (\GatewayRouteData' {virtualGatewayName} -> virtualGatewayName) (\s@GatewayRouteData' {} a -> s {virtualGatewayName = a} :: GatewayRouteData)
+
+instance Data.FromJSON GatewayRouteData where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteData"
+      ( \x ->
+          GatewayRouteData'
+            Prelude.<$> (x Data..: "gatewayRouteName")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "virtualGatewayName")
+      )
+
+instance Prelude.Hashable GatewayRouteData where
+  hashWithSalt _salt GatewayRouteData' {..} =
+    _salt
+      `Prelude.hashWithSalt` gatewayRouteName
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData GatewayRouteData where
+  rnf GatewayRouteData' {..} =
+    Prelude.rnf gatewayRouteName
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf virtualGatewayName
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteHostnameMatch.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteHostnameMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteHostnameMatch.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteHostnameMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteHostnameMatch where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the gateway route host name to match.
+--
+-- /See:/ 'newGatewayRouteHostnameMatch' smart constructor.
+data GatewayRouteHostnameMatch = GatewayRouteHostnameMatch'
+  { -- | The exact host name to match on.
+    exact :: Prelude.Maybe Prelude.Text,
+    -- | The specified ending characters of the host name to match on.
+    suffix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteHostnameMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'gatewayRouteHostnameMatch_exact' - The exact host name to match on.
+--
+-- 'suffix', 'gatewayRouteHostnameMatch_suffix' - The specified ending characters of the host name to match on.
+newGatewayRouteHostnameMatch ::
+  GatewayRouteHostnameMatch
+newGatewayRouteHostnameMatch =
+  GatewayRouteHostnameMatch'
+    { exact = Prelude.Nothing,
+      suffix = Prelude.Nothing
+    }
+
+-- | The exact host name to match on.
+gatewayRouteHostnameMatch_exact :: Lens.Lens' GatewayRouteHostnameMatch (Prelude.Maybe Prelude.Text)
+gatewayRouteHostnameMatch_exact = Lens.lens (\GatewayRouteHostnameMatch' {exact} -> exact) (\s@GatewayRouteHostnameMatch' {} a -> s {exact = a} :: GatewayRouteHostnameMatch)
+
+-- | The specified ending characters of the host name to match on.
+gatewayRouteHostnameMatch_suffix :: Lens.Lens' GatewayRouteHostnameMatch (Prelude.Maybe Prelude.Text)
+gatewayRouteHostnameMatch_suffix = Lens.lens (\GatewayRouteHostnameMatch' {suffix} -> suffix) (\s@GatewayRouteHostnameMatch' {} a -> s {suffix = a} :: GatewayRouteHostnameMatch)
+
+instance Data.FromJSON GatewayRouteHostnameMatch where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteHostnameMatch"
+      ( \x ->
+          GatewayRouteHostnameMatch'
+            Prelude.<$> (x Data..:? "exact")
+            Prelude.<*> (x Data..:? "suffix")
+      )
+
+instance Prelude.Hashable GatewayRouteHostnameMatch where
+  hashWithSalt _salt GatewayRouteHostnameMatch' {..} =
+    _salt
+      `Prelude.hashWithSalt` exact
+      `Prelude.hashWithSalt` suffix
+
+instance Prelude.NFData GatewayRouteHostnameMatch where
+  rnf GatewayRouteHostnameMatch' {..} =
+    Prelude.rnf exact `Prelude.seq` Prelude.rnf suffix
+
+instance Data.ToJSON GatewayRouteHostnameMatch where
+  toJSON GatewayRouteHostnameMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("exact" Data..=) Prelude.<$> exact,
+            ("suffix" Data..=) Prelude.<$> suffix
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteHostnameRewrite.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteHostnameRewrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteHostnameRewrite.hs
@@ -0,0 +1,82 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite where
+
+import Amazonka.AppMesh.Types.DefaultGatewayRouteRewrite
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the gateway route host name to rewrite.
+--
+-- /See:/ 'newGatewayRouteHostnameRewrite' smart constructor.
+data GatewayRouteHostnameRewrite = GatewayRouteHostnameRewrite'
+  { -- | The default target host name to write to.
+    defaultTargetHostname :: Prelude.Maybe DefaultGatewayRouteRewrite
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteHostnameRewrite' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'defaultTargetHostname', 'gatewayRouteHostnameRewrite_defaultTargetHostname' - The default target host name to write to.
+newGatewayRouteHostnameRewrite ::
+  GatewayRouteHostnameRewrite
+newGatewayRouteHostnameRewrite =
+  GatewayRouteHostnameRewrite'
+    { defaultTargetHostname =
+        Prelude.Nothing
+    }
+
+-- | The default target host name to write to.
+gatewayRouteHostnameRewrite_defaultTargetHostname :: Lens.Lens' GatewayRouteHostnameRewrite (Prelude.Maybe DefaultGatewayRouteRewrite)
+gatewayRouteHostnameRewrite_defaultTargetHostname = Lens.lens (\GatewayRouteHostnameRewrite' {defaultTargetHostname} -> defaultTargetHostname) (\s@GatewayRouteHostnameRewrite' {} a -> s {defaultTargetHostname = a} :: GatewayRouteHostnameRewrite)
+
+instance Data.FromJSON GatewayRouteHostnameRewrite where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteHostnameRewrite"
+      ( \x ->
+          GatewayRouteHostnameRewrite'
+            Prelude.<$> (x Data..:? "defaultTargetHostname")
+      )
+
+instance Prelude.Hashable GatewayRouteHostnameRewrite where
+  hashWithSalt _salt GatewayRouteHostnameRewrite' {..} =
+    _salt `Prelude.hashWithSalt` defaultTargetHostname
+
+instance Prelude.NFData GatewayRouteHostnameRewrite where
+  rnf GatewayRouteHostnameRewrite' {..} =
+    Prelude.rnf defaultTargetHostname
+
+instance Data.ToJSON GatewayRouteHostnameRewrite where
+  toJSON GatewayRouteHostnameRewrite' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("defaultTargetHostname" Data..=)
+              Prelude.<$> defaultTargetHostname
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteRef.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteRef.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a gateway route returned by a list operation.
+--
+-- /See:/ 'newGatewayRouteRef' smart constructor.
+data GatewayRouteRef = GatewayRouteRef'
+  { -- | The full Amazon Resource Name (ARN) for the gateway route.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The name of the gateway route.
+    gatewayRouteName :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh that the resource resides in.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer,
+    -- | The virtual gateway that the gateway route is associated with.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'gatewayRouteRef_arn' - The full Amazon Resource Name (ARN) for the gateway route.
+--
+-- 'createdAt', 'gatewayRouteRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'gatewayRouteName', 'gatewayRouteRef_gatewayRouteName' - The name of the gateway route.
+--
+-- 'lastUpdatedAt', 'gatewayRouteRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'gatewayRouteRef_meshName' - The name of the service mesh that the resource resides in.
+--
+-- 'meshOwner', 'gatewayRouteRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'gatewayRouteRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'version', 'gatewayRouteRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+--
+-- 'virtualGatewayName', 'gatewayRouteRef_virtualGatewayName' - The virtual gateway that the gateway route is associated with.
+newGatewayRouteRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'gatewayRouteName'
+  Prelude.Text ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  GatewayRouteRef
+newGatewayRouteRef
+  pArn_
+  pCreatedAt_
+  pGatewayRouteName_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pVersion_
+  pVirtualGatewayName_ =
+    GatewayRouteRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        gatewayRouteName = pGatewayRouteName_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        version = pVersion_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the gateway route.
+gatewayRouteRef_arn :: Lens.Lens' GatewayRouteRef Prelude.Text
+gatewayRouteRef_arn = Lens.lens (\GatewayRouteRef' {arn} -> arn) (\s@GatewayRouteRef' {} a -> s {arn = a} :: GatewayRouteRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+gatewayRouteRef_createdAt :: Lens.Lens' GatewayRouteRef Prelude.UTCTime
+gatewayRouteRef_createdAt = Lens.lens (\GatewayRouteRef' {createdAt} -> createdAt) (\s@GatewayRouteRef' {} a -> s {createdAt = a} :: GatewayRouteRef) Prelude.. Data._Time
+
+-- | The name of the gateway route.
+gatewayRouteRef_gatewayRouteName :: Lens.Lens' GatewayRouteRef Prelude.Text
+gatewayRouteRef_gatewayRouteName = Lens.lens (\GatewayRouteRef' {gatewayRouteName} -> gatewayRouteName) (\s@GatewayRouteRef' {} a -> s {gatewayRouteName = a} :: GatewayRouteRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+gatewayRouteRef_lastUpdatedAt :: Lens.Lens' GatewayRouteRef Prelude.UTCTime
+gatewayRouteRef_lastUpdatedAt = Lens.lens (\GatewayRouteRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@GatewayRouteRef' {} a -> s {lastUpdatedAt = a} :: GatewayRouteRef) Prelude.. Data._Time
+
+-- | The name of the service mesh that the resource resides in.
+gatewayRouteRef_meshName :: Lens.Lens' GatewayRouteRef Prelude.Text
+gatewayRouteRef_meshName = Lens.lens (\GatewayRouteRef' {meshName} -> meshName) (\s@GatewayRouteRef' {} a -> s {meshName = a} :: GatewayRouteRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+gatewayRouteRef_meshOwner :: Lens.Lens' GatewayRouteRef Prelude.Text
+gatewayRouteRef_meshOwner = Lens.lens (\GatewayRouteRef' {meshOwner} -> meshOwner) (\s@GatewayRouteRef' {} a -> s {meshOwner = a} :: GatewayRouteRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+gatewayRouteRef_resourceOwner :: Lens.Lens' GatewayRouteRef Prelude.Text
+gatewayRouteRef_resourceOwner = Lens.lens (\GatewayRouteRef' {resourceOwner} -> resourceOwner) (\s@GatewayRouteRef' {} a -> s {resourceOwner = a} :: GatewayRouteRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+gatewayRouteRef_version :: Lens.Lens' GatewayRouteRef Prelude.Integer
+gatewayRouteRef_version = Lens.lens (\GatewayRouteRef' {version} -> version) (\s@GatewayRouteRef' {} a -> s {version = a} :: GatewayRouteRef)
+
+-- | The virtual gateway that the gateway route is associated with.
+gatewayRouteRef_virtualGatewayName :: Lens.Lens' GatewayRouteRef Prelude.Text
+gatewayRouteRef_virtualGatewayName = Lens.lens (\GatewayRouteRef' {virtualGatewayName} -> virtualGatewayName) (\s@GatewayRouteRef' {} a -> s {virtualGatewayName = a} :: GatewayRouteRef)
+
+instance Data.FromJSON GatewayRouteRef where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteRef"
+      ( \x ->
+          GatewayRouteRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "gatewayRouteName")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "version")
+            Prelude.<*> (x Data..: "virtualGatewayName")
+      )
+
+instance Prelude.Hashable GatewayRouteRef where
+  hashWithSalt _salt GatewayRouteRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` gatewayRouteName
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` version
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData GatewayRouteRef where
+  rnf GatewayRouteRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf gatewayRouteName
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf virtualGatewayName
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteSpec.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteSpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteSpec.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteSpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteSpec where
+
+import Amazonka.AppMesh.Types.GrpcGatewayRoute
+import Amazonka.AppMesh.Types.HttpGatewayRoute
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a gateway route specification. Specify one
+-- gateway route type.
+--
+-- /See:/ 'newGatewayRouteSpec' smart constructor.
+data GatewayRouteSpec = GatewayRouteSpec'
+  { -- | An object that represents the specification of a gRPC gateway route.
+    grpcRoute :: Prelude.Maybe GrpcGatewayRoute,
+    -- | An object that represents the specification of an HTTP\/2 gateway route.
+    http2Route :: Prelude.Maybe HttpGatewayRoute,
+    -- | An object that represents the specification of an HTTP gateway route.
+    httpRoute :: Prelude.Maybe HttpGatewayRoute,
+    -- | The ordering of the gateway routes spec.
+    priority :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteSpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'grpcRoute', 'gatewayRouteSpec_grpcRoute' - An object that represents the specification of a gRPC gateway route.
+--
+-- 'http2Route', 'gatewayRouteSpec_http2Route' - An object that represents the specification of an HTTP\/2 gateway route.
+--
+-- 'httpRoute', 'gatewayRouteSpec_httpRoute' - An object that represents the specification of an HTTP gateway route.
+--
+-- 'priority', 'gatewayRouteSpec_priority' - The ordering of the gateway routes spec.
+newGatewayRouteSpec ::
+  GatewayRouteSpec
+newGatewayRouteSpec =
+  GatewayRouteSpec'
+    { grpcRoute = Prelude.Nothing,
+      http2Route = Prelude.Nothing,
+      httpRoute = Prelude.Nothing,
+      priority = Prelude.Nothing
+    }
+
+-- | An object that represents the specification of a gRPC gateway route.
+gatewayRouteSpec_grpcRoute :: Lens.Lens' GatewayRouteSpec (Prelude.Maybe GrpcGatewayRoute)
+gatewayRouteSpec_grpcRoute = Lens.lens (\GatewayRouteSpec' {grpcRoute} -> grpcRoute) (\s@GatewayRouteSpec' {} a -> s {grpcRoute = a} :: GatewayRouteSpec)
+
+-- | An object that represents the specification of an HTTP\/2 gateway route.
+gatewayRouteSpec_http2Route :: Lens.Lens' GatewayRouteSpec (Prelude.Maybe HttpGatewayRoute)
+gatewayRouteSpec_http2Route = Lens.lens (\GatewayRouteSpec' {http2Route} -> http2Route) (\s@GatewayRouteSpec' {} a -> s {http2Route = a} :: GatewayRouteSpec)
+
+-- | An object that represents the specification of an HTTP gateway route.
+gatewayRouteSpec_httpRoute :: Lens.Lens' GatewayRouteSpec (Prelude.Maybe HttpGatewayRoute)
+gatewayRouteSpec_httpRoute = Lens.lens (\GatewayRouteSpec' {httpRoute} -> httpRoute) (\s@GatewayRouteSpec' {} a -> s {httpRoute = a} :: GatewayRouteSpec)
+
+-- | The ordering of the gateway routes spec.
+gatewayRouteSpec_priority :: Lens.Lens' GatewayRouteSpec (Prelude.Maybe Prelude.Natural)
+gatewayRouteSpec_priority = Lens.lens (\GatewayRouteSpec' {priority} -> priority) (\s@GatewayRouteSpec' {} a -> s {priority = a} :: GatewayRouteSpec)
+
+instance Data.FromJSON GatewayRouteSpec where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteSpec"
+      ( \x ->
+          GatewayRouteSpec'
+            Prelude.<$> (x Data..:? "grpcRoute")
+            Prelude.<*> (x Data..:? "http2Route")
+            Prelude.<*> (x Data..:? "httpRoute")
+            Prelude.<*> (x Data..:? "priority")
+      )
+
+instance Prelude.Hashable GatewayRouteSpec where
+  hashWithSalt _salt GatewayRouteSpec' {..} =
+    _salt
+      `Prelude.hashWithSalt` grpcRoute
+      `Prelude.hashWithSalt` http2Route
+      `Prelude.hashWithSalt` httpRoute
+      `Prelude.hashWithSalt` priority
+
+instance Prelude.NFData GatewayRouteSpec where
+  rnf GatewayRouteSpec' {..} =
+    Prelude.rnf grpcRoute
+      `Prelude.seq` Prelude.rnf http2Route
+      `Prelude.seq` Prelude.rnf httpRoute
+      `Prelude.seq` Prelude.rnf priority
+
+instance Data.ToJSON GatewayRouteSpec where
+  toJSON GatewayRouteSpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("grpcRoute" Data..=) Prelude.<$> grpcRoute,
+            ("http2Route" Data..=) Prelude.<$> http2Route,
+            ("httpRoute" Data..=) Prelude.<$> httpRoute,
+            ("priority" Data..=) Prelude.<$> priority
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteStatus.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteStatus.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteStatus where
+
+import Amazonka.AppMesh.Types.GatewayRouteStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the current status of a gateway route.
+--
+-- /See:/ 'newGatewayRouteStatus' smart constructor.
+data GatewayRouteStatus = GatewayRouteStatus'
+  { -- | The current status for the gateway route.
+    status :: GatewayRouteStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'gatewayRouteStatus_status' - The current status for the gateway route.
+newGatewayRouteStatus ::
+  -- | 'status'
+  GatewayRouteStatusCode ->
+  GatewayRouteStatus
+newGatewayRouteStatus pStatus_ =
+  GatewayRouteStatus' {status = pStatus_}
+
+-- | The current status for the gateway route.
+gatewayRouteStatus_status :: Lens.Lens' GatewayRouteStatus GatewayRouteStatusCode
+gatewayRouteStatus_status = Lens.lens (\GatewayRouteStatus' {status} -> status) (\s@GatewayRouteStatus' {} a -> s {status = a} :: GatewayRouteStatus)
+
+instance Data.FromJSON GatewayRouteStatus where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteStatus"
+      ( \x ->
+          GatewayRouteStatus' Prelude.<$> (x Data..: "status")
+      )
+
+instance Prelude.Hashable GatewayRouteStatus where
+  hashWithSalt _salt GatewayRouteStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData GatewayRouteStatus where
+  rnf GatewayRouteStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteStatusCode.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteStatusCode
+  ( GatewayRouteStatusCode
+      ( ..,
+        GatewayRouteStatusCode_ACTIVE,
+        GatewayRouteStatusCode_DELETED,
+        GatewayRouteStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype GatewayRouteStatusCode = GatewayRouteStatusCode'
+  { fromGatewayRouteStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern GatewayRouteStatusCode_ACTIVE :: GatewayRouteStatusCode
+pattern GatewayRouteStatusCode_ACTIVE = GatewayRouteStatusCode' "ACTIVE"
+
+pattern GatewayRouteStatusCode_DELETED :: GatewayRouteStatusCode
+pattern GatewayRouteStatusCode_DELETED = GatewayRouteStatusCode' "DELETED"
+
+pattern GatewayRouteStatusCode_INACTIVE :: GatewayRouteStatusCode
+pattern GatewayRouteStatusCode_INACTIVE = GatewayRouteStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  GatewayRouteStatusCode_ACTIVE,
+  GatewayRouteStatusCode_DELETED,
+  GatewayRouteStatusCode_INACTIVE,
+  GatewayRouteStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteTarget.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteTarget.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteTarget
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteTarget where
+
+import Amazonka.AppMesh.Types.GatewayRouteVirtualService
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a gateway route target.
+--
+-- /See:/ 'newGatewayRouteTarget' smart constructor.
+data GatewayRouteTarget = GatewayRouteTarget'
+  { -- | The port number of the gateway route target.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | An object that represents a virtual service gateway route target.
+    virtualService :: GatewayRouteVirtualService
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteTarget' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'port', 'gatewayRouteTarget_port' - The port number of the gateway route target.
+--
+-- 'virtualService', 'gatewayRouteTarget_virtualService' - An object that represents a virtual service gateway route target.
+newGatewayRouteTarget ::
+  -- | 'virtualService'
+  GatewayRouteVirtualService ->
+  GatewayRouteTarget
+newGatewayRouteTarget pVirtualService_ =
+  GatewayRouteTarget'
+    { port = Prelude.Nothing,
+      virtualService = pVirtualService_
+    }
+
+-- | The port number of the gateway route target.
+gatewayRouteTarget_port :: Lens.Lens' GatewayRouteTarget (Prelude.Maybe Prelude.Natural)
+gatewayRouteTarget_port = Lens.lens (\GatewayRouteTarget' {port} -> port) (\s@GatewayRouteTarget' {} a -> s {port = a} :: GatewayRouteTarget)
+
+-- | An object that represents a virtual service gateway route target.
+gatewayRouteTarget_virtualService :: Lens.Lens' GatewayRouteTarget GatewayRouteVirtualService
+gatewayRouteTarget_virtualService = Lens.lens (\GatewayRouteTarget' {virtualService} -> virtualService) (\s@GatewayRouteTarget' {} a -> s {virtualService = a} :: GatewayRouteTarget)
+
+instance Data.FromJSON GatewayRouteTarget where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteTarget"
+      ( \x ->
+          GatewayRouteTarget'
+            Prelude.<$> (x Data..:? "port")
+            Prelude.<*> (x Data..: "virtualService")
+      )
+
+instance Prelude.Hashable GatewayRouteTarget where
+  hashWithSalt _salt GatewayRouteTarget' {..} =
+    _salt
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` virtualService
+
+instance Prelude.NFData GatewayRouteTarget where
+  rnf GatewayRouteTarget' {..} =
+    Prelude.rnf port
+      `Prelude.seq` Prelude.rnf virtualService
+
+instance Data.ToJSON GatewayRouteTarget where
+  toJSON GatewayRouteTarget' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("port" Data..=) Prelude.<$> port,
+            Prelude.Just
+              ("virtualService" Data..= virtualService)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GatewayRouteVirtualService.hs b/gen/Amazonka/AppMesh/Types/GatewayRouteVirtualService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GatewayRouteVirtualService.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GatewayRouteVirtualService
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GatewayRouteVirtualService where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the virtual service that traffic is routed to.
+--
+-- /See:/ 'newGatewayRouteVirtualService' smart constructor.
+data GatewayRouteVirtualService = GatewayRouteVirtualService'
+  { -- | The name of the virtual service that traffic is routed to.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayRouteVirtualService' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'virtualServiceName', 'gatewayRouteVirtualService_virtualServiceName' - The name of the virtual service that traffic is routed to.
+newGatewayRouteVirtualService ::
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  GatewayRouteVirtualService
+newGatewayRouteVirtualService pVirtualServiceName_ =
+  GatewayRouteVirtualService'
+    { virtualServiceName =
+        pVirtualServiceName_
+    }
+
+-- | The name of the virtual service that traffic is routed to.
+gatewayRouteVirtualService_virtualServiceName :: Lens.Lens' GatewayRouteVirtualService Prelude.Text
+gatewayRouteVirtualService_virtualServiceName = Lens.lens (\GatewayRouteVirtualService' {virtualServiceName} -> virtualServiceName) (\s@GatewayRouteVirtualService' {} a -> s {virtualServiceName = a} :: GatewayRouteVirtualService)
+
+instance Data.FromJSON GatewayRouteVirtualService where
+  parseJSON =
+    Data.withObject
+      "GatewayRouteVirtualService"
+      ( \x ->
+          GatewayRouteVirtualService'
+            Prelude.<$> (x Data..: "virtualServiceName")
+      )
+
+instance Prelude.Hashable GatewayRouteVirtualService where
+  hashWithSalt _salt GatewayRouteVirtualService' {..} =
+    _salt `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData GatewayRouteVirtualService where
+  rnf GatewayRouteVirtualService' {..} =
+    Prelude.rnf virtualServiceName
+
+instance Data.ToJSON GatewayRouteVirtualService where
+  toJSON GatewayRouteVirtualService' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("virtualServiceName" Data..= virtualServiceName)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcGatewayRoute.hs b/gen/Amazonka/AppMesh/Types/GrpcGatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcGatewayRoute.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcGatewayRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcGatewayRoute where
+
+import Amazonka.AppMesh.Types.GrpcGatewayRouteAction
+import Amazonka.AppMesh.Types.GrpcGatewayRouteMatch
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a gRPC gateway route.
+--
+-- /See:/ 'newGrpcGatewayRoute' smart constructor.
+data GrpcGatewayRoute = GrpcGatewayRoute'
+  { -- | An object that represents the action to take if a match is determined.
+    action :: GrpcGatewayRouteAction,
+    -- | An object that represents the criteria for determining a request match.
+    match :: GrpcGatewayRouteMatch
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcGatewayRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'action', 'grpcGatewayRoute_action' - An object that represents the action to take if a match is determined.
+--
+-- 'match', 'grpcGatewayRoute_match' - An object that represents the criteria for determining a request match.
+newGrpcGatewayRoute ::
+  -- | 'action'
+  GrpcGatewayRouteAction ->
+  -- | 'match'
+  GrpcGatewayRouteMatch ->
+  GrpcGatewayRoute
+newGrpcGatewayRoute pAction_ pMatch_ =
+  GrpcGatewayRoute'
+    { action = pAction_,
+      match = pMatch_
+    }
+
+-- | An object that represents the action to take if a match is determined.
+grpcGatewayRoute_action :: Lens.Lens' GrpcGatewayRoute GrpcGatewayRouteAction
+grpcGatewayRoute_action = Lens.lens (\GrpcGatewayRoute' {action} -> action) (\s@GrpcGatewayRoute' {} a -> s {action = a} :: GrpcGatewayRoute)
+
+-- | An object that represents the criteria for determining a request match.
+grpcGatewayRoute_match :: Lens.Lens' GrpcGatewayRoute GrpcGatewayRouteMatch
+grpcGatewayRoute_match = Lens.lens (\GrpcGatewayRoute' {match} -> match) (\s@GrpcGatewayRoute' {} a -> s {match = a} :: GrpcGatewayRoute)
+
+instance Data.FromJSON GrpcGatewayRoute where
+  parseJSON =
+    Data.withObject
+      "GrpcGatewayRoute"
+      ( \x ->
+          GrpcGatewayRoute'
+            Prelude.<$> (x Data..: "action")
+            Prelude.<*> (x Data..: "match")
+      )
+
+instance Prelude.Hashable GrpcGatewayRoute where
+  hashWithSalt _salt GrpcGatewayRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` match
+
+instance Prelude.NFData GrpcGatewayRoute where
+  rnf GrpcGatewayRoute' {..} =
+    Prelude.rnf action `Prelude.seq` Prelude.rnf match
+
+instance Data.ToJSON GrpcGatewayRoute where
+  toJSON GrpcGatewayRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("action" Data..= action),
+            Prelude.Just ("match" Data..= match)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteAction.hs b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteAction.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcGatewayRouteAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcGatewayRouteAction where
+
+import Amazonka.AppMesh.Types.GatewayRouteTarget
+import Amazonka.AppMesh.Types.GrpcGatewayRouteRewrite
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the action to take if a match is determined.
+--
+-- /See:/ 'newGrpcGatewayRouteAction' smart constructor.
+data GrpcGatewayRouteAction = GrpcGatewayRouteAction'
+  { -- | The gateway route action to rewrite.
+    rewrite :: Prelude.Maybe GrpcGatewayRouteRewrite,
+    -- | An object that represents the target that traffic is routed to when a
+    -- request matches the gateway route.
+    target :: GatewayRouteTarget
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcGatewayRouteAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rewrite', 'grpcGatewayRouteAction_rewrite' - The gateway route action to rewrite.
+--
+-- 'target', 'grpcGatewayRouteAction_target' - An object that represents the target that traffic is routed to when a
+-- request matches the gateway route.
+newGrpcGatewayRouteAction ::
+  -- | 'target'
+  GatewayRouteTarget ->
+  GrpcGatewayRouteAction
+newGrpcGatewayRouteAction pTarget_ =
+  GrpcGatewayRouteAction'
+    { rewrite = Prelude.Nothing,
+      target = pTarget_
+    }
+
+-- | The gateway route action to rewrite.
+grpcGatewayRouteAction_rewrite :: Lens.Lens' GrpcGatewayRouteAction (Prelude.Maybe GrpcGatewayRouteRewrite)
+grpcGatewayRouteAction_rewrite = Lens.lens (\GrpcGatewayRouteAction' {rewrite} -> rewrite) (\s@GrpcGatewayRouteAction' {} a -> s {rewrite = a} :: GrpcGatewayRouteAction)
+
+-- | An object that represents the target that traffic is routed to when a
+-- request matches the gateway route.
+grpcGatewayRouteAction_target :: Lens.Lens' GrpcGatewayRouteAction GatewayRouteTarget
+grpcGatewayRouteAction_target = Lens.lens (\GrpcGatewayRouteAction' {target} -> target) (\s@GrpcGatewayRouteAction' {} a -> s {target = a} :: GrpcGatewayRouteAction)
+
+instance Data.FromJSON GrpcGatewayRouteAction where
+  parseJSON =
+    Data.withObject
+      "GrpcGatewayRouteAction"
+      ( \x ->
+          GrpcGatewayRouteAction'
+            Prelude.<$> (x Data..:? "rewrite")
+            Prelude.<*> (x Data..: "target")
+      )
+
+instance Prelude.Hashable GrpcGatewayRouteAction where
+  hashWithSalt _salt GrpcGatewayRouteAction' {..} =
+    _salt
+      `Prelude.hashWithSalt` rewrite
+      `Prelude.hashWithSalt` target
+
+instance Prelude.NFData GrpcGatewayRouteAction where
+  rnf GrpcGatewayRouteAction' {..} =
+    Prelude.rnf rewrite
+      `Prelude.seq` Prelude.rnf target
+
+instance Data.ToJSON GrpcGatewayRouteAction where
+  toJSON GrpcGatewayRouteAction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("rewrite" Data..=) Prelude.<$> rewrite,
+            Prelude.Just ("target" Data..= target)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteMatch.hs b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteMatch.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcGatewayRouteMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcGatewayRouteMatch where
+
+import Amazonka.AppMesh.Types.GatewayRouteHostnameMatch
+import Amazonka.AppMesh.Types.GrpcGatewayRouteMetadata
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the criteria for determining a request match.
+--
+-- /See:/ 'newGrpcGatewayRouteMatch' smart constructor.
+data GrpcGatewayRouteMatch = GrpcGatewayRouteMatch'
+  { -- | The gateway route host name to be matched on.
+    hostname :: Prelude.Maybe GatewayRouteHostnameMatch,
+    -- | The gateway route metadata to be matched on.
+    metadata :: Prelude.Maybe (Prelude.NonEmpty GrpcGatewayRouteMetadata),
+    -- | The port number to match from the request.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | The fully qualified domain name for the service to match from the
+    -- request.
+    serviceName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcGatewayRouteMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'hostname', 'grpcGatewayRouteMatch_hostname' - The gateway route host name to be matched on.
+--
+-- 'metadata', 'grpcGatewayRouteMatch_metadata' - The gateway route metadata to be matched on.
+--
+-- 'port', 'grpcGatewayRouteMatch_port' - The port number to match from the request.
+--
+-- 'serviceName', 'grpcGatewayRouteMatch_serviceName' - The fully qualified domain name for the service to match from the
+-- request.
+newGrpcGatewayRouteMatch ::
+  GrpcGatewayRouteMatch
+newGrpcGatewayRouteMatch =
+  GrpcGatewayRouteMatch'
+    { hostname = Prelude.Nothing,
+      metadata = Prelude.Nothing,
+      port = Prelude.Nothing,
+      serviceName = Prelude.Nothing
+    }
+
+-- | The gateway route host name to be matched on.
+grpcGatewayRouteMatch_hostname :: Lens.Lens' GrpcGatewayRouteMatch (Prelude.Maybe GatewayRouteHostnameMatch)
+grpcGatewayRouteMatch_hostname = Lens.lens (\GrpcGatewayRouteMatch' {hostname} -> hostname) (\s@GrpcGatewayRouteMatch' {} a -> s {hostname = a} :: GrpcGatewayRouteMatch)
+
+-- | The gateway route metadata to be matched on.
+grpcGatewayRouteMatch_metadata :: Lens.Lens' GrpcGatewayRouteMatch (Prelude.Maybe (Prelude.NonEmpty GrpcGatewayRouteMetadata))
+grpcGatewayRouteMatch_metadata = Lens.lens (\GrpcGatewayRouteMatch' {metadata} -> metadata) (\s@GrpcGatewayRouteMatch' {} a -> s {metadata = a} :: GrpcGatewayRouteMatch) Prelude.. Lens.mapping Lens.coerced
+
+-- | The port number to match from the request.
+grpcGatewayRouteMatch_port :: Lens.Lens' GrpcGatewayRouteMatch (Prelude.Maybe Prelude.Natural)
+grpcGatewayRouteMatch_port = Lens.lens (\GrpcGatewayRouteMatch' {port} -> port) (\s@GrpcGatewayRouteMatch' {} a -> s {port = a} :: GrpcGatewayRouteMatch)
+
+-- | The fully qualified domain name for the service to match from the
+-- request.
+grpcGatewayRouteMatch_serviceName :: Lens.Lens' GrpcGatewayRouteMatch (Prelude.Maybe Prelude.Text)
+grpcGatewayRouteMatch_serviceName = Lens.lens (\GrpcGatewayRouteMatch' {serviceName} -> serviceName) (\s@GrpcGatewayRouteMatch' {} a -> s {serviceName = a} :: GrpcGatewayRouteMatch)
+
+instance Data.FromJSON GrpcGatewayRouteMatch where
+  parseJSON =
+    Data.withObject
+      "GrpcGatewayRouteMatch"
+      ( \x ->
+          GrpcGatewayRouteMatch'
+            Prelude.<$> (x Data..:? "hostname")
+            Prelude.<*> (x Data..:? "metadata")
+            Prelude.<*> (x Data..:? "port")
+            Prelude.<*> (x Data..:? "serviceName")
+      )
+
+instance Prelude.Hashable GrpcGatewayRouteMatch where
+  hashWithSalt _salt GrpcGatewayRouteMatch' {..} =
+    _salt
+      `Prelude.hashWithSalt` hostname
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` serviceName
+
+instance Prelude.NFData GrpcGatewayRouteMatch where
+  rnf GrpcGatewayRouteMatch' {..} =
+    Prelude.rnf hostname
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf serviceName
+
+instance Data.ToJSON GrpcGatewayRouteMatch where
+  toJSON GrpcGatewayRouteMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("hostname" Data..=) Prelude.<$> hostname,
+            ("metadata" Data..=) Prelude.<$> metadata,
+            ("port" Data..=) Prelude.<$> port,
+            ("serviceName" Data..=) Prelude.<$> serviceName
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteMetadata.hs b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteMetadata.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcGatewayRouteMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcGatewayRouteMetadata where
+
+import Amazonka.AppMesh.Types.GrpcMetadataMatchMethod
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the metadata of the gateway route.
+--
+-- /See:/ 'newGrpcGatewayRouteMetadata' smart constructor.
+data GrpcGatewayRouteMetadata = GrpcGatewayRouteMetadata'
+  { -- | Specify @True@ to match anything except the match criteria. The default
+    -- value is @False@.
+    invert :: Prelude.Maybe Prelude.Bool,
+    -- | The criteria for determining a metadata match.
+    match :: Prelude.Maybe GrpcMetadataMatchMethod,
+    -- | A name for the gateway route metadata.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcGatewayRouteMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'invert', 'grpcGatewayRouteMetadata_invert' - Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+--
+-- 'match', 'grpcGatewayRouteMetadata_match' - The criteria for determining a metadata match.
+--
+-- 'name', 'grpcGatewayRouteMetadata_name' - A name for the gateway route metadata.
+newGrpcGatewayRouteMetadata ::
+  -- | 'name'
+  Prelude.Text ->
+  GrpcGatewayRouteMetadata
+newGrpcGatewayRouteMetadata pName_ =
+  GrpcGatewayRouteMetadata'
+    { invert = Prelude.Nothing,
+      match = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+grpcGatewayRouteMetadata_invert :: Lens.Lens' GrpcGatewayRouteMetadata (Prelude.Maybe Prelude.Bool)
+grpcGatewayRouteMetadata_invert = Lens.lens (\GrpcGatewayRouteMetadata' {invert} -> invert) (\s@GrpcGatewayRouteMetadata' {} a -> s {invert = a} :: GrpcGatewayRouteMetadata)
+
+-- | The criteria for determining a metadata match.
+grpcGatewayRouteMetadata_match :: Lens.Lens' GrpcGatewayRouteMetadata (Prelude.Maybe GrpcMetadataMatchMethod)
+grpcGatewayRouteMetadata_match = Lens.lens (\GrpcGatewayRouteMetadata' {match} -> match) (\s@GrpcGatewayRouteMetadata' {} a -> s {match = a} :: GrpcGatewayRouteMetadata)
+
+-- | A name for the gateway route metadata.
+grpcGatewayRouteMetadata_name :: Lens.Lens' GrpcGatewayRouteMetadata Prelude.Text
+grpcGatewayRouteMetadata_name = Lens.lens (\GrpcGatewayRouteMetadata' {name} -> name) (\s@GrpcGatewayRouteMetadata' {} a -> s {name = a} :: GrpcGatewayRouteMetadata)
+
+instance Data.FromJSON GrpcGatewayRouteMetadata where
+  parseJSON =
+    Data.withObject
+      "GrpcGatewayRouteMetadata"
+      ( \x ->
+          GrpcGatewayRouteMetadata'
+            Prelude.<$> (x Data..:? "invert")
+            Prelude.<*> (x Data..:? "match")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable GrpcGatewayRouteMetadata where
+  hashWithSalt _salt GrpcGatewayRouteMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` invert
+      `Prelude.hashWithSalt` match
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData GrpcGatewayRouteMetadata where
+  rnf GrpcGatewayRouteMetadata' {..} =
+    Prelude.rnf invert
+      `Prelude.seq` Prelude.rnf match
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON GrpcGatewayRouteMetadata where
+  toJSON GrpcGatewayRouteMetadata' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("invert" Data..=) Prelude.<$> invert,
+            ("match" Data..=) Prelude.<$> match,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteRewrite.hs b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteRewrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcGatewayRouteRewrite.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcGatewayRouteRewrite
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcGatewayRouteRewrite where
+
+import Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the gateway route to rewrite.
+--
+-- /See:/ 'newGrpcGatewayRouteRewrite' smart constructor.
+data GrpcGatewayRouteRewrite = GrpcGatewayRouteRewrite'
+  { -- | The host name of the gateway route to rewrite.
+    hostname :: Prelude.Maybe GatewayRouteHostnameRewrite
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcGatewayRouteRewrite' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'hostname', 'grpcGatewayRouteRewrite_hostname' - The host name of the gateway route to rewrite.
+newGrpcGatewayRouteRewrite ::
+  GrpcGatewayRouteRewrite
+newGrpcGatewayRouteRewrite =
+  GrpcGatewayRouteRewrite'
+    { hostname =
+        Prelude.Nothing
+    }
+
+-- | The host name of the gateway route to rewrite.
+grpcGatewayRouteRewrite_hostname :: Lens.Lens' GrpcGatewayRouteRewrite (Prelude.Maybe GatewayRouteHostnameRewrite)
+grpcGatewayRouteRewrite_hostname = Lens.lens (\GrpcGatewayRouteRewrite' {hostname} -> hostname) (\s@GrpcGatewayRouteRewrite' {} a -> s {hostname = a} :: GrpcGatewayRouteRewrite)
+
+instance Data.FromJSON GrpcGatewayRouteRewrite where
+  parseJSON =
+    Data.withObject
+      "GrpcGatewayRouteRewrite"
+      ( \x ->
+          GrpcGatewayRouteRewrite'
+            Prelude.<$> (x Data..:? "hostname")
+      )
+
+instance Prelude.Hashable GrpcGatewayRouteRewrite where
+  hashWithSalt _salt GrpcGatewayRouteRewrite' {..} =
+    _salt `Prelude.hashWithSalt` hostname
+
+instance Prelude.NFData GrpcGatewayRouteRewrite where
+  rnf GrpcGatewayRouteRewrite' {..} =
+    Prelude.rnf hostname
+
+instance Data.ToJSON GrpcGatewayRouteRewrite where
+  toJSON GrpcGatewayRouteRewrite' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("hostname" Data..=) Prelude.<$> hostname]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcMetadataMatchMethod.hs b/gen/Amazonka/AppMesh/Types/GrpcMetadataMatchMethod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcMetadataMatchMethod.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcMetadataMatchMethod
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcMetadataMatchMethod where
+
+import Amazonka.AppMesh.Types.MatchRange
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the method header to be matched.
+--
+-- /See:/ 'newGrpcMetadataMatchMethod' smart constructor.
+data GrpcMetadataMatchMethod = GrpcMetadataMatchMethod'
+  { -- | The exact method header to be matched on.
+    exact :: Prelude.Maybe Prelude.Text,
+    -- | The specified beginning characters of the method header to be matched
+    -- on.
+    prefix :: Prelude.Maybe Prelude.Text,
+    range :: Prelude.Maybe MatchRange,
+    -- | The regex used to match the method header.
+    regex :: Prelude.Maybe Prelude.Text,
+    -- | The specified ending characters of the method header to match on.
+    suffix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcMetadataMatchMethod' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'grpcMetadataMatchMethod_exact' - The exact method header to be matched on.
+--
+-- 'prefix', 'grpcMetadataMatchMethod_prefix' - The specified beginning characters of the method header to be matched
+-- on.
+--
+-- 'range', 'grpcMetadataMatchMethod_range' - Undocumented member.
+--
+-- 'regex', 'grpcMetadataMatchMethod_regex' - The regex used to match the method header.
+--
+-- 'suffix', 'grpcMetadataMatchMethod_suffix' - The specified ending characters of the method header to match on.
+newGrpcMetadataMatchMethod ::
+  GrpcMetadataMatchMethod
+newGrpcMetadataMatchMethod =
+  GrpcMetadataMatchMethod'
+    { exact = Prelude.Nothing,
+      prefix = Prelude.Nothing,
+      range = Prelude.Nothing,
+      regex = Prelude.Nothing,
+      suffix = Prelude.Nothing
+    }
+
+-- | The exact method header to be matched on.
+grpcMetadataMatchMethod_exact :: Lens.Lens' GrpcMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcMetadataMatchMethod_exact = Lens.lens (\GrpcMetadataMatchMethod' {exact} -> exact) (\s@GrpcMetadataMatchMethod' {} a -> s {exact = a} :: GrpcMetadataMatchMethod)
+
+-- | The specified beginning characters of the method header to be matched
+-- on.
+grpcMetadataMatchMethod_prefix :: Lens.Lens' GrpcMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcMetadataMatchMethod_prefix = Lens.lens (\GrpcMetadataMatchMethod' {prefix} -> prefix) (\s@GrpcMetadataMatchMethod' {} a -> s {prefix = a} :: GrpcMetadataMatchMethod)
+
+-- | Undocumented member.
+grpcMetadataMatchMethod_range :: Lens.Lens' GrpcMetadataMatchMethod (Prelude.Maybe MatchRange)
+grpcMetadataMatchMethod_range = Lens.lens (\GrpcMetadataMatchMethod' {range} -> range) (\s@GrpcMetadataMatchMethod' {} a -> s {range = a} :: GrpcMetadataMatchMethod)
+
+-- | The regex used to match the method header.
+grpcMetadataMatchMethod_regex :: Lens.Lens' GrpcMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcMetadataMatchMethod_regex = Lens.lens (\GrpcMetadataMatchMethod' {regex} -> regex) (\s@GrpcMetadataMatchMethod' {} a -> s {regex = a} :: GrpcMetadataMatchMethod)
+
+-- | The specified ending characters of the method header to match on.
+grpcMetadataMatchMethod_suffix :: Lens.Lens' GrpcMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcMetadataMatchMethod_suffix = Lens.lens (\GrpcMetadataMatchMethod' {suffix} -> suffix) (\s@GrpcMetadataMatchMethod' {} a -> s {suffix = a} :: GrpcMetadataMatchMethod)
+
+instance Data.FromJSON GrpcMetadataMatchMethod where
+  parseJSON =
+    Data.withObject
+      "GrpcMetadataMatchMethod"
+      ( \x ->
+          GrpcMetadataMatchMethod'
+            Prelude.<$> (x Data..:? "exact")
+            Prelude.<*> (x Data..:? "prefix")
+            Prelude.<*> (x Data..:? "range")
+            Prelude.<*> (x Data..:? "regex")
+            Prelude.<*> (x Data..:? "suffix")
+      )
+
+instance Prelude.Hashable GrpcMetadataMatchMethod where
+  hashWithSalt _salt GrpcMetadataMatchMethod' {..} =
+    _salt
+      `Prelude.hashWithSalt` exact
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` range
+      `Prelude.hashWithSalt` regex
+      `Prelude.hashWithSalt` suffix
+
+instance Prelude.NFData GrpcMetadataMatchMethod where
+  rnf GrpcMetadataMatchMethod' {..} =
+    Prelude.rnf exact
+      `Prelude.seq` Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf range
+      `Prelude.seq` Prelude.rnf regex
+      `Prelude.seq` Prelude.rnf suffix
+
+instance Data.ToJSON GrpcMetadataMatchMethod where
+  toJSON GrpcMetadataMatchMethod' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("exact" Data..=) Prelude.<$> exact,
+            ("prefix" Data..=) Prelude.<$> prefix,
+            ("range" Data..=) Prelude.<$> range,
+            ("regex" Data..=) Prelude.<$> regex,
+            ("suffix" Data..=) Prelude.<$> suffix
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRetryPolicy.hs b/gen/Amazonka/AppMesh/Types/GrpcRetryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRetryPolicy.hs
@@ -0,0 +1,181 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRetryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRetryPolicy where
+
+import Amazonka.AppMesh.Types.Duration
+import Amazonka.AppMesh.Types.GrpcRetryPolicyEvent
+import Amazonka.AppMesh.Types.TcpRetryPolicyEvent
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a retry policy. Specify at least one value for
+-- at least one of the types of @RetryEvents@, a value for @maxRetries@,
+-- and a value for @perRetryTimeout@. Both @server-error@ and
+-- @gateway-error@ under @httpRetryEvents@ include the Envoy @reset@
+-- policy. For more information on the @reset@ policy, see the
+-- <https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/router_filter#x-envoy-retry-on Envoy documentation>.
+--
+-- /See:/ 'newGrpcRetryPolicy' smart constructor.
+data GrpcRetryPolicy = GrpcRetryPolicy'
+  { -- | Specify at least one of the valid values.
+    grpcRetryEvents :: Prelude.Maybe (Prelude.NonEmpty GrpcRetryPolicyEvent),
+    -- | Specify at least one of the following values.
+    --
+    -- -   __server-error__ – HTTP status codes 500, 501, 502, 503, 504, 505,
+    --     506, 507, 508, 510, and 511
+    --
+    -- -   __gateway-error__ – HTTP status codes 502, 503, and 504
+    --
+    -- -   __client-error__ – HTTP status code 409
+    --
+    -- -   __stream-error__ – Retry on refused stream
+    httpRetryEvents :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | Specify a valid value. The event occurs before any processing of a
+    -- request has started and is encountered when the upstream is temporarily
+    -- or permanently unavailable.
+    tcpRetryEvents :: Prelude.Maybe (Prelude.NonEmpty TcpRetryPolicyEvent),
+    -- | The maximum number of retry attempts.
+    maxRetries :: Prelude.Natural,
+    -- | The timeout for each retry attempt.
+    perRetryTimeout :: Duration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcRetryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'grpcRetryEvents', 'grpcRetryPolicy_grpcRetryEvents' - Specify at least one of the valid values.
+--
+-- 'httpRetryEvents', 'grpcRetryPolicy_httpRetryEvents' - Specify at least one of the following values.
+--
+-- -   __server-error__ – HTTP status codes 500, 501, 502, 503, 504, 505,
+--     506, 507, 508, 510, and 511
+--
+-- -   __gateway-error__ – HTTP status codes 502, 503, and 504
+--
+-- -   __client-error__ – HTTP status code 409
+--
+-- -   __stream-error__ – Retry on refused stream
+--
+-- 'tcpRetryEvents', 'grpcRetryPolicy_tcpRetryEvents' - Specify a valid value. The event occurs before any processing of a
+-- request has started and is encountered when the upstream is temporarily
+-- or permanently unavailable.
+--
+-- 'maxRetries', 'grpcRetryPolicy_maxRetries' - The maximum number of retry attempts.
+--
+-- 'perRetryTimeout', 'grpcRetryPolicy_perRetryTimeout' - The timeout for each retry attempt.
+newGrpcRetryPolicy ::
+  -- | 'maxRetries'
+  Prelude.Natural ->
+  -- | 'perRetryTimeout'
+  Duration ->
+  GrpcRetryPolicy
+newGrpcRetryPolicy pMaxRetries_ pPerRetryTimeout_ =
+  GrpcRetryPolicy'
+    { grpcRetryEvents = Prelude.Nothing,
+      httpRetryEvents = Prelude.Nothing,
+      tcpRetryEvents = Prelude.Nothing,
+      maxRetries = pMaxRetries_,
+      perRetryTimeout = pPerRetryTimeout_
+    }
+
+-- | Specify at least one of the valid values.
+grpcRetryPolicy_grpcRetryEvents :: Lens.Lens' GrpcRetryPolicy (Prelude.Maybe (Prelude.NonEmpty GrpcRetryPolicyEvent))
+grpcRetryPolicy_grpcRetryEvents = Lens.lens (\GrpcRetryPolicy' {grpcRetryEvents} -> grpcRetryEvents) (\s@GrpcRetryPolicy' {} a -> s {grpcRetryEvents = a} :: GrpcRetryPolicy) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify at least one of the following values.
+--
+-- -   __server-error__ – HTTP status codes 500, 501, 502, 503, 504, 505,
+--     506, 507, 508, 510, and 511
+--
+-- -   __gateway-error__ – HTTP status codes 502, 503, and 504
+--
+-- -   __client-error__ – HTTP status code 409
+--
+-- -   __stream-error__ – Retry on refused stream
+grpcRetryPolicy_httpRetryEvents :: Lens.Lens' GrpcRetryPolicy (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+grpcRetryPolicy_httpRetryEvents = Lens.lens (\GrpcRetryPolicy' {httpRetryEvents} -> httpRetryEvents) (\s@GrpcRetryPolicy' {} a -> s {httpRetryEvents = a} :: GrpcRetryPolicy) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify a valid value. The event occurs before any processing of a
+-- request has started and is encountered when the upstream is temporarily
+-- or permanently unavailable.
+grpcRetryPolicy_tcpRetryEvents :: Lens.Lens' GrpcRetryPolicy (Prelude.Maybe (Prelude.NonEmpty TcpRetryPolicyEvent))
+grpcRetryPolicy_tcpRetryEvents = Lens.lens (\GrpcRetryPolicy' {tcpRetryEvents} -> tcpRetryEvents) (\s@GrpcRetryPolicy' {} a -> s {tcpRetryEvents = a} :: GrpcRetryPolicy) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of retry attempts.
+grpcRetryPolicy_maxRetries :: Lens.Lens' GrpcRetryPolicy Prelude.Natural
+grpcRetryPolicy_maxRetries = Lens.lens (\GrpcRetryPolicy' {maxRetries} -> maxRetries) (\s@GrpcRetryPolicy' {} a -> s {maxRetries = a} :: GrpcRetryPolicy)
+
+-- | The timeout for each retry attempt.
+grpcRetryPolicy_perRetryTimeout :: Lens.Lens' GrpcRetryPolicy Duration
+grpcRetryPolicy_perRetryTimeout = Lens.lens (\GrpcRetryPolicy' {perRetryTimeout} -> perRetryTimeout) (\s@GrpcRetryPolicy' {} a -> s {perRetryTimeout = a} :: GrpcRetryPolicy)
+
+instance Data.FromJSON GrpcRetryPolicy where
+  parseJSON =
+    Data.withObject
+      "GrpcRetryPolicy"
+      ( \x ->
+          GrpcRetryPolicy'
+            Prelude.<$> (x Data..:? "grpcRetryEvents")
+            Prelude.<*> (x Data..:? "httpRetryEvents")
+            Prelude.<*> (x Data..:? "tcpRetryEvents")
+            Prelude.<*> (x Data..: "maxRetries")
+            Prelude.<*> (x Data..: "perRetryTimeout")
+      )
+
+instance Prelude.Hashable GrpcRetryPolicy where
+  hashWithSalt _salt GrpcRetryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` grpcRetryEvents
+      `Prelude.hashWithSalt` httpRetryEvents
+      `Prelude.hashWithSalt` tcpRetryEvents
+      `Prelude.hashWithSalt` maxRetries
+      `Prelude.hashWithSalt` perRetryTimeout
+
+instance Prelude.NFData GrpcRetryPolicy where
+  rnf GrpcRetryPolicy' {..} =
+    Prelude.rnf grpcRetryEvents
+      `Prelude.seq` Prelude.rnf httpRetryEvents
+      `Prelude.seq` Prelude.rnf tcpRetryEvents
+      `Prelude.seq` Prelude.rnf maxRetries
+      `Prelude.seq` Prelude.rnf perRetryTimeout
+
+instance Data.ToJSON GrpcRetryPolicy where
+  toJSON GrpcRetryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("grpcRetryEvents" Data..=)
+              Prelude.<$> grpcRetryEvents,
+            ("httpRetryEvents" Data..=)
+              Prelude.<$> httpRetryEvents,
+            ("tcpRetryEvents" Data..=)
+              Prelude.<$> tcpRetryEvents,
+            Prelude.Just ("maxRetries" Data..= maxRetries),
+            Prelude.Just
+              ("perRetryTimeout" Data..= perRetryTimeout)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRetryPolicyEvent.hs b/gen/Amazonka/AppMesh/Types/GrpcRetryPolicyEvent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRetryPolicyEvent.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRetryPolicyEvent
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRetryPolicyEvent
+  ( GrpcRetryPolicyEvent
+      ( ..,
+        GrpcRetryPolicyEvent_Cancelled,
+        GrpcRetryPolicyEvent_Deadline_exceeded,
+        GrpcRetryPolicyEvent_Internal,
+        GrpcRetryPolicyEvent_Resource_exhausted,
+        GrpcRetryPolicyEvent_Unavailable
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype GrpcRetryPolicyEvent = GrpcRetryPolicyEvent'
+  { fromGrpcRetryPolicyEvent ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern GrpcRetryPolicyEvent_Cancelled :: GrpcRetryPolicyEvent
+pattern GrpcRetryPolicyEvent_Cancelled = GrpcRetryPolicyEvent' "cancelled"
+
+pattern GrpcRetryPolicyEvent_Deadline_exceeded :: GrpcRetryPolicyEvent
+pattern GrpcRetryPolicyEvent_Deadline_exceeded = GrpcRetryPolicyEvent' "deadline-exceeded"
+
+pattern GrpcRetryPolicyEvent_Internal :: GrpcRetryPolicyEvent
+pattern GrpcRetryPolicyEvent_Internal = GrpcRetryPolicyEvent' "internal"
+
+pattern GrpcRetryPolicyEvent_Resource_exhausted :: GrpcRetryPolicyEvent
+pattern GrpcRetryPolicyEvent_Resource_exhausted = GrpcRetryPolicyEvent' "resource-exhausted"
+
+pattern GrpcRetryPolicyEvent_Unavailable :: GrpcRetryPolicyEvent
+pattern GrpcRetryPolicyEvent_Unavailable = GrpcRetryPolicyEvent' "unavailable"
+
+{-# COMPLETE
+  GrpcRetryPolicyEvent_Cancelled,
+  GrpcRetryPolicyEvent_Deadline_exceeded,
+  GrpcRetryPolicyEvent_Internal,
+  GrpcRetryPolicyEvent_Resource_exhausted,
+  GrpcRetryPolicyEvent_Unavailable,
+  GrpcRetryPolicyEvent'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRoute.hs b/gen/Amazonka/AppMesh/Types/GrpcRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRoute.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRoute where
+
+import Amazonka.AppMesh.Types.GrpcRetryPolicy
+import Amazonka.AppMesh.Types.GrpcRouteAction
+import Amazonka.AppMesh.Types.GrpcRouteMatch
+import Amazonka.AppMesh.Types.GrpcTimeout
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a gRPC route type.
+--
+-- /See:/ 'newGrpcRoute' smart constructor.
+data GrpcRoute = GrpcRoute'
+  { -- | An object that represents a retry policy.
+    retryPolicy :: Prelude.Maybe GrpcRetryPolicy,
+    -- | An object that represents types of timeouts.
+    timeout :: Prelude.Maybe GrpcTimeout,
+    -- | An object that represents the action to take if a match is determined.
+    action :: GrpcRouteAction,
+    -- | An object that represents the criteria for determining a request match.
+    match :: GrpcRouteMatch
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'retryPolicy', 'grpcRoute_retryPolicy' - An object that represents a retry policy.
+--
+-- 'timeout', 'grpcRoute_timeout' - An object that represents types of timeouts.
+--
+-- 'action', 'grpcRoute_action' - An object that represents the action to take if a match is determined.
+--
+-- 'match', 'grpcRoute_match' - An object that represents the criteria for determining a request match.
+newGrpcRoute ::
+  -- | 'action'
+  GrpcRouteAction ->
+  -- | 'match'
+  GrpcRouteMatch ->
+  GrpcRoute
+newGrpcRoute pAction_ pMatch_ =
+  GrpcRoute'
+    { retryPolicy = Prelude.Nothing,
+      timeout = Prelude.Nothing,
+      action = pAction_,
+      match = pMatch_
+    }
+
+-- | An object that represents a retry policy.
+grpcRoute_retryPolicy :: Lens.Lens' GrpcRoute (Prelude.Maybe GrpcRetryPolicy)
+grpcRoute_retryPolicy = Lens.lens (\GrpcRoute' {retryPolicy} -> retryPolicy) (\s@GrpcRoute' {} a -> s {retryPolicy = a} :: GrpcRoute)
+
+-- | An object that represents types of timeouts.
+grpcRoute_timeout :: Lens.Lens' GrpcRoute (Prelude.Maybe GrpcTimeout)
+grpcRoute_timeout = Lens.lens (\GrpcRoute' {timeout} -> timeout) (\s@GrpcRoute' {} a -> s {timeout = a} :: GrpcRoute)
+
+-- | An object that represents the action to take if a match is determined.
+grpcRoute_action :: Lens.Lens' GrpcRoute GrpcRouteAction
+grpcRoute_action = Lens.lens (\GrpcRoute' {action} -> action) (\s@GrpcRoute' {} a -> s {action = a} :: GrpcRoute)
+
+-- | An object that represents the criteria for determining a request match.
+grpcRoute_match :: Lens.Lens' GrpcRoute GrpcRouteMatch
+grpcRoute_match = Lens.lens (\GrpcRoute' {match} -> match) (\s@GrpcRoute' {} a -> s {match = a} :: GrpcRoute)
+
+instance Data.FromJSON GrpcRoute where
+  parseJSON =
+    Data.withObject
+      "GrpcRoute"
+      ( \x ->
+          GrpcRoute'
+            Prelude.<$> (x Data..:? "retryPolicy")
+            Prelude.<*> (x Data..:? "timeout")
+            Prelude.<*> (x Data..: "action")
+            Prelude.<*> (x Data..: "match")
+      )
+
+instance Prelude.Hashable GrpcRoute where
+  hashWithSalt _salt GrpcRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` retryPolicy
+      `Prelude.hashWithSalt` timeout
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` match
+
+instance Prelude.NFData GrpcRoute where
+  rnf GrpcRoute' {..} =
+    Prelude.rnf retryPolicy
+      `Prelude.seq` Prelude.rnf timeout
+      `Prelude.seq` Prelude.rnf action
+      `Prelude.seq` Prelude.rnf match
+
+instance Data.ToJSON GrpcRoute where
+  toJSON GrpcRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("retryPolicy" Data..=) Prelude.<$> retryPolicy,
+            ("timeout" Data..=) Prelude.<$> timeout,
+            Prelude.Just ("action" Data..= action),
+            Prelude.Just ("match" Data..= match)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRouteAction.hs b/gen/Amazonka/AppMesh/Types/GrpcRouteAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRouteAction.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRouteAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRouteAction where
+
+import Amazonka.AppMesh.Types.WeightedTarget
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the action to take if a match is determined.
+--
+-- /See:/ 'newGrpcRouteAction' smart constructor.
+data GrpcRouteAction = GrpcRouteAction'
+  { -- | An object that represents the targets that traffic is routed to when a
+    -- request matches the route.
+    weightedTargets :: Prelude.NonEmpty WeightedTarget
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcRouteAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'weightedTargets', 'grpcRouteAction_weightedTargets' - An object that represents the targets that traffic is routed to when a
+-- request matches the route.
+newGrpcRouteAction ::
+  -- | 'weightedTargets'
+  Prelude.NonEmpty WeightedTarget ->
+  GrpcRouteAction
+newGrpcRouteAction pWeightedTargets_ =
+  GrpcRouteAction'
+    { weightedTargets =
+        Lens.coerced Lens.# pWeightedTargets_
+    }
+
+-- | An object that represents the targets that traffic is routed to when a
+-- request matches the route.
+grpcRouteAction_weightedTargets :: Lens.Lens' GrpcRouteAction (Prelude.NonEmpty WeightedTarget)
+grpcRouteAction_weightedTargets = Lens.lens (\GrpcRouteAction' {weightedTargets} -> weightedTargets) (\s@GrpcRouteAction' {} a -> s {weightedTargets = a} :: GrpcRouteAction) Prelude.. Lens.coerced
+
+instance Data.FromJSON GrpcRouteAction where
+  parseJSON =
+    Data.withObject
+      "GrpcRouteAction"
+      ( \x ->
+          GrpcRouteAction'
+            Prelude.<$> (x Data..: "weightedTargets")
+      )
+
+instance Prelude.Hashable GrpcRouteAction where
+  hashWithSalt _salt GrpcRouteAction' {..} =
+    _salt `Prelude.hashWithSalt` weightedTargets
+
+instance Prelude.NFData GrpcRouteAction where
+  rnf GrpcRouteAction' {..} =
+    Prelude.rnf weightedTargets
+
+instance Data.ToJSON GrpcRouteAction where
+  toJSON GrpcRouteAction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("weightedTargets" Data..= weightedTargets)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRouteMatch.hs b/gen/Amazonka/AppMesh/Types/GrpcRouteMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRouteMatch.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRouteMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRouteMatch where
+
+import Amazonka.AppMesh.Types.GrpcRouteMetadata
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the criteria for determining a request match.
+--
+-- /See:/ 'newGrpcRouteMatch' smart constructor.
+data GrpcRouteMatch = GrpcRouteMatch'
+  { -- | An object that represents the data to match from the request.
+    metadata :: Prelude.Maybe (Prelude.NonEmpty GrpcRouteMetadata),
+    -- | The method name to match from the request. If you specify a name, you
+    -- must also specify a @serviceName@.
+    methodName :: Prelude.Maybe Prelude.Text,
+    -- | The port number to match on.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | The fully qualified domain name for the service to match from the
+    -- request.
+    serviceName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcRouteMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metadata', 'grpcRouteMatch_metadata' - An object that represents the data to match from the request.
+--
+-- 'methodName', 'grpcRouteMatch_methodName' - The method name to match from the request. If you specify a name, you
+-- must also specify a @serviceName@.
+--
+-- 'port', 'grpcRouteMatch_port' - The port number to match on.
+--
+-- 'serviceName', 'grpcRouteMatch_serviceName' - The fully qualified domain name for the service to match from the
+-- request.
+newGrpcRouteMatch ::
+  GrpcRouteMatch
+newGrpcRouteMatch =
+  GrpcRouteMatch'
+    { metadata = Prelude.Nothing,
+      methodName = Prelude.Nothing,
+      port = Prelude.Nothing,
+      serviceName = Prelude.Nothing
+    }
+
+-- | An object that represents the data to match from the request.
+grpcRouteMatch_metadata :: Lens.Lens' GrpcRouteMatch (Prelude.Maybe (Prelude.NonEmpty GrpcRouteMetadata))
+grpcRouteMatch_metadata = Lens.lens (\GrpcRouteMatch' {metadata} -> metadata) (\s@GrpcRouteMatch' {} a -> s {metadata = a} :: GrpcRouteMatch) Prelude.. Lens.mapping Lens.coerced
+
+-- | The method name to match from the request. If you specify a name, you
+-- must also specify a @serviceName@.
+grpcRouteMatch_methodName :: Lens.Lens' GrpcRouteMatch (Prelude.Maybe Prelude.Text)
+grpcRouteMatch_methodName = Lens.lens (\GrpcRouteMatch' {methodName} -> methodName) (\s@GrpcRouteMatch' {} a -> s {methodName = a} :: GrpcRouteMatch)
+
+-- | The port number to match on.
+grpcRouteMatch_port :: Lens.Lens' GrpcRouteMatch (Prelude.Maybe Prelude.Natural)
+grpcRouteMatch_port = Lens.lens (\GrpcRouteMatch' {port} -> port) (\s@GrpcRouteMatch' {} a -> s {port = a} :: GrpcRouteMatch)
+
+-- | The fully qualified domain name for the service to match from the
+-- request.
+grpcRouteMatch_serviceName :: Lens.Lens' GrpcRouteMatch (Prelude.Maybe Prelude.Text)
+grpcRouteMatch_serviceName = Lens.lens (\GrpcRouteMatch' {serviceName} -> serviceName) (\s@GrpcRouteMatch' {} a -> s {serviceName = a} :: GrpcRouteMatch)
+
+instance Data.FromJSON GrpcRouteMatch where
+  parseJSON =
+    Data.withObject
+      "GrpcRouteMatch"
+      ( \x ->
+          GrpcRouteMatch'
+            Prelude.<$> (x Data..:? "metadata")
+            Prelude.<*> (x Data..:? "methodName")
+            Prelude.<*> (x Data..:? "port")
+            Prelude.<*> (x Data..:? "serviceName")
+      )
+
+instance Prelude.Hashable GrpcRouteMatch where
+  hashWithSalt _salt GrpcRouteMatch' {..} =
+    _salt
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` methodName
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` serviceName
+
+instance Prelude.NFData GrpcRouteMatch where
+  rnf GrpcRouteMatch' {..} =
+    Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf methodName
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf serviceName
+
+instance Data.ToJSON GrpcRouteMatch where
+  toJSON GrpcRouteMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("metadata" Data..=) Prelude.<$> metadata,
+            ("methodName" Data..=) Prelude.<$> methodName,
+            ("port" Data..=) Prelude.<$> port,
+            ("serviceName" Data..=) Prelude.<$> serviceName
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRouteMetadata.hs b/gen/Amazonka/AppMesh/Types/GrpcRouteMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRouteMetadata.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRouteMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRouteMetadata where
+
+import Amazonka.AppMesh.Types.GrpcRouteMetadataMatchMethod
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the match metadata for the route.
+--
+-- /See:/ 'newGrpcRouteMetadata' smart constructor.
+data GrpcRouteMetadata = GrpcRouteMetadata'
+  { -- | Specify @True@ to match anything except the match criteria. The default
+    -- value is @False@.
+    invert :: Prelude.Maybe Prelude.Bool,
+    -- | An object that represents the data to match from the request.
+    match :: Prelude.Maybe GrpcRouteMetadataMatchMethod,
+    -- | The name of the route.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcRouteMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'invert', 'grpcRouteMetadata_invert' - Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+--
+-- 'match', 'grpcRouteMetadata_match' - An object that represents the data to match from the request.
+--
+-- 'name', 'grpcRouteMetadata_name' - The name of the route.
+newGrpcRouteMetadata ::
+  -- | 'name'
+  Prelude.Text ->
+  GrpcRouteMetadata
+newGrpcRouteMetadata pName_ =
+  GrpcRouteMetadata'
+    { invert = Prelude.Nothing,
+      match = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+grpcRouteMetadata_invert :: Lens.Lens' GrpcRouteMetadata (Prelude.Maybe Prelude.Bool)
+grpcRouteMetadata_invert = Lens.lens (\GrpcRouteMetadata' {invert} -> invert) (\s@GrpcRouteMetadata' {} a -> s {invert = a} :: GrpcRouteMetadata)
+
+-- | An object that represents the data to match from the request.
+grpcRouteMetadata_match :: Lens.Lens' GrpcRouteMetadata (Prelude.Maybe GrpcRouteMetadataMatchMethod)
+grpcRouteMetadata_match = Lens.lens (\GrpcRouteMetadata' {match} -> match) (\s@GrpcRouteMetadata' {} a -> s {match = a} :: GrpcRouteMetadata)
+
+-- | The name of the route.
+grpcRouteMetadata_name :: Lens.Lens' GrpcRouteMetadata Prelude.Text
+grpcRouteMetadata_name = Lens.lens (\GrpcRouteMetadata' {name} -> name) (\s@GrpcRouteMetadata' {} a -> s {name = a} :: GrpcRouteMetadata)
+
+instance Data.FromJSON GrpcRouteMetadata where
+  parseJSON =
+    Data.withObject
+      "GrpcRouteMetadata"
+      ( \x ->
+          GrpcRouteMetadata'
+            Prelude.<$> (x Data..:? "invert")
+            Prelude.<*> (x Data..:? "match")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable GrpcRouteMetadata where
+  hashWithSalt _salt GrpcRouteMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` invert
+      `Prelude.hashWithSalt` match
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData GrpcRouteMetadata where
+  rnf GrpcRouteMetadata' {..} =
+    Prelude.rnf invert
+      `Prelude.seq` Prelude.rnf match
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON GrpcRouteMetadata where
+  toJSON GrpcRouteMetadata' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("invert" Data..=) Prelude.<$> invert,
+            ("match" Data..=) Prelude.<$> match,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcRouteMetadataMatchMethod.hs b/gen/Amazonka/AppMesh/Types/GrpcRouteMetadataMatchMethod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcRouteMetadataMatchMethod.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcRouteMetadataMatchMethod
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcRouteMetadataMatchMethod where
+
+import Amazonka.AppMesh.Types.MatchRange
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the match method. Specify one of the match
+-- values.
+--
+-- /See:/ 'newGrpcRouteMetadataMatchMethod' smart constructor.
+data GrpcRouteMetadataMatchMethod = GrpcRouteMetadataMatchMethod'
+  { -- | The value sent by the client must match the specified value exactly.
+    exact :: Prelude.Maybe Prelude.Text,
+    -- | The value sent by the client must begin with the specified characters.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | An object that represents the range of values to match on.
+    range :: Prelude.Maybe MatchRange,
+    -- | The value sent by the client must include the specified characters.
+    regex :: Prelude.Maybe Prelude.Text,
+    -- | The value sent by the client must end with the specified characters.
+    suffix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcRouteMetadataMatchMethod' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'grpcRouteMetadataMatchMethod_exact' - The value sent by the client must match the specified value exactly.
+--
+-- 'prefix', 'grpcRouteMetadataMatchMethod_prefix' - The value sent by the client must begin with the specified characters.
+--
+-- 'range', 'grpcRouteMetadataMatchMethod_range' - An object that represents the range of values to match on.
+--
+-- 'regex', 'grpcRouteMetadataMatchMethod_regex' - The value sent by the client must include the specified characters.
+--
+-- 'suffix', 'grpcRouteMetadataMatchMethod_suffix' - The value sent by the client must end with the specified characters.
+newGrpcRouteMetadataMatchMethod ::
+  GrpcRouteMetadataMatchMethod
+newGrpcRouteMetadataMatchMethod =
+  GrpcRouteMetadataMatchMethod'
+    { exact =
+        Prelude.Nothing,
+      prefix = Prelude.Nothing,
+      range = Prelude.Nothing,
+      regex = Prelude.Nothing,
+      suffix = Prelude.Nothing
+    }
+
+-- | The value sent by the client must match the specified value exactly.
+grpcRouteMetadataMatchMethod_exact :: Lens.Lens' GrpcRouteMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcRouteMetadataMatchMethod_exact = Lens.lens (\GrpcRouteMetadataMatchMethod' {exact} -> exact) (\s@GrpcRouteMetadataMatchMethod' {} a -> s {exact = a} :: GrpcRouteMetadataMatchMethod)
+
+-- | The value sent by the client must begin with the specified characters.
+grpcRouteMetadataMatchMethod_prefix :: Lens.Lens' GrpcRouteMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcRouteMetadataMatchMethod_prefix = Lens.lens (\GrpcRouteMetadataMatchMethod' {prefix} -> prefix) (\s@GrpcRouteMetadataMatchMethod' {} a -> s {prefix = a} :: GrpcRouteMetadataMatchMethod)
+
+-- | An object that represents the range of values to match on.
+grpcRouteMetadataMatchMethod_range :: Lens.Lens' GrpcRouteMetadataMatchMethod (Prelude.Maybe MatchRange)
+grpcRouteMetadataMatchMethod_range = Lens.lens (\GrpcRouteMetadataMatchMethod' {range} -> range) (\s@GrpcRouteMetadataMatchMethod' {} a -> s {range = a} :: GrpcRouteMetadataMatchMethod)
+
+-- | The value sent by the client must include the specified characters.
+grpcRouteMetadataMatchMethod_regex :: Lens.Lens' GrpcRouteMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcRouteMetadataMatchMethod_regex = Lens.lens (\GrpcRouteMetadataMatchMethod' {regex} -> regex) (\s@GrpcRouteMetadataMatchMethod' {} a -> s {regex = a} :: GrpcRouteMetadataMatchMethod)
+
+-- | The value sent by the client must end with the specified characters.
+grpcRouteMetadataMatchMethod_suffix :: Lens.Lens' GrpcRouteMetadataMatchMethod (Prelude.Maybe Prelude.Text)
+grpcRouteMetadataMatchMethod_suffix = Lens.lens (\GrpcRouteMetadataMatchMethod' {suffix} -> suffix) (\s@GrpcRouteMetadataMatchMethod' {} a -> s {suffix = a} :: GrpcRouteMetadataMatchMethod)
+
+instance Data.FromJSON GrpcRouteMetadataMatchMethod where
+  parseJSON =
+    Data.withObject
+      "GrpcRouteMetadataMatchMethod"
+      ( \x ->
+          GrpcRouteMetadataMatchMethod'
+            Prelude.<$> (x Data..:? "exact")
+            Prelude.<*> (x Data..:? "prefix")
+            Prelude.<*> (x Data..:? "range")
+            Prelude.<*> (x Data..:? "regex")
+            Prelude.<*> (x Data..:? "suffix")
+      )
+
+instance
+  Prelude.Hashable
+    GrpcRouteMetadataMatchMethod
+  where
+  hashWithSalt _salt GrpcRouteMetadataMatchMethod' {..} =
+    _salt
+      `Prelude.hashWithSalt` exact
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` range
+      `Prelude.hashWithSalt` regex
+      `Prelude.hashWithSalt` suffix
+
+instance Prelude.NFData GrpcRouteMetadataMatchMethod where
+  rnf GrpcRouteMetadataMatchMethod' {..} =
+    Prelude.rnf exact
+      `Prelude.seq` Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf range
+      `Prelude.seq` Prelude.rnf regex
+      `Prelude.seq` Prelude.rnf suffix
+
+instance Data.ToJSON GrpcRouteMetadataMatchMethod where
+  toJSON GrpcRouteMetadataMatchMethod' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("exact" Data..=) Prelude.<$> exact,
+            ("prefix" Data..=) Prelude.<$> prefix,
+            ("range" Data..=) Prelude.<$> range,
+            ("regex" Data..=) Prelude.<$> regex,
+            ("suffix" Data..=) Prelude.<$> suffix
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/GrpcTimeout.hs b/gen/Amazonka/AppMesh/Types/GrpcTimeout.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/GrpcTimeout.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.GrpcTimeout
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.GrpcTimeout where
+
+import Amazonka.AppMesh.Types.Duration
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents types of timeouts.
+--
+-- /See:/ 'newGrpcTimeout' smart constructor.
+data GrpcTimeout = GrpcTimeout'
+  { -- | An object that represents an idle timeout. An idle timeout bounds the
+    -- amount of time that a connection may be idle. The default value is none.
+    idle :: Prelude.Maybe Duration,
+    -- | An object that represents a per request timeout. The default value is 15
+    -- seconds. If you set a higher timeout, then make sure that the higher
+    -- value is set for each App Mesh resource in a conversation. For example,
+    -- if a virtual node backend uses a virtual router provider to route to
+    -- another virtual node, then the timeout should be greater than 15 seconds
+    -- for the source and destination virtual node and the route.
+    perRequest :: Prelude.Maybe Duration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GrpcTimeout' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'idle', 'grpcTimeout_idle' - An object that represents an idle timeout. An idle timeout bounds the
+-- amount of time that a connection may be idle. The default value is none.
+--
+-- 'perRequest', 'grpcTimeout_perRequest' - An object that represents a per request timeout. The default value is 15
+-- seconds. If you set a higher timeout, then make sure that the higher
+-- value is set for each App Mesh resource in a conversation. For example,
+-- if a virtual node backend uses a virtual router provider to route to
+-- another virtual node, then the timeout should be greater than 15 seconds
+-- for the source and destination virtual node and the route.
+newGrpcTimeout ::
+  GrpcTimeout
+newGrpcTimeout =
+  GrpcTimeout'
+    { idle = Prelude.Nothing,
+      perRequest = Prelude.Nothing
+    }
+
+-- | An object that represents an idle timeout. An idle timeout bounds the
+-- amount of time that a connection may be idle. The default value is none.
+grpcTimeout_idle :: Lens.Lens' GrpcTimeout (Prelude.Maybe Duration)
+grpcTimeout_idle = Lens.lens (\GrpcTimeout' {idle} -> idle) (\s@GrpcTimeout' {} a -> s {idle = a} :: GrpcTimeout)
+
+-- | An object that represents a per request timeout. The default value is 15
+-- seconds. If you set a higher timeout, then make sure that the higher
+-- value is set for each App Mesh resource in a conversation. For example,
+-- if a virtual node backend uses a virtual router provider to route to
+-- another virtual node, then the timeout should be greater than 15 seconds
+-- for the source and destination virtual node and the route.
+grpcTimeout_perRequest :: Lens.Lens' GrpcTimeout (Prelude.Maybe Duration)
+grpcTimeout_perRequest = Lens.lens (\GrpcTimeout' {perRequest} -> perRequest) (\s@GrpcTimeout' {} a -> s {perRequest = a} :: GrpcTimeout)
+
+instance Data.FromJSON GrpcTimeout where
+  parseJSON =
+    Data.withObject
+      "GrpcTimeout"
+      ( \x ->
+          GrpcTimeout'
+            Prelude.<$> (x Data..:? "idle")
+            Prelude.<*> (x Data..:? "perRequest")
+      )
+
+instance Prelude.Hashable GrpcTimeout where
+  hashWithSalt _salt GrpcTimeout' {..} =
+    _salt
+      `Prelude.hashWithSalt` idle
+      `Prelude.hashWithSalt` perRequest
+
+instance Prelude.NFData GrpcTimeout where
+  rnf GrpcTimeout' {..} =
+    Prelude.rnf idle
+      `Prelude.seq` Prelude.rnf perRequest
+
+instance Data.ToJSON GrpcTimeout where
+  toJSON GrpcTimeout' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("idle" Data..=) Prelude.<$> idle,
+            ("perRequest" Data..=) Prelude.<$> perRequest
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HeaderMatchMethod.hs b/gen/Amazonka/AppMesh/Types/HeaderMatchMethod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HeaderMatchMethod.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HeaderMatchMethod
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HeaderMatchMethod where
+
+import Amazonka.AppMesh.Types.MatchRange
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the method and value to match with the header
+-- value sent in a request. Specify one match method.
+--
+-- /See:/ 'newHeaderMatchMethod' smart constructor.
+data HeaderMatchMethod = HeaderMatchMethod'
+  { -- | The value sent by the client must match the specified value exactly.
+    exact :: Prelude.Maybe Prelude.Text,
+    -- | The value sent by the client must begin with the specified characters.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | An object that represents the range of values to match on.
+    range :: Prelude.Maybe MatchRange,
+    -- | The value sent by the client must include the specified characters.
+    regex :: Prelude.Maybe Prelude.Text,
+    -- | The value sent by the client must end with the specified characters.
+    suffix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HeaderMatchMethod' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'headerMatchMethod_exact' - The value sent by the client must match the specified value exactly.
+--
+-- 'prefix', 'headerMatchMethod_prefix' - The value sent by the client must begin with the specified characters.
+--
+-- 'range', 'headerMatchMethod_range' - An object that represents the range of values to match on.
+--
+-- 'regex', 'headerMatchMethod_regex' - The value sent by the client must include the specified characters.
+--
+-- 'suffix', 'headerMatchMethod_suffix' - The value sent by the client must end with the specified characters.
+newHeaderMatchMethod ::
+  HeaderMatchMethod
+newHeaderMatchMethod =
+  HeaderMatchMethod'
+    { exact = Prelude.Nothing,
+      prefix = Prelude.Nothing,
+      range = Prelude.Nothing,
+      regex = Prelude.Nothing,
+      suffix = Prelude.Nothing
+    }
+
+-- | The value sent by the client must match the specified value exactly.
+headerMatchMethod_exact :: Lens.Lens' HeaderMatchMethod (Prelude.Maybe Prelude.Text)
+headerMatchMethod_exact = Lens.lens (\HeaderMatchMethod' {exact} -> exact) (\s@HeaderMatchMethod' {} a -> s {exact = a} :: HeaderMatchMethod)
+
+-- | The value sent by the client must begin with the specified characters.
+headerMatchMethod_prefix :: Lens.Lens' HeaderMatchMethod (Prelude.Maybe Prelude.Text)
+headerMatchMethod_prefix = Lens.lens (\HeaderMatchMethod' {prefix} -> prefix) (\s@HeaderMatchMethod' {} a -> s {prefix = a} :: HeaderMatchMethod)
+
+-- | An object that represents the range of values to match on.
+headerMatchMethod_range :: Lens.Lens' HeaderMatchMethod (Prelude.Maybe MatchRange)
+headerMatchMethod_range = Lens.lens (\HeaderMatchMethod' {range} -> range) (\s@HeaderMatchMethod' {} a -> s {range = a} :: HeaderMatchMethod)
+
+-- | The value sent by the client must include the specified characters.
+headerMatchMethod_regex :: Lens.Lens' HeaderMatchMethod (Prelude.Maybe Prelude.Text)
+headerMatchMethod_regex = Lens.lens (\HeaderMatchMethod' {regex} -> regex) (\s@HeaderMatchMethod' {} a -> s {regex = a} :: HeaderMatchMethod)
+
+-- | The value sent by the client must end with the specified characters.
+headerMatchMethod_suffix :: Lens.Lens' HeaderMatchMethod (Prelude.Maybe Prelude.Text)
+headerMatchMethod_suffix = Lens.lens (\HeaderMatchMethod' {suffix} -> suffix) (\s@HeaderMatchMethod' {} a -> s {suffix = a} :: HeaderMatchMethod)
+
+instance Data.FromJSON HeaderMatchMethod where
+  parseJSON =
+    Data.withObject
+      "HeaderMatchMethod"
+      ( \x ->
+          HeaderMatchMethod'
+            Prelude.<$> (x Data..:? "exact")
+            Prelude.<*> (x Data..:? "prefix")
+            Prelude.<*> (x Data..:? "range")
+            Prelude.<*> (x Data..:? "regex")
+            Prelude.<*> (x Data..:? "suffix")
+      )
+
+instance Prelude.Hashable HeaderMatchMethod where
+  hashWithSalt _salt HeaderMatchMethod' {..} =
+    _salt
+      `Prelude.hashWithSalt` exact
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` range
+      `Prelude.hashWithSalt` regex
+      `Prelude.hashWithSalt` suffix
+
+instance Prelude.NFData HeaderMatchMethod where
+  rnf HeaderMatchMethod' {..} =
+    Prelude.rnf exact
+      `Prelude.seq` Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf range
+      `Prelude.seq` Prelude.rnf regex
+      `Prelude.seq` Prelude.rnf suffix
+
+instance Data.ToJSON HeaderMatchMethod where
+  toJSON HeaderMatchMethod' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("exact" Data..=) Prelude.<$> exact,
+            ("prefix" Data..=) Prelude.<$> prefix,
+            ("range" Data..=) Prelude.<$> range,
+            ("regex" Data..=) Prelude.<$> regex,
+            ("suffix" Data..=) Prelude.<$> suffix
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HealthCheckPolicy.hs b/gen/Amazonka/AppMesh/Types/HealthCheckPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HealthCheckPolicy.hs
@@ -0,0 +1,202 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HealthCheckPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HealthCheckPolicy where
+
+import Amazonka.AppMesh.Types.PortProtocol
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the health check policy for a virtual node\'s
+-- listener.
+--
+-- /See:/ 'newHealthCheckPolicy' smart constructor.
+data HealthCheckPolicy = HealthCheckPolicy'
+  { -- | The destination path for the health check request. This value is only
+    -- used if the specified protocol is HTTP or HTTP\/2. For any other
+    -- protocol, this value is ignored.
+    path :: Prelude.Maybe Prelude.Text,
+    -- | The destination port for the health check request. This port must match
+    -- the port defined in the PortMapping for the listener.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | The number of consecutive successful health checks that must occur
+    -- before declaring listener healthy.
+    healthyThreshold :: Prelude.Natural,
+    -- | The time period in milliseconds between each health check execution.
+    intervalMillis :: Prelude.Natural,
+    -- | The protocol for the health check request. If you specify @grpc@, then
+    -- your service must conform to the
+    -- <https://github.com/grpc/grpc/blob/master/doc/health-checking.md GRPC Health Checking Protocol>.
+    protocol :: PortProtocol,
+    -- | The amount of time to wait when receiving a response from the health
+    -- check, in milliseconds.
+    timeoutMillis :: Prelude.Natural,
+    -- | The number of consecutive failed health checks that must occur before
+    -- declaring a virtual node unhealthy.
+    unhealthyThreshold :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HealthCheckPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'path', 'healthCheckPolicy_path' - The destination path for the health check request. This value is only
+-- used if the specified protocol is HTTP or HTTP\/2. For any other
+-- protocol, this value is ignored.
+--
+-- 'port', 'healthCheckPolicy_port' - The destination port for the health check request. This port must match
+-- the port defined in the PortMapping for the listener.
+--
+-- 'healthyThreshold', 'healthCheckPolicy_healthyThreshold' - The number of consecutive successful health checks that must occur
+-- before declaring listener healthy.
+--
+-- 'intervalMillis', 'healthCheckPolicy_intervalMillis' - The time period in milliseconds between each health check execution.
+--
+-- 'protocol', 'healthCheckPolicy_protocol' - The protocol for the health check request. If you specify @grpc@, then
+-- your service must conform to the
+-- <https://github.com/grpc/grpc/blob/master/doc/health-checking.md GRPC Health Checking Protocol>.
+--
+-- 'timeoutMillis', 'healthCheckPolicy_timeoutMillis' - The amount of time to wait when receiving a response from the health
+-- check, in milliseconds.
+--
+-- 'unhealthyThreshold', 'healthCheckPolicy_unhealthyThreshold' - The number of consecutive failed health checks that must occur before
+-- declaring a virtual node unhealthy.
+newHealthCheckPolicy ::
+  -- | 'healthyThreshold'
+  Prelude.Natural ->
+  -- | 'intervalMillis'
+  Prelude.Natural ->
+  -- | 'protocol'
+  PortProtocol ->
+  -- | 'timeoutMillis'
+  Prelude.Natural ->
+  -- | 'unhealthyThreshold'
+  Prelude.Natural ->
+  HealthCheckPolicy
+newHealthCheckPolicy
+  pHealthyThreshold_
+  pIntervalMillis_
+  pProtocol_
+  pTimeoutMillis_
+  pUnhealthyThreshold_ =
+    HealthCheckPolicy'
+      { path = Prelude.Nothing,
+        port = Prelude.Nothing,
+        healthyThreshold = pHealthyThreshold_,
+        intervalMillis = pIntervalMillis_,
+        protocol = pProtocol_,
+        timeoutMillis = pTimeoutMillis_,
+        unhealthyThreshold = pUnhealthyThreshold_
+      }
+
+-- | The destination path for the health check request. This value is only
+-- used if the specified protocol is HTTP or HTTP\/2. For any other
+-- protocol, this value is ignored.
+healthCheckPolicy_path :: Lens.Lens' HealthCheckPolicy (Prelude.Maybe Prelude.Text)
+healthCheckPolicy_path = Lens.lens (\HealthCheckPolicy' {path} -> path) (\s@HealthCheckPolicy' {} a -> s {path = a} :: HealthCheckPolicy)
+
+-- | The destination port for the health check request. This port must match
+-- the port defined in the PortMapping for the listener.
+healthCheckPolicy_port :: Lens.Lens' HealthCheckPolicy (Prelude.Maybe Prelude.Natural)
+healthCheckPolicy_port = Lens.lens (\HealthCheckPolicy' {port} -> port) (\s@HealthCheckPolicy' {} a -> s {port = a} :: HealthCheckPolicy)
+
+-- | The number of consecutive successful health checks that must occur
+-- before declaring listener healthy.
+healthCheckPolicy_healthyThreshold :: Lens.Lens' HealthCheckPolicy Prelude.Natural
+healthCheckPolicy_healthyThreshold = Lens.lens (\HealthCheckPolicy' {healthyThreshold} -> healthyThreshold) (\s@HealthCheckPolicy' {} a -> s {healthyThreshold = a} :: HealthCheckPolicy)
+
+-- | The time period in milliseconds between each health check execution.
+healthCheckPolicy_intervalMillis :: Lens.Lens' HealthCheckPolicy Prelude.Natural
+healthCheckPolicy_intervalMillis = Lens.lens (\HealthCheckPolicy' {intervalMillis} -> intervalMillis) (\s@HealthCheckPolicy' {} a -> s {intervalMillis = a} :: HealthCheckPolicy)
+
+-- | The protocol for the health check request. If you specify @grpc@, then
+-- your service must conform to the
+-- <https://github.com/grpc/grpc/blob/master/doc/health-checking.md GRPC Health Checking Protocol>.
+healthCheckPolicy_protocol :: Lens.Lens' HealthCheckPolicy PortProtocol
+healthCheckPolicy_protocol = Lens.lens (\HealthCheckPolicy' {protocol} -> protocol) (\s@HealthCheckPolicy' {} a -> s {protocol = a} :: HealthCheckPolicy)
+
+-- | The amount of time to wait when receiving a response from the health
+-- check, in milliseconds.
+healthCheckPolicy_timeoutMillis :: Lens.Lens' HealthCheckPolicy Prelude.Natural
+healthCheckPolicy_timeoutMillis = Lens.lens (\HealthCheckPolicy' {timeoutMillis} -> timeoutMillis) (\s@HealthCheckPolicy' {} a -> s {timeoutMillis = a} :: HealthCheckPolicy)
+
+-- | The number of consecutive failed health checks that must occur before
+-- declaring a virtual node unhealthy.
+healthCheckPolicy_unhealthyThreshold :: Lens.Lens' HealthCheckPolicy Prelude.Natural
+healthCheckPolicy_unhealthyThreshold = Lens.lens (\HealthCheckPolicy' {unhealthyThreshold} -> unhealthyThreshold) (\s@HealthCheckPolicy' {} a -> s {unhealthyThreshold = a} :: HealthCheckPolicy)
+
+instance Data.FromJSON HealthCheckPolicy where
+  parseJSON =
+    Data.withObject
+      "HealthCheckPolicy"
+      ( \x ->
+          HealthCheckPolicy'
+            Prelude.<$> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "port")
+            Prelude.<*> (x Data..: "healthyThreshold")
+            Prelude.<*> (x Data..: "intervalMillis")
+            Prelude.<*> (x Data..: "protocol")
+            Prelude.<*> (x Data..: "timeoutMillis")
+            Prelude.<*> (x Data..: "unhealthyThreshold")
+      )
+
+instance Prelude.Hashable HealthCheckPolicy where
+  hashWithSalt _salt HealthCheckPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` path
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` healthyThreshold
+      `Prelude.hashWithSalt` intervalMillis
+      `Prelude.hashWithSalt` protocol
+      `Prelude.hashWithSalt` timeoutMillis
+      `Prelude.hashWithSalt` unhealthyThreshold
+
+instance Prelude.NFData HealthCheckPolicy where
+  rnf HealthCheckPolicy' {..} =
+    Prelude.rnf path
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf healthyThreshold
+      `Prelude.seq` Prelude.rnf intervalMillis
+      `Prelude.seq` Prelude.rnf protocol
+      `Prelude.seq` Prelude.rnf timeoutMillis
+      `Prelude.seq` Prelude.rnf unhealthyThreshold
+
+instance Data.ToJSON HealthCheckPolicy where
+  toJSON HealthCheckPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("path" Data..=) Prelude.<$> path,
+            ("port" Data..=) Prelude.<$> port,
+            Prelude.Just
+              ("healthyThreshold" Data..= healthyThreshold),
+            Prelude.Just
+              ("intervalMillis" Data..= intervalMillis),
+            Prelude.Just ("protocol" Data..= protocol),
+            Prelude.Just ("timeoutMillis" Data..= timeoutMillis),
+            Prelude.Just
+              ("unhealthyThreshold" Data..= unhealthyThreshold)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRoute.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRoute.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRoute where
+
+import Amazonka.AppMesh.Types.HttpGatewayRouteAction
+import Amazonka.AppMesh.Types.HttpGatewayRouteMatch
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents an HTTP gateway route.
+--
+-- /See:/ 'newHttpGatewayRoute' smart constructor.
+data HttpGatewayRoute = HttpGatewayRoute'
+  { -- | An object that represents the action to take if a match is determined.
+    action :: HttpGatewayRouteAction,
+    -- | An object that represents the criteria for determining a request match.
+    match :: HttpGatewayRouteMatch
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'action', 'httpGatewayRoute_action' - An object that represents the action to take if a match is determined.
+--
+-- 'match', 'httpGatewayRoute_match' - An object that represents the criteria for determining a request match.
+newHttpGatewayRoute ::
+  -- | 'action'
+  HttpGatewayRouteAction ->
+  -- | 'match'
+  HttpGatewayRouteMatch ->
+  HttpGatewayRoute
+newHttpGatewayRoute pAction_ pMatch_ =
+  HttpGatewayRoute'
+    { action = pAction_,
+      match = pMatch_
+    }
+
+-- | An object that represents the action to take if a match is determined.
+httpGatewayRoute_action :: Lens.Lens' HttpGatewayRoute HttpGatewayRouteAction
+httpGatewayRoute_action = Lens.lens (\HttpGatewayRoute' {action} -> action) (\s@HttpGatewayRoute' {} a -> s {action = a} :: HttpGatewayRoute)
+
+-- | An object that represents the criteria for determining a request match.
+httpGatewayRoute_match :: Lens.Lens' HttpGatewayRoute HttpGatewayRouteMatch
+httpGatewayRoute_match = Lens.lens (\HttpGatewayRoute' {match} -> match) (\s@HttpGatewayRoute' {} a -> s {match = a} :: HttpGatewayRoute)
+
+instance Data.FromJSON HttpGatewayRoute where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRoute"
+      ( \x ->
+          HttpGatewayRoute'
+            Prelude.<$> (x Data..: "action")
+            Prelude.<*> (x Data..: "match")
+      )
+
+instance Prelude.Hashable HttpGatewayRoute where
+  hashWithSalt _salt HttpGatewayRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` match
+
+instance Prelude.NFData HttpGatewayRoute where
+  rnf HttpGatewayRoute' {..} =
+    Prelude.rnf action `Prelude.seq` Prelude.rnf match
+
+instance Data.ToJSON HttpGatewayRoute where
+  toJSON HttpGatewayRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("action" Data..= action),
+            Prelude.Just ("match" Data..= match)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRouteAction.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteAction.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRouteAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRouteAction where
+
+import Amazonka.AppMesh.Types.GatewayRouteTarget
+import Amazonka.AppMesh.Types.HttpGatewayRouteRewrite
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the action to take if a match is determined.
+--
+-- /See:/ 'newHttpGatewayRouteAction' smart constructor.
+data HttpGatewayRouteAction = HttpGatewayRouteAction'
+  { -- | The gateway route action to rewrite.
+    rewrite :: Prelude.Maybe HttpGatewayRouteRewrite,
+    -- | An object that represents the target that traffic is routed to when a
+    -- request matches the gateway route.
+    target :: GatewayRouteTarget
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRouteAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rewrite', 'httpGatewayRouteAction_rewrite' - The gateway route action to rewrite.
+--
+-- 'target', 'httpGatewayRouteAction_target' - An object that represents the target that traffic is routed to when a
+-- request matches the gateway route.
+newHttpGatewayRouteAction ::
+  -- | 'target'
+  GatewayRouteTarget ->
+  HttpGatewayRouteAction
+newHttpGatewayRouteAction pTarget_ =
+  HttpGatewayRouteAction'
+    { rewrite = Prelude.Nothing,
+      target = pTarget_
+    }
+
+-- | The gateway route action to rewrite.
+httpGatewayRouteAction_rewrite :: Lens.Lens' HttpGatewayRouteAction (Prelude.Maybe HttpGatewayRouteRewrite)
+httpGatewayRouteAction_rewrite = Lens.lens (\HttpGatewayRouteAction' {rewrite} -> rewrite) (\s@HttpGatewayRouteAction' {} a -> s {rewrite = a} :: HttpGatewayRouteAction)
+
+-- | An object that represents the target that traffic is routed to when a
+-- request matches the gateway route.
+httpGatewayRouteAction_target :: Lens.Lens' HttpGatewayRouteAction GatewayRouteTarget
+httpGatewayRouteAction_target = Lens.lens (\HttpGatewayRouteAction' {target} -> target) (\s@HttpGatewayRouteAction' {} a -> s {target = a} :: HttpGatewayRouteAction)
+
+instance Data.FromJSON HttpGatewayRouteAction where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRouteAction"
+      ( \x ->
+          HttpGatewayRouteAction'
+            Prelude.<$> (x Data..:? "rewrite")
+            Prelude.<*> (x Data..: "target")
+      )
+
+instance Prelude.Hashable HttpGatewayRouteAction where
+  hashWithSalt _salt HttpGatewayRouteAction' {..} =
+    _salt
+      `Prelude.hashWithSalt` rewrite
+      `Prelude.hashWithSalt` target
+
+instance Prelude.NFData HttpGatewayRouteAction where
+  rnf HttpGatewayRouteAction' {..} =
+    Prelude.rnf rewrite
+      `Prelude.seq` Prelude.rnf target
+
+instance Data.ToJSON HttpGatewayRouteAction where
+  toJSON HttpGatewayRouteAction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("rewrite" Data..=) Prelude.<$> rewrite,
+            Prelude.Just ("target" Data..= target)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRouteHeader.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteHeader.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteHeader.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRouteHeader
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRouteHeader where
+
+import Amazonka.AppMesh.Types.HeaderMatchMethod
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the HTTP header in the gateway route.
+--
+-- /See:/ 'newHttpGatewayRouteHeader' smart constructor.
+data HttpGatewayRouteHeader = HttpGatewayRouteHeader'
+  { -- | Specify @True@ to match anything except the match criteria. The default
+    -- value is @False@.
+    invert :: Prelude.Maybe Prelude.Bool,
+    -- | An object that represents the method and value to match with the header
+    -- value sent in a request. Specify one match method.
+    match :: Prelude.Maybe HeaderMatchMethod,
+    -- | A name for the HTTP header in the gateway route that will be matched on.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRouteHeader' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'invert', 'httpGatewayRouteHeader_invert' - Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+--
+-- 'match', 'httpGatewayRouteHeader_match' - An object that represents the method and value to match with the header
+-- value sent in a request. Specify one match method.
+--
+-- 'name', 'httpGatewayRouteHeader_name' - A name for the HTTP header in the gateway route that will be matched on.
+newHttpGatewayRouteHeader ::
+  -- | 'name'
+  Prelude.Text ->
+  HttpGatewayRouteHeader
+newHttpGatewayRouteHeader pName_ =
+  HttpGatewayRouteHeader'
+    { invert = Prelude.Nothing,
+      match = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+httpGatewayRouteHeader_invert :: Lens.Lens' HttpGatewayRouteHeader (Prelude.Maybe Prelude.Bool)
+httpGatewayRouteHeader_invert = Lens.lens (\HttpGatewayRouteHeader' {invert} -> invert) (\s@HttpGatewayRouteHeader' {} a -> s {invert = a} :: HttpGatewayRouteHeader)
+
+-- | An object that represents the method and value to match with the header
+-- value sent in a request. Specify one match method.
+httpGatewayRouteHeader_match :: Lens.Lens' HttpGatewayRouteHeader (Prelude.Maybe HeaderMatchMethod)
+httpGatewayRouteHeader_match = Lens.lens (\HttpGatewayRouteHeader' {match} -> match) (\s@HttpGatewayRouteHeader' {} a -> s {match = a} :: HttpGatewayRouteHeader)
+
+-- | A name for the HTTP header in the gateway route that will be matched on.
+httpGatewayRouteHeader_name :: Lens.Lens' HttpGatewayRouteHeader Prelude.Text
+httpGatewayRouteHeader_name = Lens.lens (\HttpGatewayRouteHeader' {name} -> name) (\s@HttpGatewayRouteHeader' {} a -> s {name = a} :: HttpGatewayRouteHeader)
+
+instance Data.FromJSON HttpGatewayRouteHeader where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRouteHeader"
+      ( \x ->
+          HttpGatewayRouteHeader'
+            Prelude.<$> (x Data..:? "invert")
+            Prelude.<*> (x Data..:? "match")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable HttpGatewayRouteHeader where
+  hashWithSalt _salt HttpGatewayRouteHeader' {..} =
+    _salt
+      `Prelude.hashWithSalt` invert
+      `Prelude.hashWithSalt` match
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData HttpGatewayRouteHeader where
+  rnf HttpGatewayRouteHeader' {..} =
+    Prelude.rnf invert
+      `Prelude.seq` Prelude.rnf match
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON HttpGatewayRouteHeader where
+  toJSON HttpGatewayRouteHeader' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("invert" Data..=) Prelude.<$> invert,
+            ("match" Data..=) Prelude.<$> match,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRouteMatch.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteMatch.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRouteMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRouteMatch where
+
+import Amazonka.AppMesh.Types.GatewayRouteHostnameMatch
+import Amazonka.AppMesh.Types.HttpGatewayRouteHeader
+import Amazonka.AppMesh.Types.HttpMethod
+import Amazonka.AppMesh.Types.HttpPathMatch
+import Amazonka.AppMesh.Types.HttpQueryParameter
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the criteria for determining a request match.
+--
+-- /See:/ 'newHttpGatewayRouteMatch' smart constructor.
+data HttpGatewayRouteMatch = HttpGatewayRouteMatch'
+  { -- | The client request headers to match on.
+    headers :: Prelude.Maybe (Prelude.NonEmpty HttpGatewayRouteHeader),
+    -- | The host name to match on.
+    hostname :: Prelude.Maybe GatewayRouteHostnameMatch,
+    -- | The method to match on.
+    method :: Prelude.Maybe HttpMethod,
+    -- | The path to match on.
+    path :: Prelude.Maybe HttpPathMatch,
+    -- | The port number to match on.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | Specifies the path to match requests with. This parameter must always
+    -- start with @\/@, which by itself matches all requests to the virtual
+    -- service name. You can also match for path-based routing of requests. For
+    -- example, if your virtual service name is @my-service.local@ and you want
+    -- the route to match requests to @my-service.local\/metrics@, your prefix
+    -- should be @\/metrics@.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | The query parameter to match on.
+    queryParameters :: Prelude.Maybe (Prelude.NonEmpty HttpQueryParameter)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRouteMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'headers', 'httpGatewayRouteMatch_headers' - The client request headers to match on.
+--
+-- 'hostname', 'httpGatewayRouteMatch_hostname' - The host name to match on.
+--
+-- 'method', 'httpGatewayRouteMatch_method' - The method to match on.
+--
+-- 'path', 'httpGatewayRouteMatch_path' - The path to match on.
+--
+-- 'port', 'httpGatewayRouteMatch_port' - The port number to match on.
+--
+-- 'prefix', 'httpGatewayRouteMatch_prefix' - Specifies the path to match requests with. This parameter must always
+-- start with @\/@, which by itself matches all requests to the virtual
+-- service name. You can also match for path-based routing of requests. For
+-- example, if your virtual service name is @my-service.local@ and you want
+-- the route to match requests to @my-service.local\/metrics@, your prefix
+-- should be @\/metrics@.
+--
+-- 'queryParameters', 'httpGatewayRouteMatch_queryParameters' - The query parameter to match on.
+newHttpGatewayRouteMatch ::
+  HttpGatewayRouteMatch
+newHttpGatewayRouteMatch =
+  HttpGatewayRouteMatch'
+    { headers = Prelude.Nothing,
+      hostname = Prelude.Nothing,
+      method = Prelude.Nothing,
+      path = Prelude.Nothing,
+      port = Prelude.Nothing,
+      prefix = Prelude.Nothing,
+      queryParameters = Prelude.Nothing
+    }
+
+-- | The client request headers to match on.
+httpGatewayRouteMatch_headers :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe (Prelude.NonEmpty HttpGatewayRouteHeader))
+httpGatewayRouteMatch_headers = Lens.lens (\HttpGatewayRouteMatch' {headers} -> headers) (\s@HttpGatewayRouteMatch' {} a -> s {headers = a} :: HttpGatewayRouteMatch) Prelude.. Lens.mapping Lens.coerced
+
+-- | The host name to match on.
+httpGatewayRouteMatch_hostname :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe GatewayRouteHostnameMatch)
+httpGatewayRouteMatch_hostname = Lens.lens (\HttpGatewayRouteMatch' {hostname} -> hostname) (\s@HttpGatewayRouteMatch' {} a -> s {hostname = a} :: HttpGatewayRouteMatch)
+
+-- | The method to match on.
+httpGatewayRouteMatch_method :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe HttpMethod)
+httpGatewayRouteMatch_method = Lens.lens (\HttpGatewayRouteMatch' {method} -> method) (\s@HttpGatewayRouteMatch' {} a -> s {method = a} :: HttpGatewayRouteMatch)
+
+-- | The path to match on.
+httpGatewayRouteMatch_path :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe HttpPathMatch)
+httpGatewayRouteMatch_path = Lens.lens (\HttpGatewayRouteMatch' {path} -> path) (\s@HttpGatewayRouteMatch' {} a -> s {path = a} :: HttpGatewayRouteMatch)
+
+-- | The port number to match on.
+httpGatewayRouteMatch_port :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe Prelude.Natural)
+httpGatewayRouteMatch_port = Lens.lens (\HttpGatewayRouteMatch' {port} -> port) (\s@HttpGatewayRouteMatch' {} a -> s {port = a} :: HttpGatewayRouteMatch)
+
+-- | Specifies the path to match requests with. This parameter must always
+-- start with @\/@, which by itself matches all requests to the virtual
+-- service name. You can also match for path-based routing of requests. For
+-- example, if your virtual service name is @my-service.local@ and you want
+-- the route to match requests to @my-service.local\/metrics@, your prefix
+-- should be @\/metrics@.
+httpGatewayRouteMatch_prefix :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe Prelude.Text)
+httpGatewayRouteMatch_prefix = Lens.lens (\HttpGatewayRouteMatch' {prefix} -> prefix) (\s@HttpGatewayRouteMatch' {} a -> s {prefix = a} :: HttpGatewayRouteMatch)
+
+-- | The query parameter to match on.
+httpGatewayRouteMatch_queryParameters :: Lens.Lens' HttpGatewayRouteMatch (Prelude.Maybe (Prelude.NonEmpty HttpQueryParameter))
+httpGatewayRouteMatch_queryParameters = Lens.lens (\HttpGatewayRouteMatch' {queryParameters} -> queryParameters) (\s@HttpGatewayRouteMatch' {} a -> s {queryParameters = a} :: HttpGatewayRouteMatch) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON HttpGatewayRouteMatch where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRouteMatch"
+      ( \x ->
+          HttpGatewayRouteMatch'
+            Prelude.<$> (x Data..:? "headers")
+            Prelude.<*> (x Data..:? "hostname")
+            Prelude.<*> (x Data..:? "method")
+            Prelude.<*> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "port")
+            Prelude.<*> (x Data..:? "prefix")
+            Prelude.<*> (x Data..:? "queryParameters")
+      )
+
+instance Prelude.Hashable HttpGatewayRouteMatch where
+  hashWithSalt _salt HttpGatewayRouteMatch' {..} =
+    _salt
+      `Prelude.hashWithSalt` headers
+      `Prelude.hashWithSalt` hostname
+      `Prelude.hashWithSalt` method
+      `Prelude.hashWithSalt` path
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` queryParameters
+
+instance Prelude.NFData HttpGatewayRouteMatch where
+  rnf HttpGatewayRouteMatch' {..} =
+    Prelude.rnf headers
+      `Prelude.seq` Prelude.rnf hostname
+      `Prelude.seq` Prelude.rnf method
+      `Prelude.seq` Prelude.rnf path
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf queryParameters
+
+instance Data.ToJSON HttpGatewayRouteMatch where
+  toJSON HttpGatewayRouteMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("headers" Data..=) Prelude.<$> headers,
+            ("hostname" Data..=) Prelude.<$> hostname,
+            ("method" Data..=) Prelude.<$> method,
+            ("path" Data..=) Prelude.<$> path,
+            ("port" Data..=) Prelude.<$> port,
+            ("prefix" Data..=) Prelude.<$> prefix,
+            ("queryParameters" Data..=)
+              Prelude.<$> queryParameters
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRoutePathRewrite.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRoutePathRewrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRoutePathRewrite.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRoutePathRewrite
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRoutePathRewrite where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the path to rewrite.
+--
+-- /See:/ 'newHttpGatewayRoutePathRewrite' smart constructor.
+data HttpGatewayRoutePathRewrite = HttpGatewayRoutePathRewrite'
+  { -- | The exact path to rewrite.
+    exact :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRoutePathRewrite' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'httpGatewayRoutePathRewrite_exact' - The exact path to rewrite.
+newHttpGatewayRoutePathRewrite ::
+  HttpGatewayRoutePathRewrite
+newHttpGatewayRoutePathRewrite =
+  HttpGatewayRoutePathRewrite'
+    { exact =
+        Prelude.Nothing
+    }
+
+-- | The exact path to rewrite.
+httpGatewayRoutePathRewrite_exact :: Lens.Lens' HttpGatewayRoutePathRewrite (Prelude.Maybe Prelude.Text)
+httpGatewayRoutePathRewrite_exact = Lens.lens (\HttpGatewayRoutePathRewrite' {exact} -> exact) (\s@HttpGatewayRoutePathRewrite' {} a -> s {exact = a} :: HttpGatewayRoutePathRewrite)
+
+instance Data.FromJSON HttpGatewayRoutePathRewrite where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRoutePathRewrite"
+      ( \x ->
+          HttpGatewayRoutePathRewrite'
+            Prelude.<$> (x Data..:? "exact")
+      )
+
+instance Prelude.Hashable HttpGatewayRoutePathRewrite where
+  hashWithSalt _salt HttpGatewayRoutePathRewrite' {..} =
+    _salt `Prelude.hashWithSalt` exact
+
+instance Prelude.NFData HttpGatewayRoutePathRewrite where
+  rnf HttpGatewayRoutePathRewrite' {..} =
+    Prelude.rnf exact
+
+instance Data.ToJSON HttpGatewayRoutePathRewrite where
+  toJSON HttpGatewayRoutePathRewrite' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("exact" Data..=) Prelude.<$> exact]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRoutePrefixRewrite.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRoutePrefixRewrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRoutePrefixRewrite.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRoutePrefixRewrite
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRoutePrefixRewrite where
+
+import Amazonka.AppMesh.Types.DefaultGatewayRouteRewrite
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the beginning characters of the route to rewrite.
+--
+-- /See:/ 'newHttpGatewayRoutePrefixRewrite' smart constructor.
+data HttpGatewayRoutePrefixRewrite = HttpGatewayRoutePrefixRewrite'
+  { -- | The default prefix used to replace the incoming route prefix when
+    -- rewritten.
+    defaultPrefix :: Prelude.Maybe DefaultGatewayRouteRewrite,
+    -- | The value used to replace the incoming route prefix when rewritten.
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRoutePrefixRewrite' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'defaultPrefix', 'httpGatewayRoutePrefixRewrite_defaultPrefix' - The default prefix used to replace the incoming route prefix when
+-- rewritten.
+--
+-- 'value', 'httpGatewayRoutePrefixRewrite_value' - The value used to replace the incoming route prefix when rewritten.
+newHttpGatewayRoutePrefixRewrite ::
+  HttpGatewayRoutePrefixRewrite
+newHttpGatewayRoutePrefixRewrite =
+  HttpGatewayRoutePrefixRewrite'
+    { defaultPrefix =
+        Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The default prefix used to replace the incoming route prefix when
+-- rewritten.
+httpGatewayRoutePrefixRewrite_defaultPrefix :: Lens.Lens' HttpGatewayRoutePrefixRewrite (Prelude.Maybe DefaultGatewayRouteRewrite)
+httpGatewayRoutePrefixRewrite_defaultPrefix = Lens.lens (\HttpGatewayRoutePrefixRewrite' {defaultPrefix} -> defaultPrefix) (\s@HttpGatewayRoutePrefixRewrite' {} a -> s {defaultPrefix = a} :: HttpGatewayRoutePrefixRewrite)
+
+-- | The value used to replace the incoming route prefix when rewritten.
+httpGatewayRoutePrefixRewrite_value :: Lens.Lens' HttpGatewayRoutePrefixRewrite (Prelude.Maybe Prelude.Text)
+httpGatewayRoutePrefixRewrite_value = Lens.lens (\HttpGatewayRoutePrefixRewrite' {value} -> value) (\s@HttpGatewayRoutePrefixRewrite' {} a -> s {value = a} :: HttpGatewayRoutePrefixRewrite)
+
+instance Data.FromJSON HttpGatewayRoutePrefixRewrite where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRoutePrefixRewrite"
+      ( \x ->
+          HttpGatewayRoutePrefixRewrite'
+            Prelude.<$> (x Data..:? "defaultPrefix")
+            Prelude.<*> (x Data..:? "value")
+      )
+
+instance
+  Prelude.Hashable
+    HttpGatewayRoutePrefixRewrite
+  where
+  hashWithSalt _salt HttpGatewayRoutePrefixRewrite' {..} =
+    _salt
+      `Prelude.hashWithSalt` defaultPrefix
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData HttpGatewayRoutePrefixRewrite where
+  rnf HttpGatewayRoutePrefixRewrite' {..} =
+    Prelude.rnf defaultPrefix
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON HttpGatewayRoutePrefixRewrite where
+  toJSON HttpGatewayRoutePrefixRewrite' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("defaultPrefix" Data..=) Prelude.<$> defaultPrefix,
+            ("value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpGatewayRouteRewrite.hs b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteRewrite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpGatewayRouteRewrite.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpGatewayRouteRewrite
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpGatewayRouteRewrite where
+
+import Amazonka.AppMesh.Types.GatewayRouteHostnameRewrite
+import Amazonka.AppMesh.Types.HttpGatewayRoutePathRewrite
+import Amazonka.AppMesh.Types.HttpGatewayRoutePrefixRewrite
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the gateway route to rewrite.
+--
+-- /See:/ 'newHttpGatewayRouteRewrite' smart constructor.
+data HttpGatewayRouteRewrite = HttpGatewayRouteRewrite'
+  { -- | The host name to rewrite.
+    hostname :: Prelude.Maybe GatewayRouteHostnameRewrite,
+    -- | The path to rewrite.
+    path :: Prelude.Maybe HttpGatewayRoutePathRewrite,
+    -- | The specified beginning characters to rewrite.
+    prefix :: Prelude.Maybe HttpGatewayRoutePrefixRewrite
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpGatewayRouteRewrite' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'hostname', 'httpGatewayRouteRewrite_hostname' - The host name to rewrite.
+--
+-- 'path', 'httpGatewayRouteRewrite_path' - The path to rewrite.
+--
+-- 'prefix', 'httpGatewayRouteRewrite_prefix' - The specified beginning characters to rewrite.
+newHttpGatewayRouteRewrite ::
+  HttpGatewayRouteRewrite
+newHttpGatewayRouteRewrite =
+  HttpGatewayRouteRewrite'
+    { hostname =
+        Prelude.Nothing,
+      path = Prelude.Nothing,
+      prefix = Prelude.Nothing
+    }
+
+-- | The host name to rewrite.
+httpGatewayRouteRewrite_hostname :: Lens.Lens' HttpGatewayRouteRewrite (Prelude.Maybe GatewayRouteHostnameRewrite)
+httpGatewayRouteRewrite_hostname = Lens.lens (\HttpGatewayRouteRewrite' {hostname} -> hostname) (\s@HttpGatewayRouteRewrite' {} a -> s {hostname = a} :: HttpGatewayRouteRewrite)
+
+-- | The path to rewrite.
+httpGatewayRouteRewrite_path :: Lens.Lens' HttpGatewayRouteRewrite (Prelude.Maybe HttpGatewayRoutePathRewrite)
+httpGatewayRouteRewrite_path = Lens.lens (\HttpGatewayRouteRewrite' {path} -> path) (\s@HttpGatewayRouteRewrite' {} a -> s {path = a} :: HttpGatewayRouteRewrite)
+
+-- | The specified beginning characters to rewrite.
+httpGatewayRouteRewrite_prefix :: Lens.Lens' HttpGatewayRouteRewrite (Prelude.Maybe HttpGatewayRoutePrefixRewrite)
+httpGatewayRouteRewrite_prefix = Lens.lens (\HttpGatewayRouteRewrite' {prefix} -> prefix) (\s@HttpGatewayRouteRewrite' {} a -> s {prefix = a} :: HttpGatewayRouteRewrite)
+
+instance Data.FromJSON HttpGatewayRouteRewrite where
+  parseJSON =
+    Data.withObject
+      "HttpGatewayRouteRewrite"
+      ( \x ->
+          HttpGatewayRouteRewrite'
+            Prelude.<$> (x Data..:? "hostname")
+            Prelude.<*> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "prefix")
+      )
+
+instance Prelude.Hashable HttpGatewayRouteRewrite where
+  hashWithSalt _salt HttpGatewayRouteRewrite' {..} =
+    _salt
+      `Prelude.hashWithSalt` hostname
+      `Prelude.hashWithSalt` path
+      `Prelude.hashWithSalt` prefix
+
+instance Prelude.NFData HttpGatewayRouteRewrite where
+  rnf HttpGatewayRouteRewrite' {..} =
+    Prelude.rnf hostname
+      `Prelude.seq` Prelude.rnf path
+      `Prelude.seq` Prelude.rnf prefix
+
+instance Data.ToJSON HttpGatewayRouteRewrite where
+  toJSON HttpGatewayRouteRewrite' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("hostname" Data..=) Prelude.<$> hostname,
+            ("path" Data..=) Prelude.<$> path,
+            ("prefix" Data..=) Prelude.<$> prefix
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpMethod.hs b/gen/Amazonka/AppMesh/Types/HttpMethod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpMethod.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpMethod
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpMethod
+  ( HttpMethod
+      ( ..,
+        HttpMethod_CONNECT,
+        HttpMethod_DELETE,
+        HttpMethod_GET,
+        HttpMethod_HEAD,
+        HttpMethod_OPTIONS,
+        HttpMethod_PATCH,
+        HttpMethod_POST,
+        HttpMethod_PUT,
+        HttpMethod_TRACE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype HttpMethod = HttpMethod'
+  { fromHttpMethod ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern HttpMethod_CONNECT :: HttpMethod
+pattern HttpMethod_CONNECT = HttpMethod' "CONNECT"
+
+pattern HttpMethod_DELETE :: HttpMethod
+pattern HttpMethod_DELETE = HttpMethod' "DELETE"
+
+pattern HttpMethod_GET :: HttpMethod
+pattern HttpMethod_GET = HttpMethod' "GET"
+
+pattern HttpMethod_HEAD :: HttpMethod
+pattern HttpMethod_HEAD = HttpMethod' "HEAD"
+
+pattern HttpMethod_OPTIONS :: HttpMethod
+pattern HttpMethod_OPTIONS = HttpMethod' "OPTIONS"
+
+pattern HttpMethod_PATCH :: HttpMethod
+pattern HttpMethod_PATCH = HttpMethod' "PATCH"
+
+pattern HttpMethod_POST :: HttpMethod
+pattern HttpMethod_POST = HttpMethod' "POST"
+
+pattern HttpMethod_PUT :: HttpMethod
+pattern HttpMethod_PUT = HttpMethod' "PUT"
+
+pattern HttpMethod_TRACE :: HttpMethod
+pattern HttpMethod_TRACE = HttpMethod' "TRACE"
+
+{-# COMPLETE
+  HttpMethod_CONNECT,
+  HttpMethod_DELETE,
+  HttpMethod_GET,
+  HttpMethod_HEAD,
+  HttpMethod_OPTIONS,
+  HttpMethod_PATCH,
+  HttpMethod_POST,
+  HttpMethod_PUT,
+  HttpMethod_TRACE,
+  HttpMethod'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/HttpPathMatch.hs b/gen/Amazonka/AppMesh/Types/HttpPathMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpPathMatch.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpPathMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpPathMatch where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the path to match in the request.
+--
+-- /See:/ 'newHttpPathMatch' smart constructor.
+data HttpPathMatch = HttpPathMatch'
+  { -- | The exact path to match on.
+    exact :: Prelude.Maybe Prelude.Text,
+    -- | The regex used to match the path.
+    regex :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpPathMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'httpPathMatch_exact' - The exact path to match on.
+--
+-- 'regex', 'httpPathMatch_regex' - The regex used to match the path.
+newHttpPathMatch ::
+  HttpPathMatch
+newHttpPathMatch =
+  HttpPathMatch'
+    { exact = Prelude.Nothing,
+      regex = Prelude.Nothing
+    }
+
+-- | The exact path to match on.
+httpPathMatch_exact :: Lens.Lens' HttpPathMatch (Prelude.Maybe Prelude.Text)
+httpPathMatch_exact = Lens.lens (\HttpPathMatch' {exact} -> exact) (\s@HttpPathMatch' {} a -> s {exact = a} :: HttpPathMatch)
+
+-- | The regex used to match the path.
+httpPathMatch_regex :: Lens.Lens' HttpPathMatch (Prelude.Maybe Prelude.Text)
+httpPathMatch_regex = Lens.lens (\HttpPathMatch' {regex} -> regex) (\s@HttpPathMatch' {} a -> s {regex = a} :: HttpPathMatch)
+
+instance Data.FromJSON HttpPathMatch where
+  parseJSON =
+    Data.withObject
+      "HttpPathMatch"
+      ( \x ->
+          HttpPathMatch'
+            Prelude.<$> (x Data..:? "exact")
+            Prelude.<*> (x Data..:? "regex")
+      )
+
+instance Prelude.Hashable HttpPathMatch where
+  hashWithSalt _salt HttpPathMatch' {..} =
+    _salt
+      `Prelude.hashWithSalt` exact
+      `Prelude.hashWithSalt` regex
+
+instance Prelude.NFData HttpPathMatch where
+  rnf HttpPathMatch' {..} =
+    Prelude.rnf exact `Prelude.seq` Prelude.rnf regex
+
+instance Data.ToJSON HttpPathMatch where
+  toJSON HttpPathMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("exact" Data..=) Prelude.<$> exact,
+            ("regex" Data..=) Prelude.<$> regex
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpQueryParameter.hs b/gen/Amazonka/AppMesh/Types/HttpQueryParameter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpQueryParameter.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpQueryParameter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpQueryParameter where
+
+import Amazonka.AppMesh.Types.QueryParameterMatch
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the query parameter in the request.
+--
+-- /See:/ 'newHttpQueryParameter' smart constructor.
+data HttpQueryParameter = HttpQueryParameter'
+  { -- | The query parameter to match on.
+    match :: Prelude.Maybe QueryParameterMatch,
+    -- | A name for the query parameter that will be matched on.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpQueryParameter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'match', 'httpQueryParameter_match' - The query parameter to match on.
+--
+-- 'name', 'httpQueryParameter_name' - A name for the query parameter that will be matched on.
+newHttpQueryParameter ::
+  -- | 'name'
+  Prelude.Text ->
+  HttpQueryParameter
+newHttpQueryParameter pName_ =
+  HttpQueryParameter'
+    { match = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | The query parameter to match on.
+httpQueryParameter_match :: Lens.Lens' HttpQueryParameter (Prelude.Maybe QueryParameterMatch)
+httpQueryParameter_match = Lens.lens (\HttpQueryParameter' {match} -> match) (\s@HttpQueryParameter' {} a -> s {match = a} :: HttpQueryParameter)
+
+-- | A name for the query parameter that will be matched on.
+httpQueryParameter_name :: Lens.Lens' HttpQueryParameter Prelude.Text
+httpQueryParameter_name = Lens.lens (\HttpQueryParameter' {name} -> name) (\s@HttpQueryParameter' {} a -> s {name = a} :: HttpQueryParameter)
+
+instance Data.FromJSON HttpQueryParameter where
+  parseJSON =
+    Data.withObject
+      "HttpQueryParameter"
+      ( \x ->
+          HttpQueryParameter'
+            Prelude.<$> (x Data..:? "match")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable HttpQueryParameter where
+  hashWithSalt _salt HttpQueryParameter' {..} =
+    _salt
+      `Prelude.hashWithSalt` match
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData HttpQueryParameter where
+  rnf HttpQueryParameter' {..} =
+    Prelude.rnf match `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON HttpQueryParameter where
+  toJSON HttpQueryParameter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("match" Data..=) Prelude.<$> match,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpRetryPolicy.hs b/gen/Amazonka/AppMesh/Types/HttpRetryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpRetryPolicy.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpRetryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpRetryPolicy where
+
+import Amazonka.AppMesh.Types.Duration
+import Amazonka.AppMesh.Types.TcpRetryPolicyEvent
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a retry policy. Specify at least one value for
+-- at least one of the types of @RetryEvents@, a value for @maxRetries@,
+-- and a value for @perRetryTimeout@. Both @server-error@ and
+-- @gateway-error@ under @httpRetryEvents@ include the Envoy @reset@
+-- policy. For more information on the @reset@ policy, see the
+-- <https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/router_filter#x-envoy-retry-on Envoy documentation>.
+--
+-- /See:/ 'newHttpRetryPolicy' smart constructor.
+data HttpRetryPolicy = HttpRetryPolicy'
+  { -- | Specify at least one of the following values.
+    --
+    -- -   __server-error__ – HTTP status codes 500, 501, 502, 503, 504, 505,
+    --     506, 507, 508, 510, and 511
+    --
+    -- -   __gateway-error__ – HTTP status codes 502, 503, and 504
+    --
+    -- -   __client-error__ – HTTP status code 409
+    --
+    -- -   __stream-error__ – Retry on refused stream
+    httpRetryEvents :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | Specify a valid value. The event occurs before any processing of a
+    -- request has started and is encountered when the upstream is temporarily
+    -- or permanently unavailable.
+    tcpRetryEvents :: Prelude.Maybe (Prelude.NonEmpty TcpRetryPolicyEvent),
+    -- | The maximum number of retry attempts.
+    maxRetries :: Prelude.Natural,
+    -- | The timeout for each retry attempt.
+    perRetryTimeout :: Duration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpRetryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpRetryEvents', 'httpRetryPolicy_httpRetryEvents' - Specify at least one of the following values.
+--
+-- -   __server-error__ – HTTP status codes 500, 501, 502, 503, 504, 505,
+--     506, 507, 508, 510, and 511
+--
+-- -   __gateway-error__ – HTTP status codes 502, 503, and 504
+--
+-- -   __client-error__ – HTTP status code 409
+--
+-- -   __stream-error__ – Retry on refused stream
+--
+-- 'tcpRetryEvents', 'httpRetryPolicy_tcpRetryEvents' - Specify a valid value. The event occurs before any processing of a
+-- request has started and is encountered when the upstream is temporarily
+-- or permanently unavailable.
+--
+-- 'maxRetries', 'httpRetryPolicy_maxRetries' - The maximum number of retry attempts.
+--
+-- 'perRetryTimeout', 'httpRetryPolicy_perRetryTimeout' - The timeout for each retry attempt.
+newHttpRetryPolicy ::
+  -- | 'maxRetries'
+  Prelude.Natural ->
+  -- | 'perRetryTimeout'
+  Duration ->
+  HttpRetryPolicy
+newHttpRetryPolicy pMaxRetries_ pPerRetryTimeout_ =
+  HttpRetryPolicy'
+    { httpRetryEvents = Prelude.Nothing,
+      tcpRetryEvents = Prelude.Nothing,
+      maxRetries = pMaxRetries_,
+      perRetryTimeout = pPerRetryTimeout_
+    }
+
+-- | Specify at least one of the following values.
+--
+-- -   __server-error__ – HTTP status codes 500, 501, 502, 503, 504, 505,
+--     506, 507, 508, 510, and 511
+--
+-- -   __gateway-error__ – HTTP status codes 502, 503, and 504
+--
+-- -   __client-error__ – HTTP status code 409
+--
+-- -   __stream-error__ – Retry on refused stream
+httpRetryPolicy_httpRetryEvents :: Lens.Lens' HttpRetryPolicy (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+httpRetryPolicy_httpRetryEvents = Lens.lens (\HttpRetryPolicy' {httpRetryEvents} -> httpRetryEvents) (\s@HttpRetryPolicy' {} a -> s {httpRetryEvents = a} :: HttpRetryPolicy) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify a valid value. The event occurs before any processing of a
+-- request has started and is encountered when the upstream is temporarily
+-- or permanently unavailable.
+httpRetryPolicy_tcpRetryEvents :: Lens.Lens' HttpRetryPolicy (Prelude.Maybe (Prelude.NonEmpty TcpRetryPolicyEvent))
+httpRetryPolicy_tcpRetryEvents = Lens.lens (\HttpRetryPolicy' {tcpRetryEvents} -> tcpRetryEvents) (\s@HttpRetryPolicy' {} a -> s {tcpRetryEvents = a} :: HttpRetryPolicy) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of retry attempts.
+httpRetryPolicy_maxRetries :: Lens.Lens' HttpRetryPolicy Prelude.Natural
+httpRetryPolicy_maxRetries = Lens.lens (\HttpRetryPolicy' {maxRetries} -> maxRetries) (\s@HttpRetryPolicy' {} a -> s {maxRetries = a} :: HttpRetryPolicy)
+
+-- | The timeout for each retry attempt.
+httpRetryPolicy_perRetryTimeout :: Lens.Lens' HttpRetryPolicy Duration
+httpRetryPolicy_perRetryTimeout = Lens.lens (\HttpRetryPolicy' {perRetryTimeout} -> perRetryTimeout) (\s@HttpRetryPolicy' {} a -> s {perRetryTimeout = a} :: HttpRetryPolicy)
+
+instance Data.FromJSON HttpRetryPolicy where
+  parseJSON =
+    Data.withObject
+      "HttpRetryPolicy"
+      ( \x ->
+          HttpRetryPolicy'
+            Prelude.<$> (x Data..:? "httpRetryEvents")
+            Prelude.<*> (x Data..:? "tcpRetryEvents")
+            Prelude.<*> (x Data..: "maxRetries")
+            Prelude.<*> (x Data..: "perRetryTimeout")
+      )
+
+instance Prelude.Hashable HttpRetryPolicy where
+  hashWithSalt _salt HttpRetryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` httpRetryEvents
+      `Prelude.hashWithSalt` tcpRetryEvents
+      `Prelude.hashWithSalt` maxRetries
+      `Prelude.hashWithSalt` perRetryTimeout
+
+instance Prelude.NFData HttpRetryPolicy where
+  rnf HttpRetryPolicy' {..} =
+    Prelude.rnf httpRetryEvents
+      `Prelude.seq` Prelude.rnf tcpRetryEvents
+      `Prelude.seq` Prelude.rnf maxRetries
+      `Prelude.seq` Prelude.rnf perRetryTimeout
+
+instance Data.ToJSON HttpRetryPolicy where
+  toJSON HttpRetryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("httpRetryEvents" Data..=)
+              Prelude.<$> httpRetryEvents,
+            ("tcpRetryEvents" Data..=)
+              Prelude.<$> tcpRetryEvents,
+            Prelude.Just ("maxRetries" Data..= maxRetries),
+            Prelude.Just
+              ("perRetryTimeout" Data..= perRetryTimeout)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpRoute.hs b/gen/Amazonka/AppMesh/Types/HttpRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpRoute.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpRoute where
+
+import Amazonka.AppMesh.Types.HttpRetryPolicy
+import Amazonka.AppMesh.Types.HttpRouteAction
+import Amazonka.AppMesh.Types.HttpRouteMatch
+import Amazonka.AppMesh.Types.HttpTimeout
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents an HTTP or HTTP\/2 route type.
+--
+-- /See:/ 'newHttpRoute' smart constructor.
+data HttpRoute = HttpRoute'
+  { -- | An object that represents a retry policy.
+    retryPolicy :: Prelude.Maybe HttpRetryPolicy,
+    -- | An object that represents types of timeouts.
+    timeout :: Prelude.Maybe HttpTimeout,
+    -- | An object that represents the action to take if a match is determined.
+    action :: HttpRouteAction,
+    -- | An object that represents the criteria for determining a request match.
+    match :: HttpRouteMatch
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'retryPolicy', 'httpRoute_retryPolicy' - An object that represents a retry policy.
+--
+-- 'timeout', 'httpRoute_timeout' - An object that represents types of timeouts.
+--
+-- 'action', 'httpRoute_action' - An object that represents the action to take if a match is determined.
+--
+-- 'match', 'httpRoute_match' - An object that represents the criteria for determining a request match.
+newHttpRoute ::
+  -- | 'action'
+  HttpRouteAction ->
+  -- | 'match'
+  HttpRouteMatch ->
+  HttpRoute
+newHttpRoute pAction_ pMatch_ =
+  HttpRoute'
+    { retryPolicy = Prelude.Nothing,
+      timeout = Prelude.Nothing,
+      action = pAction_,
+      match = pMatch_
+    }
+
+-- | An object that represents a retry policy.
+httpRoute_retryPolicy :: Lens.Lens' HttpRoute (Prelude.Maybe HttpRetryPolicy)
+httpRoute_retryPolicy = Lens.lens (\HttpRoute' {retryPolicy} -> retryPolicy) (\s@HttpRoute' {} a -> s {retryPolicy = a} :: HttpRoute)
+
+-- | An object that represents types of timeouts.
+httpRoute_timeout :: Lens.Lens' HttpRoute (Prelude.Maybe HttpTimeout)
+httpRoute_timeout = Lens.lens (\HttpRoute' {timeout} -> timeout) (\s@HttpRoute' {} a -> s {timeout = a} :: HttpRoute)
+
+-- | An object that represents the action to take if a match is determined.
+httpRoute_action :: Lens.Lens' HttpRoute HttpRouteAction
+httpRoute_action = Lens.lens (\HttpRoute' {action} -> action) (\s@HttpRoute' {} a -> s {action = a} :: HttpRoute)
+
+-- | An object that represents the criteria for determining a request match.
+httpRoute_match :: Lens.Lens' HttpRoute HttpRouteMatch
+httpRoute_match = Lens.lens (\HttpRoute' {match} -> match) (\s@HttpRoute' {} a -> s {match = a} :: HttpRoute)
+
+instance Data.FromJSON HttpRoute where
+  parseJSON =
+    Data.withObject
+      "HttpRoute"
+      ( \x ->
+          HttpRoute'
+            Prelude.<$> (x Data..:? "retryPolicy")
+            Prelude.<*> (x Data..:? "timeout")
+            Prelude.<*> (x Data..: "action")
+            Prelude.<*> (x Data..: "match")
+      )
+
+instance Prelude.Hashable HttpRoute where
+  hashWithSalt _salt HttpRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` retryPolicy
+      `Prelude.hashWithSalt` timeout
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` match
+
+instance Prelude.NFData HttpRoute where
+  rnf HttpRoute' {..} =
+    Prelude.rnf retryPolicy
+      `Prelude.seq` Prelude.rnf timeout
+      `Prelude.seq` Prelude.rnf action
+      `Prelude.seq` Prelude.rnf match
+
+instance Data.ToJSON HttpRoute where
+  toJSON HttpRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("retryPolicy" Data..=) Prelude.<$> retryPolicy,
+            ("timeout" Data..=) Prelude.<$> timeout,
+            Prelude.Just ("action" Data..= action),
+            Prelude.Just ("match" Data..= match)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpRouteAction.hs b/gen/Amazonka/AppMesh/Types/HttpRouteAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpRouteAction.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpRouteAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpRouteAction where
+
+import Amazonka.AppMesh.Types.WeightedTarget
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the action to take if a match is determined.
+--
+-- /See:/ 'newHttpRouteAction' smart constructor.
+data HttpRouteAction = HttpRouteAction'
+  { -- | An object that represents the targets that traffic is routed to when a
+    -- request matches the route.
+    weightedTargets :: Prelude.NonEmpty WeightedTarget
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpRouteAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'weightedTargets', 'httpRouteAction_weightedTargets' - An object that represents the targets that traffic is routed to when a
+-- request matches the route.
+newHttpRouteAction ::
+  -- | 'weightedTargets'
+  Prelude.NonEmpty WeightedTarget ->
+  HttpRouteAction
+newHttpRouteAction pWeightedTargets_ =
+  HttpRouteAction'
+    { weightedTargets =
+        Lens.coerced Lens.# pWeightedTargets_
+    }
+
+-- | An object that represents the targets that traffic is routed to when a
+-- request matches the route.
+httpRouteAction_weightedTargets :: Lens.Lens' HttpRouteAction (Prelude.NonEmpty WeightedTarget)
+httpRouteAction_weightedTargets = Lens.lens (\HttpRouteAction' {weightedTargets} -> weightedTargets) (\s@HttpRouteAction' {} a -> s {weightedTargets = a} :: HttpRouteAction) Prelude.. Lens.coerced
+
+instance Data.FromJSON HttpRouteAction where
+  parseJSON =
+    Data.withObject
+      "HttpRouteAction"
+      ( \x ->
+          HttpRouteAction'
+            Prelude.<$> (x Data..: "weightedTargets")
+      )
+
+instance Prelude.Hashable HttpRouteAction where
+  hashWithSalt _salt HttpRouteAction' {..} =
+    _salt `Prelude.hashWithSalt` weightedTargets
+
+instance Prelude.NFData HttpRouteAction where
+  rnf HttpRouteAction' {..} =
+    Prelude.rnf weightedTargets
+
+instance Data.ToJSON HttpRouteAction where
+  toJSON HttpRouteAction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("weightedTargets" Data..= weightedTargets)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpRouteHeader.hs b/gen/Amazonka/AppMesh/Types/HttpRouteHeader.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpRouteHeader.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpRouteHeader
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpRouteHeader where
+
+import Amazonka.AppMesh.Types.HeaderMatchMethod
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the HTTP header in the request.
+--
+-- /See:/ 'newHttpRouteHeader' smart constructor.
+data HttpRouteHeader = HttpRouteHeader'
+  { -- | Specify @True@ to match anything except the match criteria. The default
+    -- value is @False@.
+    invert :: Prelude.Maybe Prelude.Bool,
+    -- | The @HeaderMatchMethod@ object.
+    match :: Prelude.Maybe HeaderMatchMethod,
+    -- | A name for the HTTP header in the client request that will be matched
+    -- on.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpRouteHeader' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'invert', 'httpRouteHeader_invert' - Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+--
+-- 'match', 'httpRouteHeader_match' - The @HeaderMatchMethod@ object.
+--
+-- 'name', 'httpRouteHeader_name' - A name for the HTTP header in the client request that will be matched
+-- on.
+newHttpRouteHeader ::
+  -- | 'name'
+  Prelude.Text ->
+  HttpRouteHeader
+newHttpRouteHeader pName_ =
+  HttpRouteHeader'
+    { invert = Prelude.Nothing,
+      match = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | Specify @True@ to match anything except the match criteria. The default
+-- value is @False@.
+httpRouteHeader_invert :: Lens.Lens' HttpRouteHeader (Prelude.Maybe Prelude.Bool)
+httpRouteHeader_invert = Lens.lens (\HttpRouteHeader' {invert} -> invert) (\s@HttpRouteHeader' {} a -> s {invert = a} :: HttpRouteHeader)
+
+-- | The @HeaderMatchMethod@ object.
+httpRouteHeader_match :: Lens.Lens' HttpRouteHeader (Prelude.Maybe HeaderMatchMethod)
+httpRouteHeader_match = Lens.lens (\HttpRouteHeader' {match} -> match) (\s@HttpRouteHeader' {} a -> s {match = a} :: HttpRouteHeader)
+
+-- | A name for the HTTP header in the client request that will be matched
+-- on.
+httpRouteHeader_name :: Lens.Lens' HttpRouteHeader Prelude.Text
+httpRouteHeader_name = Lens.lens (\HttpRouteHeader' {name} -> name) (\s@HttpRouteHeader' {} a -> s {name = a} :: HttpRouteHeader)
+
+instance Data.FromJSON HttpRouteHeader where
+  parseJSON =
+    Data.withObject
+      "HttpRouteHeader"
+      ( \x ->
+          HttpRouteHeader'
+            Prelude.<$> (x Data..:? "invert")
+            Prelude.<*> (x Data..:? "match")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable HttpRouteHeader where
+  hashWithSalt _salt HttpRouteHeader' {..} =
+    _salt
+      `Prelude.hashWithSalt` invert
+      `Prelude.hashWithSalt` match
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData HttpRouteHeader where
+  rnf HttpRouteHeader' {..} =
+    Prelude.rnf invert
+      `Prelude.seq` Prelude.rnf match
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON HttpRouteHeader where
+  toJSON HttpRouteHeader' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("invert" Data..=) Prelude.<$> invert,
+            ("match" Data..=) Prelude.<$> match,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpRouteMatch.hs b/gen/Amazonka/AppMesh/Types/HttpRouteMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpRouteMatch.hs
@@ -0,0 +1,183 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpRouteMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpRouteMatch where
+
+import Amazonka.AppMesh.Types.HttpMethod
+import Amazonka.AppMesh.Types.HttpPathMatch
+import Amazonka.AppMesh.Types.HttpQueryParameter
+import Amazonka.AppMesh.Types.HttpRouteHeader
+import Amazonka.AppMesh.Types.HttpScheme
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the requirements for a route to match HTTP
+-- requests for a virtual router.
+--
+-- /See:/ 'newHttpRouteMatch' smart constructor.
+data HttpRouteMatch = HttpRouteMatch'
+  { -- | The client request headers to match on.
+    headers :: Prelude.Maybe (Prelude.NonEmpty HttpRouteHeader),
+    -- | The client request method to match on. Specify only one.
+    method :: Prelude.Maybe HttpMethod,
+    -- | The client request path to match on.
+    path :: Prelude.Maybe HttpPathMatch,
+    -- | The port number to match on.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | Specifies the path to match requests with. This parameter must always
+    -- start with @\/@, which by itself matches all requests to the virtual
+    -- service name. You can also match for path-based routing of requests. For
+    -- example, if your virtual service name is @my-service.local@ and you want
+    -- the route to match requests to @my-service.local\/metrics@, your prefix
+    -- should be @\/metrics@.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | The client request query parameters to match on.
+    queryParameters :: Prelude.Maybe (Prelude.NonEmpty HttpQueryParameter),
+    -- | The client request scheme to match on. Specify only one. Applicable only
+    -- for HTTP2 routes.
+    scheme :: Prelude.Maybe HttpScheme
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpRouteMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'headers', 'httpRouteMatch_headers' - The client request headers to match on.
+--
+-- 'method', 'httpRouteMatch_method' - The client request method to match on. Specify only one.
+--
+-- 'path', 'httpRouteMatch_path' - The client request path to match on.
+--
+-- 'port', 'httpRouteMatch_port' - The port number to match on.
+--
+-- 'prefix', 'httpRouteMatch_prefix' - Specifies the path to match requests with. This parameter must always
+-- start with @\/@, which by itself matches all requests to the virtual
+-- service name. You can also match for path-based routing of requests. For
+-- example, if your virtual service name is @my-service.local@ and you want
+-- the route to match requests to @my-service.local\/metrics@, your prefix
+-- should be @\/metrics@.
+--
+-- 'queryParameters', 'httpRouteMatch_queryParameters' - The client request query parameters to match on.
+--
+-- 'scheme', 'httpRouteMatch_scheme' - The client request scheme to match on. Specify only one. Applicable only
+-- for HTTP2 routes.
+newHttpRouteMatch ::
+  HttpRouteMatch
+newHttpRouteMatch =
+  HttpRouteMatch'
+    { headers = Prelude.Nothing,
+      method = Prelude.Nothing,
+      path = Prelude.Nothing,
+      port = Prelude.Nothing,
+      prefix = Prelude.Nothing,
+      queryParameters = Prelude.Nothing,
+      scheme = Prelude.Nothing
+    }
+
+-- | The client request headers to match on.
+httpRouteMatch_headers :: Lens.Lens' HttpRouteMatch (Prelude.Maybe (Prelude.NonEmpty HttpRouteHeader))
+httpRouteMatch_headers = Lens.lens (\HttpRouteMatch' {headers} -> headers) (\s@HttpRouteMatch' {} a -> s {headers = a} :: HttpRouteMatch) Prelude.. Lens.mapping Lens.coerced
+
+-- | The client request method to match on. Specify only one.
+httpRouteMatch_method :: Lens.Lens' HttpRouteMatch (Prelude.Maybe HttpMethod)
+httpRouteMatch_method = Lens.lens (\HttpRouteMatch' {method} -> method) (\s@HttpRouteMatch' {} a -> s {method = a} :: HttpRouteMatch)
+
+-- | The client request path to match on.
+httpRouteMatch_path :: Lens.Lens' HttpRouteMatch (Prelude.Maybe HttpPathMatch)
+httpRouteMatch_path = Lens.lens (\HttpRouteMatch' {path} -> path) (\s@HttpRouteMatch' {} a -> s {path = a} :: HttpRouteMatch)
+
+-- | The port number to match on.
+httpRouteMatch_port :: Lens.Lens' HttpRouteMatch (Prelude.Maybe Prelude.Natural)
+httpRouteMatch_port = Lens.lens (\HttpRouteMatch' {port} -> port) (\s@HttpRouteMatch' {} a -> s {port = a} :: HttpRouteMatch)
+
+-- | Specifies the path to match requests with. This parameter must always
+-- start with @\/@, which by itself matches all requests to the virtual
+-- service name. You can also match for path-based routing of requests. For
+-- example, if your virtual service name is @my-service.local@ and you want
+-- the route to match requests to @my-service.local\/metrics@, your prefix
+-- should be @\/metrics@.
+httpRouteMatch_prefix :: Lens.Lens' HttpRouteMatch (Prelude.Maybe Prelude.Text)
+httpRouteMatch_prefix = Lens.lens (\HttpRouteMatch' {prefix} -> prefix) (\s@HttpRouteMatch' {} a -> s {prefix = a} :: HttpRouteMatch)
+
+-- | The client request query parameters to match on.
+httpRouteMatch_queryParameters :: Lens.Lens' HttpRouteMatch (Prelude.Maybe (Prelude.NonEmpty HttpQueryParameter))
+httpRouteMatch_queryParameters = Lens.lens (\HttpRouteMatch' {queryParameters} -> queryParameters) (\s@HttpRouteMatch' {} a -> s {queryParameters = a} :: HttpRouteMatch) Prelude.. Lens.mapping Lens.coerced
+
+-- | The client request scheme to match on. Specify only one. Applicable only
+-- for HTTP2 routes.
+httpRouteMatch_scheme :: Lens.Lens' HttpRouteMatch (Prelude.Maybe HttpScheme)
+httpRouteMatch_scheme = Lens.lens (\HttpRouteMatch' {scheme} -> scheme) (\s@HttpRouteMatch' {} a -> s {scheme = a} :: HttpRouteMatch)
+
+instance Data.FromJSON HttpRouteMatch where
+  parseJSON =
+    Data.withObject
+      "HttpRouteMatch"
+      ( \x ->
+          HttpRouteMatch'
+            Prelude.<$> (x Data..:? "headers")
+            Prelude.<*> (x Data..:? "method")
+            Prelude.<*> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "port")
+            Prelude.<*> (x Data..:? "prefix")
+            Prelude.<*> (x Data..:? "queryParameters")
+            Prelude.<*> (x Data..:? "scheme")
+      )
+
+instance Prelude.Hashable HttpRouteMatch where
+  hashWithSalt _salt HttpRouteMatch' {..} =
+    _salt
+      `Prelude.hashWithSalt` headers
+      `Prelude.hashWithSalt` method
+      `Prelude.hashWithSalt` path
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` queryParameters
+      `Prelude.hashWithSalt` scheme
+
+instance Prelude.NFData HttpRouteMatch where
+  rnf HttpRouteMatch' {..} =
+    Prelude.rnf headers
+      `Prelude.seq` Prelude.rnf method
+      `Prelude.seq` Prelude.rnf path
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf queryParameters
+      `Prelude.seq` Prelude.rnf scheme
+
+instance Data.ToJSON HttpRouteMatch where
+  toJSON HttpRouteMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("headers" Data..=) Prelude.<$> headers,
+            ("method" Data..=) Prelude.<$> method,
+            ("path" Data..=) Prelude.<$> path,
+            ("port" Data..=) Prelude.<$> port,
+            ("prefix" Data..=) Prelude.<$> prefix,
+            ("queryParameters" Data..=)
+              Prelude.<$> queryParameters,
+            ("scheme" Data..=) Prelude.<$> scheme
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/HttpScheme.hs b/gen/Amazonka/AppMesh/Types/HttpScheme.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpScheme.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpScheme
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpScheme
+  ( HttpScheme
+      ( ..,
+        HttpScheme_Http,
+        HttpScheme_Https
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype HttpScheme = HttpScheme'
+  { fromHttpScheme ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern HttpScheme_Http :: HttpScheme
+pattern HttpScheme_Http = HttpScheme' "http"
+
+pattern HttpScheme_Https :: HttpScheme
+pattern HttpScheme_Https = HttpScheme' "https"
+
+{-# COMPLETE
+  HttpScheme_Http,
+  HttpScheme_Https,
+  HttpScheme'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/HttpTimeout.hs b/gen/Amazonka/AppMesh/Types/HttpTimeout.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/HttpTimeout.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.HttpTimeout
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.HttpTimeout where
+
+import Amazonka.AppMesh.Types.Duration
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents types of timeouts.
+--
+-- /See:/ 'newHttpTimeout' smart constructor.
+data HttpTimeout = HttpTimeout'
+  { -- | An object that represents an idle timeout. An idle timeout bounds the
+    -- amount of time that a connection may be idle. The default value is none.
+    idle :: Prelude.Maybe Duration,
+    -- | An object that represents a per request timeout. The default value is 15
+    -- seconds. If you set a higher timeout, then make sure that the higher
+    -- value is set for each App Mesh resource in a conversation. For example,
+    -- if a virtual node backend uses a virtual router provider to route to
+    -- another virtual node, then the timeout should be greater than 15 seconds
+    -- for the source and destination virtual node and the route.
+    perRequest :: Prelude.Maybe Duration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HttpTimeout' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'idle', 'httpTimeout_idle' - An object that represents an idle timeout. An idle timeout bounds the
+-- amount of time that a connection may be idle. The default value is none.
+--
+-- 'perRequest', 'httpTimeout_perRequest' - An object that represents a per request timeout. The default value is 15
+-- seconds. If you set a higher timeout, then make sure that the higher
+-- value is set for each App Mesh resource in a conversation. For example,
+-- if a virtual node backend uses a virtual router provider to route to
+-- another virtual node, then the timeout should be greater than 15 seconds
+-- for the source and destination virtual node and the route.
+newHttpTimeout ::
+  HttpTimeout
+newHttpTimeout =
+  HttpTimeout'
+    { idle = Prelude.Nothing,
+      perRequest = Prelude.Nothing
+    }
+
+-- | An object that represents an idle timeout. An idle timeout bounds the
+-- amount of time that a connection may be idle. The default value is none.
+httpTimeout_idle :: Lens.Lens' HttpTimeout (Prelude.Maybe Duration)
+httpTimeout_idle = Lens.lens (\HttpTimeout' {idle} -> idle) (\s@HttpTimeout' {} a -> s {idle = a} :: HttpTimeout)
+
+-- | An object that represents a per request timeout. The default value is 15
+-- seconds. If you set a higher timeout, then make sure that the higher
+-- value is set for each App Mesh resource in a conversation. For example,
+-- if a virtual node backend uses a virtual router provider to route to
+-- another virtual node, then the timeout should be greater than 15 seconds
+-- for the source and destination virtual node and the route.
+httpTimeout_perRequest :: Lens.Lens' HttpTimeout (Prelude.Maybe Duration)
+httpTimeout_perRequest = Lens.lens (\HttpTimeout' {perRequest} -> perRequest) (\s@HttpTimeout' {} a -> s {perRequest = a} :: HttpTimeout)
+
+instance Data.FromJSON HttpTimeout where
+  parseJSON =
+    Data.withObject
+      "HttpTimeout"
+      ( \x ->
+          HttpTimeout'
+            Prelude.<$> (x Data..:? "idle")
+            Prelude.<*> (x Data..:? "perRequest")
+      )
+
+instance Prelude.Hashable HttpTimeout where
+  hashWithSalt _salt HttpTimeout' {..} =
+    _salt
+      `Prelude.hashWithSalt` idle
+      `Prelude.hashWithSalt` perRequest
+
+instance Prelude.NFData HttpTimeout where
+  rnf HttpTimeout' {..} =
+    Prelude.rnf idle
+      `Prelude.seq` Prelude.rnf perRequest
+
+instance Data.ToJSON HttpTimeout where
+  toJSON HttpTimeout' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("idle" Data..=) Prelude.<$> idle,
+            ("perRequest" Data..=) Prelude.<$> perRequest
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/IpPreference.hs b/gen/Amazonka/AppMesh/Types/IpPreference.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/IpPreference.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.IpPreference
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.IpPreference
+  ( IpPreference
+      ( ..,
+        IpPreference_IPv4_ONLY,
+        IpPreference_IPv4_PREFERRED,
+        IpPreference_IPv6_ONLY,
+        IpPreference_IPv6_PREFERRED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype IpPreference = IpPreference'
+  { fromIpPreference ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern IpPreference_IPv4_ONLY :: IpPreference
+pattern IpPreference_IPv4_ONLY = IpPreference' "IPv4_ONLY"
+
+pattern IpPreference_IPv4_PREFERRED :: IpPreference
+pattern IpPreference_IPv4_PREFERRED = IpPreference' "IPv4_PREFERRED"
+
+pattern IpPreference_IPv6_ONLY :: IpPreference
+pattern IpPreference_IPv6_ONLY = IpPreference' "IPv6_ONLY"
+
+pattern IpPreference_IPv6_PREFERRED :: IpPreference
+pattern IpPreference_IPv6_PREFERRED = IpPreference' "IPv6_PREFERRED"
+
+{-# COMPLETE
+  IpPreference_IPv4_ONLY,
+  IpPreference_IPv4_PREFERRED,
+  IpPreference_IPv6_ONLY,
+  IpPreference_IPv6_PREFERRED,
+  IpPreference'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/JsonFormatRef.hs b/gen/Amazonka/AppMesh/Types/JsonFormatRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/JsonFormatRef.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.JsonFormatRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.JsonFormatRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the key value pairs for the JSON.
+--
+-- /See:/ 'newJsonFormatRef' smart constructor.
+data JsonFormatRef = JsonFormatRef'
+  { -- | The specified key for the JSON.
+    key :: Prelude.Text,
+    -- | The specified value for the JSON.
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JsonFormatRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'jsonFormatRef_key' - The specified key for the JSON.
+--
+-- 'value', 'jsonFormatRef_value' - The specified value for the JSON.
+newJsonFormatRef ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  JsonFormatRef
+newJsonFormatRef pKey_ pValue_ =
+  JsonFormatRef' {key = pKey_, value = pValue_}
+
+-- | The specified key for the JSON.
+jsonFormatRef_key :: Lens.Lens' JsonFormatRef Prelude.Text
+jsonFormatRef_key = Lens.lens (\JsonFormatRef' {key} -> key) (\s@JsonFormatRef' {} a -> s {key = a} :: JsonFormatRef)
+
+-- | The specified value for the JSON.
+jsonFormatRef_value :: Lens.Lens' JsonFormatRef Prelude.Text
+jsonFormatRef_value = Lens.lens (\JsonFormatRef' {value} -> value) (\s@JsonFormatRef' {} a -> s {value = a} :: JsonFormatRef)
+
+instance Data.FromJSON JsonFormatRef where
+  parseJSON =
+    Data.withObject
+      "JsonFormatRef"
+      ( \x ->
+          JsonFormatRef'
+            Prelude.<$> (x Data..: "key")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable JsonFormatRef where
+  hashWithSalt _salt JsonFormatRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData JsonFormatRef where
+  rnf JsonFormatRef' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON JsonFormatRef where
+  toJSON JsonFormatRef' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("key" Data..= key),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/Listener.hs b/gen/Amazonka/AppMesh/Types/Listener.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/Listener.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.Listener
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.Listener where
+
+import Amazonka.AppMesh.Types.HealthCheckPolicy
+import Amazonka.AppMesh.Types.ListenerTimeout
+import Amazonka.AppMesh.Types.ListenerTls
+import Amazonka.AppMesh.Types.OutlierDetection
+import Amazonka.AppMesh.Types.PortMapping
+import Amazonka.AppMesh.Types.VirtualNodeConnectionPool
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a listener for a virtual node.
+--
+-- /See:/ 'newListener' smart constructor.
+data Listener = Listener'
+  { -- | The connection pool information for the listener.
+    connectionPool :: Prelude.Maybe VirtualNodeConnectionPool,
+    -- | The health check information for the listener.
+    healthCheck :: Prelude.Maybe HealthCheckPolicy,
+    -- | The outlier detection information for the listener.
+    outlierDetection :: Prelude.Maybe OutlierDetection,
+    -- | An object that represents timeouts for different protocols.
+    timeout :: Prelude.Maybe ListenerTimeout,
+    -- | A reference to an object that represents the Transport Layer Security
+    -- (TLS) properties for a listener.
+    tls :: Prelude.Maybe ListenerTls,
+    -- | The port mapping information for the listener.
+    portMapping :: PortMapping
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Listener' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionPool', 'listener_connectionPool' - The connection pool information for the listener.
+--
+-- 'healthCheck', 'listener_healthCheck' - The health check information for the listener.
+--
+-- 'outlierDetection', 'listener_outlierDetection' - The outlier detection information for the listener.
+--
+-- 'timeout', 'listener_timeout' - An object that represents timeouts for different protocols.
+--
+-- 'tls', 'listener_tls' - A reference to an object that represents the Transport Layer Security
+-- (TLS) properties for a listener.
+--
+-- 'portMapping', 'listener_portMapping' - The port mapping information for the listener.
+newListener ::
+  -- | 'portMapping'
+  PortMapping ->
+  Listener
+newListener pPortMapping_ =
+  Listener'
+    { connectionPool = Prelude.Nothing,
+      healthCheck = Prelude.Nothing,
+      outlierDetection = Prelude.Nothing,
+      timeout = Prelude.Nothing,
+      tls = Prelude.Nothing,
+      portMapping = pPortMapping_
+    }
+
+-- | The connection pool information for the listener.
+listener_connectionPool :: Lens.Lens' Listener (Prelude.Maybe VirtualNodeConnectionPool)
+listener_connectionPool = Lens.lens (\Listener' {connectionPool} -> connectionPool) (\s@Listener' {} a -> s {connectionPool = a} :: Listener)
+
+-- | The health check information for the listener.
+listener_healthCheck :: Lens.Lens' Listener (Prelude.Maybe HealthCheckPolicy)
+listener_healthCheck = Lens.lens (\Listener' {healthCheck} -> healthCheck) (\s@Listener' {} a -> s {healthCheck = a} :: Listener)
+
+-- | The outlier detection information for the listener.
+listener_outlierDetection :: Lens.Lens' Listener (Prelude.Maybe OutlierDetection)
+listener_outlierDetection = Lens.lens (\Listener' {outlierDetection} -> outlierDetection) (\s@Listener' {} a -> s {outlierDetection = a} :: Listener)
+
+-- | An object that represents timeouts for different protocols.
+listener_timeout :: Lens.Lens' Listener (Prelude.Maybe ListenerTimeout)
+listener_timeout = Lens.lens (\Listener' {timeout} -> timeout) (\s@Listener' {} a -> s {timeout = a} :: Listener)
+
+-- | A reference to an object that represents the Transport Layer Security
+-- (TLS) properties for a listener.
+listener_tls :: Lens.Lens' Listener (Prelude.Maybe ListenerTls)
+listener_tls = Lens.lens (\Listener' {tls} -> tls) (\s@Listener' {} a -> s {tls = a} :: Listener)
+
+-- | The port mapping information for the listener.
+listener_portMapping :: Lens.Lens' Listener PortMapping
+listener_portMapping = Lens.lens (\Listener' {portMapping} -> portMapping) (\s@Listener' {} a -> s {portMapping = a} :: Listener)
+
+instance Data.FromJSON Listener where
+  parseJSON =
+    Data.withObject
+      "Listener"
+      ( \x ->
+          Listener'
+            Prelude.<$> (x Data..:? "connectionPool")
+            Prelude.<*> (x Data..:? "healthCheck")
+            Prelude.<*> (x Data..:? "outlierDetection")
+            Prelude.<*> (x Data..:? "timeout")
+            Prelude.<*> (x Data..:? "tls")
+            Prelude.<*> (x Data..: "portMapping")
+      )
+
+instance Prelude.Hashable Listener where
+  hashWithSalt _salt Listener' {..} =
+    _salt
+      `Prelude.hashWithSalt` connectionPool
+      `Prelude.hashWithSalt` healthCheck
+      `Prelude.hashWithSalt` outlierDetection
+      `Prelude.hashWithSalt` timeout
+      `Prelude.hashWithSalt` tls
+      `Prelude.hashWithSalt` portMapping
+
+instance Prelude.NFData Listener where
+  rnf Listener' {..} =
+    Prelude.rnf connectionPool
+      `Prelude.seq` Prelude.rnf healthCheck
+      `Prelude.seq` Prelude.rnf outlierDetection
+      `Prelude.seq` Prelude.rnf timeout
+      `Prelude.seq` Prelude.rnf tls
+      `Prelude.seq` Prelude.rnf portMapping
+
+instance Data.ToJSON Listener where
+  toJSON Listener' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("connectionPool" Data..=)
+              Prelude.<$> connectionPool,
+            ("healthCheck" Data..=) Prelude.<$> healthCheck,
+            ("outlierDetection" Data..=)
+              Prelude.<$> outlierDetection,
+            ("timeout" Data..=) Prelude.<$> timeout,
+            ("tls" Data..=) Prelude.<$> tls,
+            Prelude.Just ("portMapping" Data..= portMapping)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTimeout.hs b/gen/Amazonka/AppMesh/Types/ListenerTimeout.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTimeout.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTimeout
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTimeout where
+
+import Amazonka.AppMesh.Types.GrpcTimeout
+import Amazonka.AppMesh.Types.HttpTimeout
+import Amazonka.AppMesh.Types.TcpTimeout
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents timeouts for different protocols.
+--
+-- /See:/ 'newListenerTimeout' smart constructor.
+data ListenerTimeout = ListenerTimeout'
+  { -- | An object that represents types of timeouts.
+    grpc :: Prelude.Maybe GrpcTimeout,
+    -- | An object that represents types of timeouts.
+    http :: Prelude.Maybe HttpTimeout,
+    -- | An object that represents types of timeouts.
+    http2 :: Prelude.Maybe HttpTimeout,
+    -- | An object that represents types of timeouts.
+    tcp :: Prelude.Maybe TcpTimeout
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTimeout' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'grpc', 'listenerTimeout_grpc' - An object that represents types of timeouts.
+--
+-- 'http', 'listenerTimeout_http' - An object that represents types of timeouts.
+--
+-- 'http2', 'listenerTimeout_http2' - An object that represents types of timeouts.
+--
+-- 'tcp', 'listenerTimeout_tcp' - An object that represents types of timeouts.
+newListenerTimeout ::
+  ListenerTimeout
+newListenerTimeout =
+  ListenerTimeout'
+    { grpc = Prelude.Nothing,
+      http = Prelude.Nothing,
+      http2 = Prelude.Nothing,
+      tcp = Prelude.Nothing
+    }
+
+-- | An object that represents types of timeouts.
+listenerTimeout_grpc :: Lens.Lens' ListenerTimeout (Prelude.Maybe GrpcTimeout)
+listenerTimeout_grpc = Lens.lens (\ListenerTimeout' {grpc} -> grpc) (\s@ListenerTimeout' {} a -> s {grpc = a} :: ListenerTimeout)
+
+-- | An object that represents types of timeouts.
+listenerTimeout_http :: Lens.Lens' ListenerTimeout (Prelude.Maybe HttpTimeout)
+listenerTimeout_http = Lens.lens (\ListenerTimeout' {http} -> http) (\s@ListenerTimeout' {} a -> s {http = a} :: ListenerTimeout)
+
+-- | An object that represents types of timeouts.
+listenerTimeout_http2 :: Lens.Lens' ListenerTimeout (Prelude.Maybe HttpTimeout)
+listenerTimeout_http2 = Lens.lens (\ListenerTimeout' {http2} -> http2) (\s@ListenerTimeout' {} a -> s {http2 = a} :: ListenerTimeout)
+
+-- | An object that represents types of timeouts.
+listenerTimeout_tcp :: Lens.Lens' ListenerTimeout (Prelude.Maybe TcpTimeout)
+listenerTimeout_tcp = Lens.lens (\ListenerTimeout' {tcp} -> tcp) (\s@ListenerTimeout' {} a -> s {tcp = a} :: ListenerTimeout)
+
+instance Data.FromJSON ListenerTimeout where
+  parseJSON =
+    Data.withObject
+      "ListenerTimeout"
+      ( \x ->
+          ListenerTimeout'
+            Prelude.<$> (x Data..:? "grpc")
+            Prelude.<*> (x Data..:? "http")
+            Prelude.<*> (x Data..:? "http2")
+            Prelude.<*> (x Data..:? "tcp")
+      )
+
+instance Prelude.Hashable ListenerTimeout where
+  hashWithSalt _salt ListenerTimeout' {..} =
+    _salt
+      `Prelude.hashWithSalt` grpc
+      `Prelude.hashWithSalt` http
+      `Prelude.hashWithSalt` http2
+      `Prelude.hashWithSalt` tcp
+
+instance Prelude.NFData ListenerTimeout where
+  rnf ListenerTimeout' {..} =
+    Prelude.rnf grpc
+      `Prelude.seq` Prelude.rnf http
+      `Prelude.seq` Prelude.rnf http2
+      `Prelude.seq` Prelude.rnf tcp
+
+instance Data.ToJSON ListenerTimeout where
+  toJSON ListenerTimeout' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("grpc" Data..=) Prelude.<$> grpc,
+            ("http" Data..=) Prelude.<$> http,
+            ("http2" Data..=) Prelude.<$> http2,
+            ("tcp" Data..=) Prelude.<$> tcp
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTls.hs b/gen/Amazonka/AppMesh/Types/ListenerTls.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTls.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTls
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTls where
+
+import Amazonka.AppMesh.Types.ListenerTlsCertificate
+import Amazonka.AppMesh.Types.ListenerTlsMode
+import Amazonka.AppMesh.Types.ListenerTlsValidationContext
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the Transport Layer Security (TLS) properties
+-- for a listener.
+--
+-- /See:/ 'newListenerTls' smart constructor.
+data ListenerTls = ListenerTls'
+  { -- | A reference to an object that represents a listener\'s Transport Layer
+    -- Security (TLS) validation context.
+    validation :: Prelude.Maybe ListenerTlsValidationContext,
+    -- | A reference to an object that represents a listener\'s Transport Layer
+    -- Security (TLS) certificate.
+    certificate :: ListenerTlsCertificate,
+    -- | Specify one of the following modes.
+    --
+    -- -   ____STRICT – Listener only accepts connections with TLS enabled.
+    --
+    -- -   ____PERMISSIVE – Listener accepts connections with or without TLS
+    --     enabled.
+    --
+    -- -   ____DISABLED – Listener only accepts connections without TLS.
+    mode :: ListenerTlsMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTls' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'validation', 'listenerTls_validation' - A reference to an object that represents a listener\'s Transport Layer
+-- Security (TLS) validation context.
+--
+-- 'certificate', 'listenerTls_certificate' - A reference to an object that represents a listener\'s Transport Layer
+-- Security (TLS) certificate.
+--
+-- 'mode', 'listenerTls_mode' - Specify one of the following modes.
+--
+-- -   ____STRICT – Listener only accepts connections with TLS enabled.
+--
+-- -   ____PERMISSIVE – Listener accepts connections with or without TLS
+--     enabled.
+--
+-- -   ____DISABLED – Listener only accepts connections without TLS.
+newListenerTls ::
+  -- | 'certificate'
+  ListenerTlsCertificate ->
+  -- | 'mode'
+  ListenerTlsMode ->
+  ListenerTls
+newListenerTls pCertificate_ pMode_ =
+  ListenerTls'
+    { validation = Prelude.Nothing,
+      certificate = pCertificate_,
+      mode = pMode_
+    }
+
+-- | A reference to an object that represents a listener\'s Transport Layer
+-- Security (TLS) validation context.
+listenerTls_validation :: Lens.Lens' ListenerTls (Prelude.Maybe ListenerTlsValidationContext)
+listenerTls_validation = Lens.lens (\ListenerTls' {validation} -> validation) (\s@ListenerTls' {} a -> s {validation = a} :: ListenerTls)
+
+-- | A reference to an object that represents a listener\'s Transport Layer
+-- Security (TLS) certificate.
+listenerTls_certificate :: Lens.Lens' ListenerTls ListenerTlsCertificate
+listenerTls_certificate = Lens.lens (\ListenerTls' {certificate} -> certificate) (\s@ListenerTls' {} a -> s {certificate = a} :: ListenerTls)
+
+-- | Specify one of the following modes.
+--
+-- -   ____STRICT – Listener only accepts connections with TLS enabled.
+--
+-- -   ____PERMISSIVE – Listener accepts connections with or without TLS
+--     enabled.
+--
+-- -   ____DISABLED – Listener only accepts connections without TLS.
+listenerTls_mode :: Lens.Lens' ListenerTls ListenerTlsMode
+listenerTls_mode = Lens.lens (\ListenerTls' {mode} -> mode) (\s@ListenerTls' {} a -> s {mode = a} :: ListenerTls)
+
+instance Data.FromJSON ListenerTls where
+  parseJSON =
+    Data.withObject
+      "ListenerTls"
+      ( \x ->
+          ListenerTls'
+            Prelude.<$> (x Data..:? "validation")
+            Prelude.<*> (x Data..: "certificate")
+            Prelude.<*> (x Data..: "mode")
+      )
+
+instance Prelude.Hashable ListenerTls where
+  hashWithSalt _salt ListenerTls' {..} =
+    _salt
+      `Prelude.hashWithSalt` validation
+      `Prelude.hashWithSalt` certificate
+      `Prelude.hashWithSalt` mode
+
+instance Prelude.NFData ListenerTls where
+  rnf ListenerTls' {..} =
+    Prelude.rnf validation
+      `Prelude.seq` Prelude.rnf certificate
+      `Prelude.seq` Prelude.rnf mode
+
+instance Data.ToJSON ListenerTls where
+  toJSON ListenerTls' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("validation" Data..=) Prelude.<$> validation,
+            Prelude.Just ("certificate" Data..= certificate),
+            Prelude.Just ("mode" Data..= mode)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsAcmCertificate.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsAcmCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsAcmCertificate.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsAcmCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsAcmCertificate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents an Certificate Manager certificate.
+--
+-- /See:/ 'newListenerTlsAcmCertificate' smart constructor.
+data ListenerTlsAcmCertificate = ListenerTlsAcmCertificate'
+  { -- | The Amazon Resource Name (ARN) for the certificate. The certificate must
+    -- meet specific requirements and you must have proxy authorization
+    -- enabled. For more information, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+    certificateArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTlsAcmCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateArn', 'listenerTlsAcmCertificate_certificateArn' - The Amazon Resource Name (ARN) for the certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+newListenerTlsAcmCertificate ::
+  -- | 'certificateArn'
+  Prelude.Text ->
+  ListenerTlsAcmCertificate
+newListenerTlsAcmCertificate pCertificateArn_ =
+  ListenerTlsAcmCertificate'
+    { certificateArn =
+        pCertificateArn_
+    }
+
+-- | The Amazon Resource Name (ARN) for the certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+listenerTlsAcmCertificate_certificateArn :: Lens.Lens' ListenerTlsAcmCertificate Prelude.Text
+listenerTlsAcmCertificate_certificateArn = Lens.lens (\ListenerTlsAcmCertificate' {certificateArn} -> certificateArn) (\s@ListenerTlsAcmCertificate' {} a -> s {certificateArn = a} :: ListenerTlsAcmCertificate)
+
+instance Data.FromJSON ListenerTlsAcmCertificate where
+  parseJSON =
+    Data.withObject
+      "ListenerTlsAcmCertificate"
+      ( \x ->
+          ListenerTlsAcmCertificate'
+            Prelude.<$> (x Data..: "certificateArn")
+      )
+
+instance Prelude.Hashable ListenerTlsAcmCertificate where
+  hashWithSalt _salt ListenerTlsAcmCertificate' {..} =
+    _salt `Prelude.hashWithSalt` certificateArn
+
+instance Prelude.NFData ListenerTlsAcmCertificate where
+  rnf ListenerTlsAcmCertificate' {..} =
+    Prelude.rnf certificateArn
+
+instance Data.ToJSON ListenerTlsAcmCertificate where
+  toJSON ListenerTlsAcmCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("certificateArn" Data..= certificateArn)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsCertificate.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsCertificate.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsCertificate where
+
+import Amazonka.AppMesh.Types.ListenerTlsAcmCertificate
+import Amazonka.AppMesh.Types.ListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.ListenerTlsSdsCertificate
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a listener\'s Transport Layer Security (TLS)
+-- certificate.
+--
+-- /See:/ 'newListenerTlsCertificate' smart constructor.
+data ListenerTlsCertificate = ListenerTlsCertificate'
+  { -- | A reference to an object that represents an Certificate Manager
+    -- certificate.
+    acm :: Prelude.Maybe ListenerTlsAcmCertificate,
+    -- | A reference to an object that represents a local file certificate.
+    file :: Prelude.Maybe ListenerTlsFileCertificate,
+    -- | A reference to an object that represents a listener\'s Secret Discovery
+    -- Service certificate.
+    sds :: Prelude.Maybe ListenerTlsSdsCertificate
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTlsCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acm', 'listenerTlsCertificate_acm' - A reference to an object that represents an Certificate Manager
+-- certificate.
+--
+-- 'file', 'listenerTlsCertificate_file' - A reference to an object that represents a local file certificate.
+--
+-- 'sds', 'listenerTlsCertificate_sds' - A reference to an object that represents a listener\'s Secret Discovery
+-- Service certificate.
+newListenerTlsCertificate ::
+  ListenerTlsCertificate
+newListenerTlsCertificate =
+  ListenerTlsCertificate'
+    { acm = Prelude.Nothing,
+      file = Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | A reference to an object that represents an Certificate Manager
+-- certificate.
+listenerTlsCertificate_acm :: Lens.Lens' ListenerTlsCertificate (Prelude.Maybe ListenerTlsAcmCertificate)
+listenerTlsCertificate_acm = Lens.lens (\ListenerTlsCertificate' {acm} -> acm) (\s@ListenerTlsCertificate' {} a -> s {acm = a} :: ListenerTlsCertificate)
+
+-- | A reference to an object that represents a local file certificate.
+listenerTlsCertificate_file :: Lens.Lens' ListenerTlsCertificate (Prelude.Maybe ListenerTlsFileCertificate)
+listenerTlsCertificate_file = Lens.lens (\ListenerTlsCertificate' {file} -> file) (\s@ListenerTlsCertificate' {} a -> s {file = a} :: ListenerTlsCertificate)
+
+-- | A reference to an object that represents a listener\'s Secret Discovery
+-- Service certificate.
+listenerTlsCertificate_sds :: Lens.Lens' ListenerTlsCertificate (Prelude.Maybe ListenerTlsSdsCertificate)
+listenerTlsCertificate_sds = Lens.lens (\ListenerTlsCertificate' {sds} -> sds) (\s@ListenerTlsCertificate' {} a -> s {sds = a} :: ListenerTlsCertificate)
+
+instance Data.FromJSON ListenerTlsCertificate where
+  parseJSON =
+    Data.withObject
+      "ListenerTlsCertificate"
+      ( \x ->
+          ListenerTlsCertificate'
+            Prelude.<$> (x Data..:? "acm")
+            Prelude.<*> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance Prelude.Hashable ListenerTlsCertificate where
+  hashWithSalt _salt ListenerTlsCertificate' {..} =
+    _salt
+      `Prelude.hashWithSalt` acm
+      `Prelude.hashWithSalt` file
+      `Prelude.hashWithSalt` sds
+
+instance Prelude.NFData ListenerTlsCertificate where
+  rnf ListenerTlsCertificate' {..} =
+    Prelude.rnf acm
+      `Prelude.seq` Prelude.rnf file
+      `Prelude.seq` Prelude.rnf sds
+
+instance Data.ToJSON ListenerTlsCertificate where
+  toJSON ListenerTlsCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("acm" Data..=) Prelude.<$> acm,
+            ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsFileCertificate.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsFileCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsFileCertificate.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsFileCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsFileCertificate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a local file certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+--
+-- /See:/ 'newListenerTlsFileCertificate' smart constructor.
+data ListenerTlsFileCertificate = ListenerTlsFileCertificate'
+  { -- | The certificate chain for the certificate.
+    certificateChain :: Prelude.Text,
+    -- | The private key for a certificate stored on the file system of the
+    -- virtual node that the proxy is running on.
+    privateKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTlsFileCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateChain', 'listenerTlsFileCertificate_certificateChain' - The certificate chain for the certificate.
+--
+-- 'privateKey', 'listenerTlsFileCertificate_privateKey' - The private key for a certificate stored on the file system of the
+-- virtual node that the proxy is running on.
+newListenerTlsFileCertificate ::
+  -- | 'certificateChain'
+  Prelude.Text ->
+  -- | 'privateKey'
+  Prelude.Text ->
+  ListenerTlsFileCertificate
+newListenerTlsFileCertificate
+  pCertificateChain_
+  pPrivateKey_ =
+    ListenerTlsFileCertificate'
+      { certificateChain =
+          pCertificateChain_,
+        privateKey = pPrivateKey_
+      }
+
+-- | The certificate chain for the certificate.
+listenerTlsFileCertificate_certificateChain :: Lens.Lens' ListenerTlsFileCertificate Prelude.Text
+listenerTlsFileCertificate_certificateChain = Lens.lens (\ListenerTlsFileCertificate' {certificateChain} -> certificateChain) (\s@ListenerTlsFileCertificate' {} a -> s {certificateChain = a} :: ListenerTlsFileCertificate)
+
+-- | The private key for a certificate stored on the file system of the
+-- virtual node that the proxy is running on.
+listenerTlsFileCertificate_privateKey :: Lens.Lens' ListenerTlsFileCertificate Prelude.Text
+listenerTlsFileCertificate_privateKey = Lens.lens (\ListenerTlsFileCertificate' {privateKey} -> privateKey) (\s@ListenerTlsFileCertificate' {} a -> s {privateKey = a} :: ListenerTlsFileCertificate)
+
+instance Data.FromJSON ListenerTlsFileCertificate where
+  parseJSON =
+    Data.withObject
+      "ListenerTlsFileCertificate"
+      ( \x ->
+          ListenerTlsFileCertificate'
+            Prelude.<$> (x Data..: "certificateChain")
+            Prelude.<*> (x Data..: "privateKey")
+      )
+
+instance Prelude.Hashable ListenerTlsFileCertificate where
+  hashWithSalt _salt ListenerTlsFileCertificate' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificateChain
+      `Prelude.hashWithSalt` privateKey
+
+instance Prelude.NFData ListenerTlsFileCertificate where
+  rnf ListenerTlsFileCertificate' {..} =
+    Prelude.rnf certificateChain
+      `Prelude.seq` Prelude.rnf privateKey
+
+instance Data.ToJSON ListenerTlsFileCertificate where
+  toJSON ListenerTlsFileCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("certificateChain" Data..= certificateChain),
+            Prelude.Just ("privateKey" Data..= privateKey)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsMode.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsMode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsMode
+  ( ListenerTlsMode
+      ( ..,
+        ListenerTlsMode_DISABLED,
+        ListenerTlsMode_PERMISSIVE,
+        ListenerTlsMode_STRICT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListenerTlsMode = ListenerTlsMode'
+  { fromListenerTlsMode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ListenerTlsMode_DISABLED :: ListenerTlsMode
+pattern ListenerTlsMode_DISABLED = ListenerTlsMode' "DISABLED"
+
+pattern ListenerTlsMode_PERMISSIVE :: ListenerTlsMode
+pattern ListenerTlsMode_PERMISSIVE = ListenerTlsMode' "PERMISSIVE"
+
+pattern ListenerTlsMode_STRICT :: ListenerTlsMode
+pattern ListenerTlsMode_STRICT = ListenerTlsMode' "STRICT"
+
+{-# COMPLETE
+  ListenerTlsMode_DISABLED,
+  ListenerTlsMode_PERMISSIVE,
+  ListenerTlsMode_STRICT,
+  ListenerTlsMode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsSdsCertificate.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsSdsCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsSdsCertificate.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsSdsCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsSdsCertificate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the listener\'s Secret Discovery Service
+-- certificate. The proxy must be configured with a local SDS provider via
+-- a Unix Domain Socket. See App Mesh
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html TLS documentation>
+-- for more info.
+--
+-- /See:/ 'newListenerTlsSdsCertificate' smart constructor.
+data ListenerTlsSdsCertificate = ListenerTlsSdsCertificate'
+  { -- | A reference to an object that represents the name of the secret
+    -- requested from the Secret Discovery Service provider representing
+    -- Transport Layer Security (TLS) materials like a certificate or
+    -- certificate chain.
+    secretName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTlsSdsCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'secretName', 'listenerTlsSdsCertificate_secretName' - A reference to an object that represents the name of the secret
+-- requested from the Secret Discovery Service provider representing
+-- Transport Layer Security (TLS) materials like a certificate or
+-- certificate chain.
+newListenerTlsSdsCertificate ::
+  -- | 'secretName'
+  Prelude.Text ->
+  ListenerTlsSdsCertificate
+newListenerTlsSdsCertificate pSecretName_ =
+  ListenerTlsSdsCertificate'
+    { secretName =
+        pSecretName_
+    }
+
+-- | A reference to an object that represents the name of the secret
+-- requested from the Secret Discovery Service provider representing
+-- Transport Layer Security (TLS) materials like a certificate or
+-- certificate chain.
+listenerTlsSdsCertificate_secretName :: Lens.Lens' ListenerTlsSdsCertificate Prelude.Text
+listenerTlsSdsCertificate_secretName = Lens.lens (\ListenerTlsSdsCertificate' {secretName} -> secretName) (\s@ListenerTlsSdsCertificate' {} a -> s {secretName = a} :: ListenerTlsSdsCertificate)
+
+instance Data.FromJSON ListenerTlsSdsCertificate where
+  parseJSON =
+    Data.withObject
+      "ListenerTlsSdsCertificate"
+      ( \x ->
+          ListenerTlsSdsCertificate'
+            Prelude.<$> (x Data..: "secretName")
+      )
+
+instance Prelude.Hashable ListenerTlsSdsCertificate where
+  hashWithSalt _salt ListenerTlsSdsCertificate' {..} =
+    _salt `Prelude.hashWithSalt` secretName
+
+instance Prelude.NFData ListenerTlsSdsCertificate where
+  rnf ListenerTlsSdsCertificate' {..} =
+    Prelude.rnf secretName
+
+instance Data.ToJSON ListenerTlsSdsCertificate where
+  toJSON ListenerTlsSdsCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("secretName" Data..= secretName)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsValidationContext.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsValidationContext.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsValidationContext.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsValidationContext
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsValidationContext where
+
+import Amazonka.AppMesh.Types.ListenerTlsValidationContextTrust
+import Amazonka.AppMesh.Types.SubjectAlternativeNames
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a listener\'s Transport Layer Security (TLS)
+-- validation context.
+--
+-- /See:/ 'newListenerTlsValidationContext' smart constructor.
+data ListenerTlsValidationContext = ListenerTlsValidationContext'
+  { -- | A reference to an object that represents the SANs for a listener\'s
+    -- Transport Layer Security (TLS) validation context.
+    subjectAlternativeNames :: Prelude.Maybe SubjectAlternativeNames,
+    -- | A reference to where to retrieve the trust chain when validating a
+    -- peer’s Transport Layer Security (TLS) certificate.
+    trust :: ListenerTlsValidationContextTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTlsValidationContext' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subjectAlternativeNames', 'listenerTlsValidationContext_subjectAlternativeNames' - A reference to an object that represents the SANs for a listener\'s
+-- Transport Layer Security (TLS) validation context.
+--
+-- 'trust', 'listenerTlsValidationContext_trust' - A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+newListenerTlsValidationContext ::
+  -- | 'trust'
+  ListenerTlsValidationContextTrust ->
+  ListenerTlsValidationContext
+newListenerTlsValidationContext pTrust_ =
+  ListenerTlsValidationContext'
+    { subjectAlternativeNames =
+        Prelude.Nothing,
+      trust = pTrust_
+    }
+
+-- | A reference to an object that represents the SANs for a listener\'s
+-- Transport Layer Security (TLS) validation context.
+listenerTlsValidationContext_subjectAlternativeNames :: Lens.Lens' ListenerTlsValidationContext (Prelude.Maybe SubjectAlternativeNames)
+listenerTlsValidationContext_subjectAlternativeNames = Lens.lens (\ListenerTlsValidationContext' {subjectAlternativeNames} -> subjectAlternativeNames) (\s@ListenerTlsValidationContext' {} a -> s {subjectAlternativeNames = a} :: ListenerTlsValidationContext)
+
+-- | A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+listenerTlsValidationContext_trust :: Lens.Lens' ListenerTlsValidationContext ListenerTlsValidationContextTrust
+listenerTlsValidationContext_trust = Lens.lens (\ListenerTlsValidationContext' {trust} -> trust) (\s@ListenerTlsValidationContext' {} a -> s {trust = a} :: ListenerTlsValidationContext)
+
+instance Data.FromJSON ListenerTlsValidationContext where
+  parseJSON =
+    Data.withObject
+      "ListenerTlsValidationContext"
+      ( \x ->
+          ListenerTlsValidationContext'
+            Prelude.<$> (x Data..:? "subjectAlternativeNames")
+            Prelude.<*> (x Data..: "trust")
+      )
+
+instance
+  Prelude.Hashable
+    ListenerTlsValidationContext
+  where
+  hashWithSalt _salt ListenerTlsValidationContext' {..} =
+    _salt
+      `Prelude.hashWithSalt` subjectAlternativeNames
+      `Prelude.hashWithSalt` trust
+
+instance Prelude.NFData ListenerTlsValidationContext where
+  rnf ListenerTlsValidationContext' {..} =
+    Prelude.rnf subjectAlternativeNames
+      `Prelude.seq` Prelude.rnf trust
+
+instance Data.ToJSON ListenerTlsValidationContext where
+  toJSON ListenerTlsValidationContext' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("subjectAlternativeNames" Data..=)
+              Prelude.<$> subjectAlternativeNames,
+            Prelude.Just ("trust" Data..= trust)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ListenerTlsValidationContextTrust.hs b/gen/Amazonka/AppMesh/Types/ListenerTlsValidationContextTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ListenerTlsValidationContextTrust.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ListenerTlsValidationContextTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ListenerTlsValidationContextTrust where
+
+import Amazonka.AppMesh.Types.TlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.TlsValidationContextSdsTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a listener\'s Transport Layer Security (TLS)
+-- validation context trust.
+--
+-- /See:/ 'newListenerTlsValidationContextTrust' smart constructor.
+data ListenerTlsValidationContextTrust = ListenerTlsValidationContextTrust'
+  { -- | An object that represents a Transport Layer Security (TLS) validation
+    -- context trust for a local file.
+    file :: Prelude.Maybe TlsValidationContextFileTrust,
+    -- | A reference to an object that represents a listener\'s Transport Layer
+    -- Security (TLS) Secret Discovery Service validation context trust.
+    sds :: Prelude.Maybe TlsValidationContextSdsTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListenerTlsValidationContextTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'listenerTlsValidationContextTrust_file' - An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+--
+-- 'sds', 'listenerTlsValidationContextTrust_sds' - A reference to an object that represents a listener\'s Transport Layer
+-- Security (TLS) Secret Discovery Service validation context trust.
+newListenerTlsValidationContextTrust ::
+  ListenerTlsValidationContextTrust
+newListenerTlsValidationContextTrust =
+  ListenerTlsValidationContextTrust'
+    { file =
+        Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+listenerTlsValidationContextTrust_file :: Lens.Lens' ListenerTlsValidationContextTrust (Prelude.Maybe TlsValidationContextFileTrust)
+listenerTlsValidationContextTrust_file = Lens.lens (\ListenerTlsValidationContextTrust' {file} -> file) (\s@ListenerTlsValidationContextTrust' {} a -> s {file = a} :: ListenerTlsValidationContextTrust)
+
+-- | A reference to an object that represents a listener\'s Transport Layer
+-- Security (TLS) Secret Discovery Service validation context trust.
+listenerTlsValidationContextTrust_sds :: Lens.Lens' ListenerTlsValidationContextTrust (Prelude.Maybe TlsValidationContextSdsTrust)
+listenerTlsValidationContextTrust_sds = Lens.lens (\ListenerTlsValidationContextTrust' {sds} -> sds) (\s@ListenerTlsValidationContextTrust' {} a -> s {sds = a} :: ListenerTlsValidationContextTrust)
+
+instance
+  Data.FromJSON
+    ListenerTlsValidationContextTrust
+  where
+  parseJSON =
+    Data.withObject
+      "ListenerTlsValidationContextTrust"
+      ( \x ->
+          ListenerTlsValidationContextTrust'
+            Prelude.<$> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance
+  Prelude.Hashable
+    ListenerTlsValidationContextTrust
+  where
+  hashWithSalt
+    _salt
+    ListenerTlsValidationContextTrust' {..} =
+      _salt
+        `Prelude.hashWithSalt` file
+        `Prelude.hashWithSalt` sds
+
+instance
+  Prelude.NFData
+    ListenerTlsValidationContextTrust
+  where
+  rnf ListenerTlsValidationContextTrust' {..} =
+    Prelude.rnf file `Prelude.seq` Prelude.rnf sds
+
+instance
+  Data.ToJSON
+    ListenerTlsValidationContextTrust
+  where
+  toJSON ListenerTlsValidationContextTrust' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/Logging.hs b/gen/Amazonka/AppMesh/Types/Logging.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/Logging.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.Logging
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.Logging where
+
+import Amazonka.AppMesh.Types.AccessLog
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the logging information for a virtual node.
+--
+-- /See:/ 'newLogging' smart constructor.
+data Logging = Logging'
+  { -- | The access log configuration for a virtual node.
+    accessLog :: Prelude.Maybe AccessLog
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Logging' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessLog', 'logging_accessLog' - The access log configuration for a virtual node.
+newLogging ::
+  Logging
+newLogging = Logging' {accessLog = Prelude.Nothing}
+
+-- | The access log configuration for a virtual node.
+logging_accessLog :: Lens.Lens' Logging (Prelude.Maybe AccessLog)
+logging_accessLog = Lens.lens (\Logging' {accessLog} -> accessLog) (\s@Logging' {} a -> s {accessLog = a} :: Logging)
+
+instance Data.FromJSON Logging where
+  parseJSON =
+    Data.withObject
+      "Logging"
+      ( \x ->
+          Logging' Prelude.<$> (x Data..:? "accessLog")
+      )
+
+instance Prelude.Hashable Logging where
+  hashWithSalt _salt Logging' {..} =
+    _salt `Prelude.hashWithSalt` accessLog
+
+instance Prelude.NFData Logging where
+  rnf Logging' {..} = Prelude.rnf accessLog
+
+instance Data.ToJSON Logging where
+  toJSON Logging' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("accessLog" Data..=) Prelude.<$> accessLog]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/LoggingFormat.hs b/gen/Amazonka/AppMesh/Types/LoggingFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/LoggingFormat.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.LoggingFormat
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.LoggingFormat where
+
+import Amazonka.AppMesh.Types.JsonFormatRef
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the format for the logs.
+--
+-- /See:/ 'newLoggingFormat' smart constructor.
+data LoggingFormat = LoggingFormat'
+  { json :: Prelude.Maybe [JsonFormatRef],
+    text :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LoggingFormat' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'json', 'loggingFormat_json' -
+--
+-- 'text', 'loggingFormat_text' -
+newLoggingFormat ::
+  LoggingFormat
+newLoggingFormat =
+  LoggingFormat'
+    { json = Prelude.Nothing,
+      text = Prelude.Nothing
+    }
+
+loggingFormat_json :: Lens.Lens' LoggingFormat (Prelude.Maybe [JsonFormatRef])
+loggingFormat_json = Lens.lens (\LoggingFormat' {json} -> json) (\s@LoggingFormat' {} a -> s {json = a} :: LoggingFormat) Prelude.. Lens.mapping Lens.coerced
+
+loggingFormat_text :: Lens.Lens' LoggingFormat (Prelude.Maybe Prelude.Text)
+loggingFormat_text = Lens.lens (\LoggingFormat' {text} -> text) (\s@LoggingFormat' {} a -> s {text = a} :: LoggingFormat)
+
+instance Data.FromJSON LoggingFormat where
+  parseJSON =
+    Data.withObject
+      "LoggingFormat"
+      ( \x ->
+          LoggingFormat'
+            Prelude.<$> (x Data..:? "json" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "text")
+      )
+
+instance Prelude.Hashable LoggingFormat where
+  hashWithSalt _salt LoggingFormat' {..} =
+    _salt
+      `Prelude.hashWithSalt` json
+      `Prelude.hashWithSalt` text
+
+instance Prelude.NFData LoggingFormat where
+  rnf LoggingFormat' {..} =
+    Prelude.rnf json `Prelude.seq` Prelude.rnf text
+
+instance Data.ToJSON LoggingFormat where
+  toJSON LoggingFormat' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("json" Data..=) Prelude.<$> json,
+            ("text" Data..=) Prelude.<$> text
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/MatchRange.hs b/gen/Amazonka/AppMesh/Types/MatchRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MatchRange.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MatchRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MatchRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the range of values to match on. The first
+-- character of the range is included in the range, though the last
+-- character is not. For example, if the range specified were 1-100, only
+-- values 1-99 would be matched.
+--
+-- /See:/ 'newMatchRange' smart constructor.
+data MatchRange = MatchRange'
+  { -- | The end of the range.
+    end :: Prelude.Integer,
+    -- | The start of the range.
+    start :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MatchRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'end', 'matchRange_end' - The end of the range.
+--
+-- 'start', 'matchRange_start' - The start of the range.
+newMatchRange ::
+  -- | 'end'
+  Prelude.Integer ->
+  -- | 'start'
+  Prelude.Integer ->
+  MatchRange
+newMatchRange pEnd_ pStart_ =
+  MatchRange' {end = pEnd_, start = pStart_}
+
+-- | The end of the range.
+matchRange_end :: Lens.Lens' MatchRange Prelude.Integer
+matchRange_end = Lens.lens (\MatchRange' {end} -> end) (\s@MatchRange' {} a -> s {end = a} :: MatchRange)
+
+-- | The start of the range.
+matchRange_start :: Lens.Lens' MatchRange Prelude.Integer
+matchRange_start = Lens.lens (\MatchRange' {start} -> start) (\s@MatchRange' {} a -> s {start = a} :: MatchRange)
+
+instance Data.FromJSON MatchRange where
+  parseJSON =
+    Data.withObject
+      "MatchRange"
+      ( \x ->
+          MatchRange'
+            Prelude.<$> (x Data..: "end")
+            Prelude.<*> (x Data..: "start")
+      )
+
+instance Prelude.Hashable MatchRange where
+  hashWithSalt _salt MatchRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` end
+      `Prelude.hashWithSalt` start
+
+instance Prelude.NFData MatchRange where
+  rnf MatchRange' {..} =
+    Prelude.rnf end `Prelude.seq` Prelude.rnf start
+
+instance Data.ToJSON MatchRange where
+  toJSON MatchRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("end" Data..= end),
+            Prelude.Just ("start" Data..= start)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/MeshData.hs b/gen/Amazonka/AppMesh/Types/MeshData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MeshData.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MeshData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MeshData where
+
+import Amazonka.AppMesh.Types.MeshSpec
+import Amazonka.AppMesh.Types.MeshStatus
+import Amazonka.AppMesh.Types.ResourceMetadata
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a service mesh returned by a describe
+-- operation.
+--
+-- /See:/ 'newMeshData' smart constructor.
+data MeshData = MeshData'
+  { -- | The name of the service mesh.
+    meshName :: Prelude.Text,
+    -- | The associated metadata for the service mesh.
+    metadata :: ResourceMetadata,
+    -- | The associated specification for the service mesh.
+    spec :: MeshSpec,
+    -- | The status of the service mesh.
+    status :: MeshStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeshData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'meshData_meshName' - The name of the service mesh.
+--
+-- 'metadata', 'meshData_metadata' - The associated metadata for the service mesh.
+--
+-- 'spec', 'meshData_spec' - The associated specification for the service mesh.
+--
+-- 'status', 'meshData_status' - The status of the service mesh.
+newMeshData ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'spec'
+  MeshSpec ->
+  -- | 'status'
+  MeshStatus ->
+  MeshData
+newMeshData pMeshName_ pMetadata_ pSpec_ pStatus_ =
+  MeshData'
+    { meshName = pMeshName_,
+      metadata = pMetadata_,
+      spec = pSpec_,
+      status = pStatus_
+    }
+
+-- | The name of the service mesh.
+meshData_meshName :: Lens.Lens' MeshData Prelude.Text
+meshData_meshName = Lens.lens (\MeshData' {meshName} -> meshName) (\s@MeshData' {} a -> s {meshName = a} :: MeshData)
+
+-- | The associated metadata for the service mesh.
+meshData_metadata :: Lens.Lens' MeshData ResourceMetadata
+meshData_metadata = Lens.lens (\MeshData' {metadata} -> metadata) (\s@MeshData' {} a -> s {metadata = a} :: MeshData)
+
+-- | The associated specification for the service mesh.
+meshData_spec :: Lens.Lens' MeshData MeshSpec
+meshData_spec = Lens.lens (\MeshData' {spec} -> spec) (\s@MeshData' {} a -> s {spec = a} :: MeshData)
+
+-- | The status of the service mesh.
+meshData_status :: Lens.Lens' MeshData MeshStatus
+meshData_status = Lens.lens (\MeshData' {status} -> status) (\s@MeshData' {} a -> s {status = a} :: MeshData)
+
+instance Data.FromJSON MeshData where
+  parseJSON =
+    Data.withObject
+      "MeshData"
+      ( \x ->
+          MeshData'
+            Prelude.<$> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+      )
+
+instance Prelude.Hashable MeshData where
+  hashWithSalt _salt MeshData' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData MeshData where
+  rnf MeshData' {..} =
+    Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/MeshRef.hs b/gen/Amazonka/AppMesh/Types/MeshRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MeshRef.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MeshRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MeshRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a service mesh returned by a list operation.
+--
+-- /See:/ 'newMeshRef' smart constructor.
+data MeshRef = MeshRef'
+  { -- | The full Amazon Resource Name (ARN) of the service mesh.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeshRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'meshRef_arn' - The full Amazon Resource Name (ARN) of the service mesh.
+--
+-- 'createdAt', 'meshRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'meshRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'meshRef_meshName' - The name of the service mesh.
+--
+-- 'meshOwner', 'meshRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'meshRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'version', 'meshRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+newMeshRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  MeshRef
+newMeshRef
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pVersion_ =
+    MeshRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        version = pVersion_
+      }
+
+-- | The full Amazon Resource Name (ARN) of the service mesh.
+meshRef_arn :: Lens.Lens' MeshRef Prelude.Text
+meshRef_arn = Lens.lens (\MeshRef' {arn} -> arn) (\s@MeshRef' {} a -> s {arn = a} :: MeshRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+meshRef_createdAt :: Lens.Lens' MeshRef Prelude.UTCTime
+meshRef_createdAt = Lens.lens (\MeshRef' {createdAt} -> createdAt) (\s@MeshRef' {} a -> s {createdAt = a} :: MeshRef) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+meshRef_lastUpdatedAt :: Lens.Lens' MeshRef Prelude.UTCTime
+meshRef_lastUpdatedAt = Lens.lens (\MeshRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@MeshRef' {} a -> s {lastUpdatedAt = a} :: MeshRef) Prelude.. Data._Time
+
+-- | The name of the service mesh.
+meshRef_meshName :: Lens.Lens' MeshRef Prelude.Text
+meshRef_meshName = Lens.lens (\MeshRef' {meshName} -> meshName) (\s@MeshRef' {} a -> s {meshName = a} :: MeshRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+meshRef_meshOwner :: Lens.Lens' MeshRef Prelude.Text
+meshRef_meshOwner = Lens.lens (\MeshRef' {meshOwner} -> meshOwner) (\s@MeshRef' {} a -> s {meshOwner = a} :: MeshRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+meshRef_resourceOwner :: Lens.Lens' MeshRef Prelude.Text
+meshRef_resourceOwner = Lens.lens (\MeshRef' {resourceOwner} -> resourceOwner) (\s@MeshRef' {} a -> s {resourceOwner = a} :: MeshRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+meshRef_version :: Lens.Lens' MeshRef Prelude.Integer
+meshRef_version = Lens.lens (\MeshRef' {version} -> version) (\s@MeshRef' {} a -> s {version = a} :: MeshRef)
+
+instance Data.FromJSON MeshRef where
+  parseJSON =
+    Data.withObject
+      "MeshRef"
+      ( \x ->
+          MeshRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "version")
+      )
+
+instance Prelude.Hashable MeshRef where
+  hashWithSalt _salt MeshRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData MeshRef where
+  rnf MeshRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf version
diff --git a/gen/Amazonka/AppMesh/Types/MeshServiceDiscovery.hs b/gen/Amazonka/AppMesh/Types/MeshServiceDiscovery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MeshServiceDiscovery.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MeshServiceDiscovery
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MeshServiceDiscovery where
+
+import Amazonka.AppMesh.Types.IpPreference
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the service discovery information for a
+-- service mesh.
+--
+-- /See:/ 'newMeshServiceDiscovery' smart constructor.
+data MeshServiceDiscovery = MeshServiceDiscovery'
+  { -- | The IP version to use to control traffic within the mesh.
+    ipPreference :: Prelude.Maybe IpPreference
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeshServiceDiscovery' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ipPreference', 'meshServiceDiscovery_ipPreference' - The IP version to use to control traffic within the mesh.
+newMeshServiceDiscovery ::
+  MeshServiceDiscovery
+newMeshServiceDiscovery =
+  MeshServiceDiscovery'
+    { ipPreference =
+        Prelude.Nothing
+    }
+
+-- | The IP version to use to control traffic within the mesh.
+meshServiceDiscovery_ipPreference :: Lens.Lens' MeshServiceDiscovery (Prelude.Maybe IpPreference)
+meshServiceDiscovery_ipPreference = Lens.lens (\MeshServiceDiscovery' {ipPreference} -> ipPreference) (\s@MeshServiceDiscovery' {} a -> s {ipPreference = a} :: MeshServiceDiscovery)
+
+instance Data.FromJSON MeshServiceDiscovery where
+  parseJSON =
+    Data.withObject
+      "MeshServiceDiscovery"
+      ( \x ->
+          MeshServiceDiscovery'
+            Prelude.<$> (x Data..:? "ipPreference")
+      )
+
+instance Prelude.Hashable MeshServiceDiscovery where
+  hashWithSalt _salt MeshServiceDiscovery' {..} =
+    _salt `Prelude.hashWithSalt` ipPreference
+
+instance Prelude.NFData MeshServiceDiscovery where
+  rnf MeshServiceDiscovery' {..} =
+    Prelude.rnf ipPreference
+
+instance Data.ToJSON MeshServiceDiscovery where
+  toJSON MeshServiceDiscovery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("ipPreference" Data..=) Prelude.<$> ipPreference]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/MeshSpec.hs b/gen/Amazonka/AppMesh/Types/MeshSpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MeshSpec.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MeshSpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MeshSpec where
+
+import Amazonka.AppMesh.Types.EgressFilter
+import Amazonka.AppMesh.Types.MeshServiceDiscovery
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the specification of a service mesh.
+--
+-- /See:/ 'newMeshSpec' smart constructor.
+data MeshSpec = MeshSpec'
+  { -- | The egress filter rules for the service mesh.
+    egressFilter :: Prelude.Maybe EgressFilter,
+    serviceDiscovery :: Prelude.Maybe MeshServiceDiscovery
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeshSpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'egressFilter', 'meshSpec_egressFilter' - The egress filter rules for the service mesh.
+--
+-- 'serviceDiscovery', 'meshSpec_serviceDiscovery' - Undocumented member.
+newMeshSpec ::
+  MeshSpec
+newMeshSpec =
+  MeshSpec'
+    { egressFilter = Prelude.Nothing,
+      serviceDiscovery = Prelude.Nothing
+    }
+
+-- | The egress filter rules for the service mesh.
+meshSpec_egressFilter :: Lens.Lens' MeshSpec (Prelude.Maybe EgressFilter)
+meshSpec_egressFilter = Lens.lens (\MeshSpec' {egressFilter} -> egressFilter) (\s@MeshSpec' {} a -> s {egressFilter = a} :: MeshSpec)
+
+-- | Undocumented member.
+meshSpec_serviceDiscovery :: Lens.Lens' MeshSpec (Prelude.Maybe MeshServiceDiscovery)
+meshSpec_serviceDiscovery = Lens.lens (\MeshSpec' {serviceDiscovery} -> serviceDiscovery) (\s@MeshSpec' {} a -> s {serviceDiscovery = a} :: MeshSpec)
+
+instance Data.FromJSON MeshSpec where
+  parseJSON =
+    Data.withObject
+      "MeshSpec"
+      ( \x ->
+          MeshSpec'
+            Prelude.<$> (x Data..:? "egressFilter")
+            Prelude.<*> (x Data..:? "serviceDiscovery")
+      )
+
+instance Prelude.Hashable MeshSpec where
+  hashWithSalt _salt MeshSpec' {..} =
+    _salt
+      `Prelude.hashWithSalt` egressFilter
+      `Prelude.hashWithSalt` serviceDiscovery
+
+instance Prelude.NFData MeshSpec where
+  rnf MeshSpec' {..} =
+    Prelude.rnf egressFilter
+      `Prelude.seq` Prelude.rnf serviceDiscovery
+
+instance Data.ToJSON MeshSpec where
+  toJSON MeshSpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("egressFilter" Data..=) Prelude.<$> egressFilter,
+            ("serviceDiscovery" Data..=)
+              Prelude.<$> serviceDiscovery
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/MeshStatus.hs b/gen/Amazonka/AppMesh/Types/MeshStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MeshStatus.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MeshStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MeshStatus where
+
+import Amazonka.AppMesh.Types.MeshStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the status of a service mesh.
+--
+-- /See:/ 'newMeshStatus' smart constructor.
+data MeshStatus = MeshStatus'
+  { -- | The current mesh status.
+    status :: Prelude.Maybe MeshStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeshStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'meshStatus_status' - The current mesh status.
+newMeshStatus ::
+  MeshStatus
+newMeshStatus = MeshStatus' {status = Prelude.Nothing}
+
+-- | The current mesh status.
+meshStatus_status :: Lens.Lens' MeshStatus (Prelude.Maybe MeshStatusCode)
+meshStatus_status = Lens.lens (\MeshStatus' {status} -> status) (\s@MeshStatus' {} a -> s {status = a} :: MeshStatus)
+
+instance Data.FromJSON MeshStatus where
+  parseJSON =
+    Data.withObject
+      "MeshStatus"
+      ( \x ->
+          MeshStatus' Prelude.<$> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable MeshStatus where
+  hashWithSalt _salt MeshStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData MeshStatus where
+  rnf MeshStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/MeshStatusCode.hs b/gen/Amazonka/AppMesh/Types/MeshStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/MeshStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.MeshStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.MeshStatusCode
+  ( MeshStatusCode
+      ( ..,
+        MeshStatusCode_ACTIVE,
+        MeshStatusCode_DELETED,
+        MeshStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MeshStatusCode = MeshStatusCode'
+  { fromMeshStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern MeshStatusCode_ACTIVE :: MeshStatusCode
+pattern MeshStatusCode_ACTIVE = MeshStatusCode' "ACTIVE"
+
+pattern MeshStatusCode_DELETED :: MeshStatusCode
+pattern MeshStatusCode_DELETED = MeshStatusCode' "DELETED"
+
+pattern MeshStatusCode_INACTIVE :: MeshStatusCode
+pattern MeshStatusCode_INACTIVE = MeshStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  MeshStatusCode_ACTIVE,
+  MeshStatusCode_DELETED,
+  MeshStatusCode_INACTIVE,
+  MeshStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/OutlierDetection.hs b/gen/Amazonka/AppMesh/Types/OutlierDetection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/OutlierDetection.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.OutlierDetection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.OutlierDetection where
+
+import Amazonka.AppMesh.Types.Duration
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the outlier detection for a virtual node\'s
+-- listener.
+--
+-- /See:/ 'newOutlierDetection' smart constructor.
+data OutlierDetection = OutlierDetection'
+  { -- | The base amount of time for which a host is ejected.
+    baseEjectionDuration :: Duration,
+    -- | The time interval between ejection sweep analysis.
+    interval :: Duration,
+    -- | Maximum percentage of hosts in load balancing pool for upstream service
+    -- that can be ejected. Will eject at least one host regardless of the
+    -- value.
+    maxEjectionPercent :: Prelude.Natural,
+    -- | Number of consecutive @5xx@ errors required for ejection.
+    maxServerErrors :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutlierDetection' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'baseEjectionDuration', 'outlierDetection_baseEjectionDuration' - The base amount of time for which a host is ejected.
+--
+-- 'interval', 'outlierDetection_interval' - The time interval between ejection sweep analysis.
+--
+-- 'maxEjectionPercent', 'outlierDetection_maxEjectionPercent' - Maximum percentage of hosts in load balancing pool for upstream service
+-- that can be ejected. Will eject at least one host regardless of the
+-- value.
+--
+-- 'maxServerErrors', 'outlierDetection_maxServerErrors' - Number of consecutive @5xx@ errors required for ejection.
+newOutlierDetection ::
+  -- | 'baseEjectionDuration'
+  Duration ->
+  -- | 'interval'
+  Duration ->
+  -- | 'maxEjectionPercent'
+  Prelude.Natural ->
+  -- | 'maxServerErrors'
+  Prelude.Natural ->
+  OutlierDetection
+newOutlierDetection
+  pBaseEjectionDuration_
+  pInterval_
+  pMaxEjectionPercent_
+  pMaxServerErrors_ =
+    OutlierDetection'
+      { baseEjectionDuration =
+          pBaseEjectionDuration_,
+        interval = pInterval_,
+        maxEjectionPercent = pMaxEjectionPercent_,
+        maxServerErrors = pMaxServerErrors_
+      }
+
+-- | The base amount of time for which a host is ejected.
+outlierDetection_baseEjectionDuration :: Lens.Lens' OutlierDetection Duration
+outlierDetection_baseEjectionDuration = Lens.lens (\OutlierDetection' {baseEjectionDuration} -> baseEjectionDuration) (\s@OutlierDetection' {} a -> s {baseEjectionDuration = a} :: OutlierDetection)
+
+-- | The time interval between ejection sweep analysis.
+outlierDetection_interval :: Lens.Lens' OutlierDetection Duration
+outlierDetection_interval = Lens.lens (\OutlierDetection' {interval} -> interval) (\s@OutlierDetection' {} a -> s {interval = a} :: OutlierDetection)
+
+-- | Maximum percentage of hosts in load balancing pool for upstream service
+-- that can be ejected. Will eject at least one host regardless of the
+-- value.
+outlierDetection_maxEjectionPercent :: Lens.Lens' OutlierDetection Prelude.Natural
+outlierDetection_maxEjectionPercent = Lens.lens (\OutlierDetection' {maxEjectionPercent} -> maxEjectionPercent) (\s@OutlierDetection' {} a -> s {maxEjectionPercent = a} :: OutlierDetection)
+
+-- | Number of consecutive @5xx@ errors required for ejection.
+outlierDetection_maxServerErrors :: Lens.Lens' OutlierDetection Prelude.Natural
+outlierDetection_maxServerErrors = Lens.lens (\OutlierDetection' {maxServerErrors} -> maxServerErrors) (\s@OutlierDetection' {} a -> s {maxServerErrors = a} :: OutlierDetection)
+
+instance Data.FromJSON OutlierDetection where
+  parseJSON =
+    Data.withObject
+      "OutlierDetection"
+      ( \x ->
+          OutlierDetection'
+            Prelude.<$> (x Data..: "baseEjectionDuration")
+            Prelude.<*> (x Data..: "interval")
+            Prelude.<*> (x Data..: "maxEjectionPercent")
+            Prelude.<*> (x Data..: "maxServerErrors")
+      )
+
+instance Prelude.Hashable OutlierDetection where
+  hashWithSalt _salt OutlierDetection' {..} =
+    _salt
+      `Prelude.hashWithSalt` baseEjectionDuration
+      `Prelude.hashWithSalt` interval
+      `Prelude.hashWithSalt` maxEjectionPercent
+      `Prelude.hashWithSalt` maxServerErrors
+
+instance Prelude.NFData OutlierDetection where
+  rnf OutlierDetection' {..} =
+    Prelude.rnf baseEjectionDuration
+      `Prelude.seq` Prelude.rnf interval
+      `Prelude.seq` Prelude.rnf maxEjectionPercent
+      `Prelude.seq` Prelude.rnf maxServerErrors
+
+instance Data.ToJSON OutlierDetection where
+  toJSON OutlierDetection' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "baseEjectionDuration"
+                  Data..= baseEjectionDuration
+              ),
+            Prelude.Just ("interval" Data..= interval),
+            Prelude.Just
+              ("maxEjectionPercent" Data..= maxEjectionPercent),
+            Prelude.Just
+              ("maxServerErrors" Data..= maxServerErrors)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/PortMapping.hs b/gen/Amazonka/AppMesh/Types/PortMapping.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/PortMapping.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.PortMapping
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.PortMapping where
+
+import Amazonka.AppMesh.Types.PortProtocol
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a port mapping.
+--
+-- /See:/ 'newPortMapping' smart constructor.
+data PortMapping = PortMapping'
+  { -- | The port used for the port mapping.
+    port :: Prelude.Natural,
+    -- | The protocol used for the port mapping. Specify one protocol.
+    protocol :: PortProtocol
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PortMapping' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'port', 'portMapping_port' - The port used for the port mapping.
+--
+-- 'protocol', 'portMapping_protocol' - The protocol used for the port mapping. Specify one protocol.
+newPortMapping ::
+  -- | 'port'
+  Prelude.Natural ->
+  -- | 'protocol'
+  PortProtocol ->
+  PortMapping
+newPortMapping pPort_ pProtocol_ =
+  PortMapping' {port = pPort_, protocol = pProtocol_}
+
+-- | The port used for the port mapping.
+portMapping_port :: Lens.Lens' PortMapping Prelude.Natural
+portMapping_port = Lens.lens (\PortMapping' {port} -> port) (\s@PortMapping' {} a -> s {port = a} :: PortMapping)
+
+-- | The protocol used for the port mapping. Specify one protocol.
+portMapping_protocol :: Lens.Lens' PortMapping PortProtocol
+portMapping_protocol = Lens.lens (\PortMapping' {protocol} -> protocol) (\s@PortMapping' {} a -> s {protocol = a} :: PortMapping)
+
+instance Data.FromJSON PortMapping where
+  parseJSON =
+    Data.withObject
+      "PortMapping"
+      ( \x ->
+          PortMapping'
+            Prelude.<$> (x Data..: "port")
+            Prelude.<*> (x Data..: "protocol")
+      )
+
+instance Prelude.Hashable PortMapping where
+  hashWithSalt _salt PortMapping' {..} =
+    _salt
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` protocol
+
+instance Prelude.NFData PortMapping where
+  rnf PortMapping' {..} =
+    Prelude.rnf port `Prelude.seq` Prelude.rnf protocol
+
+instance Data.ToJSON PortMapping where
+  toJSON PortMapping' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("port" Data..= port),
+            Prelude.Just ("protocol" Data..= protocol)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/PortProtocol.hs b/gen/Amazonka/AppMesh/Types/PortProtocol.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/PortProtocol.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.PortProtocol
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.PortProtocol
+  ( PortProtocol
+      ( ..,
+        PortProtocol_Grpc,
+        PortProtocol_Http,
+        PortProtocol_Http2,
+        PortProtocol_Tcp
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PortProtocol = PortProtocol'
+  { fromPortProtocol ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PortProtocol_Grpc :: PortProtocol
+pattern PortProtocol_Grpc = PortProtocol' "grpc"
+
+pattern PortProtocol_Http :: PortProtocol
+pattern PortProtocol_Http = PortProtocol' "http"
+
+pattern PortProtocol_Http2 :: PortProtocol
+pattern PortProtocol_Http2 = PortProtocol' "http2"
+
+pattern PortProtocol_Tcp :: PortProtocol
+pattern PortProtocol_Tcp = PortProtocol' "tcp"
+
+{-# COMPLETE
+  PortProtocol_Grpc,
+  PortProtocol_Http,
+  PortProtocol_Http2,
+  PortProtocol_Tcp,
+  PortProtocol'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/QueryParameterMatch.hs b/gen/Amazonka/AppMesh/Types/QueryParameterMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/QueryParameterMatch.hs
@@ -0,0 +1,75 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.QueryParameterMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.QueryParameterMatch where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the query parameter to match.
+--
+-- /See:/ 'newQueryParameterMatch' smart constructor.
+data QueryParameterMatch = QueryParameterMatch'
+  { -- | The exact query parameter to match on.
+    exact :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueryParameterMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'queryParameterMatch_exact' - The exact query parameter to match on.
+newQueryParameterMatch ::
+  QueryParameterMatch
+newQueryParameterMatch =
+  QueryParameterMatch' {exact = Prelude.Nothing}
+
+-- | The exact query parameter to match on.
+queryParameterMatch_exact :: Lens.Lens' QueryParameterMatch (Prelude.Maybe Prelude.Text)
+queryParameterMatch_exact = Lens.lens (\QueryParameterMatch' {exact} -> exact) (\s@QueryParameterMatch' {} a -> s {exact = a} :: QueryParameterMatch)
+
+instance Data.FromJSON QueryParameterMatch where
+  parseJSON =
+    Data.withObject
+      "QueryParameterMatch"
+      ( \x ->
+          QueryParameterMatch'
+            Prelude.<$> (x Data..:? "exact")
+      )
+
+instance Prelude.Hashable QueryParameterMatch where
+  hashWithSalt _salt QueryParameterMatch' {..} =
+    _salt `Prelude.hashWithSalt` exact
+
+instance Prelude.NFData QueryParameterMatch where
+  rnf QueryParameterMatch' {..} = Prelude.rnf exact
+
+instance Data.ToJSON QueryParameterMatch where
+  toJSON QueryParameterMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("exact" Data..=) Prelude.<$> exact]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/ResourceMetadata.hs b/gen/Amazonka/AppMesh/Types/ResourceMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ResourceMetadata.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ResourceMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ResourceMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents metadata for a resource.
+--
+-- /See:/ 'newResourceMetadata' smart constructor.
+data ResourceMetadata = ResourceMetadata'
+  { -- | The full Amazon Resource Name (ARN) for the resource.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The unique identifier for the resource.
+    uid :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResourceMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'resourceMetadata_arn' - The full Amazon Resource Name (ARN) for the resource.
+--
+-- 'createdAt', 'resourceMetadata_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'resourceMetadata_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshOwner', 'resourceMetadata_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'resourceMetadata_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'uid', 'resourceMetadata_uid' - The unique identifier for the resource.
+--
+-- 'version', 'resourceMetadata_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+newResourceMetadata ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'uid'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  ResourceMetadata
+newResourceMetadata
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshOwner_
+  pResourceOwner_
+  pUid_
+  pVersion_ =
+    ResourceMetadata'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        uid = pUid_,
+        version = pVersion_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the resource.
+resourceMetadata_arn :: Lens.Lens' ResourceMetadata Prelude.Text
+resourceMetadata_arn = Lens.lens (\ResourceMetadata' {arn} -> arn) (\s@ResourceMetadata' {} a -> s {arn = a} :: ResourceMetadata)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+resourceMetadata_createdAt :: Lens.Lens' ResourceMetadata Prelude.UTCTime
+resourceMetadata_createdAt = Lens.lens (\ResourceMetadata' {createdAt} -> createdAt) (\s@ResourceMetadata' {} a -> s {createdAt = a} :: ResourceMetadata) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+resourceMetadata_lastUpdatedAt :: Lens.Lens' ResourceMetadata Prelude.UTCTime
+resourceMetadata_lastUpdatedAt = Lens.lens (\ResourceMetadata' {lastUpdatedAt} -> lastUpdatedAt) (\s@ResourceMetadata' {} a -> s {lastUpdatedAt = a} :: ResourceMetadata) Prelude.. Data._Time
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+resourceMetadata_meshOwner :: Lens.Lens' ResourceMetadata Prelude.Text
+resourceMetadata_meshOwner = Lens.lens (\ResourceMetadata' {meshOwner} -> meshOwner) (\s@ResourceMetadata' {} a -> s {meshOwner = a} :: ResourceMetadata)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+resourceMetadata_resourceOwner :: Lens.Lens' ResourceMetadata Prelude.Text
+resourceMetadata_resourceOwner = Lens.lens (\ResourceMetadata' {resourceOwner} -> resourceOwner) (\s@ResourceMetadata' {} a -> s {resourceOwner = a} :: ResourceMetadata)
+
+-- | The unique identifier for the resource.
+resourceMetadata_uid :: Lens.Lens' ResourceMetadata Prelude.Text
+resourceMetadata_uid = Lens.lens (\ResourceMetadata' {uid} -> uid) (\s@ResourceMetadata' {} a -> s {uid = a} :: ResourceMetadata)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+resourceMetadata_version :: Lens.Lens' ResourceMetadata Prelude.Integer
+resourceMetadata_version = Lens.lens (\ResourceMetadata' {version} -> version) (\s@ResourceMetadata' {} a -> s {version = a} :: ResourceMetadata)
+
+instance Data.FromJSON ResourceMetadata where
+  parseJSON =
+    Data.withObject
+      "ResourceMetadata"
+      ( \x ->
+          ResourceMetadata'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "uid")
+            Prelude.<*> (x Data..: "version")
+      )
+
+instance Prelude.Hashable ResourceMetadata where
+  hashWithSalt _salt ResourceMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` uid
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData ResourceMetadata where
+  rnf ResourceMetadata' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf uid
+      `Prelude.seq` Prelude.rnf version
diff --git a/gen/Amazonka/AppMesh/Types/RouteData.hs b/gen/Amazonka/AppMesh/Types/RouteData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/RouteData.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.RouteData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.RouteData where
+
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.RouteSpec
+import Amazonka.AppMesh.Types.RouteStatus
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a route returned by a describe operation.
+--
+-- /See:/ 'newRouteData' smart constructor.
+data RouteData = RouteData'
+  { -- | The name of the service mesh that the route resides in.
+    meshName :: Prelude.Text,
+    -- | The associated metadata for the route.
+    metadata :: ResourceMetadata,
+    -- | The name of the route.
+    routeName :: Prelude.Text,
+    -- | The specifications of the route.
+    spec :: RouteSpec,
+    -- | The status of the route.
+    status :: RouteStatus,
+    -- | The virtual router that the route is associated with.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RouteData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'routeData_meshName' - The name of the service mesh that the route resides in.
+--
+-- 'metadata', 'routeData_metadata' - The associated metadata for the route.
+--
+-- 'routeName', 'routeData_routeName' - The name of the route.
+--
+-- 'spec', 'routeData_spec' - The specifications of the route.
+--
+-- 'status', 'routeData_status' - The status of the route.
+--
+-- 'virtualRouterName', 'routeData_virtualRouterName' - The virtual router that the route is associated with.
+newRouteData ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'routeName'
+  Prelude.Text ->
+  -- | 'spec'
+  RouteSpec ->
+  -- | 'status'
+  RouteStatus ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  RouteData
+newRouteData
+  pMeshName_
+  pMetadata_
+  pRouteName_
+  pSpec_
+  pStatus_
+  pVirtualRouterName_ =
+    RouteData'
+      { meshName = pMeshName_,
+        metadata = pMetadata_,
+        routeName = pRouteName_,
+        spec = pSpec_,
+        status = pStatus_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The name of the service mesh that the route resides in.
+routeData_meshName :: Lens.Lens' RouteData Prelude.Text
+routeData_meshName = Lens.lens (\RouteData' {meshName} -> meshName) (\s@RouteData' {} a -> s {meshName = a} :: RouteData)
+
+-- | The associated metadata for the route.
+routeData_metadata :: Lens.Lens' RouteData ResourceMetadata
+routeData_metadata = Lens.lens (\RouteData' {metadata} -> metadata) (\s@RouteData' {} a -> s {metadata = a} :: RouteData)
+
+-- | The name of the route.
+routeData_routeName :: Lens.Lens' RouteData Prelude.Text
+routeData_routeName = Lens.lens (\RouteData' {routeName} -> routeName) (\s@RouteData' {} a -> s {routeName = a} :: RouteData)
+
+-- | The specifications of the route.
+routeData_spec :: Lens.Lens' RouteData RouteSpec
+routeData_spec = Lens.lens (\RouteData' {spec} -> spec) (\s@RouteData' {} a -> s {spec = a} :: RouteData)
+
+-- | The status of the route.
+routeData_status :: Lens.Lens' RouteData RouteStatus
+routeData_status = Lens.lens (\RouteData' {status} -> status) (\s@RouteData' {} a -> s {status = a} :: RouteData)
+
+-- | The virtual router that the route is associated with.
+routeData_virtualRouterName :: Lens.Lens' RouteData Prelude.Text
+routeData_virtualRouterName = Lens.lens (\RouteData' {virtualRouterName} -> virtualRouterName) (\s@RouteData' {} a -> s {virtualRouterName = a} :: RouteData)
+
+instance Data.FromJSON RouteData where
+  parseJSON =
+    Data.withObject
+      "RouteData"
+      ( \x ->
+          RouteData'
+            Prelude.<$> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "routeName")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "virtualRouterName")
+      )
+
+instance Prelude.Hashable RouteData where
+  hashWithSalt _salt RouteData' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` routeName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData RouteData where
+  rnf RouteData' {..} =
+    Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf routeName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf virtualRouterName
diff --git a/gen/Amazonka/AppMesh/Types/RouteRef.hs b/gen/Amazonka/AppMesh/Types/RouteRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/RouteRef.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.RouteRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.RouteRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a route returned by a list operation.
+--
+-- /See:/ 'newRouteRef' smart constructor.
+data RouteRef = RouteRef'
+  { -- | The full Amazon Resource Name (ARN) for the route.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh that the route resides in.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The name of the route.
+    routeName :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer,
+    -- | The virtual router that the route is associated with.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RouteRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'routeRef_arn' - The full Amazon Resource Name (ARN) for the route.
+--
+-- 'createdAt', 'routeRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'routeRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'routeRef_meshName' - The name of the service mesh that the route resides in.
+--
+-- 'meshOwner', 'routeRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'routeRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'routeName', 'routeRef_routeName' - The name of the route.
+--
+-- 'version', 'routeRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+--
+-- 'virtualRouterName', 'routeRef_virtualRouterName' - The virtual router that the route is associated with.
+newRouteRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'routeName'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  RouteRef
+newRouteRef
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pRouteName_
+  pVersion_
+  pVirtualRouterName_ =
+    RouteRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        routeName = pRouteName_,
+        version = pVersion_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the route.
+routeRef_arn :: Lens.Lens' RouteRef Prelude.Text
+routeRef_arn = Lens.lens (\RouteRef' {arn} -> arn) (\s@RouteRef' {} a -> s {arn = a} :: RouteRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+routeRef_createdAt :: Lens.Lens' RouteRef Prelude.UTCTime
+routeRef_createdAt = Lens.lens (\RouteRef' {createdAt} -> createdAt) (\s@RouteRef' {} a -> s {createdAt = a} :: RouteRef) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+routeRef_lastUpdatedAt :: Lens.Lens' RouteRef Prelude.UTCTime
+routeRef_lastUpdatedAt = Lens.lens (\RouteRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@RouteRef' {} a -> s {lastUpdatedAt = a} :: RouteRef) Prelude.. Data._Time
+
+-- | The name of the service mesh that the route resides in.
+routeRef_meshName :: Lens.Lens' RouteRef Prelude.Text
+routeRef_meshName = Lens.lens (\RouteRef' {meshName} -> meshName) (\s@RouteRef' {} a -> s {meshName = a} :: RouteRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+routeRef_meshOwner :: Lens.Lens' RouteRef Prelude.Text
+routeRef_meshOwner = Lens.lens (\RouteRef' {meshOwner} -> meshOwner) (\s@RouteRef' {} a -> s {meshOwner = a} :: RouteRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+routeRef_resourceOwner :: Lens.Lens' RouteRef Prelude.Text
+routeRef_resourceOwner = Lens.lens (\RouteRef' {resourceOwner} -> resourceOwner) (\s@RouteRef' {} a -> s {resourceOwner = a} :: RouteRef)
+
+-- | The name of the route.
+routeRef_routeName :: Lens.Lens' RouteRef Prelude.Text
+routeRef_routeName = Lens.lens (\RouteRef' {routeName} -> routeName) (\s@RouteRef' {} a -> s {routeName = a} :: RouteRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+routeRef_version :: Lens.Lens' RouteRef Prelude.Integer
+routeRef_version = Lens.lens (\RouteRef' {version} -> version) (\s@RouteRef' {} a -> s {version = a} :: RouteRef)
+
+-- | The virtual router that the route is associated with.
+routeRef_virtualRouterName :: Lens.Lens' RouteRef Prelude.Text
+routeRef_virtualRouterName = Lens.lens (\RouteRef' {virtualRouterName} -> virtualRouterName) (\s@RouteRef' {} a -> s {virtualRouterName = a} :: RouteRef)
+
+instance Data.FromJSON RouteRef where
+  parseJSON =
+    Data.withObject
+      "RouteRef"
+      ( \x ->
+          RouteRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "routeName")
+            Prelude.<*> (x Data..: "version")
+            Prelude.<*> (x Data..: "virtualRouterName")
+      )
+
+instance Prelude.Hashable RouteRef where
+  hashWithSalt _salt RouteRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` routeName
+      `Prelude.hashWithSalt` version
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData RouteRef where
+  rnf RouteRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf routeName
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf virtualRouterName
diff --git a/gen/Amazonka/AppMesh/Types/RouteSpec.hs b/gen/Amazonka/AppMesh/Types/RouteSpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/RouteSpec.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.RouteSpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.RouteSpec where
+
+import Amazonka.AppMesh.Types.GrpcRoute
+import Amazonka.AppMesh.Types.HttpRoute
+import Amazonka.AppMesh.Types.TcpRoute
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a route specification. Specify one route type.
+--
+-- /See:/ 'newRouteSpec' smart constructor.
+data RouteSpec = RouteSpec'
+  { -- | An object that represents the specification of a gRPC route.
+    grpcRoute :: Prelude.Maybe GrpcRoute,
+    -- | An object that represents the specification of an HTTP\/2 route.
+    http2Route :: Prelude.Maybe HttpRoute,
+    -- | An object that represents the specification of an HTTP route.
+    httpRoute :: Prelude.Maybe HttpRoute,
+    -- | The priority for the route. Routes are matched based on the specified
+    -- value, where 0 is the highest priority.
+    priority :: Prelude.Maybe Prelude.Natural,
+    -- | An object that represents the specification of a TCP route.
+    tcpRoute :: Prelude.Maybe TcpRoute
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RouteSpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'grpcRoute', 'routeSpec_grpcRoute' - An object that represents the specification of a gRPC route.
+--
+-- 'http2Route', 'routeSpec_http2Route' - An object that represents the specification of an HTTP\/2 route.
+--
+-- 'httpRoute', 'routeSpec_httpRoute' - An object that represents the specification of an HTTP route.
+--
+-- 'priority', 'routeSpec_priority' - The priority for the route. Routes are matched based on the specified
+-- value, where 0 is the highest priority.
+--
+-- 'tcpRoute', 'routeSpec_tcpRoute' - An object that represents the specification of a TCP route.
+newRouteSpec ::
+  RouteSpec
+newRouteSpec =
+  RouteSpec'
+    { grpcRoute = Prelude.Nothing,
+      http2Route = Prelude.Nothing,
+      httpRoute = Prelude.Nothing,
+      priority = Prelude.Nothing,
+      tcpRoute = Prelude.Nothing
+    }
+
+-- | An object that represents the specification of a gRPC route.
+routeSpec_grpcRoute :: Lens.Lens' RouteSpec (Prelude.Maybe GrpcRoute)
+routeSpec_grpcRoute = Lens.lens (\RouteSpec' {grpcRoute} -> grpcRoute) (\s@RouteSpec' {} a -> s {grpcRoute = a} :: RouteSpec)
+
+-- | An object that represents the specification of an HTTP\/2 route.
+routeSpec_http2Route :: Lens.Lens' RouteSpec (Prelude.Maybe HttpRoute)
+routeSpec_http2Route = Lens.lens (\RouteSpec' {http2Route} -> http2Route) (\s@RouteSpec' {} a -> s {http2Route = a} :: RouteSpec)
+
+-- | An object that represents the specification of an HTTP route.
+routeSpec_httpRoute :: Lens.Lens' RouteSpec (Prelude.Maybe HttpRoute)
+routeSpec_httpRoute = Lens.lens (\RouteSpec' {httpRoute} -> httpRoute) (\s@RouteSpec' {} a -> s {httpRoute = a} :: RouteSpec)
+
+-- | The priority for the route. Routes are matched based on the specified
+-- value, where 0 is the highest priority.
+routeSpec_priority :: Lens.Lens' RouteSpec (Prelude.Maybe Prelude.Natural)
+routeSpec_priority = Lens.lens (\RouteSpec' {priority} -> priority) (\s@RouteSpec' {} a -> s {priority = a} :: RouteSpec)
+
+-- | An object that represents the specification of a TCP route.
+routeSpec_tcpRoute :: Lens.Lens' RouteSpec (Prelude.Maybe TcpRoute)
+routeSpec_tcpRoute = Lens.lens (\RouteSpec' {tcpRoute} -> tcpRoute) (\s@RouteSpec' {} a -> s {tcpRoute = a} :: RouteSpec)
+
+instance Data.FromJSON RouteSpec where
+  parseJSON =
+    Data.withObject
+      "RouteSpec"
+      ( \x ->
+          RouteSpec'
+            Prelude.<$> (x Data..:? "grpcRoute")
+            Prelude.<*> (x Data..:? "http2Route")
+            Prelude.<*> (x Data..:? "httpRoute")
+            Prelude.<*> (x Data..:? "priority")
+            Prelude.<*> (x Data..:? "tcpRoute")
+      )
+
+instance Prelude.Hashable RouteSpec where
+  hashWithSalt _salt RouteSpec' {..} =
+    _salt
+      `Prelude.hashWithSalt` grpcRoute
+      `Prelude.hashWithSalt` http2Route
+      `Prelude.hashWithSalt` httpRoute
+      `Prelude.hashWithSalt` priority
+      `Prelude.hashWithSalt` tcpRoute
+
+instance Prelude.NFData RouteSpec where
+  rnf RouteSpec' {..} =
+    Prelude.rnf grpcRoute
+      `Prelude.seq` Prelude.rnf http2Route
+      `Prelude.seq` Prelude.rnf httpRoute
+      `Prelude.seq` Prelude.rnf priority
+      `Prelude.seq` Prelude.rnf tcpRoute
+
+instance Data.ToJSON RouteSpec where
+  toJSON RouteSpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("grpcRoute" Data..=) Prelude.<$> grpcRoute,
+            ("http2Route" Data..=) Prelude.<$> http2Route,
+            ("httpRoute" Data..=) Prelude.<$> httpRoute,
+            ("priority" Data..=) Prelude.<$> priority,
+            ("tcpRoute" Data..=) Prelude.<$> tcpRoute
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/RouteStatus.hs b/gen/Amazonka/AppMesh/Types/RouteStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/RouteStatus.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.RouteStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.RouteStatus where
+
+import Amazonka.AppMesh.Types.RouteStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the current status of a route.
+--
+-- /See:/ 'newRouteStatus' smart constructor.
+data RouteStatus = RouteStatus'
+  { -- | The current status for the route.
+    status :: RouteStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RouteStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'routeStatus_status' - The current status for the route.
+newRouteStatus ::
+  -- | 'status'
+  RouteStatusCode ->
+  RouteStatus
+newRouteStatus pStatus_ =
+  RouteStatus' {status = pStatus_}
+
+-- | The current status for the route.
+routeStatus_status :: Lens.Lens' RouteStatus RouteStatusCode
+routeStatus_status = Lens.lens (\RouteStatus' {status} -> status) (\s@RouteStatus' {} a -> s {status = a} :: RouteStatus)
+
+instance Data.FromJSON RouteStatus where
+  parseJSON =
+    Data.withObject
+      "RouteStatus"
+      ( \x ->
+          RouteStatus' Prelude.<$> (x Data..: "status")
+      )
+
+instance Prelude.Hashable RouteStatus where
+  hashWithSalt _salt RouteStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData RouteStatus where
+  rnf RouteStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/RouteStatusCode.hs b/gen/Amazonka/AppMesh/Types/RouteStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/RouteStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.RouteStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.RouteStatusCode
+  ( RouteStatusCode
+      ( ..,
+        RouteStatusCode_ACTIVE,
+        RouteStatusCode_DELETED,
+        RouteStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RouteStatusCode = RouteStatusCode'
+  { fromRouteStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern RouteStatusCode_ACTIVE :: RouteStatusCode
+pattern RouteStatusCode_ACTIVE = RouteStatusCode' "ACTIVE"
+
+pattern RouteStatusCode_DELETED :: RouteStatusCode
+pattern RouteStatusCode_DELETED = RouteStatusCode' "DELETED"
+
+pattern RouteStatusCode_INACTIVE :: RouteStatusCode
+pattern RouteStatusCode_INACTIVE = RouteStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  RouteStatusCode_ACTIVE,
+  RouteStatusCode_DELETED,
+  RouteStatusCode_INACTIVE,
+  RouteStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/ServiceDiscovery.hs b/gen/Amazonka/AppMesh/Types/ServiceDiscovery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/ServiceDiscovery.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.ServiceDiscovery
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.ServiceDiscovery where
+
+import Amazonka.AppMesh.Types.AwsCloudMapServiceDiscovery
+import Amazonka.AppMesh.Types.DnsServiceDiscovery
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the service discovery information for a
+-- virtual node.
+--
+-- /See:/ 'newServiceDiscovery' smart constructor.
+data ServiceDiscovery = ServiceDiscovery'
+  { -- | Specifies any Cloud Map information for the virtual node.
+    awsCloudMap :: Prelude.Maybe AwsCloudMapServiceDiscovery,
+    -- | Specifies the DNS information for the virtual node.
+    dns :: Prelude.Maybe DnsServiceDiscovery
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServiceDiscovery' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'awsCloudMap', 'serviceDiscovery_awsCloudMap' - Specifies any Cloud Map information for the virtual node.
+--
+-- 'dns', 'serviceDiscovery_dns' - Specifies the DNS information for the virtual node.
+newServiceDiscovery ::
+  ServiceDiscovery
+newServiceDiscovery =
+  ServiceDiscovery'
+    { awsCloudMap = Prelude.Nothing,
+      dns = Prelude.Nothing
+    }
+
+-- | Specifies any Cloud Map information for the virtual node.
+serviceDiscovery_awsCloudMap :: Lens.Lens' ServiceDiscovery (Prelude.Maybe AwsCloudMapServiceDiscovery)
+serviceDiscovery_awsCloudMap = Lens.lens (\ServiceDiscovery' {awsCloudMap} -> awsCloudMap) (\s@ServiceDiscovery' {} a -> s {awsCloudMap = a} :: ServiceDiscovery)
+
+-- | Specifies the DNS information for the virtual node.
+serviceDiscovery_dns :: Lens.Lens' ServiceDiscovery (Prelude.Maybe DnsServiceDiscovery)
+serviceDiscovery_dns = Lens.lens (\ServiceDiscovery' {dns} -> dns) (\s@ServiceDiscovery' {} a -> s {dns = a} :: ServiceDiscovery)
+
+instance Data.FromJSON ServiceDiscovery where
+  parseJSON =
+    Data.withObject
+      "ServiceDiscovery"
+      ( \x ->
+          ServiceDiscovery'
+            Prelude.<$> (x Data..:? "awsCloudMap")
+            Prelude.<*> (x Data..:? "dns")
+      )
+
+instance Prelude.Hashable ServiceDiscovery where
+  hashWithSalt _salt ServiceDiscovery' {..} =
+    _salt
+      `Prelude.hashWithSalt` awsCloudMap
+      `Prelude.hashWithSalt` dns
+
+instance Prelude.NFData ServiceDiscovery where
+  rnf ServiceDiscovery' {..} =
+    Prelude.rnf awsCloudMap
+      `Prelude.seq` Prelude.rnf dns
+
+instance Data.ToJSON ServiceDiscovery where
+  toJSON ServiceDiscovery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("awsCloudMap" Data..=) Prelude.<$> awsCloudMap,
+            ("dns" Data..=) Prelude.<$> dns
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/SubjectAlternativeNameMatchers.hs b/gen/Amazonka/AppMesh/Types/SubjectAlternativeNameMatchers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/SubjectAlternativeNameMatchers.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.SubjectAlternativeNameMatchers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.SubjectAlternativeNameMatchers where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the methods by which a subject alternative
+-- name on a peer Transport Layer Security (TLS) certificate can be
+-- matched.
+--
+-- /See:/ 'newSubjectAlternativeNameMatchers' smart constructor.
+data SubjectAlternativeNameMatchers = SubjectAlternativeNameMatchers'
+  { -- | The values sent must match the specified values exactly.
+    exact :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SubjectAlternativeNameMatchers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exact', 'subjectAlternativeNameMatchers_exact' - The values sent must match the specified values exactly.
+newSubjectAlternativeNameMatchers ::
+  SubjectAlternativeNameMatchers
+newSubjectAlternativeNameMatchers =
+  SubjectAlternativeNameMatchers'
+    { exact =
+        Prelude.mempty
+    }
+
+-- | The values sent must match the specified values exactly.
+subjectAlternativeNameMatchers_exact :: Lens.Lens' SubjectAlternativeNameMatchers [Prelude.Text]
+subjectAlternativeNameMatchers_exact = Lens.lens (\SubjectAlternativeNameMatchers' {exact} -> exact) (\s@SubjectAlternativeNameMatchers' {} a -> s {exact = a} :: SubjectAlternativeNameMatchers) Prelude.. Lens.coerced
+
+instance Data.FromJSON SubjectAlternativeNameMatchers where
+  parseJSON =
+    Data.withObject
+      "SubjectAlternativeNameMatchers"
+      ( \x ->
+          SubjectAlternativeNameMatchers'
+            Prelude.<$> (x Data..:? "exact" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    SubjectAlternativeNameMatchers
+  where
+  hashWithSalt
+    _salt
+    SubjectAlternativeNameMatchers' {..} =
+      _salt `Prelude.hashWithSalt` exact
+
+instance
+  Prelude.NFData
+    SubjectAlternativeNameMatchers
+  where
+  rnf SubjectAlternativeNameMatchers' {..} =
+    Prelude.rnf exact
+
+instance Data.ToJSON SubjectAlternativeNameMatchers where
+  toJSON SubjectAlternativeNameMatchers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("exact" Data..= exact)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/SubjectAlternativeNames.hs b/gen/Amazonka/AppMesh/Types/SubjectAlternativeNames.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/SubjectAlternativeNames.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.SubjectAlternativeNames
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.SubjectAlternativeNames where
+
+import Amazonka.AppMesh.Types.SubjectAlternativeNameMatchers
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the subject alternative names secured by the
+-- certificate.
+--
+-- /See:/ 'newSubjectAlternativeNames' smart constructor.
+data SubjectAlternativeNames = SubjectAlternativeNames'
+  { -- | An object that represents the criteria for determining a SANs match.
+    match :: SubjectAlternativeNameMatchers
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SubjectAlternativeNames' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'match', 'subjectAlternativeNames_match' - An object that represents the criteria for determining a SANs match.
+newSubjectAlternativeNames ::
+  -- | 'match'
+  SubjectAlternativeNameMatchers ->
+  SubjectAlternativeNames
+newSubjectAlternativeNames pMatch_ =
+  SubjectAlternativeNames' {match = pMatch_}
+
+-- | An object that represents the criteria for determining a SANs match.
+subjectAlternativeNames_match :: Lens.Lens' SubjectAlternativeNames SubjectAlternativeNameMatchers
+subjectAlternativeNames_match = Lens.lens (\SubjectAlternativeNames' {match} -> match) (\s@SubjectAlternativeNames' {} a -> s {match = a} :: SubjectAlternativeNames)
+
+instance Data.FromJSON SubjectAlternativeNames where
+  parseJSON =
+    Data.withObject
+      "SubjectAlternativeNames"
+      ( \x ->
+          SubjectAlternativeNames'
+            Prelude.<$> (x Data..: "match")
+      )
+
+instance Prelude.Hashable SubjectAlternativeNames where
+  hashWithSalt _salt SubjectAlternativeNames' {..} =
+    _salt `Prelude.hashWithSalt` match
+
+instance Prelude.NFData SubjectAlternativeNames where
+  rnf SubjectAlternativeNames' {..} = Prelude.rnf match
+
+instance Data.ToJSON SubjectAlternativeNames where
+  toJSON SubjectAlternativeNames' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("match" Data..= match)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TagRef.hs b/gen/Amazonka/AppMesh/Types/TagRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TagRef.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TagRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TagRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Optional metadata that you apply to a resource to assist with
+-- categorization and organization. Each tag consists of a key and an
+-- optional value, both of which you define. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+--
+-- /See:/ 'newTagRef' smart constructor.
+data TagRef = TagRef'
+  { -- | One part of a key-value pair that make up a tag. A @key@ is a general
+    -- label that acts like a category for more specific tag values.
+    key :: Prelude.Text,
+    -- | The optional part of a key-value pair that make up a tag. A @value@ acts
+    -- as a descriptor within a tag category (key).
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tagRef_key' - One part of a key-value pair that make up a tag. A @key@ is a general
+-- label that acts like a category for more specific tag values.
+--
+-- 'value', 'tagRef_value' - The optional part of a key-value pair that make up a tag. A @value@ acts
+-- as a descriptor within a tag category (key).
+newTagRef ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  TagRef
+newTagRef pKey_ pValue_ =
+  TagRef' {key = pKey_, value = pValue_}
+
+-- | One part of a key-value pair that make up a tag. A @key@ is a general
+-- label that acts like a category for more specific tag values.
+tagRef_key :: Lens.Lens' TagRef Prelude.Text
+tagRef_key = Lens.lens (\TagRef' {key} -> key) (\s@TagRef' {} a -> s {key = a} :: TagRef)
+
+-- | The optional part of a key-value pair that make up a tag. A @value@ acts
+-- as a descriptor within a tag category (key).
+tagRef_value :: Lens.Lens' TagRef Prelude.Text
+tagRef_value = Lens.lens (\TagRef' {value} -> value) (\s@TagRef' {} a -> s {value = a} :: TagRef)
+
+instance Data.FromJSON TagRef where
+  parseJSON =
+    Data.withObject
+      "TagRef"
+      ( \x ->
+          TagRef'
+            Prelude.<$> (x Data..: "key")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable TagRef where
+  hashWithSalt _salt TagRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData TagRef where
+  rnf TagRef' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON TagRef where
+  toJSON TagRef' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("key" Data..= key),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TcpRetryPolicyEvent.hs b/gen/Amazonka/AppMesh/Types/TcpRetryPolicyEvent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TcpRetryPolicyEvent.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TcpRetryPolicyEvent
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TcpRetryPolicyEvent
+  ( TcpRetryPolicyEvent
+      ( ..,
+        TcpRetryPolicyEvent_Connection_error
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TcpRetryPolicyEvent = TcpRetryPolicyEvent'
+  { fromTcpRetryPolicyEvent ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TcpRetryPolicyEvent_Connection_error :: TcpRetryPolicyEvent
+pattern TcpRetryPolicyEvent_Connection_error = TcpRetryPolicyEvent' "connection-error"
+
+{-# COMPLETE
+  TcpRetryPolicyEvent_Connection_error,
+  TcpRetryPolicyEvent'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/TcpRoute.hs b/gen/Amazonka/AppMesh/Types/TcpRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TcpRoute.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TcpRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TcpRoute where
+
+import Amazonka.AppMesh.Types.TcpRouteAction
+import Amazonka.AppMesh.Types.TcpRouteMatch
+import Amazonka.AppMesh.Types.TcpTimeout
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a TCP route type.
+--
+-- /See:/ 'newTcpRoute' smart constructor.
+data TcpRoute = TcpRoute'
+  { -- | An object that represents the criteria for determining a request match.
+    match :: Prelude.Maybe TcpRouteMatch,
+    -- | An object that represents types of timeouts.
+    timeout :: Prelude.Maybe TcpTimeout,
+    -- | The action to take if a match is determined.
+    action :: TcpRouteAction
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TcpRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'match', 'tcpRoute_match' - An object that represents the criteria for determining a request match.
+--
+-- 'timeout', 'tcpRoute_timeout' - An object that represents types of timeouts.
+--
+-- 'action', 'tcpRoute_action' - The action to take if a match is determined.
+newTcpRoute ::
+  -- | 'action'
+  TcpRouteAction ->
+  TcpRoute
+newTcpRoute pAction_ =
+  TcpRoute'
+    { match = Prelude.Nothing,
+      timeout = Prelude.Nothing,
+      action = pAction_
+    }
+
+-- | An object that represents the criteria for determining a request match.
+tcpRoute_match :: Lens.Lens' TcpRoute (Prelude.Maybe TcpRouteMatch)
+tcpRoute_match = Lens.lens (\TcpRoute' {match} -> match) (\s@TcpRoute' {} a -> s {match = a} :: TcpRoute)
+
+-- | An object that represents types of timeouts.
+tcpRoute_timeout :: Lens.Lens' TcpRoute (Prelude.Maybe TcpTimeout)
+tcpRoute_timeout = Lens.lens (\TcpRoute' {timeout} -> timeout) (\s@TcpRoute' {} a -> s {timeout = a} :: TcpRoute)
+
+-- | The action to take if a match is determined.
+tcpRoute_action :: Lens.Lens' TcpRoute TcpRouteAction
+tcpRoute_action = Lens.lens (\TcpRoute' {action} -> action) (\s@TcpRoute' {} a -> s {action = a} :: TcpRoute)
+
+instance Data.FromJSON TcpRoute where
+  parseJSON =
+    Data.withObject
+      "TcpRoute"
+      ( \x ->
+          TcpRoute'
+            Prelude.<$> (x Data..:? "match")
+            Prelude.<*> (x Data..:? "timeout")
+            Prelude.<*> (x Data..: "action")
+      )
+
+instance Prelude.Hashable TcpRoute where
+  hashWithSalt _salt TcpRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` match
+      `Prelude.hashWithSalt` timeout
+      `Prelude.hashWithSalt` action
+
+instance Prelude.NFData TcpRoute where
+  rnf TcpRoute' {..} =
+    Prelude.rnf match
+      `Prelude.seq` Prelude.rnf timeout
+      `Prelude.seq` Prelude.rnf action
+
+instance Data.ToJSON TcpRoute where
+  toJSON TcpRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("match" Data..=) Prelude.<$> match,
+            ("timeout" Data..=) Prelude.<$> timeout,
+            Prelude.Just ("action" Data..= action)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TcpRouteAction.hs b/gen/Amazonka/AppMesh/Types/TcpRouteAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TcpRouteAction.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TcpRouteAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TcpRouteAction where
+
+import Amazonka.AppMesh.Types.WeightedTarget
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the action to take if a match is determined.
+--
+-- /See:/ 'newTcpRouteAction' smart constructor.
+data TcpRouteAction = TcpRouteAction'
+  { -- | An object that represents the targets that traffic is routed to when a
+    -- request matches the route.
+    weightedTargets :: Prelude.NonEmpty WeightedTarget
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TcpRouteAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'weightedTargets', 'tcpRouteAction_weightedTargets' - An object that represents the targets that traffic is routed to when a
+-- request matches the route.
+newTcpRouteAction ::
+  -- | 'weightedTargets'
+  Prelude.NonEmpty WeightedTarget ->
+  TcpRouteAction
+newTcpRouteAction pWeightedTargets_ =
+  TcpRouteAction'
+    { weightedTargets =
+        Lens.coerced Lens.# pWeightedTargets_
+    }
+
+-- | An object that represents the targets that traffic is routed to when a
+-- request matches the route.
+tcpRouteAction_weightedTargets :: Lens.Lens' TcpRouteAction (Prelude.NonEmpty WeightedTarget)
+tcpRouteAction_weightedTargets = Lens.lens (\TcpRouteAction' {weightedTargets} -> weightedTargets) (\s@TcpRouteAction' {} a -> s {weightedTargets = a} :: TcpRouteAction) Prelude.. Lens.coerced
+
+instance Data.FromJSON TcpRouteAction where
+  parseJSON =
+    Data.withObject
+      "TcpRouteAction"
+      ( \x ->
+          TcpRouteAction'
+            Prelude.<$> (x Data..: "weightedTargets")
+      )
+
+instance Prelude.Hashable TcpRouteAction where
+  hashWithSalt _salt TcpRouteAction' {..} =
+    _salt `Prelude.hashWithSalt` weightedTargets
+
+instance Prelude.NFData TcpRouteAction where
+  rnf TcpRouteAction' {..} = Prelude.rnf weightedTargets
+
+instance Data.ToJSON TcpRouteAction where
+  toJSON TcpRouteAction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("weightedTargets" Data..= weightedTargets)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TcpRouteMatch.hs b/gen/Amazonka/AppMesh/Types/TcpRouteMatch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TcpRouteMatch.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TcpRouteMatch
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TcpRouteMatch where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing the TCP route to match.
+--
+-- /See:/ 'newTcpRouteMatch' smart constructor.
+data TcpRouteMatch = TcpRouteMatch'
+  { -- | The port number to match on.
+    port :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TcpRouteMatch' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'port', 'tcpRouteMatch_port' - The port number to match on.
+newTcpRouteMatch ::
+  TcpRouteMatch
+newTcpRouteMatch =
+  TcpRouteMatch' {port = Prelude.Nothing}
+
+-- | The port number to match on.
+tcpRouteMatch_port :: Lens.Lens' TcpRouteMatch (Prelude.Maybe Prelude.Natural)
+tcpRouteMatch_port = Lens.lens (\TcpRouteMatch' {port} -> port) (\s@TcpRouteMatch' {} a -> s {port = a} :: TcpRouteMatch)
+
+instance Data.FromJSON TcpRouteMatch where
+  parseJSON =
+    Data.withObject
+      "TcpRouteMatch"
+      ( \x ->
+          TcpRouteMatch' Prelude.<$> (x Data..:? "port")
+      )
+
+instance Prelude.Hashable TcpRouteMatch where
+  hashWithSalt _salt TcpRouteMatch' {..} =
+    _salt `Prelude.hashWithSalt` port
+
+instance Prelude.NFData TcpRouteMatch where
+  rnf TcpRouteMatch' {..} = Prelude.rnf port
+
+instance Data.ToJSON TcpRouteMatch where
+  toJSON TcpRouteMatch' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("port" Data..=) Prelude.<$> port]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TcpTimeout.hs b/gen/Amazonka/AppMesh/Types/TcpTimeout.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TcpTimeout.hs
@@ -0,0 +1,75 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TcpTimeout
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TcpTimeout where
+
+import Amazonka.AppMesh.Types.Duration
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents types of timeouts.
+--
+-- /See:/ 'newTcpTimeout' smart constructor.
+data TcpTimeout = TcpTimeout'
+  { -- | An object that represents an idle timeout. An idle timeout bounds the
+    -- amount of time that a connection may be idle. The default value is none.
+    idle :: Prelude.Maybe Duration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TcpTimeout' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'idle', 'tcpTimeout_idle' - An object that represents an idle timeout. An idle timeout bounds the
+-- amount of time that a connection may be idle. The default value is none.
+newTcpTimeout ::
+  TcpTimeout
+newTcpTimeout = TcpTimeout' {idle = Prelude.Nothing}
+
+-- | An object that represents an idle timeout. An idle timeout bounds the
+-- amount of time that a connection may be idle. The default value is none.
+tcpTimeout_idle :: Lens.Lens' TcpTimeout (Prelude.Maybe Duration)
+tcpTimeout_idle = Lens.lens (\TcpTimeout' {idle} -> idle) (\s@TcpTimeout' {} a -> s {idle = a} :: TcpTimeout)
+
+instance Data.FromJSON TcpTimeout where
+  parseJSON =
+    Data.withObject
+      "TcpTimeout"
+      (\x -> TcpTimeout' Prelude.<$> (x Data..:? "idle"))
+
+instance Prelude.Hashable TcpTimeout where
+  hashWithSalt _salt TcpTimeout' {..} =
+    _salt `Prelude.hashWithSalt` idle
+
+instance Prelude.NFData TcpTimeout where
+  rnf TcpTimeout' {..} = Prelude.rnf idle
+
+instance Data.ToJSON TcpTimeout where
+  toJSON TcpTimeout' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("idle" Data..=) Prelude.<$> idle]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TlsValidationContext.hs b/gen/Amazonka/AppMesh/Types/TlsValidationContext.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TlsValidationContext.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TlsValidationContext
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TlsValidationContext where
+
+import Amazonka.AppMesh.Types.SubjectAlternativeNames
+import Amazonka.AppMesh.Types.TlsValidationContextTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents how the proxy will validate its peer during
+-- Transport Layer Security (TLS) negotiation.
+--
+-- /See:/ 'newTlsValidationContext' smart constructor.
+data TlsValidationContext = TlsValidationContext'
+  { -- | A reference to an object that represents the SANs for a Transport Layer
+    -- Security (TLS) validation context. If you don\'t specify SANs on the
+    -- /terminating/ mesh endpoint, the Envoy proxy for that node doesn\'t
+    -- verify the SAN on a peer client certificate. If you don\'t specify SANs
+    -- on the /originating/ mesh endpoint, the SAN on the certificate provided
+    -- by the terminating endpoint must match the mesh endpoint service
+    -- discovery configuration. Since SPIRE vended certificates have a SPIFFE
+    -- ID as a name, you must set the SAN since the name doesn\'t match the
+    -- service discovery name.
+    subjectAlternativeNames :: Prelude.Maybe SubjectAlternativeNames,
+    -- | A reference to where to retrieve the trust chain when validating a
+    -- peer’s Transport Layer Security (TLS) certificate.
+    trust :: TlsValidationContextTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TlsValidationContext' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subjectAlternativeNames', 'tlsValidationContext_subjectAlternativeNames' - A reference to an object that represents the SANs for a Transport Layer
+-- Security (TLS) validation context. If you don\'t specify SANs on the
+-- /terminating/ mesh endpoint, the Envoy proxy for that node doesn\'t
+-- verify the SAN on a peer client certificate. If you don\'t specify SANs
+-- on the /originating/ mesh endpoint, the SAN on the certificate provided
+-- by the terminating endpoint must match the mesh endpoint service
+-- discovery configuration. Since SPIRE vended certificates have a SPIFFE
+-- ID as a name, you must set the SAN since the name doesn\'t match the
+-- service discovery name.
+--
+-- 'trust', 'tlsValidationContext_trust' - A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+newTlsValidationContext ::
+  -- | 'trust'
+  TlsValidationContextTrust ->
+  TlsValidationContext
+newTlsValidationContext pTrust_ =
+  TlsValidationContext'
+    { subjectAlternativeNames =
+        Prelude.Nothing,
+      trust = pTrust_
+    }
+
+-- | A reference to an object that represents the SANs for a Transport Layer
+-- Security (TLS) validation context. If you don\'t specify SANs on the
+-- /terminating/ mesh endpoint, the Envoy proxy for that node doesn\'t
+-- verify the SAN on a peer client certificate. If you don\'t specify SANs
+-- on the /originating/ mesh endpoint, the SAN on the certificate provided
+-- by the terminating endpoint must match the mesh endpoint service
+-- discovery configuration. Since SPIRE vended certificates have a SPIFFE
+-- ID as a name, you must set the SAN since the name doesn\'t match the
+-- service discovery name.
+tlsValidationContext_subjectAlternativeNames :: Lens.Lens' TlsValidationContext (Prelude.Maybe SubjectAlternativeNames)
+tlsValidationContext_subjectAlternativeNames = Lens.lens (\TlsValidationContext' {subjectAlternativeNames} -> subjectAlternativeNames) (\s@TlsValidationContext' {} a -> s {subjectAlternativeNames = a} :: TlsValidationContext)
+
+-- | A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+tlsValidationContext_trust :: Lens.Lens' TlsValidationContext TlsValidationContextTrust
+tlsValidationContext_trust = Lens.lens (\TlsValidationContext' {trust} -> trust) (\s@TlsValidationContext' {} a -> s {trust = a} :: TlsValidationContext)
+
+instance Data.FromJSON TlsValidationContext where
+  parseJSON =
+    Data.withObject
+      "TlsValidationContext"
+      ( \x ->
+          TlsValidationContext'
+            Prelude.<$> (x Data..:? "subjectAlternativeNames")
+            Prelude.<*> (x Data..: "trust")
+      )
+
+instance Prelude.Hashable TlsValidationContext where
+  hashWithSalt _salt TlsValidationContext' {..} =
+    _salt
+      `Prelude.hashWithSalt` subjectAlternativeNames
+      `Prelude.hashWithSalt` trust
+
+instance Prelude.NFData TlsValidationContext where
+  rnf TlsValidationContext' {..} =
+    Prelude.rnf subjectAlternativeNames
+      `Prelude.seq` Prelude.rnf trust
+
+instance Data.ToJSON TlsValidationContext where
+  toJSON TlsValidationContext' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("subjectAlternativeNames" Data..=)
+              Prelude.<$> subjectAlternativeNames,
+            Prelude.Just ("trust" Data..= trust)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TlsValidationContextAcmTrust.hs b/gen/Amazonka/AppMesh/Types/TlsValidationContextAcmTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TlsValidationContextAcmTrust.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TlsValidationContextAcmTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TlsValidationContextAcmTrust where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for an Certificate Manager certificate.
+--
+-- /See:/ 'newTlsValidationContextAcmTrust' smart constructor.
+data TlsValidationContextAcmTrust = TlsValidationContextAcmTrust'
+  { -- | One or more ACM Amazon Resource Name (ARN)s.
+    certificateAuthorityArns :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TlsValidationContextAcmTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateAuthorityArns', 'tlsValidationContextAcmTrust_certificateAuthorityArns' - One or more ACM Amazon Resource Name (ARN)s.
+newTlsValidationContextAcmTrust ::
+  -- | 'certificateAuthorityArns'
+  Prelude.NonEmpty Prelude.Text ->
+  TlsValidationContextAcmTrust
+newTlsValidationContextAcmTrust
+  pCertificateAuthorityArns_ =
+    TlsValidationContextAcmTrust'
+      { certificateAuthorityArns =
+          Lens.coerced
+            Lens.# pCertificateAuthorityArns_
+      }
+
+-- | One or more ACM Amazon Resource Name (ARN)s.
+tlsValidationContextAcmTrust_certificateAuthorityArns :: Lens.Lens' TlsValidationContextAcmTrust (Prelude.NonEmpty Prelude.Text)
+tlsValidationContextAcmTrust_certificateAuthorityArns = Lens.lens (\TlsValidationContextAcmTrust' {certificateAuthorityArns} -> certificateAuthorityArns) (\s@TlsValidationContextAcmTrust' {} a -> s {certificateAuthorityArns = a} :: TlsValidationContextAcmTrust) Prelude.. Lens.coerced
+
+instance Data.FromJSON TlsValidationContextAcmTrust where
+  parseJSON =
+    Data.withObject
+      "TlsValidationContextAcmTrust"
+      ( \x ->
+          TlsValidationContextAcmTrust'
+            Prelude.<$> (x Data..: "certificateAuthorityArns")
+      )
+
+instance
+  Prelude.Hashable
+    TlsValidationContextAcmTrust
+  where
+  hashWithSalt _salt TlsValidationContextAcmTrust' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificateAuthorityArns
+
+instance Prelude.NFData TlsValidationContextAcmTrust where
+  rnf TlsValidationContextAcmTrust' {..} =
+    Prelude.rnf certificateAuthorityArns
+
+instance Data.ToJSON TlsValidationContextAcmTrust where
+  toJSON TlsValidationContextAcmTrust' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "certificateAuthorityArns"
+                  Data..= certificateAuthorityArns
+              )
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TlsValidationContextFileTrust.hs b/gen/Amazonka/AppMesh/Types/TlsValidationContextFileTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TlsValidationContextFileTrust.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TlsValidationContextFileTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TlsValidationContextFileTrust where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+--
+-- /See:/ 'newTlsValidationContextFileTrust' smart constructor.
+data TlsValidationContextFileTrust = TlsValidationContextFileTrust'
+  { -- | The certificate trust chain for a certificate stored on the file system
+    -- of the virtual node that the proxy is running on.
+    certificateChain :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TlsValidationContextFileTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateChain', 'tlsValidationContextFileTrust_certificateChain' - The certificate trust chain for a certificate stored on the file system
+-- of the virtual node that the proxy is running on.
+newTlsValidationContextFileTrust ::
+  -- | 'certificateChain'
+  Prelude.Text ->
+  TlsValidationContextFileTrust
+newTlsValidationContextFileTrust pCertificateChain_ =
+  TlsValidationContextFileTrust'
+    { certificateChain =
+        pCertificateChain_
+    }
+
+-- | The certificate trust chain for a certificate stored on the file system
+-- of the virtual node that the proxy is running on.
+tlsValidationContextFileTrust_certificateChain :: Lens.Lens' TlsValidationContextFileTrust Prelude.Text
+tlsValidationContextFileTrust_certificateChain = Lens.lens (\TlsValidationContextFileTrust' {certificateChain} -> certificateChain) (\s@TlsValidationContextFileTrust' {} a -> s {certificateChain = a} :: TlsValidationContextFileTrust)
+
+instance Data.FromJSON TlsValidationContextFileTrust where
+  parseJSON =
+    Data.withObject
+      "TlsValidationContextFileTrust"
+      ( \x ->
+          TlsValidationContextFileTrust'
+            Prelude.<$> (x Data..: "certificateChain")
+      )
+
+instance
+  Prelude.Hashable
+    TlsValidationContextFileTrust
+  where
+  hashWithSalt _salt TlsValidationContextFileTrust' {..} =
+    _salt `Prelude.hashWithSalt` certificateChain
+
+instance Prelude.NFData TlsValidationContextFileTrust where
+  rnf TlsValidationContextFileTrust' {..} =
+    Prelude.rnf certificateChain
+
+instance Data.ToJSON TlsValidationContextFileTrust where
+  toJSON TlsValidationContextFileTrust' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("certificateChain" Data..= certificateChain)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TlsValidationContextSdsTrust.hs b/gen/Amazonka/AppMesh/Types/TlsValidationContextSdsTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TlsValidationContextSdsTrust.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TlsValidationContextSdsTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TlsValidationContextSdsTrust where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) Secret
+-- Discovery Service validation context trust. The proxy must be configured
+-- with a local SDS provider via a Unix Domain Socket. See App Mesh
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html TLS documentation>
+-- for more info.
+--
+-- /See:/ 'newTlsValidationContextSdsTrust' smart constructor.
+data TlsValidationContextSdsTrust = TlsValidationContextSdsTrust'
+  { -- | A reference to an object that represents the name of the secret for a
+    -- Transport Layer Security (TLS) Secret Discovery Service validation
+    -- context trust.
+    secretName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TlsValidationContextSdsTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'secretName', 'tlsValidationContextSdsTrust_secretName' - A reference to an object that represents the name of the secret for a
+-- Transport Layer Security (TLS) Secret Discovery Service validation
+-- context trust.
+newTlsValidationContextSdsTrust ::
+  -- | 'secretName'
+  Prelude.Text ->
+  TlsValidationContextSdsTrust
+newTlsValidationContextSdsTrust pSecretName_ =
+  TlsValidationContextSdsTrust'
+    { secretName =
+        pSecretName_
+    }
+
+-- | A reference to an object that represents the name of the secret for a
+-- Transport Layer Security (TLS) Secret Discovery Service validation
+-- context trust.
+tlsValidationContextSdsTrust_secretName :: Lens.Lens' TlsValidationContextSdsTrust Prelude.Text
+tlsValidationContextSdsTrust_secretName = Lens.lens (\TlsValidationContextSdsTrust' {secretName} -> secretName) (\s@TlsValidationContextSdsTrust' {} a -> s {secretName = a} :: TlsValidationContextSdsTrust)
+
+instance Data.FromJSON TlsValidationContextSdsTrust where
+  parseJSON =
+    Data.withObject
+      "TlsValidationContextSdsTrust"
+      ( \x ->
+          TlsValidationContextSdsTrust'
+            Prelude.<$> (x Data..: "secretName")
+      )
+
+instance
+  Prelude.Hashable
+    TlsValidationContextSdsTrust
+  where
+  hashWithSalt _salt TlsValidationContextSdsTrust' {..} =
+    _salt `Prelude.hashWithSalt` secretName
+
+instance Prelude.NFData TlsValidationContextSdsTrust where
+  rnf TlsValidationContextSdsTrust' {..} =
+    Prelude.rnf secretName
+
+instance Data.ToJSON TlsValidationContextSdsTrust where
+  toJSON TlsValidationContextSdsTrust' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("secretName" Data..= secretName)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/TlsValidationContextTrust.hs b/gen/Amazonka/AppMesh/Types/TlsValidationContextTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/TlsValidationContextTrust.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.TlsValidationContextTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.TlsValidationContextTrust where
+
+import Amazonka.AppMesh.Types.TlsValidationContextAcmTrust
+import Amazonka.AppMesh.Types.TlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.TlsValidationContextSdsTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust.
+--
+-- /See:/ 'newTlsValidationContextTrust' smart constructor.
+data TlsValidationContextTrust = TlsValidationContextTrust'
+  { -- | A reference to an object that represents a Transport Layer Security
+    -- (TLS) validation context trust for an Certificate Manager certificate.
+    acm :: Prelude.Maybe TlsValidationContextAcmTrust,
+    -- | An object that represents a Transport Layer Security (TLS) validation
+    -- context trust for a local file.
+    file :: Prelude.Maybe TlsValidationContextFileTrust,
+    -- | A reference to an object that represents a Transport Layer Security
+    -- (TLS) Secret Discovery Service validation context trust.
+    sds :: Prelude.Maybe TlsValidationContextSdsTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TlsValidationContextTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acm', 'tlsValidationContextTrust_acm' - A reference to an object that represents a Transport Layer Security
+-- (TLS) validation context trust for an Certificate Manager certificate.
+--
+-- 'file', 'tlsValidationContextTrust_file' - An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+--
+-- 'sds', 'tlsValidationContextTrust_sds' - A reference to an object that represents a Transport Layer Security
+-- (TLS) Secret Discovery Service validation context trust.
+newTlsValidationContextTrust ::
+  TlsValidationContextTrust
+newTlsValidationContextTrust =
+  TlsValidationContextTrust'
+    { acm = Prelude.Nothing,
+      file = Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) validation context trust for an Certificate Manager certificate.
+tlsValidationContextTrust_acm :: Lens.Lens' TlsValidationContextTrust (Prelude.Maybe TlsValidationContextAcmTrust)
+tlsValidationContextTrust_acm = Lens.lens (\TlsValidationContextTrust' {acm} -> acm) (\s@TlsValidationContextTrust' {} a -> s {acm = a} :: TlsValidationContextTrust)
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+tlsValidationContextTrust_file :: Lens.Lens' TlsValidationContextTrust (Prelude.Maybe TlsValidationContextFileTrust)
+tlsValidationContextTrust_file = Lens.lens (\TlsValidationContextTrust' {file} -> file) (\s@TlsValidationContextTrust' {} a -> s {file = a} :: TlsValidationContextTrust)
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) Secret Discovery Service validation context trust.
+tlsValidationContextTrust_sds :: Lens.Lens' TlsValidationContextTrust (Prelude.Maybe TlsValidationContextSdsTrust)
+tlsValidationContextTrust_sds = Lens.lens (\TlsValidationContextTrust' {sds} -> sds) (\s@TlsValidationContextTrust' {} a -> s {sds = a} :: TlsValidationContextTrust)
+
+instance Data.FromJSON TlsValidationContextTrust where
+  parseJSON =
+    Data.withObject
+      "TlsValidationContextTrust"
+      ( \x ->
+          TlsValidationContextTrust'
+            Prelude.<$> (x Data..:? "acm")
+            Prelude.<*> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance Prelude.Hashable TlsValidationContextTrust where
+  hashWithSalt _salt TlsValidationContextTrust' {..} =
+    _salt
+      `Prelude.hashWithSalt` acm
+      `Prelude.hashWithSalt` file
+      `Prelude.hashWithSalt` sds
+
+instance Prelude.NFData TlsValidationContextTrust where
+  rnf TlsValidationContextTrust' {..} =
+    Prelude.rnf acm
+      `Prelude.seq` Prelude.rnf file
+      `Prelude.seq` Prelude.rnf sds
+
+instance Data.ToJSON TlsValidationContextTrust where
+  toJSON TlsValidationContextTrust' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("acm" Data..=) Prelude.<$> acm,
+            ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayAccessLog.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayAccessLog.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayAccessLog.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayAccessLog
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayAccessLog where
+
+import Amazonka.AppMesh.Types.VirtualGatewayFileAccessLog
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The access log configuration for a virtual gateway.
+--
+-- /See:/ 'newVirtualGatewayAccessLog' smart constructor.
+data VirtualGatewayAccessLog = VirtualGatewayAccessLog'
+  { -- | The file object to send virtual gateway access logs to.
+    file :: Prelude.Maybe VirtualGatewayFileAccessLog
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayAccessLog' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'virtualGatewayAccessLog_file' - The file object to send virtual gateway access logs to.
+newVirtualGatewayAccessLog ::
+  VirtualGatewayAccessLog
+newVirtualGatewayAccessLog =
+  VirtualGatewayAccessLog' {file = Prelude.Nothing}
+
+-- | The file object to send virtual gateway access logs to.
+virtualGatewayAccessLog_file :: Lens.Lens' VirtualGatewayAccessLog (Prelude.Maybe VirtualGatewayFileAccessLog)
+virtualGatewayAccessLog_file = Lens.lens (\VirtualGatewayAccessLog' {file} -> file) (\s@VirtualGatewayAccessLog' {} a -> s {file = a} :: VirtualGatewayAccessLog)
+
+instance Data.FromJSON VirtualGatewayAccessLog where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayAccessLog"
+      ( \x ->
+          VirtualGatewayAccessLog'
+            Prelude.<$> (x Data..:? "file")
+      )
+
+instance Prelude.Hashable VirtualGatewayAccessLog where
+  hashWithSalt _salt VirtualGatewayAccessLog' {..} =
+    _salt `Prelude.hashWithSalt` file
+
+instance Prelude.NFData VirtualGatewayAccessLog where
+  rnf VirtualGatewayAccessLog' {..} = Prelude.rnf file
+
+instance Data.ToJSON VirtualGatewayAccessLog where
+  toJSON VirtualGatewayAccessLog' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("file" Data..=) Prelude.<$> file]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayBackendDefaults.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayBackendDefaults.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayBackendDefaults.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayBackendDefaults
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayBackendDefaults where
+
+import Amazonka.AppMesh.Types.VirtualGatewayClientPolicy
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the default properties for a backend.
+--
+-- /See:/ 'newVirtualGatewayBackendDefaults' smart constructor.
+data VirtualGatewayBackendDefaults = VirtualGatewayBackendDefaults'
+  { -- | A reference to an object that represents a client policy.
+    clientPolicy :: Prelude.Maybe VirtualGatewayClientPolicy
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayBackendDefaults' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientPolicy', 'virtualGatewayBackendDefaults_clientPolicy' - A reference to an object that represents a client policy.
+newVirtualGatewayBackendDefaults ::
+  VirtualGatewayBackendDefaults
+newVirtualGatewayBackendDefaults =
+  VirtualGatewayBackendDefaults'
+    { clientPolicy =
+        Prelude.Nothing
+    }
+
+-- | A reference to an object that represents a client policy.
+virtualGatewayBackendDefaults_clientPolicy :: Lens.Lens' VirtualGatewayBackendDefaults (Prelude.Maybe VirtualGatewayClientPolicy)
+virtualGatewayBackendDefaults_clientPolicy = Lens.lens (\VirtualGatewayBackendDefaults' {clientPolicy} -> clientPolicy) (\s@VirtualGatewayBackendDefaults' {} a -> s {clientPolicy = a} :: VirtualGatewayBackendDefaults)
+
+instance Data.FromJSON VirtualGatewayBackendDefaults where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayBackendDefaults"
+      ( \x ->
+          VirtualGatewayBackendDefaults'
+            Prelude.<$> (x Data..:? "clientPolicy")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayBackendDefaults
+  where
+  hashWithSalt _salt VirtualGatewayBackendDefaults' {..} =
+    _salt `Prelude.hashWithSalt` clientPolicy
+
+instance Prelude.NFData VirtualGatewayBackendDefaults where
+  rnf VirtualGatewayBackendDefaults' {..} =
+    Prelude.rnf clientPolicy
+
+instance Data.ToJSON VirtualGatewayBackendDefaults where
+  toJSON VirtualGatewayBackendDefaults' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientPolicy" Data..=) Prelude.<$> clientPolicy]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayClientPolicy.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayClientPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayClientPolicy.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayClientPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayClientPolicy where
+
+import Amazonka.AppMesh.Types.VirtualGatewayClientPolicyTls
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a client policy.
+--
+-- /See:/ 'newVirtualGatewayClientPolicy' smart constructor.
+data VirtualGatewayClientPolicy = VirtualGatewayClientPolicy'
+  { -- | A reference to an object that represents a Transport Layer Security
+    -- (TLS) client policy.
+    tls :: Prelude.Maybe VirtualGatewayClientPolicyTls
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayClientPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tls', 'virtualGatewayClientPolicy_tls' - A reference to an object that represents a Transport Layer Security
+-- (TLS) client policy.
+newVirtualGatewayClientPolicy ::
+  VirtualGatewayClientPolicy
+newVirtualGatewayClientPolicy =
+  VirtualGatewayClientPolicy' {tls = Prelude.Nothing}
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) client policy.
+virtualGatewayClientPolicy_tls :: Lens.Lens' VirtualGatewayClientPolicy (Prelude.Maybe VirtualGatewayClientPolicyTls)
+virtualGatewayClientPolicy_tls = Lens.lens (\VirtualGatewayClientPolicy' {tls} -> tls) (\s@VirtualGatewayClientPolicy' {} a -> s {tls = a} :: VirtualGatewayClientPolicy)
+
+instance Data.FromJSON VirtualGatewayClientPolicy where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayClientPolicy"
+      ( \x ->
+          VirtualGatewayClientPolicy'
+            Prelude.<$> (x Data..:? "tls")
+      )
+
+instance Prelude.Hashable VirtualGatewayClientPolicy where
+  hashWithSalt _salt VirtualGatewayClientPolicy' {..} =
+    _salt `Prelude.hashWithSalt` tls
+
+instance Prelude.NFData VirtualGatewayClientPolicy where
+  rnf VirtualGatewayClientPolicy' {..} = Prelude.rnf tls
+
+instance Data.ToJSON VirtualGatewayClientPolicy where
+  toJSON VirtualGatewayClientPolicy' {..} =
+    Data.object
+      (Prelude.catMaybes [("tls" Data..=) Prelude.<$> tls])
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayClientPolicyTls.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayClientPolicyTls.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayClientPolicyTls.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayClientPolicyTls
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayClientPolicyTls where
+
+import Amazonka.AppMesh.Types.VirtualGatewayClientTlsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContext
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) client
+-- policy.
+--
+-- /See:/ 'newVirtualGatewayClientPolicyTls' smart constructor.
+data VirtualGatewayClientPolicyTls = VirtualGatewayClientPolicyTls'
+  { -- | A reference to an object that represents a virtual gateway\'s client\'s
+    -- Transport Layer Security (TLS) certificate.
+    certificate :: Prelude.Maybe VirtualGatewayClientTlsCertificate,
+    -- | Whether the policy is enforced. The default is @True@, if a value isn\'t
+    -- specified.
+    enforce :: Prelude.Maybe Prelude.Bool,
+    -- | One or more ports that the policy is enforced for.
+    ports :: Prelude.Maybe [Prelude.Natural],
+    -- | A reference to an object that represents a Transport Layer Security
+    -- (TLS) validation context.
+    validation :: VirtualGatewayTlsValidationContext
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayClientPolicyTls' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificate', 'virtualGatewayClientPolicyTls_certificate' - A reference to an object that represents a virtual gateway\'s client\'s
+-- Transport Layer Security (TLS) certificate.
+--
+-- 'enforce', 'virtualGatewayClientPolicyTls_enforce' - Whether the policy is enforced. The default is @True@, if a value isn\'t
+-- specified.
+--
+-- 'ports', 'virtualGatewayClientPolicyTls_ports' - One or more ports that the policy is enforced for.
+--
+-- 'validation', 'virtualGatewayClientPolicyTls_validation' - A reference to an object that represents a Transport Layer Security
+-- (TLS) validation context.
+newVirtualGatewayClientPolicyTls ::
+  -- | 'validation'
+  VirtualGatewayTlsValidationContext ->
+  VirtualGatewayClientPolicyTls
+newVirtualGatewayClientPolicyTls pValidation_ =
+  VirtualGatewayClientPolicyTls'
+    { certificate =
+        Prelude.Nothing,
+      enforce = Prelude.Nothing,
+      ports = Prelude.Nothing,
+      validation = pValidation_
+    }
+
+-- | A reference to an object that represents a virtual gateway\'s client\'s
+-- Transport Layer Security (TLS) certificate.
+virtualGatewayClientPolicyTls_certificate :: Lens.Lens' VirtualGatewayClientPolicyTls (Prelude.Maybe VirtualGatewayClientTlsCertificate)
+virtualGatewayClientPolicyTls_certificate = Lens.lens (\VirtualGatewayClientPolicyTls' {certificate} -> certificate) (\s@VirtualGatewayClientPolicyTls' {} a -> s {certificate = a} :: VirtualGatewayClientPolicyTls)
+
+-- | Whether the policy is enforced. The default is @True@, if a value isn\'t
+-- specified.
+virtualGatewayClientPolicyTls_enforce :: Lens.Lens' VirtualGatewayClientPolicyTls (Prelude.Maybe Prelude.Bool)
+virtualGatewayClientPolicyTls_enforce = Lens.lens (\VirtualGatewayClientPolicyTls' {enforce} -> enforce) (\s@VirtualGatewayClientPolicyTls' {} a -> s {enforce = a} :: VirtualGatewayClientPolicyTls)
+
+-- | One or more ports that the policy is enforced for.
+virtualGatewayClientPolicyTls_ports :: Lens.Lens' VirtualGatewayClientPolicyTls (Prelude.Maybe [Prelude.Natural])
+virtualGatewayClientPolicyTls_ports = Lens.lens (\VirtualGatewayClientPolicyTls' {ports} -> ports) (\s@VirtualGatewayClientPolicyTls' {} a -> s {ports = a} :: VirtualGatewayClientPolicyTls) Prelude.. Lens.mapping Lens.coerced
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) validation context.
+virtualGatewayClientPolicyTls_validation :: Lens.Lens' VirtualGatewayClientPolicyTls VirtualGatewayTlsValidationContext
+virtualGatewayClientPolicyTls_validation = Lens.lens (\VirtualGatewayClientPolicyTls' {validation} -> validation) (\s@VirtualGatewayClientPolicyTls' {} a -> s {validation = a} :: VirtualGatewayClientPolicyTls)
+
+instance Data.FromJSON VirtualGatewayClientPolicyTls where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayClientPolicyTls"
+      ( \x ->
+          VirtualGatewayClientPolicyTls'
+            Prelude.<$> (x Data..:? "certificate")
+            Prelude.<*> (x Data..:? "enforce")
+            Prelude.<*> (x Data..:? "ports" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "validation")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayClientPolicyTls
+  where
+  hashWithSalt _salt VirtualGatewayClientPolicyTls' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificate
+      `Prelude.hashWithSalt` enforce
+      `Prelude.hashWithSalt` ports
+      `Prelude.hashWithSalt` validation
+
+instance Prelude.NFData VirtualGatewayClientPolicyTls where
+  rnf VirtualGatewayClientPolicyTls' {..} =
+    Prelude.rnf certificate
+      `Prelude.seq` Prelude.rnf enforce
+      `Prelude.seq` Prelude.rnf ports
+      `Prelude.seq` Prelude.rnf validation
+
+instance Data.ToJSON VirtualGatewayClientPolicyTls where
+  toJSON VirtualGatewayClientPolicyTls' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("certificate" Data..=) Prelude.<$> certificate,
+            ("enforce" Data..=) Prelude.<$> enforce,
+            ("ports" Data..=) Prelude.<$> ports,
+            Prelude.Just ("validation" Data..= validation)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayClientTlsCertificate.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayClientTlsCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayClientTlsCertificate.hs
@@ -0,0 +1,125 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayClientTlsCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayClientTlsCertificate where
+
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the virtual gateway\'s client\'s Transport
+-- Layer Security (TLS) certificate.
+--
+-- /See:/ 'newVirtualGatewayClientTlsCertificate' smart constructor.
+data VirtualGatewayClientTlsCertificate = VirtualGatewayClientTlsCertificate'
+  { -- | An object that represents a local file certificate. The certificate must
+    -- meet specific requirements and you must have proxy authorization
+    -- enabled. For more information, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html Transport Layer Security (TLS)>
+    -- .
+    file :: Prelude.Maybe VirtualGatewayListenerTlsFileCertificate,
+    -- | A reference to an object that represents a virtual gateway\'s client\'s
+    -- Secret Discovery Service certificate.
+    sds :: Prelude.Maybe VirtualGatewayListenerTlsSdsCertificate
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayClientTlsCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'virtualGatewayClientTlsCertificate_file' - An object that represents a local file certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html Transport Layer Security (TLS)>
+-- .
+--
+-- 'sds', 'virtualGatewayClientTlsCertificate_sds' - A reference to an object that represents a virtual gateway\'s client\'s
+-- Secret Discovery Service certificate.
+newVirtualGatewayClientTlsCertificate ::
+  VirtualGatewayClientTlsCertificate
+newVirtualGatewayClientTlsCertificate =
+  VirtualGatewayClientTlsCertificate'
+    { file =
+        Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | An object that represents a local file certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html Transport Layer Security (TLS)>
+-- .
+virtualGatewayClientTlsCertificate_file :: Lens.Lens' VirtualGatewayClientTlsCertificate (Prelude.Maybe VirtualGatewayListenerTlsFileCertificate)
+virtualGatewayClientTlsCertificate_file = Lens.lens (\VirtualGatewayClientTlsCertificate' {file} -> file) (\s@VirtualGatewayClientTlsCertificate' {} a -> s {file = a} :: VirtualGatewayClientTlsCertificate)
+
+-- | A reference to an object that represents a virtual gateway\'s client\'s
+-- Secret Discovery Service certificate.
+virtualGatewayClientTlsCertificate_sds :: Lens.Lens' VirtualGatewayClientTlsCertificate (Prelude.Maybe VirtualGatewayListenerTlsSdsCertificate)
+virtualGatewayClientTlsCertificate_sds = Lens.lens (\VirtualGatewayClientTlsCertificate' {sds} -> sds) (\s@VirtualGatewayClientTlsCertificate' {} a -> s {sds = a} :: VirtualGatewayClientTlsCertificate)
+
+instance
+  Data.FromJSON
+    VirtualGatewayClientTlsCertificate
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayClientTlsCertificate"
+      ( \x ->
+          VirtualGatewayClientTlsCertificate'
+            Prelude.<$> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayClientTlsCertificate
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayClientTlsCertificate' {..} =
+      _salt
+        `Prelude.hashWithSalt` file
+        `Prelude.hashWithSalt` sds
+
+instance
+  Prelude.NFData
+    VirtualGatewayClientTlsCertificate
+  where
+  rnf VirtualGatewayClientTlsCertificate' {..} =
+    Prelude.rnf file `Prelude.seq` Prelude.rnf sds
+
+instance
+  Data.ToJSON
+    VirtualGatewayClientTlsCertificate
+  where
+  toJSON VirtualGatewayClientTlsCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayConnectionPool.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayConnectionPool where
+
+import Amazonka.AppMesh.Types.VirtualGatewayGrpcConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHttp2ConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHttpConnectionPool
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the type of virtual gateway connection pool.
+--
+-- Only one protocol is used at a time and should be the same protocol as
+-- the one chosen under port mapping.
+--
+-- If not present the default value for @maxPendingRequests@ is
+-- @2147483647@.
+--
+-- /See:/ 'newVirtualGatewayConnectionPool' smart constructor.
+data VirtualGatewayConnectionPool = VirtualGatewayConnectionPool'
+  { -- | An object that represents a type of connection pool.
+    grpc :: Prelude.Maybe VirtualGatewayGrpcConnectionPool,
+    -- | An object that represents a type of connection pool.
+    http :: Prelude.Maybe VirtualGatewayHttpConnectionPool,
+    -- | An object that represents a type of connection pool.
+    http2 :: Prelude.Maybe VirtualGatewayHttp2ConnectionPool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'grpc', 'virtualGatewayConnectionPool_grpc' - An object that represents a type of connection pool.
+--
+-- 'http', 'virtualGatewayConnectionPool_http' - An object that represents a type of connection pool.
+--
+-- 'http2', 'virtualGatewayConnectionPool_http2' - An object that represents a type of connection pool.
+newVirtualGatewayConnectionPool ::
+  VirtualGatewayConnectionPool
+newVirtualGatewayConnectionPool =
+  VirtualGatewayConnectionPool'
+    { grpc =
+        Prelude.Nothing,
+      http = Prelude.Nothing,
+      http2 = Prelude.Nothing
+    }
+
+-- | An object that represents a type of connection pool.
+virtualGatewayConnectionPool_grpc :: Lens.Lens' VirtualGatewayConnectionPool (Prelude.Maybe VirtualGatewayGrpcConnectionPool)
+virtualGatewayConnectionPool_grpc = Lens.lens (\VirtualGatewayConnectionPool' {grpc} -> grpc) (\s@VirtualGatewayConnectionPool' {} a -> s {grpc = a} :: VirtualGatewayConnectionPool)
+
+-- | An object that represents a type of connection pool.
+virtualGatewayConnectionPool_http :: Lens.Lens' VirtualGatewayConnectionPool (Prelude.Maybe VirtualGatewayHttpConnectionPool)
+virtualGatewayConnectionPool_http = Lens.lens (\VirtualGatewayConnectionPool' {http} -> http) (\s@VirtualGatewayConnectionPool' {} a -> s {http = a} :: VirtualGatewayConnectionPool)
+
+-- | An object that represents a type of connection pool.
+virtualGatewayConnectionPool_http2 :: Lens.Lens' VirtualGatewayConnectionPool (Prelude.Maybe VirtualGatewayHttp2ConnectionPool)
+virtualGatewayConnectionPool_http2 = Lens.lens (\VirtualGatewayConnectionPool' {http2} -> http2) (\s@VirtualGatewayConnectionPool' {} a -> s {http2 = a} :: VirtualGatewayConnectionPool)
+
+instance Data.FromJSON VirtualGatewayConnectionPool where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayConnectionPool"
+      ( \x ->
+          VirtualGatewayConnectionPool'
+            Prelude.<$> (x Data..:? "grpc")
+            Prelude.<*> (x Data..:? "http")
+            Prelude.<*> (x Data..:? "http2")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayConnectionPool
+  where
+  hashWithSalt _salt VirtualGatewayConnectionPool' {..} =
+    _salt
+      `Prelude.hashWithSalt` grpc
+      `Prelude.hashWithSalt` http
+      `Prelude.hashWithSalt` http2
+
+instance Prelude.NFData VirtualGatewayConnectionPool where
+  rnf VirtualGatewayConnectionPool' {..} =
+    Prelude.rnf grpc
+      `Prelude.seq` Prelude.rnf http
+      `Prelude.seq` Prelude.rnf http2
+
+instance Data.ToJSON VirtualGatewayConnectionPool where
+  toJSON VirtualGatewayConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("grpc" Data..=) Prelude.<$> grpc,
+            ("http" Data..=) Prelude.<$> http,
+            ("http2" Data..=) Prelude.<$> http2
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayData.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayData.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayData where
+
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.VirtualGatewaySpec
+import Amazonka.AppMesh.Types.VirtualGatewayStatus
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual gateway returned by a describe
+-- operation.
+--
+-- /See:/ 'newVirtualGatewayData' smart constructor.
+data VirtualGatewayData = VirtualGatewayData'
+  { -- | The name of the service mesh that the virtual gateway resides in.
+    meshName :: Prelude.Text,
+    metadata :: ResourceMetadata,
+    -- | The specifications of the virtual gateway.
+    spec :: VirtualGatewaySpec,
+    -- | The current status of the virtual gateway.
+    status :: VirtualGatewayStatus,
+    -- | The name of the virtual gateway.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'virtualGatewayData_meshName' - The name of the service mesh that the virtual gateway resides in.
+--
+-- 'metadata', 'virtualGatewayData_metadata' - Undocumented member.
+--
+-- 'spec', 'virtualGatewayData_spec' - The specifications of the virtual gateway.
+--
+-- 'status', 'virtualGatewayData_status' - The current status of the virtual gateway.
+--
+-- 'virtualGatewayName', 'virtualGatewayData_virtualGatewayName' - The name of the virtual gateway.
+newVirtualGatewayData ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'spec'
+  VirtualGatewaySpec ->
+  -- | 'status'
+  VirtualGatewayStatus ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  VirtualGatewayData
+newVirtualGatewayData
+  pMeshName_
+  pMetadata_
+  pSpec_
+  pStatus_
+  pVirtualGatewayName_ =
+    VirtualGatewayData'
+      { meshName = pMeshName_,
+        metadata = pMetadata_,
+        spec = pSpec_,
+        status = pStatus_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The name of the service mesh that the virtual gateway resides in.
+virtualGatewayData_meshName :: Lens.Lens' VirtualGatewayData Prelude.Text
+virtualGatewayData_meshName = Lens.lens (\VirtualGatewayData' {meshName} -> meshName) (\s@VirtualGatewayData' {} a -> s {meshName = a} :: VirtualGatewayData)
+
+-- | Undocumented member.
+virtualGatewayData_metadata :: Lens.Lens' VirtualGatewayData ResourceMetadata
+virtualGatewayData_metadata = Lens.lens (\VirtualGatewayData' {metadata} -> metadata) (\s@VirtualGatewayData' {} a -> s {metadata = a} :: VirtualGatewayData)
+
+-- | The specifications of the virtual gateway.
+virtualGatewayData_spec :: Lens.Lens' VirtualGatewayData VirtualGatewaySpec
+virtualGatewayData_spec = Lens.lens (\VirtualGatewayData' {spec} -> spec) (\s@VirtualGatewayData' {} a -> s {spec = a} :: VirtualGatewayData)
+
+-- | The current status of the virtual gateway.
+virtualGatewayData_status :: Lens.Lens' VirtualGatewayData VirtualGatewayStatus
+virtualGatewayData_status = Lens.lens (\VirtualGatewayData' {status} -> status) (\s@VirtualGatewayData' {} a -> s {status = a} :: VirtualGatewayData)
+
+-- | The name of the virtual gateway.
+virtualGatewayData_virtualGatewayName :: Lens.Lens' VirtualGatewayData Prelude.Text
+virtualGatewayData_virtualGatewayName = Lens.lens (\VirtualGatewayData' {virtualGatewayName} -> virtualGatewayName) (\s@VirtualGatewayData' {} a -> s {virtualGatewayName = a} :: VirtualGatewayData)
+
+instance Data.FromJSON VirtualGatewayData where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayData"
+      ( \x ->
+          VirtualGatewayData'
+            Prelude.<$> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "virtualGatewayName")
+      )
+
+instance Prelude.Hashable VirtualGatewayData where
+  hashWithSalt _salt VirtualGatewayData' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData VirtualGatewayData where
+  rnf VirtualGatewayData' {..} =
+    Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf virtualGatewayName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayFileAccessLog.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayFileAccessLog.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayFileAccessLog.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayFileAccessLog
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayFileAccessLog where
+
+import Amazonka.AppMesh.Types.LoggingFormat
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents an access log file.
+--
+-- /See:/ 'newVirtualGatewayFileAccessLog' smart constructor.
+data VirtualGatewayFileAccessLog = VirtualGatewayFileAccessLog'
+  { -- | The specified format for the virtual gateway access logs. It can be
+    -- either @json_format@ or @text_format@.
+    format :: Prelude.Maybe LoggingFormat,
+    -- | The file path to write access logs to. You can use @\/dev\/stdout@ to
+    -- send access logs to standard out and configure your Envoy container to
+    -- use a log driver, such as @awslogs@, to export the access logs to a log
+    -- storage service such as Amazon CloudWatch Logs. You can also specify a
+    -- path in the Envoy container\'s file system to write the files to disk.
+    path :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayFileAccessLog' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'format', 'virtualGatewayFileAccessLog_format' - The specified format for the virtual gateway access logs. It can be
+-- either @json_format@ or @text_format@.
+--
+-- 'path', 'virtualGatewayFileAccessLog_path' - The file path to write access logs to. You can use @\/dev\/stdout@ to
+-- send access logs to standard out and configure your Envoy container to
+-- use a log driver, such as @awslogs@, to export the access logs to a log
+-- storage service such as Amazon CloudWatch Logs. You can also specify a
+-- path in the Envoy container\'s file system to write the files to disk.
+newVirtualGatewayFileAccessLog ::
+  -- | 'path'
+  Prelude.Text ->
+  VirtualGatewayFileAccessLog
+newVirtualGatewayFileAccessLog pPath_ =
+  VirtualGatewayFileAccessLog'
+    { format =
+        Prelude.Nothing,
+      path = pPath_
+    }
+
+-- | The specified format for the virtual gateway access logs. It can be
+-- either @json_format@ or @text_format@.
+virtualGatewayFileAccessLog_format :: Lens.Lens' VirtualGatewayFileAccessLog (Prelude.Maybe LoggingFormat)
+virtualGatewayFileAccessLog_format = Lens.lens (\VirtualGatewayFileAccessLog' {format} -> format) (\s@VirtualGatewayFileAccessLog' {} a -> s {format = a} :: VirtualGatewayFileAccessLog)
+
+-- | The file path to write access logs to. You can use @\/dev\/stdout@ to
+-- send access logs to standard out and configure your Envoy container to
+-- use a log driver, such as @awslogs@, to export the access logs to a log
+-- storage service such as Amazon CloudWatch Logs. You can also specify a
+-- path in the Envoy container\'s file system to write the files to disk.
+virtualGatewayFileAccessLog_path :: Lens.Lens' VirtualGatewayFileAccessLog Prelude.Text
+virtualGatewayFileAccessLog_path = Lens.lens (\VirtualGatewayFileAccessLog' {path} -> path) (\s@VirtualGatewayFileAccessLog' {} a -> s {path = a} :: VirtualGatewayFileAccessLog)
+
+instance Data.FromJSON VirtualGatewayFileAccessLog where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayFileAccessLog"
+      ( \x ->
+          VirtualGatewayFileAccessLog'
+            Prelude.<$> (x Data..:? "format")
+            Prelude.<*> (x Data..: "path")
+      )
+
+instance Prelude.Hashable VirtualGatewayFileAccessLog where
+  hashWithSalt _salt VirtualGatewayFileAccessLog' {..} =
+    _salt
+      `Prelude.hashWithSalt` format
+      `Prelude.hashWithSalt` path
+
+instance Prelude.NFData VirtualGatewayFileAccessLog where
+  rnf VirtualGatewayFileAccessLog' {..} =
+    Prelude.rnf format `Prelude.seq` Prelude.rnf path
+
+instance Data.ToJSON VirtualGatewayFileAccessLog where
+  toJSON VirtualGatewayFileAccessLog' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("format" Data..=) Prelude.<$> format,
+            Prelude.Just ("path" Data..= path)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayGrpcConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayGrpcConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayGrpcConnectionPool.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayGrpcConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayGrpcConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualGatewayGrpcConnectionPool' smart constructor.
+data VirtualGatewayGrpcConnectionPool = VirtualGatewayGrpcConnectionPool'
+  { -- | Maximum number of inflight requests Envoy can concurrently support
+    -- across hosts in upstream cluster.
+    maxRequests :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayGrpcConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxRequests', 'virtualGatewayGrpcConnectionPool_maxRequests' - Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+newVirtualGatewayGrpcConnectionPool ::
+  -- | 'maxRequests'
+  Prelude.Natural ->
+  VirtualGatewayGrpcConnectionPool
+newVirtualGatewayGrpcConnectionPool pMaxRequests_ =
+  VirtualGatewayGrpcConnectionPool'
+    { maxRequests =
+        pMaxRequests_
+    }
+
+-- | Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+virtualGatewayGrpcConnectionPool_maxRequests :: Lens.Lens' VirtualGatewayGrpcConnectionPool Prelude.Natural
+virtualGatewayGrpcConnectionPool_maxRequests = Lens.lens (\VirtualGatewayGrpcConnectionPool' {maxRequests} -> maxRequests) (\s@VirtualGatewayGrpcConnectionPool' {} a -> s {maxRequests = a} :: VirtualGatewayGrpcConnectionPool)
+
+instance
+  Data.FromJSON
+    VirtualGatewayGrpcConnectionPool
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayGrpcConnectionPool"
+      ( \x ->
+          VirtualGatewayGrpcConnectionPool'
+            Prelude.<$> (x Data..: "maxRequests")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayGrpcConnectionPool
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayGrpcConnectionPool' {..} =
+      _salt `Prelude.hashWithSalt` maxRequests
+
+instance
+  Prelude.NFData
+    VirtualGatewayGrpcConnectionPool
+  where
+  rnf VirtualGatewayGrpcConnectionPool' {..} =
+    Prelude.rnf maxRequests
+
+instance Data.ToJSON VirtualGatewayGrpcConnectionPool where
+  toJSON VirtualGatewayGrpcConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("maxRequests" Data..= maxRequests)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayHealthCheckPolicy.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayHealthCheckPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayHealthCheckPolicy.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayHealthCheckPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayHealthCheckPolicy where
+
+import Amazonka.AppMesh.Types.VirtualGatewayPortProtocol
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the health check policy for a virtual
+-- gateway\'s listener.
+--
+-- /See:/ 'newVirtualGatewayHealthCheckPolicy' smart constructor.
+data VirtualGatewayHealthCheckPolicy = VirtualGatewayHealthCheckPolicy'
+  { -- | The destination path for the health check request. This value is only
+    -- used if the specified protocol is HTTP or HTTP\/2. For any other
+    -- protocol, this value is ignored.
+    path :: Prelude.Maybe Prelude.Text,
+    -- | The destination port for the health check request. This port must match
+    -- the port defined in the PortMapping for the listener.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | The number of consecutive successful health checks that must occur
+    -- before declaring the listener healthy.
+    healthyThreshold :: Prelude.Natural,
+    -- | The time period in milliseconds between each health check execution.
+    intervalMillis :: Prelude.Natural,
+    -- | The protocol for the health check request. If you specify @grpc@, then
+    -- your service must conform to the
+    -- <https://github.com/grpc/grpc/blob/master/doc/health-checking.md GRPC Health Checking Protocol>.
+    protocol :: VirtualGatewayPortProtocol,
+    -- | The amount of time to wait when receiving a response from the health
+    -- check, in milliseconds.
+    timeoutMillis :: Prelude.Natural,
+    -- | The number of consecutive failed health checks that must occur before
+    -- declaring a virtual gateway unhealthy.
+    unhealthyThreshold :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayHealthCheckPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'path', 'virtualGatewayHealthCheckPolicy_path' - The destination path for the health check request. This value is only
+-- used if the specified protocol is HTTP or HTTP\/2. For any other
+-- protocol, this value is ignored.
+--
+-- 'port', 'virtualGatewayHealthCheckPolicy_port' - The destination port for the health check request. This port must match
+-- the port defined in the PortMapping for the listener.
+--
+-- 'healthyThreshold', 'virtualGatewayHealthCheckPolicy_healthyThreshold' - The number of consecutive successful health checks that must occur
+-- before declaring the listener healthy.
+--
+-- 'intervalMillis', 'virtualGatewayHealthCheckPolicy_intervalMillis' - The time period in milliseconds between each health check execution.
+--
+-- 'protocol', 'virtualGatewayHealthCheckPolicy_protocol' - The protocol for the health check request. If you specify @grpc@, then
+-- your service must conform to the
+-- <https://github.com/grpc/grpc/blob/master/doc/health-checking.md GRPC Health Checking Protocol>.
+--
+-- 'timeoutMillis', 'virtualGatewayHealthCheckPolicy_timeoutMillis' - The amount of time to wait when receiving a response from the health
+-- check, in milliseconds.
+--
+-- 'unhealthyThreshold', 'virtualGatewayHealthCheckPolicy_unhealthyThreshold' - The number of consecutive failed health checks that must occur before
+-- declaring a virtual gateway unhealthy.
+newVirtualGatewayHealthCheckPolicy ::
+  -- | 'healthyThreshold'
+  Prelude.Natural ->
+  -- | 'intervalMillis'
+  Prelude.Natural ->
+  -- | 'protocol'
+  VirtualGatewayPortProtocol ->
+  -- | 'timeoutMillis'
+  Prelude.Natural ->
+  -- | 'unhealthyThreshold'
+  Prelude.Natural ->
+  VirtualGatewayHealthCheckPolicy
+newVirtualGatewayHealthCheckPolicy
+  pHealthyThreshold_
+  pIntervalMillis_
+  pProtocol_
+  pTimeoutMillis_
+  pUnhealthyThreshold_ =
+    VirtualGatewayHealthCheckPolicy'
+      { path =
+          Prelude.Nothing,
+        port = Prelude.Nothing,
+        healthyThreshold = pHealthyThreshold_,
+        intervalMillis = pIntervalMillis_,
+        protocol = pProtocol_,
+        timeoutMillis = pTimeoutMillis_,
+        unhealthyThreshold = pUnhealthyThreshold_
+      }
+
+-- | The destination path for the health check request. This value is only
+-- used if the specified protocol is HTTP or HTTP\/2. For any other
+-- protocol, this value is ignored.
+virtualGatewayHealthCheckPolicy_path :: Lens.Lens' VirtualGatewayHealthCheckPolicy (Prelude.Maybe Prelude.Text)
+virtualGatewayHealthCheckPolicy_path = Lens.lens (\VirtualGatewayHealthCheckPolicy' {path} -> path) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {path = a} :: VirtualGatewayHealthCheckPolicy)
+
+-- | The destination port for the health check request. This port must match
+-- the port defined in the PortMapping for the listener.
+virtualGatewayHealthCheckPolicy_port :: Lens.Lens' VirtualGatewayHealthCheckPolicy (Prelude.Maybe Prelude.Natural)
+virtualGatewayHealthCheckPolicy_port = Lens.lens (\VirtualGatewayHealthCheckPolicy' {port} -> port) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {port = a} :: VirtualGatewayHealthCheckPolicy)
+
+-- | The number of consecutive successful health checks that must occur
+-- before declaring the listener healthy.
+virtualGatewayHealthCheckPolicy_healthyThreshold :: Lens.Lens' VirtualGatewayHealthCheckPolicy Prelude.Natural
+virtualGatewayHealthCheckPolicy_healthyThreshold = Lens.lens (\VirtualGatewayHealthCheckPolicy' {healthyThreshold} -> healthyThreshold) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {healthyThreshold = a} :: VirtualGatewayHealthCheckPolicy)
+
+-- | The time period in milliseconds between each health check execution.
+virtualGatewayHealthCheckPolicy_intervalMillis :: Lens.Lens' VirtualGatewayHealthCheckPolicy Prelude.Natural
+virtualGatewayHealthCheckPolicy_intervalMillis = Lens.lens (\VirtualGatewayHealthCheckPolicy' {intervalMillis} -> intervalMillis) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {intervalMillis = a} :: VirtualGatewayHealthCheckPolicy)
+
+-- | The protocol for the health check request. If you specify @grpc@, then
+-- your service must conform to the
+-- <https://github.com/grpc/grpc/blob/master/doc/health-checking.md GRPC Health Checking Protocol>.
+virtualGatewayHealthCheckPolicy_protocol :: Lens.Lens' VirtualGatewayHealthCheckPolicy VirtualGatewayPortProtocol
+virtualGatewayHealthCheckPolicy_protocol = Lens.lens (\VirtualGatewayHealthCheckPolicy' {protocol} -> protocol) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {protocol = a} :: VirtualGatewayHealthCheckPolicy)
+
+-- | The amount of time to wait when receiving a response from the health
+-- check, in milliseconds.
+virtualGatewayHealthCheckPolicy_timeoutMillis :: Lens.Lens' VirtualGatewayHealthCheckPolicy Prelude.Natural
+virtualGatewayHealthCheckPolicy_timeoutMillis = Lens.lens (\VirtualGatewayHealthCheckPolicy' {timeoutMillis} -> timeoutMillis) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {timeoutMillis = a} :: VirtualGatewayHealthCheckPolicy)
+
+-- | The number of consecutive failed health checks that must occur before
+-- declaring a virtual gateway unhealthy.
+virtualGatewayHealthCheckPolicy_unhealthyThreshold :: Lens.Lens' VirtualGatewayHealthCheckPolicy Prelude.Natural
+virtualGatewayHealthCheckPolicy_unhealthyThreshold = Lens.lens (\VirtualGatewayHealthCheckPolicy' {unhealthyThreshold} -> unhealthyThreshold) (\s@VirtualGatewayHealthCheckPolicy' {} a -> s {unhealthyThreshold = a} :: VirtualGatewayHealthCheckPolicy)
+
+instance
+  Data.FromJSON
+    VirtualGatewayHealthCheckPolicy
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayHealthCheckPolicy"
+      ( \x ->
+          VirtualGatewayHealthCheckPolicy'
+            Prelude.<$> (x Data..:? "path")
+            Prelude.<*> (x Data..:? "port")
+            Prelude.<*> (x Data..: "healthyThreshold")
+            Prelude.<*> (x Data..: "intervalMillis")
+            Prelude.<*> (x Data..: "protocol")
+            Prelude.<*> (x Data..: "timeoutMillis")
+            Prelude.<*> (x Data..: "unhealthyThreshold")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayHealthCheckPolicy
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayHealthCheckPolicy' {..} =
+      _salt
+        `Prelude.hashWithSalt` path
+        `Prelude.hashWithSalt` port
+        `Prelude.hashWithSalt` healthyThreshold
+        `Prelude.hashWithSalt` intervalMillis
+        `Prelude.hashWithSalt` protocol
+        `Prelude.hashWithSalt` timeoutMillis
+        `Prelude.hashWithSalt` unhealthyThreshold
+
+instance
+  Prelude.NFData
+    VirtualGatewayHealthCheckPolicy
+  where
+  rnf VirtualGatewayHealthCheckPolicy' {..} =
+    Prelude.rnf path
+      `Prelude.seq` Prelude.rnf port
+      `Prelude.seq` Prelude.rnf healthyThreshold
+      `Prelude.seq` Prelude.rnf intervalMillis
+      `Prelude.seq` Prelude.rnf protocol
+      `Prelude.seq` Prelude.rnf timeoutMillis
+      `Prelude.seq` Prelude.rnf unhealthyThreshold
+
+instance Data.ToJSON VirtualGatewayHealthCheckPolicy where
+  toJSON VirtualGatewayHealthCheckPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("path" Data..=) Prelude.<$> path,
+            ("port" Data..=) Prelude.<$> port,
+            Prelude.Just
+              ("healthyThreshold" Data..= healthyThreshold),
+            Prelude.Just
+              ("intervalMillis" Data..= intervalMillis),
+            Prelude.Just ("protocol" Data..= protocol),
+            Prelude.Just ("timeoutMillis" Data..= timeoutMillis),
+            Prelude.Just
+              ("unhealthyThreshold" Data..= unhealthyThreshold)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayHttp2ConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayHttp2ConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayHttp2ConnectionPool.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayHttp2ConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayHttp2ConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualGatewayHttp2ConnectionPool' smart constructor.
+data VirtualGatewayHttp2ConnectionPool = VirtualGatewayHttp2ConnectionPool'
+  { -- | Maximum number of inflight requests Envoy can concurrently support
+    -- across hosts in upstream cluster.
+    maxRequests :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayHttp2ConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxRequests', 'virtualGatewayHttp2ConnectionPool_maxRequests' - Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+newVirtualGatewayHttp2ConnectionPool ::
+  -- | 'maxRequests'
+  Prelude.Natural ->
+  VirtualGatewayHttp2ConnectionPool
+newVirtualGatewayHttp2ConnectionPool pMaxRequests_ =
+  VirtualGatewayHttp2ConnectionPool'
+    { maxRequests =
+        pMaxRequests_
+    }
+
+-- | Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+virtualGatewayHttp2ConnectionPool_maxRequests :: Lens.Lens' VirtualGatewayHttp2ConnectionPool Prelude.Natural
+virtualGatewayHttp2ConnectionPool_maxRequests = Lens.lens (\VirtualGatewayHttp2ConnectionPool' {maxRequests} -> maxRequests) (\s@VirtualGatewayHttp2ConnectionPool' {} a -> s {maxRequests = a} :: VirtualGatewayHttp2ConnectionPool)
+
+instance
+  Data.FromJSON
+    VirtualGatewayHttp2ConnectionPool
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayHttp2ConnectionPool"
+      ( \x ->
+          VirtualGatewayHttp2ConnectionPool'
+            Prelude.<$> (x Data..: "maxRequests")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayHttp2ConnectionPool
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayHttp2ConnectionPool' {..} =
+      _salt `Prelude.hashWithSalt` maxRequests
+
+instance
+  Prelude.NFData
+    VirtualGatewayHttp2ConnectionPool
+  where
+  rnf VirtualGatewayHttp2ConnectionPool' {..} =
+    Prelude.rnf maxRequests
+
+instance
+  Data.ToJSON
+    VirtualGatewayHttp2ConnectionPool
+  where
+  toJSON VirtualGatewayHttp2ConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("maxRequests" Data..= maxRequests)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayHttpConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayHttpConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayHttpConnectionPool.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayHttpConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayHttpConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualGatewayHttpConnectionPool' smart constructor.
+data VirtualGatewayHttpConnectionPool = VirtualGatewayHttpConnectionPool'
+  { -- | Number of overflowing requests after @max_connections@ Envoy will queue
+    -- to upstream cluster.
+    maxPendingRequests :: Prelude.Maybe Prelude.Natural,
+    -- | Maximum number of outbound TCP connections Envoy can establish
+    -- concurrently with all hosts in upstream cluster.
+    maxConnections :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayHttpConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxPendingRequests', 'virtualGatewayHttpConnectionPool_maxPendingRequests' - Number of overflowing requests after @max_connections@ Envoy will queue
+-- to upstream cluster.
+--
+-- 'maxConnections', 'virtualGatewayHttpConnectionPool_maxConnections' - Maximum number of outbound TCP connections Envoy can establish
+-- concurrently with all hosts in upstream cluster.
+newVirtualGatewayHttpConnectionPool ::
+  -- | 'maxConnections'
+  Prelude.Natural ->
+  VirtualGatewayHttpConnectionPool
+newVirtualGatewayHttpConnectionPool pMaxConnections_ =
+  VirtualGatewayHttpConnectionPool'
+    { maxPendingRequests =
+        Prelude.Nothing,
+      maxConnections = pMaxConnections_
+    }
+
+-- | Number of overflowing requests after @max_connections@ Envoy will queue
+-- to upstream cluster.
+virtualGatewayHttpConnectionPool_maxPendingRequests :: Lens.Lens' VirtualGatewayHttpConnectionPool (Prelude.Maybe Prelude.Natural)
+virtualGatewayHttpConnectionPool_maxPendingRequests = Lens.lens (\VirtualGatewayHttpConnectionPool' {maxPendingRequests} -> maxPendingRequests) (\s@VirtualGatewayHttpConnectionPool' {} a -> s {maxPendingRequests = a} :: VirtualGatewayHttpConnectionPool)
+
+-- | Maximum number of outbound TCP connections Envoy can establish
+-- concurrently with all hosts in upstream cluster.
+virtualGatewayHttpConnectionPool_maxConnections :: Lens.Lens' VirtualGatewayHttpConnectionPool Prelude.Natural
+virtualGatewayHttpConnectionPool_maxConnections = Lens.lens (\VirtualGatewayHttpConnectionPool' {maxConnections} -> maxConnections) (\s@VirtualGatewayHttpConnectionPool' {} a -> s {maxConnections = a} :: VirtualGatewayHttpConnectionPool)
+
+instance
+  Data.FromJSON
+    VirtualGatewayHttpConnectionPool
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayHttpConnectionPool"
+      ( \x ->
+          VirtualGatewayHttpConnectionPool'
+            Prelude.<$> (x Data..:? "maxPendingRequests")
+            Prelude.<*> (x Data..: "maxConnections")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayHttpConnectionPool
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayHttpConnectionPool' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxPendingRequests
+        `Prelude.hashWithSalt` maxConnections
+
+instance
+  Prelude.NFData
+    VirtualGatewayHttpConnectionPool
+  where
+  rnf VirtualGatewayHttpConnectionPool' {..} =
+    Prelude.rnf maxPendingRequests
+      `Prelude.seq` Prelude.rnf maxConnections
+
+instance Data.ToJSON VirtualGatewayHttpConnectionPool where
+  toJSON VirtualGatewayHttpConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxPendingRequests" Data..=)
+              Prelude.<$> maxPendingRequests,
+            Prelude.Just
+              ("maxConnections" Data..= maxConnections)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListener.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListener.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListener.hs
@@ -0,0 +1,130 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListener
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListener where
+
+import Amazonka.AppMesh.Types.VirtualGatewayConnectionPool
+import Amazonka.AppMesh.Types.VirtualGatewayHealthCheckPolicy
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTls
+import Amazonka.AppMesh.Types.VirtualGatewayPortMapping
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a listener for a virtual gateway.
+--
+-- /See:/ 'newVirtualGatewayListener' smart constructor.
+data VirtualGatewayListener = VirtualGatewayListener'
+  { -- | The connection pool information for the virtual gateway listener.
+    connectionPool :: Prelude.Maybe VirtualGatewayConnectionPool,
+    -- | The health check information for the listener.
+    healthCheck :: Prelude.Maybe VirtualGatewayHealthCheckPolicy,
+    -- | A reference to an object that represents the Transport Layer Security
+    -- (TLS) properties for the listener.
+    tls :: Prelude.Maybe VirtualGatewayListenerTls,
+    -- | The port mapping information for the listener.
+    portMapping :: VirtualGatewayPortMapping
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListener' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectionPool', 'virtualGatewayListener_connectionPool' - The connection pool information for the virtual gateway listener.
+--
+-- 'healthCheck', 'virtualGatewayListener_healthCheck' - The health check information for the listener.
+--
+-- 'tls', 'virtualGatewayListener_tls' - A reference to an object that represents the Transport Layer Security
+-- (TLS) properties for the listener.
+--
+-- 'portMapping', 'virtualGatewayListener_portMapping' - The port mapping information for the listener.
+newVirtualGatewayListener ::
+  -- | 'portMapping'
+  VirtualGatewayPortMapping ->
+  VirtualGatewayListener
+newVirtualGatewayListener pPortMapping_ =
+  VirtualGatewayListener'
+    { connectionPool =
+        Prelude.Nothing,
+      healthCheck = Prelude.Nothing,
+      tls = Prelude.Nothing,
+      portMapping = pPortMapping_
+    }
+
+-- | The connection pool information for the virtual gateway listener.
+virtualGatewayListener_connectionPool :: Lens.Lens' VirtualGatewayListener (Prelude.Maybe VirtualGatewayConnectionPool)
+virtualGatewayListener_connectionPool = Lens.lens (\VirtualGatewayListener' {connectionPool} -> connectionPool) (\s@VirtualGatewayListener' {} a -> s {connectionPool = a} :: VirtualGatewayListener)
+
+-- | The health check information for the listener.
+virtualGatewayListener_healthCheck :: Lens.Lens' VirtualGatewayListener (Prelude.Maybe VirtualGatewayHealthCheckPolicy)
+virtualGatewayListener_healthCheck = Lens.lens (\VirtualGatewayListener' {healthCheck} -> healthCheck) (\s@VirtualGatewayListener' {} a -> s {healthCheck = a} :: VirtualGatewayListener)
+
+-- | A reference to an object that represents the Transport Layer Security
+-- (TLS) properties for the listener.
+virtualGatewayListener_tls :: Lens.Lens' VirtualGatewayListener (Prelude.Maybe VirtualGatewayListenerTls)
+virtualGatewayListener_tls = Lens.lens (\VirtualGatewayListener' {tls} -> tls) (\s@VirtualGatewayListener' {} a -> s {tls = a} :: VirtualGatewayListener)
+
+-- | The port mapping information for the listener.
+virtualGatewayListener_portMapping :: Lens.Lens' VirtualGatewayListener VirtualGatewayPortMapping
+virtualGatewayListener_portMapping = Lens.lens (\VirtualGatewayListener' {portMapping} -> portMapping) (\s@VirtualGatewayListener' {} a -> s {portMapping = a} :: VirtualGatewayListener)
+
+instance Data.FromJSON VirtualGatewayListener where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListener"
+      ( \x ->
+          VirtualGatewayListener'
+            Prelude.<$> (x Data..:? "connectionPool")
+            Prelude.<*> (x Data..:? "healthCheck")
+            Prelude.<*> (x Data..:? "tls")
+            Prelude.<*> (x Data..: "portMapping")
+      )
+
+instance Prelude.Hashable VirtualGatewayListener where
+  hashWithSalt _salt VirtualGatewayListener' {..} =
+    _salt
+      `Prelude.hashWithSalt` connectionPool
+      `Prelude.hashWithSalt` healthCheck
+      `Prelude.hashWithSalt` tls
+      `Prelude.hashWithSalt` portMapping
+
+instance Prelude.NFData VirtualGatewayListener where
+  rnf VirtualGatewayListener' {..} =
+    Prelude.rnf connectionPool
+      `Prelude.seq` Prelude.rnf healthCheck
+      `Prelude.seq` Prelude.rnf tls
+      `Prelude.seq` Prelude.rnf portMapping
+
+instance Data.ToJSON VirtualGatewayListener where
+  toJSON VirtualGatewayListener' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("connectionPool" Data..=)
+              Prelude.<$> connectionPool,
+            ("healthCheck" Data..=) Prelude.<$> healthCheck,
+            ("tls" Data..=) Prelude.<$> tls,
+            Prelude.Just ("portMapping" Data..= portMapping)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTls.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTls.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTls.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTls
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTls where
+
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsMode
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContext
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the Transport Layer Security (TLS) properties
+-- for a listener.
+--
+-- /See:/ 'newVirtualGatewayListenerTls' smart constructor.
+data VirtualGatewayListenerTls = VirtualGatewayListenerTls'
+  { -- | A reference to an object that represents a virtual gateway\'s
+    -- listener\'s Transport Layer Security (TLS) validation context.
+    validation :: Prelude.Maybe VirtualGatewayListenerTlsValidationContext,
+    -- | An object that represents a Transport Layer Security (TLS) certificate.
+    certificate :: VirtualGatewayListenerTlsCertificate,
+    -- | Specify one of the following modes.
+    --
+    -- -   ____STRICT – Listener only accepts connections with TLS enabled.
+    --
+    -- -   ____PERMISSIVE – Listener accepts connections with or without TLS
+    --     enabled.
+    --
+    -- -   ____DISABLED – Listener only accepts connections without TLS.
+    mode :: VirtualGatewayListenerTlsMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTls' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'validation', 'virtualGatewayListenerTls_validation' - A reference to an object that represents a virtual gateway\'s
+-- listener\'s Transport Layer Security (TLS) validation context.
+--
+-- 'certificate', 'virtualGatewayListenerTls_certificate' - An object that represents a Transport Layer Security (TLS) certificate.
+--
+-- 'mode', 'virtualGatewayListenerTls_mode' - Specify one of the following modes.
+--
+-- -   ____STRICT – Listener only accepts connections with TLS enabled.
+--
+-- -   ____PERMISSIVE – Listener accepts connections with or without TLS
+--     enabled.
+--
+-- -   ____DISABLED – Listener only accepts connections without TLS.
+newVirtualGatewayListenerTls ::
+  -- | 'certificate'
+  VirtualGatewayListenerTlsCertificate ->
+  -- | 'mode'
+  VirtualGatewayListenerTlsMode ->
+  VirtualGatewayListenerTls
+newVirtualGatewayListenerTls pCertificate_ pMode_ =
+  VirtualGatewayListenerTls'
+    { validation =
+        Prelude.Nothing,
+      certificate = pCertificate_,
+      mode = pMode_
+    }
+
+-- | A reference to an object that represents a virtual gateway\'s
+-- listener\'s Transport Layer Security (TLS) validation context.
+virtualGatewayListenerTls_validation :: Lens.Lens' VirtualGatewayListenerTls (Prelude.Maybe VirtualGatewayListenerTlsValidationContext)
+virtualGatewayListenerTls_validation = Lens.lens (\VirtualGatewayListenerTls' {validation} -> validation) (\s@VirtualGatewayListenerTls' {} a -> s {validation = a} :: VirtualGatewayListenerTls)
+
+-- | An object that represents a Transport Layer Security (TLS) certificate.
+virtualGatewayListenerTls_certificate :: Lens.Lens' VirtualGatewayListenerTls VirtualGatewayListenerTlsCertificate
+virtualGatewayListenerTls_certificate = Lens.lens (\VirtualGatewayListenerTls' {certificate} -> certificate) (\s@VirtualGatewayListenerTls' {} a -> s {certificate = a} :: VirtualGatewayListenerTls)
+
+-- | Specify one of the following modes.
+--
+-- -   ____STRICT – Listener only accepts connections with TLS enabled.
+--
+-- -   ____PERMISSIVE – Listener accepts connections with or without TLS
+--     enabled.
+--
+-- -   ____DISABLED – Listener only accepts connections without TLS.
+virtualGatewayListenerTls_mode :: Lens.Lens' VirtualGatewayListenerTls VirtualGatewayListenerTlsMode
+virtualGatewayListenerTls_mode = Lens.lens (\VirtualGatewayListenerTls' {mode} -> mode) (\s@VirtualGatewayListenerTls' {} a -> s {mode = a} :: VirtualGatewayListenerTls)
+
+instance Data.FromJSON VirtualGatewayListenerTls where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTls"
+      ( \x ->
+          VirtualGatewayListenerTls'
+            Prelude.<$> (x Data..:? "validation")
+            Prelude.<*> (x Data..: "certificate")
+            Prelude.<*> (x Data..: "mode")
+      )
+
+instance Prelude.Hashable VirtualGatewayListenerTls where
+  hashWithSalt _salt VirtualGatewayListenerTls' {..} =
+    _salt
+      `Prelude.hashWithSalt` validation
+      `Prelude.hashWithSalt` certificate
+      `Prelude.hashWithSalt` mode
+
+instance Prelude.NFData VirtualGatewayListenerTls where
+  rnf VirtualGatewayListenerTls' {..} =
+    Prelude.rnf validation
+      `Prelude.seq` Prelude.rnf certificate
+      `Prelude.seq` Prelude.rnf mode
+
+instance Data.ToJSON VirtualGatewayListenerTls where
+  toJSON VirtualGatewayListenerTls' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("validation" Data..=) Prelude.<$> validation,
+            Prelude.Just ("certificate" Data..= certificate),
+            Prelude.Just ("mode" Data..= mode)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsAcmCertificate.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsAcmCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsAcmCertificate.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsAcmCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsAcmCertificate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents an Certificate Manager certificate.
+--
+-- /See:/ 'newVirtualGatewayListenerTlsAcmCertificate' smart constructor.
+data VirtualGatewayListenerTlsAcmCertificate = VirtualGatewayListenerTlsAcmCertificate'
+  { -- | The Amazon Resource Name (ARN) for the certificate. The certificate must
+    -- meet specific requirements and you must have proxy authorization
+    -- enabled. For more information, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+    certificateArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTlsAcmCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateArn', 'virtualGatewayListenerTlsAcmCertificate_certificateArn' - The Amazon Resource Name (ARN) for the certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+newVirtualGatewayListenerTlsAcmCertificate ::
+  -- | 'certificateArn'
+  Prelude.Text ->
+  VirtualGatewayListenerTlsAcmCertificate
+newVirtualGatewayListenerTlsAcmCertificate
+  pCertificateArn_ =
+    VirtualGatewayListenerTlsAcmCertificate'
+      { certificateArn =
+          pCertificateArn_
+      }
+
+-- | The Amazon Resource Name (ARN) for the certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+virtualGatewayListenerTlsAcmCertificate_certificateArn :: Lens.Lens' VirtualGatewayListenerTlsAcmCertificate Prelude.Text
+virtualGatewayListenerTlsAcmCertificate_certificateArn = Lens.lens (\VirtualGatewayListenerTlsAcmCertificate' {certificateArn} -> certificateArn) (\s@VirtualGatewayListenerTlsAcmCertificate' {} a -> s {certificateArn = a} :: VirtualGatewayListenerTlsAcmCertificate)
+
+instance
+  Data.FromJSON
+    VirtualGatewayListenerTlsAcmCertificate
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTlsAcmCertificate"
+      ( \x ->
+          VirtualGatewayListenerTlsAcmCertificate'
+            Prelude.<$> (x Data..: "certificateArn")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayListenerTlsAcmCertificate
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayListenerTlsAcmCertificate' {..} =
+      _salt `Prelude.hashWithSalt` certificateArn
+
+instance
+  Prelude.NFData
+    VirtualGatewayListenerTlsAcmCertificate
+  where
+  rnf VirtualGatewayListenerTlsAcmCertificate' {..} =
+    Prelude.rnf certificateArn
+
+instance
+  Data.ToJSON
+    VirtualGatewayListenerTlsAcmCertificate
+  where
+  toJSON VirtualGatewayListenerTlsAcmCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("certificateArn" Data..= certificateArn)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsCertificate.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsCertificate.hs
@@ -0,0 +1,131 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsCertificate where
+
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsAcmCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a listener\'s Transport Layer Security (TLS)
+-- certificate.
+--
+-- /See:/ 'newVirtualGatewayListenerTlsCertificate' smart constructor.
+data VirtualGatewayListenerTlsCertificate = VirtualGatewayListenerTlsCertificate'
+  { -- | A reference to an object that represents an Certificate Manager
+    -- certificate.
+    acm :: Prelude.Maybe VirtualGatewayListenerTlsAcmCertificate,
+    -- | A reference to an object that represents a local file certificate.
+    file :: Prelude.Maybe VirtualGatewayListenerTlsFileCertificate,
+    -- | A reference to an object that represents a virtual gateway\'s
+    -- listener\'s Secret Discovery Service certificate.
+    sds :: Prelude.Maybe VirtualGatewayListenerTlsSdsCertificate
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTlsCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acm', 'virtualGatewayListenerTlsCertificate_acm' - A reference to an object that represents an Certificate Manager
+-- certificate.
+--
+-- 'file', 'virtualGatewayListenerTlsCertificate_file' - A reference to an object that represents a local file certificate.
+--
+-- 'sds', 'virtualGatewayListenerTlsCertificate_sds' - A reference to an object that represents a virtual gateway\'s
+-- listener\'s Secret Discovery Service certificate.
+newVirtualGatewayListenerTlsCertificate ::
+  VirtualGatewayListenerTlsCertificate
+newVirtualGatewayListenerTlsCertificate =
+  VirtualGatewayListenerTlsCertificate'
+    { acm =
+        Prelude.Nothing,
+      file = Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | A reference to an object that represents an Certificate Manager
+-- certificate.
+virtualGatewayListenerTlsCertificate_acm :: Lens.Lens' VirtualGatewayListenerTlsCertificate (Prelude.Maybe VirtualGatewayListenerTlsAcmCertificate)
+virtualGatewayListenerTlsCertificate_acm = Lens.lens (\VirtualGatewayListenerTlsCertificate' {acm} -> acm) (\s@VirtualGatewayListenerTlsCertificate' {} a -> s {acm = a} :: VirtualGatewayListenerTlsCertificate)
+
+-- | A reference to an object that represents a local file certificate.
+virtualGatewayListenerTlsCertificate_file :: Lens.Lens' VirtualGatewayListenerTlsCertificate (Prelude.Maybe VirtualGatewayListenerTlsFileCertificate)
+virtualGatewayListenerTlsCertificate_file = Lens.lens (\VirtualGatewayListenerTlsCertificate' {file} -> file) (\s@VirtualGatewayListenerTlsCertificate' {} a -> s {file = a} :: VirtualGatewayListenerTlsCertificate)
+
+-- | A reference to an object that represents a virtual gateway\'s
+-- listener\'s Secret Discovery Service certificate.
+virtualGatewayListenerTlsCertificate_sds :: Lens.Lens' VirtualGatewayListenerTlsCertificate (Prelude.Maybe VirtualGatewayListenerTlsSdsCertificate)
+virtualGatewayListenerTlsCertificate_sds = Lens.lens (\VirtualGatewayListenerTlsCertificate' {sds} -> sds) (\s@VirtualGatewayListenerTlsCertificate' {} a -> s {sds = a} :: VirtualGatewayListenerTlsCertificate)
+
+instance
+  Data.FromJSON
+    VirtualGatewayListenerTlsCertificate
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTlsCertificate"
+      ( \x ->
+          VirtualGatewayListenerTlsCertificate'
+            Prelude.<$> (x Data..:? "acm")
+            Prelude.<*> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayListenerTlsCertificate
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayListenerTlsCertificate' {..} =
+      _salt
+        `Prelude.hashWithSalt` acm
+        `Prelude.hashWithSalt` file
+        `Prelude.hashWithSalt` sds
+
+instance
+  Prelude.NFData
+    VirtualGatewayListenerTlsCertificate
+  where
+  rnf VirtualGatewayListenerTlsCertificate' {..} =
+    Prelude.rnf acm
+      `Prelude.seq` Prelude.rnf file
+      `Prelude.seq` Prelude.rnf sds
+
+instance
+  Data.ToJSON
+    VirtualGatewayListenerTlsCertificate
+  where
+  toJSON VirtualGatewayListenerTlsCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("acm" Data..=) Prelude.<$> acm,
+            ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsFileCertificate.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsFileCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsFileCertificate.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsFileCertificate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a local file certificate. The certificate must
+-- meet specific requirements and you must have proxy authorization
+-- enabled. For more information, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites Transport Layer Security (TLS)>.
+--
+-- /See:/ 'newVirtualGatewayListenerTlsFileCertificate' smart constructor.
+data VirtualGatewayListenerTlsFileCertificate = VirtualGatewayListenerTlsFileCertificate'
+  { -- | The certificate chain for the certificate.
+    certificateChain :: Prelude.Text,
+    -- | The private key for a certificate stored on the file system of the mesh
+    -- endpoint that the proxy is running on.
+    privateKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTlsFileCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateChain', 'virtualGatewayListenerTlsFileCertificate_certificateChain' - The certificate chain for the certificate.
+--
+-- 'privateKey', 'virtualGatewayListenerTlsFileCertificate_privateKey' - The private key for a certificate stored on the file system of the mesh
+-- endpoint that the proxy is running on.
+newVirtualGatewayListenerTlsFileCertificate ::
+  -- | 'certificateChain'
+  Prelude.Text ->
+  -- | 'privateKey'
+  Prelude.Text ->
+  VirtualGatewayListenerTlsFileCertificate
+newVirtualGatewayListenerTlsFileCertificate
+  pCertificateChain_
+  pPrivateKey_ =
+    VirtualGatewayListenerTlsFileCertificate'
+      { certificateChain =
+          pCertificateChain_,
+        privateKey = pPrivateKey_
+      }
+
+-- | The certificate chain for the certificate.
+virtualGatewayListenerTlsFileCertificate_certificateChain :: Lens.Lens' VirtualGatewayListenerTlsFileCertificate Prelude.Text
+virtualGatewayListenerTlsFileCertificate_certificateChain = Lens.lens (\VirtualGatewayListenerTlsFileCertificate' {certificateChain} -> certificateChain) (\s@VirtualGatewayListenerTlsFileCertificate' {} a -> s {certificateChain = a} :: VirtualGatewayListenerTlsFileCertificate)
+
+-- | The private key for a certificate stored on the file system of the mesh
+-- endpoint that the proxy is running on.
+virtualGatewayListenerTlsFileCertificate_privateKey :: Lens.Lens' VirtualGatewayListenerTlsFileCertificate Prelude.Text
+virtualGatewayListenerTlsFileCertificate_privateKey = Lens.lens (\VirtualGatewayListenerTlsFileCertificate' {privateKey} -> privateKey) (\s@VirtualGatewayListenerTlsFileCertificate' {} a -> s {privateKey = a} :: VirtualGatewayListenerTlsFileCertificate)
+
+instance
+  Data.FromJSON
+    VirtualGatewayListenerTlsFileCertificate
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTlsFileCertificate"
+      ( \x ->
+          VirtualGatewayListenerTlsFileCertificate'
+            Prelude.<$> (x Data..: "certificateChain")
+            Prelude.<*> (x Data..: "privateKey")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayListenerTlsFileCertificate
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayListenerTlsFileCertificate' {..} =
+      _salt
+        `Prelude.hashWithSalt` certificateChain
+        `Prelude.hashWithSalt` privateKey
+
+instance
+  Prelude.NFData
+    VirtualGatewayListenerTlsFileCertificate
+  where
+  rnf VirtualGatewayListenerTlsFileCertificate' {..} =
+    Prelude.rnf certificateChain
+      `Prelude.seq` Prelude.rnf privateKey
+
+instance
+  Data.ToJSON
+    VirtualGatewayListenerTlsFileCertificate
+  where
+  toJSON VirtualGatewayListenerTlsFileCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("certificateChain" Data..= certificateChain),
+            Prelude.Just ("privateKey" Data..= privateKey)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsMode.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsMode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsMode
+  ( VirtualGatewayListenerTlsMode
+      ( ..,
+        VirtualGatewayListenerTlsMode_DISABLED,
+        VirtualGatewayListenerTlsMode_PERMISSIVE,
+        VirtualGatewayListenerTlsMode_STRICT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualGatewayListenerTlsMode = VirtualGatewayListenerTlsMode'
+  { fromVirtualGatewayListenerTlsMode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VirtualGatewayListenerTlsMode_DISABLED :: VirtualGatewayListenerTlsMode
+pattern VirtualGatewayListenerTlsMode_DISABLED = VirtualGatewayListenerTlsMode' "DISABLED"
+
+pattern VirtualGatewayListenerTlsMode_PERMISSIVE :: VirtualGatewayListenerTlsMode
+pattern VirtualGatewayListenerTlsMode_PERMISSIVE = VirtualGatewayListenerTlsMode' "PERMISSIVE"
+
+pattern VirtualGatewayListenerTlsMode_STRICT :: VirtualGatewayListenerTlsMode
+pattern VirtualGatewayListenerTlsMode_STRICT = VirtualGatewayListenerTlsMode' "STRICT"
+
+{-# COMPLETE
+  VirtualGatewayListenerTlsMode_DISABLED,
+  VirtualGatewayListenerTlsMode_PERMISSIVE,
+  VirtualGatewayListenerTlsMode_STRICT,
+  VirtualGatewayListenerTlsMode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsSdsCertificate.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsSdsCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsSdsCertificate.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsSdsCertificate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the virtual gateway\'s listener\'s Secret
+-- Discovery Service certificate.The proxy must be configured with a local
+-- SDS provider via a Unix Domain Socket. See App
+-- Mesh<https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html TLS documentation>
+-- for more info.
+--
+-- /See:/ 'newVirtualGatewayListenerTlsSdsCertificate' smart constructor.
+data VirtualGatewayListenerTlsSdsCertificate = VirtualGatewayListenerTlsSdsCertificate'
+  { -- | A reference to an object that represents the name of the secret secret
+    -- requested from the Secret Discovery Service provider representing
+    -- Transport Layer Security (TLS) materials like a certificate or
+    -- certificate chain.
+    secretName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTlsSdsCertificate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'secretName', 'virtualGatewayListenerTlsSdsCertificate_secretName' - A reference to an object that represents the name of the secret secret
+-- requested from the Secret Discovery Service provider representing
+-- Transport Layer Security (TLS) materials like a certificate or
+-- certificate chain.
+newVirtualGatewayListenerTlsSdsCertificate ::
+  -- | 'secretName'
+  Prelude.Text ->
+  VirtualGatewayListenerTlsSdsCertificate
+newVirtualGatewayListenerTlsSdsCertificate
+  pSecretName_ =
+    VirtualGatewayListenerTlsSdsCertificate'
+      { secretName =
+          pSecretName_
+      }
+
+-- | A reference to an object that represents the name of the secret secret
+-- requested from the Secret Discovery Service provider representing
+-- Transport Layer Security (TLS) materials like a certificate or
+-- certificate chain.
+virtualGatewayListenerTlsSdsCertificate_secretName :: Lens.Lens' VirtualGatewayListenerTlsSdsCertificate Prelude.Text
+virtualGatewayListenerTlsSdsCertificate_secretName = Lens.lens (\VirtualGatewayListenerTlsSdsCertificate' {secretName} -> secretName) (\s@VirtualGatewayListenerTlsSdsCertificate' {} a -> s {secretName = a} :: VirtualGatewayListenerTlsSdsCertificate)
+
+instance
+  Data.FromJSON
+    VirtualGatewayListenerTlsSdsCertificate
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTlsSdsCertificate"
+      ( \x ->
+          VirtualGatewayListenerTlsSdsCertificate'
+            Prelude.<$> (x Data..: "secretName")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayListenerTlsSdsCertificate
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayListenerTlsSdsCertificate' {..} =
+      _salt `Prelude.hashWithSalt` secretName
+
+instance
+  Prelude.NFData
+    VirtualGatewayListenerTlsSdsCertificate
+  where
+  rnf VirtualGatewayListenerTlsSdsCertificate' {..} =
+    Prelude.rnf secretName
+
+instance
+  Data.ToJSON
+    VirtualGatewayListenerTlsSdsCertificate
+  where
+  toJSON VirtualGatewayListenerTlsSdsCertificate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("secretName" Data..= secretName)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsValidationContext.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsValidationContext.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsValidationContext.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContext
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContext where
+
+import Amazonka.AppMesh.Types.SubjectAlternativeNames
+import Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContextTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual gateway\'s listener\'s Transport
+-- Layer Security (TLS) validation context.
+--
+-- /See:/ 'newVirtualGatewayListenerTlsValidationContext' smart constructor.
+data VirtualGatewayListenerTlsValidationContext = VirtualGatewayListenerTlsValidationContext'
+  { -- | A reference to an object that represents the SANs for a virtual gateway
+    -- listener\'s Transport Layer Security (TLS) validation context.
+    subjectAlternativeNames :: Prelude.Maybe SubjectAlternativeNames,
+    -- | A reference to where to retrieve the trust chain when validating a
+    -- peer’s Transport Layer Security (TLS) certificate.
+    trust :: VirtualGatewayListenerTlsValidationContextTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTlsValidationContext' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subjectAlternativeNames', 'virtualGatewayListenerTlsValidationContext_subjectAlternativeNames' - A reference to an object that represents the SANs for a virtual gateway
+-- listener\'s Transport Layer Security (TLS) validation context.
+--
+-- 'trust', 'virtualGatewayListenerTlsValidationContext_trust' - A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+newVirtualGatewayListenerTlsValidationContext ::
+  -- | 'trust'
+  VirtualGatewayListenerTlsValidationContextTrust ->
+  VirtualGatewayListenerTlsValidationContext
+newVirtualGatewayListenerTlsValidationContext pTrust_ =
+  VirtualGatewayListenerTlsValidationContext'
+    { subjectAlternativeNames =
+        Prelude.Nothing,
+      trust = pTrust_
+    }
+
+-- | A reference to an object that represents the SANs for a virtual gateway
+-- listener\'s Transport Layer Security (TLS) validation context.
+virtualGatewayListenerTlsValidationContext_subjectAlternativeNames :: Lens.Lens' VirtualGatewayListenerTlsValidationContext (Prelude.Maybe SubjectAlternativeNames)
+virtualGatewayListenerTlsValidationContext_subjectAlternativeNames = Lens.lens (\VirtualGatewayListenerTlsValidationContext' {subjectAlternativeNames} -> subjectAlternativeNames) (\s@VirtualGatewayListenerTlsValidationContext' {} a -> s {subjectAlternativeNames = a} :: VirtualGatewayListenerTlsValidationContext)
+
+-- | A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+virtualGatewayListenerTlsValidationContext_trust :: Lens.Lens' VirtualGatewayListenerTlsValidationContext VirtualGatewayListenerTlsValidationContextTrust
+virtualGatewayListenerTlsValidationContext_trust = Lens.lens (\VirtualGatewayListenerTlsValidationContext' {trust} -> trust) (\s@VirtualGatewayListenerTlsValidationContext' {} a -> s {trust = a} :: VirtualGatewayListenerTlsValidationContext)
+
+instance
+  Data.FromJSON
+    VirtualGatewayListenerTlsValidationContext
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTlsValidationContext"
+      ( \x ->
+          VirtualGatewayListenerTlsValidationContext'
+            Prelude.<$> (x Data..:? "subjectAlternativeNames")
+            Prelude.<*> (x Data..: "trust")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayListenerTlsValidationContext
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayListenerTlsValidationContext' {..} =
+      _salt
+        `Prelude.hashWithSalt` subjectAlternativeNames
+        `Prelude.hashWithSalt` trust
+
+instance
+  Prelude.NFData
+    VirtualGatewayListenerTlsValidationContext
+  where
+  rnf VirtualGatewayListenerTlsValidationContext' {..} =
+    Prelude.rnf subjectAlternativeNames
+      `Prelude.seq` Prelude.rnf trust
+
+instance
+  Data.ToJSON
+    VirtualGatewayListenerTlsValidationContext
+  where
+  toJSON
+    VirtualGatewayListenerTlsValidationContext' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("subjectAlternativeNames" Data..=)
+                Prelude.<$> subjectAlternativeNames,
+              Prelude.Just ("trust" Data..= trust)
+            ]
+        )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsValidationContextTrust.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsValidationContextTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayListenerTlsValidationContextTrust.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContextTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayListenerTlsValidationContextTrust where
+
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual gateway\'s listener\'s Transport
+-- Layer Security (TLS) validation context trust.
+--
+-- /See:/ 'newVirtualGatewayListenerTlsValidationContextTrust' smart constructor.
+data VirtualGatewayListenerTlsValidationContextTrust = VirtualGatewayListenerTlsValidationContextTrust'
+  { -- | An object that represents a Transport Layer Security (TLS) validation
+    -- context trust for a local file.
+    file :: Prelude.Maybe VirtualGatewayTlsValidationContextFileTrust,
+    -- | A reference to an object that represents a virtual gateway\'s
+    -- listener\'s Transport Layer Security (TLS) Secret Discovery Service
+    -- validation context trust.
+    sds :: Prelude.Maybe VirtualGatewayTlsValidationContextSdsTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayListenerTlsValidationContextTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'virtualGatewayListenerTlsValidationContextTrust_file' - An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+--
+-- 'sds', 'virtualGatewayListenerTlsValidationContextTrust_sds' - A reference to an object that represents a virtual gateway\'s
+-- listener\'s Transport Layer Security (TLS) Secret Discovery Service
+-- validation context trust.
+newVirtualGatewayListenerTlsValidationContextTrust ::
+  VirtualGatewayListenerTlsValidationContextTrust
+newVirtualGatewayListenerTlsValidationContextTrust =
+  VirtualGatewayListenerTlsValidationContextTrust'
+    { file =
+        Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+virtualGatewayListenerTlsValidationContextTrust_file :: Lens.Lens' VirtualGatewayListenerTlsValidationContextTrust (Prelude.Maybe VirtualGatewayTlsValidationContextFileTrust)
+virtualGatewayListenerTlsValidationContextTrust_file = Lens.lens (\VirtualGatewayListenerTlsValidationContextTrust' {file} -> file) (\s@VirtualGatewayListenerTlsValidationContextTrust' {} a -> s {file = a} :: VirtualGatewayListenerTlsValidationContextTrust)
+
+-- | A reference to an object that represents a virtual gateway\'s
+-- listener\'s Transport Layer Security (TLS) Secret Discovery Service
+-- validation context trust.
+virtualGatewayListenerTlsValidationContextTrust_sds :: Lens.Lens' VirtualGatewayListenerTlsValidationContextTrust (Prelude.Maybe VirtualGatewayTlsValidationContextSdsTrust)
+virtualGatewayListenerTlsValidationContextTrust_sds = Lens.lens (\VirtualGatewayListenerTlsValidationContextTrust' {sds} -> sds) (\s@VirtualGatewayListenerTlsValidationContextTrust' {} a -> s {sds = a} :: VirtualGatewayListenerTlsValidationContextTrust)
+
+instance
+  Data.FromJSON
+    VirtualGatewayListenerTlsValidationContextTrust
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayListenerTlsValidationContextTrust"
+      ( \x ->
+          VirtualGatewayListenerTlsValidationContextTrust'
+            Prelude.<$> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayListenerTlsValidationContextTrust
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayListenerTlsValidationContextTrust' {..} =
+      _salt
+        `Prelude.hashWithSalt` file
+        `Prelude.hashWithSalt` sds
+
+instance
+  Prelude.NFData
+    VirtualGatewayListenerTlsValidationContextTrust
+  where
+  rnf
+    VirtualGatewayListenerTlsValidationContextTrust' {..} =
+      Prelude.rnf file `Prelude.seq` Prelude.rnf sds
+
+instance
+  Data.ToJSON
+    VirtualGatewayListenerTlsValidationContextTrust
+  where
+  toJSON
+    VirtualGatewayListenerTlsValidationContextTrust' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("file" Data..=) Prelude.<$> file,
+              ("sds" Data..=) Prelude.<$> sds
+            ]
+        )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayLogging.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayLogging.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayLogging.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayLogging
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayLogging where
+
+import Amazonka.AppMesh.Types.VirtualGatewayAccessLog
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents logging information.
+--
+-- /See:/ 'newVirtualGatewayLogging' smart constructor.
+data VirtualGatewayLogging = VirtualGatewayLogging'
+  { -- | The access log configuration.
+    accessLog :: Prelude.Maybe VirtualGatewayAccessLog
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayLogging' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessLog', 'virtualGatewayLogging_accessLog' - The access log configuration.
+newVirtualGatewayLogging ::
+  VirtualGatewayLogging
+newVirtualGatewayLogging =
+  VirtualGatewayLogging' {accessLog = Prelude.Nothing}
+
+-- | The access log configuration.
+virtualGatewayLogging_accessLog :: Lens.Lens' VirtualGatewayLogging (Prelude.Maybe VirtualGatewayAccessLog)
+virtualGatewayLogging_accessLog = Lens.lens (\VirtualGatewayLogging' {accessLog} -> accessLog) (\s@VirtualGatewayLogging' {} a -> s {accessLog = a} :: VirtualGatewayLogging)
+
+instance Data.FromJSON VirtualGatewayLogging where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayLogging"
+      ( \x ->
+          VirtualGatewayLogging'
+            Prelude.<$> (x Data..:? "accessLog")
+      )
+
+instance Prelude.Hashable VirtualGatewayLogging where
+  hashWithSalt _salt VirtualGatewayLogging' {..} =
+    _salt `Prelude.hashWithSalt` accessLog
+
+instance Prelude.NFData VirtualGatewayLogging where
+  rnf VirtualGatewayLogging' {..} =
+    Prelude.rnf accessLog
+
+instance Data.ToJSON VirtualGatewayLogging where
+  toJSON VirtualGatewayLogging' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("accessLog" Data..=) Prelude.<$> accessLog]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayPortMapping.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayPortMapping.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayPortMapping.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayPortMapping
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayPortMapping where
+
+import Amazonka.AppMesh.Types.VirtualGatewayPortProtocol
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a port mapping.
+--
+-- /See:/ 'newVirtualGatewayPortMapping' smart constructor.
+data VirtualGatewayPortMapping = VirtualGatewayPortMapping'
+  { -- | The port used for the port mapping. Specify one protocol.
+    port :: Prelude.Natural,
+    -- | The protocol used for the port mapping.
+    protocol :: VirtualGatewayPortProtocol
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayPortMapping' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'port', 'virtualGatewayPortMapping_port' - The port used for the port mapping. Specify one protocol.
+--
+-- 'protocol', 'virtualGatewayPortMapping_protocol' - The protocol used for the port mapping.
+newVirtualGatewayPortMapping ::
+  -- | 'port'
+  Prelude.Natural ->
+  -- | 'protocol'
+  VirtualGatewayPortProtocol ->
+  VirtualGatewayPortMapping
+newVirtualGatewayPortMapping pPort_ pProtocol_ =
+  VirtualGatewayPortMapping'
+    { port = pPort_,
+      protocol = pProtocol_
+    }
+
+-- | The port used for the port mapping. Specify one protocol.
+virtualGatewayPortMapping_port :: Lens.Lens' VirtualGatewayPortMapping Prelude.Natural
+virtualGatewayPortMapping_port = Lens.lens (\VirtualGatewayPortMapping' {port} -> port) (\s@VirtualGatewayPortMapping' {} a -> s {port = a} :: VirtualGatewayPortMapping)
+
+-- | The protocol used for the port mapping.
+virtualGatewayPortMapping_protocol :: Lens.Lens' VirtualGatewayPortMapping VirtualGatewayPortProtocol
+virtualGatewayPortMapping_protocol = Lens.lens (\VirtualGatewayPortMapping' {protocol} -> protocol) (\s@VirtualGatewayPortMapping' {} a -> s {protocol = a} :: VirtualGatewayPortMapping)
+
+instance Data.FromJSON VirtualGatewayPortMapping where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayPortMapping"
+      ( \x ->
+          VirtualGatewayPortMapping'
+            Prelude.<$> (x Data..: "port")
+            Prelude.<*> (x Data..: "protocol")
+      )
+
+instance Prelude.Hashable VirtualGatewayPortMapping where
+  hashWithSalt _salt VirtualGatewayPortMapping' {..} =
+    _salt
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` protocol
+
+instance Prelude.NFData VirtualGatewayPortMapping where
+  rnf VirtualGatewayPortMapping' {..} =
+    Prelude.rnf port `Prelude.seq` Prelude.rnf protocol
+
+instance Data.ToJSON VirtualGatewayPortMapping where
+  toJSON VirtualGatewayPortMapping' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("port" Data..= port),
+            Prelude.Just ("protocol" Data..= protocol)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayPortProtocol.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayPortProtocol.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayPortProtocol.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayPortProtocol
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayPortProtocol
+  ( VirtualGatewayPortProtocol
+      ( ..,
+        VirtualGatewayPortProtocol_Grpc,
+        VirtualGatewayPortProtocol_Http,
+        VirtualGatewayPortProtocol_Http2
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualGatewayPortProtocol = VirtualGatewayPortProtocol'
+  { fromVirtualGatewayPortProtocol ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VirtualGatewayPortProtocol_Grpc :: VirtualGatewayPortProtocol
+pattern VirtualGatewayPortProtocol_Grpc = VirtualGatewayPortProtocol' "grpc"
+
+pattern VirtualGatewayPortProtocol_Http :: VirtualGatewayPortProtocol
+pattern VirtualGatewayPortProtocol_Http = VirtualGatewayPortProtocol' "http"
+
+pattern VirtualGatewayPortProtocol_Http2 :: VirtualGatewayPortProtocol
+pattern VirtualGatewayPortProtocol_Http2 = VirtualGatewayPortProtocol' "http2"
+
+{-# COMPLETE
+  VirtualGatewayPortProtocol_Grpc,
+  VirtualGatewayPortProtocol_Http,
+  VirtualGatewayPortProtocol_Http2,
+  VirtualGatewayPortProtocol'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayRef.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayRef.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual gateway returned by a list
+-- operation.
+--
+-- /See:/ 'newVirtualGatewayRef' smart constructor.
+data VirtualGatewayRef = VirtualGatewayRef'
+  { -- | The full Amazon Resource Name (ARN) for the resource.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh that the resource resides in.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer,
+    -- | The name of the resource.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'virtualGatewayRef_arn' - The full Amazon Resource Name (ARN) for the resource.
+--
+-- 'createdAt', 'virtualGatewayRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'virtualGatewayRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'virtualGatewayRef_meshName' - The name of the service mesh that the resource resides in.
+--
+-- 'meshOwner', 'virtualGatewayRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'virtualGatewayRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'version', 'virtualGatewayRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+--
+-- 'virtualGatewayName', 'virtualGatewayRef_virtualGatewayName' - The name of the resource.
+newVirtualGatewayRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  VirtualGatewayRef
+newVirtualGatewayRef
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pVersion_
+  pVirtualGatewayName_ =
+    VirtualGatewayRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        version = pVersion_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the resource.
+virtualGatewayRef_arn :: Lens.Lens' VirtualGatewayRef Prelude.Text
+virtualGatewayRef_arn = Lens.lens (\VirtualGatewayRef' {arn} -> arn) (\s@VirtualGatewayRef' {} a -> s {arn = a} :: VirtualGatewayRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+virtualGatewayRef_createdAt :: Lens.Lens' VirtualGatewayRef Prelude.UTCTime
+virtualGatewayRef_createdAt = Lens.lens (\VirtualGatewayRef' {createdAt} -> createdAt) (\s@VirtualGatewayRef' {} a -> s {createdAt = a} :: VirtualGatewayRef) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+virtualGatewayRef_lastUpdatedAt :: Lens.Lens' VirtualGatewayRef Prelude.UTCTime
+virtualGatewayRef_lastUpdatedAt = Lens.lens (\VirtualGatewayRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@VirtualGatewayRef' {} a -> s {lastUpdatedAt = a} :: VirtualGatewayRef) Prelude.. Data._Time
+
+-- | The name of the service mesh that the resource resides in.
+virtualGatewayRef_meshName :: Lens.Lens' VirtualGatewayRef Prelude.Text
+virtualGatewayRef_meshName = Lens.lens (\VirtualGatewayRef' {meshName} -> meshName) (\s@VirtualGatewayRef' {} a -> s {meshName = a} :: VirtualGatewayRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualGatewayRef_meshOwner :: Lens.Lens' VirtualGatewayRef Prelude.Text
+virtualGatewayRef_meshOwner = Lens.lens (\VirtualGatewayRef' {meshOwner} -> meshOwner) (\s@VirtualGatewayRef' {} a -> s {meshOwner = a} :: VirtualGatewayRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualGatewayRef_resourceOwner :: Lens.Lens' VirtualGatewayRef Prelude.Text
+virtualGatewayRef_resourceOwner = Lens.lens (\VirtualGatewayRef' {resourceOwner} -> resourceOwner) (\s@VirtualGatewayRef' {} a -> s {resourceOwner = a} :: VirtualGatewayRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+virtualGatewayRef_version :: Lens.Lens' VirtualGatewayRef Prelude.Integer
+virtualGatewayRef_version = Lens.lens (\VirtualGatewayRef' {version} -> version) (\s@VirtualGatewayRef' {} a -> s {version = a} :: VirtualGatewayRef)
+
+-- | The name of the resource.
+virtualGatewayRef_virtualGatewayName :: Lens.Lens' VirtualGatewayRef Prelude.Text
+virtualGatewayRef_virtualGatewayName = Lens.lens (\VirtualGatewayRef' {virtualGatewayName} -> virtualGatewayName) (\s@VirtualGatewayRef' {} a -> s {virtualGatewayName = a} :: VirtualGatewayRef)
+
+instance Data.FromJSON VirtualGatewayRef where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayRef"
+      ( \x ->
+          VirtualGatewayRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "version")
+            Prelude.<*> (x Data..: "virtualGatewayName")
+      )
+
+instance Prelude.Hashable VirtualGatewayRef where
+  hashWithSalt _salt VirtualGatewayRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` version
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData VirtualGatewayRef where
+  rnf VirtualGatewayRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf virtualGatewayName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewaySpec.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewaySpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewaySpec.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewaySpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewaySpec where
+
+import Amazonka.AppMesh.Types.VirtualGatewayBackendDefaults
+import Amazonka.AppMesh.Types.VirtualGatewayListener
+import Amazonka.AppMesh.Types.VirtualGatewayLogging
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the specification of a service mesh resource.
+--
+-- /See:/ 'newVirtualGatewaySpec' smart constructor.
+data VirtualGatewaySpec = VirtualGatewaySpec'
+  { -- | A reference to an object that represents the defaults for backends.
+    backendDefaults :: Prelude.Maybe VirtualGatewayBackendDefaults,
+    logging :: Prelude.Maybe VirtualGatewayLogging,
+    -- | The listeners that the mesh endpoint is expected to receive inbound
+    -- traffic from. You can specify one listener.
+    listeners :: [VirtualGatewayListener]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewaySpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'backendDefaults', 'virtualGatewaySpec_backendDefaults' - A reference to an object that represents the defaults for backends.
+--
+-- 'logging', 'virtualGatewaySpec_logging' - Undocumented member.
+--
+-- 'listeners', 'virtualGatewaySpec_listeners' - The listeners that the mesh endpoint is expected to receive inbound
+-- traffic from. You can specify one listener.
+newVirtualGatewaySpec ::
+  VirtualGatewaySpec
+newVirtualGatewaySpec =
+  VirtualGatewaySpec'
+    { backendDefaults =
+        Prelude.Nothing,
+      logging = Prelude.Nothing,
+      listeners = Prelude.mempty
+    }
+
+-- | A reference to an object that represents the defaults for backends.
+virtualGatewaySpec_backendDefaults :: Lens.Lens' VirtualGatewaySpec (Prelude.Maybe VirtualGatewayBackendDefaults)
+virtualGatewaySpec_backendDefaults = Lens.lens (\VirtualGatewaySpec' {backendDefaults} -> backendDefaults) (\s@VirtualGatewaySpec' {} a -> s {backendDefaults = a} :: VirtualGatewaySpec)
+
+-- | Undocumented member.
+virtualGatewaySpec_logging :: Lens.Lens' VirtualGatewaySpec (Prelude.Maybe VirtualGatewayLogging)
+virtualGatewaySpec_logging = Lens.lens (\VirtualGatewaySpec' {logging} -> logging) (\s@VirtualGatewaySpec' {} a -> s {logging = a} :: VirtualGatewaySpec)
+
+-- | The listeners that the mesh endpoint is expected to receive inbound
+-- traffic from. You can specify one listener.
+virtualGatewaySpec_listeners :: Lens.Lens' VirtualGatewaySpec [VirtualGatewayListener]
+virtualGatewaySpec_listeners = Lens.lens (\VirtualGatewaySpec' {listeners} -> listeners) (\s@VirtualGatewaySpec' {} a -> s {listeners = a} :: VirtualGatewaySpec) Prelude.. Lens.coerced
+
+instance Data.FromJSON VirtualGatewaySpec where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewaySpec"
+      ( \x ->
+          VirtualGatewaySpec'
+            Prelude.<$> (x Data..:? "backendDefaults")
+            Prelude.<*> (x Data..:? "logging")
+            Prelude.<*> (x Data..:? "listeners" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable VirtualGatewaySpec where
+  hashWithSalt _salt VirtualGatewaySpec' {..} =
+    _salt
+      `Prelude.hashWithSalt` backendDefaults
+      `Prelude.hashWithSalt` logging
+      `Prelude.hashWithSalt` listeners
+
+instance Prelude.NFData VirtualGatewaySpec where
+  rnf VirtualGatewaySpec' {..} =
+    Prelude.rnf backendDefaults
+      `Prelude.seq` Prelude.rnf logging
+      `Prelude.seq` Prelude.rnf listeners
+
+instance Data.ToJSON VirtualGatewaySpec where
+  toJSON VirtualGatewaySpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("backendDefaults" Data..=)
+              Prelude.<$> backendDefaults,
+            ("logging" Data..=) Prelude.<$> logging,
+            Prelude.Just ("listeners" Data..= listeners)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayStatus.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayStatus.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayStatus where
+
+import Amazonka.AppMesh.Types.VirtualGatewayStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the status of the mesh resource.
+--
+-- /See:/ 'newVirtualGatewayStatus' smart constructor.
+data VirtualGatewayStatus = VirtualGatewayStatus'
+  { -- | The current status.
+    status :: VirtualGatewayStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'virtualGatewayStatus_status' - The current status.
+newVirtualGatewayStatus ::
+  -- | 'status'
+  VirtualGatewayStatusCode ->
+  VirtualGatewayStatus
+newVirtualGatewayStatus pStatus_ =
+  VirtualGatewayStatus' {status = pStatus_}
+
+-- | The current status.
+virtualGatewayStatus_status :: Lens.Lens' VirtualGatewayStatus VirtualGatewayStatusCode
+virtualGatewayStatus_status = Lens.lens (\VirtualGatewayStatus' {status} -> status) (\s@VirtualGatewayStatus' {} a -> s {status = a} :: VirtualGatewayStatus)
+
+instance Data.FromJSON VirtualGatewayStatus where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayStatus"
+      ( \x ->
+          VirtualGatewayStatus'
+            Prelude.<$> (x Data..: "status")
+      )
+
+instance Prelude.Hashable VirtualGatewayStatus where
+  hashWithSalt _salt VirtualGatewayStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData VirtualGatewayStatus where
+  rnf VirtualGatewayStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayStatusCode.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayStatusCode
+  ( VirtualGatewayStatusCode
+      ( ..,
+        VirtualGatewayStatusCode_ACTIVE,
+        VirtualGatewayStatusCode_DELETED,
+        VirtualGatewayStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualGatewayStatusCode = VirtualGatewayStatusCode'
+  { fromVirtualGatewayStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VirtualGatewayStatusCode_ACTIVE :: VirtualGatewayStatusCode
+pattern VirtualGatewayStatusCode_ACTIVE = VirtualGatewayStatusCode' "ACTIVE"
+
+pattern VirtualGatewayStatusCode_DELETED :: VirtualGatewayStatusCode
+pattern VirtualGatewayStatusCode_DELETED = VirtualGatewayStatusCode' "DELETED"
+
+pattern VirtualGatewayStatusCode_INACTIVE :: VirtualGatewayStatusCode
+pattern VirtualGatewayStatusCode_INACTIVE = VirtualGatewayStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  VirtualGatewayStatusCode_ACTIVE,
+  VirtualGatewayStatusCode_DELETED,
+  VirtualGatewayStatusCode_INACTIVE,
+  VirtualGatewayStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContext.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContext.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContext.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContext
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContext where
+
+import Amazonka.AppMesh.Types.SubjectAlternativeNames
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context.
+--
+-- /See:/ 'newVirtualGatewayTlsValidationContext' smart constructor.
+data VirtualGatewayTlsValidationContext = VirtualGatewayTlsValidationContext'
+  { -- | A reference to an object that represents the SANs for a virtual
+    -- gateway\'s listener\'s Transport Layer Security (TLS) validation
+    -- context.
+    subjectAlternativeNames :: Prelude.Maybe SubjectAlternativeNames,
+    -- | A reference to where to retrieve the trust chain when validating a
+    -- peer’s Transport Layer Security (TLS) certificate.
+    trust :: VirtualGatewayTlsValidationContextTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayTlsValidationContext' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'subjectAlternativeNames', 'virtualGatewayTlsValidationContext_subjectAlternativeNames' - A reference to an object that represents the SANs for a virtual
+-- gateway\'s listener\'s Transport Layer Security (TLS) validation
+-- context.
+--
+-- 'trust', 'virtualGatewayTlsValidationContext_trust' - A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+newVirtualGatewayTlsValidationContext ::
+  -- | 'trust'
+  VirtualGatewayTlsValidationContextTrust ->
+  VirtualGatewayTlsValidationContext
+newVirtualGatewayTlsValidationContext pTrust_ =
+  VirtualGatewayTlsValidationContext'
+    { subjectAlternativeNames =
+        Prelude.Nothing,
+      trust = pTrust_
+    }
+
+-- | A reference to an object that represents the SANs for a virtual
+-- gateway\'s listener\'s Transport Layer Security (TLS) validation
+-- context.
+virtualGatewayTlsValidationContext_subjectAlternativeNames :: Lens.Lens' VirtualGatewayTlsValidationContext (Prelude.Maybe SubjectAlternativeNames)
+virtualGatewayTlsValidationContext_subjectAlternativeNames = Lens.lens (\VirtualGatewayTlsValidationContext' {subjectAlternativeNames} -> subjectAlternativeNames) (\s@VirtualGatewayTlsValidationContext' {} a -> s {subjectAlternativeNames = a} :: VirtualGatewayTlsValidationContext)
+
+-- | A reference to where to retrieve the trust chain when validating a
+-- peer’s Transport Layer Security (TLS) certificate.
+virtualGatewayTlsValidationContext_trust :: Lens.Lens' VirtualGatewayTlsValidationContext VirtualGatewayTlsValidationContextTrust
+virtualGatewayTlsValidationContext_trust = Lens.lens (\VirtualGatewayTlsValidationContext' {trust} -> trust) (\s@VirtualGatewayTlsValidationContext' {} a -> s {trust = a} :: VirtualGatewayTlsValidationContext)
+
+instance
+  Data.FromJSON
+    VirtualGatewayTlsValidationContext
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayTlsValidationContext"
+      ( \x ->
+          VirtualGatewayTlsValidationContext'
+            Prelude.<$> (x Data..:? "subjectAlternativeNames")
+            Prelude.<*> (x Data..: "trust")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayTlsValidationContext
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayTlsValidationContext' {..} =
+      _salt
+        `Prelude.hashWithSalt` subjectAlternativeNames
+        `Prelude.hashWithSalt` trust
+
+instance
+  Prelude.NFData
+    VirtualGatewayTlsValidationContext
+  where
+  rnf VirtualGatewayTlsValidationContext' {..} =
+    Prelude.rnf subjectAlternativeNames
+      `Prelude.seq` Prelude.rnf trust
+
+instance
+  Data.ToJSON
+    VirtualGatewayTlsValidationContext
+  where
+  toJSON VirtualGatewayTlsValidationContext' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("subjectAlternativeNames" Data..=)
+              Prelude.<$> subjectAlternativeNames,
+            Prelude.Just ("trust" Data..= trust)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextAcmTrust.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextAcmTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextAcmTrust.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextAcmTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextAcmTrust where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for an Certificate Manager certificate.
+--
+-- /See:/ 'newVirtualGatewayTlsValidationContextAcmTrust' smart constructor.
+data VirtualGatewayTlsValidationContextAcmTrust = VirtualGatewayTlsValidationContextAcmTrust'
+  { -- | One or more ACM Amazon Resource Name (ARN)s.
+    certificateAuthorityArns :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayTlsValidationContextAcmTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateAuthorityArns', 'virtualGatewayTlsValidationContextAcmTrust_certificateAuthorityArns' - One or more ACM Amazon Resource Name (ARN)s.
+newVirtualGatewayTlsValidationContextAcmTrust ::
+  -- | 'certificateAuthorityArns'
+  Prelude.NonEmpty Prelude.Text ->
+  VirtualGatewayTlsValidationContextAcmTrust
+newVirtualGatewayTlsValidationContextAcmTrust
+  pCertificateAuthorityArns_ =
+    VirtualGatewayTlsValidationContextAcmTrust'
+      { certificateAuthorityArns =
+          Lens.coerced
+            Lens.# pCertificateAuthorityArns_
+      }
+
+-- | One or more ACM Amazon Resource Name (ARN)s.
+virtualGatewayTlsValidationContextAcmTrust_certificateAuthorityArns :: Lens.Lens' VirtualGatewayTlsValidationContextAcmTrust (Prelude.NonEmpty Prelude.Text)
+virtualGatewayTlsValidationContextAcmTrust_certificateAuthorityArns = Lens.lens (\VirtualGatewayTlsValidationContextAcmTrust' {certificateAuthorityArns} -> certificateAuthorityArns) (\s@VirtualGatewayTlsValidationContextAcmTrust' {} a -> s {certificateAuthorityArns = a} :: VirtualGatewayTlsValidationContextAcmTrust) Prelude.. Lens.coerced
+
+instance
+  Data.FromJSON
+    VirtualGatewayTlsValidationContextAcmTrust
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayTlsValidationContextAcmTrust"
+      ( \x ->
+          VirtualGatewayTlsValidationContextAcmTrust'
+            Prelude.<$> (x Data..: "certificateAuthorityArns")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayTlsValidationContextAcmTrust
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayTlsValidationContextAcmTrust' {..} =
+      _salt
+        `Prelude.hashWithSalt` certificateAuthorityArns
+
+instance
+  Prelude.NFData
+    VirtualGatewayTlsValidationContextAcmTrust
+  where
+  rnf VirtualGatewayTlsValidationContextAcmTrust' {..} =
+    Prelude.rnf certificateAuthorityArns
+
+instance
+  Data.ToJSON
+    VirtualGatewayTlsValidationContextAcmTrust
+  where
+  toJSON
+    VirtualGatewayTlsValidationContextAcmTrust' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ Prelude.Just
+                ( "certificateAuthorityArns"
+                    Data..= certificateAuthorityArns
+                )
+            ]
+        )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextFileTrust.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextFileTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextFileTrust.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+--
+-- /See:/ 'newVirtualGatewayTlsValidationContextFileTrust' smart constructor.
+data VirtualGatewayTlsValidationContextFileTrust = VirtualGatewayTlsValidationContextFileTrust'
+  { -- | The certificate trust chain for a certificate stored on the file system
+    -- of the virtual node that the proxy is running on.
+    certificateChain :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayTlsValidationContextFileTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateChain', 'virtualGatewayTlsValidationContextFileTrust_certificateChain' - The certificate trust chain for a certificate stored on the file system
+-- of the virtual node that the proxy is running on.
+newVirtualGatewayTlsValidationContextFileTrust ::
+  -- | 'certificateChain'
+  Prelude.Text ->
+  VirtualGatewayTlsValidationContextFileTrust
+newVirtualGatewayTlsValidationContextFileTrust
+  pCertificateChain_ =
+    VirtualGatewayTlsValidationContextFileTrust'
+      { certificateChain =
+          pCertificateChain_
+      }
+
+-- | The certificate trust chain for a certificate stored on the file system
+-- of the virtual node that the proxy is running on.
+virtualGatewayTlsValidationContextFileTrust_certificateChain :: Lens.Lens' VirtualGatewayTlsValidationContextFileTrust Prelude.Text
+virtualGatewayTlsValidationContextFileTrust_certificateChain = Lens.lens (\VirtualGatewayTlsValidationContextFileTrust' {certificateChain} -> certificateChain) (\s@VirtualGatewayTlsValidationContextFileTrust' {} a -> s {certificateChain = a} :: VirtualGatewayTlsValidationContextFileTrust)
+
+instance
+  Data.FromJSON
+    VirtualGatewayTlsValidationContextFileTrust
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayTlsValidationContextFileTrust"
+      ( \x ->
+          VirtualGatewayTlsValidationContextFileTrust'
+            Prelude.<$> (x Data..: "certificateChain")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayTlsValidationContextFileTrust
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayTlsValidationContextFileTrust' {..} =
+      _salt `Prelude.hashWithSalt` certificateChain
+
+instance
+  Prelude.NFData
+    VirtualGatewayTlsValidationContextFileTrust
+  where
+  rnf VirtualGatewayTlsValidationContextFileTrust' {..} =
+    Prelude.rnf certificateChain
+
+instance
+  Data.ToJSON
+    VirtualGatewayTlsValidationContextFileTrust
+  where
+  toJSON
+    VirtualGatewayTlsValidationContextFileTrust' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ Prelude.Just
+                ("certificateChain" Data..= certificateChain)
+            ]
+        )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextSdsTrust.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextSdsTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextSdsTrust.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual gateway\'s listener\'s Transport
+-- Layer Security (TLS) Secret Discovery Service validation context trust.
+-- The proxy must be configured with a local SDS provider via a Unix Domain
+-- Socket. See App Mesh
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html TLS documentation>
+-- for more info.
+--
+-- /See:/ 'newVirtualGatewayTlsValidationContextSdsTrust' smart constructor.
+data VirtualGatewayTlsValidationContextSdsTrust = VirtualGatewayTlsValidationContextSdsTrust'
+  { -- | A reference to an object that represents the name of the secret for a
+    -- virtual gateway\'s Transport Layer Security (TLS) Secret Discovery
+    -- Service validation context trust.
+    secretName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayTlsValidationContextSdsTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'secretName', 'virtualGatewayTlsValidationContextSdsTrust_secretName' - A reference to an object that represents the name of the secret for a
+-- virtual gateway\'s Transport Layer Security (TLS) Secret Discovery
+-- Service validation context trust.
+newVirtualGatewayTlsValidationContextSdsTrust ::
+  -- | 'secretName'
+  Prelude.Text ->
+  VirtualGatewayTlsValidationContextSdsTrust
+newVirtualGatewayTlsValidationContextSdsTrust
+  pSecretName_ =
+    VirtualGatewayTlsValidationContextSdsTrust'
+      { secretName =
+          pSecretName_
+      }
+
+-- | A reference to an object that represents the name of the secret for a
+-- virtual gateway\'s Transport Layer Security (TLS) Secret Discovery
+-- Service validation context trust.
+virtualGatewayTlsValidationContextSdsTrust_secretName :: Lens.Lens' VirtualGatewayTlsValidationContextSdsTrust Prelude.Text
+virtualGatewayTlsValidationContextSdsTrust_secretName = Lens.lens (\VirtualGatewayTlsValidationContextSdsTrust' {secretName} -> secretName) (\s@VirtualGatewayTlsValidationContextSdsTrust' {} a -> s {secretName = a} :: VirtualGatewayTlsValidationContextSdsTrust)
+
+instance
+  Data.FromJSON
+    VirtualGatewayTlsValidationContextSdsTrust
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayTlsValidationContextSdsTrust"
+      ( \x ->
+          VirtualGatewayTlsValidationContextSdsTrust'
+            Prelude.<$> (x Data..: "secretName")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayTlsValidationContextSdsTrust
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayTlsValidationContextSdsTrust' {..} =
+      _salt `Prelude.hashWithSalt` secretName
+
+instance
+  Prelude.NFData
+    VirtualGatewayTlsValidationContextSdsTrust
+  where
+  rnf VirtualGatewayTlsValidationContextSdsTrust' {..} =
+    Prelude.rnf secretName
+
+instance
+  Data.ToJSON
+    VirtualGatewayTlsValidationContextSdsTrust
+  where
+  toJSON
+    VirtualGatewayTlsValidationContextSdsTrust' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [Prelude.Just ("secretName" Data..= secretName)]
+        )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextTrust.hs b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextTrust.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualGatewayTlsValidationContextTrust.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextTrust
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextTrust where
+
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextAcmTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextFileTrust
+import Amazonka.AppMesh.Types.VirtualGatewayTlsValidationContextSdsTrust
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust.
+--
+-- /See:/ 'newVirtualGatewayTlsValidationContextTrust' smart constructor.
+data VirtualGatewayTlsValidationContextTrust = VirtualGatewayTlsValidationContextTrust'
+  { -- | A reference to an object that represents a Transport Layer Security
+    -- (TLS) validation context trust for an Certificate Manager certificate.
+    acm :: Prelude.Maybe VirtualGatewayTlsValidationContextAcmTrust,
+    -- | An object that represents a Transport Layer Security (TLS) validation
+    -- context trust for a local file.
+    file :: Prelude.Maybe VirtualGatewayTlsValidationContextFileTrust,
+    -- | A reference to an object that represents a virtual gateway\'s Transport
+    -- Layer Security (TLS) Secret Discovery Service validation context trust.
+    sds :: Prelude.Maybe VirtualGatewayTlsValidationContextSdsTrust
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualGatewayTlsValidationContextTrust' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acm', 'virtualGatewayTlsValidationContextTrust_acm' - A reference to an object that represents a Transport Layer Security
+-- (TLS) validation context trust for an Certificate Manager certificate.
+--
+-- 'file', 'virtualGatewayTlsValidationContextTrust_file' - An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+--
+-- 'sds', 'virtualGatewayTlsValidationContextTrust_sds' - A reference to an object that represents a virtual gateway\'s Transport
+-- Layer Security (TLS) Secret Discovery Service validation context trust.
+newVirtualGatewayTlsValidationContextTrust ::
+  VirtualGatewayTlsValidationContextTrust
+newVirtualGatewayTlsValidationContextTrust =
+  VirtualGatewayTlsValidationContextTrust'
+    { acm =
+        Prelude.Nothing,
+      file = Prelude.Nothing,
+      sds = Prelude.Nothing
+    }
+
+-- | A reference to an object that represents a Transport Layer Security
+-- (TLS) validation context trust for an Certificate Manager certificate.
+virtualGatewayTlsValidationContextTrust_acm :: Lens.Lens' VirtualGatewayTlsValidationContextTrust (Prelude.Maybe VirtualGatewayTlsValidationContextAcmTrust)
+virtualGatewayTlsValidationContextTrust_acm = Lens.lens (\VirtualGatewayTlsValidationContextTrust' {acm} -> acm) (\s@VirtualGatewayTlsValidationContextTrust' {} a -> s {acm = a} :: VirtualGatewayTlsValidationContextTrust)
+
+-- | An object that represents a Transport Layer Security (TLS) validation
+-- context trust for a local file.
+virtualGatewayTlsValidationContextTrust_file :: Lens.Lens' VirtualGatewayTlsValidationContextTrust (Prelude.Maybe VirtualGatewayTlsValidationContextFileTrust)
+virtualGatewayTlsValidationContextTrust_file = Lens.lens (\VirtualGatewayTlsValidationContextTrust' {file} -> file) (\s@VirtualGatewayTlsValidationContextTrust' {} a -> s {file = a} :: VirtualGatewayTlsValidationContextTrust)
+
+-- | A reference to an object that represents a virtual gateway\'s Transport
+-- Layer Security (TLS) Secret Discovery Service validation context trust.
+virtualGatewayTlsValidationContextTrust_sds :: Lens.Lens' VirtualGatewayTlsValidationContextTrust (Prelude.Maybe VirtualGatewayTlsValidationContextSdsTrust)
+virtualGatewayTlsValidationContextTrust_sds = Lens.lens (\VirtualGatewayTlsValidationContextTrust' {sds} -> sds) (\s@VirtualGatewayTlsValidationContextTrust' {} a -> s {sds = a} :: VirtualGatewayTlsValidationContextTrust)
+
+instance
+  Data.FromJSON
+    VirtualGatewayTlsValidationContextTrust
+  where
+  parseJSON =
+    Data.withObject
+      "VirtualGatewayTlsValidationContextTrust"
+      ( \x ->
+          VirtualGatewayTlsValidationContextTrust'
+            Prelude.<$> (x Data..:? "acm")
+            Prelude.<*> (x Data..:? "file")
+            Prelude.<*> (x Data..:? "sds")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualGatewayTlsValidationContextTrust
+  where
+  hashWithSalt
+    _salt
+    VirtualGatewayTlsValidationContextTrust' {..} =
+      _salt
+        `Prelude.hashWithSalt` acm
+        `Prelude.hashWithSalt` file
+        `Prelude.hashWithSalt` sds
+
+instance
+  Prelude.NFData
+    VirtualGatewayTlsValidationContextTrust
+  where
+  rnf VirtualGatewayTlsValidationContextTrust' {..} =
+    Prelude.rnf acm
+      `Prelude.seq` Prelude.rnf file
+      `Prelude.seq` Prelude.rnf sds
+
+instance
+  Data.ToJSON
+    VirtualGatewayTlsValidationContextTrust
+  where
+  toJSON VirtualGatewayTlsValidationContextTrust' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("acm" Data..=) Prelude.<$> acm,
+            ("file" Data..=) Prelude.<$> file,
+            ("sds" Data..=) Prelude.<$> sds
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeConnectionPool.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeConnectionPool where
+
+import Amazonka.AppMesh.Types.VirtualNodeGrpcConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeHttp2ConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeHttpConnectionPool
+import Amazonka.AppMesh.Types.VirtualNodeTcpConnectionPool
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the type of virtual node connection pool.
+--
+-- Only one protocol is used at a time and should be the same protocol as
+-- the one chosen under port mapping.
+--
+-- If not present the default value for @maxPendingRequests@ is
+-- @2147483647@.
+--
+-- /See:/ 'newVirtualNodeConnectionPool' smart constructor.
+data VirtualNodeConnectionPool = VirtualNodeConnectionPool'
+  { -- | An object that represents a type of connection pool.
+    grpc :: Prelude.Maybe VirtualNodeGrpcConnectionPool,
+    -- | An object that represents a type of connection pool.
+    http :: Prelude.Maybe VirtualNodeHttpConnectionPool,
+    -- | An object that represents a type of connection pool.
+    http2 :: Prelude.Maybe VirtualNodeHttp2ConnectionPool,
+    -- | An object that represents a type of connection pool.
+    tcp :: Prelude.Maybe VirtualNodeTcpConnectionPool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'grpc', 'virtualNodeConnectionPool_grpc' - An object that represents a type of connection pool.
+--
+-- 'http', 'virtualNodeConnectionPool_http' - An object that represents a type of connection pool.
+--
+-- 'http2', 'virtualNodeConnectionPool_http2' - An object that represents a type of connection pool.
+--
+-- 'tcp', 'virtualNodeConnectionPool_tcp' - An object that represents a type of connection pool.
+newVirtualNodeConnectionPool ::
+  VirtualNodeConnectionPool
+newVirtualNodeConnectionPool =
+  VirtualNodeConnectionPool'
+    { grpc = Prelude.Nothing,
+      http = Prelude.Nothing,
+      http2 = Prelude.Nothing,
+      tcp = Prelude.Nothing
+    }
+
+-- | An object that represents a type of connection pool.
+virtualNodeConnectionPool_grpc :: Lens.Lens' VirtualNodeConnectionPool (Prelude.Maybe VirtualNodeGrpcConnectionPool)
+virtualNodeConnectionPool_grpc = Lens.lens (\VirtualNodeConnectionPool' {grpc} -> grpc) (\s@VirtualNodeConnectionPool' {} a -> s {grpc = a} :: VirtualNodeConnectionPool)
+
+-- | An object that represents a type of connection pool.
+virtualNodeConnectionPool_http :: Lens.Lens' VirtualNodeConnectionPool (Prelude.Maybe VirtualNodeHttpConnectionPool)
+virtualNodeConnectionPool_http = Lens.lens (\VirtualNodeConnectionPool' {http} -> http) (\s@VirtualNodeConnectionPool' {} a -> s {http = a} :: VirtualNodeConnectionPool)
+
+-- | An object that represents a type of connection pool.
+virtualNodeConnectionPool_http2 :: Lens.Lens' VirtualNodeConnectionPool (Prelude.Maybe VirtualNodeHttp2ConnectionPool)
+virtualNodeConnectionPool_http2 = Lens.lens (\VirtualNodeConnectionPool' {http2} -> http2) (\s@VirtualNodeConnectionPool' {} a -> s {http2 = a} :: VirtualNodeConnectionPool)
+
+-- | An object that represents a type of connection pool.
+virtualNodeConnectionPool_tcp :: Lens.Lens' VirtualNodeConnectionPool (Prelude.Maybe VirtualNodeTcpConnectionPool)
+virtualNodeConnectionPool_tcp = Lens.lens (\VirtualNodeConnectionPool' {tcp} -> tcp) (\s@VirtualNodeConnectionPool' {} a -> s {tcp = a} :: VirtualNodeConnectionPool)
+
+instance Data.FromJSON VirtualNodeConnectionPool where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeConnectionPool"
+      ( \x ->
+          VirtualNodeConnectionPool'
+            Prelude.<$> (x Data..:? "grpc")
+            Prelude.<*> (x Data..:? "http")
+            Prelude.<*> (x Data..:? "http2")
+            Prelude.<*> (x Data..:? "tcp")
+      )
+
+instance Prelude.Hashable VirtualNodeConnectionPool where
+  hashWithSalt _salt VirtualNodeConnectionPool' {..} =
+    _salt
+      `Prelude.hashWithSalt` grpc
+      `Prelude.hashWithSalt` http
+      `Prelude.hashWithSalt` http2
+      `Prelude.hashWithSalt` tcp
+
+instance Prelude.NFData VirtualNodeConnectionPool where
+  rnf VirtualNodeConnectionPool' {..} =
+    Prelude.rnf grpc
+      `Prelude.seq` Prelude.rnf http
+      `Prelude.seq` Prelude.rnf http2
+      `Prelude.seq` Prelude.rnf tcp
+
+instance Data.ToJSON VirtualNodeConnectionPool where
+  toJSON VirtualNodeConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("grpc" Data..=) Prelude.<$> grpc,
+            ("http" Data..=) Prelude.<$> http,
+            ("http2" Data..=) Prelude.<$> http2,
+            ("tcp" Data..=) Prelude.<$> tcp
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeData.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeData.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeData where
+
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.VirtualNodeSpec
+import Amazonka.AppMesh.Types.VirtualNodeStatus
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual node returned by a describe
+-- operation.
+--
+-- /See:/ 'newVirtualNodeData' smart constructor.
+data VirtualNodeData = VirtualNodeData'
+  { -- | The name of the service mesh that the virtual node resides in.
+    meshName :: Prelude.Text,
+    -- | The associated metadata for the virtual node.
+    metadata :: ResourceMetadata,
+    -- | The specifications of the virtual node.
+    spec :: VirtualNodeSpec,
+    -- | The current status for the virtual node.
+    status :: VirtualNodeStatus,
+    -- | The name of the virtual node.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'virtualNodeData_meshName' - The name of the service mesh that the virtual node resides in.
+--
+-- 'metadata', 'virtualNodeData_metadata' - The associated metadata for the virtual node.
+--
+-- 'spec', 'virtualNodeData_spec' - The specifications of the virtual node.
+--
+-- 'status', 'virtualNodeData_status' - The current status for the virtual node.
+--
+-- 'virtualNodeName', 'virtualNodeData_virtualNodeName' - The name of the virtual node.
+newVirtualNodeData ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'spec'
+  VirtualNodeSpec ->
+  -- | 'status'
+  VirtualNodeStatus ->
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  VirtualNodeData
+newVirtualNodeData
+  pMeshName_
+  pMetadata_
+  pSpec_
+  pStatus_
+  pVirtualNodeName_ =
+    VirtualNodeData'
+      { meshName = pMeshName_,
+        metadata = pMetadata_,
+        spec = pSpec_,
+        status = pStatus_,
+        virtualNodeName = pVirtualNodeName_
+      }
+
+-- | The name of the service mesh that the virtual node resides in.
+virtualNodeData_meshName :: Lens.Lens' VirtualNodeData Prelude.Text
+virtualNodeData_meshName = Lens.lens (\VirtualNodeData' {meshName} -> meshName) (\s@VirtualNodeData' {} a -> s {meshName = a} :: VirtualNodeData)
+
+-- | The associated metadata for the virtual node.
+virtualNodeData_metadata :: Lens.Lens' VirtualNodeData ResourceMetadata
+virtualNodeData_metadata = Lens.lens (\VirtualNodeData' {metadata} -> metadata) (\s@VirtualNodeData' {} a -> s {metadata = a} :: VirtualNodeData)
+
+-- | The specifications of the virtual node.
+virtualNodeData_spec :: Lens.Lens' VirtualNodeData VirtualNodeSpec
+virtualNodeData_spec = Lens.lens (\VirtualNodeData' {spec} -> spec) (\s@VirtualNodeData' {} a -> s {spec = a} :: VirtualNodeData)
+
+-- | The current status for the virtual node.
+virtualNodeData_status :: Lens.Lens' VirtualNodeData VirtualNodeStatus
+virtualNodeData_status = Lens.lens (\VirtualNodeData' {status} -> status) (\s@VirtualNodeData' {} a -> s {status = a} :: VirtualNodeData)
+
+-- | The name of the virtual node.
+virtualNodeData_virtualNodeName :: Lens.Lens' VirtualNodeData Prelude.Text
+virtualNodeData_virtualNodeName = Lens.lens (\VirtualNodeData' {virtualNodeName} -> virtualNodeName) (\s@VirtualNodeData' {} a -> s {virtualNodeName = a} :: VirtualNodeData)
+
+instance Data.FromJSON VirtualNodeData where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeData"
+      ( \x ->
+          VirtualNodeData'
+            Prelude.<$> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "virtualNodeName")
+      )
+
+instance Prelude.Hashable VirtualNodeData where
+  hashWithSalt _salt VirtualNodeData' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData VirtualNodeData where
+  rnf VirtualNodeData' {..} =
+    Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf virtualNodeName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeGrpcConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeGrpcConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeGrpcConnectionPool.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeGrpcConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeGrpcConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualNodeGrpcConnectionPool' smart constructor.
+data VirtualNodeGrpcConnectionPool = VirtualNodeGrpcConnectionPool'
+  { -- | Maximum number of inflight requests Envoy can concurrently support
+    -- across hosts in upstream cluster.
+    maxRequests :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeGrpcConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxRequests', 'virtualNodeGrpcConnectionPool_maxRequests' - Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+newVirtualNodeGrpcConnectionPool ::
+  -- | 'maxRequests'
+  Prelude.Natural ->
+  VirtualNodeGrpcConnectionPool
+newVirtualNodeGrpcConnectionPool pMaxRequests_ =
+  VirtualNodeGrpcConnectionPool'
+    { maxRequests =
+        pMaxRequests_
+    }
+
+-- | Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+virtualNodeGrpcConnectionPool_maxRequests :: Lens.Lens' VirtualNodeGrpcConnectionPool Prelude.Natural
+virtualNodeGrpcConnectionPool_maxRequests = Lens.lens (\VirtualNodeGrpcConnectionPool' {maxRequests} -> maxRequests) (\s@VirtualNodeGrpcConnectionPool' {} a -> s {maxRequests = a} :: VirtualNodeGrpcConnectionPool)
+
+instance Data.FromJSON VirtualNodeGrpcConnectionPool where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeGrpcConnectionPool"
+      ( \x ->
+          VirtualNodeGrpcConnectionPool'
+            Prelude.<$> (x Data..: "maxRequests")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualNodeGrpcConnectionPool
+  where
+  hashWithSalt _salt VirtualNodeGrpcConnectionPool' {..} =
+    _salt `Prelude.hashWithSalt` maxRequests
+
+instance Prelude.NFData VirtualNodeGrpcConnectionPool where
+  rnf VirtualNodeGrpcConnectionPool' {..} =
+    Prelude.rnf maxRequests
+
+instance Data.ToJSON VirtualNodeGrpcConnectionPool where
+  toJSON VirtualNodeGrpcConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("maxRequests" Data..= maxRequests)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeHttp2ConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeHttp2ConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeHttp2ConnectionPool.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeHttp2ConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeHttp2ConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualNodeHttp2ConnectionPool' smart constructor.
+data VirtualNodeHttp2ConnectionPool = VirtualNodeHttp2ConnectionPool'
+  { -- | Maximum number of inflight requests Envoy can concurrently support
+    -- across hosts in upstream cluster.
+    maxRequests :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeHttp2ConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxRequests', 'virtualNodeHttp2ConnectionPool_maxRequests' - Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+newVirtualNodeHttp2ConnectionPool ::
+  -- | 'maxRequests'
+  Prelude.Natural ->
+  VirtualNodeHttp2ConnectionPool
+newVirtualNodeHttp2ConnectionPool pMaxRequests_ =
+  VirtualNodeHttp2ConnectionPool'
+    { maxRequests =
+        pMaxRequests_
+    }
+
+-- | Maximum number of inflight requests Envoy can concurrently support
+-- across hosts in upstream cluster.
+virtualNodeHttp2ConnectionPool_maxRequests :: Lens.Lens' VirtualNodeHttp2ConnectionPool Prelude.Natural
+virtualNodeHttp2ConnectionPool_maxRequests = Lens.lens (\VirtualNodeHttp2ConnectionPool' {maxRequests} -> maxRequests) (\s@VirtualNodeHttp2ConnectionPool' {} a -> s {maxRequests = a} :: VirtualNodeHttp2ConnectionPool)
+
+instance Data.FromJSON VirtualNodeHttp2ConnectionPool where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeHttp2ConnectionPool"
+      ( \x ->
+          VirtualNodeHttp2ConnectionPool'
+            Prelude.<$> (x Data..: "maxRequests")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualNodeHttp2ConnectionPool
+  where
+  hashWithSalt
+    _salt
+    VirtualNodeHttp2ConnectionPool' {..} =
+      _salt `Prelude.hashWithSalt` maxRequests
+
+instance
+  Prelude.NFData
+    VirtualNodeHttp2ConnectionPool
+  where
+  rnf VirtualNodeHttp2ConnectionPool' {..} =
+    Prelude.rnf maxRequests
+
+instance Data.ToJSON VirtualNodeHttp2ConnectionPool where
+  toJSON VirtualNodeHttp2ConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("maxRequests" Data..= maxRequests)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeHttpConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeHttpConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeHttpConnectionPool.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeHttpConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeHttpConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualNodeHttpConnectionPool' smart constructor.
+data VirtualNodeHttpConnectionPool = VirtualNodeHttpConnectionPool'
+  { -- | Number of overflowing requests after @max_connections@ Envoy will queue
+    -- to upstream cluster.
+    maxPendingRequests :: Prelude.Maybe Prelude.Natural,
+    -- | Maximum number of outbound TCP connections Envoy can establish
+    -- concurrently with all hosts in upstream cluster.
+    maxConnections :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeHttpConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxPendingRequests', 'virtualNodeHttpConnectionPool_maxPendingRequests' - Number of overflowing requests after @max_connections@ Envoy will queue
+-- to upstream cluster.
+--
+-- 'maxConnections', 'virtualNodeHttpConnectionPool_maxConnections' - Maximum number of outbound TCP connections Envoy can establish
+-- concurrently with all hosts in upstream cluster.
+newVirtualNodeHttpConnectionPool ::
+  -- | 'maxConnections'
+  Prelude.Natural ->
+  VirtualNodeHttpConnectionPool
+newVirtualNodeHttpConnectionPool pMaxConnections_ =
+  VirtualNodeHttpConnectionPool'
+    { maxPendingRequests =
+        Prelude.Nothing,
+      maxConnections = pMaxConnections_
+    }
+
+-- | Number of overflowing requests after @max_connections@ Envoy will queue
+-- to upstream cluster.
+virtualNodeHttpConnectionPool_maxPendingRequests :: Lens.Lens' VirtualNodeHttpConnectionPool (Prelude.Maybe Prelude.Natural)
+virtualNodeHttpConnectionPool_maxPendingRequests = Lens.lens (\VirtualNodeHttpConnectionPool' {maxPendingRequests} -> maxPendingRequests) (\s@VirtualNodeHttpConnectionPool' {} a -> s {maxPendingRequests = a} :: VirtualNodeHttpConnectionPool)
+
+-- | Maximum number of outbound TCP connections Envoy can establish
+-- concurrently with all hosts in upstream cluster.
+virtualNodeHttpConnectionPool_maxConnections :: Lens.Lens' VirtualNodeHttpConnectionPool Prelude.Natural
+virtualNodeHttpConnectionPool_maxConnections = Lens.lens (\VirtualNodeHttpConnectionPool' {maxConnections} -> maxConnections) (\s@VirtualNodeHttpConnectionPool' {} a -> s {maxConnections = a} :: VirtualNodeHttpConnectionPool)
+
+instance Data.FromJSON VirtualNodeHttpConnectionPool where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeHttpConnectionPool"
+      ( \x ->
+          VirtualNodeHttpConnectionPool'
+            Prelude.<$> (x Data..:? "maxPendingRequests")
+            Prelude.<*> (x Data..: "maxConnections")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualNodeHttpConnectionPool
+  where
+  hashWithSalt _salt VirtualNodeHttpConnectionPool' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxPendingRequests
+      `Prelude.hashWithSalt` maxConnections
+
+instance Prelude.NFData VirtualNodeHttpConnectionPool where
+  rnf VirtualNodeHttpConnectionPool' {..} =
+    Prelude.rnf maxPendingRequests
+      `Prelude.seq` Prelude.rnf maxConnections
+
+instance Data.ToJSON VirtualNodeHttpConnectionPool where
+  toJSON VirtualNodeHttpConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxPendingRequests" Data..=)
+              Prelude.<$> maxPendingRequests,
+            Prelude.Just
+              ("maxConnections" Data..= maxConnections)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeRef.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeRef.hs
@@ -0,0 +1,207 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual node returned by a list operation.
+--
+-- /See:/ 'newVirtualNodeRef' smart constructor.
+data VirtualNodeRef = VirtualNodeRef'
+  { -- | The full Amazon Resource Name (ARN) for the virtual node.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh that the virtual node resides in.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer,
+    -- | The name of the virtual node.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'virtualNodeRef_arn' - The full Amazon Resource Name (ARN) for the virtual node.
+--
+-- 'createdAt', 'virtualNodeRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'virtualNodeRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'virtualNodeRef_meshName' - The name of the service mesh that the virtual node resides in.
+--
+-- 'meshOwner', 'virtualNodeRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'virtualNodeRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'version', 'virtualNodeRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+--
+-- 'virtualNodeName', 'virtualNodeRef_virtualNodeName' - The name of the virtual node.
+newVirtualNodeRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  VirtualNodeRef
+newVirtualNodeRef
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pVersion_
+  pVirtualNodeName_ =
+    VirtualNodeRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        version = pVersion_,
+        virtualNodeName = pVirtualNodeName_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the virtual node.
+virtualNodeRef_arn :: Lens.Lens' VirtualNodeRef Prelude.Text
+virtualNodeRef_arn = Lens.lens (\VirtualNodeRef' {arn} -> arn) (\s@VirtualNodeRef' {} a -> s {arn = a} :: VirtualNodeRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+virtualNodeRef_createdAt :: Lens.Lens' VirtualNodeRef Prelude.UTCTime
+virtualNodeRef_createdAt = Lens.lens (\VirtualNodeRef' {createdAt} -> createdAt) (\s@VirtualNodeRef' {} a -> s {createdAt = a} :: VirtualNodeRef) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+virtualNodeRef_lastUpdatedAt :: Lens.Lens' VirtualNodeRef Prelude.UTCTime
+virtualNodeRef_lastUpdatedAt = Lens.lens (\VirtualNodeRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@VirtualNodeRef' {} a -> s {lastUpdatedAt = a} :: VirtualNodeRef) Prelude.. Data._Time
+
+-- | The name of the service mesh that the virtual node resides in.
+virtualNodeRef_meshName :: Lens.Lens' VirtualNodeRef Prelude.Text
+virtualNodeRef_meshName = Lens.lens (\VirtualNodeRef' {meshName} -> meshName) (\s@VirtualNodeRef' {} a -> s {meshName = a} :: VirtualNodeRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualNodeRef_meshOwner :: Lens.Lens' VirtualNodeRef Prelude.Text
+virtualNodeRef_meshOwner = Lens.lens (\VirtualNodeRef' {meshOwner} -> meshOwner) (\s@VirtualNodeRef' {} a -> s {meshOwner = a} :: VirtualNodeRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualNodeRef_resourceOwner :: Lens.Lens' VirtualNodeRef Prelude.Text
+virtualNodeRef_resourceOwner = Lens.lens (\VirtualNodeRef' {resourceOwner} -> resourceOwner) (\s@VirtualNodeRef' {} a -> s {resourceOwner = a} :: VirtualNodeRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+virtualNodeRef_version :: Lens.Lens' VirtualNodeRef Prelude.Integer
+virtualNodeRef_version = Lens.lens (\VirtualNodeRef' {version} -> version) (\s@VirtualNodeRef' {} a -> s {version = a} :: VirtualNodeRef)
+
+-- | The name of the virtual node.
+virtualNodeRef_virtualNodeName :: Lens.Lens' VirtualNodeRef Prelude.Text
+virtualNodeRef_virtualNodeName = Lens.lens (\VirtualNodeRef' {virtualNodeName} -> virtualNodeName) (\s@VirtualNodeRef' {} a -> s {virtualNodeName = a} :: VirtualNodeRef)
+
+instance Data.FromJSON VirtualNodeRef where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeRef"
+      ( \x ->
+          VirtualNodeRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "version")
+            Prelude.<*> (x Data..: "virtualNodeName")
+      )
+
+instance Prelude.Hashable VirtualNodeRef where
+  hashWithSalt _salt VirtualNodeRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` version
+      `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData VirtualNodeRef where
+  rnf VirtualNodeRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf virtualNodeName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeServiceProvider.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeServiceProvider.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeServiceProvider.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeServiceProvider
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeServiceProvider where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual node service provider.
+--
+-- /See:/ 'newVirtualNodeServiceProvider' smart constructor.
+data VirtualNodeServiceProvider = VirtualNodeServiceProvider'
+  { -- | The name of the virtual node that is acting as a service provider.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeServiceProvider' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'virtualNodeName', 'virtualNodeServiceProvider_virtualNodeName' - The name of the virtual node that is acting as a service provider.
+newVirtualNodeServiceProvider ::
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  VirtualNodeServiceProvider
+newVirtualNodeServiceProvider pVirtualNodeName_ =
+  VirtualNodeServiceProvider'
+    { virtualNodeName =
+        pVirtualNodeName_
+    }
+
+-- | The name of the virtual node that is acting as a service provider.
+virtualNodeServiceProvider_virtualNodeName :: Lens.Lens' VirtualNodeServiceProvider Prelude.Text
+virtualNodeServiceProvider_virtualNodeName = Lens.lens (\VirtualNodeServiceProvider' {virtualNodeName} -> virtualNodeName) (\s@VirtualNodeServiceProvider' {} a -> s {virtualNodeName = a} :: VirtualNodeServiceProvider)
+
+instance Data.FromJSON VirtualNodeServiceProvider where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeServiceProvider"
+      ( \x ->
+          VirtualNodeServiceProvider'
+            Prelude.<$> (x Data..: "virtualNodeName")
+      )
+
+instance Prelude.Hashable VirtualNodeServiceProvider where
+  hashWithSalt _salt VirtualNodeServiceProvider' {..} =
+    _salt `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData VirtualNodeServiceProvider where
+  rnf VirtualNodeServiceProvider' {..} =
+    Prelude.rnf virtualNodeName
+
+instance Data.ToJSON VirtualNodeServiceProvider where
+  toJSON VirtualNodeServiceProvider' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("virtualNodeName" Data..= virtualNodeName)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeSpec.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeSpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeSpec.hs
@@ -0,0 +1,157 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeSpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeSpec where
+
+import Amazonka.AppMesh.Types.Backend
+import Amazonka.AppMesh.Types.BackendDefaults
+import Amazonka.AppMesh.Types.Listener
+import Amazonka.AppMesh.Types.Logging
+import Amazonka.AppMesh.Types.ServiceDiscovery
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the specification of a virtual node.
+--
+-- /See:/ 'newVirtualNodeSpec' smart constructor.
+data VirtualNodeSpec = VirtualNodeSpec'
+  { -- | A reference to an object that represents the defaults for backends.
+    backendDefaults :: Prelude.Maybe BackendDefaults,
+    -- | The backends that the virtual node is expected to send outbound traffic
+    -- to.
+    backends :: Prelude.Maybe [Backend],
+    -- | The listener that the virtual node is expected to receive inbound
+    -- traffic from. You can specify one listener.
+    listeners :: Prelude.Maybe [Listener],
+    -- | The inbound and outbound access logging information for the virtual
+    -- node.
+    logging :: Prelude.Maybe Logging,
+    -- | The service discovery information for the virtual node. If your virtual
+    -- node does not expect ingress traffic, you can omit this parameter. If
+    -- you specify a @listener@, then you must specify service discovery
+    -- information.
+    serviceDiscovery :: Prelude.Maybe ServiceDiscovery
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeSpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'backendDefaults', 'virtualNodeSpec_backendDefaults' - A reference to an object that represents the defaults for backends.
+--
+-- 'backends', 'virtualNodeSpec_backends' - The backends that the virtual node is expected to send outbound traffic
+-- to.
+--
+-- 'listeners', 'virtualNodeSpec_listeners' - The listener that the virtual node is expected to receive inbound
+-- traffic from. You can specify one listener.
+--
+-- 'logging', 'virtualNodeSpec_logging' - The inbound and outbound access logging information for the virtual
+-- node.
+--
+-- 'serviceDiscovery', 'virtualNodeSpec_serviceDiscovery' - The service discovery information for the virtual node. If your virtual
+-- node does not expect ingress traffic, you can omit this parameter. If
+-- you specify a @listener@, then you must specify service discovery
+-- information.
+newVirtualNodeSpec ::
+  VirtualNodeSpec
+newVirtualNodeSpec =
+  VirtualNodeSpec'
+    { backendDefaults = Prelude.Nothing,
+      backends = Prelude.Nothing,
+      listeners = Prelude.Nothing,
+      logging = Prelude.Nothing,
+      serviceDiscovery = Prelude.Nothing
+    }
+
+-- | A reference to an object that represents the defaults for backends.
+virtualNodeSpec_backendDefaults :: Lens.Lens' VirtualNodeSpec (Prelude.Maybe BackendDefaults)
+virtualNodeSpec_backendDefaults = Lens.lens (\VirtualNodeSpec' {backendDefaults} -> backendDefaults) (\s@VirtualNodeSpec' {} a -> s {backendDefaults = a} :: VirtualNodeSpec)
+
+-- | The backends that the virtual node is expected to send outbound traffic
+-- to.
+virtualNodeSpec_backends :: Lens.Lens' VirtualNodeSpec (Prelude.Maybe [Backend])
+virtualNodeSpec_backends = Lens.lens (\VirtualNodeSpec' {backends} -> backends) (\s@VirtualNodeSpec' {} a -> s {backends = a} :: VirtualNodeSpec) Prelude.. Lens.mapping Lens.coerced
+
+-- | The listener that the virtual node is expected to receive inbound
+-- traffic from. You can specify one listener.
+virtualNodeSpec_listeners :: Lens.Lens' VirtualNodeSpec (Prelude.Maybe [Listener])
+virtualNodeSpec_listeners = Lens.lens (\VirtualNodeSpec' {listeners} -> listeners) (\s@VirtualNodeSpec' {} a -> s {listeners = a} :: VirtualNodeSpec) Prelude.. Lens.mapping Lens.coerced
+
+-- | The inbound and outbound access logging information for the virtual
+-- node.
+virtualNodeSpec_logging :: Lens.Lens' VirtualNodeSpec (Prelude.Maybe Logging)
+virtualNodeSpec_logging = Lens.lens (\VirtualNodeSpec' {logging} -> logging) (\s@VirtualNodeSpec' {} a -> s {logging = a} :: VirtualNodeSpec)
+
+-- | The service discovery information for the virtual node. If your virtual
+-- node does not expect ingress traffic, you can omit this parameter. If
+-- you specify a @listener@, then you must specify service discovery
+-- information.
+virtualNodeSpec_serviceDiscovery :: Lens.Lens' VirtualNodeSpec (Prelude.Maybe ServiceDiscovery)
+virtualNodeSpec_serviceDiscovery = Lens.lens (\VirtualNodeSpec' {serviceDiscovery} -> serviceDiscovery) (\s@VirtualNodeSpec' {} a -> s {serviceDiscovery = a} :: VirtualNodeSpec)
+
+instance Data.FromJSON VirtualNodeSpec where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeSpec"
+      ( \x ->
+          VirtualNodeSpec'
+            Prelude.<$> (x Data..:? "backendDefaults")
+            Prelude.<*> (x Data..:? "backends" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "listeners" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "logging")
+            Prelude.<*> (x Data..:? "serviceDiscovery")
+      )
+
+instance Prelude.Hashable VirtualNodeSpec where
+  hashWithSalt _salt VirtualNodeSpec' {..} =
+    _salt
+      `Prelude.hashWithSalt` backendDefaults
+      `Prelude.hashWithSalt` backends
+      `Prelude.hashWithSalt` listeners
+      `Prelude.hashWithSalt` logging
+      `Prelude.hashWithSalt` serviceDiscovery
+
+instance Prelude.NFData VirtualNodeSpec where
+  rnf VirtualNodeSpec' {..} =
+    Prelude.rnf backendDefaults
+      `Prelude.seq` Prelude.rnf backends
+      `Prelude.seq` Prelude.rnf listeners
+      `Prelude.seq` Prelude.rnf logging
+      `Prelude.seq` Prelude.rnf serviceDiscovery
+
+instance Data.ToJSON VirtualNodeSpec where
+  toJSON VirtualNodeSpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("backendDefaults" Data..=)
+              Prelude.<$> backendDefaults,
+            ("backends" Data..=) Prelude.<$> backends,
+            ("listeners" Data..=) Prelude.<$> listeners,
+            ("logging" Data..=) Prelude.<$> logging,
+            ("serviceDiscovery" Data..=)
+              Prelude.<$> serviceDiscovery
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeStatus.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeStatus.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeStatus where
+
+import Amazonka.AppMesh.Types.VirtualNodeStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the current status of the virtual node.
+--
+-- /See:/ 'newVirtualNodeStatus' smart constructor.
+data VirtualNodeStatus = VirtualNodeStatus'
+  { -- | The current status of the virtual node.
+    status :: VirtualNodeStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'virtualNodeStatus_status' - The current status of the virtual node.
+newVirtualNodeStatus ::
+  -- | 'status'
+  VirtualNodeStatusCode ->
+  VirtualNodeStatus
+newVirtualNodeStatus pStatus_ =
+  VirtualNodeStatus' {status = pStatus_}
+
+-- | The current status of the virtual node.
+virtualNodeStatus_status :: Lens.Lens' VirtualNodeStatus VirtualNodeStatusCode
+virtualNodeStatus_status = Lens.lens (\VirtualNodeStatus' {status} -> status) (\s@VirtualNodeStatus' {} a -> s {status = a} :: VirtualNodeStatus)
+
+instance Data.FromJSON VirtualNodeStatus where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeStatus"
+      ( \x ->
+          VirtualNodeStatus' Prelude.<$> (x Data..: "status")
+      )
+
+instance Prelude.Hashable VirtualNodeStatus where
+  hashWithSalt _salt VirtualNodeStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData VirtualNodeStatus where
+  rnf VirtualNodeStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeStatusCode.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeStatusCode
+  ( VirtualNodeStatusCode
+      ( ..,
+        VirtualNodeStatusCode_ACTIVE,
+        VirtualNodeStatusCode_DELETED,
+        VirtualNodeStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualNodeStatusCode = VirtualNodeStatusCode'
+  { fromVirtualNodeStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VirtualNodeStatusCode_ACTIVE :: VirtualNodeStatusCode
+pattern VirtualNodeStatusCode_ACTIVE = VirtualNodeStatusCode' "ACTIVE"
+
+pattern VirtualNodeStatusCode_DELETED :: VirtualNodeStatusCode
+pattern VirtualNodeStatusCode_DELETED = VirtualNodeStatusCode' "DELETED"
+
+pattern VirtualNodeStatusCode_INACTIVE :: VirtualNodeStatusCode
+pattern VirtualNodeStatusCode_INACTIVE = VirtualNodeStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  VirtualNodeStatusCode_ACTIVE,
+  VirtualNodeStatusCode_DELETED,
+  VirtualNodeStatusCode_INACTIVE,
+  VirtualNodeStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/VirtualNodeTcpConnectionPool.hs b/gen/Amazonka/AppMesh/Types/VirtualNodeTcpConnectionPool.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualNodeTcpConnectionPool.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualNodeTcpConnectionPool
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualNodeTcpConnectionPool where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a type of connection pool.
+--
+-- /See:/ 'newVirtualNodeTcpConnectionPool' smart constructor.
+data VirtualNodeTcpConnectionPool = VirtualNodeTcpConnectionPool'
+  { -- | Maximum number of outbound TCP connections Envoy can establish
+    -- concurrently with all hosts in upstream cluster.
+    maxConnections :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualNodeTcpConnectionPool' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxConnections', 'virtualNodeTcpConnectionPool_maxConnections' - Maximum number of outbound TCP connections Envoy can establish
+-- concurrently with all hosts in upstream cluster.
+newVirtualNodeTcpConnectionPool ::
+  -- | 'maxConnections'
+  Prelude.Natural ->
+  VirtualNodeTcpConnectionPool
+newVirtualNodeTcpConnectionPool pMaxConnections_ =
+  VirtualNodeTcpConnectionPool'
+    { maxConnections =
+        pMaxConnections_
+    }
+
+-- | Maximum number of outbound TCP connections Envoy can establish
+-- concurrently with all hosts in upstream cluster.
+virtualNodeTcpConnectionPool_maxConnections :: Lens.Lens' VirtualNodeTcpConnectionPool Prelude.Natural
+virtualNodeTcpConnectionPool_maxConnections = Lens.lens (\VirtualNodeTcpConnectionPool' {maxConnections} -> maxConnections) (\s@VirtualNodeTcpConnectionPool' {} a -> s {maxConnections = a} :: VirtualNodeTcpConnectionPool)
+
+instance Data.FromJSON VirtualNodeTcpConnectionPool where
+  parseJSON =
+    Data.withObject
+      "VirtualNodeTcpConnectionPool"
+      ( \x ->
+          VirtualNodeTcpConnectionPool'
+            Prelude.<$> (x Data..: "maxConnections")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualNodeTcpConnectionPool
+  where
+  hashWithSalt _salt VirtualNodeTcpConnectionPool' {..} =
+    _salt `Prelude.hashWithSalt` maxConnections
+
+instance Prelude.NFData VirtualNodeTcpConnectionPool where
+  rnf VirtualNodeTcpConnectionPool' {..} =
+    Prelude.rnf maxConnections
+
+instance Data.ToJSON VirtualNodeTcpConnectionPool where
+  toJSON VirtualNodeTcpConnectionPool' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("maxConnections" Data..= maxConnections)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterData.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterData.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterData where
+
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.VirtualRouterSpec
+import Amazonka.AppMesh.Types.VirtualRouterStatus
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual router returned by a describe
+-- operation.
+--
+-- /See:/ 'newVirtualRouterData' smart constructor.
+data VirtualRouterData = VirtualRouterData'
+  { -- | The name of the service mesh that the virtual router resides in.
+    meshName :: Prelude.Text,
+    -- | The associated metadata for the virtual router.
+    metadata :: ResourceMetadata,
+    -- | The specifications of the virtual router.
+    spec :: VirtualRouterSpec,
+    -- | The current status of the virtual router.
+    status :: VirtualRouterStatus,
+    -- | The name of the virtual router.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualRouterData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'virtualRouterData_meshName' - The name of the service mesh that the virtual router resides in.
+--
+-- 'metadata', 'virtualRouterData_metadata' - The associated metadata for the virtual router.
+--
+-- 'spec', 'virtualRouterData_spec' - The specifications of the virtual router.
+--
+-- 'status', 'virtualRouterData_status' - The current status of the virtual router.
+--
+-- 'virtualRouterName', 'virtualRouterData_virtualRouterName' - The name of the virtual router.
+newVirtualRouterData ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'spec'
+  VirtualRouterSpec ->
+  -- | 'status'
+  VirtualRouterStatus ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  VirtualRouterData
+newVirtualRouterData
+  pMeshName_
+  pMetadata_
+  pSpec_
+  pStatus_
+  pVirtualRouterName_ =
+    VirtualRouterData'
+      { meshName = pMeshName_,
+        metadata = pMetadata_,
+        spec = pSpec_,
+        status = pStatus_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The name of the service mesh that the virtual router resides in.
+virtualRouterData_meshName :: Lens.Lens' VirtualRouterData Prelude.Text
+virtualRouterData_meshName = Lens.lens (\VirtualRouterData' {meshName} -> meshName) (\s@VirtualRouterData' {} a -> s {meshName = a} :: VirtualRouterData)
+
+-- | The associated metadata for the virtual router.
+virtualRouterData_metadata :: Lens.Lens' VirtualRouterData ResourceMetadata
+virtualRouterData_metadata = Lens.lens (\VirtualRouterData' {metadata} -> metadata) (\s@VirtualRouterData' {} a -> s {metadata = a} :: VirtualRouterData)
+
+-- | The specifications of the virtual router.
+virtualRouterData_spec :: Lens.Lens' VirtualRouterData VirtualRouterSpec
+virtualRouterData_spec = Lens.lens (\VirtualRouterData' {spec} -> spec) (\s@VirtualRouterData' {} a -> s {spec = a} :: VirtualRouterData)
+
+-- | The current status of the virtual router.
+virtualRouterData_status :: Lens.Lens' VirtualRouterData VirtualRouterStatus
+virtualRouterData_status = Lens.lens (\VirtualRouterData' {status} -> status) (\s@VirtualRouterData' {} a -> s {status = a} :: VirtualRouterData)
+
+-- | The name of the virtual router.
+virtualRouterData_virtualRouterName :: Lens.Lens' VirtualRouterData Prelude.Text
+virtualRouterData_virtualRouterName = Lens.lens (\VirtualRouterData' {virtualRouterName} -> virtualRouterName) (\s@VirtualRouterData' {} a -> s {virtualRouterName = a} :: VirtualRouterData)
+
+instance Data.FromJSON VirtualRouterData where
+  parseJSON =
+    Data.withObject
+      "VirtualRouterData"
+      ( \x ->
+          VirtualRouterData'
+            Prelude.<$> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "virtualRouterName")
+      )
+
+instance Prelude.Hashable VirtualRouterData where
+  hashWithSalt _salt VirtualRouterData' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData VirtualRouterData where
+  rnf VirtualRouterData' {..} =
+    Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf virtualRouterName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterListener.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterListener.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterListener.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterListener
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterListener where
+
+import Amazonka.AppMesh.Types.PortMapping
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual router listener.
+--
+-- /See:/ 'newVirtualRouterListener' smart constructor.
+data VirtualRouterListener = VirtualRouterListener'
+  { portMapping :: PortMapping
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualRouterListener' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'portMapping', 'virtualRouterListener_portMapping' - Undocumented member.
+newVirtualRouterListener ::
+  -- | 'portMapping'
+  PortMapping ->
+  VirtualRouterListener
+newVirtualRouterListener pPortMapping_ =
+  VirtualRouterListener' {portMapping = pPortMapping_}
+
+-- | Undocumented member.
+virtualRouterListener_portMapping :: Lens.Lens' VirtualRouterListener PortMapping
+virtualRouterListener_portMapping = Lens.lens (\VirtualRouterListener' {portMapping} -> portMapping) (\s@VirtualRouterListener' {} a -> s {portMapping = a} :: VirtualRouterListener)
+
+instance Data.FromJSON VirtualRouterListener where
+  parseJSON =
+    Data.withObject
+      "VirtualRouterListener"
+      ( \x ->
+          VirtualRouterListener'
+            Prelude.<$> (x Data..: "portMapping")
+      )
+
+instance Prelude.Hashable VirtualRouterListener where
+  hashWithSalt _salt VirtualRouterListener' {..} =
+    _salt `Prelude.hashWithSalt` portMapping
+
+instance Prelude.NFData VirtualRouterListener where
+  rnf VirtualRouterListener' {..} =
+    Prelude.rnf portMapping
+
+instance Data.ToJSON VirtualRouterListener where
+  toJSON VirtualRouterListener' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("portMapping" Data..= portMapping)]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterRef.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterRef.hs
@@ -0,0 +1,207 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual router returned by a list operation.
+--
+-- /See:/ 'newVirtualRouterRef' smart constructor.
+data VirtualRouterRef = VirtualRouterRef'
+  { -- | The full Amazon Resource Name (ARN) for the virtual router.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh that the virtual router resides in.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer,
+    -- | The name of the virtual router.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualRouterRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'virtualRouterRef_arn' - The full Amazon Resource Name (ARN) for the virtual router.
+--
+-- 'createdAt', 'virtualRouterRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'virtualRouterRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'virtualRouterRef_meshName' - The name of the service mesh that the virtual router resides in.
+--
+-- 'meshOwner', 'virtualRouterRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'virtualRouterRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'version', 'virtualRouterRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+--
+-- 'virtualRouterName', 'virtualRouterRef_virtualRouterName' - The name of the virtual router.
+newVirtualRouterRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  VirtualRouterRef
+newVirtualRouterRef
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pVersion_
+  pVirtualRouterName_ =
+    VirtualRouterRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        version = pVersion_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the virtual router.
+virtualRouterRef_arn :: Lens.Lens' VirtualRouterRef Prelude.Text
+virtualRouterRef_arn = Lens.lens (\VirtualRouterRef' {arn} -> arn) (\s@VirtualRouterRef' {} a -> s {arn = a} :: VirtualRouterRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+virtualRouterRef_createdAt :: Lens.Lens' VirtualRouterRef Prelude.UTCTime
+virtualRouterRef_createdAt = Lens.lens (\VirtualRouterRef' {createdAt} -> createdAt) (\s@VirtualRouterRef' {} a -> s {createdAt = a} :: VirtualRouterRef) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+virtualRouterRef_lastUpdatedAt :: Lens.Lens' VirtualRouterRef Prelude.UTCTime
+virtualRouterRef_lastUpdatedAt = Lens.lens (\VirtualRouterRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@VirtualRouterRef' {} a -> s {lastUpdatedAt = a} :: VirtualRouterRef) Prelude.. Data._Time
+
+-- | The name of the service mesh that the virtual router resides in.
+virtualRouterRef_meshName :: Lens.Lens' VirtualRouterRef Prelude.Text
+virtualRouterRef_meshName = Lens.lens (\VirtualRouterRef' {meshName} -> meshName) (\s@VirtualRouterRef' {} a -> s {meshName = a} :: VirtualRouterRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualRouterRef_meshOwner :: Lens.Lens' VirtualRouterRef Prelude.Text
+virtualRouterRef_meshOwner = Lens.lens (\VirtualRouterRef' {meshOwner} -> meshOwner) (\s@VirtualRouterRef' {} a -> s {meshOwner = a} :: VirtualRouterRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualRouterRef_resourceOwner :: Lens.Lens' VirtualRouterRef Prelude.Text
+virtualRouterRef_resourceOwner = Lens.lens (\VirtualRouterRef' {resourceOwner} -> resourceOwner) (\s@VirtualRouterRef' {} a -> s {resourceOwner = a} :: VirtualRouterRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+virtualRouterRef_version :: Lens.Lens' VirtualRouterRef Prelude.Integer
+virtualRouterRef_version = Lens.lens (\VirtualRouterRef' {version} -> version) (\s@VirtualRouterRef' {} a -> s {version = a} :: VirtualRouterRef)
+
+-- | The name of the virtual router.
+virtualRouterRef_virtualRouterName :: Lens.Lens' VirtualRouterRef Prelude.Text
+virtualRouterRef_virtualRouterName = Lens.lens (\VirtualRouterRef' {virtualRouterName} -> virtualRouterName) (\s@VirtualRouterRef' {} a -> s {virtualRouterName = a} :: VirtualRouterRef)
+
+instance Data.FromJSON VirtualRouterRef where
+  parseJSON =
+    Data.withObject
+      "VirtualRouterRef"
+      ( \x ->
+          VirtualRouterRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "version")
+            Prelude.<*> (x Data..: "virtualRouterName")
+      )
+
+instance Prelude.Hashable VirtualRouterRef where
+  hashWithSalt _salt VirtualRouterRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` version
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData VirtualRouterRef where
+  rnf VirtualRouterRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf virtualRouterName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterServiceProvider.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterServiceProvider.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterServiceProvider.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterServiceProvider
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterServiceProvider where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual node service provider.
+--
+-- /See:/ 'newVirtualRouterServiceProvider' smart constructor.
+data VirtualRouterServiceProvider = VirtualRouterServiceProvider'
+  { -- | The name of the virtual router that is acting as a service provider.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualRouterServiceProvider' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'virtualRouterName', 'virtualRouterServiceProvider_virtualRouterName' - The name of the virtual router that is acting as a service provider.
+newVirtualRouterServiceProvider ::
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  VirtualRouterServiceProvider
+newVirtualRouterServiceProvider pVirtualRouterName_ =
+  VirtualRouterServiceProvider'
+    { virtualRouterName =
+        pVirtualRouterName_
+    }
+
+-- | The name of the virtual router that is acting as a service provider.
+virtualRouterServiceProvider_virtualRouterName :: Lens.Lens' VirtualRouterServiceProvider Prelude.Text
+virtualRouterServiceProvider_virtualRouterName = Lens.lens (\VirtualRouterServiceProvider' {virtualRouterName} -> virtualRouterName) (\s@VirtualRouterServiceProvider' {} a -> s {virtualRouterName = a} :: VirtualRouterServiceProvider)
+
+instance Data.FromJSON VirtualRouterServiceProvider where
+  parseJSON =
+    Data.withObject
+      "VirtualRouterServiceProvider"
+      ( \x ->
+          VirtualRouterServiceProvider'
+            Prelude.<$> (x Data..: "virtualRouterName")
+      )
+
+instance
+  Prelude.Hashable
+    VirtualRouterServiceProvider
+  where
+  hashWithSalt _salt VirtualRouterServiceProvider' {..} =
+    _salt `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData VirtualRouterServiceProvider where
+  rnf VirtualRouterServiceProvider' {..} =
+    Prelude.rnf virtualRouterName
+
+instance Data.ToJSON VirtualRouterServiceProvider where
+  toJSON VirtualRouterServiceProvider' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("virtualRouterName" Data..= virtualRouterName)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterSpec.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterSpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterSpec.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterSpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterSpec where
+
+import Amazonka.AppMesh.Types.VirtualRouterListener
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the specification of a virtual router.
+--
+-- /See:/ 'newVirtualRouterSpec' smart constructor.
+data VirtualRouterSpec = VirtualRouterSpec'
+  { -- | The listeners that the virtual router is expected to receive inbound
+    -- traffic from. You can specify one listener.
+    listeners :: Prelude.Maybe [VirtualRouterListener]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualRouterSpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'listeners', 'virtualRouterSpec_listeners' - The listeners that the virtual router is expected to receive inbound
+-- traffic from. You can specify one listener.
+newVirtualRouterSpec ::
+  VirtualRouterSpec
+newVirtualRouterSpec =
+  VirtualRouterSpec' {listeners = Prelude.Nothing}
+
+-- | The listeners that the virtual router is expected to receive inbound
+-- traffic from. You can specify one listener.
+virtualRouterSpec_listeners :: Lens.Lens' VirtualRouterSpec (Prelude.Maybe [VirtualRouterListener])
+virtualRouterSpec_listeners = Lens.lens (\VirtualRouterSpec' {listeners} -> listeners) (\s@VirtualRouterSpec' {} a -> s {listeners = a} :: VirtualRouterSpec) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON VirtualRouterSpec where
+  parseJSON =
+    Data.withObject
+      "VirtualRouterSpec"
+      ( \x ->
+          VirtualRouterSpec'
+            Prelude.<$> (x Data..:? "listeners" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable VirtualRouterSpec where
+  hashWithSalt _salt VirtualRouterSpec' {..} =
+    _salt `Prelude.hashWithSalt` listeners
+
+instance Prelude.NFData VirtualRouterSpec where
+  rnf VirtualRouterSpec' {..} = Prelude.rnf listeners
+
+instance Data.ToJSON VirtualRouterSpec where
+  toJSON VirtualRouterSpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("listeners" Data..=) Prelude.<$> listeners]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterStatus.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterStatus.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterStatus where
+
+import Amazonka.AppMesh.Types.VirtualRouterStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the status of a virtual router.
+--
+-- /See:/ 'newVirtualRouterStatus' smart constructor.
+data VirtualRouterStatus = VirtualRouterStatus'
+  { -- | The current status of the virtual router.
+    status :: VirtualRouterStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualRouterStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'virtualRouterStatus_status' - The current status of the virtual router.
+newVirtualRouterStatus ::
+  -- | 'status'
+  VirtualRouterStatusCode ->
+  VirtualRouterStatus
+newVirtualRouterStatus pStatus_ =
+  VirtualRouterStatus' {status = pStatus_}
+
+-- | The current status of the virtual router.
+virtualRouterStatus_status :: Lens.Lens' VirtualRouterStatus VirtualRouterStatusCode
+virtualRouterStatus_status = Lens.lens (\VirtualRouterStatus' {status} -> status) (\s@VirtualRouterStatus' {} a -> s {status = a} :: VirtualRouterStatus)
+
+instance Data.FromJSON VirtualRouterStatus where
+  parseJSON =
+    Data.withObject
+      "VirtualRouterStatus"
+      ( \x ->
+          VirtualRouterStatus'
+            Prelude.<$> (x Data..: "status")
+      )
+
+instance Prelude.Hashable VirtualRouterStatus where
+  hashWithSalt _salt VirtualRouterStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData VirtualRouterStatus where
+  rnf VirtualRouterStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/VirtualRouterStatusCode.hs b/gen/Amazonka/AppMesh/Types/VirtualRouterStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualRouterStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualRouterStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualRouterStatusCode
+  ( VirtualRouterStatusCode
+      ( ..,
+        VirtualRouterStatusCode_ACTIVE,
+        VirtualRouterStatusCode_DELETED,
+        VirtualRouterStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualRouterStatusCode = VirtualRouterStatusCode'
+  { fromVirtualRouterStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VirtualRouterStatusCode_ACTIVE :: VirtualRouterStatusCode
+pattern VirtualRouterStatusCode_ACTIVE = VirtualRouterStatusCode' "ACTIVE"
+
+pattern VirtualRouterStatusCode_DELETED :: VirtualRouterStatusCode
+pattern VirtualRouterStatusCode_DELETED = VirtualRouterStatusCode' "DELETED"
+
+pattern VirtualRouterStatusCode_INACTIVE :: VirtualRouterStatusCode
+pattern VirtualRouterStatusCode_INACTIVE = VirtualRouterStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  VirtualRouterStatusCode_ACTIVE,
+  VirtualRouterStatusCode_DELETED,
+  VirtualRouterStatusCode_INACTIVE,
+  VirtualRouterStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceBackend.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceBackend.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceBackend.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceBackend
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceBackend where
+
+import Amazonka.AppMesh.Types.ClientPolicy
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual service backend for a virtual node.
+--
+-- /See:/ 'newVirtualServiceBackend' smart constructor.
+data VirtualServiceBackend = VirtualServiceBackend'
+  { -- | A reference to an object that represents the client policy for a
+    -- backend.
+    clientPolicy :: Prelude.Maybe ClientPolicy,
+    -- | The name of the virtual service that is acting as a virtual node
+    -- backend.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualServiceBackend' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientPolicy', 'virtualServiceBackend_clientPolicy' - A reference to an object that represents the client policy for a
+-- backend.
+--
+-- 'virtualServiceName', 'virtualServiceBackend_virtualServiceName' - The name of the virtual service that is acting as a virtual node
+-- backend.
+newVirtualServiceBackend ::
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  VirtualServiceBackend
+newVirtualServiceBackend pVirtualServiceName_ =
+  VirtualServiceBackend'
+    { clientPolicy =
+        Prelude.Nothing,
+      virtualServiceName = pVirtualServiceName_
+    }
+
+-- | A reference to an object that represents the client policy for a
+-- backend.
+virtualServiceBackend_clientPolicy :: Lens.Lens' VirtualServiceBackend (Prelude.Maybe ClientPolicy)
+virtualServiceBackend_clientPolicy = Lens.lens (\VirtualServiceBackend' {clientPolicy} -> clientPolicy) (\s@VirtualServiceBackend' {} a -> s {clientPolicy = a} :: VirtualServiceBackend)
+
+-- | The name of the virtual service that is acting as a virtual node
+-- backend.
+virtualServiceBackend_virtualServiceName :: Lens.Lens' VirtualServiceBackend Prelude.Text
+virtualServiceBackend_virtualServiceName = Lens.lens (\VirtualServiceBackend' {virtualServiceName} -> virtualServiceName) (\s@VirtualServiceBackend' {} a -> s {virtualServiceName = a} :: VirtualServiceBackend)
+
+instance Data.FromJSON VirtualServiceBackend where
+  parseJSON =
+    Data.withObject
+      "VirtualServiceBackend"
+      ( \x ->
+          VirtualServiceBackend'
+            Prelude.<$> (x Data..:? "clientPolicy")
+            Prelude.<*> (x Data..: "virtualServiceName")
+      )
+
+instance Prelude.Hashable VirtualServiceBackend where
+  hashWithSalt _salt VirtualServiceBackend' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientPolicy
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData VirtualServiceBackend where
+  rnf VirtualServiceBackend' {..} =
+    Prelude.rnf clientPolicy
+      `Prelude.seq` Prelude.rnf virtualServiceName
+
+instance Data.ToJSON VirtualServiceBackend where
+  toJSON VirtualServiceBackend' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientPolicy" Data..=) Prelude.<$> clientPolicy,
+            Prelude.Just
+              ("virtualServiceName" Data..= virtualServiceName)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceData.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceData.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceData where
+
+import Amazonka.AppMesh.Types.ResourceMetadata
+import Amazonka.AppMesh.Types.VirtualServiceSpec
+import Amazonka.AppMesh.Types.VirtualServiceStatus
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual service returned by a describe
+-- operation.
+--
+-- /See:/ 'newVirtualServiceData' smart constructor.
+data VirtualServiceData = VirtualServiceData'
+  { -- | The name of the service mesh that the virtual service resides in.
+    meshName :: Prelude.Text,
+    metadata :: ResourceMetadata,
+    -- | The specifications of the virtual service.
+    spec :: VirtualServiceSpec,
+    -- | The current status of the virtual service.
+    status :: VirtualServiceStatus,
+    -- | The name of the virtual service.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualServiceData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'meshName', 'virtualServiceData_meshName' - The name of the service mesh that the virtual service resides in.
+--
+-- 'metadata', 'virtualServiceData_metadata' - Undocumented member.
+--
+-- 'spec', 'virtualServiceData_spec' - The specifications of the virtual service.
+--
+-- 'status', 'virtualServiceData_status' - The current status of the virtual service.
+--
+-- 'virtualServiceName', 'virtualServiceData_virtualServiceName' - The name of the virtual service.
+newVirtualServiceData ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'metadata'
+  ResourceMetadata ->
+  -- | 'spec'
+  VirtualServiceSpec ->
+  -- | 'status'
+  VirtualServiceStatus ->
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  VirtualServiceData
+newVirtualServiceData
+  pMeshName_
+  pMetadata_
+  pSpec_
+  pStatus_
+  pVirtualServiceName_ =
+    VirtualServiceData'
+      { meshName = pMeshName_,
+        metadata = pMetadata_,
+        spec = pSpec_,
+        status = pStatus_,
+        virtualServiceName = pVirtualServiceName_
+      }
+
+-- | The name of the service mesh that the virtual service resides in.
+virtualServiceData_meshName :: Lens.Lens' VirtualServiceData Prelude.Text
+virtualServiceData_meshName = Lens.lens (\VirtualServiceData' {meshName} -> meshName) (\s@VirtualServiceData' {} a -> s {meshName = a} :: VirtualServiceData)
+
+-- | Undocumented member.
+virtualServiceData_metadata :: Lens.Lens' VirtualServiceData ResourceMetadata
+virtualServiceData_metadata = Lens.lens (\VirtualServiceData' {metadata} -> metadata) (\s@VirtualServiceData' {} a -> s {metadata = a} :: VirtualServiceData)
+
+-- | The specifications of the virtual service.
+virtualServiceData_spec :: Lens.Lens' VirtualServiceData VirtualServiceSpec
+virtualServiceData_spec = Lens.lens (\VirtualServiceData' {spec} -> spec) (\s@VirtualServiceData' {} a -> s {spec = a} :: VirtualServiceData)
+
+-- | The current status of the virtual service.
+virtualServiceData_status :: Lens.Lens' VirtualServiceData VirtualServiceStatus
+virtualServiceData_status = Lens.lens (\VirtualServiceData' {status} -> status) (\s@VirtualServiceData' {} a -> s {status = a} :: VirtualServiceData)
+
+-- | The name of the virtual service.
+virtualServiceData_virtualServiceName :: Lens.Lens' VirtualServiceData Prelude.Text
+virtualServiceData_virtualServiceName = Lens.lens (\VirtualServiceData' {virtualServiceName} -> virtualServiceName) (\s@VirtualServiceData' {} a -> s {virtualServiceName = a} :: VirtualServiceData)
+
+instance Data.FromJSON VirtualServiceData where
+  parseJSON =
+    Data.withObject
+      "VirtualServiceData"
+      ( \x ->
+          VirtualServiceData'
+            Prelude.<$> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "metadata")
+            Prelude.<*> (x Data..: "spec")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "virtualServiceName")
+      )
+
+instance Prelude.Hashable VirtualServiceData where
+  hashWithSalt _salt VirtualServiceData' {..} =
+    _salt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData VirtualServiceData where
+  rnf VirtualServiceData' {..} =
+    Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf virtualServiceName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceProvider.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceProvider.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceProvider.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceProvider
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceProvider where
+
+import Amazonka.AppMesh.Types.VirtualNodeServiceProvider
+import Amazonka.AppMesh.Types.VirtualRouterServiceProvider
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the provider for a virtual service.
+--
+-- /See:/ 'newVirtualServiceProvider' smart constructor.
+data VirtualServiceProvider = VirtualServiceProvider'
+  { -- | The virtual node associated with a virtual service.
+    virtualNode :: Prelude.Maybe VirtualNodeServiceProvider,
+    -- | The virtual router associated with a virtual service.
+    virtualRouter :: Prelude.Maybe VirtualRouterServiceProvider
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualServiceProvider' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'virtualNode', 'virtualServiceProvider_virtualNode' - The virtual node associated with a virtual service.
+--
+-- 'virtualRouter', 'virtualServiceProvider_virtualRouter' - The virtual router associated with a virtual service.
+newVirtualServiceProvider ::
+  VirtualServiceProvider
+newVirtualServiceProvider =
+  VirtualServiceProvider'
+    { virtualNode =
+        Prelude.Nothing,
+      virtualRouter = Prelude.Nothing
+    }
+
+-- | The virtual node associated with a virtual service.
+virtualServiceProvider_virtualNode :: Lens.Lens' VirtualServiceProvider (Prelude.Maybe VirtualNodeServiceProvider)
+virtualServiceProvider_virtualNode = Lens.lens (\VirtualServiceProvider' {virtualNode} -> virtualNode) (\s@VirtualServiceProvider' {} a -> s {virtualNode = a} :: VirtualServiceProvider)
+
+-- | The virtual router associated with a virtual service.
+virtualServiceProvider_virtualRouter :: Lens.Lens' VirtualServiceProvider (Prelude.Maybe VirtualRouterServiceProvider)
+virtualServiceProvider_virtualRouter = Lens.lens (\VirtualServiceProvider' {virtualRouter} -> virtualRouter) (\s@VirtualServiceProvider' {} a -> s {virtualRouter = a} :: VirtualServiceProvider)
+
+instance Data.FromJSON VirtualServiceProvider where
+  parseJSON =
+    Data.withObject
+      "VirtualServiceProvider"
+      ( \x ->
+          VirtualServiceProvider'
+            Prelude.<$> (x Data..:? "virtualNode")
+            Prelude.<*> (x Data..:? "virtualRouter")
+      )
+
+instance Prelude.Hashable VirtualServiceProvider where
+  hashWithSalt _salt VirtualServiceProvider' {..} =
+    _salt
+      `Prelude.hashWithSalt` virtualNode
+      `Prelude.hashWithSalt` virtualRouter
+
+instance Prelude.NFData VirtualServiceProvider where
+  rnf VirtualServiceProvider' {..} =
+    Prelude.rnf virtualNode
+      `Prelude.seq` Prelude.rnf virtualRouter
+
+instance Data.ToJSON VirtualServiceProvider where
+  toJSON VirtualServiceProvider' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("virtualNode" Data..=) Prelude.<$> virtualNode,
+            ("virtualRouter" Data..=) Prelude.<$> virtualRouter
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceRef.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceRef.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceRef.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceRef
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceRef where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a virtual service returned by a list
+-- operation.
+--
+-- /See:/ 'newVirtualServiceRef' smart constructor.
+data VirtualServiceRef = VirtualServiceRef'
+  { -- | The full Amazon Resource Name (ARN) for the virtual service.
+    arn :: Prelude.Text,
+    -- | The Unix epoch timestamp in seconds for when the resource was created.
+    createdAt :: Data.POSIX,
+    -- | The Unix epoch timestamp in seconds for when the resource was last
+    -- updated.
+    lastUpdatedAt :: Data.POSIX,
+    -- | The name of the service mesh that the virtual service resides in.
+    meshName :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the resource owner. If the
+    -- account ID is not your own, then it\'s the ID of the mesh owner or of
+    -- another account that the mesh is shared with. For more information about
+    -- mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    resourceOwner :: Prelude.Text,
+    -- | The version of the resource. Resources are created at version 1, and
+    -- this version is incremented each time that they\'re updated.
+    version :: Prelude.Integer,
+    -- | The name of the virtual service.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualServiceRef' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'virtualServiceRef_arn' - The full Amazon Resource Name (ARN) for the virtual service.
+--
+-- 'createdAt', 'virtualServiceRef_createdAt' - The Unix epoch timestamp in seconds for when the resource was created.
+--
+-- 'lastUpdatedAt', 'virtualServiceRef_lastUpdatedAt' - The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+--
+-- 'meshName', 'virtualServiceRef_meshName' - The name of the service mesh that the virtual service resides in.
+--
+-- 'meshOwner', 'virtualServiceRef_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'resourceOwner', 'virtualServiceRef_resourceOwner' - The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'version', 'virtualServiceRef_version' - The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+--
+-- 'virtualServiceName', 'virtualServiceRef_virtualServiceName' - The name of the virtual service.
+newVirtualServiceRef ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdAt'
+  Prelude.UTCTime ->
+  -- | 'lastUpdatedAt'
+  Prelude.UTCTime ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'meshOwner'
+  Prelude.Text ->
+  -- | 'resourceOwner'
+  Prelude.Text ->
+  -- | 'version'
+  Prelude.Integer ->
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  VirtualServiceRef
+newVirtualServiceRef
+  pArn_
+  pCreatedAt_
+  pLastUpdatedAt_
+  pMeshName_
+  pMeshOwner_
+  pResourceOwner_
+  pVersion_
+  pVirtualServiceName_ =
+    VirtualServiceRef'
+      { arn = pArn_,
+        createdAt = Data._Time Lens.# pCreatedAt_,
+        lastUpdatedAt = Data._Time Lens.# pLastUpdatedAt_,
+        meshName = pMeshName_,
+        meshOwner = pMeshOwner_,
+        resourceOwner = pResourceOwner_,
+        version = pVersion_,
+        virtualServiceName = pVirtualServiceName_
+      }
+
+-- | The full Amazon Resource Name (ARN) for the virtual service.
+virtualServiceRef_arn :: Lens.Lens' VirtualServiceRef Prelude.Text
+virtualServiceRef_arn = Lens.lens (\VirtualServiceRef' {arn} -> arn) (\s@VirtualServiceRef' {} a -> s {arn = a} :: VirtualServiceRef)
+
+-- | The Unix epoch timestamp in seconds for when the resource was created.
+virtualServiceRef_createdAt :: Lens.Lens' VirtualServiceRef Prelude.UTCTime
+virtualServiceRef_createdAt = Lens.lens (\VirtualServiceRef' {createdAt} -> createdAt) (\s@VirtualServiceRef' {} a -> s {createdAt = a} :: VirtualServiceRef) Prelude.. Data._Time
+
+-- | The Unix epoch timestamp in seconds for when the resource was last
+-- updated.
+virtualServiceRef_lastUpdatedAt :: Lens.Lens' VirtualServiceRef Prelude.UTCTime
+virtualServiceRef_lastUpdatedAt = Lens.lens (\VirtualServiceRef' {lastUpdatedAt} -> lastUpdatedAt) (\s@VirtualServiceRef' {} a -> s {lastUpdatedAt = a} :: VirtualServiceRef) Prelude.. Data._Time
+
+-- | The name of the service mesh that the virtual service resides in.
+virtualServiceRef_meshName :: Lens.Lens' VirtualServiceRef Prelude.Text
+virtualServiceRef_meshName = Lens.lens (\VirtualServiceRef' {meshName} -> meshName) (\s@VirtualServiceRef' {} a -> s {meshName = a} :: VirtualServiceRef)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualServiceRef_meshOwner :: Lens.Lens' VirtualServiceRef Prelude.Text
+virtualServiceRef_meshOwner = Lens.lens (\VirtualServiceRef' {meshOwner} -> meshOwner) (\s@VirtualServiceRef' {} a -> s {meshOwner = a} :: VirtualServiceRef)
+
+-- | The Amazon Web Services IAM account ID of the resource owner. If the
+-- account ID is not your own, then it\'s the ID of the mesh owner or of
+-- another account that the mesh is shared with. For more information about
+-- mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+virtualServiceRef_resourceOwner :: Lens.Lens' VirtualServiceRef Prelude.Text
+virtualServiceRef_resourceOwner = Lens.lens (\VirtualServiceRef' {resourceOwner} -> resourceOwner) (\s@VirtualServiceRef' {} a -> s {resourceOwner = a} :: VirtualServiceRef)
+
+-- | The version of the resource. Resources are created at version 1, and
+-- this version is incremented each time that they\'re updated.
+virtualServiceRef_version :: Lens.Lens' VirtualServiceRef Prelude.Integer
+virtualServiceRef_version = Lens.lens (\VirtualServiceRef' {version} -> version) (\s@VirtualServiceRef' {} a -> s {version = a} :: VirtualServiceRef)
+
+-- | The name of the virtual service.
+virtualServiceRef_virtualServiceName :: Lens.Lens' VirtualServiceRef Prelude.Text
+virtualServiceRef_virtualServiceName = Lens.lens (\VirtualServiceRef' {virtualServiceName} -> virtualServiceName) (\s@VirtualServiceRef' {} a -> s {virtualServiceName = a} :: VirtualServiceRef)
+
+instance Data.FromJSON VirtualServiceRef where
+  parseJSON =
+    Data.withObject
+      "VirtualServiceRef"
+      ( \x ->
+          VirtualServiceRef'
+            Prelude.<$> (x Data..: "arn")
+            Prelude.<*> (x Data..: "createdAt")
+            Prelude.<*> (x Data..: "lastUpdatedAt")
+            Prelude.<*> (x Data..: "meshName")
+            Prelude.<*> (x Data..: "meshOwner")
+            Prelude.<*> (x Data..: "resourceOwner")
+            Prelude.<*> (x Data..: "version")
+            Prelude.<*> (x Data..: "virtualServiceName")
+      )
+
+instance Prelude.Hashable VirtualServiceRef where
+  hashWithSalt _salt VirtualServiceRef' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` lastUpdatedAt
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` resourceOwner
+      `Prelude.hashWithSalt` version
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData VirtualServiceRef where
+  rnf VirtualServiceRef' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf lastUpdatedAt
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf resourceOwner
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf virtualServiceName
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceSpec.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceSpec.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceSpec.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceSpec
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceSpec where
+
+import Amazonka.AppMesh.Types.VirtualServiceProvider
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the specification of a virtual service.
+--
+-- /See:/ 'newVirtualServiceSpec' smart constructor.
+data VirtualServiceSpec = VirtualServiceSpec'
+  { -- | The App Mesh object that is acting as the provider for a virtual
+    -- service. You can specify a single virtual node or virtual router.
+    provider :: Prelude.Maybe VirtualServiceProvider
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualServiceSpec' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'provider', 'virtualServiceSpec_provider' - The App Mesh object that is acting as the provider for a virtual
+-- service. You can specify a single virtual node or virtual router.
+newVirtualServiceSpec ::
+  VirtualServiceSpec
+newVirtualServiceSpec =
+  VirtualServiceSpec' {provider = Prelude.Nothing}
+
+-- | The App Mesh object that is acting as the provider for a virtual
+-- service. You can specify a single virtual node or virtual router.
+virtualServiceSpec_provider :: Lens.Lens' VirtualServiceSpec (Prelude.Maybe VirtualServiceProvider)
+virtualServiceSpec_provider = Lens.lens (\VirtualServiceSpec' {provider} -> provider) (\s@VirtualServiceSpec' {} a -> s {provider = a} :: VirtualServiceSpec)
+
+instance Data.FromJSON VirtualServiceSpec where
+  parseJSON =
+    Data.withObject
+      "VirtualServiceSpec"
+      ( \x ->
+          VirtualServiceSpec'
+            Prelude.<$> (x Data..:? "provider")
+      )
+
+instance Prelude.Hashable VirtualServiceSpec where
+  hashWithSalt _salt VirtualServiceSpec' {..} =
+    _salt `Prelude.hashWithSalt` provider
+
+instance Prelude.NFData VirtualServiceSpec where
+  rnf VirtualServiceSpec' {..} = Prelude.rnf provider
+
+instance Data.ToJSON VirtualServiceSpec where
+  toJSON VirtualServiceSpec' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("provider" Data..=) Prelude.<$> provider]
+      )
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceStatus.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceStatus.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceStatus where
+
+import Amazonka.AppMesh.Types.VirtualServiceStatusCode
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the status of a virtual service.
+--
+-- /See:/ 'newVirtualServiceStatus' smart constructor.
+data VirtualServiceStatus = VirtualServiceStatus'
+  { -- | The current status of the virtual service.
+    status :: VirtualServiceStatusCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualServiceStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'virtualServiceStatus_status' - The current status of the virtual service.
+newVirtualServiceStatus ::
+  -- | 'status'
+  VirtualServiceStatusCode ->
+  VirtualServiceStatus
+newVirtualServiceStatus pStatus_ =
+  VirtualServiceStatus' {status = pStatus_}
+
+-- | The current status of the virtual service.
+virtualServiceStatus_status :: Lens.Lens' VirtualServiceStatus VirtualServiceStatusCode
+virtualServiceStatus_status = Lens.lens (\VirtualServiceStatus' {status} -> status) (\s@VirtualServiceStatus' {} a -> s {status = a} :: VirtualServiceStatus)
+
+instance Data.FromJSON VirtualServiceStatus where
+  parseJSON =
+    Data.withObject
+      "VirtualServiceStatus"
+      ( \x ->
+          VirtualServiceStatus'
+            Prelude.<$> (x Data..: "status")
+      )
+
+instance Prelude.Hashable VirtualServiceStatus where
+  hashWithSalt _salt VirtualServiceStatus' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData VirtualServiceStatus where
+  rnf VirtualServiceStatus' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/AppMesh/Types/VirtualServiceStatusCode.hs b/gen/Amazonka/AppMesh/Types/VirtualServiceStatusCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/VirtualServiceStatusCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.VirtualServiceStatusCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.VirtualServiceStatusCode
+  ( VirtualServiceStatusCode
+      ( ..,
+        VirtualServiceStatusCode_ACTIVE,
+        VirtualServiceStatusCode_DELETED,
+        VirtualServiceStatusCode_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualServiceStatusCode = VirtualServiceStatusCode'
+  { fromVirtualServiceStatusCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern VirtualServiceStatusCode_ACTIVE :: VirtualServiceStatusCode
+pattern VirtualServiceStatusCode_ACTIVE = VirtualServiceStatusCode' "ACTIVE"
+
+pattern VirtualServiceStatusCode_DELETED :: VirtualServiceStatusCode
+pattern VirtualServiceStatusCode_DELETED = VirtualServiceStatusCode' "DELETED"
+
+pattern VirtualServiceStatusCode_INACTIVE :: VirtualServiceStatusCode
+pattern VirtualServiceStatusCode_INACTIVE = VirtualServiceStatusCode' "INACTIVE"
+
+{-# COMPLETE
+  VirtualServiceStatusCode_ACTIVE,
+  VirtualServiceStatusCode_DELETED,
+  VirtualServiceStatusCode_INACTIVE,
+  VirtualServiceStatusCode'
+  #-}
diff --git a/gen/Amazonka/AppMesh/Types/WeightedTarget.hs b/gen/Amazonka/AppMesh/Types/WeightedTarget.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Types/WeightedTarget.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Types.WeightedTarget
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Types.WeightedTarget where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents a target and its relative weight. Traffic is
+-- distributed across targets according to their relative weight. For
+-- example, a weighted target with a relative weight of 50 receives five
+-- times as much traffic as one with a relative weight of 10. The total
+-- weight for all targets combined must be less than or equal to 100.
+--
+-- /See:/ 'newWeightedTarget' smart constructor.
+data WeightedTarget = WeightedTarget'
+  { -- | The targeted port of the weighted object.
+    port :: Prelude.Maybe Prelude.Natural,
+    -- | The virtual node to associate with the weighted target.
+    virtualNode :: Prelude.Text,
+    -- | The relative weight of the weighted target.
+    weight :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'WeightedTarget' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'port', 'weightedTarget_port' - The targeted port of the weighted object.
+--
+-- 'virtualNode', 'weightedTarget_virtualNode' - The virtual node to associate with the weighted target.
+--
+-- 'weight', 'weightedTarget_weight' - The relative weight of the weighted target.
+newWeightedTarget ::
+  -- | 'virtualNode'
+  Prelude.Text ->
+  -- | 'weight'
+  Prelude.Natural ->
+  WeightedTarget
+newWeightedTarget pVirtualNode_ pWeight_ =
+  WeightedTarget'
+    { port = Prelude.Nothing,
+      virtualNode = pVirtualNode_,
+      weight = pWeight_
+    }
+
+-- | The targeted port of the weighted object.
+weightedTarget_port :: Lens.Lens' WeightedTarget (Prelude.Maybe Prelude.Natural)
+weightedTarget_port = Lens.lens (\WeightedTarget' {port} -> port) (\s@WeightedTarget' {} a -> s {port = a} :: WeightedTarget)
+
+-- | The virtual node to associate with the weighted target.
+weightedTarget_virtualNode :: Lens.Lens' WeightedTarget Prelude.Text
+weightedTarget_virtualNode = Lens.lens (\WeightedTarget' {virtualNode} -> virtualNode) (\s@WeightedTarget' {} a -> s {virtualNode = a} :: WeightedTarget)
+
+-- | The relative weight of the weighted target.
+weightedTarget_weight :: Lens.Lens' WeightedTarget Prelude.Natural
+weightedTarget_weight = Lens.lens (\WeightedTarget' {weight} -> weight) (\s@WeightedTarget' {} a -> s {weight = a} :: WeightedTarget)
+
+instance Data.FromJSON WeightedTarget where
+  parseJSON =
+    Data.withObject
+      "WeightedTarget"
+      ( \x ->
+          WeightedTarget'
+            Prelude.<$> (x Data..:? "port")
+            Prelude.<*> (x Data..: "virtualNode")
+            Prelude.<*> (x Data..: "weight")
+      )
+
+instance Prelude.Hashable WeightedTarget where
+  hashWithSalt _salt WeightedTarget' {..} =
+    _salt
+      `Prelude.hashWithSalt` port
+      `Prelude.hashWithSalt` virtualNode
+      `Prelude.hashWithSalt` weight
+
+instance Prelude.NFData WeightedTarget where
+  rnf WeightedTarget' {..} =
+    Prelude.rnf port
+      `Prelude.seq` Prelude.rnf virtualNode
+      `Prelude.seq` Prelude.rnf weight
+
+instance Data.ToJSON WeightedTarget where
+  toJSON WeightedTarget' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("port" Data..=) Prelude.<$> port,
+            Prelude.Just ("virtualNode" Data..= virtualNode),
+            Prelude.Just ("weight" Data..= weight)
+          ]
+      )
diff --git a/gen/Amazonka/AppMesh/UntagResource.hs b/gen/Amazonka/AppMesh/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UntagResource.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes specified tags from a resource.
+module Amazonka.AppMesh.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource to delete tags from.
+    resourceArn :: Prelude.Text,
+    -- | The keys of the tags to be removed.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource to delete tags from.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The keys of the tags to be removed.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource to delete tags from.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The keys of the tags to be removed.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tagKeys" Data..= tagKeys)]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/v20190125/untag"
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat ["resourceArn" Data.=: resourceArn]
+
+-- |
+--
+-- /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/AppMesh/UpdateGatewayRoute.hs b/gen/Amazonka/AppMesh/UpdateGatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateGatewayRoute.hs
@@ -0,0 +1,275 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateGatewayRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing gateway route that is associated to a specified
+-- virtual gateway in a service mesh.
+module Amazonka.AppMesh.UpdateGatewayRoute
+  ( -- * Creating a Request
+    UpdateGatewayRoute (..),
+    newUpdateGatewayRoute,
+
+    -- * Request Lenses
+    updateGatewayRoute_clientToken,
+    updateGatewayRoute_meshOwner,
+    updateGatewayRoute_gatewayRouteName,
+    updateGatewayRoute_meshName,
+    updateGatewayRoute_spec,
+    updateGatewayRoute_virtualGatewayName,
+
+    -- * Destructuring the Response
+    UpdateGatewayRouteResponse (..),
+    newUpdateGatewayRouteResponse,
+
+    -- * Response Lenses
+    updateGatewayRouteResponse_httpStatus,
+    updateGatewayRouteResponse_gatewayRoute,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateGatewayRoute' smart constructor.
+data UpdateGatewayRoute = UpdateGatewayRoute'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the gateway route to update.
+    gatewayRouteName :: Prelude.Text,
+    -- | The name of the service mesh that the gateway route resides in.
+    meshName :: Prelude.Text,
+    -- | The new gateway route specification to apply. This overwrites the
+    -- existing data.
+    spec :: GatewayRouteSpec,
+    -- | The name of the virtual gateway that the gateway route is associated
+    -- with.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGatewayRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateGatewayRoute_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'updateGatewayRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'gatewayRouteName', 'updateGatewayRoute_gatewayRouteName' - The name of the gateway route to update.
+--
+-- 'meshName', 'updateGatewayRoute_meshName' - The name of the service mesh that the gateway route resides in.
+--
+-- 'spec', 'updateGatewayRoute_spec' - The new gateway route specification to apply. This overwrites the
+-- existing data.
+--
+-- 'virtualGatewayName', 'updateGatewayRoute_virtualGatewayName' - The name of the virtual gateway that the gateway route is associated
+-- with.
+newUpdateGatewayRoute ::
+  -- | 'gatewayRouteName'
+  Prelude.Text ->
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  GatewayRouteSpec ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  UpdateGatewayRoute
+newUpdateGatewayRoute
+  pGatewayRouteName_
+  pMeshName_
+  pSpec_
+  pVirtualGatewayName_ =
+    UpdateGatewayRoute'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        gatewayRouteName = pGatewayRouteName_,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateGatewayRoute_clientToken :: Lens.Lens' UpdateGatewayRoute (Prelude.Maybe Prelude.Text)
+updateGatewayRoute_clientToken = Lens.lens (\UpdateGatewayRoute' {clientToken} -> clientToken) (\s@UpdateGatewayRoute' {} a -> s {clientToken = a} :: UpdateGatewayRoute)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+updateGatewayRoute_meshOwner :: Lens.Lens' UpdateGatewayRoute (Prelude.Maybe Prelude.Text)
+updateGatewayRoute_meshOwner = Lens.lens (\UpdateGatewayRoute' {meshOwner} -> meshOwner) (\s@UpdateGatewayRoute' {} a -> s {meshOwner = a} :: UpdateGatewayRoute)
+
+-- | The name of the gateway route to update.
+updateGatewayRoute_gatewayRouteName :: Lens.Lens' UpdateGatewayRoute Prelude.Text
+updateGatewayRoute_gatewayRouteName = Lens.lens (\UpdateGatewayRoute' {gatewayRouteName} -> gatewayRouteName) (\s@UpdateGatewayRoute' {} a -> s {gatewayRouteName = a} :: UpdateGatewayRoute)
+
+-- | The name of the service mesh that the gateway route resides in.
+updateGatewayRoute_meshName :: Lens.Lens' UpdateGatewayRoute Prelude.Text
+updateGatewayRoute_meshName = Lens.lens (\UpdateGatewayRoute' {meshName} -> meshName) (\s@UpdateGatewayRoute' {} a -> s {meshName = a} :: UpdateGatewayRoute)
+
+-- | The new gateway route specification to apply. This overwrites the
+-- existing data.
+updateGatewayRoute_spec :: Lens.Lens' UpdateGatewayRoute GatewayRouteSpec
+updateGatewayRoute_spec = Lens.lens (\UpdateGatewayRoute' {spec} -> spec) (\s@UpdateGatewayRoute' {} a -> s {spec = a} :: UpdateGatewayRoute)
+
+-- | The name of the virtual gateway that the gateway route is associated
+-- with.
+updateGatewayRoute_virtualGatewayName :: Lens.Lens' UpdateGatewayRoute Prelude.Text
+updateGatewayRoute_virtualGatewayName = Lens.lens (\UpdateGatewayRoute' {virtualGatewayName} -> virtualGatewayName) (\s@UpdateGatewayRoute' {} a -> s {virtualGatewayName = a} :: UpdateGatewayRoute)
+
+instance Core.AWSRequest UpdateGatewayRoute where
+  type
+    AWSResponse UpdateGatewayRoute =
+      UpdateGatewayRouteResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateGatewayRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateGatewayRoute where
+  hashWithSalt _salt UpdateGatewayRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` gatewayRouteName
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData UpdateGatewayRoute where
+  rnf UpdateGatewayRoute' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf gatewayRouteName
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders UpdateGatewayRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateGatewayRoute where
+  toJSON UpdateGatewayRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath UpdateGatewayRoute where
+  toPath UpdateGatewayRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateway/",
+        Data.toBS virtualGatewayName,
+        "/gatewayRoutes/",
+        Data.toBS gatewayRouteName
+      ]
+
+instance Data.ToQuery UpdateGatewayRoute where
+  toQuery UpdateGatewayRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newUpdateGatewayRouteResponse' smart constructor.
+data UpdateGatewayRouteResponse = UpdateGatewayRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A full description of the gateway route that was updated.
+    gatewayRoute :: GatewayRouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGatewayRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateGatewayRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayRoute', 'updateGatewayRouteResponse_gatewayRoute' - A full description of the gateway route that was updated.
+newUpdateGatewayRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayRoute'
+  GatewayRouteData ->
+  UpdateGatewayRouteResponse
+newUpdateGatewayRouteResponse
+  pHttpStatus_
+  pGatewayRoute_ =
+    UpdateGatewayRouteResponse'
+      { httpStatus =
+          pHttpStatus_,
+        gatewayRoute = pGatewayRoute_
+      }
+
+-- | The response's http status code.
+updateGatewayRouteResponse_httpStatus :: Lens.Lens' UpdateGatewayRouteResponse Prelude.Int
+updateGatewayRouteResponse_httpStatus = Lens.lens (\UpdateGatewayRouteResponse' {httpStatus} -> httpStatus) (\s@UpdateGatewayRouteResponse' {} a -> s {httpStatus = a} :: UpdateGatewayRouteResponse)
+
+-- | A full description of the gateway route that was updated.
+updateGatewayRouteResponse_gatewayRoute :: Lens.Lens' UpdateGatewayRouteResponse GatewayRouteData
+updateGatewayRouteResponse_gatewayRoute = Lens.lens (\UpdateGatewayRouteResponse' {gatewayRoute} -> gatewayRoute) (\s@UpdateGatewayRouteResponse' {} a -> s {gatewayRoute = a} :: UpdateGatewayRouteResponse)
+
+instance Prelude.NFData UpdateGatewayRouteResponse where
+  rnf UpdateGatewayRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayRoute
diff --git a/gen/Amazonka/AppMesh/UpdateMesh.hs b/gen/Amazonka/AppMesh/UpdateMesh.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateMesh.hs
@@ -0,0 +1,204 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing service mesh.
+module Amazonka.AppMesh.UpdateMesh
+  ( -- * Creating a Request
+    UpdateMesh (..),
+    newUpdateMesh,
+
+    -- * Request Lenses
+    updateMesh_clientToken,
+    updateMesh_spec,
+    updateMesh_meshName,
+
+    -- * Destructuring the Response
+    UpdateMeshResponse (..),
+    newUpdateMeshResponse,
+
+    -- * Response Lenses
+    updateMeshResponse_httpStatus,
+    updateMeshResponse_mesh,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateMesh' smart constructor.
+data UpdateMesh = UpdateMesh'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The service mesh specification to apply.
+    spec :: Prelude.Maybe MeshSpec,
+    -- | The name of the service mesh to update.
+    meshName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMesh' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateMesh_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'spec', 'updateMesh_spec' - The service mesh specification to apply.
+--
+-- 'meshName', 'updateMesh_meshName' - The name of the service mesh to update.
+newUpdateMesh ::
+  -- | 'meshName'
+  Prelude.Text ->
+  UpdateMesh
+newUpdateMesh pMeshName_ =
+  UpdateMesh'
+    { clientToken = Prelude.Nothing,
+      spec = Prelude.Nothing,
+      meshName = pMeshName_
+    }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateMesh_clientToken :: Lens.Lens' UpdateMesh (Prelude.Maybe Prelude.Text)
+updateMesh_clientToken = Lens.lens (\UpdateMesh' {clientToken} -> clientToken) (\s@UpdateMesh' {} a -> s {clientToken = a} :: UpdateMesh)
+
+-- | The service mesh specification to apply.
+updateMesh_spec :: Lens.Lens' UpdateMesh (Prelude.Maybe MeshSpec)
+updateMesh_spec = Lens.lens (\UpdateMesh' {spec} -> spec) (\s@UpdateMesh' {} a -> s {spec = a} :: UpdateMesh)
+
+-- | The name of the service mesh to update.
+updateMesh_meshName :: Lens.Lens' UpdateMesh Prelude.Text
+updateMesh_meshName = Lens.lens (\UpdateMesh' {meshName} -> meshName) (\s@UpdateMesh' {} a -> s {meshName = a} :: UpdateMesh)
+
+instance Core.AWSRequest UpdateMesh where
+  type AWSResponse UpdateMesh = UpdateMeshResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateMeshResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateMesh where
+  hashWithSalt _salt UpdateMesh' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` meshName
+
+instance Prelude.NFData UpdateMesh where
+  rnf UpdateMesh' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf meshName
+
+instance Data.ToHeaders UpdateMesh where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateMesh where
+  toJSON UpdateMesh' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("spec" Data..=) Prelude.<$> spec
+          ]
+      )
+
+instance Data.ToPath UpdateMesh where
+  toPath UpdateMesh' {..} =
+    Prelude.mconcat
+      ["/v20190125/meshes/", Data.toBS meshName]
+
+instance Data.ToQuery UpdateMesh where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newUpdateMeshResponse' smart constructor.
+data UpdateMeshResponse = UpdateMeshResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    mesh :: MeshData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMeshResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateMeshResponse_httpStatus' - The response's http status code.
+--
+-- 'mesh', 'updateMeshResponse_mesh' - Undocumented member.
+newUpdateMeshResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'mesh'
+  MeshData ->
+  UpdateMeshResponse
+newUpdateMeshResponse pHttpStatus_ pMesh_ =
+  UpdateMeshResponse'
+    { httpStatus = pHttpStatus_,
+      mesh = pMesh_
+    }
+
+-- | The response's http status code.
+updateMeshResponse_httpStatus :: Lens.Lens' UpdateMeshResponse Prelude.Int
+updateMeshResponse_httpStatus = Lens.lens (\UpdateMeshResponse' {httpStatus} -> httpStatus) (\s@UpdateMeshResponse' {} a -> s {httpStatus = a} :: UpdateMeshResponse)
+
+-- | Undocumented member.
+updateMeshResponse_mesh :: Lens.Lens' UpdateMeshResponse MeshData
+updateMeshResponse_mesh = Lens.lens (\UpdateMeshResponse' {mesh} -> mesh) (\s@UpdateMeshResponse' {} a -> s {mesh = a} :: UpdateMeshResponse)
+
+instance Prelude.NFData UpdateMeshResponse where
+  rnf UpdateMeshResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf mesh
diff --git a/gen/Amazonka/AppMesh/UpdateRoute.hs b/gen/Amazonka/AppMesh/UpdateRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateRoute.hs
@@ -0,0 +1,268 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateRoute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing route for a specified service mesh and virtual
+-- router.
+module Amazonka.AppMesh.UpdateRoute
+  ( -- * Creating a Request
+    UpdateRoute (..),
+    newUpdateRoute,
+
+    -- * Request Lenses
+    updateRoute_clientToken,
+    updateRoute_meshOwner,
+    updateRoute_meshName,
+    updateRoute_routeName,
+    updateRoute_spec,
+    updateRoute_virtualRouterName,
+
+    -- * Destructuring the Response
+    UpdateRouteResponse (..),
+    newUpdateRouteResponse,
+
+    -- * Response Lenses
+    updateRouteResponse_httpStatus,
+    updateRouteResponse_route,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateRoute' smart constructor.
+data UpdateRoute = UpdateRoute'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the route resides in.
+    meshName :: Prelude.Text,
+    -- | The name of the route to update.
+    routeName :: Prelude.Text,
+    -- | The new route specification to apply. This overwrites the existing data.
+    spec :: RouteSpec,
+    -- | The name of the virtual router that the route is associated with.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRoute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateRoute_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'updateRoute_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'updateRoute_meshName' - The name of the service mesh that the route resides in.
+--
+-- 'routeName', 'updateRoute_routeName' - The name of the route to update.
+--
+-- 'spec', 'updateRoute_spec' - The new route specification to apply. This overwrites the existing data.
+--
+-- 'virtualRouterName', 'updateRoute_virtualRouterName' - The name of the virtual router that the route is associated with.
+newUpdateRoute ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'routeName'
+  Prelude.Text ->
+  -- | 'spec'
+  RouteSpec ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  UpdateRoute
+newUpdateRoute
+  pMeshName_
+  pRouteName_
+  pSpec_
+  pVirtualRouterName_ =
+    UpdateRoute'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        routeName = pRouteName_,
+        spec = pSpec_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateRoute_clientToken :: Lens.Lens' UpdateRoute (Prelude.Maybe Prelude.Text)
+updateRoute_clientToken = Lens.lens (\UpdateRoute' {clientToken} -> clientToken) (\s@UpdateRoute' {} a -> s {clientToken = a} :: UpdateRoute)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+updateRoute_meshOwner :: Lens.Lens' UpdateRoute (Prelude.Maybe Prelude.Text)
+updateRoute_meshOwner = Lens.lens (\UpdateRoute' {meshOwner} -> meshOwner) (\s@UpdateRoute' {} a -> s {meshOwner = a} :: UpdateRoute)
+
+-- | The name of the service mesh that the route resides in.
+updateRoute_meshName :: Lens.Lens' UpdateRoute Prelude.Text
+updateRoute_meshName = Lens.lens (\UpdateRoute' {meshName} -> meshName) (\s@UpdateRoute' {} a -> s {meshName = a} :: UpdateRoute)
+
+-- | The name of the route to update.
+updateRoute_routeName :: Lens.Lens' UpdateRoute Prelude.Text
+updateRoute_routeName = Lens.lens (\UpdateRoute' {routeName} -> routeName) (\s@UpdateRoute' {} a -> s {routeName = a} :: UpdateRoute)
+
+-- | The new route specification to apply. This overwrites the existing data.
+updateRoute_spec :: Lens.Lens' UpdateRoute RouteSpec
+updateRoute_spec = Lens.lens (\UpdateRoute' {spec} -> spec) (\s@UpdateRoute' {} a -> s {spec = a} :: UpdateRoute)
+
+-- | The name of the virtual router that the route is associated with.
+updateRoute_virtualRouterName :: Lens.Lens' UpdateRoute Prelude.Text
+updateRoute_virtualRouterName = Lens.lens (\UpdateRoute' {virtualRouterName} -> virtualRouterName) (\s@UpdateRoute' {} a -> s {virtualRouterName = a} :: UpdateRoute)
+
+instance Core.AWSRequest UpdateRoute where
+  type AWSResponse UpdateRoute = UpdateRouteResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateRouteResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateRoute where
+  hashWithSalt _salt UpdateRoute' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` routeName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData UpdateRoute where
+  rnf UpdateRoute' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf routeName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders UpdateRoute where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateRoute where
+  toJSON UpdateRoute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath UpdateRoute where
+  toPath UpdateRoute' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouter/",
+        Data.toBS virtualRouterName,
+        "/routes/",
+        Data.toBS routeName
+      ]
+
+instance Data.ToQuery UpdateRoute where
+  toQuery UpdateRoute' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newUpdateRouteResponse' smart constructor.
+data UpdateRouteResponse = UpdateRouteResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A full description of the route that was updated.
+    route :: RouteData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRouteResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateRouteResponse_httpStatus' - The response's http status code.
+--
+-- 'route', 'updateRouteResponse_route' - A full description of the route that was updated.
+newUpdateRouteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'route'
+  RouteData ->
+  UpdateRouteResponse
+newUpdateRouteResponse pHttpStatus_ pRoute_ =
+  UpdateRouteResponse'
+    { httpStatus = pHttpStatus_,
+      route = pRoute_
+    }
+
+-- | The response's http status code.
+updateRouteResponse_httpStatus :: Lens.Lens' UpdateRouteResponse Prelude.Int
+updateRouteResponse_httpStatus = Lens.lens (\UpdateRouteResponse' {httpStatus} -> httpStatus) (\s@UpdateRouteResponse' {} a -> s {httpStatus = a} :: UpdateRouteResponse)
+
+-- | A full description of the route that was updated.
+updateRouteResponse_route :: Lens.Lens' UpdateRouteResponse RouteData
+updateRouteResponse_route = Lens.lens (\UpdateRouteResponse' {route} -> route) (\s@UpdateRouteResponse' {} a -> s {route = a} :: UpdateRouteResponse)
+
+instance Prelude.NFData UpdateRouteResponse where
+  rnf UpdateRouteResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf route
diff --git a/gen/Amazonka/AppMesh/UpdateVirtualGateway.hs b/gen/Amazonka/AppMesh/UpdateVirtualGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateVirtualGateway.hs
@@ -0,0 +1,255 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateVirtualGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing virtual gateway in a specified service mesh.
+module Amazonka.AppMesh.UpdateVirtualGateway
+  ( -- * Creating a Request
+    UpdateVirtualGateway (..),
+    newUpdateVirtualGateway,
+
+    -- * Request Lenses
+    updateVirtualGateway_clientToken,
+    updateVirtualGateway_meshOwner,
+    updateVirtualGateway_meshName,
+    updateVirtualGateway_spec,
+    updateVirtualGateway_virtualGatewayName,
+
+    -- * Destructuring the Response
+    UpdateVirtualGatewayResponse (..),
+    newUpdateVirtualGatewayResponse,
+
+    -- * Response Lenses
+    updateVirtualGatewayResponse_httpStatus,
+    updateVirtualGatewayResponse_virtualGateway,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateVirtualGateway' smart constructor.
+data UpdateVirtualGateway = UpdateVirtualGateway'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual gateway resides in.
+    meshName :: Prelude.Text,
+    -- | The new virtual gateway specification to apply. This overwrites the
+    -- existing data.
+    spec :: VirtualGatewaySpec,
+    -- | The name of the virtual gateway to update.
+    virtualGatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateVirtualGateway_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'updateVirtualGateway_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'updateVirtualGateway_meshName' - The name of the service mesh that the virtual gateway resides in.
+--
+-- 'spec', 'updateVirtualGateway_spec' - The new virtual gateway specification to apply. This overwrites the
+-- existing data.
+--
+-- 'virtualGatewayName', 'updateVirtualGateway_virtualGatewayName' - The name of the virtual gateway to update.
+newUpdateVirtualGateway ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualGatewaySpec ->
+  -- | 'virtualGatewayName'
+  Prelude.Text ->
+  UpdateVirtualGateway
+newUpdateVirtualGateway
+  pMeshName_
+  pSpec_
+  pVirtualGatewayName_ =
+    UpdateVirtualGateway'
+      { clientToken =
+          Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualGatewayName = pVirtualGatewayName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateVirtualGateway_clientToken :: Lens.Lens' UpdateVirtualGateway (Prelude.Maybe Prelude.Text)
+updateVirtualGateway_clientToken = Lens.lens (\UpdateVirtualGateway' {clientToken} -> clientToken) (\s@UpdateVirtualGateway' {} a -> s {clientToken = a} :: UpdateVirtualGateway)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+updateVirtualGateway_meshOwner :: Lens.Lens' UpdateVirtualGateway (Prelude.Maybe Prelude.Text)
+updateVirtualGateway_meshOwner = Lens.lens (\UpdateVirtualGateway' {meshOwner} -> meshOwner) (\s@UpdateVirtualGateway' {} a -> s {meshOwner = a} :: UpdateVirtualGateway)
+
+-- | The name of the service mesh that the virtual gateway resides in.
+updateVirtualGateway_meshName :: Lens.Lens' UpdateVirtualGateway Prelude.Text
+updateVirtualGateway_meshName = Lens.lens (\UpdateVirtualGateway' {meshName} -> meshName) (\s@UpdateVirtualGateway' {} a -> s {meshName = a} :: UpdateVirtualGateway)
+
+-- | The new virtual gateway specification to apply. This overwrites the
+-- existing data.
+updateVirtualGateway_spec :: Lens.Lens' UpdateVirtualGateway VirtualGatewaySpec
+updateVirtualGateway_spec = Lens.lens (\UpdateVirtualGateway' {spec} -> spec) (\s@UpdateVirtualGateway' {} a -> s {spec = a} :: UpdateVirtualGateway)
+
+-- | The name of the virtual gateway to update.
+updateVirtualGateway_virtualGatewayName :: Lens.Lens' UpdateVirtualGateway Prelude.Text
+updateVirtualGateway_virtualGatewayName = Lens.lens (\UpdateVirtualGateway' {virtualGatewayName} -> virtualGatewayName) (\s@UpdateVirtualGateway' {} a -> s {virtualGatewayName = a} :: UpdateVirtualGateway)
+
+instance Core.AWSRequest UpdateVirtualGateway where
+  type
+    AWSResponse UpdateVirtualGateway =
+      UpdateVirtualGatewayResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVirtualGatewayResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateVirtualGateway where
+  hashWithSalt _salt UpdateVirtualGateway' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualGatewayName
+
+instance Prelude.NFData UpdateVirtualGateway where
+  rnf UpdateVirtualGateway' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualGatewayName
+
+instance Data.ToHeaders UpdateVirtualGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateVirtualGateway where
+  toJSON UpdateVirtualGateway' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath UpdateVirtualGateway where
+  toPath UpdateVirtualGateway' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualGateways/",
+        Data.toBS virtualGatewayName
+      ]
+
+instance Data.ToQuery UpdateVirtualGateway where
+  toQuery UpdateVirtualGateway' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- | /See:/ 'newUpdateVirtualGatewayResponse' smart constructor.
+data UpdateVirtualGatewayResponse = UpdateVirtualGatewayResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A full description of the virtual gateway that was updated.
+    virtualGateway :: VirtualGatewayData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateVirtualGatewayResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualGateway', 'updateVirtualGatewayResponse_virtualGateway' - A full description of the virtual gateway that was updated.
+newUpdateVirtualGatewayResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualGateway'
+  VirtualGatewayData ->
+  UpdateVirtualGatewayResponse
+newUpdateVirtualGatewayResponse
+  pHttpStatus_
+  pVirtualGateway_ =
+    UpdateVirtualGatewayResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualGateway = pVirtualGateway_
+      }
+
+-- | The response's http status code.
+updateVirtualGatewayResponse_httpStatus :: Lens.Lens' UpdateVirtualGatewayResponse Prelude.Int
+updateVirtualGatewayResponse_httpStatus = Lens.lens (\UpdateVirtualGatewayResponse' {httpStatus} -> httpStatus) (\s@UpdateVirtualGatewayResponse' {} a -> s {httpStatus = a} :: UpdateVirtualGatewayResponse)
+
+-- | A full description of the virtual gateway that was updated.
+updateVirtualGatewayResponse_virtualGateway :: Lens.Lens' UpdateVirtualGatewayResponse VirtualGatewayData
+updateVirtualGatewayResponse_virtualGateway = Lens.lens (\UpdateVirtualGatewayResponse' {virtualGateway} -> virtualGateway) (\s@UpdateVirtualGatewayResponse' {} a -> s {virtualGateway = a} :: UpdateVirtualGatewayResponse)
+
+instance Prelude.NFData UpdateVirtualGatewayResponse where
+  rnf UpdateVirtualGatewayResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualGateway
diff --git a/gen/Amazonka/AppMesh/UpdateVirtualNode.hs b/gen/Amazonka/AppMesh/UpdateVirtualNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateVirtualNode.hs
@@ -0,0 +1,258 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateVirtualNode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing virtual node in a specified service mesh.
+module Amazonka.AppMesh.UpdateVirtualNode
+  ( -- * Creating a Request
+    UpdateVirtualNode (..),
+    newUpdateVirtualNode,
+
+    -- * Request Lenses
+    updateVirtualNode_clientToken,
+    updateVirtualNode_meshOwner,
+    updateVirtualNode_meshName,
+    updateVirtualNode_spec,
+    updateVirtualNode_virtualNodeName,
+
+    -- * Destructuring the Response
+    UpdateVirtualNodeResponse (..),
+    newUpdateVirtualNodeResponse,
+
+    -- * Response Lenses
+    updateVirtualNodeResponse_httpStatus,
+    updateVirtualNodeResponse_virtualNode,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateVirtualNode' smart constructor.
+data UpdateVirtualNode = UpdateVirtualNode'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual node resides in.
+    meshName :: Prelude.Text,
+    -- | The new virtual node specification to apply. This overwrites the
+    -- existing data.
+    spec :: VirtualNodeSpec,
+    -- | The name of the virtual node to update.
+    virtualNodeName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualNode' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateVirtualNode_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'updateVirtualNode_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'updateVirtualNode_meshName' - The name of the service mesh that the virtual node resides in.
+--
+-- 'spec', 'updateVirtualNode_spec' - The new virtual node specification to apply. This overwrites the
+-- existing data.
+--
+-- 'virtualNodeName', 'updateVirtualNode_virtualNodeName' - The name of the virtual node to update.
+newUpdateVirtualNode ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualNodeSpec ->
+  -- | 'virtualNodeName'
+  Prelude.Text ->
+  UpdateVirtualNode
+newUpdateVirtualNode
+  pMeshName_
+  pSpec_
+  pVirtualNodeName_ =
+    UpdateVirtualNode'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualNodeName = pVirtualNodeName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateVirtualNode_clientToken :: Lens.Lens' UpdateVirtualNode (Prelude.Maybe Prelude.Text)
+updateVirtualNode_clientToken = Lens.lens (\UpdateVirtualNode' {clientToken} -> clientToken) (\s@UpdateVirtualNode' {} a -> s {clientToken = a} :: UpdateVirtualNode)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+updateVirtualNode_meshOwner :: Lens.Lens' UpdateVirtualNode (Prelude.Maybe Prelude.Text)
+updateVirtualNode_meshOwner = Lens.lens (\UpdateVirtualNode' {meshOwner} -> meshOwner) (\s@UpdateVirtualNode' {} a -> s {meshOwner = a} :: UpdateVirtualNode)
+
+-- | The name of the service mesh that the virtual node resides in.
+updateVirtualNode_meshName :: Lens.Lens' UpdateVirtualNode Prelude.Text
+updateVirtualNode_meshName = Lens.lens (\UpdateVirtualNode' {meshName} -> meshName) (\s@UpdateVirtualNode' {} a -> s {meshName = a} :: UpdateVirtualNode)
+
+-- | The new virtual node specification to apply. This overwrites the
+-- existing data.
+updateVirtualNode_spec :: Lens.Lens' UpdateVirtualNode VirtualNodeSpec
+updateVirtualNode_spec = Lens.lens (\UpdateVirtualNode' {spec} -> spec) (\s@UpdateVirtualNode' {} a -> s {spec = a} :: UpdateVirtualNode)
+
+-- | The name of the virtual node to update.
+updateVirtualNode_virtualNodeName :: Lens.Lens' UpdateVirtualNode Prelude.Text
+updateVirtualNode_virtualNodeName = Lens.lens (\UpdateVirtualNode' {virtualNodeName} -> virtualNodeName) (\s@UpdateVirtualNode' {} a -> s {virtualNodeName = a} :: UpdateVirtualNode)
+
+instance Core.AWSRequest UpdateVirtualNode where
+  type
+    AWSResponse UpdateVirtualNode =
+      UpdateVirtualNodeResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVirtualNodeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateVirtualNode where
+  hashWithSalt _salt UpdateVirtualNode' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualNodeName
+
+instance Prelude.NFData UpdateVirtualNode where
+  rnf UpdateVirtualNode' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualNodeName
+
+instance Data.ToHeaders UpdateVirtualNode where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateVirtualNode where
+  toJSON UpdateVirtualNode' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath UpdateVirtualNode where
+  toPath UpdateVirtualNode' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualNodes/",
+        Data.toBS virtualNodeName
+      ]
+
+instance Data.ToQuery UpdateVirtualNode where
+  toQuery UpdateVirtualNode' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newUpdateVirtualNodeResponse' smart constructor.
+data UpdateVirtualNodeResponse = UpdateVirtualNodeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A full description of the virtual node that was updated.
+    virtualNode :: VirtualNodeData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualNodeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateVirtualNodeResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualNode', 'updateVirtualNodeResponse_virtualNode' - A full description of the virtual node that was updated.
+newUpdateVirtualNodeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualNode'
+  VirtualNodeData ->
+  UpdateVirtualNodeResponse
+newUpdateVirtualNodeResponse
+  pHttpStatus_
+  pVirtualNode_ =
+    UpdateVirtualNodeResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualNode = pVirtualNode_
+      }
+
+-- | The response's http status code.
+updateVirtualNodeResponse_httpStatus :: Lens.Lens' UpdateVirtualNodeResponse Prelude.Int
+updateVirtualNodeResponse_httpStatus = Lens.lens (\UpdateVirtualNodeResponse' {httpStatus} -> httpStatus) (\s@UpdateVirtualNodeResponse' {} a -> s {httpStatus = a} :: UpdateVirtualNodeResponse)
+
+-- | A full description of the virtual node that was updated.
+updateVirtualNodeResponse_virtualNode :: Lens.Lens' UpdateVirtualNodeResponse VirtualNodeData
+updateVirtualNodeResponse_virtualNode = Lens.lens (\UpdateVirtualNodeResponse' {virtualNode} -> virtualNode) (\s@UpdateVirtualNodeResponse' {} a -> s {virtualNode = a} :: UpdateVirtualNodeResponse)
+
+instance Prelude.NFData UpdateVirtualNodeResponse where
+  rnf UpdateVirtualNodeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualNode
diff --git a/gen/Amazonka/AppMesh/UpdateVirtualRouter.hs b/gen/Amazonka/AppMesh/UpdateVirtualRouter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateVirtualRouter.hs
@@ -0,0 +1,258 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateVirtualRouter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing virtual router in a specified service mesh.
+module Amazonka.AppMesh.UpdateVirtualRouter
+  ( -- * Creating a Request
+    UpdateVirtualRouter (..),
+    newUpdateVirtualRouter,
+
+    -- * Request Lenses
+    updateVirtualRouter_clientToken,
+    updateVirtualRouter_meshOwner,
+    updateVirtualRouter_meshName,
+    updateVirtualRouter_spec,
+    updateVirtualRouter_virtualRouterName,
+
+    -- * Destructuring the Response
+    UpdateVirtualRouterResponse (..),
+    newUpdateVirtualRouterResponse,
+
+    -- * Response Lenses
+    updateVirtualRouterResponse_httpStatus,
+    updateVirtualRouterResponse_virtualRouter,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateVirtualRouter' smart constructor.
+data UpdateVirtualRouter = UpdateVirtualRouter'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual router resides in.
+    meshName :: Prelude.Text,
+    -- | The new virtual router specification to apply. This overwrites the
+    -- existing data.
+    spec :: VirtualRouterSpec,
+    -- | The name of the virtual router to update.
+    virtualRouterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualRouter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateVirtualRouter_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'updateVirtualRouter_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'updateVirtualRouter_meshName' - The name of the service mesh that the virtual router resides in.
+--
+-- 'spec', 'updateVirtualRouter_spec' - The new virtual router specification to apply. This overwrites the
+-- existing data.
+--
+-- 'virtualRouterName', 'updateVirtualRouter_virtualRouterName' - The name of the virtual router to update.
+newUpdateVirtualRouter ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualRouterSpec ->
+  -- | 'virtualRouterName'
+  Prelude.Text ->
+  UpdateVirtualRouter
+newUpdateVirtualRouter
+  pMeshName_
+  pSpec_
+  pVirtualRouterName_ =
+    UpdateVirtualRouter'
+      { clientToken = Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualRouterName = pVirtualRouterName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateVirtualRouter_clientToken :: Lens.Lens' UpdateVirtualRouter (Prelude.Maybe Prelude.Text)
+updateVirtualRouter_clientToken = Lens.lens (\UpdateVirtualRouter' {clientToken} -> clientToken) (\s@UpdateVirtualRouter' {} a -> s {clientToken = a} :: UpdateVirtualRouter)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+updateVirtualRouter_meshOwner :: Lens.Lens' UpdateVirtualRouter (Prelude.Maybe Prelude.Text)
+updateVirtualRouter_meshOwner = Lens.lens (\UpdateVirtualRouter' {meshOwner} -> meshOwner) (\s@UpdateVirtualRouter' {} a -> s {meshOwner = a} :: UpdateVirtualRouter)
+
+-- | The name of the service mesh that the virtual router resides in.
+updateVirtualRouter_meshName :: Lens.Lens' UpdateVirtualRouter Prelude.Text
+updateVirtualRouter_meshName = Lens.lens (\UpdateVirtualRouter' {meshName} -> meshName) (\s@UpdateVirtualRouter' {} a -> s {meshName = a} :: UpdateVirtualRouter)
+
+-- | The new virtual router specification to apply. This overwrites the
+-- existing data.
+updateVirtualRouter_spec :: Lens.Lens' UpdateVirtualRouter VirtualRouterSpec
+updateVirtualRouter_spec = Lens.lens (\UpdateVirtualRouter' {spec} -> spec) (\s@UpdateVirtualRouter' {} a -> s {spec = a} :: UpdateVirtualRouter)
+
+-- | The name of the virtual router to update.
+updateVirtualRouter_virtualRouterName :: Lens.Lens' UpdateVirtualRouter Prelude.Text
+updateVirtualRouter_virtualRouterName = Lens.lens (\UpdateVirtualRouter' {virtualRouterName} -> virtualRouterName) (\s@UpdateVirtualRouter' {} a -> s {virtualRouterName = a} :: UpdateVirtualRouter)
+
+instance Core.AWSRequest UpdateVirtualRouter where
+  type
+    AWSResponse UpdateVirtualRouter =
+      UpdateVirtualRouterResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVirtualRouterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateVirtualRouter where
+  hashWithSalt _salt UpdateVirtualRouter' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualRouterName
+
+instance Prelude.NFData UpdateVirtualRouter where
+  rnf UpdateVirtualRouter' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualRouterName
+
+instance Data.ToHeaders UpdateVirtualRouter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateVirtualRouter where
+  toJSON UpdateVirtualRouter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath UpdateVirtualRouter where
+  toPath UpdateVirtualRouter' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualRouters/",
+        Data.toBS virtualRouterName
+      ]
+
+instance Data.ToQuery UpdateVirtualRouter where
+  toQuery UpdateVirtualRouter' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newUpdateVirtualRouterResponse' smart constructor.
+data UpdateVirtualRouterResponse = UpdateVirtualRouterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A full description of the virtual router that was updated.
+    virtualRouter :: VirtualRouterData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualRouterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateVirtualRouterResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualRouter', 'updateVirtualRouterResponse_virtualRouter' - A full description of the virtual router that was updated.
+newUpdateVirtualRouterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualRouter'
+  VirtualRouterData ->
+  UpdateVirtualRouterResponse
+newUpdateVirtualRouterResponse
+  pHttpStatus_
+  pVirtualRouter_ =
+    UpdateVirtualRouterResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualRouter = pVirtualRouter_
+      }
+
+-- | The response's http status code.
+updateVirtualRouterResponse_httpStatus :: Lens.Lens' UpdateVirtualRouterResponse Prelude.Int
+updateVirtualRouterResponse_httpStatus = Lens.lens (\UpdateVirtualRouterResponse' {httpStatus} -> httpStatus) (\s@UpdateVirtualRouterResponse' {} a -> s {httpStatus = a} :: UpdateVirtualRouterResponse)
+
+-- | A full description of the virtual router that was updated.
+updateVirtualRouterResponse_virtualRouter :: Lens.Lens' UpdateVirtualRouterResponse VirtualRouterData
+updateVirtualRouterResponse_virtualRouter = Lens.lens (\UpdateVirtualRouterResponse' {virtualRouter} -> virtualRouter) (\s@UpdateVirtualRouterResponse' {} a -> s {virtualRouter = a} :: UpdateVirtualRouterResponse)
+
+instance Prelude.NFData UpdateVirtualRouterResponse where
+  rnf UpdateVirtualRouterResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualRouter
diff --git a/gen/Amazonka/AppMesh/UpdateVirtualService.hs b/gen/Amazonka/AppMesh/UpdateVirtualService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/UpdateVirtualService.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.UpdateVirtualService
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing virtual service in a specified service mesh.
+module Amazonka.AppMesh.UpdateVirtualService
+  ( -- * Creating a Request
+    UpdateVirtualService (..),
+    newUpdateVirtualService,
+
+    -- * Request Lenses
+    updateVirtualService_clientToken,
+    updateVirtualService_meshOwner,
+    updateVirtualService_meshName,
+    updateVirtualService_spec,
+    updateVirtualService_virtualServiceName,
+
+    -- * Destructuring the Response
+    UpdateVirtualServiceResponse (..),
+    newUpdateVirtualServiceResponse,
+
+    -- * Response Lenses
+    updateVirtualServiceResponse_httpStatus,
+    updateVirtualServiceResponse_virtualService,
+  )
+where
+
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateVirtualService' smart constructor.
+data UpdateVirtualService = UpdateVirtualService'
+  { -- | Unique, case-sensitive identifier that you provide to ensure the
+    -- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+    -- underscores are allowed.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+    -- account ID is not your own, then it\'s the ID of the account that shared
+    -- the mesh with your account. For more information about mesh sharing, see
+    -- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+    meshOwner :: Prelude.Maybe Prelude.Text,
+    -- | The name of the service mesh that the virtual service resides in.
+    meshName :: Prelude.Text,
+    -- | The new virtual service specification to apply. This overwrites the
+    -- existing data.
+    spec :: VirtualServiceSpec,
+    -- | The name of the virtual service to update.
+    virtualServiceName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualService' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateVirtualService_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+--
+-- 'meshOwner', 'updateVirtualService_meshOwner' - The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+--
+-- 'meshName', 'updateVirtualService_meshName' - The name of the service mesh that the virtual service resides in.
+--
+-- 'spec', 'updateVirtualService_spec' - The new virtual service specification to apply. This overwrites the
+-- existing data.
+--
+-- 'virtualServiceName', 'updateVirtualService_virtualServiceName' - The name of the virtual service to update.
+newUpdateVirtualService ::
+  -- | 'meshName'
+  Prelude.Text ->
+  -- | 'spec'
+  VirtualServiceSpec ->
+  -- | 'virtualServiceName'
+  Prelude.Text ->
+  UpdateVirtualService
+newUpdateVirtualService
+  pMeshName_
+  pSpec_
+  pVirtualServiceName_ =
+    UpdateVirtualService'
+      { clientToken =
+          Prelude.Nothing,
+        meshOwner = Prelude.Nothing,
+        meshName = pMeshName_,
+        spec = pSpec_,
+        virtualServiceName = pVirtualServiceName_
+      }
+
+-- | Unique, case-sensitive identifier that you provide to ensure the
+-- idempotency of the request. Up to 36 letters, numbers, hyphens, and
+-- underscores are allowed.
+updateVirtualService_clientToken :: Lens.Lens' UpdateVirtualService (Prelude.Maybe Prelude.Text)
+updateVirtualService_clientToken = Lens.lens (\UpdateVirtualService' {clientToken} -> clientToken) (\s@UpdateVirtualService' {} a -> s {clientToken = a} :: UpdateVirtualService)
+
+-- | The Amazon Web Services IAM account ID of the service mesh owner. If the
+-- account ID is not your own, then it\'s the ID of the account that shared
+-- the mesh with your account. For more information about mesh sharing, see
+-- <https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html Working with shared meshes>.
+updateVirtualService_meshOwner :: Lens.Lens' UpdateVirtualService (Prelude.Maybe Prelude.Text)
+updateVirtualService_meshOwner = Lens.lens (\UpdateVirtualService' {meshOwner} -> meshOwner) (\s@UpdateVirtualService' {} a -> s {meshOwner = a} :: UpdateVirtualService)
+
+-- | The name of the service mesh that the virtual service resides in.
+updateVirtualService_meshName :: Lens.Lens' UpdateVirtualService Prelude.Text
+updateVirtualService_meshName = Lens.lens (\UpdateVirtualService' {meshName} -> meshName) (\s@UpdateVirtualService' {} a -> s {meshName = a} :: UpdateVirtualService)
+
+-- | The new virtual service specification to apply. This overwrites the
+-- existing data.
+updateVirtualService_spec :: Lens.Lens' UpdateVirtualService VirtualServiceSpec
+updateVirtualService_spec = Lens.lens (\UpdateVirtualService' {spec} -> spec) (\s@UpdateVirtualService' {} a -> s {spec = a} :: UpdateVirtualService)
+
+-- | The name of the virtual service to update.
+updateVirtualService_virtualServiceName :: Lens.Lens' UpdateVirtualService Prelude.Text
+updateVirtualService_virtualServiceName = Lens.lens (\UpdateVirtualService' {virtualServiceName} -> virtualServiceName) (\s@UpdateVirtualService' {} a -> s {virtualServiceName = a} :: UpdateVirtualService)
+
+instance Core.AWSRequest UpdateVirtualService where
+  type
+    AWSResponse UpdateVirtualService =
+      UpdateVirtualServiceResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVirtualServiceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateVirtualService where
+  hashWithSalt _salt UpdateVirtualService' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` meshOwner
+      `Prelude.hashWithSalt` meshName
+      `Prelude.hashWithSalt` spec
+      `Prelude.hashWithSalt` virtualServiceName
+
+instance Prelude.NFData UpdateVirtualService where
+  rnf UpdateVirtualService' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf meshOwner
+      `Prelude.seq` Prelude.rnf meshName
+      `Prelude.seq` Prelude.rnf spec
+      `Prelude.seq` Prelude.rnf virtualServiceName
+
+instance Data.ToHeaders UpdateVirtualService where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateVirtualService where
+  toJSON UpdateVirtualService' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("spec" Data..= spec)
+          ]
+      )
+
+instance Data.ToPath UpdateVirtualService where
+  toPath UpdateVirtualService' {..} =
+    Prelude.mconcat
+      [ "/v20190125/meshes/",
+        Data.toBS meshName,
+        "/virtualServices/",
+        Data.toBS virtualServiceName
+      ]
+
+instance Data.ToQuery UpdateVirtualService where
+  toQuery UpdateVirtualService' {..} =
+    Prelude.mconcat ["meshOwner" Data.=: meshOwner]
+
+-- |
+--
+-- /See:/ 'newUpdateVirtualServiceResponse' smart constructor.
+data UpdateVirtualServiceResponse = UpdateVirtualServiceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A full description of the virtual service that was updated.
+    virtualService :: VirtualServiceData
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVirtualServiceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateVirtualServiceResponse_httpStatus' - The response's http status code.
+--
+-- 'virtualService', 'updateVirtualServiceResponse_virtualService' - A full description of the virtual service that was updated.
+newUpdateVirtualServiceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'virtualService'
+  VirtualServiceData ->
+  UpdateVirtualServiceResponse
+newUpdateVirtualServiceResponse
+  pHttpStatus_
+  pVirtualService_ =
+    UpdateVirtualServiceResponse'
+      { httpStatus =
+          pHttpStatus_,
+        virtualService = pVirtualService_
+      }
+
+-- | The response's http status code.
+updateVirtualServiceResponse_httpStatus :: Lens.Lens' UpdateVirtualServiceResponse Prelude.Int
+updateVirtualServiceResponse_httpStatus = Lens.lens (\UpdateVirtualServiceResponse' {httpStatus} -> httpStatus) (\s@UpdateVirtualServiceResponse' {} a -> s {httpStatus = a} :: UpdateVirtualServiceResponse)
+
+-- | A full description of the virtual service that was updated.
+updateVirtualServiceResponse_virtualService :: Lens.Lens' UpdateVirtualServiceResponse VirtualServiceData
+updateVirtualServiceResponse_virtualService = Lens.lens (\UpdateVirtualServiceResponse' {virtualService} -> virtualService) (\s@UpdateVirtualServiceResponse' {} a -> s {virtualService = a} :: UpdateVirtualServiceResponse)
+
+instance Prelude.NFData UpdateVirtualServiceResponse where
+  rnf UpdateVirtualServiceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf virtualService
diff --git a/gen/Amazonka/AppMesh/Waiters.hs b/gen/Amazonka/AppMesh/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/AppMesh/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.AppMesh.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.AppMesh.Waiters where
+
+import Amazonka.AppMesh.Lens
+import Amazonka.AppMesh.Types
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.AppMesh
+import Test.Amazonka.AppMesh.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "AppMesh"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/AppMesh.hs b/test/Test/Amazonka/AppMesh.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/AppMesh.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.AppMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.AppMesh
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/AppMesh/Internal.hs b/test/Test/Amazonka/AppMesh/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/AppMesh/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.AppMesh.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.AppMesh.Internal where
diff --git a/test/Test/Amazonka/Gen/AppMesh.hs b/test/Test/Amazonka/Gen/AppMesh.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/AppMesh.hs
@@ -0,0 +1,798 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.AppMesh
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.AppMesh where
+
+import Amazonka.AppMesh
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.AppMesh.Internal
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestCreateGatewayRoute $
+--             newCreateGatewayRoute
+--
+--         , requestCreateMesh $
+--             newCreateMesh
+--
+--         , requestCreateRoute $
+--             newCreateRoute
+--
+--         , requestCreateVirtualGateway $
+--             newCreateVirtualGateway
+--
+--         , requestCreateVirtualNode $
+--             newCreateVirtualNode
+--
+--         , requestCreateVirtualRouter $
+--             newCreateVirtualRouter
+--
+--         , requestCreateVirtualService $
+--             newCreateVirtualService
+--
+--         , requestDeleteGatewayRoute $
+--             newDeleteGatewayRoute
+--
+--         , requestDeleteMesh $
+--             newDeleteMesh
+--
+--         , requestDeleteRoute $
+--             newDeleteRoute
+--
+--         , requestDeleteVirtualGateway $
+--             newDeleteVirtualGateway
+--
+--         , requestDeleteVirtualNode $
+--             newDeleteVirtualNode
+--
+--         , requestDeleteVirtualRouter $
+--             newDeleteVirtualRouter
+--
+--         , requestDeleteVirtualService $
+--             newDeleteVirtualService
+--
+--         , requestDescribeGatewayRoute $
+--             newDescribeGatewayRoute
+--
+--         , requestDescribeMesh $
+--             newDescribeMesh
+--
+--         , requestDescribeRoute $
+--             newDescribeRoute
+--
+--         , requestDescribeVirtualGateway $
+--             newDescribeVirtualGateway
+--
+--         , requestDescribeVirtualNode $
+--             newDescribeVirtualNode
+--
+--         , requestDescribeVirtualRouter $
+--             newDescribeVirtualRouter
+--
+--         , requestDescribeVirtualService $
+--             newDescribeVirtualService
+--
+--         , requestListGatewayRoutes $
+--             newListGatewayRoutes
+--
+--         , requestListMeshes $
+--             newListMeshes
+--
+--         , requestListRoutes $
+--             newListRoutes
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestListVirtualGateways $
+--             newListVirtualGateways
+--
+--         , requestListVirtualNodes $
+--             newListVirtualNodes
+--
+--         , requestListVirtualRouters $
+--             newListVirtualRouters
+--
+--         , requestListVirtualServices $
+--             newListVirtualServices
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateGatewayRoute $
+--             newUpdateGatewayRoute
+--
+--         , requestUpdateMesh $
+--             newUpdateMesh
+--
+--         , requestUpdateRoute $
+--             newUpdateRoute
+--
+--         , requestUpdateVirtualGateway $
+--             newUpdateVirtualGateway
+--
+--         , requestUpdateVirtualNode $
+--             newUpdateVirtualNode
+--
+--         , requestUpdateVirtualRouter $
+--             newUpdateVirtualRouter
+--
+--         , requestUpdateVirtualService $
+--             newUpdateVirtualService
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateGatewayRoute $
+--             newCreateGatewayRouteResponse
+--
+--         , responseCreateMesh $
+--             newCreateMeshResponse
+--
+--         , responseCreateRoute $
+--             newCreateRouteResponse
+--
+--         , responseCreateVirtualGateway $
+--             newCreateVirtualGatewayResponse
+--
+--         , responseCreateVirtualNode $
+--             newCreateVirtualNodeResponse
+--
+--         , responseCreateVirtualRouter $
+--             newCreateVirtualRouterResponse
+--
+--         , responseCreateVirtualService $
+--             newCreateVirtualServiceResponse
+--
+--         , responseDeleteGatewayRoute $
+--             newDeleteGatewayRouteResponse
+--
+--         , responseDeleteMesh $
+--             newDeleteMeshResponse
+--
+--         , responseDeleteRoute $
+--             newDeleteRouteResponse
+--
+--         , responseDeleteVirtualGateway $
+--             newDeleteVirtualGatewayResponse
+--
+--         , responseDeleteVirtualNode $
+--             newDeleteVirtualNodeResponse
+--
+--         , responseDeleteVirtualRouter $
+--             newDeleteVirtualRouterResponse
+--
+--         , responseDeleteVirtualService $
+--             newDeleteVirtualServiceResponse
+--
+--         , responseDescribeGatewayRoute $
+--             newDescribeGatewayRouteResponse
+--
+--         , responseDescribeMesh $
+--             newDescribeMeshResponse
+--
+--         , responseDescribeRoute $
+--             newDescribeRouteResponse
+--
+--         , responseDescribeVirtualGateway $
+--             newDescribeVirtualGatewayResponse
+--
+--         , responseDescribeVirtualNode $
+--             newDescribeVirtualNodeResponse
+--
+--         , responseDescribeVirtualRouter $
+--             newDescribeVirtualRouterResponse
+--
+--         , responseDescribeVirtualService $
+--             newDescribeVirtualServiceResponse
+--
+--         , responseListGatewayRoutes $
+--             newListGatewayRoutesResponse
+--
+--         , responseListMeshes $
+--             newListMeshesResponse
+--
+--         , responseListRoutes $
+--             newListRoutesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseListVirtualGateways $
+--             newListVirtualGatewaysResponse
+--
+--         , responseListVirtualNodes $
+--             newListVirtualNodesResponse
+--
+--         , responseListVirtualRouters $
+--             newListVirtualRoutersResponse
+--
+--         , responseListVirtualServices $
+--             newListVirtualServicesResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateGatewayRoute $
+--             newUpdateGatewayRouteResponse
+--
+--         , responseUpdateMesh $
+--             newUpdateMeshResponse
+--
+--         , responseUpdateRoute $
+--             newUpdateRouteResponse
+--
+--         , responseUpdateVirtualGateway $
+--             newUpdateVirtualGatewayResponse
+--
+--         , responseUpdateVirtualNode $
+--             newUpdateVirtualNodeResponse
+--
+--         , responseUpdateVirtualRouter $
+--             newUpdateVirtualRouterResponse
+--
+--         , responseUpdateVirtualService $
+--             newUpdateVirtualServiceResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateGatewayRoute :: CreateGatewayRoute -> TestTree
+requestCreateGatewayRoute =
+  req
+    "CreateGatewayRoute"
+    "fixture/CreateGatewayRoute.yaml"
+
+requestCreateMesh :: CreateMesh -> TestTree
+requestCreateMesh =
+  req
+    "CreateMesh"
+    "fixture/CreateMesh.yaml"
+
+requestCreateRoute :: CreateRoute -> TestTree
+requestCreateRoute =
+  req
+    "CreateRoute"
+    "fixture/CreateRoute.yaml"
+
+requestCreateVirtualGateway :: CreateVirtualGateway -> TestTree
+requestCreateVirtualGateway =
+  req
+    "CreateVirtualGateway"
+    "fixture/CreateVirtualGateway.yaml"
+
+requestCreateVirtualNode :: CreateVirtualNode -> TestTree
+requestCreateVirtualNode =
+  req
+    "CreateVirtualNode"
+    "fixture/CreateVirtualNode.yaml"
+
+requestCreateVirtualRouter :: CreateVirtualRouter -> TestTree
+requestCreateVirtualRouter =
+  req
+    "CreateVirtualRouter"
+    "fixture/CreateVirtualRouter.yaml"
+
+requestCreateVirtualService :: CreateVirtualService -> TestTree
+requestCreateVirtualService =
+  req
+    "CreateVirtualService"
+    "fixture/CreateVirtualService.yaml"
+
+requestDeleteGatewayRoute :: DeleteGatewayRoute -> TestTree
+requestDeleteGatewayRoute =
+  req
+    "DeleteGatewayRoute"
+    "fixture/DeleteGatewayRoute.yaml"
+
+requestDeleteMesh :: DeleteMesh -> TestTree
+requestDeleteMesh =
+  req
+    "DeleteMesh"
+    "fixture/DeleteMesh.yaml"
+
+requestDeleteRoute :: DeleteRoute -> TestTree
+requestDeleteRoute =
+  req
+    "DeleteRoute"
+    "fixture/DeleteRoute.yaml"
+
+requestDeleteVirtualGateway :: DeleteVirtualGateway -> TestTree
+requestDeleteVirtualGateway =
+  req
+    "DeleteVirtualGateway"
+    "fixture/DeleteVirtualGateway.yaml"
+
+requestDeleteVirtualNode :: DeleteVirtualNode -> TestTree
+requestDeleteVirtualNode =
+  req
+    "DeleteVirtualNode"
+    "fixture/DeleteVirtualNode.yaml"
+
+requestDeleteVirtualRouter :: DeleteVirtualRouter -> TestTree
+requestDeleteVirtualRouter =
+  req
+    "DeleteVirtualRouter"
+    "fixture/DeleteVirtualRouter.yaml"
+
+requestDeleteVirtualService :: DeleteVirtualService -> TestTree
+requestDeleteVirtualService =
+  req
+    "DeleteVirtualService"
+    "fixture/DeleteVirtualService.yaml"
+
+requestDescribeGatewayRoute :: DescribeGatewayRoute -> TestTree
+requestDescribeGatewayRoute =
+  req
+    "DescribeGatewayRoute"
+    "fixture/DescribeGatewayRoute.yaml"
+
+requestDescribeMesh :: DescribeMesh -> TestTree
+requestDescribeMesh =
+  req
+    "DescribeMesh"
+    "fixture/DescribeMesh.yaml"
+
+requestDescribeRoute :: DescribeRoute -> TestTree
+requestDescribeRoute =
+  req
+    "DescribeRoute"
+    "fixture/DescribeRoute.yaml"
+
+requestDescribeVirtualGateway :: DescribeVirtualGateway -> TestTree
+requestDescribeVirtualGateway =
+  req
+    "DescribeVirtualGateway"
+    "fixture/DescribeVirtualGateway.yaml"
+
+requestDescribeVirtualNode :: DescribeVirtualNode -> TestTree
+requestDescribeVirtualNode =
+  req
+    "DescribeVirtualNode"
+    "fixture/DescribeVirtualNode.yaml"
+
+requestDescribeVirtualRouter :: DescribeVirtualRouter -> TestTree
+requestDescribeVirtualRouter =
+  req
+    "DescribeVirtualRouter"
+    "fixture/DescribeVirtualRouter.yaml"
+
+requestDescribeVirtualService :: DescribeVirtualService -> TestTree
+requestDescribeVirtualService =
+  req
+    "DescribeVirtualService"
+    "fixture/DescribeVirtualService.yaml"
+
+requestListGatewayRoutes :: ListGatewayRoutes -> TestTree
+requestListGatewayRoutes =
+  req
+    "ListGatewayRoutes"
+    "fixture/ListGatewayRoutes.yaml"
+
+requestListMeshes :: ListMeshes -> TestTree
+requestListMeshes =
+  req
+    "ListMeshes"
+    "fixture/ListMeshes.yaml"
+
+requestListRoutes :: ListRoutes -> TestTree
+requestListRoutes =
+  req
+    "ListRoutes"
+    "fixture/ListRoutes.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestListVirtualGateways :: ListVirtualGateways -> TestTree
+requestListVirtualGateways =
+  req
+    "ListVirtualGateways"
+    "fixture/ListVirtualGateways.yaml"
+
+requestListVirtualNodes :: ListVirtualNodes -> TestTree
+requestListVirtualNodes =
+  req
+    "ListVirtualNodes"
+    "fixture/ListVirtualNodes.yaml"
+
+requestListVirtualRouters :: ListVirtualRouters -> TestTree
+requestListVirtualRouters =
+  req
+    "ListVirtualRouters"
+    "fixture/ListVirtualRouters.yaml"
+
+requestListVirtualServices :: ListVirtualServices -> TestTree
+requestListVirtualServices =
+  req
+    "ListVirtualServices"
+    "fixture/ListVirtualServices.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateGatewayRoute :: UpdateGatewayRoute -> TestTree
+requestUpdateGatewayRoute =
+  req
+    "UpdateGatewayRoute"
+    "fixture/UpdateGatewayRoute.yaml"
+
+requestUpdateMesh :: UpdateMesh -> TestTree
+requestUpdateMesh =
+  req
+    "UpdateMesh"
+    "fixture/UpdateMesh.yaml"
+
+requestUpdateRoute :: UpdateRoute -> TestTree
+requestUpdateRoute =
+  req
+    "UpdateRoute"
+    "fixture/UpdateRoute.yaml"
+
+requestUpdateVirtualGateway :: UpdateVirtualGateway -> TestTree
+requestUpdateVirtualGateway =
+  req
+    "UpdateVirtualGateway"
+    "fixture/UpdateVirtualGateway.yaml"
+
+requestUpdateVirtualNode :: UpdateVirtualNode -> TestTree
+requestUpdateVirtualNode =
+  req
+    "UpdateVirtualNode"
+    "fixture/UpdateVirtualNode.yaml"
+
+requestUpdateVirtualRouter :: UpdateVirtualRouter -> TestTree
+requestUpdateVirtualRouter =
+  req
+    "UpdateVirtualRouter"
+    "fixture/UpdateVirtualRouter.yaml"
+
+requestUpdateVirtualService :: UpdateVirtualService -> TestTree
+requestUpdateVirtualService =
+  req
+    "UpdateVirtualService"
+    "fixture/UpdateVirtualService.yaml"
+
+-- Responses
+
+responseCreateGatewayRoute :: CreateGatewayRouteResponse -> TestTree
+responseCreateGatewayRoute =
+  res
+    "CreateGatewayRouteResponse"
+    "fixture/CreateGatewayRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateGatewayRoute)
+
+responseCreateMesh :: CreateMeshResponse -> TestTree
+responseCreateMesh =
+  res
+    "CreateMeshResponse"
+    "fixture/CreateMeshResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateMesh)
+
+responseCreateRoute :: CreateRouteResponse -> TestTree
+responseCreateRoute =
+  res
+    "CreateRouteResponse"
+    "fixture/CreateRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateRoute)
+
+responseCreateVirtualGateway :: CreateVirtualGatewayResponse -> TestTree
+responseCreateVirtualGateway =
+  res
+    "CreateVirtualGatewayResponse"
+    "fixture/CreateVirtualGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVirtualGateway)
+
+responseCreateVirtualNode :: CreateVirtualNodeResponse -> TestTree
+responseCreateVirtualNode =
+  res
+    "CreateVirtualNodeResponse"
+    "fixture/CreateVirtualNodeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVirtualNode)
+
+responseCreateVirtualRouter :: CreateVirtualRouterResponse -> TestTree
+responseCreateVirtualRouter =
+  res
+    "CreateVirtualRouterResponse"
+    "fixture/CreateVirtualRouterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVirtualRouter)
+
+responseCreateVirtualService :: CreateVirtualServiceResponse -> TestTree
+responseCreateVirtualService =
+  res
+    "CreateVirtualServiceResponse"
+    "fixture/CreateVirtualServiceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVirtualService)
+
+responseDeleteGatewayRoute :: DeleteGatewayRouteResponse -> TestTree
+responseDeleteGatewayRoute =
+  res
+    "DeleteGatewayRouteResponse"
+    "fixture/DeleteGatewayRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteGatewayRoute)
+
+responseDeleteMesh :: DeleteMeshResponse -> TestTree
+responseDeleteMesh =
+  res
+    "DeleteMeshResponse"
+    "fixture/DeleteMeshResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteMesh)
+
+responseDeleteRoute :: DeleteRouteResponse -> TestTree
+responseDeleteRoute =
+  res
+    "DeleteRouteResponse"
+    "fixture/DeleteRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRoute)
+
+responseDeleteVirtualGateway :: DeleteVirtualGatewayResponse -> TestTree
+responseDeleteVirtualGateway =
+  res
+    "DeleteVirtualGatewayResponse"
+    "fixture/DeleteVirtualGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVirtualGateway)
+
+responseDeleteVirtualNode :: DeleteVirtualNodeResponse -> TestTree
+responseDeleteVirtualNode =
+  res
+    "DeleteVirtualNodeResponse"
+    "fixture/DeleteVirtualNodeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVirtualNode)
+
+responseDeleteVirtualRouter :: DeleteVirtualRouterResponse -> TestTree
+responseDeleteVirtualRouter =
+  res
+    "DeleteVirtualRouterResponse"
+    "fixture/DeleteVirtualRouterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVirtualRouter)
+
+responseDeleteVirtualService :: DeleteVirtualServiceResponse -> TestTree
+responseDeleteVirtualService =
+  res
+    "DeleteVirtualServiceResponse"
+    "fixture/DeleteVirtualServiceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVirtualService)
+
+responseDescribeGatewayRoute :: DescribeGatewayRouteResponse -> TestTree
+responseDescribeGatewayRoute =
+  res
+    "DescribeGatewayRouteResponse"
+    "fixture/DescribeGatewayRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeGatewayRoute)
+
+responseDescribeMesh :: DescribeMeshResponse -> TestTree
+responseDescribeMesh =
+  res
+    "DescribeMeshResponse"
+    "fixture/DescribeMeshResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeMesh)
+
+responseDescribeRoute :: DescribeRouteResponse -> TestTree
+responseDescribeRoute =
+  res
+    "DescribeRouteResponse"
+    "fixture/DescribeRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRoute)
+
+responseDescribeVirtualGateway :: DescribeVirtualGatewayResponse -> TestTree
+responseDescribeVirtualGateway =
+  res
+    "DescribeVirtualGatewayResponse"
+    "fixture/DescribeVirtualGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeVirtualGateway)
+
+responseDescribeVirtualNode :: DescribeVirtualNodeResponse -> TestTree
+responseDescribeVirtualNode =
+  res
+    "DescribeVirtualNodeResponse"
+    "fixture/DescribeVirtualNodeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeVirtualNode)
+
+responseDescribeVirtualRouter :: DescribeVirtualRouterResponse -> TestTree
+responseDescribeVirtualRouter =
+  res
+    "DescribeVirtualRouterResponse"
+    "fixture/DescribeVirtualRouterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeVirtualRouter)
+
+responseDescribeVirtualService :: DescribeVirtualServiceResponse -> TestTree
+responseDescribeVirtualService =
+  res
+    "DescribeVirtualServiceResponse"
+    "fixture/DescribeVirtualServiceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeVirtualService)
+
+responseListGatewayRoutes :: ListGatewayRoutesResponse -> TestTree
+responseListGatewayRoutes =
+  res
+    "ListGatewayRoutesResponse"
+    "fixture/ListGatewayRoutesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListGatewayRoutes)
+
+responseListMeshes :: ListMeshesResponse -> TestTree
+responseListMeshes =
+  res
+    "ListMeshesResponse"
+    "fixture/ListMeshesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListMeshes)
+
+responseListRoutes :: ListRoutesResponse -> TestTree
+responseListRoutes =
+  res
+    "ListRoutesResponse"
+    "fixture/ListRoutesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRoutes)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseListVirtualGateways :: ListVirtualGatewaysResponse -> TestTree
+responseListVirtualGateways =
+  res
+    "ListVirtualGatewaysResponse"
+    "fixture/ListVirtualGatewaysResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVirtualGateways)
+
+responseListVirtualNodes :: ListVirtualNodesResponse -> TestTree
+responseListVirtualNodes =
+  res
+    "ListVirtualNodesResponse"
+    "fixture/ListVirtualNodesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVirtualNodes)
+
+responseListVirtualRouters :: ListVirtualRoutersResponse -> TestTree
+responseListVirtualRouters =
+  res
+    "ListVirtualRoutersResponse"
+    "fixture/ListVirtualRoutersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVirtualRouters)
+
+responseListVirtualServices :: ListVirtualServicesResponse -> TestTree
+responseListVirtualServices =
+  res
+    "ListVirtualServicesResponse"
+    "fixture/ListVirtualServicesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVirtualServices)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateGatewayRoute :: UpdateGatewayRouteResponse -> TestTree
+responseUpdateGatewayRoute =
+  res
+    "UpdateGatewayRouteResponse"
+    "fixture/UpdateGatewayRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateGatewayRoute)
+
+responseUpdateMesh :: UpdateMeshResponse -> TestTree
+responseUpdateMesh =
+  res
+    "UpdateMeshResponse"
+    "fixture/UpdateMeshResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateMesh)
+
+responseUpdateRoute :: UpdateRouteResponse -> TestTree
+responseUpdateRoute =
+  res
+    "UpdateRouteResponse"
+    "fixture/UpdateRouteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateRoute)
+
+responseUpdateVirtualGateway :: UpdateVirtualGatewayResponse -> TestTree
+responseUpdateVirtualGateway =
+  res
+    "UpdateVirtualGatewayResponse"
+    "fixture/UpdateVirtualGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVirtualGateway)
+
+responseUpdateVirtualNode :: UpdateVirtualNodeResponse -> TestTree
+responseUpdateVirtualNode =
+  res
+    "UpdateVirtualNodeResponse"
+    "fixture/UpdateVirtualNodeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVirtualNode)
+
+responseUpdateVirtualRouter :: UpdateVirtualRouterResponse -> TestTree
+responseUpdateVirtualRouter =
+  res
+    "UpdateVirtualRouterResponse"
+    "fixture/UpdateVirtualRouterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVirtualRouter)
+
+responseUpdateVirtualService :: UpdateVirtualServiceResponse -> TestTree
+responseUpdateVirtualService =
+  res
+    "UpdateVirtualServiceResponse"
+    "fixture/UpdateVirtualServiceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVirtualService)
