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 EMR Containers SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-10-01@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-emr-containers)
+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.EMRContainers](http://hackage.haskell.org/package/amazonka-emr-containers/docs/Amazonka-EMRContainers.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-emr-containers` 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-emr-containers.cabal b/amazonka-emr-containers.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-emr-containers.cabal
@@ -0,0 +1,131 @@
+cabal-version:      2.2
+name:               amazonka-emr-containers
+version:            2.0
+synopsis:           Amazon EMR Containers 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 @2020-10-01@ 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.EMRContainers.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.EMRContainers" 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-emr-containers
+
+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.EMRContainers
+    Amazonka.EMRContainers.CancelJobRun
+    Amazonka.EMRContainers.CreateJobTemplate
+    Amazonka.EMRContainers.CreateManagedEndpoint
+    Amazonka.EMRContainers.CreateVirtualCluster
+    Amazonka.EMRContainers.DeleteJobTemplate
+    Amazonka.EMRContainers.DeleteManagedEndpoint
+    Amazonka.EMRContainers.DeleteVirtualCluster
+    Amazonka.EMRContainers.DescribeJobRun
+    Amazonka.EMRContainers.DescribeJobTemplate
+    Amazonka.EMRContainers.DescribeManagedEndpoint
+    Amazonka.EMRContainers.DescribeVirtualCluster
+    Amazonka.EMRContainers.Lens
+    Amazonka.EMRContainers.ListJobRuns
+    Amazonka.EMRContainers.ListJobTemplates
+    Amazonka.EMRContainers.ListManagedEndpoints
+    Amazonka.EMRContainers.ListTagsForResource
+    Amazonka.EMRContainers.ListVirtualClusters
+    Amazonka.EMRContainers.StartJobRun
+    Amazonka.EMRContainers.TagResource
+    Amazonka.EMRContainers.Types
+    Amazonka.EMRContainers.Types.Certificate
+    Amazonka.EMRContainers.Types.CloudWatchMonitoringConfiguration
+    Amazonka.EMRContainers.Types.Configuration
+    Amazonka.EMRContainers.Types.ConfigurationOverrides
+    Amazonka.EMRContainers.Types.ContainerInfo
+    Amazonka.EMRContainers.Types.ContainerProvider
+    Amazonka.EMRContainers.Types.ContainerProviderType
+    Amazonka.EMRContainers.Types.EksInfo
+    Amazonka.EMRContainers.Types.Endpoint
+    Amazonka.EMRContainers.Types.EndpointState
+    Amazonka.EMRContainers.Types.FailureReason
+    Amazonka.EMRContainers.Types.JobDriver
+    Amazonka.EMRContainers.Types.JobRun
+    Amazonka.EMRContainers.Types.JobRunState
+    Amazonka.EMRContainers.Types.JobTemplate
+    Amazonka.EMRContainers.Types.JobTemplateData
+    Amazonka.EMRContainers.Types.MonitoringConfiguration
+    Amazonka.EMRContainers.Types.ParametricCloudWatchMonitoringConfiguration
+    Amazonka.EMRContainers.Types.ParametricConfigurationOverrides
+    Amazonka.EMRContainers.Types.ParametricMonitoringConfiguration
+    Amazonka.EMRContainers.Types.ParametricS3MonitoringConfiguration
+    Amazonka.EMRContainers.Types.PersistentAppUI
+    Amazonka.EMRContainers.Types.S3MonitoringConfiguration
+    Amazonka.EMRContainers.Types.SparkSqlJobDriver
+    Amazonka.EMRContainers.Types.SparkSubmitJobDriver
+    Amazonka.EMRContainers.Types.TemplateParameterConfiguration
+    Amazonka.EMRContainers.Types.TemplateParameterDataType
+    Amazonka.EMRContainers.Types.VirtualCluster
+    Amazonka.EMRContainers.Types.VirtualClusterState
+    Amazonka.EMRContainers.UntagResource
+    Amazonka.EMRContainers.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-emr-containers-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.EMRContainers
+    Test.Amazonka.EMRContainers.Internal
+    Test.Amazonka.Gen.EMRContainers
+
+  build-depends:
+    , amazonka-core            >=2.0 && <2.1
+    , amazonka-emr-containers
+    , amazonka-test            >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CancelJobRun.yaml b/fixture/CancelJobRun.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CancelJobRun.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/CancelJobRunResponse.proto b/fixture/CancelJobRunResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CancelJobRunResponse.proto
diff --git a/fixture/CreateJobTemplate.yaml b/fixture/CreateJobTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateJobTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/CreateJobTemplateResponse.proto b/fixture/CreateJobTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateJobTemplateResponse.proto
diff --git a/fixture/CreateManagedEndpoint.yaml b/fixture/CreateManagedEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateManagedEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/CreateManagedEndpointResponse.proto b/fixture/CreateManagedEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateManagedEndpointResponse.proto
diff --git a/fixture/CreateVirtualCluster.yaml b/fixture/CreateVirtualCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/CreateVirtualClusterResponse.proto b/fixture/CreateVirtualClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVirtualClusterResponse.proto
diff --git a/fixture/DeleteJobTemplate.yaml b/fixture/DeleteJobTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteJobTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DeleteJobTemplateResponse.proto b/fixture/DeleteJobTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteJobTemplateResponse.proto
diff --git a/fixture/DeleteManagedEndpoint.yaml b/fixture/DeleteManagedEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteManagedEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DeleteManagedEndpointResponse.proto b/fixture/DeleteManagedEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteManagedEndpointResponse.proto
diff --git a/fixture/DeleteVirtualCluster.yaml b/fixture/DeleteVirtualCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DeleteVirtualClusterResponse.proto b/fixture/DeleteVirtualClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVirtualClusterResponse.proto
diff --git a/fixture/DescribeJobRun.yaml b/fixture/DescribeJobRun.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeJobRun.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DescribeJobRunResponse.proto b/fixture/DescribeJobRunResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeJobRunResponse.proto
diff --git a/fixture/DescribeJobTemplate.yaml b/fixture/DescribeJobTemplate.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeJobTemplate.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DescribeJobTemplateResponse.proto b/fixture/DescribeJobTemplateResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeJobTemplateResponse.proto
diff --git a/fixture/DescribeManagedEndpoint.yaml b/fixture/DescribeManagedEndpoint.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeManagedEndpoint.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DescribeManagedEndpointResponse.proto b/fixture/DescribeManagedEndpointResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeManagedEndpointResponse.proto
diff --git a/fixture/DescribeVirtualCluster.yaml b/fixture/DescribeVirtualCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/DescribeVirtualClusterResponse.proto b/fixture/DescribeVirtualClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeVirtualClusterResponse.proto
diff --git a/fixture/ListJobRuns.yaml b/fixture/ListJobRuns.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListJobRuns.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/ListJobRunsResponse.proto b/fixture/ListJobRunsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListJobRunsResponse.proto
diff --git a/fixture/ListJobTemplates.yaml b/fixture/ListJobTemplates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListJobTemplates.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/ListJobTemplatesResponse.proto b/fixture/ListJobTemplatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListJobTemplatesResponse.proto
diff --git a/fixture/ListManagedEndpoints.yaml b/fixture/ListManagedEndpoints.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListManagedEndpoints.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/ListManagedEndpointsResponse.proto b/fixture/ListManagedEndpointsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListManagedEndpointsResponse.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/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/ListVirtualClusters.yaml b/fixture/ListVirtualClusters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualClusters.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/ListVirtualClustersResponse.proto b/fixture/ListVirtualClustersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVirtualClustersResponse.proto
diff --git a/fixture/StartJobRun.yaml b/fixture/StartJobRun.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartJobRun.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/StartJobRunResponse.proto b/fixture/StartJobRunResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartJobRunResponse.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: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/emr-containers/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  emr-containers.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/gen/Amazonka/EMRContainers.hs b/gen/Amazonka/EMRContainers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers.hs
@@ -0,0 +1,334 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.EMRContainers
+-- 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 @2020-10-01@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon EMR on EKS provides a deployment option for Amazon EMR that
+-- allows you to run open-source big data frameworks on Amazon Elastic
+-- Kubernetes Service (Amazon EKS). With this deployment option, you can
+-- focus on running analytics workloads while Amazon EMR on EKS builds,
+-- configures, and manages containers for open-source applications. For
+-- more information about Amazon EMR on EKS concepts and tasks, see
+-- <https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks.html What is Amazon EMR on EKS>.
+--
+-- /Amazon EMR containers/ is the API name for Amazon EMR on EKS. The
+-- @emr-containers@ prefix is used in the following scenarios:
+--
+-- -   It is the prefix in the CLI commands for Amazon EMR on EKS. For
+--     example, @aws emr-containers start-job-run@.
+--
+-- -   It is the prefix before IAM policy actions for Amazon EMR on EKS.
+--     For example, @\"Action\": [ \"emr-containers:StartJobRun\"]@. For
+--     more information, see
+--     <https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies-actions Policy actions for Amazon EMR on EKS>.
+--
+-- -   It is the prefix used in Amazon EMR on EKS service endpoints. For
+--     example, @emr-containers.us-east-2.amazonaws.com@. For more
+--     information, see
+--     <https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/service-quotas.html#service-endpoints Amazon EMR on EKS Service Endpoints>.
+module Amazonka.EMRContainers
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CancelJobRun
+    CancelJobRun (CancelJobRun'),
+    newCancelJobRun,
+    CancelJobRunResponse (CancelJobRunResponse'),
+    newCancelJobRunResponse,
+
+    -- ** CreateJobTemplate
+    CreateJobTemplate (CreateJobTemplate'),
+    newCreateJobTemplate,
+    CreateJobTemplateResponse (CreateJobTemplateResponse'),
+    newCreateJobTemplateResponse,
+
+    -- ** CreateManagedEndpoint
+    CreateManagedEndpoint (CreateManagedEndpoint'),
+    newCreateManagedEndpoint,
+    CreateManagedEndpointResponse (CreateManagedEndpointResponse'),
+    newCreateManagedEndpointResponse,
+
+    -- ** CreateVirtualCluster
+    CreateVirtualCluster (CreateVirtualCluster'),
+    newCreateVirtualCluster,
+    CreateVirtualClusterResponse (CreateVirtualClusterResponse'),
+    newCreateVirtualClusterResponse,
+
+    -- ** DeleteJobTemplate
+    DeleteJobTemplate (DeleteJobTemplate'),
+    newDeleteJobTemplate,
+    DeleteJobTemplateResponse (DeleteJobTemplateResponse'),
+    newDeleteJobTemplateResponse,
+
+    -- ** DeleteManagedEndpoint
+    DeleteManagedEndpoint (DeleteManagedEndpoint'),
+    newDeleteManagedEndpoint,
+    DeleteManagedEndpointResponse (DeleteManagedEndpointResponse'),
+    newDeleteManagedEndpointResponse,
+
+    -- ** DeleteVirtualCluster
+    DeleteVirtualCluster (DeleteVirtualCluster'),
+    newDeleteVirtualCluster,
+    DeleteVirtualClusterResponse (DeleteVirtualClusterResponse'),
+    newDeleteVirtualClusterResponse,
+
+    -- ** DescribeJobRun
+    DescribeJobRun (DescribeJobRun'),
+    newDescribeJobRun,
+    DescribeJobRunResponse (DescribeJobRunResponse'),
+    newDescribeJobRunResponse,
+
+    -- ** DescribeJobTemplate
+    DescribeJobTemplate (DescribeJobTemplate'),
+    newDescribeJobTemplate,
+    DescribeJobTemplateResponse (DescribeJobTemplateResponse'),
+    newDescribeJobTemplateResponse,
+
+    -- ** DescribeManagedEndpoint
+    DescribeManagedEndpoint (DescribeManagedEndpoint'),
+    newDescribeManagedEndpoint,
+    DescribeManagedEndpointResponse (DescribeManagedEndpointResponse'),
+    newDescribeManagedEndpointResponse,
+
+    -- ** DescribeVirtualCluster
+    DescribeVirtualCluster (DescribeVirtualCluster'),
+    newDescribeVirtualCluster,
+    DescribeVirtualClusterResponse (DescribeVirtualClusterResponse'),
+    newDescribeVirtualClusterResponse,
+
+    -- ** ListJobRuns (Paginated)
+    ListJobRuns (ListJobRuns'),
+    newListJobRuns,
+    ListJobRunsResponse (ListJobRunsResponse'),
+    newListJobRunsResponse,
+
+    -- ** ListJobTemplates (Paginated)
+    ListJobTemplates (ListJobTemplates'),
+    newListJobTemplates,
+    ListJobTemplatesResponse (ListJobTemplatesResponse'),
+    newListJobTemplatesResponse,
+
+    -- ** ListManagedEndpoints (Paginated)
+    ListManagedEndpoints (ListManagedEndpoints'),
+    newListManagedEndpoints,
+    ListManagedEndpointsResponse (ListManagedEndpointsResponse'),
+    newListManagedEndpointsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ListVirtualClusters (Paginated)
+    ListVirtualClusters (ListVirtualClusters'),
+    newListVirtualClusters,
+    ListVirtualClustersResponse (ListVirtualClustersResponse'),
+    newListVirtualClustersResponse,
+
+    -- ** StartJobRun
+    StartJobRun (StartJobRun'),
+    newStartJobRun,
+    StartJobRunResponse (StartJobRunResponse'),
+    newStartJobRunResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- * Types
+
+    -- ** ContainerProviderType
+    ContainerProviderType (..),
+
+    -- ** EndpointState
+    EndpointState (..),
+
+    -- ** FailureReason
+    FailureReason (..),
+
+    -- ** JobRunState
+    JobRunState (..),
+
+    -- ** PersistentAppUI
+    PersistentAppUI (..),
+
+    -- ** TemplateParameterDataType
+    TemplateParameterDataType (..),
+
+    -- ** VirtualClusterState
+    VirtualClusterState (..),
+
+    -- ** Certificate
+    Certificate (Certificate'),
+    newCertificate,
+
+    -- ** CloudWatchMonitoringConfiguration
+    CloudWatchMonitoringConfiguration (CloudWatchMonitoringConfiguration'),
+    newCloudWatchMonitoringConfiguration,
+
+    -- ** Configuration
+    Configuration (Configuration'),
+    newConfiguration,
+
+    -- ** ConfigurationOverrides
+    ConfigurationOverrides (ConfigurationOverrides'),
+    newConfigurationOverrides,
+
+    -- ** ContainerInfo
+    ContainerInfo (ContainerInfo'),
+    newContainerInfo,
+
+    -- ** ContainerProvider
+    ContainerProvider (ContainerProvider'),
+    newContainerProvider,
+
+    -- ** EksInfo
+    EksInfo (EksInfo'),
+    newEksInfo,
+
+    -- ** Endpoint
+    Endpoint (Endpoint'),
+    newEndpoint,
+
+    -- ** JobDriver
+    JobDriver (JobDriver'),
+    newJobDriver,
+
+    -- ** JobRun
+    JobRun (JobRun'),
+    newJobRun,
+
+    -- ** JobTemplate
+    JobTemplate (JobTemplate'),
+    newJobTemplate,
+
+    -- ** JobTemplateData
+    JobTemplateData (JobTemplateData'),
+    newJobTemplateData,
+
+    -- ** MonitoringConfiguration
+    MonitoringConfiguration (MonitoringConfiguration'),
+    newMonitoringConfiguration,
+
+    -- ** ParametricCloudWatchMonitoringConfiguration
+    ParametricCloudWatchMonitoringConfiguration (ParametricCloudWatchMonitoringConfiguration'),
+    newParametricCloudWatchMonitoringConfiguration,
+
+    -- ** ParametricConfigurationOverrides
+    ParametricConfigurationOverrides (ParametricConfigurationOverrides'),
+    newParametricConfigurationOverrides,
+
+    -- ** ParametricMonitoringConfiguration
+    ParametricMonitoringConfiguration (ParametricMonitoringConfiguration'),
+    newParametricMonitoringConfiguration,
+
+    -- ** ParametricS3MonitoringConfiguration
+    ParametricS3MonitoringConfiguration (ParametricS3MonitoringConfiguration'),
+    newParametricS3MonitoringConfiguration,
+
+    -- ** S3MonitoringConfiguration
+    S3MonitoringConfiguration (S3MonitoringConfiguration'),
+    newS3MonitoringConfiguration,
+
+    -- ** SparkSqlJobDriver
+    SparkSqlJobDriver (SparkSqlJobDriver'),
+    newSparkSqlJobDriver,
+
+    -- ** SparkSubmitJobDriver
+    SparkSubmitJobDriver (SparkSubmitJobDriver'),
+    newSparkSubmitJobDriver,
+
+    -- ** TemplateParameterConfiguration
+    TemplateParameterConfiguration (TemplateParameterConfiguration'),
+    newTemplateParameterConfiguration,
+
+    -- ** VirtualCluster
+    VirtualCluster (VirtualCluster'),
+    newVirtualCluster,
+  )
+where
+
+import Amazonka.EMRContainers.CancelJobRun
+import Amazonka.EMRContainers.CreateJobTemplate
+import Amazonka.EMRContainers.CreateManagedEndpoint
+import Amazonka.EMRContainers.CreateVirtualCluster
+import Amazonka.EMRContainers.DeleteJobTemplate
+import Amazonka.EMRContainers.DeleteManagedEndpoint
+import Amazonka.EMRContainers.DeleteVirtualCluster
+import Amazonka.EMRContainers.DescribeJobRun
+import Amazonka.EMRContainers.DescribeJobTemplate
+import Amazonka.EMRContainers.DescribeManagedEndpoint
+import Amazonka.EMRContainers.DescribeVirtualCluster
+import Amazonka.EMRContainers.Lens
+import Amazonka.EMRContainers.ListJobRuns
+import Amazonka.EMRContainers.ListJobTemplates
+import Amazonka.EMRContainers.ListManagedEndpoints
+import Amazonka.EMRContainers.ListTagsForResource
+import Amazonka.EMRContainers.ListVirtualClusters
+import Amazonka.EMRContainers.StartJobRun
+import Amazonka.EMRContainers.TagResource
+import Amazonka.EMRContainers.Types
+import Amazonka.EMRContainers.UntagResource
+import Amazonka.EMRContainers.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 'EMRContainers'.
+
+-- $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/EMRContainers/CancelJobRun.hs b/gen/Amazonka/EMRContainers/CancelJobRun.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/CancelJobRun.hs
@@ -0,0 +1,194 @@
+{-# 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.EMRContainers.CancelJobRun
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Cancels a job run. A job run is a unit of work, such as a Spark jar,
+-- PySpark script, or SparkSQL query, that you submit to Amazon EMR on EKS.
+module Amazonka.EMRContainers.CancelJobRun
+  ( -- * Creating a Request
+    CancelJobRun (..),
+    newCancelJobRun,
+
+    -- * Request Lenses
+    cancelJobRun_id,
+    cancelJobRun_virtualClusterId,
+
+    -- * Destructuring the Response
+    CancelJobRunResponse (..),
+    newCancelJobRunResponse,
+
+    -- * Response Lenses
+    cancelJobRunResponse_id,
+    cancelJobRunResponse_virtualClusterId,
+    cancelJobRunResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCancelJobRun' smart constructor.
+data CancelJobRun = CancelJobRun'
+  { -- | The ID of the job run to cancel.
+    id :: Prelude.Text,
+    -- | The ID of the virtual cluster for which the job run will be canceled.
+    virtualClusterId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelJobRun' 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:
+--
+-- 'id', 'cancelJobRun_id' - The ID of the job run to cancel.
+--
+-- 'virtualClusterId', 'cancelJobRun_virtualClusterId' - The ID of the virtual cluster for which the job run will be canceled.
+newCancelJobRun ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  CancelJobRun
+newCancelJobRun pId_ pVirtualClusterId_ =
+  CancelJobRun'
+    { id = pId_,
+      virtualClusterId = pVirtualClusterId_
+    }
+
+-- | The ID of the job run to cancel.
+cancelJobRun_id :: Lens.Lens' CancelJobRun Prelude.Text
+cancelJobRun_id = Lens.lens (\CancelJobRun' {id} -> id) (\s@CancelJobRun' {} a -> s {id = a} :: CancelJobRun)
+
+-- | The ID of the virtual cluster for which the job run will be canceled.
+cancelJobRun_virtualClusterId :: Lens.Lens' CancelJobRun Prelude.Text
+cancelJobRun_virtualClusterId = Lens.lens (\CancelJobRun' {virtualClusterId} -> virtualClusterId) (\s@CancelJobRun' {} a -> s {virtualClusterId = a} :: CancelJobRun)
+
+instance Core.AWSRequest CancelJobRun where
+  type AWSResponse CancelJobRun = CancelJobRunResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CancelJobRunResponse'
+            Prelude.<$> (x Data..?> "id")
+            Prelude.<*> (x Data..?> "virtualClusterId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CancelJobRun where
+  hashWithSalt _salt CancelJobRun' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData CancelJobRun where
+  rnf CancelJobRun' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf virtualClusterId
+
+instance Data.ToHeaders CancelJobRun where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath CancelJobRun where
+  toPath CancelJobRun' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/jobruns/",
+        Data.toBS id
+      ]
+
+instance Data.ToQuery CancelJobRun where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCancelJobRunResponse' smart constructor.
+data CancelJobRunResponse = CancelJobRunResponse'
+  { -- | The output contains the ID of the cancelled job run.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The output contains the virtual cluster ID for which the job run is
+    -- cancelled.
+    virtualClusterId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelJobRunResponse' 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:
+--
+-- 'id', 'cancelJobRunResponse_id' - The output contains the ID of the cancelled job run.
+--
+-- 'virtualClusterId', 'cancelJobRunResponse_virtualClusterId' - The output contains the virtual cluster ID for which the job run is
+-- cancelled.
+--
+-- 'httpStatus', 'cancelJobRunResponse_httpStatus' - The response's http status code.
+newCancelJobRunResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CancelJobRunResponse
+newCancelJobRunResponse pHttpStatus_ =
+  CancelJobRunResponse'
+    { id = Prelude.Nothing,
+      virtualClusterId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The output contains the ID of the cancelled job run.
+cancelJobRunResponse_id :: Lens.Lens' CancelJobRunResponse (Prelude.Maybe Prelude.Text)
+cancelJobRunResponse_id = Lens.lens (\CancelJobRunResponse' {id} -> id) (\s@CancelJobRunResponse' {} a -> s {id = a} :: CancelJobRunResponse)
+
+-- | The output contains the virtual cluster ID for which the job run is
+-- cancelled.
+cancelJobRunResponse_virtualClusterId :: Lens.Lens' CancelJobRunResponse (Prelude.Maybe Prelude.Text)
+cancelJobRunResponse_virtualClusterId = Lens.lens (\CancelJobRunResponse' {virtualClusterId} -> virtualClusterId) (\s@CancelJobRunResponse' {} a -> s {virtualClusterId = a} :: CancelJobRunResponse)
+
+-- | The response's http status code.
+cancelJobRunResponse_httpStatus :: Lens.Lens' CancelJobRunResponse Prelude.Int
+cancelJobRunResponse_httpStatus = Lens.lens (\CancelJobRunResponse' {httpStatus} -> httpStatus) (\s@CancelJobRunResponse' {} a -> s {httpStatus = a} :: CancelJobRunResponse)
+
+instance Prelude.NFData CancelJobRunResponse where
+  rnf CancelJobRunResponse' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf virtualClusterId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/CreateJobTemplate.hs b/gen/Amazonka/EMRContainers/CreateJobTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/CreateJobTemplate.hs
@@ -0,0 +1,270 @@
+{-# 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.EMRContainers.CreateJobTemplate
+-- 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 job template. Job template stores values of StartJobRun API
+-- request in a template and can be used to start a job run. Job template
+-- allows two use cases: avoid repeating recurring StartJobRun API request
+-- values, enforcing certain values in StartJobRun API request.
+module Amazonka.EMRContainers.CreateJobTemplate
+  ( -- * Creating a Request
+    CreateJobTemplate (..),
+    newCreateJobTemplate,
+
+    -- * Request Lenses
+    createJobTemplate_kmsKeyArn,
+    createJobTemplate_tags,
+    createJobTemplate_name,
+    createJobTemplate_clientToken,
+    createJobTemplate_jobTemplateData,
+
+    -- * Destructuring the Response
+    CreateJobTemplateResponse (..),
+    newCreateJobTemplateResponse,
+
+    -- * Response Lenses
+    createJobTemplateResponse_arn,
+    createJobTemplateResponse_createdAt,
+    createJobTemplateResponse_id,
+    createJobTemplateResponse_name,
+    createJobTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateJobTemplate' smart constructor.
+data CreateJobTemplate = CreateJobTemplate'
+  { -- | The KMS key ARN used to encrypt the job template.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The tags that are associated with the job template.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The specified name of the job template.
+    name :: Prelude.Text,
+    -- | The client token of the job template.
+    clientToken :: Prelude.Text,
+    -- | The job template data which holds values of StartJobRun API request.
+    jobTemplateData :: JobTemplateData
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateJobTemplate' 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:
+--
+-- 'kmsKeyArn', 'createJobTemplate_kmsKeyArn' - The KMS key ARN used to encrypt the job template.
+--
+-- 'tags', 'createJobTemplate_tags' - The tags that are associated with the job template.
+--
+-- 'name', 'createJobTemplate_name' - The specified name of the job template.
+--
+-- 'clientToken', 'createJobTemplate_clientToken' - The client token of the job template.
+--
+-- 'jobTemplateData', 'createJobTemplate_jobTemplateData' - The job template data which holds values of StartJobRun API request.
+newCreateJobTemplate ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'clientToken'
+  Prelude.Text ->
+  -- | 'jobTemplateData'
+  JobTemplateData ->
+  CreateJobTemplate
+newCreateJobTemplate
+  pName_
+  pClientToken_
+  pJobTemplateData_ =
+    CreateJobTemplate'
+      { kmsKeyArn = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        name = pName_,
+        clientToken = pClientToken_,
+        jobTemplateData = pJobTemplateData_
+      }
+
+-- | The KMS key ARN used to encrypt the job template.
+createJobTemplate_kmsKeyArn :: Lens.Lens' CreateJobTemplate (Prelude.Maybe Prelude.Text)
+createJobTemplate_kmsKeyArn = Lens.lens (\CreateJobTemplate' {kmsKeyArn} -> kmsKeyArn) (\s@CreateJobTemplate' {} a -> s {kmsKeyArn = a} :: CreateJobTemplate)
+
+-- | The tags that are associated with the job template.
+createJobTemplate_tags :: Lens.Lens' CreateJobTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createJobTemplate_tags = Lens.lens (\CreateJobTemplate' {tags} -> tags) (\s@CreateJobTemplate' {} a -> s {tags = a} :: CreateJobTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The specified name of the job template.
+createJobTemplate_name :: Lens.Lens' CreateJobTemplate Prelude.Text
+createJobTemplate_name = Lens.lens (\CreateJobTemplate' {name} -> name) (\s@CreateJobTemplate' {} a -> s {name = a} :: CreateJobTemplate)
+
+-- | The client token of the job template.
+createJobTemplate_clientToken :: Lens.Lens' CreateJobTemplate Prelude.Text
+createJobTemplate_clientToken = Lens.lens (\CreateJobTemplate' {clientToken} -> clientToken) (\s@CreateJobTemplate' {} a -> s {clientToken = a} :: CreateJobTemplate)
+
+-- | The job template data which holds values of StartJobRun API request.
+createJobTemplate_jobTemplateData :: Lens.Lens' CreateJobTemplate JobTemplateData
+createJobTemplate_jobTemplateData = Lens.lens (\CreateJobTemplate' {jobTemplateData} -> jobTemplateData) (\s@CreateJobTemplate' {} a -> s {jobTemplateData = a} :: CreateJobTemplate)
+
+instance Core.AWSRequest CreateJobTemplate where
+  type
+    AWSResponse CreateJobTemplate =
+      CreateJobTemplateResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateJobTemplateResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "createdAt")
+            Prelude.<*> (x Data..?> "id")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateJobTemplate where
+  hashWithSalt _salt CreateJobTemplate' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` jobTemplateData
+
+instance Prelude.NFData CreateJobTemplate where
+  rnf CreateJobTemplate' {..} =
+    Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf jobTemplateData
+
+instance Data.ToHeaders CreateJobTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateJobTemplate where
+  toJSON CreateJobTemplate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("kmsKeyArn" Data..=) Prelude.<$> kmsKeyArn,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("clientToken" Data..= clientToken),
+            Prelude.Just
+              ("jobTemplateData" Data..= jobTemplateData)
+          ]
+      )
+
+instance Data.ToPath CreateJobTemplate where
+  toPath = Prelude.const "/jobtemplates"
+
+instance Data.ToQuery CreateJobTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateJobTemplateResponse' smart constructor.
+data CreateJobTemplateResponse = CreateJobTemplateResponse'
+  { -- | This output display the ARN of the created job template.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | This output displays the date and time when the job template was
+    -- created.
+    createdAt :: Prelude.Maybe Data.ISO8601,
+    -- | This output display the created job template ID.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | This output displays the name of the created job template.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateJobTemplateResponse' 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', 'createJobTemplateResponse_arn' - This output display the ARN of the created job template.
+--
+-- 'createdAt', 'createJobTemplateResponse_createdAt' - This output displays the date and time when the job template was
+-- created.
+--
+-- 'id', 'createJobTemplateResponse_id' - This output display the created job template ID.
+--
+-- 'name', 'createJobTemplateResponse_name' - This output displays the name of the created job template.
+--
+-- 'httpStatus', 'createJobTemplateResponse_httpStatus' - The response's http status code.
+newCreateJobTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateJobTemplateResponse
+newCreateJobTemplateResponse pHttpStatus_ =
+  CreateJobTemplateResponse'
+    { arn = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output display the ARN of the created job template.
+createJobTemplateResponse_arn :: Lens.Lens' CreateJobTemplateResponse (Prelude.Maybe Prelude.Text)
+createJobTemplateResponse_arn = Lens.lens (\CreateJobTemplateResponse' {arn} -> arn) (\s@CreateJobTemplateResponse' {} a -> s {arn = a} :: CreateJobTemplateResponse)
+
+-- | This output displays the date and time when the job template was
+-- created.
+createJobTemplateResponse_createdAt :: Lens.Lens' CreateJobTemplateResponse (Prelude.Maybe Prelude.UTCTime)
+createJobTemplateResponse_createdAt = Lens.lens (\CreateJobTemplateResponse' {createdAt} -> createdAt) (\s@CreateJobTemplateResponse' {} a -> s {createdAt = a} :: CreateJobTemplateResponse) Prelude.. Lens.mapping Data._Time
+
+-- | This output display the created job template ID.
+createJobTemplateResponse_id :: Lens.Lens' CreateJobTemplateResponse (Prelude.Maybe Prelude.Text)
+createJobTemplateResponse_id = Lens.lens (\CreateJobTemplateResponse' {id} -> id) (\s@CreateJobTemplateResponse' {} a -> s {id = a} :: CreateJobTemplateResponse)
+
+-- | This output displays the name of the created job template.
+createJobTemplateResponse_name :: Lens.Lens' CreateJobTemplateResponse (Prelude.Maybe Prelude.Text)
+createJobTemplateResponse_name = Lens.lens (\CreateJobTemplateResponse' {name} -> name) (\s@CreateJobTemplateResponse' {} a -> s {name = a} :: CreateJobTemplateResponse)
+
+-- | The response's http status code.
+createJobTemplateResponse_httpStatus :: Lens.Lens' CreateJobTemplateResponse Prelude.Int
+createJobTemplateResponse_httpStatus = Lens.lens (\CreateJobTemplateResponse' {httpStatus} -> httpStatus) (\s@CreateJobTemplateResponse' {} a -> s {httpStatus = a} :: CreateJobTemplateResponse)
+
+instance Prelude.NFData CreateJobTemplateResponse where
+  rnf CreateJobTemplateResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/CreateManagedEndpoint.hs b/gen/Amazonka/EMRContainers/CreateManagedEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/CreateManagedEndpoint.hs
@@ -0,0 +1,341 @@
+{-# 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.EMRContainers.CreateManagedEndpoint
+-- 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 managed endpoint. A managed endpoint is a gateway that
+-- connects EMR Studio to Amazon EMR on EKS so that EMR Studio can
+-- communicate with your virtual cluster.
+module Amazonka.EMRContainers.CreateManagedEndpoint
+  ( -- * Creating a Request
+    CreateManagedEndpoint (..),
+    newCreateManagedEndpoint,
+
+    -- * Request Lenses
+    createManagedEndpoint_certificateArn,
+    createManagedEndpoint_configurationOverrides,
+    createManagedEndpoint_tags,
+    createManagedEndpoint_name,
+    createManagedEndpoint_virtualClusterId,
+    createManagedEndpoint_type,
+    createManagedEndpoint_releaseLabel,
+    createManagedEndpoint_executionRoleArn,
+    createManagedEndpoint_clientToken,
+
+    -- * Destructuring the Response
+    CreateManagedEndpointResponse (..),
+    newCreateManagedEndpointResponse,
+
+    -- * Response Lenses
+    createManagedEndpointResponse_arn,
+    createManagedEndpointResponse_id,
+    createManagedEndpointResponse_name,
+    createManagedEndpointResponse_virtualClusterId,
+    createManagedEndpointResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateManagedEndpoint' smart constructor.
+data CreateManagedEndpoint = CreateManagedEndpoint'
+  { -- | The certificate ARN provided by users for the managed endpoint. This
+    -- field is under deprecation and will be removed in future releases.
+    certificateArn :: Prelude.Maybe Prelude.Text,
+    -- | The configuration settings that will be used to override existing
+    -- configurations.
+    configurationOverrides :: Prelude.Maybe ConfigurationOverrides,
+    -- | The tags of the managed endpoint.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the managed endpoint.
+    name :: Prelude.Text,
+    -- | The ID of the virtual cluster for which a managed endpoint is created.
+    virtualClusterId :: Prelude.Text,
+    -- | The type of the managed endpoint.
+    type' :: Prelude.Text,
+    -- | The Amazon EMR release version.
+    releaseLabel :: Prelude.Text,
+    -- | The ARN of the execution role.
+    executionRoleArn :: Prelude.Text,
+    -- | The client idempotency token for this create call.
+    clientToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateManagedEndpoint' 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', 'createManagedEndpoint_certificateArn' - The certificate ARN provided by users for the managed endpoint. This
+-- field is under deprecation and will be removed in future releases.
+--
+-- 'configurationOverrides', 'createManagedEndpoint_configurationOverrides' - The configuration settings that will be used to override existing
+-- configurations.
+--
+-- 'tags', 'createManagedEndpoint_tags' - The tags of the managed endpoint.
+--
+-- 'name', 'createManagedEndpoint_name' - The name of the managed endpoint.
+--
+-- 'virtualClusterId', 'createManagedEndpoint_virtualClusterId' - The ID of the virtual cluster for which a managed endpoint is created.
+--
+-- 'type'', 'createManagedEndpoint_type' - The type of the managed endpoint.
+--
+-- 'releaseLabel', 'createManagedEndpoint_releaseLabel' - The Amazon EMR release version.
+--
+-- 'executionRoleArn', 'createManagedEndpoint_executionRoleArn' - The ARN of the execution role.
+--
+-- 'clientToken', 'createManagedEndpoint_clientToken' - The client idempotency token for this create call.
+newCreateManagedEndpoint ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  -- | 'type''
+  Prelude.Text ->
+  -- | 'releaseLabel'
+  Prelude.Text ->
+  -- | 'executionRoleArn'
+  Prelude.Text ->
+  -- | 'clientToken'
+  Prelude.Text ->
+  CreateManagedEndpoint
+newCreateManagedEndpoint
+  pName_
+  pVirtualClusterId_
+  pType_
+  pReleaseLabel_
+  pExecutionRoleArn_
+  pClientToken_ =
+    CreateManagedEndpoint'
+      { certificateArn =
+          Prelude.Nothing,
+        configurationOverrides = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        name = pName_,
+        virtualClusterId = pVirtualClusterId_,
+        type' = pType_,
+        releaseLabel = pReleaseLabel_,
+        executionRoleArn = pExecutionRoleArn_,
+        clientToken = pClientToken_
+      }
+
+-- | The certificate ARN provided by users for the managed endpoint. This
+-- field is under deprecation and will be removed in future releases.
+createManagedEndpoint_certificateArn :: Lens.Lens' CreateManagedEndpoint (Prelude.Maybe Prelude.Text)
+createManagedEndpoint_certificateArn = Lens.lens (\CreateManagedEndpoint' {certificateArn} -> certificateArn) (\s@CreateManagedEndpoint' {} a -> s {certificateArn = a} :: CreateManagedEndpoint)
+
+-- | The configuration settings that will be used to override existing
+-- configurations.
+createManagedEndpoint_configurationOverrides :: Lens.Lens' CreateManagedEndpoint (Prelude.Maybe ConfigurationOverrides)
+createManagedEndpoint_configurationOverrides = Lens.lens (\CreateManagedEndpoint' {configurationOverrides} -> configurationOverrides) (\s@CreateManagedEndpoint' {} a -> s {configurationOverrides = a} :: CreateManagedEndpoint)
+
+-- | The tags of the managed endpoint.
+createManagedEndpoint_tags :: Lens.Lens' CreateManagedEndpoint (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createManagedEndpoint_tags = Lens.lens (\CreateManagedEndpoint' {tags} -> tags) (\s@CreateManagedEndpoint' {} a -> s {tags = a} :: CreateManagedEndpoint) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the managed endpoint.
+createManagedEndpoint_name :: Lens.Lens' CreateManagedEndpoint Prelude.Text
+createManagedEndpoint_name = Lens.lens (\CreateManagedEndpoint' {name} -> name) (\s@CreateManagedEndpoint' {} a -> s {name = a} :: CreateManagedEndpoint)
+
+-- | The ID of the virtual cluster for which a managed endpoint is created.
+createManagedEndpoint_virtualClusterId :: Lens.Lens' CreateManagedEndpoint Prelude.Text
+createManagedEndpoint_virtualClusterId = Lens.lens (\CreateManagedEndpoint' {virtualClusterId} -> virtualClusterId) (\s@CreateManagedEndpoint' {} a -> s {virtualClusterId = a} :: CreateManagedEndpoint)
+
+-- | The type of the managed endpoint.
+createManagedEndpoint_type :: Lens.Lens' CreateManagedEndpoint Prelude.Text
+createManagedEndpoint_type = Lens.lens (\CreateManagedEndpoint' {type'} -> type') (\s@CreateManagedEndpoint' {} a -> s {type' = a} :: CreateManagedEndpoint)
+
+-- | The Amazon EMR release version.
+createManagedEndpoint_releaseLabel :: Lens.Lens' CreateManagedEndpoint Prelude.Text
+createManagedEndpoint_releaseLabel = Lens.lens (\CreateManagedEndpoint' {releaseLabel} -> releaseLabel) (\s@CreateManagedEndpoint' {} a -> s {releaseLabel = a} :: CreateManagedEndpoint)
+
+-- | The ARN of the execution role.
+createManagedEndpoint_executionRoleArn :: Lens.Lens' CreateManagedEndpoint Prelude.Text
+createManagedEndpoint_executionRoleArn = Lens.lens (\CreateManagedEndpoint' {executionRoleArn} -> executionRoleArn) (\s@CreateManagedEndpoint' {} a -> s {executionRoleArn = a} :: CreateManagedEndpoint)
+
+-- | The client idempotency token for this create call.
+createManagedEndpoint_clientToken :: Lens.Lens' CreateManagedEndpoint Prelude.Text
+createManagedEndpoint_clientToken = Lens.lens (\CreateManagedEndpoint' {clientToken} -> clientToken) (\s@CreateManagedEndpoint' {} a -> s {clientToken = a} :: CreateManagedEndpoint)
+
+instance Core.AWSRequest CreateManagedEndpoint where
+  type
+    AWSResponse CreateManagedEndpoint =
+      CreateManagedEndpointResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateManagedEndpointResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "id")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (x Data..?> "virtualClusterId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateManagedEndpoint where
+  hashWithSalt _salt CreateManagedEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificateArn
+      `Prelude.hashWithSalt` configurationOverrides
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` virtualClusterId
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` releaseLabel
+      `Prelude.hashWithSalt` executionRoleArn
+      `Prelude.hashWithSalt` clientToken
+
+instance Prelude.NFData CreateManagedEndpoint where
+  rnf CreateManagedEndpoint' {..} =
+    Prelude.rnf certificateArn
+      `Prelude.seq` Prelude.rnf configurationOverrides
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf virtualClusterId
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf releaseLabel
+      `Prelude.seq` Prelude.rnf executionRoleArn
+      `Prelude.seq` Prelude.rnf clientToken
+
+instance Data.ToHeaders CreateManagedEndpoint where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateManagedEndpoint where
+  toJSON CreateManagedEndpoint' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("certificateArn" Data..=)
+              Prelude.<$> certificateArn,
+            ("configurationOverrides" Data..=)
+              Prelude.<$> configurationOverrides,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("type" Data..= type'),
+            Prelude.Just ("releaseLabel" Data..= releaseLabel),
+            Prelude.Just
+              ("executionRoleArn" Data..= executionRoleArn),
+            Prelude.Just ("clientToken" Data..= clientToken)
+          ]
+      )
+
+instance Data.ToPath CreateManagedEndpoint where
+  toPath CreateManagedEndpoint' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/endpoints"
+      ]
+
+instance Data.ToQuery CreateManagedEndpoint where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateManagedEndpointResponse' smart constructor.
+data CreateManagedEndpointResponse = CreateManagedEndpointResponse'
+  { -- | The output contains the ARN of the managed endpoint.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The output contains the ID of the managed endpoint.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The output contains the name of the managed endpoint.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The output contains the ID of the virtual cluster.
+    virtualClusterId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateManagedEndpointResponse' 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', 'createManagedEndpointResponse_arn' - The output contains the ARN of the managed endpoint.
+--
+-- 'id', 'createManagedEndpointResponse_id' - The output contains the ID of the managed endpoint.
+--
+-- 'name', 'createManagedEndpointResponse_name' - The output contains the name of the managed endpoint.
+--
+-- 'virtualClusterId', 'createManagedEndpointResponse_virtualClusterId' - The output contains the ID of the virtual cluster.
+--
+-- 'httpStatus', 'createManagedEndpointResponse_httpStatus' - The response's http status code.
+newCreateManagedEndpointResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateManagedEndpointResponse
+newCreateManagedEndpointResponse pHttpStatus_ =
+  CreateManagedEndpointResponse'
+    { arn =
+        Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      virtualClusterId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The output contains the ARN of the managed endpoint.
+createManagedEndpointResponse_arn :: Lens.Lens' CreateManagedEndpointResponse (Prelude.Maybe Prelude.Text)
+createManagedEndpointResponse_arn = Lens.lens (\CreateManagedEndpointResponse' {arn} -> arn) (\s@CreateManagedEndpointResponse' {} a -> s {arn = a} :: CreateManagedEndpointResponse)
+
+-- | The output contains the ID of the managed endpoint.
+createManagedEndpointResponse_id :: Lens.Lens' CreateManagedEndpointResponse (Prelude.Maybe Prelude.Text)
+createManagedEndpointResponse_id = Lens.lens (\CreateManagedEndpointResponse' {id} -> id) (\s@CreateManagedEndpointResponse' {} a -> s {id = a} :: CreateManagedEndpointResponse)
+
+-- | The output contains the name of the managed endpoint.
+createManagedEndpointResponse_name :: Lens.Lens' CreateManagedEndpointResponse (Prelude.Maybe Prelude.Text)
+createManagedEndpointResponse_name = Lens.lens (\CreateManagedEndpointResponse' {name} -> name) (\s@CreateManagedEndpointResponse' {} a -> s {name = a} :: CreateManagedEndpointResponse)
+
+-- | The output contains the ID of the virtual cluster.
+createManagedEndpointResponse_virtualClusterId :: Lens.Lens' CreateManagedEndpointResponse (Prelude.Maybe Prelude.Text)
+createManagedEndpointResponse_virtualClusterId = Lens.lens (\CreateManagedEndpointResponse' {virtualClusterId} -> virtualClusterId) (\s@CreateManagedEndpointResponse' {} a -> s {virtualClusterId = a} :: CreateManagedEndpointResponse)
+
+-- | The response's http status code.
+createManagedEndpointResponse_httpStatus :: Lens.Lens' CreateManagedEndpointResponse Prelude.Int
+createManagedEndpointResponse_httpStatus = Lens.lens (\CreateManagedEndpointResponse' {httpStatus} -> httpStatus) (\s@CreateManagedEndpointResponse' {} a -> s {httpStatus = a} :: CreateManagedEndpointResponse)
+
+instance Prelude.NFData CreateManagedEndpointResponse where
+  rnf CreateManagedEndpointResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf virtualClusterId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/CreateVirtualCluster.hs b/gen/Amazonka/EMRContainers/CreateVirtualCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/CreateVirtualCluster.hs
@@ -0,0 +1,245 @@
+{-# 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.EMRContainers.CreateVirtualCluster
+-- 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 cluster. Virtual cluster is a managed entity on Amazon
+-- EMR on EKS. You can create, describe, list and delete virtual clusters.
+-- They do not consume any additional resource in your system. A single
+-- virtual cluster maps to a single Kubernetes namespace. Given this
+-- relationship, you can model virtual clusters the same way you model
+-- Kubernetes namespaces to meet your requirements.
+module Amazonka.EMRContainers.CreateVirtualCluster
+  ( -- * Creating a Request
+    CreateVirtualCluster (..),
+    newCreateVirtualCluster,
+
+    -- * Request Lenses
+    createVirtualCluster_tags,
+    createVirtualCluster_name,
+    createVirtualCluster_containerProvider,
+    createVirtualCluster_clientToken,
+
+    -- * Destructuring the Response
+    CreateVirtualClusterResponse (..),
+    newCreateVirtualClusterResponse,
+
+    -- * Response Lenses
+    createVirtualClusterResponse_arn,
+    createVirtualClusterResponse_id,
+    createVirtualClusterResponse_name,
+    createVirtualClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateVirtualCluster' smart constructor.
+data CreateVirtualCluster = CreateVirtualCluster'
+  { -- | The tags assigned to the virtual cluster.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The specified name of the virtual cluster.
+    name :: Prelude.Text,
+    -- | The container provider of the virtual cluster.
+    containerProvider :: ContainerProvider,
+    -- | The client token of the virtual cluster.
+    clientToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualCluster' 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:
+--
+-- 'tags', 'createVirtualCluster_tags' - The tags assigned to the virtual cluster.
+--
+-- 'name', 'createVirtualCluster_name' - The specified name of the virtual cluster.
+--
+-- 'containerProvider', 'createVirtualCluster_containerProvider' - The container provider of the virtual cluster.
+--
+-- 'clientToken', 'createVirtualCluster_clientToken' - The client token of the virtual cluster.
+newCreateVirtualCluster ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'containerProvider'
+  ContainerProvider ->
+  -- | 'clientToken'
+  Prelude.Text ->
+  CreateVirtualCluster
+newCreateVirtualCluster
+  pName_
+  pContainerProvider_
+  pClientToken_ =
+    CreateVirtualCluster'
+      { tags = Prelude.Nothing,
+        name = pName_,
+        containerProvider = pContainerProvider_,
+        clientToken = pClientToken_
+      }
+
+-- | The tags assigned to the virtual cluster.
+createVirtualCluster_tags :: Lens.Lens' CreateVirtualCluster (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createVirtualCluster_tags = Lens.lens (\CreateVirtualCluster' {tags} -> tags) (\s@CreateVirtualCluster' {} a -> s {tags = a} :: CreateVirtualCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The specified name of the virtual cluster.
+createVirtualCluster_name :: Lens.Lens' CreateVirtualCluster Prelude.Text
+createVirtualCluster_name = Lens.lens (\CreateVirtualCluster' {name} -> name) (\s@CreateVirtualCluster' {} a -> s {name = a} :: CreateVirtualCluster)
+
+-- | The container provider of the virtual cluster.
+createVirtualCluster_containerProvider :: Lens.Lens' CreateVirtualCluster ContainerProvider
+createVirtualCluster_containerProvider = Lens.lens (\CreateVirtualCluster' {containerProvider} -> containerProvider) (\s@CreateVirtualCluster' {} a -> s {containerProvider = a} :: CreateVirtualCluster)
+
+-- | The client token of the virtual cluster.
+createVirtualCluster_clientToken :: Lens.Lens' CreateVirtualCluster Prelude.Text
+createVirtualCluster_clientToken = Lens.lens (\CreateVirtualCluster' {clientToken} -> clientToken) (\s@CreateVirtualCluster' {} a -> s {clientToken = a} :: CreateVirtualCluster)
+
+instance Core.AWSRequest CreateVirtualCluster where
+  type
+    AWSResponse CreateVirtualCluster =
+      CreateVirtualClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVirtualClusterResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "id")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateVirtualCluster where
+  hashWithSalt _salt CreateVirtualCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` containerProvider
+      `Prelude.hashWithSalt` clientToken
+
+instance Prelude.NFData CreateVirtualCluster where
+  rnf CreateVirtualCluster' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf containerProvider
+      `Prelude.seq` Prelude.rnf clientToken
+
+instance Data.ToHeaders CreateVirtualCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVirtualCluster where
+  toJSON CreateVirtualCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("containerProvider" Data..= containerProvider),
+            Prelude.Just ("clientToken" Data..= clientToken)
+          ]
+      )
+
+instance Data.ToPath CreateVirtualCluster where
+  toPath = Prelude.const "/virtualclusters"
+
+instance Data.ToQuery CreateVirtualCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateVirtualClusterResponse' smart constructor.
+data CreateVirtualClusterResponse = CreateVirtualClusterResponse'
+  { -- | This output contains the ARN of virtual cluster.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | This output contains the virtual cluster ID.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | This output contains the name of the virtual cluster.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVirtualClusterResponse' 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', 'createVirtualClusterResponse_arn' - This output contains the ARN of virtual cluster.
+--
+-- 'id', 'createVirtualClusterResponse_id' - This output contains the virtual cluster ID.
+--
+-- 'name', 'createVirtualClusterResponse_name' - This output contains the name of the virtual cluster.
+--
+-- 'httpStatus', 'createVirtualClusterResponse_httpStatus' - The response's http status code.
+newCreateVirtualClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateVirtualClusterResponse
+newCreateVirtualClusterResponse pHttpStatus_ =
+  CreateVirtualClusterResponse'
+    { arn =
+        Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output contains the ARN of virtual cluster.
+createVirtualClusterResponse_arn :: Lens.Lens' CreateVirtualClusterResponse (Prelude.Maybe Prelude.Text)
+createVirtualClusterResponse_arn = Lens.lens (\CreateVirtualClusterResponse' {arn} -> arn) (\s@CreateVirtualClusterResponse' {} a -> s {arn = a} :: CreateVirtualClusterResponse)
+
+-- | This output contains the virtual cluster ID.
+createVirtualClusterResponse_id :: Lens.Lens' CreateVirtualClusterResponse (Prelude.Maybe Prelude.Text)
+createVirtualClusterResponse_id = Lens.lens (\CreateVirtualClusterResponse' {id} -> id) (\s@CreateVirtualClusterResponse' {} a -> s {id = a} :: CreateVirtualClusterResponse)
+
+-- | This output contains the name of the virtual cluster.
+createVirtualClusterResponse_name :: Lens.Lens' CreateVirtualClusterResponse (Prelude.Maybe Prelude.Text)
+createVirtualClusterResponse_name = Lens.lens (\CreateVirtualClusterResponse' {name} -> name) (\s@CreateVirtualClusterResponse' {} a -> s {name = a} :: CreateVirtualClusterResponse)
+
+-- | The response's http status code.
+createVirtualClusterResponse_httpStatus :: Lens.Lens' CreateVirtualClusterResponse Prelude.Int
+createVirtualClusterResponse_httpStatus = Lens.lens (\CreateVirtualClusterResponse' {httpStatus} -> httpStatus) (\s@CreateVirtualClusterResponse' {} a -> s {httpStatus = a} :: CreateVirtualClusterResponse)
+
+instance Prelude.NFData CreateVirtualClusterResponse where
+  rnf CreateVirtualClusterResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DeleteJobTemplate.hs b/gen/Amazonka/EMRContainers/DeleteJobTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DeleteJobTemplate.hs
@@ -0,0 +1,159 @@
+{-# 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.EMRContainers.DeleteJobTemplate
+-- 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 a job template. Job template stores values of StartJobRun API
+-- request in a template and can be used to start a job run. Job template
+-- allows two use cases: avoid repeating recurring StartJobRun API request
+-- values, enforcing certain values in StartJobRun API request.
+module Amazonka.EMRContainers.DeleteJobTemplate
+  ( -- * Creating a Request
+    DeleteJobTemplate (..),
+    newDeleteJobTemplate,
+
+    -- * Request Lenses
+    deleteJobTemplate_id,
+
+    -- * Destructuring the Response
+    DeleteJobTemplateResponse (..),
+    newDeleteJobTemplateResponse,
+
+    -- * Response Lenses
+    deleteJobTemplateResponse_id,
+    deleteJobTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteJobTemplate' smart constructor.
+data DeleteJobTemplate = DeleteJobTemplate'
+  { -- | The ID of the job template that will be deleted.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteJobTemplate' 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:
+--
+-- 'id', 'deleteJobTemplate_id' - The ID of the job template that will be deleted.
+newDeleteJobTemplate ::
+  -- | 'id'
+  Prelude.Text ->
+  DeleteJobTemplate
+newDeleteJobTemplate pId_ =
+  DeleteJobTemplate' {id = pId_}
+
+-- | The ID of the job template that will be deleted.
+deleteJobTemplate_id :: Lens.Lens' DeleteJobTemplate Prelude.Text
+deleteJobTemplate_id = Lens.lens (\DeleteJobTemplate' {id} -> id) (\s@DeleteJobTemplate' {} a -> s {id = a} :: DeleteJobTemplate)
+
+instance Core.AWSRequest DeleteJobTemplate where
+  type
+    AWSResponse DeleteJobTemplate =
+      DeleteJobTemplateResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteJobTemplateResponse'
+            Prelude.<$> (x Data..?> "id")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteJobTemplate where
+  hashWithSalt _salt DeleteJobTemplate' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData DeleteJobTemplate where
+  rnf DeleteJobTemplate' {..} = Prelude.rnf id
+
+instance Data.ToHeaders DeleteJobTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteJobTemplate where
+  toPath DeleteJobTemplate' {..} =
+    Prelude.mconcat ["/jobtemplates/", Data.toBS id]
+
+instance Data.ToQuery DeleteJobTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteJobTemplateResponse' smart constructor.
+data DeleteJobTemplateResponse = DeleteJobTemplateResponse'
+  { -- | This output contains the ID of the job template that was deleted.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteJobTemplateResponse' 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:
+--
+-- 'id', 'deleteJobTemplateResponse_id' - This output contains the ID of the job template that was deleted.
+--
+-- 'httpStatus', 'deleteJobTemplateResponse_httpStatus' - The response's http status code.
+newDeleteJobTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteJobTemplateResponse
+newDeleteJobTemplateResponse pHttpStatus_ =
+  DeleteJobTemplateResponse'
+    { id = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output contains the ID of the job template that was deleted.
+deleteJobTemplateResponse_id :: Lens.Lens' DeleteJobTemplateResponse (Prelude.Maybe Prelude.Text)
+deleteJobTemplateResponse_id = Lens.lens (\DeleteJobTemplateResponse' {id} -> id) (\s@DeleteJobTemplateResponse' {} a -> s {id = a} :: DeleteJobTemplateResponse)
+
+-- | The response's http status code.
+deleteJobTemplateResponse_httpStatus :: Lens.Lens' DeleteJobTemplateResponse Prelude.Int
+deleteJobTemplateResponse_httpStatus = Lens.lens (\DeleteJobTemplateResponse' {httpStatus} -> httpStatus) (\s@DeleteJobTemplateResponse' {} a -> s {httpStatus = a} :: DeleteJobTemplateResponse)
+
+instance Prelude.NFData DeleteJobTemplateResponse where
+  rnf DeleteJobTemplateResponse' {..} =
+    Prelude.rnf id `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DeleteManagedEndpoint.hs b/gen/Amazonka/EMRContainers/DeleteManagedEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DeleteManagedEndpoint.hs
@@ -0,0 +1,195 @@
+{-# 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.EMRContainers.DeleteManagedEndpoint
+-- 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 a managed endpoint. A managed endpoint is a gateway that
+-- connects EMR Studio to Amazon EMR on EKS so that EMR Studio can
+-- communicate with your virtual cluster.
+module Amazonka.EMRContainers.DeleteManagedEndpoint
+  ( -- * Creating a Request
+    DeleteManagedEndpoint (..),
+    newDeleteManagedEndpoint,
+
+    -- * Request Lenses
+    deleteManagedEndpoint_id,
+    deleteManagedEndpoint_virtualClusterId,
+
+    -- * Destructuring the Response
+    DeleteManagedEndpointResponse (..),
+    newDeleteManagedEndpointResponse,
+
+    -- * Response Lenses
+    deleteManagedEndpointResponse_id,
+    deleteManagedEndpointResponse_virtualClusterId,
+    deleteManagedEndpointResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteManagedEndpoint' smart constructor.
+data DeleteManagedEndpoint = DeleteManagedEndpoint'
+  { -- | The ID of the managed endpoint.
+    id :: Prelude.Text,
+    -- | The ID of the endpoint\'s virtual cluster.
+    virtualClusterId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteManagedEndpoint' 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:
+--
+-- 'id', 'deleteManagedEndpoint_id' - The ID of the managed endpoint.
+--
+-- 'virtualClusterId', 'deleteManagedEndpoint_virtualClusterId' - The ID of the endpoint\'s virtual cluster.
+newDeleteManagedEndpoint ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  DeleteManagedEndpoint
+newDeleteManagedEndpoint pId_ pVirtualClusterId_ =
+  DeleteManagedEndpoint'
+    { id = pId_,
+      virtualClusterId = pVirtualClusterId_
+    }
+
+-- | The ID of the managed endpoint.
+deleteManagedEndpoint_id :: Lens.Lens' DeleteManagedEndpoint Prelude.Text
+deleteManagedEndpoint_id = Lens.lens (\DeleteManagedEndpoint' {id} -> id) (\s@DeleteManagedEndpoint' {} a -> s {id = a} :: DeleteManagedEndpoint)
+
+-- | The ID of the endpoint\'s virtual cluster.
+deleteManagedEndpoint_virtualClusterId :: Lens.Lens' DeleteManagedEndpoint Prelude.Text
+deleteManagedEndpoint_virtualClusterId = Lens.lens (\DeleteManagedEndpoint' {virtualClusterId} -> virtualClusterId) (\s@DeleteManagedEndpoint' {} a -> s {virtualClusterId = a} :: DeleteManagedEndpoint)
+
+instance Core.AWSRequest DeleteManagedEndpoint where
+  type
+    AWSResponse DeleteManagedEndpoint =
+      DeleteManagedEndpointResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteManagedEndpointResponse'
+            Prelude.<$> (x Data..?> "id")
+            Prelude.<*> (x Data..?> "virtualClusterId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteManagedEndpoint where
+  hashWithSalt _salt DeleteManagedEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData DeleteManagedEndpoint where
+  rnf DeleteManagedEndpoint' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf virtualClusterId
+
+instance Data.ToHeaders DeleteManagedEndpoint where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteManagedEndpoint where
+  toPath DeleteManagedEndpoint' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/endpoints/",
+        Data.toBS id
+      ]
+
+instance Data.ToQuery DeleteManagedEndpoint where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteManagedEndpointResponse' smart constructor.
+data DeleteManagedEndpointResponse = DeleteManagedEndpointResponse'
+  { -- | The output displays the ID of the managed endpoint.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The output displays the ID of the endpoint\'s virtual cluster.
+    virtualClusterId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteManagedEndpointResponse' 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:
+--
+-- 'id', 'deleteManagedEndpointResponse_id' - The output displays the ID of the managed endpoint.
+--
+-- 'virtualClusterId', 'deleteManagedEndpointResponse_virtualClusterId' - The output displays the ID of the endpoint\'s virtual cluster.
+--
+-- 'httpStatus', 'deleteManagedEndpointResponse_httpStatus' - The response's http status code.
+newDeleteManagedEndpointResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteManagedEndpointResponse
+newDeleteManagedEndpointResponse pHttpStatus_ =
+  DeleteManagedEndpointResponse'
+    { id =
+        Prelude.Nothing,
+      virtualClusterId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The output displays the ID of the managed endpoint.
+deleteManagedEndpointResponse_id :: Lens.Lens' DeleteManagedEndpointResponse (Prelude.Maybe Prelude.Text)
+deleteManagedEndpointResponse_id = Lens.lens (\DeleteManagedEndpointResponse' {id} -> id) (\s@DeleteManagedEndpointResponse' {} a -> s {id = a} :: DeleteManagedEndpointResponse)
+
+-- | The output displays the ID of the endpoint\'s virtual cluster.
+deleteManagedEndpointResponse_virtualClusterId :: Lens.Lens' DeleteManagedEndpointResponse (Prelude.Maybe Prelude.Text)
+deleteManagedEndpointResponse_virtualClusterId = Lens.lens (\DeleteManagedEndpointResponse' {virtualClusterId} -> virtualClusterId) (\s@DeleteManagedEndpointResponse' {} a -> s {virtualClusterId = a} :: DeleteManagedEndpointResponse)
+
+-- | The response's http status code.
+deleteManagedEndpointResponse_httpStatus :: Lens.Lens' DeleteManagedEndpointResponse Prelude.Int
+deleteManagedEndpointResponse_httpStatus = Lens.lens (\DeleteManagedEndpointResponse' {httpStatus} -> httpStatus) (\s@DeleteManagedEndpointResponse' {} a -> s {httpStatus = a} :: DeleteManagedEndpointResponse)
+
+instance Prelude.NFData DeleteManagedEndpointResponse where
+  rnf DeleteManagedEndpointResponse' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf virtualClusterId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DeleteVirtualCluster.hs b/gen/Amazonka/EMRContainers/DeleteVirtualCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DeleteVirtualCluster.hs
@@ -0,0 +1,161 @@
+{-# 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.EMRContainers.DeleteVirtualCluster
+-- 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 a virtual cluster. Virtual cluster is a managed entity on Amazon
+-- EMR on EKS. You can create, describe, list and delete virtual clusters.
+-- They do not consume any additional resource in your system. A single
+-- virtual cluster maps to a single Kubernetes namespace. Given this
+-- relationship, you can model virtual clusters the same way you model
+-- Kubernetes namespaces to meet your requirements.
+module Amazonka.EMRContainers.DeleteVirtualCluster
+  ( -- * Creating a Request
+    DeleteVirtualCluster (..),
+    newDeleteVirtualCluster,
+
+    -- * Request Lenses
+    deleteVirtualCluster_id,
+
+    -- * Destructuring the Response
+    DeleteVirtualClusterResponse (..),
+    newDeleteVirtualClusterResponse,
+
+    -- * Response Lenses
+    deleteVirtualClusterResponse_id,
+    deleteVirtualClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteVirtualCluster' smart constructor.
+data DeleteVirtualCluster = DeleteVirtualCluster'
+  { -- | The ID of the virtual cluster that will be deleted.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualCluster' 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:
+--
+-- 'id', 'deleteVirtualCluster_id' - The ID of the virtual cluster that will be deleted.
+newDeleteVirtualCluster ::
+  -- | 'id'
+  Prelude.Text ->
+  DeleteVirtualCluster
+newDeleteVirtualCluster pId_ =
+  DeleteVirtualCluster' {id = pId_}
+
+-- | The ID of the virtual cluster that will be deleted.
+deleteVirtualCluster_id :: Lens.Lens' DeleteVirtualCluster Prelude.Text
+deleteVirtualCluster_id = Lens.lens (\DeleteVirtualCluster' {id} -> id) (\s@DeleteVirtualCluster' {} a -> s {id = a} :: DeleteVirtualCluster)
+
+instance Core.AWSRequest DeleteVirtualCluster where
+  type
+    AWSResponse DeleteVirtualCluster =
+      DeleteVirtualClusterResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteVirtualClusterResponse'
+            Prelude.<$> (x Data..?> "id")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteVirtualCluster where
+  hashWithSalt _salt DeleteVirtualCluster' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData DeleteVirtualCluster where
+  rnf DeleteVirtualCluster' {..} = Prelude.rnf id
+
+instance Data.ToHeaders DeleteVirtualCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteVirtualCluster where
+  toPath DeleteVirtualCluster' {..} =
+    Prelude.mconcat ["/virtualclusters/", Data.toBS id]
+
+instance Data.ToQuery DeleteVirtualCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteVirtualClusterResponse' smart constructor.
+data DeleteVirtualClusterResponse = DeleteVirtualClusterResponse'
+  { -- | This output contains the ID of the virtual cluster that will be deleted.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVirtualClusterResponse' 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:
+--
+-- 'id', 'deleteVirtualClusterResponse_id' - This output contains the ID of the virtual cluster that will be deleted.
+--
+-- 'httpStatus', 'deleteVirtualClusterResponse_httpStatus' - The response's http status code.
+newDeleteVirtualClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteVirtualClusterResponse
+newDeleteVirtualClusterResponse pHttpStatus_ =
+  DeleteVirtualClusterResponse'
+    { id = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output contains the ID of the virtual cluster that will be deleted.
+deleteVirtualClusterResponse_id :: Lens.Lens' DeleteVirtualClusterResponse (Prelude.Maybe Prelude.Text)
+deleteVirtualClusterResponse_id = Lens.lens (\DeleteVirtualClusterResponse' {id} -> id) (\s@DeleteVirtualClusterResponse' {} a -> s {id = a} :: DeleteVirtualClusterResponse)
+
+-- | The response's http status code.
+deleteVirtualClusterResponse_httpStatus :: Lens.Lens' DeleteVirtualClusterResponse Prelude.Int
+deleteVirtualClusterResponse_httpStatus = Lens.lens (\DeleteVirtualClusterResponse' {httpStatus} -> httpStatus) (\s@DeleteVirtualClusterResponse' {} a -> s {httpStatus = a} :: DeleteVirtualClusterResponse)
+
+instance Prelude.NFData DeleteVirtualClusterResponse where
+  rnf DeleteVirtualClusterResponse' {..} =
+    Prelude.rnf id `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DescribeJobRun.hs b/gen/Amazonka/EMRContainers/DescribeJobRun.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DescribeJobRun.hs
@@ -0,0 +1,182 @@
+{-# 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.EMRContainers.DescribeJobRun
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Displays detailed information about a job run. A job run is a unit of
+-- work, such as a Spark jar, PySpark script, or SparkSQL query, that you
+-- submit to Amazon EMR on EKS.
+module Amazonka.EMRContainers.DescribeJobRun
+  ( -- * Creating a Request
+    DescribeJobRun (..),
+    newDescribeJobRun,
+
+    -- * Request Lenses
+    describeJobRun_id,
+    describeJobRun_virtualClusterId,
+
+    -- * Destructuring the Response
+    DescribeJobRunResponse (..),
+    newDescribeJobRunResponse,
+
+    -- * Response Lenses
+    describeJobRunResponse_jobRun,
+    describeJobRunResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeJobRun' smart constructor.
+data DescribeJobRun = DescribeJobRun'
+  { -- | The ID of the job run request.
+    id :: Prelude.Text,
+    -- | The ID of the virtual cluster for which the job run is submitted.
+    virtualClusterId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeJobRun' 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:
+--
+-- 'id', 'describeJobRun_id' - The ID of the job run request.
+--
+-- 'virtualClusterId', 'describeJobRun_virtualClusterId' - The ID of the virtual cluster for which the job run is submitted.
+newDescribeJobRun ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  DescribeJobRun
+newDescribeJobRun pId_ pVirtualClusterId_ =
+  DescribeJobRun'
+    { id = pId_,
+      virtualClusterId = pVirtualClusterId_
+    }
+
+-- | The ID of the job run request.
+describeJobRun_id :: Lens.Lens' DescribeJobRun Prelude.Text
+describeJobRun_id = Lens.lens (\DescribeJobRun' {id} -> id) (\s@DescribeJobRun' {} a -> s {id = a} :: DescribeJobRun)
+
+-- | The ID of the virtual cluster for which the job run is submitted.
+describeJobRun_virtualClusterId :: Lens.Lens' DescribeJobRun Prelude.Text
+describeJobRun_virtualClusterId = Lens.lens (\DescribeJobRun' {virtualClusterId} -> virtualClusterId) (\s@DescribeJobRun' {} a -> s {virtualClusterId = a} :: DescribeJobRun)
+
+instance Core.AWSRequest DescribeJobRun where
+  type
+    AWSResponse DescribeJobRun =
+      DescribeJobRunResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeJobRunResponse'
+            Prelude.<$> (x Data..?> "jobRun")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeJobRun where
+  hashWithSalt _salt DescribeJobRun' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData DescribeJobRun where
+  rnf DescribeJobRun' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf virtualClusterId
+
+instance Data.ToHeaders DescribeJobRun where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeJobRun where
+  toPath DescribeJobRun' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/jobruns/",
+        Data.toBS id
+      ]
+
+instance Data.ToQuery DescribeJobRun where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeJobRunResponse' smart constructor.
+data DescribeJobRunResponse = DescribeJobRunResponse'
+  { -- | The output displays information about a job run.
+    jobRun :: Prelude.Maybe JobRun,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeJobRunResponse' 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:
+--
+-- 'jobRun', 'describeJobRunResponse_jobRun' - The output displays information about a job run.
+--
+-- 'httpStatus', 'describeJobRunResponse_httpStatus' - The response's http status code.
+newDescribeJobRunResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeJobRunResponse
+newDescribeJobRunResponse pHttpStatus_ =
+  DescribeJobRunResponse'
+    { jobRun = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The output displays information about a job run.
+describeJobRunResponse_jobRun :: Lens.Lens' DescribeJobRunResponse (Prelude.Maybe JobRun)
+describeJobRunResponse_jobRun = Lens.lens (\DescribeJobRunResponse' {jobRun} -> jobRun) (\s@DescribeJobRunResponse' {} a -> s {jobRun = a} :: DescribeJobRunResponse)
+
+-- | The response's http status code.
+describeJobRunResponse_httpStatus :: Lens.Lens' DescribeJobRunResponse Prelude.Int
+describeJobRunResponse_httpStatus = Lens.lens (\DescribeJobRunResponse' {httpStatus} -> httpStatus) (\s@DescribeJobRunResponse' {} a -> s {httpStatus = a} :: DescribeJobRunResponse)
+
+instance Prelude.NFData DescribeJobRunResponse where
+  rnf DescribeJobRunResponse' {..} =
+    Prelude.rnf jobRun
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DescribeJobTemplate.hs b/gen/Amazonka/EMRContainers/DescribeJobTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DescribeJobTemplate.hs
@@ -0,0 +1,162 @@
+{-# 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.EMRContainers.DescribeJobTemplate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Displays detailed information about a specified job template. Job
+-- template stores values of StartJobRun API request in a template and can
+-- be used to start a job run. Job template allows two use cases: avoid
+-- repeating recurring StartJobRun API request values, enforcing certain
+-- values in StartJobRun API request.
+module Amazonka.EMRContainers.DescribeJobTemplate
+  ( -- * Creating a Request
+    DescribeJobTemplate (..),
+    newDescribeJobTemplate,
+
+    -- * Request Lenses
+    describeJobTemplate_id,
+
+    -- * Destructuring the Response
+    DescribeJobTemplateResponse (..),
+    newDescribeJobTemplateResponse,
+
+    -- * Response Lenses
+    describeJobTemplateResponse_jobTemplate,
+    describeJobTemplateResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeJobTemplate' smart constructor.
+data DescribeJobTemplate = DescribeJobTemplate'
+  { -- | The ID of the job template that will be described.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeJobTemplate' 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:
+--
+-- 'id', 'describeJobTemplate_id' - The ID of the job template that will be described.
+newDescribeJobTemplate ::
+  -- | 'id'
+  Prelude.Text ->
+  DescribeJobTemplate
+newDescribeJobTemplate pId_ =
+  DescribeJobTemplate' {id = pId_}
+
+-- | The ID of the job template that will be described.
+describeJobTemplate_id :: Lens.Lens' DescribeJobTemplate Prelude.Text
+describeJobTemplate_id = Lens.lens (\DescribeJobTemplate' {id} -> id) (\s@DescribeJobTemplate' {} a -> s {id = a} :: DescribeJobTemplate)
+
+instance Core.AWSRequest DescribeJobTemplate where
+  type
+    AWSResponse DescribeJobTemplate =
+      DescribeJobTemplateResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeJobTemplateResponse'
+            Prelude.<$> (x Data..?> "jobTemplate")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeJobTemplate where
+  hashWithSalt _salt DescribeJobTemplate' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData DescribeJobTemplate where
+  rnf DescribeJobTemplate' {..} = Prelude.rnf id
+
+instance Data.ToHeaders DescribeJobTemplate where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeJobTemplate where
+  toPath DescribeJobTemplate' {..} =
+    Prelude.mconcat ["/jobtemplates/", Data.toBS id]
+
+instance Data.ToQuery DescribeJobTemplate where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeJobTemplateResponse' smart constructor.
+data DescribeJobTemplateResponse = DescribeJobTemplateResponse'
+  { -- | This output displays information about the specified job template.
+    jobTemplate :: Prelude.Maybe JobTemplate,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeJobTemplateResponse' 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:
+--
+-- 'jobTemplate', 'describeJobTemplateResponse_jobTemplate' - This output displays information about the specified job template.
+--
+-- 'httpStatus', 'describeJobTemplateResponse_httpStatus' - The response's http status code.
+newDescribeJobTemplateResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeJobTemplateResponse
+newDescribeJobTemplateResponse pHttpStatus_ =
+  DescribeJobTemplateResponse'
+    { jobTemplate =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output displays information about the specified job template.
+describeJobTemplateResponse_jobTemplate :: Lens.Lens' DescribeJobTemplateResponse (Prelude.Maybe JobTemplate)
+describeJobTemplateResponse_jobTemplate = Lens.lens (\DescribeJobTemplateResponse' {jobTemplate} -> jobTemplate) (\s@DescribeJobTemplateResponse' {} a -> s {jobTemplate = a} :: DescribeJobTemplateResponse)
+
+-- | The response's http status code.
+describeJobTemplateResponse_httpStatus :: Lens.Lens' DescribeJobTemplateResponse Prelude.Int
+describeJobTemplateResponse_httpStatus = Lens.lens (\DescribeJobTemplateResponse' {httpStatus} -> httpStatus) (\s@DescribeJobTemplateResponse' {} a -> s {httpStatus = a} :: DescribeJobTemplateResponse)
+
+instance Prelude.NFData DescribeJobTemplateResponse where
+  rnf DescribeJobTemplateResponse' {..} =
+    Prelude.rnf jobTemplate
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DescribeManagedEndpoint.hs b/gen/Amazonka/EMRContainers/DescribeManagedEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DescribeManagedEndpoint.hs
@@ -0,0 +1,186 @@
+{-# 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.EMRContainers.DescribeManagedEndpoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Displays detailed information about a managed endpoint. A managed
+-- endpoint is a gateway that connects EMR Studio to Amazon EMR on EKS so
+-- that EMR Studio can communicate with your virtual cluster.
+module Amazonka.EMRContainers.DescribeManagedEndpoint
+  ( -- * Creating a Request
+    DescribeManagedEndpoint (..),
+    newDescribeManagedEndpoint,
+
+    -- * Request Lenses
+    describeManagedEndpoint_id,
+    describeManagedEndpoint_virtualClusterId,
+
+    -- * Destructuring the Response
+    DescribeManagedEndpointResponse (..),
+    newDescribeManagedEndpointResponse,
+
+    -- * Response Lenses
+    describeManagedEndpointResponse_endpoint,
+    describeManagedEndpointResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeManagedEndpoint' smart constructor.
+data DescribeManagedEndpoint = DescribeManagedEndpoint'
+  { -- | This output displays ID of the managed endpoint.
+    id :: Prelude.Text,
+    -- | The ID of the endpoint\'s virtual cluster.
+    virtualClusterId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeManagedEndpoint' 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:
+--
+-- 'id', 'describeManagedEndpoint_id' - This output displays ID of the managed endpoint.
+--
+-- 'virtualClusterId', 'describeManagedEndpoint_virtualClusterId' - The ID of the endpoint\'s virtual cluster.
+newDescribeManagedEndpoint ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  DescribeManagedEndpoint
+newDescribeManagedEndpoint pId_ pVirtualClusterId_ =
+  DescribeManagedEndpoint'
+    { id = pId_,
+      virtualClusterId = pVirtualClusterId_
+    }
+
+-- | This output displays ID of the managed endpoint.
+describeManagedEndpoint_id :: Lens.Lens' DescribeManagedEndpoint Prelude.Text
+describeManagedEndpoint_id = Lens.lens (\DescribeManagedEndpoint' {id} -> id) (\s@DescribeManagedEndpoint' {} a -> s {id = a} :: DescribeManagedEndpoint)
+
+-- | The ID of the endpoint\'s virtual cluster.
+describeManagedEndpoint_virtualClusterId :: Lens.Lens' DescribeManagedEndpoint Prelude.Text
+describeManagedEndpoint_virtualClusterId = Lens.lens (\DescribeManagedEndpoint' {virtualClusterId} -> virtualClusterId) (\s@DescribeManagedEndpoint' {} a -> s {virtualClusterId = a} :: DescribeManagedEndpoint)
+
+instance Core.AWSRequest DescribeManagedEndpoint where
+  type
+    AWSResponse DescribeManagedEndpoint =
+      DescribeManagedEndpointResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeManagedEndpointResponse'
+            Prelude.<$> (x Data..?> "endpoint")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeManagedEndpoint where
+  hashWithSalt _salt DescribeManagedEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData DescribeManagedEndpoint where
+  rnf DescribeManagedEndpoint' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf virtualClusterId
+
+instance Data.ToHeaders DescribeManagedEndpoint where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeManagedEndpoint where
+  toPath DescribeManagedEndpoint' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/endpoints/",
+        Data.toBS id
+      ]
+
+instance Data.ToQuery DescribeManagedEndpoint where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeManagedEndpointResponse' smart constructor.
+data DescribeManagedEndpointResponse = DescribeManagedEndpointResponse'
+  { -- | This output displays information about a managed endpoint.
+    endpoint :: Prelude.Maybe Endpoint,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeManagedEndpointResponse' 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:
+--
+-- 'endpoint', 'describeManagedEndpointResponse_endpoint' - This output displays information about a managed endpoint.
+--
+-- 'httpStatus', 'describeManagedEndpointResponse_httpStatus' - The response's http status code.
+newDescribeManagedEndpointResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeManagedEndpointResponse
+newDescribeManagedEndpointResponse pHttpStatus_ =
+  DescribeManagedEndpointResponse'
+    { endpoint =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output displays information about a managed endpoint.
+describeManagedEndpointResponse_endpoint :: Lens.Lens' DescribeManagedEndpointResponse (Prelude.Maybe Endpoint)
+describeManagedEndpointResponse_endpoint = Lens.lens (\DescribeManagedEndpointResponse' {endpoint} -> endpoint) (\s@DescribeManagedEndpointResponse' {} a -> s {endpoint = a} :: DescribeManagedEndpointResponse)
+
+-- | The response's http status code.
+describeManagedEndpointResponse_httpStatus :: Lens.Lens' DescribeManagedEndpointResponse Prelude.Int
+describeManagedEndpointResponse_httpStatus = Lens.lens (\DescribeManagedEndpointResponse' {httpStatus} -> httpStatus) (\s@DescribeManagedEndpointResponse' {} a -> s {httpStatus = a} :: DescribeManagedEndpointResponse)
+
+instance
+  Prelude.NFData
+    DescribeManagedEndpointResponse
+  where
+  rnf DescribeManagedEndpointResponse' {..} =
+    Prelude.rnf endpoint
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/DescribeVirtualCluster.hs b/gen/Amazonka/EMRContainers/DescribeVirtualCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/DescribeVirtualCluster.hs
@@ -0,0 +1,167 @@
+{-# 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.EMRContainers.DescribeVirtualCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Displays detailed information about a specified virtual cluster. Virtual
+-- cluster is a managed entity on Amazon EMR on EKS. You can create,
+-- describe, list and delete virtual clusters. They do not consume any
+-- additional resource in your system. A single virtual cluster maps to a
+-- single Kubernetes namespace. Given this relationship, you can model
+-- virtual clusters the same way you model Kubernetes namespaces to meet
+-- your requirements.
+module Amazonka.EMRContainers.DescribeVirtualCluster
+  ( -- * Creating a Request
+    DescribeVirtualCluster (..),
+    newDescribeVirtualCluster,
+
+    -- * Request Lenses
+    describeVirtualCluster_id,
+
+    -- * Destructuring the Response
+    DescribeVirtualClusterResponse (..),
+    newDescribeVirtualClusterResponse,
+
+    -- * Response Lenses
+    describeVirtualClusterResponse_virtualCluster,
+    describeVirtualClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeVirtualCluster' smart constructor.
+data DescribeVirtualCluster = DescribeVirtualCluster'
+  { -- | The ID of the virtual cluster that will be described.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualCluster' 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:
+--
+-- 'id', 'describeVirtualCluster_id' - The ID of the virtual cluster that will be described.
+newDescribeVirtualCluster ::
+  -- | 'id'
+  Prelude.Text ->
+  DescribeVirtualCluster
+newDescribeVirtualCluster pId_ =
+  DescribeVirtualCluster' {id = pId_}
+
+-- | The ID of the virtual cluster that will be described.
+describeVirtualCluster_id :: Lens.Lens' DescribeVirtualCluster Prelude.Text
+describeVirtualCluster_id = Lens.lens (\DescribeVirtualCluster' {id} -> id) (\s@DescribeVirtualCluster' {} a -> s {id = a} :: DescribeVirtualCluster)
+
+instance Core.AWSRequest DescribeVirtualCluster where
+  type
+    AWSResponse DescribeVirtualCluster =
+      DescribeVirtualClusterResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeVirtualClusterResponse'
+            Prelude.<$> (x Data..?> "virtualCluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeVirtualCluster where
+  hashWithSalt _salt DescribeVirtualCluster' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData DescribeVirtualCluster where
+  rnf DescribeVirtualCluster' {..} = Prelude.rnf id
+
+instance Data.ToHeaders DescribeVirtualCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeVirtualCluster where
+  toPath DescribeVirtualCluster' {..} =
+    Prelude.mconcat ["/virtualclusters/", Data.toBS id]
+
+instance Data.ToQuery DescribeVirtualCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeVirtualClusterResponse' smart constructor.
+data DescribeVirtualClusterResponse = DescribeVirtualClusterResponse'
+  { -- | This output displays information about the specified virtual cluster.
+    virtualCluster :: Prelude.Maybe VirtualCluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeVirtualClusterResponse' 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:
+--
+-- 'virtualCluster', 'describeVirtualClusterResponse_virtualCluster' - This output displays information about the specified virtual cluster.
+--
+-- 'httpStatus', 'describeVirtualClusterResponse_httpStatus' - The response's http status code.
+newDescribeVirtualClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeVirtualClusterResponse
+newDescribeVirtualClusterResponse pHttpStatus_ =
+  DescribeVirtualClusterResponse'
+    { virtualCluster =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output displays information about the specified virtual cluster.
+describeVirtualClusterResponse_virtualCluster :: Lens.Lens' DescribeVirtualClusterResponse (Prelude.Maybe VirtualCluster)
+describeVirtualClusterResponse_virtualCluster = Lens.lens (\DescribeVirtualClusterResponse' {virtualCluster} -> virtualCluster) (\s@DescribeVirtualClusterResponse' {} a -> s {virtualCluster = a} :: DescribeVirtualClusterResponse)
+
+-- | The response's http status code.
+describeVirtualClusterResponse_httpStatus :: Lens.Lens' DescribeVirtualClusterResponse Prelude.Int
+describeVirtualClusterResponse_httpStatus = Lens.lens (\DescribeVirtualClusterResponse' {httpStatus} -> httpStatus) (\s@DescribeVirtualClusterResponse' {} a -> s {httpStatus = a} :: DescribeVirtualClusterResponse)
+
+instance
+  Prelude.NFData
+    DescribeVirtualClusterResponse
+  where
+  rnf DescribeVirtualClusterResponse' {..} =
+    Prelude.rnf virtualCluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/Lens.hs b/gen/Amazonka/EMRContainers/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Lens.hs
@@ -0,0 +1,357 @@
+{-# 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.EMRContainers.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.EMRContainers.Lens
+  ( -- * Operations
+
+    -- ** CancelJobRun
+    cancelJobRun_id,
+    cancelJobRun_virtualClusterId,
+    cancelJobRunResponse_id,
+    cancelJobRunResponse_virtualClusterId,
+    cancelJobRunResponse_httpStatus,
+
+    -- ** CreateJobTemplate
+    createJobTemplate_kmsKeyArn,
+    createJobTemplate_tags,
+    createJobTemplate_name,
+    createJobTemplate_clientToken,
+    createJobTemplate_jobTemplateData,
+    createJobTemplateResponse_arn,
+    createJobTemplateResponse_createdAt,
+    createJobTemplateResponse_id,
+    createJobTemplateResponse_name,
+    createJobTemplateResponse_httpStatus,
+
+    -- ** CreateManagedEndpoint
+    createManagedEndpoint_certificateArn,
+    createManagedEndpoint_configurationOverrides,
+    createManagedEndpoint_tags,
+    createManagedEndpoint_name,
+    createManagedEndpoint_virtualClusterId,
+    createManagedEndpoint_type,
+    createManagedEndpoint_releaseLabel,
+    createManagedEndpoint_executionRoleArn,
+    createManagedEndpoint_clientToken,
+    createManagedEndpointResponse_arn,
+    createManagedEndpointResponse_id,
+    createManagedEndpointResponse_name,
+    createManagedEndpointResponse_virtualClusterId,
+    createManagedEndpointResponse_httpStatus,
+
+    -- ** CreateVirtualCluster
+    createVirtualCluster_tags,
+    createVirtualCluster_name,
+    createVirtualCluster_containerProvider,
+    createVirtualCluster_clientToken,
+    createVirtualClusterResponse_arn,
+    createVirtualClusterResponse_id,
+    createVirtualClusterResponse_name,
+    createVirtualClusterResponse_httpStatus,
+
+    -- ** DeleteJobTemplate
+    deleteJobTemplate_id,
+    deleteJobTemplateResponse_id,
+    deleteJobTemplateResponse_httpStatus,
+
+    -- ** DeleteManagedEndpoint
+    deleteManagedEndpoint_id,
+    deleteManagedEndpoint_virtualClusterId,
+    deleteManagedEndpointResponse_id,
+    deleteManagedEndpointResponse_virtualClusterId,
+    deleteManagedEndpointResponse_httpStatus,
+
+    -- ** DeleteVirtualCluster
+    deleteVirtualCluster_id,
+    deleteVirtualClusterResponse_id,
+    deleteVirtualClusterResponse_httpStatus,
+
+    -- ** DescribeJobRun
+    describeJobRun_id,
+    describeJobRun_virtualClusterId,
+    describeJobRunResponse_jobRun,
+    describeJobRunResponse_httpStatus,
+
+    -- ** DescribeJobTemplate
+    describeJobTemplate_id,
+    describeJobTemplateResponse_jobTemplate,
+    describeJobTemplateResponse_httpStatus,
+
+    -- ** DescribeManagedEndpoint
+    describeManagedEndpoint_id,
+    describeManagedEndpoint_virtualClusterId,
+    describeManagedEndpointResponse_endpoint,
+    describeManagedEndpointResponse_httpStatus,
+
+    -- ** DescribeVirtualCluster
+    describeVirtualCluster_id,
+    describeVirtualClusterResponse_virtualCluster,
+    describeVirtualClusterResponse_httpStatus,
+
+    -- ** ListJobRuns
+    listJobRuns_createdAfter,
+    listJobRuns_createdBefore,
+    listJobRuns_maxResults,
+    listJobRuns_name,
+    listJobRuns_nextToken,
+    listJobRuns_states,
+    listJobRuns_virtualClusterId,
+    listJobRunsResponse_jobRuns,
+    listJobRunsResponse_nextToken,
+    listJobRunsResponse_httpStatus,
+
+    -- ** ListJobTemplates
+    listJobTemplates_createdAfter,
+    listJobTemplates_createdBefore,
+    listJobTemplates_maxResults,
+    listJobTemplates_nextToken,
+    listJobTemplatesResponse_nextToken,
+    listJobTemplatesResponse_templates,
+    listJobTemplatesResponse_httpStatus,
+
+    -- ** ListManagedEndpoints
+    listManagedEndpoints_createdAfter,
+    listManagedEndpoints_createdBefore,
+    listManagedEndpoints_maxResults,
+    listManagedEndpoints_nextToken,
+    listManagedEndpoints_states,
+    listManagedEndpoints_types,
+    listManagedEndpoints_virtualClusterId,
+    listManagedEndpointsResponse_endpoints,
+    listManagedEndpointsResponse_nextToken,
+    listManagedEndpointsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ListVirtualClusters
+    listVirtualClusters_containerProviderId,
+    listVirtualClusters_containerProviderType,
+    listVirtualClusters_createdAfter,
+    listVirtualClusters_createdBefore,
+    listVirtualClusters_maxResults,
+    listVirtualClusters_nextToken,
+    listVirtualClusters_states,
+    listVirtualClustersResponse_nextToken,
+    listVirtualClustersResponse_virtualClusters,
+    listVirtualClustersResponse_httpStatus,
+
+    -- ** StartJobRun
+    startJobRun_configurationOverrides,
+    startJobRun_executionRoleArn,
+    startJobRun_jobDriver,
+    startJobRun_jobTemplateId,
+    startJobRun_jobTemplateParameters,
+    startJobRun_name,
+    startJobRun_releaseLabel,
+    startJobRun_tags,
+    startJobRun_virtualClusterId,
+    startJobRun_clientToken,
+    startJobRunResponse_arn,
+    startJobRunResponse_id,
+    startJobRunResponse_name,
+    startJobRunResponse_virtualClusterId,
+    startJobRunResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Certificate
+    certificate_certificateArn,
+    certificate_certificateData,
+
+    -- ** CloudWatchMonitoringConfiguration
+    cloudWatchMonitoringConfiguration_logStreamNamePrefix,
+    cloudWatchMonitoringConfiguration_logGroupName,
+
+    -- ** Configuration
+    configuration_configurations,
+    configuration_properties,
+    configuration_classification,
+
+    -- ** ConfigurationOverrides
+    configurationOverrides_applicationConfiguration,
+    configurationOverrides_monitoringConfiguration,
+
+    -- ** ContainerInfo
+    containerInfo_eksInfo,
+
+    -- ** ContainerProvider
+    containerProvider_info,
+    containerProvider_type,
+    containerProvider_id,
+
+    -- ** EksInfo
+    eksInfo_namespace,
+
+    -- ** Endpoint
+    endpoint_arn,
+    endpoint_certificateArn,
+    endpoint_certificateAuthority,
+    endpoint_configurationOverrides,
+    endpoint_createdAt,
+    endpoint_executionRoleArn,
+    endpoint_failureReason,
+    endpoint_id,
+    endpoint_name,
+    endpoint_releaseLabel,
+    endpoint_securityGroup,
+    endpoint_serverUrl,
+    endpoint_state,
+    endpoint_stateDetails,
+    endpoint_subnetIds,
+    endpoint_tags,
+    endpoint_type,
+    endpoint_virtualClusterId,
+
+    -- ** JobDriver
+    jobDriver_sparkSqlJobDriver,
+    jobDriver_sparkSubmitJobDriver,
+
+    -- ** JobRun
+    jobRun_arn,
+    jobRun_clientToken,
+    jobRun_configurationOverrides,
+    jobRun_createdAt,
+    jobRun_createdBy,
+    jobRun_executionRoleArn,
+    jobRun_failureReason,
+    jobRun_finishedAt,
+    jobRun_id,
+    jobRun_jobDriver,
+    jobRun_name,
+    jobRun_releaseLabel,
+    jobRun_state,
+    jobRun_stateDetails,
+    jobRun_tags,
+    jobRun_virtualClusterId,
+
+    -- ** JobTemplate
+    jobTemplate_arn,
+    jobTemplate_createdAt,
+    jobTemplate_createdBy,
+    jobTemplate_decryptionError,
+    jobTemplate_id,
+    jobTemplate_kmsKeyArn,
+    jobTemplate_name,
+    jobTemplate_tags,
+    jobTemplate_jobTemplateData,
+
+    -- ** JobTemplateData
+    jobTemplateData_configurationOverrides,
+    jobTemplateData_jobTags,
+    jobTemplateData_parameterConfiguration,
+    jobTemplateData_executionRoleArn,
+    jobTemplateData_releaseLabel,
+    jobTemplateData_jobDriver,
+
+    -- ** MonitoringConfiguration
+    monitoringConfiguration_cloudWatchMonitoringConfiguration,
+    monitoringConfiguration_persistentAppUI,
+    monitoringConfiguration_s3MonitoringConfiguration,
+
+    -- ** ParametricCloudWatchMonitoringConfiguration
+    parametricCloudWatchMonitoringConfiguration_logGroupName,
+    parametricCloudWatchMonitoringConfiguration_logStreamNamePrefix,
+
+    -- ** ParametricConfigurationOverrides
+    parametricConfigurationOverrides_applicationConfiguration,
+    parametricConfigurationOverrides_monitoringConfiguration,
+
+    -- ** ParametricMonitoringConfiguration
+    parametricMonitoringConfiguration_cloudWatchMonitoringConfiguration,
+    parametricMonitoringConfiguration_persistentAppUI,
+    parametricMonitoringConfiguration_s3MonitoringConfiguration,
+
+    -- ** ParametricS3MonitoringConfiguration
+    parametricS3MonitoringConfiguration_logUri,
+
+    -- ** S3MonitoringConfiguration
+    s3MonitoringConfiguration_logUri,
+
+    -- ** SparkSqlJobDriver
+    sparkSqlJobDriver_entryPoint,
+    sparkSqlJobDriver_sparkSqlParameters,
+
+    -- ** SparkSubmitJobDriver
+    sparkSubmitJobDriver_entryPointArguments,
+    sparkSubmitJobDriver_sparkSubmitParameters,
+    sparkSubmitJobDriver_entryPoint,
+
+    -- ** TemplateParameterConfiguration
+    templateParameterConfiguration_defaultValue,
+    templateParameterConfiguration_type,
+
+    -- ** VirtualCluster
+    virtualCluster_arn,
+    virtualCluster_containerProvider,
+    virtualCluster_createdAt,
+    virtualCluster_id,
+    virtualCluster_name,
+    virtualCluster_state,
+    virtualCluster_tags,
+  )
+where
+
+import Amazonka.EMRContainers.CancelJobRun
+import Amazonka.EMRContainers.CreateJobTemplate
+import Amazonka.EMRContainers.CreateManagedEndpoint
+import Amazonka.EMRContainers.CreateVirtualCluster
+import Amazonka.EMRContainers.DeleteJobTemplate
+import Amazonka.EMRContainers.DeleteManagedEndpoint
+import Amazonka.EMRContainers.DeleteVirtualCluster
+import Amazonka.EMRContainers.DescribeJobRun
+import Amazonka.EMRContainers.DescribeJobTemplate
+import Amazonka.EMRContainers.DescribeManagedEndpoint
+import Amazonka.EMRContainers.DescribeVirtualCluster
+import Amazonka.EMRContainers.ListJobRuns
+import Amazonka.EMRContainers.ListJobTemplates
+import Amazonka.EMRContainers.ListManagedEndpoints
+import Amazonka.EMRContainers.ListTagsForResource
+import Amazonka.EMRContainers.ListVirtualClusters
+import Amazonka.EMRContainers.StartJobRun
+import Amazonka.EMRContainers.TagResource
+import Amazonka.EMRContainers.Types.Certificate
+import Amazonka.EMRContainers.Types.CloudWatchMonitoringConfiguration
+import Amazonka.EMRContainers.Types.Configuration
+import Amazonka.EMRContainers.Types.ConfigurationOverrides
+import Amazonka.EMRContainers.Types.ContainerInfo
+import Amazonka.EMRContainers.Types.ContainerProvider
+import Amazonka.EMRContainers.Types.EksInfo
+import Amazonka.EMRContainers.Types.Endpoint
+import Amazonka.EMRContainers.Types.JobDriver
+import Amazonka.EMRContainers.Types.JobRun
+import Amazonka.EMRContainers.Types.JobTemplate
+import Amazonka.EMRContainers.Types.JobTemplateData
+import Amazonka.EMRContainers.Types.MonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricCloudWatchMonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricConfigurationOverrides
+import Amazonka.EMRContainers.Types.ParametricMonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricS3MonitoringConfiguration
+import Amazonka.EMRContainers.Types.S3MonitoringConfiguration
+import Amazonka.EMRContainers.Types.SparkSqlJobDriver
+import Amazonka.EMRContainers.Types.SparkSubmitJobDriver
+import Amazonka.EMRContainers.Types.TemplateParameterConfiguration
+import Amazonka.EMRContainers.Types.VirtualCluster
+import Amazonka.EMRContainers.UntagResource
diff --git a/gen/Amazonka/EMRContainers/ListJobRuns.hs b/gen/Amazonka/EMRContainers/ListJobRuns.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/ListJobRuns.hs
@@ -0,0 +1,283 @@
+{-# 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.EMRContainers.ListJobRuns
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists job runs based on a set of parameters. A job run is a unit of
+-- work, such as a Spark jar, PySpark script, or SparkSQL query, that you
+-- submit to Amazon EMR on EKS.
+--
+-- This operation returns paginated results.
+module Amazonka.EMRContainers.ListJobRuns
+  ( -- * Creating a Request
+    ListJobRuns (..),
+    newListJobRuns,
+
+    -- * Request Lenses
+    listJobRuns_createdAfter,
+    listJobRuns_createdBefore,
+    listJobRuns_maxResults,
+    listJobRuns_name,
+    listJobRuns_nextToken,
+    listJobRuns_states,
+    listJobRuns_virtualClusterId,
+
+    -- * Destructuring the Response
+    ListJobRunsResponse (..),
+    newListJobRunsResponse,
+
+    -- * Response Lenses
+    listJobRunsResponse_jobRuns,
+    listJobRunsResponse_nextToken,
+    listJobRunsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListJobRuns' smart constructor.
+data ListJobRuns = ListJobRuns'
+  { -- | The date and time after which the job runs were submitted.
+    createdAfter :: Prelude.Maybe Data.ISO8601,
+    -- | The date and time before which the job runs were submitted.
+    createdBefore :: Prelude.Maybe Data.ISO8601,
+    -- | The maximum number of job runs that can be listed.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | The name of the job run.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The token for the next set of job runs to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The states of the job run.
+    states :: Prelude.Maybe [JobRunState],
+    -- | The ID of the virtual cluster for which to list the job run.
+    virtualClusterId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListJobRuns' 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:
+--
+-- 'createdAfter', 'listJobRuns_createdAfter' - The date and time after which the job runs were submitted.
+--
+-- 'createdBefore', 'listJobRuns_createdBefore' - The date and time before which the job runs were submitted.
+--
+-- 'maxResults', 'listJobRuns_maxResults' - The maximum number of job runs that can be listed.
+--
+-- 'name', 'listJobRuns_name' - The name of the job run.
+--
+-- 'nextToken', 'listJobRuns_nextToken' - The token for the next set of job runs to return.
+--
+-- 'states', 'listJobRuns_states' - The states of the job run.
+--
+-- 'virtualClusterId', 'listJobRuns_virtualClusterId' - The ID of the virtual cluster for which to list the job run.
+newListJobRuns ::
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  ListJobRuns
+newListJobRuns pVirtualClusterId_ =
+  ListJobRuns'
+    { createdAfter = Prelude.Nothing,
+      createdBefore = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      name = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      states = Prelude.Nothing,
+      virtualClusterId = pVirtualClusterId_
+    }
+
+-- | The date and time after which the job runs were submitted.
+listJobRuns_createdAfter :: Lens.Lens' ListJobRuns (Prelude.Maybe Prelude.UTCTime)
+listJobRuns_createdAfter = Lens.lens (\ListJobRuns' {createdAfter} -> createdAfter) (\s@ListJobRuns' {} a -> s {createdAfter = a} :: ListJobRuns) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time before which the job runs were submitted.
+listJobRuns_createdBefore :: Lens.Lens' ListJobRuns (Prelude.Maybe Prelude.UTCTime)
+listJobRuns_createdBefore = Lens.lens (\ListJobRuns' {createdBefore} -> createdBefore) (\s@ListJobRuns' {} a -> s {createdBefore = a} :: ListJobRuns) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum number of job runs that can be listed.
+listJobRuns_maxResults :: Lens.Lens' ListJobRuns (Prelude.Maybe Prelude.Int)
+listJobRuns_maxResults = Lens.lens (\ListJobRuns' {maxResults} -> maxResults) (\s@ListJobRuns' {} a -> s {maxResults = a} :: ListJobRuns)
+
+-- | The name of the job run.
+listJobRuns_name :: Lens.Lens' ListJobRuns (Prelude.Maybe Prelude.Text)
+listJobRuns_name = Lens.lens (\ListJobRuns' {name} -> name) (\s@ListJobRuns' {} a -> s {name = a} :: ListJobRuns)
+
+-- | The token for the next set of job runs to return.
+listJobRuns_nextToken :: Lens.Lens' ListJobRuns (Prelude.Maybe Prelude.Text)
+listJobRuns_nextToken = Lens.lens (\ListJobRuns' {nextToken} -> nextToken) (\s@ListJobRuns' {} a -> s {nextToken = a} :: ListJobRuns)
+
+-- | The states of the job run.
+listJobRuns_states :: Lens.Lens' ListJobRuns (Prelude.Maybe [JobRunState])
+listJobRuns_states = Lens.lens (\ListJobRuns' {states} -> states) (\s@ListJobRuns' {} a -> s {states = a} :: ListJobRuns) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the virtual cluster for which to list the job run.
+listJobRuns_virtualClusterId :: Lens.Lens' ListJobRuns Prelude.Text
+listJobRuns_virtualClusterId = Lens.lens (\ListJobRuns' {virtualClusterId} -> virtualClusterId) (\s@ListJobRuns' {} a -> s {virtualClusterId = a} :: ListJobRuns)
+
+instance Core.AWSPager ListJobRuns where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listJobRunsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listJobRunsResponse_jobRuns
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listJobRuns_nextToken
+          Lens..~ rs
+          Lens.^? listJobRunsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListJobRuns where
+  type AWSResponse ListJobRuns = ListJobRunsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListJobRunsResponse'
+            Prelude.<$> (x Data..?> "jobRuns" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListJobRuns where
+  hashWithSalt _salt ListJobRuns' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAfter
+      `Prelude.hashWithSalt` createdBefore
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` states
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData ListJobRuns where
+  rnf ListJobRuns' {..} =
+    Prelude.rnf createdAfter
+      `Prelude.seq` Prelude.rnf createdBefore
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf states
+      `Prelude.seq` Prelude.rnf virtualClusterId
+
+instance Data.ToHeaders ListJobRuns where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListJobRuns where
+  toPath ListJobRuns' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/jobruns"
+      ]
+
+instance Data.ToQuery ListJobRuns where
+  toQuery ListJobRuns' {..} =
+    Prelude.mconcat
+      [ "createdAfter" Data.=: createdAfter,
+        "createdBefore" Data.=: createdBefore,
+        "maxResults" Data.=: maxResults,
+        "name" Data.=: name,
+        "nextToken" Data.=: nextToken,
+        "states"
+          Data.=: Data.toQuery
+            (Data.toQueryList "member" Prelude.<$> states)
+      ]
+
+-- | /See:/ 'newListJobRunsResponse' smart constructor.
+data ListJobRunsResponse = ListJobRunsResponse'
+  { -- | This output lists information about the specified job runs.
+    jobRuns :: Prelude.Maybe [JobRun],
+    -- | This output displays the token for the next set of job runs.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListJobRunsResponse' 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:
+--
+-- 'jobRuns', 'listJobRunsResponse_jobRuns' - This output lists information about the specified job runs.
+--
+-- 'nextToken', 'listJobRunsResponse_nextToken' - This output displays the token for the next set of job runs.
+--
+-- 'httpStatus', 'listJobRunsResponse_httpStatus' - The response's http status code.
+newListJobRunsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListJobRunsResponse
+newListJobRunsResponse pHttpStatus_ =
+  ListJobRunsResponse'
+    { jobRuns = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output lists information about the specified job runs.
+listJobRunsResponse_jobRuns :: Lens.Lens' ListJobRunsResponse (Prelude.Maybe [JobRun])
+listJobRunsResponse_jobRuns = Lens.lens (\ListJobRunsResponse' {jobRuns} -> jobRuns) (\s@ListJobRunsResponse' {} a -> s {jobRuns = a} :: ListJobRunsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | This output displays the token for the next set of job runs.
+listJobRunsResponse_nextToken :: Lens.Lens' ListJobRunsResponse (Prelude.Maybe Prelude.Text)
+listJobRunsResponse_nextToken = Lens.lens (\ListJobRunsResponse' {nextToken} -> nextToken) (\s@ListJobRunsResponse' {} a -> s {nextToken = a} :: ListJobRunsResponse)
+
+-- | The response's http status code.
+listJobRunsResponse_httpStatus :: Lens.Lens' ListJobRunsResponse Prelude.Int
+listJobRunsResponse_httpStatus = Lens.lens (\ListJobRunsResponse' {httpStatus} -> httpStatus) (\s@ListJobRunsResponse' {} a -> s {httpStatus = a} :: ListJobRunsResponse)
+
+instance Prelude.NFData ListJobRunsResponse where
+  rnf ListJobRunsResponse' {..} =
+    Prelude.rnf jobRuns
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/ListJobTemplates.hs b/gen/Amazonka/EMRContainers/ListJobTemplates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/ListJobTemplates.hs
@@ -0,0 +1,241 @@
+{-# 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.EMRContainers.ListJobTemplates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists job templates based on a set of parameters. Job template stores
+-- values of StartJobRun API request in a template and can be used to start
+-- a job run. Job template allows two use cases: avoid repeating recurring
+-- StartJobRun API request values, enforcing certain values in StartJobRun
+-- API request.
+--
+-- This operation returns paginated results.
+module Amazonka.EMRContainers.ListJobTemplates
+  ( -- * Creating a Request
+    ListJobTemplates (..),
+    newListJobTemplates,
+
+    -- * Request Lenses
+    listJobTemplates_createdAfter,
+    listJobTemplates_createdBefore,
+    listJobTemplates_maxResults,
+    listJobTemplates_nextToken,
+
+    -- * Destructuring the Response
+    ListJobTemplatesResponse (..),
+    newListJobTemplatesResponse,
+
+    -- * Response Lenses
+    listJobTemplatesResponse_nextToken,
+    listJobTemplatesResponse_templates,
+    listJobTemplatesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListJobTemplates' smart constructor.
+data ListJobTemplates = ListJobTemplates'
+  { -- | The date and time after which the job templates were created.
+    createdAfter :: Prelude.Maybe Data.ISO8601,
+    -- | The date and time before which the job templates were created.
+    createdBefore :: Prelude.Maybe Data.ISO8601,
+    -- | The maximum number of job templates that can be listed.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | The token for the next set of job templates to return.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListJobTemplates' 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:
+--
+-- 'createdAfter', 'listJobTemplates_createdAfter' - The date and time after which the job templates were created.
+--
+-- 'createdBefore', 'listJobTemplates_createdBefore' - The date and time before which the job templates were created.
+--
+-- 'maxResults', 'listJobTemplates_maxResults' - The maximum number of job templates that can be listed.
+--
+-- 'nextToken', 'listJobTemplates_nextToken' - The token for the next set of job templates to return.
+newListJobTemplates ::
+  ListJobTemplates
+newListJobTemplates =
+  ListJobTemplates'
+    { createdAfter = Prelude.Nothing,
+      createdBefore = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The date and time after which the job templates were created.
+listJobTemplates_createdAfter :: Lens.Lens' ListJobTemplates (Prelude.Maybe Prelude.UTCTime)
+listJobTemplates_createdAfter = Lens.lens (\ListJobTemplates' {createdAfter} -> createdAfter) (\s@ListJobTemplates' {} a -> s {createdAfter = a} :: ListJobTemplates) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time before which the job templates were created.
+listJobTemplates_createdBefore :: Lens.Lens' ListJobTemplates (Prelude.Maybe Prelude.UTCTime)
+listJobTemplates_createdBefore = Lens.lens (\ListJobTemplates' {createdBefore} -> createdBefore) (\s@ListJobTemplates' {} a -> s {createdBefore = a} :: ListJobTemplates) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum number of job templates that can be listed.
+listJobTemplates_maxResults :: Lens.Lens' ListJobTemplates (Prelude.Maybe Prelude.Int)
+listJobTemplates_maxResults = Lens.lens (\ListJobTemplates' {maxResults} -> maxResults) (\s@ListJobTemplates' {} a -> s {maxResults = a} :: ListJobTemplates)
+
+-- | The token for the next set of job templates to return.
+listJobTemplates_nextToken :: Lens.Lens' ListJobTemplates (Prelude.Maybe Prelude.Text)
+listJobTemplates_nextToken = Lens.lens (\ListJobTemplates' {nextToken} -> nextToken) (\s@ListJobTemplates' {} a -> s {nextToken = a} :: ListJobTemplates)
+
+instance Core.AWSPager ListJobTemplates where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listJobTemplatesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listJobTemplatesResponse_templates
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listJobTemplates_nextToken
+          Lens..~ rs
+          Lens.^? listJobTemplatesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListJobTemplates where
+  type
+    AWSResponse ListJobTemplates =
+      ListJobTemplatesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListJobTemplatesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "templates" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListJobTemplates where
+  hashWithSalt _salt ListJobTemplates' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAfter
+      `Prelude.hashWithSalt` createdBefore
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListJobTemplates where
+  rnf ListJobTemplates' {..} =
+    Prelude.rnf createdAfter
+      `Prelude.seq` Prelude.rnf createdBefore
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListJobTemplates where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListJobTemplates where
+  toPath = Prelude.const "/jobtemplates"
+
+instance Data.ToQuery ListJobTemplates where
+  toQuery ListJobTemplates' {..} =
+    Prelude.mconcat
+      [ "createdAfter" Data.=: createdAfter,
+        "createdBefore" Data.=: createdBefore,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListJobTemplatesResponse' smart constructor.
+data ListJobTemplatesResponse = ListJobTemplatesResponse'
+  { -- | This output displays the token for the next set of job templates.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | This output lists information about the specified job templates.
+    templates :: Prelude.Maybe [JobTemplate],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListJobTemplatesResponse' 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', 'listJobTemplatesResponse_nextToken' - This output displays the token for the next set of job templates.
+--
+-- 'templates', 'listJobTemplatesResponse_templates' - This output lists information about the specified job templates.
+--
+-- 'httpStatus', 'listJobTemplatesResponse_httpStatus' - The response's http status code.
+newListJobTemplatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListJobTemplatesResponse
+newListJobTemplatesResponse pHttpStatus_ =
+  ListJobTemplatesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      templates = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output displays the token for the next set of job templates.
+listJobTemplatesResponse_nextToken :: Lens.Lens' ListJobTemplatesResponse (Prelude.Maybe Prelude.Text)
+listJobTemplatesResponse_nextToken = Lens.lens (\ListJobTemplatesResponse' {nextToken} -> nextToken) (\s@ListJobTemplatesResponse' {} a -> s {nextToken = a} :: ListJobTemplatesResponse)
+
+-- | This output lists information about the specified job templates.
+listJobTemplatesResponse_templates :: Lens.Lens' ListJobTemplatesResponse (Prelude.Maybe [JobTemplate])
+listJobTemplatesResponse_templates = Lens.lens (\ListJobTemplatesResponse' {templates} -> templates) (\s@ListJobTemplatesResponse' {} a -> s {templates = a} :: ListJobTemplatesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listJobTemplatesResponse_httpStatus :: Lens.Lens' ListJobTemplatesResponse Prelude.Int
+listJobTemplatesResponse_httpStatus = Lens.lens (\ListJobTemplatesResponse' {httpStatus} -> httpStatus) (\s@ListJobTemplatesResponse' {} a -> s {httpStatus = a} :: ListJobTemplatesResponse)
+
+instance Prelude.NFData ListJobTemplatesResponse where
+  rnf ListJobTemplatesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf templates
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/ListManagedEndpoints.hs b/gen/Amazonka/EMRContainers/ListManagedEndpoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/ListManagedEndpoints.hs
@@ -0,0 +1,289 @@
+{-# 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.EMRContainers.ListManagedEndpoints
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists managed endpoints based on a set of parameters. A managed endpoint
+-- is a gateway that connects EMR Studio to Amazon EMR on EKS so that EMR
+-- Studio can communicate with your virtual cluster.
+--
+-- This operation returns paginated results.
+module Amazonka.EMRContainers.ListManagedEndpoints
+  ( -- * Creating a Request
+    ListManagedEndpoints (..),
+    newListManagedEndpoints,
+
+    -- * Request Lenses
+    listManagedEndpoints_createdAfter,
+    listManagedEndpoints_createdBefore,
+    listManagedEndpoints_maxResults,
+    listManagedEndpoints_nextToken,
+    listManagedEndpoints_states,
+    listManagedEndpoints_types,
+    listManagedEndpoints_virtualClusterId,
+
+    -- * Destructuring the Response
+    ListManagedEndpointsResponse (..),
+    newListManagedEndpointsResponse,
+
+    -- * Response Lenses
+    listManagedEndpointsResponse_endpoints,
+    listManagedEndpointsResponse_nextToken,
+    listManagedEndpointsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListManagedEndpoints' smart constructor.
+data ListManagedEndpoints = ListManagedEndpoints'
+  { -- | The date and time after which the endpoints are created.
+    createdAfter :: Prelude.Maybe Data.ISO8601,
+    -- | The date and time before which the endpoints are created.
+    createdBefore :: Prelude.Maybe Data.ISO8601,
+    -- | The maximum number of managed endpoints that can be listed.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | The token for the next set of managed endpoints to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The states of the managed endpoints.
+    states :: Prelude.Maybe [EndpointState],
+    -- | The types of the managed endpoints.
+    types :: Prelude.Maybe [Prelude.Text],
+    -- | The ID of the virtual cluster.
+    virtualClusterId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListManagedEndpoints' 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:
+--
+-- 'createdAfter', 'listManagedEndpoints_createdAfter' - The date and time after which the endpoints are created.
+--
+-- 'createdBefore', 'listManagedEndpoints_createdBefore' - The date and time before which the endpoints are created.
+--
+-- 'maxResults', 'listManagedEndpoints_maxResults' - The maximum number of managed endpoints that can be listed.
+--
+-- 'nextToken', 'listManagedEndpoints_nextToken' - The token for the next set of managed endpoints to return.
+--
+-- 'states', 'listManagedEndpoints_states' - The states of the managed endpoints.
+--
+-- 'types', 'listManagedEndpoints_types' - The types of the managed endpoints.
+--
+-- 'virtualClusterId', 'listManagedEndpoints_virtualClusterId' - The ID of the virtual cluster.
+newListManagedEndpoints ::
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  ListManagedEndpoints
+newListManagedEndpoints pVirtualClusterId_ =
+  ListManagedEndpoints'
+    { createdAfter =
+        Prelude.Nothing,
+      createdBefore = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      states = Prelude.Nothing,
+      types = Prelude.Nothing,
+      virtualClusterId = pVirtualClusterId_
+    }
+
+-- | The date and time after which the endpoints are created.
+listManagedEndpoints_createdAfter :: Lens.Lens' ListManagedEndpoints (Prelude.Maybe Prelude.UTCTime)
+listManagedEndpoints_createdAfter = Lens.lens (\ListManagedEndpoints' {createdAfter} -> createdAfter) (\s@ListManagedEndpoints' {} a -> s {createdAfter = a} :: ListManagedEndpoints) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time before which the endpoints are created.
+listManagedEndpoints_createdBefore :: Lens.Lens' ListManagedEndpoints (Prelude.Maybe Prelude.UTCTime)
+listManagedEndpoints_createdBefore = Lens.lens (\ListManagedEndpoints' {createdBefore} -> createdBefore) (\s@ListManagedEndpoints' {} a -> s {createdBefore = a} :: ListManagedEndpoints) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum number of managed endpoints that can be listed.
+listManagedEndpoints_maxResults :: Lens.Lens' ListManagedEndpoints (Prelude.Maybe Prelude.Int)
+listManagedEndpoints_maxResults = Lens.lens (\ListManagedEndpoints' {maxResults} -> maxResults) (\s@ListManagedEndpoints' {} a -> s {maxResults = a} :: ListManagedEndpoints)
+
+-- | The token for the next set of managed endpoints to return.
+listManagedEndpoints_nextToken :: Lens.Lens' ListManagedEndpoints (Prelude.Maybe Prelude.Text)
+listManagedEndpoints_nextToken = Lens.lens (\ListManagedEndpoints' {nextToken} -> nextToken) (\s@ListManagedEndpoints' {} a -> s {nextToken = a} :: ListManagedEndpoints)
+
+-- | The states of the managed endpoints.
+listManagedEndpoints_states :: Lens.Lens' ListManagedEndpoints (Prelude.Maybe [EndpointState])
+listManagedEndpoints_states = Lens.lens (\ListManagedEndpoints' {states} -> states) (\s@ListManagedEndpoints' {} a -> s {states = a} :: ListManagedEndpoints) Prelude.. Lens.mapping Lens.coerced
+
+-- | The types of the managed endpoints.
+listManagedEndpoints_types :: Lens.Lens' ListManagedEndpoints (Prelude.Maybe [Prelude.Text])
+listManagedEndpoints_types = Lens.lens (\ListManagedEndpoints' {types} -> types) (\s@ListManagedEndpoints' {} a -> s {types = a} :: ListManagedEndpoints) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the virtual cluster.
+listManagedEndpoints_virtualClusterId :: Lens.Lens' ListManagedEndpoints Prelude.Text
+listManagedEndpoints_virtualClusterId = Lens.lens (\ListManagedEndpoints' {virtualClusterId} -> virtualClusterId) (\s@ListManagedEndpoints' {} a -> s {virtualClusterId = a} :: ListManagedEndpoints)
+
+instance Core.AWSPager ListManagedEndpoints where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listManagedEndpointsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listManagedEndpointsResponse_endpoints
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listManagedEndpoints_nextToken
+          Lens..~ rs
+          Lens.^? listManagedEndpointsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListManagedEndpoints where
+  type
+    AWSResponse ListManagedEndpoints =
+      ListManagedEndpointsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListManagedEndpointsResponse'
+            Prelude.<$> (x Data..?> "endpoints" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListManagedEndpoints where
+  hashWithSalt _salt ListManagedEndpoints' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAfter
+      `Prelude.hashWithSalt` createdBefore
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` states
+      `Prelude.hashWithSalt` types
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData ListManagedEndpoints where
+  rnf ListManagedEndpoints' {..} =
+    Prelude.rnf createdAfter
+      `Prelude.seq` Prelude.rnf createdBefore
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf states
+      `Prelude.seq` Prelude.rnf types
+      `Prelude.seq` Prelude.rnf virtualClusterId
+
+instance Data.ToHeaders ListManagedEndpoints where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListManagedEndpoints where
+  toPath ListManagedEndpoints' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/endpoints"
+      ]
+
+instance Data.ToQuery ListManagedEndpoints where
+  toQuery ListManagedEndpoints' {..} =
+    Prelude.mconcat
+      [ "createdAfter" Data.=: createdAfter,
+        "createdBefore" Data.=: createdBefore,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "states"
+          Data.=: Data.toQuery
+            (Data.toQueryList "member" Prelude.<$> states),
+        "types"
+          Data.=: Data.toQuery
+            (Data.toQueryList "member" Prelude.<$> types)
+      ]
+
+-- | /See:/ 'newListManagedEndpointsResponse' smart constructor.
+data ListManagedEndpointsResponse = ListManagedEndpointsResponse'
+  { -- | The managed endpoints to be listed.
+    endpoints :: Prelude.Maybe [Endpoint],
+    -- | The token for the next set of endpoints to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListManagedEndpointsResponse' 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:
+--
+-- 'endpoints', 'listManagedEndpointsResponse_endpoints' - The managed endpoints to be listed.
+--
+-- 'nextToken', 'listManagedEndpointsResponse_nextToken' - The token for the next set of endpoints to return.
+--
+-- 'httpStatus', 'listManagedEndpointsResponse_httpStatus' - The response's http status code.
+newListManagedEndpointsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListManagedEndpointsResponse
+newListManagedEndpointsResponse pHttpStatus_ =
+  ListManagedEndpointsResponse'
+    { endpoints =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The managed endpoints to be listed.
+listManagedEndpointsResponse_endpoints :: Lens.Lens' ListManagedEndpointsResponse (Prelude.Maybe [Endpoint])
+listManagedEndpointsResponse_endpoints = Lens.lens (\ListManagedEndpointsResponse' {endpoints} -> endpoints) (\s@ListManagedEndpointsResponse' {} a -> s {endpoints = a} :: ListManagedEndpointsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of endpoints to return.
+listManagedEndpointsResponse_nextToken :: Lens.Lens' ListManagedEndpointsResponse (Prelude.Maybe Prelude.Text)
+listManagedEndpointsResponse_nextToken = Lens.lens (\ListManagedEndpointsResponse' {nextToken} -> nextToken) (\s@ListManagedEndpointsResponse' {} a -> s {nextToken = a} :: ListManagedEndpointsResponse)
+
+-- | The response's http status code.
+listManagedEndpointsResponse_httpStatus :: Lens.Lens' ListManagedEndpointsResponse Prelude.Int
+listManagedEndpointsResponse_httpStatus = Lens.lens (\ListManagedEndpointsResponse' {httpStatus} -> httpStatus) (\s@ListManagedEndpointsResponse' {} a -> s {httpStatus = a} :: ListManagedEndpointsResponse)
+
+instance Prelude.NFData ListManagedEndpointsResponse where
+  rnf ListManagedEndpointsResponse' {..} =
+    Prelude.rnf endpoints
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/ListTagsForResource.hs b/gen/Amazonka/EMRContainers/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/ListTagsForResource.hs
@@ -0,0 +1,159 @@
+{-# 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.EMRContainers.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)
+--
+-- Lists the tags assigned to the resources.
+module Amazonka.EMRContainers.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+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 ARN of tagged resources.
+    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:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The ARN of tagged resources.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The ARN of tagged resources.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+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..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    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 ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The tags assigned to resources.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  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:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags assigned to resources.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags assigned to resources.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | 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)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/ListVirtualClusters.hs b/gen/Amazonka/EMRContainers/ListVirtualClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/ListVirtualClusters.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.EMRContainers.ListVirtualClusters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists information about the specified virtual cluster. Virtual cluster
+-- is a managed entity on Amazon EMR on EKS. You can create, describe, list
+-- and delete virtual clusters. They do not consume any additional resource
+-- in your system. A single virtual cluster maps to a single Kubernetes
+-- namespace. Given this relationship, you can model virtual clusters the
+-- same way you model Kubernetes namespaces to meet your requirements.
+--
+-- This operation returns paginated results.
+module Amazonka.EMRContainers.ListVirtualClusters
+  ( -- * Creating a Request
+    ListVirtualClusters (..),
+    newListVirtualClusters,
+
+    -- * Request Lenses
+    listVirtualClusters_containerProviderId,
+    listVirtualClusters_containerProviderType,
+    listVirtualClusters_createdAfter,
+    listVirtualClusters_createdBefore,
+    listVirtualClusters_maxResults,
+    listVirtualClusters_nextToken,
+    listVirtualClusters_states,
+
+    -- * Destructuring the Response
+    ListVirtualClustersResponse (..),
+    newListVirtualClustersResponse,
+
+    -- * Response Lenses
+    listVirtualClustersResponse_nextToken,
+    listVirtualClustersResponse_virtualClusters,
+    listVirtualClustersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListVirtualClusters' smart constructor.
+data ListVirtualClusters = ListVirtualClusters'
+  { -- | The container provider ID of the virtual cluster.
+    containerProviderId :: Prelude.Maybe Prelude.Text,
+    -- | The container provider type of the virtual cluster. EKS is the only
+    -- supported type as of now.
+    containerProviderType :: Prelude.Maybe ContainerProviderType,
+    -- | The date and time after which the virtual clusters are created.
+    createdAfter :: Prelude.Maybe Data.ISO8601,
+    -- | The date and time before which the virtual clusters are created.
+    createdBefore :: Prelude.Maybe Data.ISO8601,
+    -- | The maximum number of virtual clusters that can be listed.
+    maxResults :: Prelude.Maybe Prelude.Int,
+    -- | The token for the next set of virtual clusters to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The states of the requested virtual clusters.
+    states :: Prelude.Maybe [VirtualClusterState]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualClusters' 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:
+--
+-- 'containerProviderId', 'listVirtualClusters_containerProviderId' - The container provider ID of the virtual cluster.
+--
+-- 'containerProviderType', 'listVirtualClusters_containerProviderType' - The container provider type of the virtual cluster. EKS is the only
+-- supported type as of now.
+--
+-- 'createdAfter', 'listVirtualClusters_createdAfter' - The date and time after which the virtual clusters are created.
+--
+-- 'createdBefore', 'listVirtualClusters_createdBefore' - The date and time before which the virtual clusters are created.
+--
+-- 'maxResults', 'listVirtualClusters_maxResults' - The maximum number of virtual clusters that can be listed.
+--
+-- 'nextToken', 'listVirtualClusters_nextToken' - The token for the next set of virtual clusters to return.
+--
+-- 'states', 'listVirtualClusters_states' - The states of the requested virtual clusters.
+newListVirtualClusters ::
+  ListVirtualClusters
+newListVirtualClusters =
+  ListVirtualClusters'
+    { containerProviderId =
+        Prelude.Nothing,
+      containerProviderType = Prelude.Nothing,
+      createdAfter = Prelude.Nothing,
+      createdBefore = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      states = Prelude.Nothing
+    }
+
+-- | The container provider ID of the virtual cluster.
+listVirtualClusters_containerProviderId :: Lens.Lens' ListVirtualClusters (Prelude.Maybe Prelude.Text)
+listVirtualClusters_containerProviderId = Lens.lens (\ListVirtualClusters' {containerProviderId} -> containerProviderId) (\s@ListVirtualClusters' {} a -> s {containerProviderId = a} :: ListVirtualClusters)
+
+-- | The container provider type of the virtual cluster. EKS is the only
+-- supported type as of now.
+listVirtualClusters_containerProviderType :: Lens.Lens' ListVirtualClusters (Prelude.Maybe ContainerProviderType)
+listVirtualClusters_containerProviderType = Lens.lens (\ListVirtualClusters' {containerProviderType} -> containerProviderType) (\s@ListVirtualClusters' {} a -> s {containerProviderType = a} :: ListVirtualClusters)
+
+-- | The date and time after which the virtual clusters are created.
+listVirtualClusters_createdAfter :: Lens.Lens' ListVirtualClusters (Prelude.Maybe Prelude.UTCTime)
+listVirtualClusters_createdAfter = Lens.lens (\ListVirtualClusters' {createdAfter} -> createdAfter) (\s@ListVirtualClusters' {} a -> s {createdAfter = a} :: ListVirtualClusters) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time before which the virtual clusters are created.
+listVirtualClusters_createdBefore :: Lens.Lens' ListVirtualClusters (Prelude.Maybe Prelude.UTCTime)
+listVirtualClusters_createdBefore = Lens.lens (\ListVirtualClusters' {createdBefore} -> createdBefore) (\s@ListVirtualClusters' {} a -> s {createdBefore = a} :: ListVirtualClusters) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum number of virtual clusters that can be listed.
+listVirtualClusters_maxResults :: Lens.Lens' ListVirtualClusters (Prelude.Maybe Prelude.Int)
+listVirtualClusters_maxResults = Lens.lens (\ListVirtualClusters' {maxResults} -> maxResults) (\s@ListVirtualClusters' {} a -> s {maxResults = a} :: ListVirtualClusters)
+
+-- | The token for the next set of virtual clusters to return.
+listVirtualClusters_nextToken :: Lens.Lens' ListVirtualClusters (Prelude.Maybe Prelude.Text)
+listVirtualClusters_nextToken = Lens.lens (\ListVirtualClusters' {nextToken} -> nextToken) (\s@ListVirtualClusters' {} a -> s {nextToken = a} :: ListVirtualClusters)
+
+-- | The states of the requested virtual clusters.
+listVirtualClusters_states :: Lens.Lens' ListVirtualClusters (Prelude.Maybe [VirtualClusterState])
+listVirtualClusters_states = Lens.lens (\ListVirtualClusters' {states} -> states) (\s@ListVirtualClusters' {} a -> s {states = a} :: ListVirtualClusters) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager ListVirtualClusters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listVirtualClustersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listVirtualClustersResponse_virtualClusters
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listVirtualClusters_nextToken
+          Lens..~ rs
+          Lens.^? listVirtualClustersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListVirtualClusters where
+  type
+    AWSResponse ListVirtualClusters =
+      ListVirtualClustersResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVirtualClustersResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "virtualClusters"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListVirtualClusters where
+  hashWithSalt _salt ListVirtualClusters' {..} =
+    _salt
+      `Prelude.hashWithSalt` containerProviderId
+      `Prelude.hashWithSalt` containerProviderType
+      `Prelude.hashWithSalt` createdAfter
+      `Prelude.hashWithSalt` createdBefore
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` states
+
+instance Prelude.NFData ListVirtualClusters where
+  rnf ListVirtualClusters' {..} =
+    Prelude.rnf containerProviderId
+      `Prelude.seq` Prelude.rnf containerProviderType
+      `Prelude.seq` Prelude.rnf createdAfter
+      `Prelude.seq` Prelude.rnf createdBefore
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf states
+
+instance Data.ToHeaders ListVirtualClusters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListVirtualClusters where
+  toPath = Prelude.const "/virtualclusters"
+
+instance Data.ToQuery ListVirtualClusters where
+  toQuery ListVirtualClusters' {..} =
+    Prelude.mconcat
+      [ "containerProviderId" Data.=: containerProviderId,
+        "containerProviderType"
+          Data.=: containerProviderType,
+        "createdAfter" Data.=: createdAfter,
+        "createdBefore" Data.=: createdBefore,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "states"
+          Data.=: Data.toQuery
+            (Data.toQueryList "member" Prelude.<$> states)
+      ]
+
+-- | /See:/ 'newListVirtualClustersResponse' smart constructor.
+data ListVirtualClustersResponse = ListVirtualClustersResponse'
+  { -- | This output displays the token for the next set of virtual clusters.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | This output lists the specified virtual clusters.
+    virtualClusters :: Prelude.Maybe [VirtualCluster],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVirtualClustersResponse' 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', 'listVirtualClustersResponse_nextToken' - This output displays the token for the next set of virtual clusters.
+--
+-- 'virtualClusters', 'listVirtualClustersResponse_virtualClusters' - This output lists the specified virtual clusters.
+--
+-- 'httpStatus', 'listVirtualClustersResponse_httpStatus' - The response's http status code.
+newListVirtualClustersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVirtualClustersResponse
+newListVirtualClustersResponse pHttpStatus_ =
+  ListVirtualClustersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      virtualClusters = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output displays the token for the next set of virtual clusters.
+listVirtualClustersResponse_nextToken :: Lens.Lens' ListVirtualClustersResponse (Prelude.Maybe Prelude.Text)
+listVirtualClustersResponse_nextToken = Lens.lens (\ListVirtualClustersResponse' {nextToken} -> nextToken) (\s@ListVirtualClustersResponse' {} a -> s {nextToken = a} :: ListVirtualClustersResponse)
+
+-- | This output lists the specified virtual clusters.
+listVirtualClustersResponse_virtualClusters :: Lens.Lens' ListVirtualClustersResponse (Prelude.Maybe [VirtualCluster])
+listVirtualClustersResponse_virtualClusters = Lens.lens (\ListVirtualClustersResponse' {virtualClusters} -> virtualClusters) (\s@ListVirtualClustersResponse' {} a -> s {virtualClusters = a} :: ListVirtualClustersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listVirtualClustersResponse_httpStatus :: Lens.Lens' ListVirtualClustersResponse Prelude.Int
+listVirtualClustersResponse_httpStatus = Lens.lens (\ListVirtualClustersResponse' {httpStatus} -> httpStatus) (\s@ListVirtualClustersResponse' {} a -> s {httpStatus = a} :: ListVirtualClustersResponse)
+
+instance Prelude.NFData ListVirtualClustersResponse where
+  rnf ListVirtualClustersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf virtualClusters
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/StartJobRun.hs b/gen/Amazonka/EMRContainers/StartJobRun.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/StartJobRun.hs
@@ -0,0 +1,333 @@
+{-# 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.EMRContainers.StartJobRun
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a job run. A job run is a unit of work, such as a Spark jar,
+-- PySpark script, or SparkSQL query, that you submit to Amazon EMR on EKS.
+module Amazonka.EMRContainers.StartJobRun
+  ( -- * Creating a Request
+    StartJobRun (..),
+    newStartJobRun,
+
+    -- * Request Lenses
+    startJobRun_configurationOverrides,
+    startJobRun_executionRoleArn,
+    startJobRun_jobDriver,
+    startJobRun_jobTemplateId,
+    startJobRun_jobTemplateParameters,
+    startJobRun_name,
+    startJobRun_releaseLabel,
+    startJobRun_tags,
+    startJobRun_virtualClusterId,
+    startJobRun_clientToken,
+
+    -- * Destructuring the Response
+    StartJobRunResponse (..),
+    newStartJobRunResponse,
+
+    -- * Response Lenses
+    startJobRunResponse_arn,
+    startJobRunResponse_id,
+    startJobRunResponse_name,
+    startJobRunResponse_virtualClusterId,
+    startJobRunResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartJobRun' smart constructor.
+data StartJobRun = StartJobRun'
+  { -- | The configuration overrides for the job run.
+    configurationOverrides :: Prelude.Maybe ConfigurationOverrides,
+    -- | The execution role ARN for the job run.
+    executionRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The job driver for the job run.
+    jobDriver :: Prelude.Maybe JobDriver,
+    -- | The job template ID to be used to start the job run.
+    jobTemplateId :: Prelude.Maybe Prelude.Text,
+    -- | The values of job template parameters to start a job run.
+    jobTemplateParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the job run.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon EMR release version to use for the job run.
+    releaseLabel :: Prelude.Maybe Prelude.Text,
+    -- | The tags assigned to job runs.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The virtual cluster ID for which the job run request is submitted.
+    virtualClusterId :: Prelude.Text,
+    -- | The client idempotency token of the job run request.
+    clientToken :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartJobRun' 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:
+--
+-- 'configurationOverrides', 'startJobRun_configurationOverrides' - The configuration overrides for the job run.
+--
+-- 'executionRoleArn', 'startJobRun_executionRoleArn' - The execution role ARN for the job run.
+--
+-- 'jobDriver', 'startJobRun_jobDriver' - The job driver for the job run.
+--
+-- 'jobTemplateId', 'startJobRun_jobTemplateId' - The job template ID to be used to start the job run.
+--
+-- 'jobTemplateParameters', 'startJobRun_jobTemplateParameters' - The values of job template parameters to start a job run.
+--
+-- 'name', 'startJobRun_name' - The name of the job run.
+--
+-- 'releaseLabel', 'startJobRun_releaseLabel' - The Amazon EMR release version to use for the job run.
+--
+-- 'tags', 'startJobRun_tags' - The tags assigned to job runs.
+--
+-- 'virtualClusterId', 'startJobRun_virtualClusterId' - The virtual cluster ID for which the job run request is submitted.
+--
+-- 'clientToken', 'startJobRun_clientToken' - The client idempotency token of the job run request.
+newStartJobRun ::
+  -- | 'virtualClusterId'
+  Prelude.Text ->
+  -- | 'clientToken'
+  Prelude.Text ->
+  StartJobRun
+newStartJobRun pVirtualClusterId_ pClientToken_ =
+  StartJobRun'
+    { configurationOverrides =
+        Prelude.Nothing,
+      executionRoleArn = Prelude.Nothing,
+      jobDriver = Prelude.Nothing,
+      jobTemplateId = Prelude.Nothing,
+      jobTemplateParameters = Prelude.Nothing,
+      name = Prelude.Nothing,
+      releaseLabel = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      virtualClusterId = pVirtualClusterId_,
+      clientToken = pClientToken_
+    }
+
+-- | The configuration overrides for the job run.
+startJobRun_configurationOverrides :: Lens.Lens' StartJobRun (Prelude.Maybe ConfigurationOverrides)
+startJobRun_configurationOverrides = Lens.lens (\StartJobRun' {configurationOverrides} -> configurationOverrides) (\s@StartJobRun' {} a -> s {configurationOverrides = a} :: StartJobRun)
+
+-- | The execution role ARN for the job run.
+startJobRun_executionRoleArn :: Lens.Lens' StartJobRun (Prelude.Maybe Prelude.Text)
+startJobRun_executionRoleArn = Lens.lens (\StartJobRun' {executionRoleArn} -> executionRoleArn) (\s@StartJobRun' {} a -> s {executionRoleArn = a} :: StartJobRun)
+
+-- | The job driver for the job run.
+startJobRun_jobDriver :: Lens.Lens' StartJobRun (Prelude.Maybe JobDriver)
+startJobRun_jobDriver = Lens.lens (\StartJobRun' {jobDriver} -> jobDriver) (\s@StartJobRun' {} a -> s {jobDriver = a} :: StartJobRun)
+
+-- | The job template ID to be used to start the job run.
+startJobRun_jobTemplateId :: Lens.Lens' StartJobRun (Prelude.Maybe Prelude.Text)
+startJobRun_jobTemplateId = Lens.lens (\StartJobRun' {jobTemplateId} -> jobTemplateId) (\s@StartJobRun' {} a -> s {jobTemplateId = a} :: StartJobRun)
+
+-- | The values of job template parameters to start a job run.
+startJobRun_jobTemplateParameters :: Lens.Lens' StartJobRun (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+startJobRun_jobTemplateParameters = Lens.lens (\StartJobRun' {jobTemplateParameters} -> jobTemplateParameters) (\s@StartJobRun' {} a -> s {jobTemplateParameters = a} :: StartJobRun) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the job run.
+startJobRun_name :: Lens.Lens' StartJobRun (Prelude.Maybe Prelude.Text)
+startJobRun_name = Lens.lens (\StartJobRun' {name} -> name) (\s@StartJobRun' {} a -> s {name = a} :: StartJobRun)
+
+-- | The Amazon EMR release version to use for the job run.
+startJobRun_releaseLabel :: Lens.Lens' StartJobRun (Prelude.Maybe Prelude.Text)
+startJobRun_releaseLabel = Lens.lens (\StartJobRun' {releaseLabel} -> releaseLabel) (\s@StartJobRun' {} a -> s {releaseLabel = a} :: StartJobRun)
+
+-- | The tags assigned to job runs.
+startJobRun_tags :: Lens.Lens' StartJobRun (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+startJobRun_tags = Lens.lens (\StartJobRun' {tags} -> tags) (\s@StartJobRun' {} a -> s {tags = a} :: StartJobRun) Prelude.. Lens.mapping Lens.coerced
+
+-- | The virtual cluster ID for which the job run request is submitted.
+startJobRun_virtualClusterId :: Lens.Lens' StartJobRun Prelude.Text
+startJobRun_virtualClusterId = Lens.lens (\StartJobRun' {virtualClusterId} -> virtualClusterId) (\s@StartJobRun' {} a -> s {virtualClusterId = a} :: StartJobRun)
+
+-- | The client idempotency token of the job run request.
+startJobRun_clientToken :: Lens.Lens' StartJobRun Prelude.Text
+startJobRun_clientToken = Lens.lens (\StartJobRun' {clientToken} -> clientToken) (\s@StartJobRun' {} a -> s {clientToken = a} :: StartJobRun)
+
+instance Core.AWSRequest StartJobRun where
+  type AWSResponse StartJobRun = StartJobRunResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartJobRunResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "id")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (x Data..?> "virtualClusterId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartJobRun where
+  hashWithSalt _salt StartJobRun' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationOverrides
+      `Prelude.hashWithSalt` executionRoleArn
+      `Prelude.hashWithSalt` jobDriver
+      `Prelude.hashWithSalt` jobTemplateId
+      `Prelude.hashWithSalt` jobTemplateParameters
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` releaseLabel
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` virtualClusterId
+      `Prelude.hashWithSalt` clientToken
+
+instance Prelude.NFData StartJobRun where
+  rnf StartJobRun' {..} =
+    Prelude.rnf configurationOverrides
+      `Prelude.seq` Prelude.rnf executionRoleArn
+      `Prelude.seq` Prelude.rnf jobDriver
+      `Prelude.seq` Prelude.rnf jobTemplateId
+      `Prelude.seq` Prelude.rnf jobTemplateParameters
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf releaseLabel
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf virtualClusterId
+      `Prelude.seq` Prelude.rnf clientToken
+
+instance Data.ToHeaders StartJobRun where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartJobRun where
+  toJSON StartJobRun' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("configurationOverrides" Data..=)
+              Prelude.<$> configurationOverrides,
+            ("executionRoleArn" Data..=)
+              Prelude.<$> executionRoleArn,
+            ("jobDriver" Data..=) Prelude.<$> jobDriver,
+            ("jobTemplateId" Data..=) Prelude.<$> jobTemplateId,
+            ("jobTemplateParameters" Data..=)
+              Prelude.<$> jobTemplateParameters,
+            ("name" Data..=) Prelude.<$> name,
+            ("releaseLabel" Data..=) Prelude.<$> releaseLabel,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("clientToken" Data..= clientToken)
+          ]
+      )
+
+instance Data.ToPath StartJobRun where
+  toPath StartJobRun' {..} =
+    Prelude.mconcat
+      [ "/virtualclusters/",
+        Data.toBS virtualClusterId,
+        "/jobruns"
+      ]
+
+instance Data.ToQuery StartJobRun where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartJobRunResponse' smart constructor.
+data StartJobRunResponse = StartJobRunResponse'
+  { -- | This output lists the ARN of job run.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | This output displays the started job run ID.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | This output displays the name of the started job run.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | This output displays the virtual cluster ID for which the job run was
+    -- submitted.
+    virtualClusterId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartJobRunResponse' 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', 'startJobRunResponse_arn' - This output lists the ARN of job run.
+--
+-- 'id', 'startJobRunResponse_id' - This output displays the started job run ID.
+--
+-- 'name', 'startJobRunResponse_name' - This output displays the name of the started job run.
+--
+-- 'virtualClusterId', 'startJobRunResponse_virtualClusterId' - This output displays the virtual cluster ID for which the job run was
+-- submitted.
+--
+-- 'httpStatus', 'startJobRunResponse_httpStatus' - The response's http status code.
+newStartJobRunResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartJobRunResponse
+newStartJobRunResponse pHttpStatus_ =
+  StartJobRunResponse'
+    { arn = Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      virtualClusterId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | This output lists the ARN of job run.
+startJobRunResponse_arn :: Lens.Lens' StartJobRunResponse (Prelude.Maybe Prelude.Text)
+startJobRunResponse_arn = Lens.lens (\StartJobRunResponse' {arn} -> arn) (\s@StartJobRunResponse' {} a -> s {arn = a} :: StartJobRunResponse)
+
+-- | This output displays the started job run ID.
+startJobRunResponse_id :: Lens.Lens' StartJobRunResponse (Prelude.Maybe Prelude.Text)
+startJobRunResponse_id = Lens.lens (\StartJobRunResponse' {id} -> id) (\s@StartJobRunResponse' {} a -> s {id = a} :: StartJobRunResponse)
+
+-- | This output displays the name of the started job run.
+startJobRunResponse_name :: Lens.Lens' StartJobRunResponse (Prelude.Maybe Prelude.Text)
+startJobRunResponse_name = Lens.lens (\StartJobRunResponse' {name} -> name) (\s@StartJobRunResponse' {} a -> s {name = a} :: StartJobRunResponse)
+
+-- | This output displays the virtual cluster ID for which the job run was
+-- submitted.
+startJobRunResponse_virtualClusterId :: Lens.Lens' StartJobRunResponse (Prelude.Maybe Prelude.Text)
+startJobRunResponse_virtualClusterId = Lens.lens (\StartJobRunResponse' {virtualClusterId} -> virtualClusterId) (\s@StartJobRunResponse' {} a -> s {virtualClusterId = a} :: StartJobRunResponse)
+
+-- | The response's http status code.
+startJobRunResponse_httpStatus :: Lens.Lens' StartJobRunResponse Prelude.Int
+startJobRunResponse_httpStatus = Lens.lens (\StartJobRunResponse' {httpStatus} -> httpStatus) (\s@StartJobRunResponse' {} a -> s {httpStatus = a} :: StartJobRunResponse)
+
+instance Prelude.NFData StartJobRunResponse where
+  rnf StartJobRunResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf virtualClusterId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/EMRContainers/TagResource.hs b/gen/Amazonka/EMRContainers/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/TagResource.hs
@@ -0,0 +1,172 @@
+{-# 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.EMRContainers.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)
+--
+-- Assigns tags to resources. A tag is a label that you assign to an AWS
+-- resource. Each tag consists of a key and an optional value, both of
+-- which you define. Tags enable you to categorize your AWS resources by
+-- attributes such as purpose, owner, or environment. When you have many
+-- resources of the same type, you can quickly identify a specific resource
+-- based on the tags you\'ve assigned to it. For example, you can define a
+-- set of tags for your Amazon EMR on EKS clusters to help you track each
+-- cluster\'s owner and stack level. We recommend that you devise a
+-- consistent set of tag keys for each resource type. You can then search
+-- and filter the resources based on the tags that you add.
+module Amazonka.EMRContainers.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+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 ARN of resources.
+    resourceArn :: Prelude.Text,
+    -- | The tags assigned to resources.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  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 ARN of resources.
+--
+-- 'tags', 'tagResource_tags' - The tags assigned to resources.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The ARN of resources.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags assigned to resources.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+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.postJSON (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 TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /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/EMRContainers/Types.hs b/gen/Amazonka/EMRContainers/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types.hs
@@ -0,0 +1,353 @@
+{-# 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.EMRContainers.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.EMRContainers.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ValidationException,
+
+    -- * ContainerProviderType
+    ContainerProviderType (..),
+
+    -- * EndpointState
+    EndpointState (..),
+
+    -- * FailureReason
+    FailureReason (..),
+
+    -- * JobRunState
+    JobRunState (..),
+
+    -- * PersistentAppUI
+    PersistentAppUI (..),
+
+    -- * TemplateParameterDataType
+    TemplateParameterDataType (..),
+
+    -- * VirtualClusterState
+    VirtualClusterState (..),
+
+    -- * Certificate
+    Certificate (..),
+    newCertificate,
+    certificate_certificateArn,
+    certificate_certificateData,
+
+    -- * CloudWatchMonitoringConfiguration
+    CloudWatchMonitoringConfiguration (..),
+    newCloudWatchMonitoringConfiguration,
+    cloudWatchMonitoringConfiguration_logStreamNamePrefix,
+    cloudWatchMonitoringConfiguration_logGroupName,
+
+    -- * Configuration
+    Configuration (..),
+    newConfiguration,
+    configuration_configurations,
+    configuration_properties,
+    configuration_classification,
+
+    -- * ConfigurationOverrides
+    ConfigurationOverrides (..),
+    newConfigurationOverrides,
+    configurationOverrides_applicationConfiguration,
+    configurationOverrides_monitoringConfiguration,
+
+    -- * ContainerInfo
+    ContainerInfo (..),
+    newContainerInfo,
+    containerInfo_eksInfo,
+
+    -- * ContainerProvider
+    ContainerProvider (..),
+    newContainerProvider,
+    containerProvider_info,
+    containerProvider_type,
+    containerProvider_id,
+
+    -- * EksInfo
+    EksInfo (..),
+    newEksInfo,
+    eksInfo_namespace,
+
+    -- * Endpoint
+    Endpoint (..),
+    newEndpoint,
+    endpoint_arn,
+    endpoint_certificateArn,
+    endpoint_certificateAuthority,
+    endpoint_configurationOverrides,
+    endpoint_createdAt,
+    endpoint_executionRoleArn,
+    endpoint_failureReason,
+    endpoint_id,
+    endpoint_name,
+    endpoint_releaseLabel,
+    endpoint_securityGroup,
+    endpoint_serverUrl,
+    endpoint_state,
+    endpoint_stateDetails,
+    endpoint_subnetIds,
+    endpoint_tags,
+    endpoint_type,
+    endpoint_virtualClusterId,
+
+    -- * JobDriver
+    JobDriver (..),
+    newJobDriver,
+    jobDriver_sparkSqlJobDriver,
+    jobDriver_sparkSubmitJobDriver,
+
+    -- * JobRun
+    JobRun (..),
+    newJobRun,
+    jobRun_arn,
+    jobRun_clientToken,
+    jobRun_configurationOverrides,
+    jobRun_createdAt,
+    jobRun_createdBy,
+    jobRun_executionRoleArn,
+    jobRun_failureReason,
+    jobRun_finishedAt,
+    jobRun_id,
+    jobRun_jobDriver,
+    jobRun_name,
+    jobRun_releaseLabel,
+    jobRun_state,
+    jobRun_stateDetails,
+    jobRun_tags,
+    jobRun_virtualClusterId,
+
+    -- * JobTemplate
+    JobTemplate (..),
+    newJobTemplate,
+    jobTemplate_arn,
+    jobTemplate_createdAt,
+    jobTemplate_createdBy,
+    jobTemplate_decryptionError,
+    jobTemplate_id,
+    jobTemplate_kmsKeyArn,
+    jobTemplate_name,
+    jobTemplate_tags,
+    jobTemplate_jobTemplateData,
+
+    -- * JobTemplateData
+    JobTemplateData (..),
+    newJobTemplateData,
+    jobTemplateData_configurationOverrides,
+    jobTemplateData_jobTags,
+    jobTemplateData_parameterConfiguration,
+    jobTemplateData_executionRoleArn,
+    jobTemplateData_releaseLabel,
+    jobTemplateData_jobDriver,
+
+    -- * MonitoringConfiguration
+    MonitoringConfiguration (..),
+    newMonitoringConfiguration,
+    monitoringConfiguration_cloudWatchMonitoringConfiguration,
+    monitoringConfiguration_persistentAppUI,
+    monitoringConfiguration_s3MonitoringConfiguration,
+
+    -- * ParametricCloudWatchMonitoringConfiguration
+    ParametricCloudWatchMonitoringConfiguration (..),
+    newParametricCloudWatchMonitoringConfiguration,
+    parametricCloudWatchMonitoringConfiguration_logGroupName,
+    parametricCloudWatchMonitoringConfiguration_logStreamNamePrefix,
+
+    -- * ParametricConfigurationOverrides
+    ParametricConfigurationOverrides (..),
+    newParametricConfigurationOverrides,
+    parametricConfigurationOverrides_applicationConfiguration,
+    parametricConfigurationOverrides_monitoringConfiguration,
+
+    -- * ParametricMonitoringConfiguration
+    ParametricMonitoringConfiguration (..),
+    newParametricMonitoringConfiguration,
+    parametricMonitoringConfiguration_cloudWatchMonitoringConfiguration,
+    parametricMonitoringConfiguration_persistentAppUI,
+    parametricMonitoringConfiguration_s3MonitoringConfiguration,
+
+    -- * ParametricS3MonitoringConfiguration
+    ParametricS3MonitoringConfiguration (..),
+    newParametricS3MonitoringConfiguration,
+    parametricS3MonitoringConfiguration_logUri,
+
+    -- * S3MonitoringConfiguration
+    S3MonitoringConfiguration (..),
+    newS3MonitoringConfiguration,
+    s3MonitoringConfiguration_logUri,
+
+    -- * SparkSqlJobDriver
+    SparkSqlJobDriver (..),
+    newSparkSqlJobDriver,
+    sparkSqlJobDriver_entryPoint,
+    sparkSqlJobDriver_sparkSqlParameters,
+
+    -- * SparkSubmitJobDriver
+    SparkSubmitJobDriver (..),
+    newSparkSubmitJobDriver,
+    sparkSubmitJobDriver_entryPointArguments,
+    sparkSubmitJobDriver_sparkSubmitParameters,
+    sparkSubmitJobDriver_entryPoint,
+
+    -- * TemplateParameterConfiguration
+    TemplateParameterConfiguration (..),
+    newTemplateParameterConfiguration,
+    templateParameterConfiguration_defaultValue,
+    templateParameterConfiguration_type,
+
+    -- * VirtualCluster
+    VirtualCluster (..),
+    newVirtualCluster,
+    virtualCluster_arn,
+    virtualCluster_containerProvider,
+    virtualCluster_createdAt,
+    virtualCluster_id,
+    virtualCluster_name,
+    virtualCluster_state,
+    virtualCluster_tags,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.EMRContainers.Types.Certificate
+import Amazonka.EMRContainers.Types.CloudWatchMonitoringConfiguration
+import Amazonka.EMRContainers.Types.Configuration
+import Amazonka.EMRContainers.Types.ConfigurationOverrides
+import Amazonka.EMRContainers.Types.ContainerInfo
+import Amazonka.EMRContainers.Types.ContainerProvider
+import Amazonka.EMRContainers.Types.ContainerProviderType
+import Amazonka.EMRContainers.Types.EksInfo
+import Amazonka.EMRContainers.Types.Endpoint
+import Amazonka.EMRContainers.Types.EndpointState
+import Amazonka.EMRContainers.Types.FailureReason
+import Amazonka.EMRContainers.Types.JobDriver
+import Amazonka.EMRContainers.Types.JobRun
+import Amazonka.EMRContainers.Types.JobRunState
+import Amazonka.EMRContainers.Types.JobTemplate
+import Amazonka.EMRContainers.Types.JobTemplateData
+import Amazonka.EMRContainers.Types.MonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricCloudWatchMonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricConfigurationOverrides
+import Amazonka.EMRContainers.Types.ParametricMonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricS3MonitoringConfiguration
+import Amazonka.EMRContainers.Types.PersistentAppUI
+import Amazonka.EMRContainers.Types.S3MonitoringConfiguration
+import Amazonka.EMRContainers.Types.SparkSqlJobDriver
+import Amazonka.EMRContainers.Types.SparkSubmitJobDriver
+import Amazonka.EMRContainers.Types.TemplateParameterConfiguration
+import Amazonka.EMRContainers.Types.TemplateParameterDataType
+import Amazonka.EMRContainers.Types.VirtualCluster
+import Amazonka.EMRContainers.Types.VirtualClusterState
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-10-01@ of the Amazon EMR Containers SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "EMRContainers",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "emr-containers",
+      Core.signingName = "emr-containers",
+      Core.version = "2020-10-01",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "EMRContainers",
+      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
+
+-- | This is an internal server exception.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The specified resource was not found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 400
+
+-- | There are invalid parameters in the client request.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/EMRContainers/Types/Certificate.hs b/gen/Amazonka/EMRContainers/Types/Certificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/Certificate.hs
@@ -0,0 +1,84 @@
+{-# 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.EMRContainers.Types.Certificate
+-- 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.EMRContainers.Types.Certificate 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
+
+-- | The entity representing certificate data generated for managed endpoint.
+--
+-- /See:/ 'newCertificate' smart constructor.
+data Certificate = Certificate'
+  { -- | The ARN of the certificate generated for managed endpoint.
+    certificateArn :: Prelude.Maybe Prelude.Text,
+    -- | The base64 encoded PEM certificate data generated for managed endpoint.
+    certificateData :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Certificate' 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', 'certificate_certificateArn' - The ARN of the certificate generated for managed endpoint.
+--
+-- 'certificateData', 'certificate_certificateData' - The base64 encoded PEM certificate data generated for managed endpoint.
+newCertificate ::
+  Certificate
+newCertificate =
+  Certificate'
+    { certificateArn = Prelude.Nothing,
+      certificateData = Prelude.Nothing
+    }
+
+-- | The ARN of the certificate generated for managed endpoint.
+certificate_certificateArn :: Lens.Lens' Certificate (Prelude.Maybe Prelude.Text)
+certificate_certificateArn = Lens.lens (\Certificate' {certificateArn} -> certificateArn) (\s@Certificate' {} a -> s {certificateArn = a} :: Certificate)
+
+-- | The base64 encoded PEM certificate data generated for managed endpoint.
+certificate_certificateData :: Lens.Lens' Certificate (Prelude.Maybe Prelude.Text)
+certificate_certificateData = Lens.lens (\Certificate' {certificateData} -> certificateData) (\s@Certificate' {} a -> s {certificateData = a} :: Certificate)
+
+instance Data.FromJSON Certificate where
+  parseJSON =
+    Data.withObject
+      "Certificate"
+      ( \x ->
+          Certificate'
+            Prelude.<$> (x Data..:? "certificateArn")
+            Prelude.<*> (x Data..:? "certificateData")
+      )
+
+instance Prelude.Hashable Certificate where
+  hashWithSalt _salt Certificate' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificateArn
+      `Prelude.hashWithSalt` certificateData
+
+instance Prelude.NFData Certificate where
+  rnf Certificate' {..} =
+    Prelude.rnf certificateArn
+      `Prelude.seq` Prelude.rnf certificateData
diff --git a/gen/Amazonka/EMRContainers/Types/CloudWatchMonitoringConfiguration.hs b/gen/Amazonka/EMRContainers/Types/CloudWatchMonitoringConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/CloudWatchMonitoringConfiguration.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.EMRContainers.Types.CloudWatchMonitoringConfiguration
+-- 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.EMRContainers.Types.CloudWatchMonitoringConfiguration 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
+
+-- | A configuration for CloudWatch monitoring. You can configure your jobs
+-- to send log information to CloudWatch Logs.
+--
+-- /See:/ 'newCloudWatchMonitoringConfiguration' smart constructor.
+data CloudWatchMonitoringConfiguration = CloudWatchMonitoringConfiguration'
+  { -- | The specified name prefix for log streams.
+    logStreamNamePrefix :: Prelude.Maybe Prelude.Text,
+    -- | The name of the log group for log publishing.
+    logGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CloudWatchMonitoringConfiguration' 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:
+--
+-- 'logStreamNamePrefix', 'cloudWatchMonitoringConfiguration_logStreamNamePrefix' - The specified name prefix for log streams.
+--
+-- 'logGroupName', 'cloudWatchMonitoringConfiguration_logGroupName' - The name of the log group for log publishing.
+newCloudWatchMonitoringConfiguration ::
+  -- | 'logGroupName'
+  Prelude.Text ->
+  CloudWatchMonitoringConfiguration
+newCloudWatchMonitoringConfiguration pLogGroupName_ =
+  CloudWatchMonitoringConfiguration'
+    { logStreamNamePrefix =
+        Prelude.Nothing,
+      logGroupName = pLogGroupName_
+    }
+
+-- | The specified name prefix for log streams.
+cloudWatchMonitoringConfiguration_logStreamNamePrefix :: Lens.Lens' CloudWatchMonitoringConfiguration (Prelude.Maybe Prelude.Text)
+cloudWatchMonitoringConfiguration_logStreamNamePrefix = Lens.lens (\CloudWatchMonitoringConfiguration' {logStreamNamePrefix} -> logStreamNamePrefix) (\s@CloudWatchMonitoringConfiguration' {} a -> s {logStreamNamePrefix = a} :: CloudWatchMonitoringConfiguration)
+
+-- | The name of the log group for log publishing.
+cloudWatchMonitoringConfiguration_logGroupName :: Lens.Lens' CloudWatchMonitoringConfiguration Prelude.Text
+cloudWatchMonitoringConfiguration_logGroupName = Lens.lens (\CloudWatchMonitoringConfiguration' {logGroupName} -> logGroupName) (\s@CloudWatchMonitoringConfiguration' {} a -> s {logGroupName = a} :: CloudWatchMonitoringConfiguration)
+
+instance
+  Data.FromJSON
+    CloudWatchMonitoringConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "CloudWatchMonitoringConfiguration"
+      ( \x ->
+          CloudWatchMonitoringConfiguration'
+            Prelude.<$> (x Data..:? "logStreamNamePrefix")
+            Prelude.<*> (x Data..: "logGroupName")
+      )
+
+instance
+  Prelude.Hashable
+    CloudWatchMonitoringConfiguration
+  where
+  hashWithSalt
+    _salt
+    CloudWatchMonitoringConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` logStreamNamePrefix
+        `Prelude.hashWithSalt` logGroupName
+
+instance
+  Prelude.NFData
+    CloudWatchMonitoringConfiguration
+  where
+  rnf CloudWatchMonitoringConfiguration' {..} =
+    Prelude.rnf logStreamNamePrefix
+      `Prelude.seq` Prelude.rnf logGroupName
+
+instance
+  Data.ToJSON
+    CloudWatchMonitoringConfiguration
+  where
+  toJSON CloudWatchMonitoringConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("logStreamNamePrefix" Data..=)
+              Prelude.<$> logStreamNamePrefix,
+            Prelude.Just ("logGroupName" Data..= logGroupName)
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/Configuration.hs b/gen/Amazonka/EMRContainers/Types/Configuration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/Configuration.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.EMRContainers.Types.Configuration
+-- 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.EMRContainers.Types.Configuration 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
+
+-- | A configuration specification to be used when provisioning virtual
+-- clusters, which can include configurations for applications and software
+-- bundled with Amazon EMR on EKS. A configuration consists of a
+-- classification, properties, and optional nested configurations. A
+-- classification refers to an application-specific configuration file.
+-- Properties are the settings you want to change in that file.
+--
+-- /See:/ 'newConfiguration' smart constructor.
+data Configuration = Configuration'
+  { -- | A list of additional configurations to apply within a configuration
+    -- object.
+    configurations :: Prelude.Maybe [Configuration],
+    -- | A set of properties specified within a configuration classification.
+    properties :: Prelude.Maybe (Data.Sensitive (Prelude.HashMap Prelude.Text Prelude.Text)),
+    -- | The classification within a configuration.
+    classification :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Configuration' 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:
+--
+-- 'configurations', 'configuration_configurations' - A list of additional configurations to apply within a configuration
+-- object.
+--
+-- 'properties', 'configuration_properties' - A set of properties specified within a configuration classification.
+--
+-- 'classification', 'configuration_classification' - The classification within a configuration.
+newConfiguration ::
+  -- | 'classification'
+  Prelude.Text ->
+  Configuration
+newConfiguration pClassification_ =
+  Configuration'
+    { configurations = Prelude.Nothing,
+      properties = Prelude.Nothing,
+      classification = pClassification_
+    }
+
+-- | A list of additional configurations to apply within a configuration
+-- object.
+configuration_configurations :: Lens.Lens' Configuration (Prelude.Maybe [Configuration])
+configuration_configurations = Lens.lens (\Configuration' {configurations} -> configurations) (\s@Configuration' {} a -> s {configurations = a} :: Configuration) Prelude.. Lens.mapping Lens.coerced
+
+-- | A set of properties specified within a configuration classification.
+configuration_properties :: Lens.Lens' Configuration (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+configuration_properties = Lens.lens (\Configuration' {properties} -> properties) (\s@Configuration' {} a -> s {properties = a} :: Configuration) Prelude.. Lens.mapping (Data._Sensitive Prelude.. Lens.coerced)
+
+-- | The classification within a configuration.
+configuration_classification :: Lens.Lens' Configuration Prelude.Text
+configuration_classification = Lens.lens (\Configuration' {classification} -> classification) (\s@Configuration' {} a -> s {classification = a} :: Configuration)
+
+instance Data.FromJSON Configuration where
+  parseJSON =
+    Data.withObject
+      "Configuration"
+      ( \x ->
+          Configuration'
+            Prelude.<$> (x Data..:? "configurations" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "properties" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "classification")
+      )
+
+instance Prelude.Hashable Configuration where
+  hashWithSalt _salt Configuration' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurations
+      `Prelude.hashWithSalt` properties
+      `Prelude.hashWithSalt` classification
+
+instance Prelude.NFData Configuration where
+  rnf Configuration' {..} =
+    Prelude.rnf configurations
+      `Prelude.seq` Prelude.rnf properties
+      `Prelude.seq` Prelude.rnf classification
+
+instance Data.ToJSON Configuration where
+  toJSON Configuration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("configurations" Data..=)
+              Prelude.<$> configurations,
+            ("properties" Data..=) Prelude.<$> properties,
+            Prelude.Just
+              ("classification" Data..= classification)
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ConfigurationOverrides.hs b/gen/Amazonka/EMRContainers/Types/ConfigurationOverrides.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ConfigurationOverrides.hs
@@ -0,0 +1,102 @@
+{-# 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.EMRContainers.Types.ConfigurationOverrides
+-- 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.EMRContainers.Types.ConfigurationOverrides where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.Configuration
+import Amazonka.EMRContainers.Types.MonitoringConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | A configuration specification to be used to override existing
+-- configurations.
+--
+-- /See:/ 'newConfigurationOverrides' smart constructor.
+data ConfigurationOverrides = ConfigurationOverrides'
+  { -- | The configurations for the application running by the job run.
+    applicationConfiguration :: Prelude.Maybe [Configuration],
+    -- | The configurations for monitoring.
+    monitoringConfiguration :: Prelude.Maybe MonitoringConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationOverrides' 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:
+--
+-- 'applicationConfiguration', 'configurationOverrides_applicationConfiguration' - The configurations for the application running by the job run.
+--
+-- 'monitoringConfiguration', 'configurationOverrides_monitoringConfiguration' - The configurations for monitoring.
+newConfigurationOverrides ::
+  ConfigurationOverrides
+newConfigurationOverrides =
+  ConfigurationOverrides'
+    { applicationConfiguration =
+        Prelude.Nothing,
+      monitoringConfiguration = Prelude.Nothing
+    }
+
+-- | The configurations for the application running by the job run.
+configurationOverrides_applicationConfiguration :: Lens.Lens' ConfigurationOverrides (Prelude.Maybe [Configuration])
+configurationOverrides_applicationConfiguration = Lens.lens (\ConfigurationOverrides' {applicationConfiguration} -> applicationConfiguration) (\s@ConfigurationOverrides' {} a -> s {applicationConfiguration = a} :: ConfigurationOverrides) Prelude.. Lens.mapping Lens.coerced
+
+-- | The configurations for monitoring.
+configurationOverrides_monitoringConfiguration :: Lens.Lens' ConfigurationOverrides (Prelude.Maybe MonitoringConfiguration)
+configurationOverrides_monitoringConfiguration = Lens.lens (\ConfigurationOverrides' {monitoringConfiguration} -> monitoringConfiguration) (\s@ConfigurationOverrides' {} a -> s {monitoringConfiguration = a} :: ConfigurationOverrides)
+
+instance Data.FromJSON ConfigurationOverrides where
+  parseJSON =
+    Data.withObject
+      "ConfigurationOverrides"
+      ( \x ->
+          ConfigurationOverrides'
+            Prelude.<$> ( x
+                            Data..:? "applicationConfiguration"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "monitoringConfiguration")
+      )
+
+instance Prelude.Hashable ConfigurationOverrides where
+  hashWithSalt _salt ConfigurationOverrides' {..} =
+    _salt
+      `Prelude.hashWithSalt` applicationConfiguration
+      `Prelude.hashWithSalt` monitoringConfiguration
+
+instance Prelude.NFData ConfigurationOverrides where
+  rnf ConfigurationOverrides' {..} =
+    Prelude.rnf applicationConfiguration
+      `Prelude.seq` Prelude.rnf monitoringConfiguration
+
+instance Data.ToJSON ConfigurationOverrides where
+  toJSON ConfigurationOverrides' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("applicationConfiguration" Data..=)
+              Prelude.<$> applicationConfiguration,
+            ("monitoringConfiguration" Data..=)
+              Prelude.<$> monitoringConfiguration
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ContainerInfo.hs b/gen/Amazonka/EMRContainers/Types/ContainerInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ContainerInfo.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.EMRContainers.Types.ContainerInfo
+-- 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.EMRContainers.Types.ContainerInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.EksInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information about the container used for a job run or a managed
+-- endpoint.
+--
+-- /See:/ 'newContainerInfo' smart constructor.
+data ContainerInfo = ContainerInfo'
+  { -- | The information about the EKS cluster.
+    eksInfo :: Prelude.Maybe EksInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContainerInfo' 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:
+--
+-- 'eksInfo', 'containerInfo_eksInfo' - The information about the EKS cluster.
+newContainerInfo ::
+  ContainerInfo
+newContainerInfo =
+  ContainerInfo' {eksInfo = Prelude.Nothing}
+
+-- | The information about the EKS cluster.
+containerInfo_eksInfo :: Lens.Lens' ContainerInfo (Prelude.Maybe EksInfo)
+containerInfo_eksInfo = Lens.lens (\ContainerInfo' {eksInfo} -> eksInfo) (\s@ContainerInfo' {} a -> s {eksInfo = a} :: ContainerInfo)
+
+instance Data.FromJSON ContainerInfo where
+  parseJSON =
+    Data.withObject
+      "ContainerInfo"
+      ( \x ->
+          ContainerInfo' Prelude.<$> (x Data..:? "eksInfo")
+      )
+
+instance Prelude.Hashable ContainerInfo where
+  hashWithSalt _salt ContainerInfo' {..} =
+    _salt `Prelude.hashWithSalt` eksInfo
+
+instance Prelude.NFData ContainerInfo where
+  rnf ContainerInfo' {..} = Prelude.rnf eksInfo
+
+instance Data.ToJSON ContainerInfo where
+  toJSON ContainerInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("eksInfo" Data..=) Prelude.<$> eksInfo]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ContainerProvider.hs b/gen/Amazonka/EMRContainers/Types/ContainerProvider.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ContainerProvider.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.EMRContainers.Types.ContainerProvider
+-- 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.EMRContainers.Types.ContainerProvider where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.ContainerInfo
+import Amazonka.EMRContainers.Types.ContainerProviderType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information about the container provider.
+--
+-- /See:/ 'newContainerProvider' smart constructor.
+data ContainerProvider = ContainerProvider'
+  { -- | The information about the container cluster.
+    info :: Prelude.Maybe ContainerInfo,
+    -- | The type of the container provider. EKS is the only supported type as of
+    -- now.
+    type' :: ContainerProviderType,
+    -- | The ID of the container cluster.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContainerProvider' 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:
+--
+-- 'info', 'containerProvider_info' - The information about the container cluster.
+--
+-- 'type'', 'containerProvider_type' - The type of the container provider. EKS is the only supported type as of
+-- now.
+--
+-- 'id', 'containerProvider_id' - The ID of the container cluster.
+newContainerProvider ::
+  -- | 'type''
+  ContainerProviderType ->
+  -- | 'id'
+  Prelude.Text ->
+  ContainerProvider
+newContainerProvider pType_ pId_ =
+  ContainerProvider'
+    { info = Prelude.Nothing,
+      type' = pType_,
+      id = pId_
+    }
+
+-- | The information about the container cluster.
+containerProvider_info :: Lens.Lens' ContainerProvider (Prelude.Maybe ContainerInfo)
+containerProvider_info = Lens.lens (\ContainerProvider' {info} -> info) (\s@ContainerProvider' {} a -> s {info = a} :: ContainerProvider)
+
+-- | The type of the container provider. EKS is the only supported type as of
+-- now.
+containerProvider_type :: Lens.Lens' ContainerProvider ContainerProviderType
+containerProvider_type = Lens.lens (\ContainerProvider' {type'} -> type') (\s@ContainerProvider' {} a -> s {type' = a} :: ContainerProvider)
+
+-- | The ID of the container cluster.
+containerProvider_id :: Lens.Lens' ContainerProvider Prelude.Text
+containerProvider_id = Lens.lens (\ContainerProvider' {id} -> id) (\s@ContainerProvider' {} a -> s {id = a} :: ContainerProvider)
+
+instance Data.FromJSON ContainerProvider where
+  parseJSON =
+    Data.withObject
+      "ContainerProvider"
+      ( \x ->
+          ContainerProvider'
+            Prelude.<$> (x Data..:? "info")
+            Prelude.<*> (x Data..: "type")
+            Prelude.<*> (x Data..: "id")
+      )
+
+instance Prelude.Hashable ContainerProvider where
+  hashWithSalt _salt ContainerProvider' {..} =
+    _salt
+      `Prelude.hashWithSalt` info
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` id
+
+instance Prelude.NFData ContainerProvider where
+  rnf ContainerProvider' {..} =
+    Prelude.rnf info
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf id
+
+instance Data.ToJSON ContainerProvider where
+  toJSON ContainerProvider' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("info" Data..=) Prelude.<$> info,
+            Prelude.Just ("type" Data..= type'),
+            Prelude.Just ("id" Data..= id)
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ContainerProviderType.hs b/gen/Amazonka/EMRContainers/Types/ContainerProviderType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ContainerProviderType.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.EMRContainers.Types.ContainerProviderType
+-- 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.EMRContainers.Types.ContainerProviderType
+  ( ContainerProviderType
+      ( ..,
+        ContainerProviderType_EKS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ContainerProviderType = ContainerProviderType'
+  { fromContainerProviderType ::
+      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 ContainerProviderType_EKS :: ContainerProviderType
+pattern ContainerProviderType_EKS = ContainerProviderType' "EKS"
+
+{-# COMPLETE
+  ContainerProviderType_EKS,
+  ContainerProviderType'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/Types/EksInfo.hs b/gen/Amazonka/EMRContainers/Types/EksInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/EksInfo.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.EMRContainers.Types.EksInfo
+-- 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.EMRContainers.Types.EksInfo 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
+
+-- | The information about the EKS cluster.
+--
+-- /See:/ 'newEksInfo' smart constructor.
+data EksInfo = EksInfo'
+  { -- | The namespaces of the EKS cluster.
+    namespace :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EksInfo' 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:
+--
+-- 'namespace', 'eksInfo_namespace' - The namespaces of the EKS cluster.
+newEksInfo ::
+  EksInfo
+newEksInfo = EksInfo' {namespace = Prelude.Nothing}
+
+-- | The namespaces of the EKS cluster.
+eksInfo_namespace :: Lens.Lens' EksInfo (Prelude.Maybe Prelude.Text)
+eksInfo_namespace = Lens.lens (\EksInfo' {namespace} -> namespace) (\s@EksInfo' {} a -> s {namespace = a} :: EksInfo)
+
+instance Data.FromJSON EksInfo where
+  parseJSON =
+    Data.withObject
+      "EksInfo"
+      ( \x ->
+          EksInfo' Prelude.<$> (x Data..:? "namespace")
+      )
+
+instance Prelude.Hashable EksInfo where
+  hashWithSalt _salt EksInfo' {..} =
+    _salt `Prelude.hashWithSalt` namespace
+
+instance Prelude.NFData EksInfo where
+  rnf EksInfo' {..} = Prelude.rnf namespace
+
+instance Data.ToJSON EksInfo where
+  toJSON EksInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("namespace" Data..=) Prelude.<$> namespace]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/Endpoint.hs b/gen/Amazonka/EMRContainers/Types/Endpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/Endpoint.hs
@@ -0,0 +1,290 @@
+{-# 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.EMRContainers.Types.Endpoint
+-- 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.EMRContainers.Types.Endpoint where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.Certificate
+import Amazonka.EMRContainers.Types.ConfigurationOverrides
+import Amazonka.EMRContainers.Types.EndpointState
+import Amazonka.EMRContainers.Types.FailureReason
+import qualified Amazonka.Prelude as Prelude
+
+-- | This entity represents the endpoint that is managed by Amazon EMR on
+-- EKS.
+--
+-- /See:/ 'newEndpoint' smart constructor.
+data Endpoint = Endpoint'
+  { -- | The ARN of the endpoint.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The certificate ARN of the endpoint. This field is under deprecation and
+    -- will be removed in future.
+    certificateArn :: Prelude.Maybe Prelude.Text,
+    -- | The certificate generated by emr control plane on customer behalf to
+    -- secure the managed endpoint.
+    certificateAuthority :: Prelude.Maybe Certificate,
+    -- | The configuration settings that are used to override existing
+    -- configurations for endpoints.
+    configurationOverrides :: Prelude.Maybe ConfigurationOverrides,
+    -- | The date and time when the endpoint was created.
+    createdAt :: Prelude.Maybe Data.ISO8601,
+    -- | The execution role ARN of the endpoint.
+    executionRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The reasons why the endpoint has failed.
+    failureReason :: Prelude.Maybe FailureReason,
+    -- | The ID of the endpoint.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name of the endpoint.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The EMR release version to be used for the endpoint.
+    releaseLabel :: Prelude.Maybe Prelude.Text,
+    -- | The security group configuration of the endpoint.
+    securityGroup :: Prelude.Maybe Prelude.Text,
+    -- | The server URL of the endpoint.
+    serverUrl :: Prelude.Maybe Prelude.Text,
+    -- | The state of the endpoint.
+    state :: Prelude.Maybe EndpointState,
+    -- | Additional details of the endpoint state.
+    stateDetails :: Prelude.Maybe Prelude.Text,
+    -- | The subnet IDs of the endpoint.
+    subnetIds :: Prelude.Maybe [Prelude.Text],
+    -- | The tags of the endpoint.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The type of the endpoint.
+    type' :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the endpoint\'s virtual cluster.
+    virtualClusterId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Endpoint' 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', 'endpoint_arn' - The ARN of the endpoint.
+--
+-- 'certificateArn', 'endpoint_certificateArn' - The certificate ARN of the endpoint. This field is under deprecation and
+-- will be removed in future.
+--
+-- 'certificateAuthority', 'endpoint_certificateAuthority' - The certificate generated by emr control plane on customer behalf to
+-- secure the managed endpoint.
+--
+-- 'configurationOverrides', 'endpoint_configurationOverrides' - The configuration settings that are used to override existing
+-- configurations for endpoints.
+--
+-- 'createdAt', 'endpoint_createdAt' - The date and time when the endpoint was created.
+--
+-- 'executionRoleArn', 'endpoint_executionRoleArn' - The execution role ARN of the endpoint.
+--
+-- 'failureReason', 'endpoint_failureReason' - The reasons why the endpoint has failed.
+--
+-- 'id', 'endpoint_id' - The ID of the endpoint.
+--
+-- 'name', 'endpoint_name' - The name of the endpoint.
+--
+-- 'releaseLabel', 'endpoint_releaseLabel' - The EMR release version to be used for the endpoint.
+--
+-- 'securityGroup', 'endpoint_securityGroup' - The security group configuration of the endpoint.
+--
+-- 'serverUrl', 'endpoint_serverUrl' - The server URL of the endpoint.
+--
+-- 'state', 'endpoint_state' - The state of the endpoint.
+--
+-- 'stateDetails', 'endpoint_stateDetails' - Additional details of the endpoint state.
+--
+-- 'subnetIds', 'endpoint_subnetIds' - The subnet IDs of the endpoint.
+--
+-- 'tags', 'endpoint_tags' - The tags of the endpoint.
+--
+-- 'type'', 'endpoint_type' - The type of the endpoint.
+--
+-- 'virtualClusterId', 'endpoint_virtualClusterId' - The ID of the endpoint\'s virtual cluster.
+newEndpoint ::
+  Endpoint
+newEndpoint =
+  Endpoint'
+    { arn = Prelude.Nothing,
+      certificateArn = Prelude.Nothing,
+      certificateAuthority = Prelude.Nothing,
+      configurationOverrides = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      executionRoleArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      releaseLabel = Prelude.Nothing,
+      securityGroup = Prelude.Nothing,
+      serverUrl = Prelude.Nothing,
+      state = Prelude.Nothing,
+      stateDetails = Prelude.Nothing,
+      subnetIds = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      virtualClusterId = Prelude.Nothing
+    }
+
+-- | The ARN of the endpoint.
+endpoint_arn :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_arn = Lens.lens (\Endpoint' {arn} -> arn) (\s@Endpoint' {} a -> s {arn = a} :: Endpoint)
+
+-- | The certificate ARN of the endpoint. This field is under deprecation and
+-- will be removed in future.
+endpoint_certificateArn :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_certificateArn = Lens.lens (\Endpoint' {certificateArn} -> certificateArn) (\s@Endpoint' {} a -> s {certificateArn = a} :: Endpoint)
+
+-- | The certificate generated by emr control plane on customer behalf to
+-- secure the managed endpoint.
+endpoint_certificateAuthority :: Lens.Lens' Endpoint (Prelude.Maybe Certificate)
+endpoint_certificateAuthority = Lens.lens (\Endpoint' {certificateAuthority} -> certificateAuthority) (\s@Endpoint' {} a -> s {certificateAuthority = a} :: Endpoint)
+
+-- | The configuration settings that are used to override existing
+-- configurations for endpoints.
+endpoint_configurationOverrides :: Lens.Lens' Endpoint (Prelude.Maybe ConfigurationOverrides)
+endpoint_configurationOverrides = Lens.lens (\Endpoint' {configurationOverrides} -> configurationOverrides) (\s@Endpoint' {} a -> s {configurationOverrides = a} :: Endpoint)
+
+-- | The date and time when the endpoint was created.
+endpoint_createdAt :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.UTCTime)
+endpoint_createdAt = Lens.lens (\Endpoint' {createdAt} -> createdAt) (\s@Endpoint' {} a -> s {createdAt = a} :: Endpoint) Prelude.. Lens.mapping Data._Time
+
+-- | The execution role ARN of the endpoint.
+endpoint_executionRoleArn :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_executionRoleArn = Lens.lens (\Endpoint' {executionRoleArn} -> executionRoleArn) (\s@Endpoint' {} a -> s {executionRoleArn = a} :: Endpoint)
+
+-- | The reasons why the endpoint has failed.
+endpoint_failureReason :: Lens.Lens' Endpoint (Prelude.Maybe FailureReason)
+endpoint_failureReason = Lens.lens (\Endpoint' {failureReason} -> failureReason) (\s@Endpoint' {} a -> s {failureReason = a} :: Endpoint)
+
+-- | The ID of the endpoint.
+endpoint_id :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_id = Lens.lens (\Endpoint' {id} -> id) (\s@Endpoint' {} a -> s {id = a} :: Endpoint)
+
+-- | The name of the endpoint.
+endpoint_name :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_name = Lens.lens (\Endpoint' {name} -> name) (\s@Endpoint' {} a -> s {name = a} :: Endpoint)
+
+-- | The EMR release version to be used for the endpoint.
+endpoint_releaseLabel :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_releaseLabel = Lens.lens (\Endpoint' {releaseLabel} -> releaseLabel) (\s@Endpoint' {} a -> s {releaseLabel = a} :: Endpoint)
+
+-- | The security group configuration of the endpoint.
+endpoint_securityGroup :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_securityGroup = Lens.lens (\Endpoint' {securityGroup} -> securityGroup) (\s@Endpoint' {} a -> s {securityGroup = a} :: Endpoint)
+
+-- | The server URL of the endpoint.
+endpoint_serverUrl :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_serverUrl = Lens.lens (\Endpoint' {serverUrl} -> serverUrl) (\s@Endpoint' {} a -> s {serverUrl = a} :: Endpoint)
+
+-- | The state of the endpoint.
+endpoint_state :: Lens.Lens' Endpoint (Prelude.Maybe EndpointState)
+endpoint_state = Lens.lens (\Endpoint' {state} -> state) (\s@Endpoint' {} a -> s {state = a} :: Endpoint)
+
+-- | Additional details of the endpoint state.
+endpoint_stateDetails :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_stateDetails = Lens.lens (\Endpoint' {stateDetails} -> stateDetails) (\s@Endpoint' {} a -> s {stateDetails = a} :: Endpoint)
+
+-- | The subnet IDs of the endpoint.
+endpoint_subnetIds :: Lens.Lens' Endpoint (Prelude.Maybe [Prelude.Text])
+endpoint_subnetIds = Lens.lens (\Endpoint' {subnetIds} -> subnetIds) (\s@Endpoint' {} a -> s {subnetIds = a} :: Endpoint) Prelude.. Lens.mapping Lens.coerced
+
+-- | The tags of the endpoint.
+endpoint_tags :: Lens.Lens' Endpoint (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+endpoint_tags = Lens.lens (\Endpoint' {tags} -> tags) (\s@Endpoint' {} a -> s {tags = a} :: Endpoint) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of the endpoint.
+endpoint_type :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_type = Lens.lens (\Endpoint' {type'} -> type') (\s@Endpoint' {} a -> s {type' = a} :: Endpoint)
+
+-- | The ID of the endpoint\'s virtual cluster.
+endpoint_virtualClusterId :: Lens.Lens' Endpoint (Prelude.Maybe Prelude.Text)
+endpoint_virtualClusterId = Lens.lens (\Endpoint' {virtualClusterId} -> virtualClusterId) (\s@Endpoint' {} a -> s {virtualClusterId = a} :: Endpoint)
+
+instance Data.FromJSON Endpoint where
+  parseJSON =
+    Data.withObject
+      "Endpoint"
+      ( \x ->
+          Endpoint'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "certificateArn")
+            Prelude.<*> (x Data..:? "certificateAuthority")
+            Prelude.<*> (x Data..:? "configurationOverrides")
+            Prelude.<*> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "executionRoleArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "releaseLabel")
+            Prelude.<*> (x Data..:? "securityGroup")
+            Prelude.<*> (x Data..:? "serverUrl")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "stateDetails")
+            Prelude.<*> (x Data..:? "subnetIds" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "type")
+            Prelude.<*> (x Data..:? "virtualClusterId")
+      )
+
+instance Prelude.Hashable Endpoint where
+  hashWithSalt _salt Endpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` certificateArn
+      `Prelude.hashWithSalt` certificateAuthority
+      `Prelude.hashWithSalt` configurationOverrides
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` executionRoleArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` releaseLabel
+      `Prelude.hashWithSalt` securityGroup
+      `Prelude.hashWithSalt` serverUrl
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` stateDetails
+      `Prelude.hashWithSalt` subnetIds
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData Endpoint where
+  rnf Endpoint' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf certificateArn
+      `Prelude.seq` Prelude.rnf certificateAuthority
+      `Prelude.seq` Prelude.rnf configurationOverrides
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf executionRoleArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf releaseLabel
+      `Prelude.seq` Prelude.rnf securityGroup
+      `Prelude.seq` Prelude.rnf serverUrl
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf stateDetails
+      `Prelude.seq` Prelude.rnf subnetIds
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf virtualClusterId
diff --git a/gen/Amazonka/EMRContainers/Types/EndpointState.hs b/gen/Amazonka/EMRContainers/Types/EndpointState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/EndpointState.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.EMRContainers.Types.EndpointState
+-- 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.EMRContainers.Types.EndpointState
+  ( EndpointState
+      ( ..,
+        EndpointState_ACTIVE,
+        EndpointState_CREATING,
+        EndpointState_TERMINATED,
+        EndpointState_TERMINATED_WITH_ERRORS,
+        EndpointState_TERMINATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EndpointState = EndpointState'
+  { fromEndpointState ::
+      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 EndpointState_ACTIVE :: EndpointState
+pattern EndpointState_ACTIVE = EndpointState' "ACTIVE"
+
+pattern EndpointState_CREATING :: EndpointState
+pattern EndpointState_CREATING = EndpointState' "CREATING"
+
+pattern EndpointState_TERMINATED :: EndpointState
+pattern EndpointState_TERMINATED = EndpointState' "TERMINATED"
+
+pattern EndpointState_TERMINATED_WITH_ERRORS :: EndpointState
+pattern EndpointState_TERMINATED_WITH_ERRORS = EndpointState' "TERMINATED_WITH_ERRORS"
+
+pattern EndpointState_TERMINATING :: EndpointState
+pattern EndpointState_TERMINATING = EndpointState' "TERMINATING"
+
+{-# COMPLETE
+  EndpointState_ACTIVE,
+  EndpointState_CREATING,
+  EndpointState_TERMINATED,
+  EndpointState_TERMINATED_WITH_ERRORS,
+  EndpointState_TERMINATING,
+  EndpointState'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/Types/FailureReason.hs b/gen/Amazonka/EMRContainers/Types/FailureReason.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/FailureReason.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.EMRContainers.Types.FailureReason
+-- 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.EMRContainers.Types.FailureReason
+  ( FailureReason
+      ( ..,
+        FailureReason_CLUSTER_UNAVAILABLE,
+        FailureReason_INTERNAL_ERROR,
+        FailureReason_USER_ERROR,
+        FailureReason_VALIDATION_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FailureReason = FailureReason'
+  { fromFailureReason ::
+      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 FailureReason_CLUSTER_UNAVAILABLE :: FailureReason
+pattern FailureReason_CLUSTER_UNAVAILABLE = FailureReason' "CLUSTER_UNAVAILABLE"
+
+pattern FailureReason_INTERNAL_ERROR :: FailureReason
+pattern FailureReason_INTERNAL_ERROR = FailureReason' "INTERNAL_ERROR"
+
+pattern FailureReason_USER_ERROR :: FailureReason
+pattern FailureReason_USER_ERROR = FailureReason' "USER_ERROR"
+
+pattern FailureReason_VALIDATION_ERROR :: FailureReason
+pattern FailureReason_VALIDATION_ERROR = FailureReason' "VALIDATION_ERROR"
+
+{-# COMPLETE
+  FailureReason_CLUSTER_UNAVAILABLE,
+  FailureReason_INTERNAL_ERROR,
+  FailureReason_USER_ERROR,
+  FailureReason_VALIDATION_ERROR,
+  FailureReason'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/Types/JobDriver.hs b/gen/Amazonka/EMRContainers/Types/JobDriver.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/JobDriver.hs
@@ -0,0 +1,99 @@
+{-# 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.EMRContainers.Types.JobDriver
+-- 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.EMRContainers.Types.JobDriver where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.SparkSqlJobDriver
+import Amazonka.EMRContainers.Types.SparkSubmitJobDriver
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specify the driver that the job runs on. Exactly one of the two
+-- available job drivers is required, either sparkSqlJobDriver or
+-- sparkSubmitJobDriver.
+--
+-- /See:/ 'newJobDriver' smart constructor.
+data JobDriver = JobDriver'
+  { -- | The job driver for job type.
+    sparkSqlJobDriver :: Prelude.Maybe SparkSqlJobDriver,
+    -- | The job driver parameters specified for spark submit.
+    sparkSubmitJobDriver :: Prelude.Maybe SparkSubmitJobDriver
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobDriver' 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:
+--
+-- 'sparkSqlJobDriver', 'jobDriver_sparkSqlJobDriver' - The job driver for job type.
+--
+-- 'sparkSubmitJobDriver', 'jobDriver_sparkSubmitJobDriver' - The job driver parameters specified for spark submit.
+newJobDriver ::
+  JobDriver
+newJobDriver =
+  JobDriver'
+    { sparkSqlJobDriver = Prelude.Nothing,
+      sparkSubmitJobDriver = Prelude.Nothing
+    }
+
+-- | The job driver for job type.
+jobDriver_sparkSqlJobDriver :: Lens.Lens' JobDriver (Prelude.Maybe SparkSqlJobDriver)
+jobDriver_sparkSqlJobDriver = Lens.lens (\JobDriver' {sparkSqlJobDriver} -> sparkSqlJobDriver) (\s@JobDriver' {} a -> s {sparkSqlJobDriver = a} :: JobDriver)
+
+-- | The job driver parameters specified for spark submit.
+jobDriver_sparkSubmitJobDriver :: Lens.Lens' JobDriver (Prelude.Maybe SparkSubmitJobDriver)
+jobDriver_sparkSubmitJobDriver = Lens.lens (\JobDriver' {sparkSubmitJobDriver} -> sparkSubmitJobDriver) (\s@JobDriver' {} a -> s {sparkSubmitJobDriver = a} :: JobDriver)
+
+instance Data.FromJSON JobDriver where
+  parseJSON =
+    Data.withObject
+      "JobDriver"
+      ( \x ->
+          JobDriver'
+            Prelude.<$> (x Data..:? "sparkSqlJobDriver")
+            Prelude.<*> (x Data..:? "sparkSubmitJobDriver")
+      )
+
+instance Prelude.Hashable JobDriver where
+  hashWithSalt _salt JobDriver' {..} =
+    _salt
+      `Prelude.hashWithSalt` sparkSqlJobDriver
+      `Prelude.hashWithSalt` sparkSubmitJobDriver
+
+instance Prelude.NFData JobDriver where
+  rnf JobDriver' {..} =
+    Prelude.rnf sparkSqlJobDriver
+      `Prelude.seq` Prelude.rnf sparkSubmitJobDriver
+
+instance Data.ToJSON JobDriver where
+  toJSON JobDriver' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("sparkSqlJobDriver" Data..=)
+              Prelude.<$> sparkSqlJobDriver,
+            ("sparkSubmitJobDriver" Data..=)
+              Prelude.<$> sparkSubmitJobDriver
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/JobRun.hs b/gen/Amazonka/EMRContainers/Types/JobRun.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/JobRun.hs
@@ -0,0 +1,261 @@
+{-# 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.EMRContainers.Types.JobRun
+-- 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.EMRContainers.Types.JobRun where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.ConfigurationOverrides
+import Amazonka.EMRContainers.Types.FailureReason
+import Amazonka.EMRContainers.Types.JobDriver
+import Amazonka.EMRContainers.Types.JobRunState
+import qualified Amazonka.Prelude as Prelude
+
+-- | This entity describes a job run. A job run is a unit of work, such as a
+-- Spark jar, PySpark script, or SparkSQL query, that you submit to Amazon
+-- EMR on EKS.
+--
+-- /See:/ 'newJobRun' smart constructor.
+data JobRun = JobRun'
+  { -- | The ARN of job run.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The client token used to start a job run.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The configuration settings that are used to override default
+    -- configuration.
+    configurationOverrides :: Prelude.Maybe ConfigurationOverrides,
+    -- | The date and time when the job run was created.
+    createdAt :: Prelude.Maybe Data.ISO8601,
+    -- | The user who created the job run.
+    createdBy :: Prelude.Maybe Prelude.Text,
+    -- | The execution role ARN of the job run.
+    executionRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The reasons why the job run has failed.
+    failureReason :: Prelude.Maybe FailureReason,
+    -- | The date and time when the job run has finished.
+    finishedAt :: Prelude.Maybe Data.ISO8601,
+    -- | The ID of the job run.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | Parameters of job driver for the job run.
+    jobDriver :: Prelude.Maybe JobDriver,
+    -- | The name of the job run.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The release version of Amazon EMR.
+    releaseLabel :: Prelude.Maybe Prelude.Text,
+    -- | The state of the job run.
+    state :: Prelude.Maybe JobRunState,
+    -- | Additional details of the job run state.
+    stateDetails :: Prelude.Maybe Prelude.Text,
+    -- | The assigned tags of the job run.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the job run\'s virtual cluster.
+    virtualClusterId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobRun' 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', 'jobRun_arn' - The ARN of job run.
+--
+-- 'clientToken', 'jobRun_clientToken' - The client token used to start a job run.
+--
+-- 'configurationOverrides', 'jobRun_configurationOverrides' - The configuration settings that are used to override default
+-- configuration.
+--
+-- 'createdAt', 'jobRun_createdAt' - The date and time when the job run was created.
+--
+-- 'createdBy', 'jobRun_createdBy' - The user who created the job run.
+--
+-- 'executionRoleArn', 'jobRun_executionRoleArn' - The execution role ARN of the job run.
+--
+-- 'failureReason', 'jobRun_failureReason' - The reasons why the job run has failed.
+--
+-- 'finishedAt', 'jobRun_finishedAt' - The date and time when the job run has finished.
+--
+-- 'id', 'jobRun_id' - The ID of the job run.
+--
+-- 'jobDriver', 'jobRun_jobDriver' - Parameters of job driver for the job run.
+--
+-- 'name', 'jobRun_name' - The name of the job run.
+--
+-- 'releaseLabel', 'jobRun_releaseLabel' - The release version of Amazon EMR.
+--
+-- 'state', 'jobRun_state' - The state of the job run.
+--
+-- 'stateDetails', 'jobRun_stateDetails' - Additional details of the job run state.
+--
+-- 'tags', 'jobRun_tags' - The assigned tags of the job run.
+--
+-- 'virtualClusterId', 'jobRun_virtualClusterId' - The ID of the job run\'s virtual cluster.
+newJobRun ::
+  JobRun
+newJobRun =
+  JobRun'
+    { arn = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      configurationOverrides = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      createdBy = Prelude.Nothing,
+      executionRoleArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      finishedAt = Prelude.Nothing,
+      id = Prelude.Nothing,
+      jobDriver = Prelude.Nothing,
+      name = Prelude.Nothing,
+      releaseLabel = Prelude.Nothing,
+      state = Prelude.Nothing,
+      stateDetails = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      virtualClusterId = Prelude.Nothing
+    }
+
+-- | The ARN of job run.
+jobRun_arn :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_arn = Lens.lens (\JobRun' {arn} -> arn) (\s@JobRun' {} a -> s {arn = a} :: JobRun)
+
+-- | The client token used to start a job run.
+jobRun_clientToken :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_clientToken = Lens.lens (\JobRun' {clientToken} -> clientToken) (\s@JobRun' {} a -> s {clientToken = a} :: JobRun)
+
+-- | The configuration settings that are used to override default
+-- configuration.
+jobRun_configurationOverrides :: Lens.Lens' JobRun (Prelude.Maybe ConfigurationOverrides)
+jobRun_configurationOverrides = Lens.lens (\JobRun' {configurationOverrides} -> configurationOverrides) (\s@JobRun' {} a -> s {configurationOverrides = a} :: JobRun)
+
+-- | The date and time when the job run was created.
+jobRun_createdAt :: Lens.Lens' JobRun (Prelude.Maybe Prelude.UTCTime)
+jobRun_createdAt = Lens.lens (\JobRun' {createdAt} -> createdAt) (\s@JobRun' {} a -> s {createdAt = a} :: JobRun) Prelude.. Lens.mapping Data._Time
+
+-- | The user who created the job run.
+jobRun_createdBy :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_createdBy = Lens.lens (\JobRun' {createdBy} -> createdBy) (\s@JobRun' {} a -> s {createdBy = a} :: JobRun)
+
+-- | The execution role ARN of the job run.
+jobRun_executionRoleArn :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_executionRoleArn = Lens.lens (\JobRun' {executionRoleArn} -> executionRoleArn) (\s@JobRun' {} a -> s {executionRoleArn = a} :: JobRun)
+
+-- | The reasons why the job run has failed.
+jobRun_failureReason :: Lens.Lens' JobRun (Prelude.Maybe FailureReason)
+jobRun_failureReason = Lens.lens (\JobRun' {failureReason} -> failureReason) (\s@JobRun' {} a -> s {failureReason = a} :: JobRun)
+
+-- | The date and time when the job run has finished.
+jobRun_finishedAt :: Lens.Lens' JobRun (Prelude.Maybe Prelude.UTCTime)
+jobRun_finishedAt = Lens.lens (\JobRun' {finishedAt} -> finishedAt) (\s@JobRun' {} a -> s {finishedAt = a} :: JobRun) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the job run.
+jobRun_id :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_id = Lens.lens (\JobRun' {id} -> id) (\s@JobRun' {} a -> s {id = a} :: JobRun)
+
+-- | Parameters of job driver for the job run.
+jobRun_jobDriver :: Lens.Lens' JobRun (Prelude.Maybe JobDriver)
+jobRun_jobDriver = Lens.lens (\JobRun' {jobDriver} -> jobDriver) (\s@JobRun' {} a -> s {jobDriver = a} :: JobRun)
+
+-- | The name of the job run.
+jobRun_name :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_name = Lens.lens (\JobRun' {name} -> name) (\s@JobRun' {} a -> s {name = a} :: JobRun)
+
+-- | The release version of Amazon EMR.
+jobRun_releaseLabel :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_releaseLabel = Lens.lens (\JobRun' {releaseLabel} -> releaseLabel) (\s@JobRun' {} a -> s {releaseLabel = a} :: JobRun)
+
+-- | The state of the job run.
+jobRun_state :: Lens.Lens' JobRun (Prelude.Maybe JobRunState)
+jobRun_state = Lens.lens (\JobRun' {state} -> state) (\s@JobRun' {} a -> s {state = a} :: JobRun)
+
+-- | Additional details of the job run state.
+jobRun_stateDetails :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_stateDetails = Lens.lens (\JobRun' {stateDetails} -> stateDetails) (\s@JobRun' {} a -> s {stateDetails = a} :: JobRun)
+
+-- | The assigned tags of the job run.
+jobRun_tags :: Lens.Lens' JobRun (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+jobRun_tags = Lens.lens (\JobRun' {tags} -> tags) (\s@JobRun' {} a -> s {tags = a} :: JobRun) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the job run\'s virtual cluster.
+jobRun_virtualClusterId :: Lens.Lens' JobRun (Prelude.Maybe Prelude.Text)
+jobRun_virtualClusterId = Lens.lens (\JobRun' {virtualClusterId} -> virtualClusterId) (\s@JobRun' {} a -> s {virtualClusterId = a} :: JobRun)
+
+instance Data.FromJSON JobRun where
+  parseJSON =
+    Data.withObject
+      "JobRun"
+      ( \x ->
+          JobRun'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "clientToken")
+            Prelude.<*> (x Data..:? "configurationOverrides")
+            Prelude.<*> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "createdBy")
+            Prelude.<*> (x Data..:? "executionRoleArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "finishedAt")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "jobDriver")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "releaseLabel")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "stateDetails")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "virtualClusterId")
+      )
+
+instance Prelude.Hashable JobRun where
+  hashWithSalt _salt JobRun' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` configurationOverrides
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` createdBy
+      `Prelude.hashWithSalt` executionRoleArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` finishedAt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` jobDriver
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` releaseLabel
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` stateDetails
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` virtualClusterId
+
+instance Prelude.NFData JobRun where
+  rnf JobRun' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf configurationOverrides
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf createdBy
+      `Prelude.seq` Prelude.rnf executionRoleArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf finishedAt
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf jobDriver
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf releaseLabel
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf stateDetails
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf virtualClusterId
diff --git a/gen/Amazonka/EMRContainers/Types/JobRunState.hs b/gen/Amazonka/EMRContainers/Types/JobRunState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/JobRunState.hs
@@ -0,0 +1,96 @@
+{-# 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.EMRContainers.Types.JobRunState
+-- 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.EMRContainers.Types.JobRunState
+  ( JobRunState
+      ( ..,
+        JobRunState_CANCELLED,
+        JobRunState_CANCEL_PENDING,
+        JobRunState_COMPLETED,
+        JobRunState_FAILED,
+        JobRunState_PENDING,
+        JobRunState_RUNNING,
+        JobRunState_SUBMITTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype JobRunState = JobRunState'
+  { fromJobRunState ::
+      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 JobRunState_CANCELLED :: JobRunState
+pattern JobRunState_CANCELLED = JobRunState' "CANCELLED"
+
+pattern JobRunState_CANCEL_PENDING :: JobRunState
+pattern JobRunState_CANCEL_PENDING = JobRunState' "CANCEL_PENDING"
+
+pattern JobRunState_COMPLETED :: JobRunState
+pattern JobRunState_COMPLETED = JobRunState' "COMPLETED"
+
+pattern JobRunState_FAILED :: JobRunState
+pattern JobRunState_FAILED = JobRunState' "FAILED"
+
+pattern JobRunState_PENDING :: JobRunState
+pattern JobRunState_PENDING = JobRunState' "PENDING"
+
+pattern JobRunState_RUNNING :: JobRunState
+pattern JobRunState_RUNNING = JobRunState' "RUNNING"
+
+pattern JobRunState_SUBMITTED :: JobRunState
+pattern JobRunState_SUBMITTED = JobRunState' "SUBMITTED"
+
+{-# COMPLETE
+  JobRunState_CANCELLED,
+  JobRunState_CANCEL_PENDING,
+  JobRunState_COMPLETED,
+  JobRunState_FAILED,
+  JobRunState_PENDING,
+  JobRunState_RUNNING,
+  JobRunState_SUBMITTED,
+  JobRunState'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/Types/JobTemplate.hs b/gen/Amazonka/EMRContainers/Types/JobTemplate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/JobTemplate.hs
@@ -0,0 +1,175 @@
+{-# 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.EMRContainers.Types.JobTemplate
+-- 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.EMRContainers.Types.JobTemplate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.JobTemplateData
+import qualified Amazonka.Prelude as Prelude
+
+-- | This entity describes a job template. Job template stores values of
+-- StartJobRun API request in a template and can be used to start a job
+-- run. Job template allows two use cases: avoid repeating recurring
+-- StartJobRun API request values, enforcing certain values in StartJobRun
+-- API request.
+--
+-- /See:/ 'newJobTemplate' smart constructor.
+data JobTemplate = JobTemplate'
+  { -- | The ARN of the job template.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time when the job template was created.
+    createdAt :: Prelude.Maybe Data.ISO8601,
+    -- | The user who created the job template.
+    createdBy :: Prelude.Maybe Prelude.Text,
+    -- | The error message in case the decryption of job template fails.
+    decryptionError :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the job template.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key ARN used to encrypt the job template.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the job template.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The tags assigned to the job template.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The job template data which holds values of StartJobRun API request.
+    jobTemplateData :: JobTemplateData
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobTemplate' 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', 'jobTemplate_arn' - The ARN of the job template.
+--
+-- 'createdAt', 'jobTemplate_createdAt' - The date and time when the job template was created.
+--
+-- 'createdBy', 'jobTemplate_createdBy' - The user who created the job template.
+--
+-- 'decryptionError', 'jobTemplate_decryptionError' - The error message in case the decryption of job template fails.
+--
+-- 'id', 'jobTemplate_id' - The ID of the job template.
+--
+-- 'kmsKeyArn', 'jobTemplate_kmsKeyArn' - The KMS key ARN used to encrypt the job template.
+--
+-- 'name', 'jobTemplate_name' - The name of the job template.
+--
+-- 'tags', 'jobTemplate_tags' - The tags assigned to the job template.
+--
+-- 'jobTemplateData', 'jobTemplate_jobTemplateData' - The job template data which holds values of StartJobRun API request.
+newJobTemplate ::
+  -- | 'jobTemplateData'
+  JobTemplateData ->
+  JobTemplate
+newJobTemplate pJobTemplateData_ =
+  JobTemplate'
+    { arn = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      createdBy = Prelude.Nothing,
+      decryptionError = Prelude.Nothing,
+      id = Prelude.Nothing,
+      kmsKeyArn = Prelude.Nothing,
+      name = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      jobTemplateData = pJobTemplateData_
+    }
+
+-- | The ARN of the job template.
+jobTemplate_arn :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.Text)
+jobTemplate_arn = Lens.lens (\JobTemplate' {arn} -> arn) (\s@JobTemplate' {} a -> s {arn = a} :: JobTemplate)
+
+-- | The date and time when the job template was created.
+jobTemplate_createdAt :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.UTCTime)
+jobTemplate_createdAt = Lens.lens (\JobTemplate' {createdAt} -> createdAt) (\s@JobTemplate' {} a -> s {createdAt = a} :: JobTemplate) Prelude.. Lens.mapping Data._Time
+
+-- | The user who created the job template.
+jobTemplate_createdBy :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.Text)
+jobTemplate_createdBy = Lens.lens (\JobTemplate' {createdBy} -> createdBy) (\s@JobTemplate' {} a -> s {createdBy = a} :: JobTemplate)
+
+-- | The error message in case the decryption of job template fails.
+jobTemplate_decryptionError :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.Text)
+jobTemplate_decryptionError = Lens.lens (\JobTemplate' {decryptionError} -> decryptionError) (\s@JobTemplate' {} a -> s {decryptionError = a} :: JobTemplate)
+
+-- | The ID of the job template.
+jobTemplate_id :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.Text)
+jobTemplate_id = Lens.lens (\JobTemplate' {id} -> id) (\s@JobTemplate' {} a -> s {id = a} :: JobTemplate)
+
+-- | The KMS key ARN used to encrypt the job template.
+jobTemplate_kmsKeyArn :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.Text)
+jobTemplate_kmsKeyArn = Lens.lens (\JobTemplate' {kmsKeyArn} -> kmsKeyArn) (\s@JobTemplate' {} a -> s {kmsKeyArn = a} :: JobTemplate)
+
+-- | The name of the job template.
+jobTemplate_name :: Lens.Lens' JobTemplate (Prelude.Maybe Prelude.Text)
+jobTemplate_name = Lens.lens (\JobTemplate' {name} -> name) (\s@JobTemplate' {} a -> s {name = a} :: JobTemplate)
+
+-- | The tags assigned to the job template.
+jobTemplate_tags :: Lens.Lens' JobTemplate (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+jobTemplate_tags = Lens.lens (\JobTemplate' {tags} -> tags) (\s@JobTemplate' {} a -> s {tags = a} :: JobTemplate) Prelude.. Lens.mapping Lens.coerced
+
+-- | The job template data which holds values of StartJobRun API request.
+jobTemplate_jobTemplateData :: Lens.Lens' JobTemplate JobTemplateData
+jobTemplate_jobTemplateData = Lens.lens (\JobTemplate' {jobTemplateData} -> jobTemplateData) (\s@JobTemplate' {} a -> s {jobTemplateData = a} :: JobTemplate)
+
+instance Data.FromJSON JobTemplate where
+  parseJSON =
+    Data.withObject
+      "JobTemplate"
+      ( \x ->
+          JobTemplate'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "createdBy")
+            Prelude.<*> (x Data..:? "decryptionError")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "kmsKeyArn")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "jobTemplateData")
+      )
+
+instance Prelude.Hashable JobTemplate where
+  hashWithSalt _salt JobTemplate' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` createdBy
+      `Prelude.hashWithSalt` decryptionError
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` kmsKeyArn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` jobTemplateData
+
+instance Prelude.NFData JobTemplate where
+  rnf JobTemplate' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf createdBy
+      `Prelude.seq` Prelude.rnf decryptionError
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf jobTemplateData
diff --git a/gen/Amazonka/EMRContainers/Types/JobTemplateData.hs b/gen/Amazonka/EMRContainers/Types/JobTemplateData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/JobTemplateData.hs
@@ -0,0 +1,167 @@
+{-# 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.EMRContainers.Types.JobTemplateData
+-- 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.EMRContainers.Types.JobTemplateData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.JobDriver
+import Amazonka.EMRContainers.Types.ParametricConfigurationOverrides
+import Amazonka.EMRContainers.Types.TemplateParameterConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | The values of StartJobRun API requests used in job runs started using
+-- the job template.
+--
+-- /See:/ 'newJobTemplateData' smart constructor.
+data JobTemplateData = JobTemplateData'
+  { -- | The configuration settings that are used to override defaults
+    -- configuration.
+    configurationOverrides :: Prelude.Maybe ParametricConfigurationOverrides,
+    -- | The tags assigned to jobs started using the job template.
+    jobTags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The configuration of parameters existing in the job template.
+    parameterConfiguration :: Prelude.Maybe (Prelude.HashMap Prelude.Text TemplateParameterConfiguration),
+    -- | The execution role ARN of the job run.
+    executionRoleArn :: Prelude.Text,
+    -- | The release version of Amazon EMR.
+    releaseLabel :: Prelude.Text,
+    jobDriver :: JobDriver
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobTemplateData' 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:
+--
+-- 'configurationOverrides', 'jobTemplateData_configurationOverrides' - The configuration settings that are used to override defaults
+-- configuration.
+--
+-- 'jobTags', 'jobTemplateData_jobTags' - The tags assigned to jobs started using the job template.
+--
+-- 'parameterConfiguration', 'jobTemplateData_parameterConfiguration' - The configuration of parameters existing in the job template.
+--
+-- 'executionRoleArn', 'jobTemplateData_executionRoleArn' - The execution role ARN of the job run.
+--
+-- 'releaseLabel', 'jobTemplateData_releaseLabel' - The release version of Amazon EMR.
+--
+-- 'jobDriver', 'jobTemplateData_jobDriver' - Undocumented member.
+newJobTemplateData ::
+  -- | 'executionRoleArn'
+  Prelude.Text ->
+  -- | 'releaseLabel'
+  Prelude.Text ->
+  -- | 'jobDriver'
+  JobDriver ->
+  JobTemplateData
+newJobTemplateData
+  pExecutionRoleArn_
+  pReleaseLabel_
+  pJobDriver_ =
+    JobTemplateData'
+      { configurationOverrides =
+          Prelude.Nothing,
+        jobTags = Prelude.Nothing,
+        parameterConfiguration = Prelude.Nothing,
+        executionRoleArn = pExecutionRoleArn_,
+        releaseLabel = pReleaseLabel_,
+        jobDriver = pJobDriver_
+      }
+
+-- | The configuration settings that are used to override defaults
+-- configuration.
+jobTemplateData_configurationOverrides :: Lens.Lens' JobTemplateData (Prelude.Maybe ParametricConfigurationOverrides)
+jobTemplateData_configurationOverrides = Lens.lens (\JobTemplateData' {configurationOverrides} -> configurationOverrides) (\s@JobTemplateData' {} a -> s {configurationOverrides = a} :: JobTemplateData)
+
+-- | The tags assigned to jobs started using the job template.
+jobTemplateData_jobTags :: Lens.Lens' JobTemplateData (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+jobTemplateData_jobTags = Lens.lens (\JobTemplateData' {jobTags} -> jobTags) (\s@JobTemplateData' {} a -> s {jobTags = a} :: JobTemplateData) Prelude.. Lens.mapping Lens.coerced
+
+-- | The configuration of parameters existing in the job template.
+jobTemplateData_parameterConfiguration :: Lens.Lens' JobTemplateData (Prelude.Maybe (Prelude.HashMap Prelude.Text TemplateParameterConfiguration))
+jobTemplateData_parameterConfiguration = Lens.lens (\JobTemplateData' {parameterConfiguration} -> parameterConfiguration) (\s@JobTemplateData' {} a -> s {parameterConfiguration = a} :: JobTemplateData) Prelude.. Lens.mapping Lens.coerced
+
+-- | The execution role ARN of the job run.
+jobTemplateData_executionRoleArn :: Lens.Lens' JobTemplateData Prelude.Text
+jobTemplateData_executionRoleArn = Lens.lens (\JobTemplateData' {executionRoleArn} -> executionRoleArn) (\s@JobTemplateData' {} a -> s {executionRoleArn = a} :: JobTemplateData)
+
+-- | The release version of Amazon EMR.
+jobTemplateData_releaseLabel :: Lens.Lens' JobTemplateData Prelude.Text
+jobTemplateData_releaseLabel = Lens.lens (\JobTemplateData' {releaseLabel} -> releaseLabel) (\s@JobTemplateData' {} a -> s {releaseLabel = a} :: JobTemplateData)
+
+-- | Undocumented member.
+jobTemplateData_jobDriver :: Lens.Lens' JobTemplateData JobDriver
+jobTemplateData_jobDriver = Lens.lens (\JobTemplateData' {jobDriver} -> jobDriver) (\s@JobTemplateData' {} a -> s {jobDriver = a} :: JobTemplateData)
+
+instance Data.FromJSON JobTemplateData where
+  parseJSON =
+    Data.withObject
+      "JobTemplateData"
+      ( \x ->
+          JobTemplateData'
+            Prelude.<$> (x Data..:? "configurationOverrides")
+            Prelude.<*> (x Data..:? "jobTags" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "parameterConfiguration"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..: "executionRoleArn")
+            Prelude.<*> (x Data..: "releaseLabel")
+            Prelude.<*> (x Data..: "jobDriver")
+      )
+
+instance Prelude.Hashable JobTemplateData where
+  hashWithSalt _salt JobTemplateData' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationOverrides
+      `Prelude.hashWithSalt` jobTags
+      `Prelude.hashWithSalt` parameterConfiguration
+      `Prelude.hashWithSalt` executionRoleArn
+      `Prelude.hashWithSalt` releaseLabel
+      `Prelude.hashWithSalt` jobDriver
+
+instance Prelude.NFData JobTemplateData where
+  rnf JobTemplateData' {..} =
+    Prelude.rnf configurationOverrides
+      `Prelude.seq` Prelude.rnf jobTags
+      `Prelude.seq` Prelude.rnf parameterConfiguration
+      `Prelude.seq` Prelude.rnf executionRoleArn
+      `Prelude.seq` Prelude.rnf releaseLabel
+      `Prelude.seq` Prelude.rnf jobDriver
+
+instance Data.ToJSON JobTemplateData where
+  toJSON JobTemplateData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("configurationOverrides" Data..=)
+              Prelude.<$> configurationOverrides,
+            ("jobTags" Data..=) Prelude.<$> jobTags,
+            ("parameterConfiguration" Data..=)
+              Prelude.<$> parameterConfiguration,
+            Prelude.Just
+              ("executionRoleArn" Data..= executionRoleArn),
+            Prelude.Just ("releaseLabel" Data..= releaseLabel),
+            Prelude.Just ("jobDriver" Data..= jobDriver)
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/MonitoringConfiguration.hs b/gen/Amazonka/EMRContainers/Types/MonitoringConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/MonitoringConfiguration.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.EMRContainers.Types.MonitoringConfiguration
+-- 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.EMRContainers.Types.MonitoringConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.CloudWatchMonitoringConfiguration
+import Amazonka.EMRContainers.Types.PersistentAppUI
+import Amazonka.EMRContainers.Types.S3MonitoringConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Configuration setting for monitoring.
+--
+-- /See:/ 'newMonitoringConfiguration' smart constructor.
+data MonitoringConfiguration = MonitoringConfiguration'
+  { -- | Monitoring configurations for CloudWatch.
+    cloudWatchMonitoringConfiguration :: Prelude.Maybe CloudWatchMonitoringConfiguration,
+    -- | Monitoring configurations for the persistent application UI.
+    persistentAppUI :: Prelude.Maybe PersistentAppUI,
+    -- | Amazon S3 configuration for monitoring log publishing.
+    s3MonitoringConfiguration :: Prelude.Maybe S3MonitoringConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MonitoringConfiguration' 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:
+--
+-- 'cloudWatchMonitoringConfiguration', 'monitoringConfiguration_cloudWatchMonitoringConfiguration' - Monitoring configurations for CloudWatch.
+--
+-- 'persistentAppUI', 'monitoringConfiguration_persistentAppUI' - Monitoring configurations for the persistent application UI.
+--
+-- 's3MonitoringConfiguration', 'monitoringConfiguration_s3MonitoringConfiguration' - Amazon S3 configuration for monitoring log publishing.
+newMonitoringConfiguration ::
+  MonitoringConfiguration
+newMonitoringConfiguration =
+  MonitoringConfiguration'
+    { cloudWatchMonitoringConfiguration =
+        Prelude.Nothing,
+      persistentAppUI = Prelude.Nothing,
+      s3MonitoringConfiguration = Prelude.Nothing
+    }
+
+-- | Monitoring configurations for CloudWatch.
+monitoringConfiguration_cloudWatchMonitoringConfiguration :: Lens.Lens' MonitoringConfiguration (Prelude.Maybe CloudWatchMonitoringConfiguration)
+monitoringConfiguration_cloudWatchMonitoringConfiguration = Lens.lens (\MonitoringConfiguration' {cloudWatchMonitoringConfiguration} -> cloudWatchMonitoringConfiguration) (\s@MonitoringConfiguration' {} a -> s {cloudWatchMonitoringConfiguration = a} :: MonitoringConfiguration)
+
+-- | Monitoring configurations for the persistent application UI.
+monitoringConfiguration_persistentAppUI :: Lens.Lens' MonitoringConfiguration (Prelude.Maybe PersistentAppUI)
+monitoringConfiguration_persistentAppUI = Lens.lens (\MonitoringConfiguration' {persistentAppUI} -> persistentAppUI) (\s@MonitoringConfiguration' {} a -> s {persistentAppUI = a} :: MonitoringConfiguration)
+
+-- | Amazon S3 configuration for monitoring log publishing.
+monitoringConfiguration_s3MonitoringConfiguration :: Lens.Lens' MonitoringConfiguration (Prelude.Maybe S3MonitoringConfiguration)
+monitoringConfiguration_s3MonitoringConfiguration = Lens.lens (\MonitoringConfiguration' {s3MonitoringConfiguration} -> s3MonitoringConfiguration) (\s@MonitoringConfiguration' {} a -> s {s3MonitoringConfiguration = a} :: MonitoringConfiguration)
+
+instance Data.FromJSON MonitoringConfiguration where
+  parseJSON =
+    Data.withObject
+      "MonitoringConfiguration"
+      ( \x ->
+          MonitoringConfiguration'
+            Prelude.<$> (x Data..:? "cloudWatchMonitoringConfiguration")
+            Prelude.<*> (x Data..:? "persistentAppUI")
+            Prelude.<*> (x Data..:? "s3MonitoringConfiguration")
+      )
+
+instance Prelude.Hashable MonitoringConfiguration where
+  hashWithSalt _salt MonitoringConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` cloudWatchMonitoringConfiguration
+      `Prelude.hashWithSalt` persistentAppUI
+      `Prelude.hashWithSalt` s3MonitoringConfiguration
+
+instance Prelude.NFData MonitoringConfiguration where
+  rnf MonitoringConfiguration' {..} =
+    Prelude.rnf cloudWatchMonitoringConfiguration
+      `Prelude.seq` Prelude.rnf persistentAppUI
+      `Prelude.seq` Prelude.rnf s3MonitoringConfiguration
+
+instance Data.ToJSON MonitoringConfiguration where
+  toJSON MonitoringConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("cloudWatchMonitoringConfiguration" Data..=)
+              Prelude.<$> cloudWatchMonitoringConfiguration,
+            ("persistentAppUI" Data..=)
+              Prelude.<$> persistentAppUI,
+            ("s3MonitoringConfiguration" Data..=)
+              Prelude.<$> s3MonitoringConfiguration
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ParametricCloudWatchMonitoringConfiguration.hs b/gen/Amazonka/EMRContainers/Types/ParametricCloudWatchMonitoringConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ParametricCloudWatchMonitoringConfiguration.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.EMRContainers.Types.ParametricCloudWatchMonitoringConfiguration
+-- 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.EMRContainers.Types.ParametricCloudWatchMonitoringConfiguration 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
+
+-- | A configuration for CloudWatch monitoring. You can configure your jobs
+-- to send log information to CloudWatch Logs. This data type allows job
+-- template parameters to be specified within.
+--
+-- /See:/ 'newParametricCloudWatchMonitoringConfiguration' smart constructor.
+data ParametricCloudWatchMonitoringConfiguration = ParametricCloudWatchMonitoringConfiguration'
+  { -- | The name of the log group for log publishing.
+    logGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The specified name prefix for log streams.
+    logStreamNamePrefix :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParametricCloudWatchMonitoringConfiguration' 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:
+--
+-- 'logGroupName', 'parametricCloudWatchMonitoringConfiguration_logGroupName' - The name of the log group for log publishing.
+--
+-- 'logStreamNamePrefix', 'parametricCloudWatchMonitoringConfiguration_logStreamNamePrefix' - The specified name prefix for log streams.
+newParametricCloudWatchMonitoringConfiguration ::
+  ParametricCloudWatchMonitoringConfiguration
+newParametricCloudWatchMonitoringConfiguration =
+  ParametricCloudWatchMonitoringConfiguration'
+    { logGroupName =
+        Prelude.Nothing,
+      logStreamNamePrefix =
+        Prelude.Nothing
+    }
+
+-- | The name of the log group for log publishing.
+parametricCloudWatchMonitoringConfiguration_logGroupName :: Lens.Lens' ParametricCloudWatchMonitoringConfiguration (Prelude.Maybe Prelude.Text)
+parametricCloudWatchMonitoringConfiguration_logGroupName = Lens.lens (\ParametricCloudWatchMonitoringConfiguration' {logGroupName} -> logGroupName) (\s@ParametricCloudWatchMonitoringConfiguration' {} a -> s {logGroupName = a} :: ParametricCloudWatchMonitoringConfiguration)
+
+-- | The specified name prefix for log streams.
+parametricCloudWatchMonitoringConfiguration_logStreamNamePrefix :: Lens.Lens' ParametricCloudWatchMonitoringConfiguration (Prelude.Maybe Prelude.Text)
+parametricCloudWatchMonitoringConfiguration_logStreamNamePrefix = Lens.lens (\ParametricCloudWatchMonitoringConfiguration' {logStreamNamePrefix} -> logStreamNamePrefix) (\s@ParametricCloudWatchMonitoringConfiguration' {} a -> s {logStreamNamePrefix = a} :: ParametricCloudWatchMonitoringConfiguration)
+
+instance
+  Data.FromJSON
+    ParametricCloudWatchMonitoringConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ParametricCloudWatchMonitoringConfiguration"
+      ( \x ->
+          ParametricCloudWatchMonitoringConfiguration'
+            Prelude.<$> (x Data..:? "logGroupName")
+            Prelude.<*> (x Data..:? "logStreamNamePrefix")
+      )
+
+instance
+  Prelude.Hashable
+    ParametricCloudWatchMonitoringConfiguration
+  where
+  hashWithSalt
+    _salt
+    ParametricCloudWatchMonitoringConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` logGroupName
+        `Prelude.hashWithSalt` logStreamNamePrefix
+
+instance
+  Prelude.NFData
+    ParametricCloudWatchMonitoringConfiguration
+  where
+  rnf ParametricCloudWatchMonitoringConfiguration' {..} =
+    Prelude.rnf logGroupName
+      `Prelude.seq` Prelude.rnf logStreamNamePrefix
+
+instance
+  Data.ToJSON
+    ParametricCloudWatchMonitoringConfiguration
+  where
+  toJSON
+    ParametricCloudWatchMonitoringConfiguration' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [ ("logGroupName" Data..=) Prelude.<$> logGroupName,
+              ("logStreamNamePrefix" Data..=)
+                Prelude.<$> logStreamNamePrefix
+            ]
+        )
diff --git a/gen/Amazonka/EMRContainers/Types/ParametricConfigurationOverrides.hs b/gen/Amazonka/EMRContainers/Types/ParametricConfigurationOverrides.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ParametricConfigurationOverrides.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.EMRContainers.Types.ParametricConfigurationOverrides
+-- 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.EMRContainers.Types.ParametricConfigurationOverrides where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.Configuration
+import Amazonka.EMRContainers.Types.ParametricMonitoringConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | A configuration specification to be used to override existing
+-- configurations. This data type allows job template parameters to be
+-- specified within.
+--
+-- /See:/ 'newParametricConfigurationOverrides' smart constructor.
+data ParametricConfigurationOverrides = ParametricConfigurationOverrides'
+  { -- | The configurations for the application running by the job run.
+    applicationConfiguration :: Prelude.Maybe [Configuration],
+    -- | The configurations for monitoring.
+    monitoringConfiguration :: Prelude.Maybe ParametricMonitoringConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParametricConfigurationOverrides' 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:
+--
+-- 'applicationConfiguration', 'parametricConfigurationOverrides_applicationConfiguration' - The configurations for the application running by the job run.
+--
+-- 'monitoringConfiguration', 'parametricConfigurationOverrides_monitoringConfiguration' - The configurations for monitoring.
+newParametricConfigurationOverrides ::
+  ParametricConfigurationOverrides
+newParametricConfigurationOverrides =
+  ParametricConfigurationOverrides'
+    { applicationConfiguration =
+        Prelude.Nothing,
+      monitoringConfiguration = Prelude.Nothing
+    }
+
+-- | The configurations for the application running by the job run.
+parametricConfigurationOverrides_applicationConfiguration :: Lens.Lens' ParametricConfigurationOverrides (Prelude.Maybe [Configuration])
+parametricConfigurationOverrides_applicationConfiguration = Lens.lens (\ParametricConfigurationOverrides' {applicationConfiguration} -> applicationConfiguration) (\s@ParametricConfigurationOverrides' {} a -> s {applicationConfiguration = a} :: ParametricConfigurationOverrides) Prelude.. Lens.mapping Lens.coerced
+
+-- | The configurations for monitoring.
+parametricConfigurationOverrides_monitoringConfiguration :: Lens.Lens' ParametricConfigurationOverrides (Prelude.Maybe ParametricMonitoringConfiguration)
+parametricConfigurationOverrides_monitoringConfiguration = Lens.lens (\ParametricConfigurationOverrides' {monitoringConfiguration} -> monitoringConfiguration) (\s@ParametricConfigurationOverrides' {} a -> s {monitoringConfiguration = a} :: ParametricConfigurationOverrides)
+
+instance
+  Data.FromJSON
+    ParametricConfigurationOverrides
+  where
+  parseJSON =
+    Data.withObject
+      "ParametricConfigurationOverrides"
+      ( \x ->
+          ParametricConfigurationOverrides'
+            Prelude.<$> ( x
+                            Data..:? "applicationConfiguration"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "monitoringConfiguration")
+      )
+
+instance
+  Prelude.Hashable
+    ParametricConfigurationOverrides
+  where
+  hashWithSalt
+    _salt
+    ParametricConfigurationOverrides' {..} =
+      _salt
+        `Prelude.hashWithSalt` applicationConfiguration
+        `Prelude.hashWithSalt` monitoringConfiguration
+
+instance
+  Prelude.NFData
+    ParametricConfigurationOverrides
+  where
+  rnf ParametricConfigurationOverrides' {..} =
+    Prelude.rnf applicationConfiguration
+      `Prelude.seq` Prelude.rnf monitoringConfiguration
+
+instance Data.ToJSON ParametricConfigurationOverrides where
+  toJSON ParametricConfigurationOverrides' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("applicationConfiguration" Data..=)
+              Prelude.<$> applicationConfiguration,
+            ("monitoringConfiguration" Data..=)
+              Prelude.<$> monitoringConfiguration
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ParametricMonitoringConfiguration.hs b/gen/Amazonka/EMRContainers/Types/ParametricMonitoringConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ParametricMonitoringConfiguration.hs
@@ -0,0 +1,128 @@
+{-# 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.EMRContainers.Types.ParametricMonitoringConfiguration
+-- 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.EMRContainers.Types.ParametricMonitoringConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.ParametricCloudWatchMonitoringConfiguration
+import Amazonka.EMRContainers.Types.ParametricS3MonitoringConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Configuration setting for monitoring. This data type allows job template
+-- parameters to be specified within.
+--
+-- /See:/ 'newParametricMonitoringConfiguration' smart constructor.
+data ParametricMonitoringConfiguration = ParametricMonitoringConfiguration'
+  { -- | Monitoring configurations for CloudWatch.
+    cloudWatchMonitoringConfiguration :: Prelude.Maybe ParametricCloudWatchMonitoringConfiguration,
+    -- | Monitoring configurations for the persistent application UI.
+    persistentAppUI :: Prelude.Maybe Prelude.Text,
+    -- | Amazon S3 configuration for monitoring log publishing.
+    s3MonitoringConfiguration :: Prelude.Maybe ParametricS3MonitoringConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParametricMonitoringConfiguration' 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:
+--
+-- 'cloudWatchMonitoringConfiguration', 'parametricMonitoringConfiguration_cloudWatchMonitoringConfiguration' - Monitoring configurations for CloudWatch.
+--
+-- 'persistentAppUI', 'parametricMonitoringConfiguration_persistentAppUI' - Monitoring configurations for the persistent application UI.
+--
+-- 's3MonitoringConfiguration', 'parametricMonitoringConfiguration_s3MonitoringConfiguration' - Amazon S3 configuration for monitoring log publishing.
+newParametricMonitoringConfiguration ::
+  ParametricMonitoringConfiguration
+newParametricMonitoringConfiguration =
+  ParametricMonitoringConfiguration'
+    { cloudWatchMonitoringConfiguration =
+        Prelude.Nothing,
+      persistentAppUI = Prelude.Nothing,
+      s3MonitoringConfiguration =
+        Prelude.Nothing
+    }
+
+-- | Monitoring configurations for CloudWatch.
+parametricMonitoringConfiguration_cloudWatchMonitoringConfiguration :: Lens.Lens' ParametricMonitoringConfiguration (Prelude.Maybe ParametricCloudWatchMonitoringConfiguration)
+parametricMonitoringConfiguration_cloudWatchMonitoringConfiguration = Lens.lens (\ParametricMonitoringConfiguration' {cloudWatchMonitoringConfiguration} -> cloudWatchMonitoringConfiguration) (\s@ParametricMonitoringConfiguration' {} a -> s {cloudWatchMonitoringConfiguration = a} :: ParametricMonitoringConfiguration)
+
+-- | Monitoring configurations for the persistent application UI.
+parametricMonitoringConfiguration_persistentAppUI :: Lens.Lens' ParametricMonitoringConfiguration (Prelude.Maybe Prelude.Text)
+parametricMonitoringConfiguration_persistentAppUI = Lens.lens (\ParametricMonitoringConfiguration' {persistentAppUI} -> persistentAppUI) (\s@ParametricMonitoringConfiguration' {} a -> s {persistentAppUI = a} :: ParametricMonitoringConfiguration)
+
+-- | Amazon S3 configuration for monitoring log publishing.
+parametricMonitoringConfiguration_s3MonitoringConfiguration :: Lens.Lens' ParametricMonitoringConfiguration (Prelude.Maybe ParametricS3MonitoringConfiguration)
+parametricMonitoringConfiguration_s3MonitoringConfiguration = Lens.lens (\ParametricMonitoringConfiguration' {s3MonitoringConfiguration} -> s3MonitoringConfiguration) (\s@ParametricMonitoringConfiguration' {} a -> s {s3MonitoringConfiguration = a} :: ParametricMonitoringConfiguration)
+
+instance
+  Data.FromJSON
+    ParametricMonitoringConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ParametricMonitoringConfiguration"
+      ( \x ->
+          ParametricMonitoringConfiguration'
+            Prelude.<$> (x Data..:? "cloudWatchMonitoringConfiguration")
+            Prelude.<*> (x Data..:? "persistentAppUI")
+            Prelude.<*> (x Data..:? "s3MonitoringConfiguration")
+      )
+
+instance
+  Prelude.Hashable
+    ParametricMonitoringConfiguration
+  where
+  hashWithSalt
+    _salt
+    ParametricMonitoringConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` cloudWatchMonitoringConfiguration
+        `Prelude.hashWithSalt` persistentAppUI
+        `Prelude.hashWithSalt` s3MonitoringConfiguration
+
+instance
+  Prelude.NFData
+    ParametricMonitoringConfiguration
+  where
+  rnf ParametricMonitoringConfiguration' {..} =
+    Prelude.rnf cloudWatchMonitoringConfiguration
+      `Prelude.seq` Prelude.rnf persistentAppUI
+      `Prelude.seq` Prelude.rnf s3MonitoringConfiguration
+
+instance
+  Data.ToJSON
+    ParametricMonitoringConfiguration
+  where
+  toJSON ParametricMonitoringConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("cloudWatchMonitoringConfiguration" Data..=)
+              Prelude.<$> cloudWatchMonitoringConfiguration,
+            ("persistentAppUI" Data..=)
+              Prelude.<$> persistentAppUI,
+            ("s3MonitoringConfiguration" Data..=)
+              Prelude.<$> s3MonitoringConfiguration
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/ParametricS3MonitoringConfiguration.hs b/gen/Amazonka/EMRContainers/Types/ParametricS3MonitoringConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/ParametricS3MonitoringConfiguration.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.EMRContainers.Types.ParametricS3MonitoringConfiguration
+-- 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.EMRContainers.Types.ParametricS3MonitoringConfiguration 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
+
+-- | Amazon S3 configuration for monitoring log publishing. You can configure
+-- your jobs to send log information to Amazon S3. This data type allows
+-- job template parameters to be specified within.
+--
+-- /See:/ 'newParametricS3MonitoringConfiguration' smart constructor.
+data ParametricS3MonitoringConfiguration = ParametricS3MonitoringConfiguration'
+  { -- | Amazon S3 destination URI for log publishing.
+    logUri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParametricS3MonitoringConfiguration' 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:
+--
+-- 'logUri', 'parametricS3MonitoringConfiguration_logUri' - Amazon S3 destination URI for log publishing.
+newParametricS3MonitoringConfiguration ::
+  ParametricS3MonitoringConfiguration
+newParametricS3MonitoringConfiguration =
+  ParametricS3MonitoringConfiguration'
+    { logUri =
+        Prelude.Nothing
+    }
+
+-- | Amazon S3 destination URI for log publishing.
+parametricS3MonitoringConfiguration_logUri :: Lens.Lens' ParametricS3MonitoringConfiguration (Prelude.Maybe Prelude.Text)
+parametricS3MonitoringConfiguration_logUri = Lens.lens (\ParametricS3MonitoringConfiguration' {logUri} -> logUri) (\s@ParametricS3MonitoringConfiguration' {} a -> s {logUri = a} :: ParametricS3MonitoringConfiguration)
+
+instance
+  Data.FromJSON
+    ParametricS3MonitoringConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ParametricS3MonitoringConfiguration"
+      ( \x ->
+          ParametricS3MonitoringConfiguration'
+            Prelude.<$> (x Data..:? "logUri")
+      )
+
+instance
+  Prelude.Hashable
+    ParametricS3MonitoringConfiguration
+  where
+  hashWithSalt
+    _salt
+    ParametricS3MonitoringConfiguration' {..} =
+      _salt `Prelude.hashWithSalt` logUri
+
+instance
+  Prelude.NFData
+    ParametricS3MonitoringConfiguration
+  where
+  rnf ParametricS3MonitoringConfiguration' {..} =
+    Prelude.rnf logUri
+
+instance
+  Data.ToJSON
+    ParametricS3MonitoringConfiguration
+  where
+  toJSON ParametricS3MonitoringConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("logUri" Data..=) Prelude.<$> logUri]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/PersistentAppUI.hs b/gen/Amazonka/EMRContainers/Types/PersistentAppUI.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/PersistentAppUI.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.EMRContainers.Types.PersistentAppUI
+-- 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.EMRContainers.Types.PersistentAppUI
+  ( PersistentAppUI
+      ( ..,
+        PersistentAppUI_DISABLED,
+        PersistentAppUI_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PersistentAppUI = PersistentAppUI'
+  { fromPersistentAppUI ::
+      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 PersistentAppUI_DISABLED :: PersistentAppUI
+pattern PersistentAppUI_DISABLED = PersistentAppUI' "DISABLED"
+
+pattern PersistentAppUI_ENABLED :: PersistentAppUI
+pattern PersistentAppUI_ENABLED = PersistentAppUI' "ENABLED"
+
+{-# COMPLETE
+  PersistentAppUI_DISABLED,
+  PersistentAppUI_ENABLED,
+  PersistentAppUI'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/Types/S3MonitoringConfiguration.hs b/gen/Amazonka/EMRContainers/Types/S3MonitoringConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/S3MonitoringConfiguration.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.EMRContainers.Types.S3MonitoringConfiguration
+-- 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.EMRContainers.Types.S3MonitoringConfiguration 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
+
+-- | Amazon S3 configuration for monitoring log publishing. You can configure
+-- your jobs to send log information to Amazon S3.
+--
+-- /See:/ 'newS3MonitoringConfiguration' smart constructor.
+data S3MonitoringConfiguration = S3MonitoringConfiguration'
+  { -- | Amazon S3 destination URI for log publishing.
+    logUri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3MonitoringConfiguration' 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:
+--
+-- 'logUri', 's3MonitoringConfiguration_logUri' - Amazon S3 destination URI for log publishing.
+newS3MonitoringConfiguration ::
+  -- | 'logUri'
+  Prelude.Text ->
+  S3MonitoringConfiguration
+newS3MonitoringConfiguration pLogUri_ =
+  S3MonitoringConfiguration' {logUri = pLogUri_}
+
+-- | Amazon S3 destination URI for log publishing.
+s3MonitoringConfiguration_logUri :: Lens.Lens' S3MonitoringConfiguration Prelude.Text
+s3MonitoringConfiguration_logUri = Lens.lens (\S3MonitoringConfiguration' {logUri} -> logUri) (\s@S3MonitoringConfiguration' {} a -> s {logUri = a} :: S3MonitoringConfiguration)
+
+instance Data.FromJSON S3MonitoringConfiguration where
+  parseJSON =
+    Data.withObject
+      "S3MonitoringConfiguration"
+      ( \x ->
+          S3MonitoringConfiguration'
+            Prelude.<$> (x Data..: "logUri")
+      )
+
+instance Prelude.Hashable S3MonitoringConfiguration where
+  hashWithSalt _salt S3MonitoringConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` logUri
+
+instance Prelude.NFData S3MonitoringConfiguration where
+  rnf S3MonitoringConfiguration' {..} =
+    Prelude.rnf logUri
+
+instance Data.ToJSON S3MonitoringConfiguration where
+  toJSON S3MonitoringConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("logUri" Data..= logUri)]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/SparkSqlJobDriver.hs b/gen/Amazonka/EMRContainers/Types/SparkSqlJobDriver.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/SparkSqlJobDriver.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.EMRContainers.Types.SparkSqlJobDriver
+-- 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.EMRContainers.Types.SparkSqlJobDriver 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
+
+-- | The job driver for job type.
+--
+-- /See:/ 'newSparkSqlJobDriver' smart constructor.
+data SparkSqlJobDriver = SparkSqlJobDriver'
+  { -- | The SQL file to be executed.
+    entryPoint :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The Spark parameters to be included in the Spark SQL command.
+    sparkSqlParameters :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SparkSqlJobDriver' 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:
+--
+-- 'entryPoint', 'sparkSqlJobDriver_entryPoint' - The SQL file to be executed.
+--
+-- 'sparkSqlParameters', 'sparkSqlJobDriver_sparkSqlParameters' - The Spark parameters to be included in the Spark SQL command.
+newSparkSqlJobDriver ::
+  SparkSqlJobDriver
+newSparkSqlJobDriver =
+  SparkSqlJobDriver'
+    { entryPoint = Prelude.Nothing,
+      sparkSqlParameters = Prelude.Nothing
+    }
+
+-- | The SQL file to be executed.
+sparkSqlJobDriver_entryPoint :: Lens.Lens' SparkSqlJobDriver (Prelude.Maybe Prelude.Text)
+sparkSqlJobDriver_entryPoint = Lens.lens (\SparkSqlJobDriver' {entryPoint} -> entryPoint) (\s@SparkSqlJobDriver' {} a -> s {entryPoint = a} :: SparkSqlJobDriver) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The Spark parameters to be included in the Spark SQL command.
+sparkSqlJobDriver_sparkSqlParameters :: Lens.Lens' SparkSqlJobDriver (Prelude.Maybe Prelude.Text)
+sparkSqlJobDriver_sparkSqlParameters = Lens.lens (\SparkSqlJobDriver' {sparkSqlParameters} -> sparkSqlParameters) (\s@SparkSqlJobDriver' {} a -> s {sparkSqlParameters = a} :: SparkSqlJobDriver) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON SparkSqlJobDriver where
+  parseJSON =
+    Data.withObject
+      "SparkSqlJobDriver"
+      ( \x ->
+          SparkSqlJobDriver'
+            Prelude.<$> (x Data..:? "entryPoint")
+            Prelude.<*> (x Data..:? "sparkSqlParameters")
+      )
+
+instance Prelude.Hashable SparkSqlJobDriver where
+  hashWithSalt _salt SparkSqlJobDriver' {..} =
+    _salt
+      `Prelude.hashWithSalt` entryPoint
+      `Prelude.hashWithSalt` sparkSqlParameters
+
+instance Prelude.NFData SparkSqlJobDriver where
+  rnf SparkSqlJobDriver' {..} =
+    Prelude.rnf entryPoint
+      `Prelude.seq` Prelude.rnf sparkSqlParameters
+
+instance Data.ToJSON SparkSqlJobDriver where
+  toJSON SparkSqlJobDriver' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("entryPoint" Data..=) Prelude.<$> entryPoint,
+            ("sparkSqlParameters" Data..=)
+              Prelude.<$> sparkSqlParameters
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/SparkSubmitJobDriver.hs b/gen/Amazonka/EMRContainers/Types/SparkSubmitJobDriver.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/SparkSubmitJobDriver.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.EMRContainers.Types.SparkSubmitJobDriver
+-- 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.EMRContainers.Types.SparkSubmitJobDriver 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
+
+-- | The information about job driver for Spark submit.
+--
+-- /See:/ 'newSparkSubmitJobDriver' smart constructor.
+data SparkSubmitJobDriver = SparkSubmitJobDriver'
+  { -- | The arguments for job application.
+    entryPointArguments :: Prelude.Maybe [Data.Sensitive Prelude.Text],
+    -- | The Spark submit parameters that are used for job runs.
+    sparkSubmitParameters :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The entry point of job application.
+    entryPoint :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SparkSubmitJobDriver' 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:
+--
+-- 'entryPointArguments', 'sparkSubmitJobDriver_entryPointArguments' - The arguments for job application.
+--
+-- 'sparkSubmitParameters', 'sparkSubmitJobDriver_sparkSubmitParameters' - The Spark submit parameters that are used for job runs.
+--
+-- 'entryPoint', 'sparkSubmitJobDriver_entryPoint' - The entry point of job application.
+newSparkSubmitJobDriver ::
+  -- | 'entryPoint'
+  Prelude.Text ->
+  SparkSubmitJobDriver
+newSparkSubmitJobDriver pEntryPoint_ =
+  SparkSubmitJobDriver'
+    { entryPointArguments =
+        Prelude.Nothing,
+      sparkSubmitParameters = Prelude.Nothing,
+      entryPoint = Data._Sensitive Lens.# pEntryPoint_
+    }
+
+-- | The arguments for job application.
+sparkSubmitJobDriver_entryPointArguments :: Lens.Lens' SparkSubmitJobDriver (Prelude.Maybe [Prelude.Text])
+sparkSubmitJobDriver_entryPointArguments = Lens.lens (\SparkSubmitJobDriver' {entryPointArguments} -> entryPointArguments) (\s@SparkSubmitJobDriver' {} a -> s {entryPointArguments = a} :: SparkSubmitJobDriver) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Spark submit parameters that are used for job runs.
+sparkSubmitJobDriver_sparkSubmitParameters :: Lens.Lens' SparkSubmitJobDriver (Prelude.Maybe Prelude.Text)
+sparkSubmitJobDriver_sparkSubmitParameters = Lens.lens (\SparkSubmitJobDriver' {sparkSubmitParameters} -> sparkSubmitParameters) (\s@SparkSubmitJobDriver' {} a -> s {sparkSubmitParameters = a} :: SparkSubmitJobDriver) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The entry point of job application.
+sparkSubmitJobDriver_entryPoint :: Lens.Lens' SparkSubmitJobDriver Prelude.Text
+sparkSubmitJobDriver_entryPoint = Lens.lens (\SparkSubmitJobDriver' {entryPoint} -> entryPoint) (\s@SparkSubmitJobDriver' {} a -> s {entryPoint = a} :: SparkSubmitJobDriver) Prelude.. Data._Sensitive
+
+instance Data.FromJSON SparkSubmitJobDriver where
+  parseJSON =
+    Data.withObject
+      "SparkSubmitJobDriver"
+      ( \x ->
+          SparkSubmitJobDriver'
+            Prelude.<$> ( x
+                            Data..:? "entryPointArguments"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "sparkSubmitParameters")
+            Prelude.<*> (x Data..: "entryPoint")
+      )
+
+instance Prelude.Hashable SparkSubmitJobDriver where
+  hashWithSalt _salt SparkSubmitJobDriver' {..} =
+    _salt
+      `Prelude.hashWithSalt` entryPointArguments
+      `Prelude.hashWithSalt` sparkSubmitParameters
+      `Prelude.hashWithSalt` entryPoint
+
+instance Prelude.NFData SparkSubmitJobDriver where
+  rnf SparkSubmitJobDriver' {..} =
+    Prelude.rnf entryPointArguments
+      `Prelude.seq` Prelude.rnf sparkSubmitParameters
+      `Prelude.seq` Prelude.rnf entryPoint
+
+instance Data.ToJSON SparkSubmitJobDriver where
+  toJSON SparkSubmitJobDriver' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("entryPointArguments" Data..=)
+              Prelude.<$> entryPointArguments,
+            ("sparkSubmitParameters" Data..=)
+              Prelude.<$> sparkSubmitParameters,
+            Prelude.Just ("entryPoint" Data..= entryPoint)
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/TemplateParameterConfiguration.hs b/gen/Amazonka/EMRContainers/Types/TemplateParameterConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/TemplateParameterConfiguration.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.EMRContainers.Types.TemplateParameterConfiguration
+-- 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.EMRContainers.Types.TemplateParameterConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.TemplateParameterDataType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration of a job template parameter.
+--
+-- /See:/ 'newTemplateParameterConfiguration' smart constructor.
+data TemplateParameterConfiguration = TemplateParameterConfiguration'
+  { -- | The default value for the job template parameter.
+    defaultValue :: Prelude.Maybe Prelude.Text,
+    -- | The type of the job template parameter. Allowed values are: ‘String’,
+    -- ‘Number’.
+    type' :: Prelude.Maybe TemplateParameterDataType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TemplateParameterConfiguration' 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:
+--
+-- 'defaultValue', 'templateParameterConfiguration_defaultValue' - The default value for the job template parameter.
+--
+-- 'type'', 'templateParameterConfiguration_type' - The type of the job template parameter. Allowed values are: ‘String’,
+-- ‘Number’.
+newTemplateParameterConfiguration ::
+  TemplateParameterConfiguration
+newTemplateParameterConfiguration =
+  TemplateParameterConfiguration'
+    { defaultValue =
+        Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The default value for the job template parameter.
+templateParameterConfiguration_defaultValue :: Lens.Lens' TemplateParameterConfiguration (Prelude.Maybe Prelude.Text)
+templateParameterConfiguration_defaultValue = Lens.lens (\TemplateParameterConfiguration' {defaultValue} -> defaultValue) (\s@TemplateParameterConfiguration' {} a -> s {defaultValue = a} :: TemplateParameterConfiguration)
+
+-- | The type of the job template parameter. Allowed values are: ‘String’,
+-- ‘Number’.
+templateParameterConfiguration_type :: Lens.Lens' TemplateParameterConfiguration (Prelude.Maybe TemplateParameterDataType)
+templateParameterConfiguration_type = Lens.lens (\TemplateParameterConfiguration' {type'} -> type') (\s@TemplateParameterConfiguration' {} a -> s {type' = a} :: TemplateParameterConfiguration)
+
+instance Data.FromJSON TemplateParameterConfiguration where
+  parseJSON =
+    Data.withObject
+      "TemplateParameterConfiguration"
+      ( \x ->
+          TemplateParameterConfiguration'
+            Prelude.<$> (x Data..:? "defaultValue")
+            Prelude.<*> (x Data..:? "type")
+      )
+
+instance
+  Prelude.Hashable
+    TemplateParameterConfiguration
+  where
+  hashWithSalt
+    _salt
+    TemplateParameterConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` defaultValue
+        `Prelude.hashWithSalt` type'
+
+instance
+  Prelude.NFData
+    TemplateParameterConfiguration
+  where
+  rnf TemplateParameterConfiguration' {..} =
+    Prelude.rnf defaultValue
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON TemplateParameterConfiguration where
+  toJSON TemplateParameterConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("defaultValue" Data..=) Prelude.<$> defaultValue,
+            ("type" Data..=) Prelude.<$> type'
+          ]
+      )
diff --git a/gen/Amazonka/EMRContainers/Types/TemplateParameterDataType.hs b/gen/Amazonka/EMRContainers/Types/TemplateParameterDataType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/TemplateParameterDataType.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.EMRContainers.Types.TemplateParameterDataType
+-- 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.EMRContainers.Types.TemplateParameterDataType
+  ( TemplateParameterDataType
+      ( ..,
+        TemplateParameterDataType_NUMBER,
+        TemplateParameterDataType_STRING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TemplateParameterDataType = TemplateParameterDataType'
+  { fromTemplateParameterDataType ::
+      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 TemplateParameterDataType_NUMBER :: TemplateParameterDataType
+pattern TemplateParameterDataType_NUMBER = TemplateParameterDataType' "NUMBER"
+
+pattern TemplateParameterDataType_STRING :: TemplateParameterDataType
+pattern TemplateParameterDataType_STRING = TemplateParameterDataType' "STRING"
+
+{-# COMPLETE
+  TemplateParameterDataType_NUMBER,
+  TemplateParameterDataType_STRING,
+  TemplateParameterDataType'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/Types/VirtualCluster.hs b/gen/Amazonka/EMRContainers/Types/VirtualCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/VirtualCluster.hs
@@ -0,0 +1,152 @@
+{-# 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.EMRContainers.Types.VirtualCluster
+-- 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.EMRContainers.Types.VirtualCluster where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types.ContainerProvider
+import Amazonka.EMRContainers.Types.VirtualClusterState
+import qualified Amazonka.Prelude as Prelude
+
+-- | This entity describes a virtual cluster. A virtual cluster is a
+-- Kubernetes namespace that Amazon EMR is registered with. Amazon EMR uses
+-- virtual clusters to run jobs and host endpoints. Multiple virtual
+-- clusters can be backed by the same physical cluster. However, each
+-- virtual cluster maps to one namespace on an EKS cluster. Virtual
+-- clusters do not create any active resources that contribute to your bill
+-- or that require lifecycle management outside the service.
+--
+-- /See:/ 'newVirtualCluster' smart constructor.
+data VirtualCluster = VirtualCluster'
+  { -- | The ARN of the virtual cluster.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The container provider of the virtual cluster.
+    containerProvider :: Prelude.Maybe ContainerProvider,
+    -- | The date and time when the virtual cluster is created.
+    createdAt :: Prelude.Maybe Data.ISO8601,
+    -- | The ID of the virtual cluster.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name of the virtual cluster.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The state of the virtual cluster.
+    state :: Prelude.Maybe VirtualClusterState,
+    -- | The assigned tags of the virtual cluster.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VirtualCluster' 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', 'virtualCluster_arn' - The ARN of the virtual cluster.
+--
+-- 'containerProvider', 'virtualCluster_containerProvider' - The container provider of the virtual cluster.
+--
+-- 'createdAt', 'virtualCluster_createdAt' - The date and time when the virtual cluster is created.
+--
+-- 'id', 'virtualCluster_id' - The ID of the virtual cluster.
+--
+-- 'name', 'virtualCluster_name' - The name of the virtual cluster.
+--
+-- 'state', 'virtualCluster_state' - The state of the virtual cluster.
+--
+-- 'tags', 'virtualCluster_tags' - The assigned tags of the virtual cluster.
+newVirtualCluster ::
+  VirtualCluster
+newVirtualCluster =
+  VirtualCluster'
+    { arn = Prelude.Nothing,
+      containerProvider = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      state = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The ARN of the virtual cluster.
+virtualCluster_arn :: Lens.Lens' VirtualCluster (Prelude.Maybe Prelude.Text)
+virtualCluster_arn = Lens.lens (\VirtualCluster' {arn} -> arn) (\s@VirtualCluster' {} a -> s {arn = a} :: VirtualCluster)
+
+-- | The container provider of the virtual cluster.
+virtualCluster_containerProvider :: Lens.Lens' VirtualCluster (Prelude.Maybe ContainerProvider)
+virtualCluster_containerProvider = Lens.lens (\VirtualCluster' {containerProvider} -> containerProvider) (\s@VirtualCluster' {} a -> s {containerProvider = a} :: VirtualCluster)
+
+-- | The date and time when the virtual cluster is created.
+virtualCluster_createdAt :: Lens.Lens' VirtualCluster (Prelude.Maybe Prelude.UTCTime)
+virtualCluster_createdAt = Lens.lens (\VirtualCluster' {createdAt} -> createdAt) (\s@VirtualCluster' {} a -> s {createdAt = a} :: VirtualCluster) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the virtual cluster.
+virtualCluster_id :: Lens.Lens' VirtualCluster (Prelude.Maybe Prelude.Text)
+virtualCluster_id = Lens.lens (\VirtualCluster' {id} -> id) (\s@VirtualCluster' {} a -> s {id = a} :: VirtualCluster)
+
+-- | The name of the virtual cluster.
+virtualCluster_name :: Lens.Lens' VirtualCluster (Prelude.Maybe Prelude.Text)
+virtualCluster_name = Lens.lens (\VirtualCluster' {name} -> name) (\s@VirtualCluster' {} a -> s {name = a} :: VirtualCluster)
+
+-- | The state of the virtual cluster.
+virtualCluster_state :: Lens.Lens' VirtualCluster (Prelude.Maybe VirtualClusterState)
+virtualCluster_state = Lens.lens (\VirtualCluster' {state} -> state) (\s@VirtualCluster' {} a -> s {state = a} :: VirtualCluster)
+
+-- | The assigned tags of the virtual cluster.
+virtualCluster_tags :: Lens.Lens' VirtualCluster (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+virtualCluster_tags = Lens.lens (\VirtualCluster' {tags} -> tags) (\s@VirtualCluster' {} a -> s {tags = a} :: VirtualCluster) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON VirtualCluster where
+  parseJSON =
+    Data.withObject
+      "VirtualCluster"
+      ( \x ->
+          VirtualCluster'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "containerProvider")
+            Prelude.<*> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable VirtualCluster where
+  hashWithSalt _salt VirtualCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` containerProvider
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData VirtualCluster where
+  rnf VirtualCluster' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf containerProvider
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/EMRContainers/Types/VirtualClusterState.hs b/gen/Amazonka/EMRContainers/Types/VirtualClusterState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/Types/VirtualClusterState.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.EMRContainers.Types.VirtualClusterState
+-- 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.EMRContainers.Types.VirtualClusterState
+  ( VirtualClusterState
+      ( ..,
+        VirtualClusterState_ARRESTED,
+        VirtualClusterState_RUNNING,
+        VirtualClusterState_TERMINATED,
+        VirtualClusterState_TERMINATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VirtualClusterState = VirtualClusterState'
+  { fromVirtualClusterState ::
+      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 VirtualClusterState_ARRESTED :: VirtualClusterState
+pattern VirtualClusterState_ARRESTED = VirtualClusterState' "ARRESTED"
+
+pattern VirtualClusterState_RUNNING :: VirtualClusterState
+pattern VirtualClusterState_RUNNING = VirtualClusterState' "RUNNING"
+
+pattern VirtualClusterState_TERMINATED :: VirtualClusterState
+pattern VirtualClusterState_TERMINATED = VirtualClusterState' "TERMINATED"
+
+pattern VirtualClusterState_TERMINATING :: VirtualClusterState
+pattern VirtualClusterState_TERMINATING = VirtualClusterState' "TERMINATING"
+
+{-# COMPLETE
+  VirtualClusterState_ARRESTED,
+  VirtualClusterState_RUNNING,
+  VirtualClusterState_TERMINATED,
+  VirtualClusterState_TERMINATING,
+  VirtualClusterState'
+  #-}
diff --git a/gen/Amazonka/EMRContainers/UntagResource.hs b/gen/Amazonka/EMRContainers/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/UntagResource.hs
@@ -0,0 +1,161 @@
+{-# 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.EMRContainers.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)
+--
+-- Removes tags from resources.
+module Amazonka.EMRContainers.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Types
+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 ARN of resources.
+    resourceArn :: Prelude.Text,
+    -- | The tag keys of the resources.
+    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 ARN of resources.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The tag keys of the resources.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The ARN of resources.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The tag keys of the resources.
+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.delete (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.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /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/EMRContainers/Waiters.hs b/gen/Amazonka/EMRContainers/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/EMRContainers/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.EMRContainers.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.EMRContainers.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.EMRContainers.Lens
+import Amazonka.EMRContainers.Types
+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.EMRContainers
+import Test.Amazonka.EMRContainers.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "EMRContainers"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/EMRContainers.hs b/test/Test/Amazonka/EMRContainers.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/EMRContainers.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.EMRContainers
+-- 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.EMRContainers
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/EMRContainers/Internal.hs b/test/Test/Amazonka/EMRContainers/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/EMRContainers/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.EMRContainers.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.EMRContainers.Internal where
diff --git a/test/Test/Amazonka/Gen/EMRContainers.hs b/test/Test/Amazonka/Gen/EMRContainers.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/EMRContainers.hs
@@ -0,0 +1,418 @@
+{-# 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.EMRContainers
+-- 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.EMRContainers where
+
+import Amazonka.EMRContainers
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.EMRContainers.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"
+--         [ requestCancelJobRun $
+--             newCancelJobRun
+--
+--         , requestCreateJobTemplate $
+--             newCreateJobTemplate
+--
+--         , requestCreateManagedEndpoint $
+--             newCreateManagedEndpoint
+--
+--         , requestCreateVirtualCluster $
+--             newCreateVirtualCluster
+--
+--         , requestDeleteJobTemplate $
+--             newDeleteJobTemplate
+--
+--         , requestDeleteManagedEndpoint $
+--             newDeleteManagedEndpoint
+--
+--         , requestDeleteVirtualCluster $
+--             newDeleteVirtualCluster
+--
+--         , requestDescribeJobRun $
+--             newDescribeJobRun
+--
+--         , requestDescribeJobTemplate $
+--             newDescribeJobTemplate
+--
+--         , requestDescribeManagedEndpoint $
+--             newDescribeManagedEndpoint
+--
+--         , requestDescribeVirtualCluster $
+--             newDescribeVirtualCluster
+--
+--         , requestListJobRuns $
+--             newListJobRuns
+--
+--         , requestListJobTemplates $
+--             newListJobTemplates
+--
+--         , requestListManagedEndpoints $
+--             newListManagedEndpoints
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestListVirtualClusters $
+--             newListVirtualClusters
+--
+--         , requestStartJobRun $
+--             newStartJobRun
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCancelJobRun $
+--             newCancelJobRunResponse
+--
+--         , responseCreateJobTemplate $
+--             newCreateJobTemplateResponse
+--
+--         , responseCreateManagedEndpoint $
+--             newCreateManagedEndpointResponse
+--
+--         , responseCreateVirtualCluster $
+--             newCreateVirtualClusterResponse
+--
+--         , responseDeleteJobTemplate $
+--             newDeleteJobTemplateResponse
+--
+--         , responseDeleteManagedEndpoint $
+--             newDeleteManagedEndpointResponse
+--
+--         , responseDeleteVirtualCluster $
+--             newDeleteVirtualClusterResponse
+--
+--         , responseDescribeJobRun $
+--             newDescribeJobRunResponse
+--
+--         , responseDescribeJobTemplate $
+--             newDescribeJobTemplateResponse
+--
+--         , responseDescribeManagedEndpoint $
+--             newDescribeManagedEndpointResponse
+--
+--         , responseDescribeVirtualCluster $
+--             newDescribeVirtualClusterResponse
+--
+--         , responseListJobRuns $
+--             newListJobRunsResponse
+--
+--         , responseListJobTemplates $
+--             newListJobTemplatesResponse
+--
+--         , responseListManagedEndpoints $
+--             newListManagedEndpointsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseListVirtualClusters $
+--             newListVirtualClustersResponse
+--
+--         , responseStartJobRun $
+--             newStartJobRunResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCancelJobRun :: CancelJobRun -> TestTree
+requestCancelJobRun =
+  req
+    "CancelJobRun"
+    "fixture/CancelJobRun.yaml"
+
+requestCreateJobTemplate :: CreateJobTemplate -> TestTree
+requestCreateJobTemplate =
+  req
+    "CreateJobTemplate"
+    "fixture/CreateJobTemplate.yaml"
+
+requestCreateManagedEndpoint :: CreateManagedEndpoint -> TestTree
+requestCreateManagedEndpoint =
+  req
+    "CreateManagedEndpoint"
+    "fixture/CreateManagedEndpoint.yaml"
+
+requestCreateVirtualCluster :: CreateVirtualCluster -> TestTree
+requestCreateVirtualCluster =
+  req
+    "CreateVirtualCluster"
+    "fixture/CreateVirtualCluster.yaml"
+
+requestDeleteJobTemplate :: DeleteJobTemplate -> TestTree
+requestDeleteJobTemplate =
+  req
+    "DeleteJobTemplate"
+    "fixture/DeleteJobTemplate.yaml"
+
+requestDeleteManagedEndpoint :: DeleteManagedEndpoint -> TestTree
+requestDeleteManagedEndpoint =
+  req
+    "DeleteManagedEndpoint"
+    "fixture/DeleteManagedEndpoint.yaml"
+
+requestDeleteVirtualCluster :: DeleteVirtualCluster -> TestTree
+requestDeleteVirtualCluster =
+  req
+    "DeleteVirtualCluster"
+    "fixture/DeleteVirtualCluster.yaml"
+
+requestDescribeJobRun :: DescribeJobRun -> TestTree
+requestDescribeJobRun =
+  req
+    "DescribeJobRun"
+    "fixture/DescribeJobRun.yaml"
+
+requestDescribeJobTemplate :: DescribeJobTemplate -> TestTree
+requestDescribeJobTemplate =
+  req
+    "DescribeJobTemplate"
+    "fixture/DescribeJobTemplate.yaml"
+
+requestDescribeManagedEndpoint :: DescribeManagedEndpoint -> TestTree
+requestDescribeManagedEndpoint =
+  req
+    "DescribeManagedEndpoint"
+    "fixture/DescribeManagedEndpoint.yaml"
+
+requestDescribeVirtualCluster :: DescribeVirtualCluster -> TestTree
+requestDescribeVirtualCluster =
+  req
+    "DescribeVirtualCluster"
+    "fixture/DescribeVirtualCluster.yaml"
+
+requestListJobRuns :: ListJobRuns -> TestTree
+requestListJobRuns =
+  req
+    "ListJobRuns"
+    "fixture/ListJobRuns.yaml"
+
+requestListJobTemplates :: ListJobTemplates -> TestTree
+requestListJobTemplates =
+  req
+    "ListJobTemplates"
+    "fixture/ListJobTemplates.yaml"
+
+requestListManagedEndpoints :: ListManagedEndpoints -> TestTree
+requestListManagedEndpoints =
+  req
+    "ListManagedEndpoints"
+    "fixture/ListManagedEndpoints.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestListVirtualClusters :: ListVirtualClusters -> TestTree
+requestListVirtualClusters =
+  req
+    "ListVirtualClusters"
+    "fixture/ListVirtualClusters.yaml"
+
+requestStartJobRun :: StartJobRun -> TestTree
+requestStartJobRun =
+  req
+    "StartJobRun"
+    "fixture/StartJobRun.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+-- Responses
+
+responseCancelJobRun :: CancelJobRunResponse -> TestTree
+responseCancelJobRun =
+  res
+    "CancelJobRunResponse"
+    "fixture/CancelJobRunResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CancelJobRun)
+
+responseCreateJobTemplate :: CreateJobTemplateResponse -> TestTree
+responseCreateJobTemplate =
+  res
+    "CreateJobTemplateResponse"
+    "fixture/CreateJobTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateJobTemplate)
+
+responseCreateManagedEndpoint :: CreateManagedEndpointResponse -> TestTree
+responseCreateManagedEndpoint =
+  res
+    "CreateManagedEndpointResponse"
+    "fixture/CreateManagedEndpointResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateManagedEndpoint)
+
+responseCreateVirtualCluster :: CreateVirtualClusterResponse -> TestTree
+responseCreateVirtualCluster =
+  res
+    "CreateVirtualClusterResponse"
+    "fixture/CreateVirtualClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVirtualCluster)
+
+responseDeleteJobTemplate :: DeleteJobTemplateResponse -> TestTree
+responseDeleteJobTemplate =
+  res
+    "DeleteJobTemplateResponse"
+    "fixture/DeleteJobTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteJobTemplate)
+
+responseDeleteManagedEndpoint :: DeleteManagedEndpointResponse -> TestTree
+responseDeleteManagedEndpoint =
+  res
+    "DeleteManagedEndpointResponse"
+    "fixture/DeleteManagedEndpointResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteManagedEndpoint)
+
+responseDeleteVirtualCluster :: DeleteVirtualClusterResponse -> TestTree
+responseDeleteVirtualCluster =
+  res
+    "DeleteVirtualClusterResponse"
+    "fixture/DeleteVirtualClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVirtualCluster)
+
+responseDescribeJobRun :: DescribeJobRunResponse -> TestTree
+responseDescribeJobRun =
+  res
+    "DescribeJobRunResponse"
+    "fixture/DescribeJobRunResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeJobRun)
+
+responseDescribeJobTemplate :: DescribeJobTemplateResponse -> TestTree
+responseDescribeJobTemplate =
+  res
+    "DescribeJobTemplateResponse"
+    "fixture/DescribeJobTemplateResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeJobTemplate)
+
+responseDescribeManagedEndpoint :: DescribeManagedEndpointResponse -> TestTree
+responseDescribeManagedEndpoint =
+  res
+    "DescribeManagedEndpointResponse"
+    "fixture/DescribeManagedEndpointResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeManagedEndpoint)
+
+responseDescribeVirtualCluster :: DescribeVirtualClusterResponse -> TestTree
+responseDescribeVirtualCluster =
+  res
+    "DescribeVirtualClusterResponse"
+    "fixture/DescribeVirtualClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeVirtualCluster)
+
+responseListJobRuns :: ListJobRunsResponse -> TestTree
+responseListJobRuns =
+  res
+    "ListJobRunsResponse"
+    "fixture/ListJobRunsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListJobRuns)
+
+responseListJobTemplates :: ListJobTemplatesResponse -> TestTree
+responseListJobTemplates =
+  res
+    "ListJobTemplatesResponse"
+    "fixture/ListJobTemplatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListJobTemplates)
+
+responseListManagedEndpoints :: ListManagedEndpointsResponse -> TestTree
+responseListManagedEndpoints =
+  res
+    "ListManagedEndpointsResponse"
+    "fixture/ListManagedEndpointsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListManagedEndpoints)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseListVirtualClusters :: ListVirtualClustersResponse -> TestTree
+responseListVirtualClusters =
+  res
+    "ListVirtualClustersResponse"
+    "fixture/ListVirtualClustersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVirtualClusters)
+
+responseStartJobRun :: StartJobRunResponse -> TestTree
+responseStartJobRun =
+  res
+    "StartJobRunResponse"
+    "fixture/StartJobRunResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartJobRun)
+
+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)
