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 Managed Streaming for Kafka SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2018-11-14@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-kafka)
+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.Kafka](http://hackage.haskell.org/package/amazonka-kafka/docs/Amazonka-Kafka.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-kafka` 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-kafka.cabal b/amazonka-kafka.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-kafka.cabal
@@ -0,0 +1,182 @@
+cabal-version:      2.2
+name:               amazonka-kafka
+version:            2.0
+synopsis:           Amazon Managed Streaming for Kafka 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 @2018-11-14@ 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.Kafka.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.Kafka" 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-kafka
+
+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.Kafka
+    Amazonka.Kafka.BatchAssociateScramSecret
+    Amazonka.Kafka.BatchDisassociateScramSecret
+    Amazonka.Kafka.CreateCluster
+    Amazonka.Kafka.CreateClusterV2
+    Amazonka.Kafka.CreateConfiguration
+    Amazonka.Kafka.DeleteCluster
+    Amazonka.Kafka.DeleteConfiguration
+    Amazonka.Kafka.DescribeCluster
+    Amazonka.Kafka.DescribeClusterOperation
+    Amazonka.Kafka.DescribeClusterV2
+    Amazonka.Kafka.DescribeConfiguration
+    Amazonka.Kafka.DescribeConfigurationRevision
+    Amazonka.Kafka.GetBootstrapBrokers
+    Amazonka.Kafka.GetCompatibleKafkaVersions
+    Amazonka.Kafka.Lens
+    Amazonka.Kafka.ListClusterOperations
+    Amazonka.Kafka.ListClusters
+    Amazonka.Kafka.ListClustersV2
+    Amazonka.Kafka.ListConfigurationRevisions
+    Amazonka.Kafka.ListConfigurations
+    Amazonka.Kafka.ListKafkaVersions
+    Amazonka.Kafka.ListNodes
+    Amazonka.Kafka.ListScramSecrets
+    Amazonka.Kafka.ListTagsForResource
+    Amazonka.Kafka.RebootBroker
+    Amazonka.Kafka.TagResource
+    Amazonka.Kafka.Types
+    Amazonka.Kafka.Types.BrokerAZDistribution
+    Amazonka.Kafka.Types.BrokerEBSVolumeInfo
+    Amazonka.Kafka.Types.BrokerLogs
+    Amazonka.Kafka.Types.BrokerNodeGroupInfo
+    Amazonka.Kafka.Types.BrokerNodeInfo
+    Amazonka.Kafka.Types.BrokerSoftwareInfo
+    Amazonka.Kafka.Types.ClientAuthentication
+    Amazonka.Kafka.Types.ClientBroker
+    Amazonka.Kafka.Types.CloudWatchLogs
+    Amazonka.Kafka.Types.Cluster
+    Amazonka.Kafka.Types.ClusterInfo
+    Amazonka.Kafka.Types.ClusterOperationInfo
+    Amazonka.Kafka.Types.ClusterOperationStep
+    Amazonka.Kafka.Types.ClusterOperationStepInfo
+    Amazonka.Kafka.Types.ClusterState
+    Amazonka.Kafka.Types.ClusterType
+    Amazonka.Kafka.Types.CompatibleKafkaVersion
+    Amazonka.Kafka.Types.Configuration
+    Amazonka.Kafka.Types.ConfigurationInfo
+    Amazonka.Kafka.Types.ConfigurationRevision
+    Amazonka.Kafka.Types.ConfigurationState
+    Amazonka.Kafka.Types.ConnectivityInfo
+    Amazonka.Kafka.Types.EBSStorageInfo
+    Amazonka.Kafka.Types.EncryptionAtRest
+    Amazonka.Kafka.Types.EncryptionInfo
+    Amazonka.Kafka.Types.EncryptionInTransit
+    Amazonka.Kafka.Types.EnhancedMonitoring
+    Amazonka.Kafka.Types.ErrorInfo
+    Amazonka.Kafka.Types.Firehose
+    Amazonka.Kafka.Types.Iam
+    Amazonka.Kafka.Types.JmxExporter
+    Amazonka.Kafka.Types.JmxExporterInfo
+    Amazonka.Kafka.Types.KafkaVersion
+    Amazonka.Kafka.Types.KafkaVersionStatus
+    Amazonka.Kafka.Types.LoggingInfo
+    Amazonka.Kafka.Types.MutableClusterInfo
+    Amazonka.Kafka.Types.NodeExporter
+    Amazonka.Kafka.Types.NodeExporterInfo
+    Amazonka.Kafka.Types.NodeInfo
+    Amazonka.Kafka.Types.NodeType
+    Amazonka.Kafka.Types.OpenMonitoring
+    Amazonka.Kafka.Types.OpenMonitoringInfo
+    Amazonka.Kafka.Types.Prometheus
+    Amazonka.Kafka.Types.PrometheusInfo
+    Amazonka.Kafka.Types.Provisioned
+    Amazonka.Kafka.Types.ProvisionedRequest
+    Amazonka.Kafka.Types.ProvisionedThroughput
+    Amazonka.Kafka.Types.PublicAccess
+    Amazonka.Kafka.Types.S3
+    Amazonka.Kafka.Types.Sasl
+    Amazonka.Kafka.Types.Scram
+    Amazonka.Kafka.Types.Serverless
+    Amazonka.Kafka.Types.ServerlessClientAuthentication
+    Amazonka.Kafka.Types.ServerlessRequest
+    Amazonka.Kafka.Types.ServerlessSasl
+    Amazonka.Kafka.Types.StateInfo
+    Amazonka.Kafka.Types.StorageInfo
+    Amazonka.Kafka.Types.StorageMode
+    Amazonka.Kafka.Types.Tls
+    Amazonka.Kafka.Types.Unauthenticated
+    Amazonka.Kafka.Types.UnprocessedScramSecret
+    Amazonka.Kafka.Types.VpcConfig
+    Amazonka.Kafka.Types.ZookeeperNodeInfo
+    Amazonka.Kafka.UntagResource
+    Amazonka.Kafka.UpdateBrokerCount
+    Amazonka.Kafka.UpdateBrokerStorage
+    Amazonka.Kafka.UpdateBrokerType
+    Amazonka.Kafka.UpdateClusterConfiguration
+    Amazonka.Kafka.UpdateClusterKafkaVersion
+    Amazonka.Kafka.UpdateConfiguration
+    Amazonka.Kafka.UpdateConnectivity
+    Amazonka.Kafka.UpdateMonitoring
+    Amazonka.Kafka.UpdateSecurity
+    Amazonka.Kafka.UpdateStorage
+    Amazonka.Kafka.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-kafka-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.Gen.Kafka
+    Test.Amazonka.Kafka
+    Test.Amazonka.Kafka.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-kafka
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchAssociateScramSecret.yaml b/fixture/BatchAssociateScramSecret.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchAssociateScramSecret.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/BatchAssociateScramSecretResponse.proto b/fixture/BatchAssociateScramSecretResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchAssociateScramSecretResponse.proto
diff --git a/fixture/BatchDisassociateScramSecret.yaml b/fixture/BatchDisassociateScramSecret.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDisassociateScramSecret.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/BatchDisassociateScramSecretResponse.proto b/fixture/BatchDisassociateScramSecretResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDisassociateScramSecretResponse.proto
diff --git a/fixture/CreateCluster.yaml b/fixture/CreateCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/CreateClusterResponse.proto b/fixture/CreateClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateClusterResponse.proto
diff --git a/fixture/CreateClusterV2.yaml b/fixture/CreateClusterV2.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateClusterV2.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/CreateClusterV2Response.proto b/fixture/CreateClusterV2Response.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateClusterV2Response.proto
diff --git a/fixture/CreateConfiguration.yaml b/fixture/CreateConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/CreateConfigurationResponse.proto b/fixture/CreateConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateConfigurationResponse.proto
diff --git a/fixture/DeleteCluster.yaml b/fixture/DeleteCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DeleteClusterResponse.proto b/fixture/DeleteClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteClusterResponse.proto
diff --git a/fixture/DeleteConfiguration.yaml b/fixture/DeleteConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DeleteConfigurationResponse.proto b/fixture/DeleteConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteConfigurationResponse.proto
diff --git a/fixture/DescribeCluster.yaml b/fixture/DescribeCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DescribeClusterOperation.yaml b/fixture/DescribeClusterOperation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusterOperation.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DescribeClusterOperationResponse.proto b/fixture/DescribeClusterOperationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusterOperationResponse.proto
diff --git a/fixture/DescribeClusterResponse.proto b/fixture/DescribeClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusterResponse.proto
diff --git a/fixture/DescribeClusterV2.yaml b/fixture/DescribeClusterV2.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusterV2.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DescribeClusterV2Response.proto b/fixture/DescribeClusterV2Response.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusterV2Response.proto
diff --git a/fixture/DescribeConfiguration.yaml b/fixture/DescribeConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DescribeConfigurationResponse.proto b/fixture/DescribeConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeConfigurationResponse.proto
diff --git a/fixture/DescribeConfigurationRevision.yaml b/fixture/DescribeConfigurationRevision.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeConfigurationRevision.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/DescribeConfigurationRevisionResponse.proto b/fixture/DescribeConfigurationRevisionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeConfigurationRevisionResponse.proto
diff --git a/fixture/GetBootstrapBrokers.yaml b/fixture/GetBootstrapBrokers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetBootstrapBrokers.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/GetBootstrapBrokersResponse.proto b/fixture/GetBootstrapBrokersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetBootstrapBrokersResponse.proto
diff --git a/fixture/GetCompatibleKafkaVersions.yaml b/fixture/GetCompatibleKafkaVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCompatibleKafkaVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/GetCompatibleKafkaVersionsResponse.proto b/fixture/GetCompatibleKafkaVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCompatibleKafkaVersionsResponse.proto
diff --git a/fixture/ListClusterOperations.yaml b/fixture/ListClusterOperations.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListClusterOperations.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListClusterOperationsResponse.proto b/fixture/ListClusterOperationsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListClusterOperationsResponse.proto
diff --git a/fixture/ListClusters.yaml b/fixture/ListClusters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListClusters.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListClustersResponse.proto b/fixture/ListClustersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListClustersResponse.proto
diff --git a/fixture/ListClustersV2.yaml b/fixture/ListClustersV2.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListClustersV2.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListClustersV2Response.proto b/fixture/ListClustersV2Response.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListClustersV2Response.proto
diff --git a/fixture/ListConfigurationRevisions.yaml b/fixture/ListConfigurationRevisions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListConfigurationRevisions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListConfigurationRevisionsResponse.proto b/fixture/ListConfigurationRevisionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListConfigurationRevisionsResponse.proto
diff --git a/fixture/ListConfigurations.yaml b/fixture/ListConfigurations.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListConfigurations.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListConfigurationsResponse.proto b/fixture/ListConfigurationsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListConfigurationsResponse.proto
diff --git a/fixture/ListKafkaVersions.yaml b/fixture/ListKafkaVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListKafkaVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListKafkaVersionsResponse.proto b/fixture/ListKafkaVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListKafkaVersionsResponse.proto
diff --git a/fixture/ListNodes.yaml b/fixture/ListNodes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListNodes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListNodesResponse.proto b/fixture/ListNodesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListNodesResponse.proto
diff --git a/fixture/ListScramSecrets.yaml b/fixture/ListScramSecrets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListScramSecrets.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/ListScramSecretsResponse.proto b/fixture/ListScramSecretsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListScramSecretsResponse.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/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/RebootBroker.yaml b/fixture/RebootBroker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RebootBroker.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/RebootBrokerResponse.proto b/fixture/RebootBrokerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RebootBrokerResponse.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/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateBrokerCount.yaml b/fixture/UpdateBrokerCount.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateBrokerCount.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateBrokerCountResponse.proto b/fixture/UpdateBrokerCountResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateBrokerCountResponse.proto
diff --git a/fixture/UpdateBrokerStorage.yaml b/fixture/UpdateBrokerStorage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateBrokerStorage.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateBrokerStorageResponse.proto b/fixture/UpdateBrokerStorageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateBrokerStorageResponse.proto
diff --git a/fixture/UpdateBrokerType.yaml b/fixture/UpdateBrokerType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateBrokerType.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateBrokerTypeResponse.proto b/fixture/UpdateBrokerTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateBrokerTypeResponse.proto
diff --git a/fixture/UpdateClusterConfiguration.yaml b/fixture/UpdateClusterConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateClusterConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateClusterConfigurationResponse.proto b/fixture/UpdateClusterConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateClusterConfigurationResponse.proto
diff --git a/fixture/UpdateClusterKafkaVersion.yaml b/fixture/UpdateClusterKafkaVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateClusterKafkaVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateClusterKafkaVersionResponse.proto b/fixture/UpdateClusterKafkaVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateClusterKafkaVersionResponse.proto
diff --git a/fixture/UpdateConfiguration.yaml b/fixture/UpdateConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateConfigurationResponse.proto b/fixture/UpdateConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConfigurationResponse.proto
diff --git a/fixture/UpdateConnectivity.yaml b/fixture/UpdateConnectivity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConnectivity.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateConnectivityResponse.proto b/fixture/UpdateConnectivityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConnectivityResponse.proto
diff --git a/fixture/UpdateMonitoring.yaml b/fixture/UpdateMonitoring.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMonitoring.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateMonitoringResponse.proto b/fixture/UpdateMonitoringResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMonitoringResponse.proto
diff --git a/fixture/UpdateSecurity.yaml b/fixture/UpdateSecurity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSecurity.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateSecurityResponse.proto b/fixture/UpdateSecurityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSecurityResponse.proto
diff --git a/fixture/UpdateStorage.yaml b/fixture/UpdateStorage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateStorage.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/kafka/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  kafka.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/UpdateStorageResponse.proto b/fixture/UpdateStorageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateStorageResponse.proto
diff --git a/gen/Amazonka/Kafka.hs b/gen/Amazonka/Kafka.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka.hs
@@ -0,0 +1,580 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Kafka
+-- 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 @2018-11-14@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- The operations for managing an Amazon MSK cluster.
+module Amazonka.Kafka
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** BadRequestException
+    _BadRequestException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** ForbiddenException
+    _ForbiddenException,
+
+    -- ** InternalServerErrorException
+    _InternalServerErrorException,
+
+    -- ** NotFoundException
+    _NotFoundException,
+
+    -- ** ServiceUnavailableException
+    _ServiceUnavailableException,
+
+    -- ** TooManyRequestsException
+    _TooManyRequestsException,
+
+    -- ** UnauthorizedException
+    _UnauthorizedException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchAssociateScramSecret
+    BatchAssociateScramSecret (BatchAssociateScramSecret'),
+    newBatchAssociateScramSecret,
+    BatchAssociateScramSecretResponse (BatchAssociateScramSecretResponse'),
+    newBatchAssociateScramSecretResponse,
+
+    -- ** BatchDisassociateScramSecret
+    BatchDisassociateScramSecret (BatchDisassociateScramSecret'),
+    newBatchDisassociateScramSecret,
+    BatchDisassociateScramSecretResponse (BatchDisassociateScramSecretResponse'),
+    newBatchDisassociateScramSecretResponse,
+
+    -- ** CreateCluster
+    CreateCluster (CreateCluster'),
+    newCreateCluster,
+    CreateClusterResponse (CreateClusterResponse'),
+    newCreateClusterResponse,
+
+    -- ** CreateClusterV2
+    CreateClusterV2 (CreateClusterV2'),
+    newCreateClusterV2,
+    CreateClusterV2Response (CreateClusterV2Response'),
+    newCreateClusterV2Response,
+
+    -- ** CreateConfiguration
+    CreateConfiguration (CreateConfiguration'),
+    newCreateConfiguration,
+    CreateConfigurationResponse (CreateConfigurationResponse'),
+    newCreateConfigurationResponse,
+
+    -- ** DeleteCluster
+    DeleteCluster (DeleteCluster'),
+    newDeleteCluster,
+    DeleteClusterResponse (DeleteClusterResponse'),
+    newDeleteClusterResponse,
+
+    -- ** DeleteConfiguration
+    DeleteConfiguration (DeleteConfiguration'),
+    newDeleteConfiguration,
+    DeleteConfigurationResponse (DeleteConfigurationResponse'),
+    newDeleteConfigurationResponse,
+
+    -- ** DescribeCluster
+    DescribeCluster (DescribeCluster'),
+    newDescribeCluster,
+    DescribeClusterResponse (DescribeClusterResponse'),
+    newDescribeClusterResponse,
+
+    -- ** DescribeClusterOperation
+    DescribeClusterOperation (DescribeClusterOperation'),
+    newDescribeClusterOperation,
+    DescribeClusterOperationResponse (DescribeClusterOperationResponse'),
+    newDescribeClusterOperationResponse,
+
+    -- ** DescribeClusterV2
+    DescribeClusterV2 (DescribeClusterV2'),
+    newDescribeClusterV2,
+    DescribeClusterV2Response (DescribeClusterV2Response'),
+    newDescribeClusterV2Response,
+
+    -- ** DescribeConfiguration
+    DescribeConfiguration (DescribeConfiguration'),
+    newDescribeConfiguration,
+    DescribeConfigurationResponse (DescribeConfigurationResponse'),
+    newDescribeConfigurationResponse,
+
+    -- ** DescribeConfigurationRevision
+    DescribeConfigurationRevision (DescribeConfigurationRevision'),
+    newDescribeConfigurationRevision,
+    DescribeConfigurationRevisionResponse (DescribeConfigurationRevisionResponse'),
+    newDescribeConfigurationRevisionResponse,
+
+    -- ** GetBootstrapBrokers
+    GetBootstrapBrokers (GetBootstrapBrokers'),
+    newGetBootstrapBrokers,
+    GetBootstrapBrokersResponse (GetBootstrapBrokersResponse'),
+    newGetBootstrapBrokersResponse,
+
+    -- ** GetCompatibleKafkaVersions
+    GetCompatibleKafkaVersions (GetCompatibleKafkaVersions'),
+    newGetCompatibleKafkaVersions,
+    GetCompatibleKafkaVersionsResponse (GetCompatibleKafkaVersionsResponse'),
+    newGetCompatibleKafkaVersionsResponse,
+
+    -- ** ListClusterOperations (Paginated)
+    ListClusterOperations (ListClusterOperations'),
+    newListClusterOperations,
+    ListClusterOperationsResponse (ListClusterOperationsResponse'),
+    newListClusterOperationsResponse,
+
+    -- ** ListClusters (Paginated)
+    ListClusters (ListClusters'),
+    newListClusters,
+    ListClustersResponse (ListClustersResponse'),
+    newListClustersResponse,
+
+    -- ** ListClustersV2 (Paginated)
+    ListClustersV2 (ListClustersV2'),
+    newListClustersV2,
+    ListClustersV2Response (ListClustersV2Response'),
+    newListClustersV2Response,
+
+    -- ** ListConfigurationRevisions (Paginated)
+    ListConfigurationRevisions (ListConfigurationRevisions'),
+    newListConfigurationRevisions,
+    ListConfigurationRevisionsResponse (ListConfigurationRevisionsResponse'),
+    newListConfigurationRevisionsResponse,
+
+    -- ** ListConfigurations (Paginated)
+    ListConfigurations (ListConfigurations'),
+    newListConfigurations,
+    ListConfigurationsResponse (ListConfigurationsResponse'),
+    newListConfigurationsResponse,
+
+    -- ** ListKafkaVersions (Paginated)
+    ListKafkaVersions (ListKafkaVersions'),
+    newListKafkaVersions,
+    ListKafkaVersionsResponse (ListKafkaVersionsResponse'),
+    newListKafkaVersionsResponse,
+
+    -- ** ListNodes (Paginated)
+    ListNodes (ListNodes'),
+    newListNodes,
+    ListNodesResponse (ListNodesResponse'),
+    newListNodesResponse,
+
+    -- ** ListScramSecrets (Paginated)
+    ListScramSecrets (ListScramSecrets'),
+    newListScramSecrets,
+    ListScramSecretsResponse (ListScramSecretsResponse'),
+    newListScramSecretsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** RebootBroker
+    RebootBroker (RebootBroker'),
+    newRebootBroker,
+    RebootBrokerResponse (RebootBrokerResponse'),
+    newRebootBrokerResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateBrokerCount
+    UpdateBrokerCount (UpdateBrokerCount'),
+    newUpdateBrokerCount,
+    UpdateBrokerCountResponse (UpdateBrokerCountResponse'),
+    newUpdateBrokerCountResponse,
+
+    -- ** UpdateBrokerStorage
+    UpdateBrokerStorage (UpdateBrokerStorage'),
+    newUpdateBrokerStorage,
+    UpdateBrokerStorageResponse (UpdateBrokerStorageResponse'),
+    newUpdateBrokerStorageResponse,
+
+    -- ** UpdateBrokerType
+    UpdateBrokerType (UpdateBrokerType'),
+    newUpdateBrokerType,
+    UpdateBrokerTypeResponse (UpdateBrokerTypeResponse'),
+    newUpdateBrokerTypeResponse,
+
+    -- ** UpdateClusterConfiguration
+    UpdateClusterConfiguration (UpdateClusterConfiguration'),
+    newUpdateClusterConfiguration,
+    UpdateClusterConfigurationResponse (UpdateClusterConfigurationResponse'),
+    newUpdateClusterConfigurationResponse,
+
+    -- ** UpdateClusterKafkaVersion
+    UpdateClusterKafkaVersion (UpdateClusterKafkaVersion'),
+    newUpdateClusterKafkaVersion,
+    UpdateClusterKafkaVersionResponse (UpdateClusterKafkaVersionResponse'),
+    newUpdateClusterKafkaVersionResponse,
+
+    -- ** UpdateConfiguration
+    UpdateConfiguration (UpdateConfiguration'),
+    newUpdateConfiguration,
+    UpdateConfigurationResponse (UpdateConfigurationResponse'),
+    newUpdateConfigurationResponse,
+
+    -- ** UpdateConnectivity
+    UpdateConnectivity (UpdateConnectivity'),
+    newUpdateConnectivity,
+    UpdateConnectivityResponse (UpdateConnectivityResponse'),
+    newUpdateConnectivityResponse,
+
+    -- ** UpdateMonitoring
+    UpdateMonitoring (UpdateMonitoring'),
+    newUpdateMonitoring,
+    UpdateMonitoringResponse (UpdateMonitoringResponse'),
+    newUpdateMonitoringResponse,
+
+    -- ** UpdateSecurity
+    UpdateSecurity (UpdateSecurity'),
+    newUpdateSecurity,
+    UpdateSecurityResponse (UpdateSecurityResponse'),
+    newUpdateSecurityResponse,
+
+    -- ** UpdateStorage
+    UpdateStorage (UpdateStorage'),
+    newUpdateStorage,
+    UpdateStorageResponse (UpdateStorageResponse'),
+    newUpdateStorageResponse,
+
+    -- * Types
+
+    -- ** BrokerAZDistribution
+    BrokerAZDistribution (..),
+
+    -- ** ClientBroker
+    ClientBroker (..),
+
+    -- ** ClusterState
+    ClusterState (..),
+
+    -- ** ClusterType
+    ClusterType (..),
+
+    -- ** ConfigurationState
+    ConfigurationState (..),
+
+    -- ** EnhancedMonitoring
+    EnhancedMonitoring (..),
+
+    -- ** KafkaVersionStatus
+    KafkaVersionStatus (..),
+
+    -- ** NodeType
+    NodeType (..),
+
+    -- ** StorageMode
+    StorageMode (..),
+
+    -- ** BrokerEBSVolumeInfo
+    BrokerEBSVolumeInfo (BrokerEBSVolumeInfo'),
+    newBrokerEBSVolumeInfo,
+
+    -- ** BrokerLogs
+    BrokerLogs (BrokerLogs'),
+    newBrokerLogs,
+
+    -- ** BrokerNodeGroupInfo
+    BrokerNodeGroupInfo (BrokerNodeGroupInfo'),
+    newBrokerNodeGroupInfo,
+
+    -- ** BrokerNodeInfo
+    BrokerNodeInfo (BrokerNodeInfo'),
+    newBrokerNodeInfo,
+
+    -- ** BrokerSoftwareInfo
+    BrokerSoftwareInfo (BrokerSoftwareInfo'),
+    newBrokerSoftwareInfo,
+
+    -- ** ClientAuthentication
+    ClientAuthentication (ClientAuthentication'),
+    newClientAuthentication,
+
+    -- ** CloudWatchLogs
+    CloudWatchLogs (CloudWatchLogs'),
+    newCloudWatchLogs,
+
+    -- ** Cluster
+    Cluster (Cluster'),
+    newCluster,
+
+    -- ** ClusterInfo
+    ClusterInfo (ClusterInfo'),
+    newClusterInfo,
+
+    -- ** ClusterOperationInfo
+    ClusterOperationInfo (ClusterOperationInfo'),
+    newClusterOperationInfo,
+
+    -- ** ClusterOperationStep
+    ClusterOperationStep (ClusterOperationStep'),
+    newClusterOperationStep,
+
+    -- ** ClusterOperationStepInfo
+    ClusterOperationStepInfo (ClusterOperationStepInfo'),
+    newClusterOperationStepInfo,
+
+    -- ** CompatibleKafkaVersion
+    CompatibleKafkaVersion (CompatibleKafkaVersion'),
+    newCompatibleKafkaVersion,
+
+    -- ** Configuration
+    Configuration (Configuration'),
+    newConfiguration,
+
+    -- ** ConfigurationInfo
+    ConfigurationInfo (ConfigurationInfo'),
+    newConfigurationInfo,
+
+    -- ** ConfigurationRevision
+    ConfigurationRevision (ConfigurationRevision'),
+    newConfigurationRevision,
+
+    -- ** ConnectivityInfo
+    ConnectivityInfo (ConnectivityInfo'),
+    newConnectivityInfo,
+
+    -- ** EBSStorageInfo
+    EBSStorageInfo (EBSStorageInfo'),
+    newEBSStorageInfo,
+
+    -- ** EncryptionAtRest
+    EncryptionAtRest (EncryptionAtRest'),
+    newEncryptionAtRest,
+
+    -- ** EncryptionInTransit
+    EncryptionInTransit (EncryptionInTransit'),
+    newEncryptionInTransit,
+
+    -- ** EncryptionInfo
+    EncryptionInfo (EncryptionInfo'),
+    newEncryptionInfo,
+
+    -- ** ErrorInfo
+    ErrorInfo (ErrorInfo'),
+    newErrorInfo,
+
+    -- ** Firehose
+    Firehose (Firehose'),
+    newFirehose,
+
+    -- ** Iam
+    Iam (Iam'),
+    newIam,
+
+    -- ** JmxExporter
+    JmxExporter (JmxExporter'),
+    newJmxExporter,
+
+    -- ** JmxExporterInfo
+    JmxExporterInfo (JmxExporterInfo'),
+    newJmxExporterInfo,
+
+    -- ** KafkaVersion
+    KafkaVersion (KafkaVersion'),
+    newKafkaVersion,
+
+    -- ** LoggingInfo
+    LoggingInfo (LoggingInfo'),
+    newLoggingInfo,
+
+    -- ** MutableClusterInfo
+    MutableClusterInfo (MutableClusterInfo'),
+    newMutableClusterInfo,
+
+    -- ** NodeExporter
+    NodeExporter (NodeExporter'),
+    newNodeExporter,
+
+    -- ** NodeExporterInfo
+    NodeExporterInfo (NodeExporterInfo'),
+    newNodeExporterInfo,
+
+    -- ** NodeInfo
+    NodeInfo (NodeInfo'),
+    newNodeInfo,
+
+    -- ** OpenMonitoring
+    OpenMonitoring (OpenMonitoring'),
+    newOpenMonitoring,
+
+    -- ** OpenMonitoringInfo
+    OpenMonitoringInfo (OpenMonitoringInfo'),
+    newOpenMonitoringInfo,
+
+    -- ** Prometheus
+    Prometheus (Prometheus'),
+    newPrometheus,
+
+    -- ** PrometheusInfo
+    PrometheusInfo (PrometheusInfo'),
+    newPrometheusInfo,
+
+    -- ** Provisioned
+    Provisioned (Provisioned'),
+    newProvisioned,
+
+    -- ** ProvisionedRequest
+    ProvisionedRequest (ProvisionedRequest'),
+    newProvisionedRequest,
+
+    -- ** ProvisionedThroughput
+    ProvisionedThroughput (ProvisionedThroughput'),
+    newProvisionedThroughput,
+
+    -- ** PublicAccess
+    PublicAccess (PublicAccess'),
+    newPublicAccess,
+
+    -- ** S3
+    S3 (S3'),
+    newS3,
+
+    -- ** Sasl
+    Sasl (Sasl'),
+    newSasl,
+
+    -- ** Scram
+    Scram (Scram'),
+    newScram,
+
+    -- ** Serverless
+    Serverless (Serverless'),
+    newServerless,
+
+    -- ** ServerlessClientAuthentication
+    ServerlessClientAuthentication (ServerlessClientAuthentication'),
+    newServerlessClientAuthentication,
+
+    -- ** ServerlessRequest
+    ServerlessRequest (ServerlessRequest'),
+    newServerlessRequest,
+
+    -- ** ServerlessSasl
+    ServerlessSasl (ServerlessSasl'),
+    newServerlessSasl,
+
+    -- ** StateInfo
+    StateInfo (StateInfo'),
+    newStateInfo,
+
+    -- ** StorageInfo
+    StorageInfo (StorageInfo'),
+    newStorageInfo,
+
+    -- ** Tls
+    Tls (Tls'),
+    newTls,
+
+    -- ** Unauthenticated
+    Unauthenticated (Unauthenticated'),
+    newUnauthenticated,
+
+    -- ** UnprocessedScramSecret
+    UnprocessedScramSecret (UnprocessedScramSecret'),
+    newUnprocessedScramSecret,
+
+    -- ** VpcConfig
+    VpcConfig (VpcConfig'),
+    newVpcConfig,
+
+    -- ** ZookeeperNodeInfo
+    ZookeeperNodeInfo (ZookeeperNodeInfo'),
+    newZookeeperNodeInfo,
+  )
+where
+
+import Amazonka.Kafka.BatchAssociateScramSecret
+import Amazonka.Kafka.BatchDisassociateScramSecret
+import Amazonka.Kafka.CreateCluster
+import Amazonka.Kafka.CreateClusterV2
+import Amazonka.Kafka.CreateConfiguration
+import Amazonka.Kafka.DeleteCluster
+import Amazonka.Kafka.DeleteConfiguration
+import Amazonka.Kafka.DescribeCluster
+import Amazonka.Kafka.DescribeClusterOperation
+import Amazonka.Kafka.DescribeClusterV2
+import Amazonka.Kafka.DescribeConfiguration
+import Amazonka.Kafka.DescribeConfigurationRevision
+import Amazonka.Kafka.GetBootstrapBrokers
+import Amazonka.Kafka.GetCompatibleKafkaVersions
+import Amazonka.Kafka.Lens
+import Amazonka.Kafka.ListClusterOperations
+import Amazonka.Kafka.ListClusters
+import Amazonka.Kafka.ListClustersV2
+import Amazonka.Kafka.ListConfigurationRevisions
+import Amazonka.Kafka.ListConfigurations
+import Amazonka.Kafka.ListKafkaVersions
+import Amazonka.Kafka.ListNodes
+import Amazonka.Kafka.ListScramSecrets
+import Amazonka.Kafka.ListTagsForResource
+import Amazonka.Kafka.RebootBroker
+import Amazonka.Kafka.TagResource
+import Amazonka.Kafka.Types
+import Amazonka.Kafka.UntagResource
+import Amazonka.Kafka.UpdateBrokerCount
+import Amazonka.Kafka.UpdateBrokerStorage
+import Amazonka.Kafka.UpdateBrokerType
+import Amazonka.Kafka.UpdateClusterConfiguration
+import Amazonka.Kafka.UpdateClusterKafkaVersion
+import Amazonka.Kafka.UpdateConfiguration
+import Amazonka.Kafka.UpdateConnectivity
+import Amazonka.Kafka.UpdateMonitoring
+import Amazonka.Kafka.UpdateSecurity
+import Amazonka.Kafka.UpdateStorage
+import Amazonka.Kafka.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 'Kafka'.
+
+-- $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/Kafka/BatchAssociateScramSecret.hs b/gen/Amazonka/Kafka/BatchAssociateScramSecret.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/BatchAssociateScramSecret.hs
@@ -0,0 +1,209 @@
+{-# 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.Kafka.BatchAssociateScramSecret
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates one or more Scram Secrets with an Amazon MSK cluster.
+module Amazonka.Kafka.BatchAssociateScramSecret
+  ( -- * Creating a Request
+    BatchAssociateScramSecret (..),
+    newBatchAssociateScramSecret,
+
+    -- * Request Lenses
+    batchAssociateScramSecret_clusterArn,
+    batchAssociateScramSecret_secretArnList,
+
+    -- * Destructuring the Response
+    BatchAssociateScramSecretResponse (..),
+    newBatchAssociateScramSecretResponse,
+
+    -- * Response Lenses
+    batchAssociateScramSecretResponse_clusterArn,
+    batchAssociateScramSecretResponse_unprocessedScramSecrets,
+    batchAssociateScramSecretResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Associates sasl scram secrets to cluster.
+--
+-- /See:/ 'newBatchAssociateScramSecret' smart constructor.
+data BatchAssociateScramSecret = BatchAssociateScramSecret'
+  { -- | The Amazon Resource Name (ARN) of the cluster to be updated.
+    clusterArn :: Prelude.Text,
+    -- | List of AWS Secrets Manager secret ARNs.
+    secretArnList :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchAssociateScramSecret' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'batchAssociateScramSecret_clusterArn' - The Amazon Resource Name (ARN) of the cluster to be updated.
+--
+-- 'secretArnList', 'batchAssociateScramSecret_secretArnList' - List of AWS Secrets Manager secret ARNs.
+newBatchAssociateScramSecret ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  BatchAssociateScramSecret
+newBatchAssociateScramSecret pClusterArn_ =
+  BatchAssociateScramSecret'
+    { clusterArn =
+        pClusterArn_,
+      secretArnList = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster to be updated.
+batchAssociateScramSecret_clusterArn :: Lens.Lens' BatchAssociateScramSecret Prelude.Text
+batchAssociateScramSecret_clusterArn = Lens.lens (\BatchAssociateScramSecret' {clusterArn} -> clusterArn) (\s@BatchAssociateScramSecret' {} a -> s {clusterArn = a} :: BatchAssociateScramSecret)
+
+-- | List of AWS Secrets Manager secret ARNs.
+batchAssociateScramSecret_secretArnList :: Lens.Lens' BatchAssociateScramSecret [Prelude.Text]
+batchAssociateScramSecret_secretArnList = Lens.lens (\BatchAssociateScramSecret' {secretArnList} -> secretArnList) (\s@BatchAssociateScramSecret' {} a -> s {secretArnList = a} :: BatchAssociateScramSecret) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchAssociateScramSecret where
+  type
+    AWSResponse BatchAssociateScramSecret =
+      BatchAssociateScramSecretResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchAssociateScramSecretResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> ( x
+                            Data..?> "unprocessedScramSecrets"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchAssociateScramSecret where
+  hashWithSalt _salt BatchAssociateScramSecret' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` secretArnList
+
+instance Prelude.NFData BatchAssociateScramSecret where
+  rnf BatchAssociateScramSecret' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf secretArnList
+
+instance Data.ToHeaders BatchAssociateScramSecret where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchAssociateScramSecret where
+  toJSON BatchAssociateScramSecret' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("secretArnList" Data..= secretArnList)
+          ]
+      )
+
+instance Data.ToPath BatchAssociateScramSecret where
+  toPath BatchAssociateScramSecret' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/scram-secrets"
+      ]
+
+instance Data.ToQuery BatchAssociateScramSecret where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchAssociateScramSecretResponse' smart constructor.
+data BatchAssociateScramSecretResponse = BatchAssociateScramSecretResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | List of errors when associating secrets to cluster.
+    unprocessedScramSecrets :: Prelude.Maybe [UnprocessedScramSecret],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchAssociateScramSecretResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'batchAssociateScramSecretResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'unprocessedScramSecrets', 'batchAssociateScramSecretResponse_unprocessedScramSecrets' - List of errors when associating secrets to cluster.
+--
+-- 'httpStatus', 'batchAssociateScramSecretResponse_httpStatus' - The response's http status code.
+newBatchAssociateScramSecretResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchAssociateScramSecretResponse
+newBatchAssociateScramSecretResponse pHttpStatus_ =
+  BatchAssociateScramSecretResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      unprocessedScramSecrets =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+batchAssociateScramSecretResponse_clusterArn :: Lens.Lens' BatchAssociateScramSecretResponse (Prelude.Maybe Prelude.Text)
+batchAssociateScramSecretResponse_clusterArn = Lens.lens (\BatchAssociateScramSecretResponse' {clusterArn} -> clusterArn) (\s@BatchAssociateScramSecretResponse' {} a -> s {clusterArn = a} :: BatchAssociateScramSecretResponse)
+
+-- | List of errors when associating secrets to cluster.
+batchAssociateScramSecretResponse_unprocessedScramSecrets :: Lens.Lens' BatchAssociateScramSecretResponse (Prelude.Maybe [UnprocessedScramSecret])
+batchAssociateScramSecretResponse_unprocessedScramSecrets = Lens.lens (\BatchAssociateScramSecretResponse' {unprocessedScramSecrets} -> unprocessedScramSecrets) (\s@BatchAssociateScramSecretResponse' {} a -> s {unprocessedScramSecrets = a} :: BatchAssociateScramSecretResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchAssociateScramSecretResponse_httpStatus :: Lens.Lens' BatchAssociateScramSecretResponse Prelude.Int
+batchAssociateScramSecretResponse_httpStatus = Lens.lens (\BatchAssociateScramSecretResponse' {httpStatus} -> httpStatus) (\s@BatchAssociateScramSecretResponse' {} a -> s {httpStatus = a} :: BatchAssociateScramSecretResponse)
+
+instance
+  Prelude.NFData
+    BatchAssociateScramSecretResponse
+  where
+  rnf BatchAssociateScramSecretResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf unprocessedScramSecrets
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/BatchDisassociateScramSecret.hs b/gen/Amazonka/Kafka/BatchDisassociateScramSecret.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/BatchDisassociateScramSecret.hs
@@ -0,0 +1,212 @@
+{-# 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.Kafka.BatchDisassociateScramSecret
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates one or more Scram Secrets from an Amazon MSK cluster.
+module Amazonka.Kafka.BatchDisassociateScramSecret
+  ( -- * Creating a Request
+    BatchDisassociateScramSecret (..),
+    newBatchDisassociateScramSecret,
+
+    -- * Request Lenses
+    batchDisassociateScramSecret_clusterArn,
+    batchDisassociateScramSecret_secretArnList,
+
+    -- * Destructuring the Response
+    BatchDisassociateScramSecretResponse (..),
+    newBatchDisassociateScramSecretResponse,
+
+    -- * Response Lenses
+    batchDisassociateScramSecretResponse_clusterArn,
+    batchDisassociateScramSecretResponse_unprocessedScramSecrets,
+    batchDisassociateScramSecretResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Disassociates sasl scram secrets to cluster.
+--
+-- /See:/ 'newBatchDisassociateScramSecret' smart constructor.
+data BatchDisassociateScramSecret = BatchDisassociateScramSecret'
+  { -- | The Amazon Resource Name (ARN) of the cluster to be updated.
+    clusterArn :: Prelude.Text,
+    -- | List of AWS Secrets Manager secret ARNs.
+    secretArnList :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDisassociateScramSecret' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'batchDisassociateScramSecret_clusterArn' - The Amazon Resource Name (ARN) of the cluster to be updated.
+--
+-- 'secretArnList', 'batchDisassociateScramSecret_secretArnList' - List of AWS Secrets Manager secret ARNs.
+newBatchDisassociateScramSecret ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  BatchDisassociateScramSecret
+newBatchDisassociateScramSecret pClusterArn_ =
+  BatchDisassociateScramSecret'
+    { clusterArn =
+        pClusterArn_,
+      secretArnList = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster to be updated.
+batchDisassociateScramSecret_clusterArn :: Lens.Lens' BatchDisassociateScramSecret Prelude.Text
+batchDisassociateScramSecret_clusterArn = Lens.lens (\BatchDisassociateScramSecret' {clusterArn} -> clusterArn) (\s@BatchDisassociateScramSecret' {} a -> s {clusterArn = a} :: BatchDisassociateScramSecret)
+
+-- | List of AWS Secrets Manager secret ARNs.
+batchDisassociateScramSecret_secretArnList :: Lens.Lens' BatchDisassociateScramSecret [Prelude.Text]
+batchDisassociateScramSecret_secretArnList = Lens.lens (\BatchDisassociateScramSecret' {secretArnList} -> secretArnList) (\s@BatchDisassociateScramSecret' {} a -> s {secretArnList = a} :: BatchDisassociateScramSecret) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchDisassociateScramSecret where
+  type
+    AWSResponse BatchDisassociateScramSecret =
+      BatchDisassociateScramSecretResponse
+  request overrides =
+    Request.patchJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDisassociateScramSecretResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> ( x
+                            Data..?> "unprocessedScramSecrets"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    BatchDisassociateScramSecret
+  where
+  hashWithSalt _salt BatchDisassociateScramSecret' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` secretArnList
+
+instance Prelude.NFData BatchDisassociateScramSecret where
+  rnf BatchDisassociateScramSecret' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf secretArnList
+
+instance Data.ToHeaders BatchDisassociateScramSecret where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchDisassociateScramSecret where
+  toJSON BatchDisassociateScramSecret' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("secretArnList" Data..= secretArnList)
+          ]
+      )
+
+instance Data.ToPath BatchDisassociateScramSecret where
+  toPath BatchDisassociateScramSecret' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/scram-secrets"
+      ]
+
+instance Data.ToQuery BatchDisassociateScramSecret where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchDisassociateScramSecretResponse' smart constructor.
+data BatchDisassociateScramSecretResponse = BatchDisassociateScramSecretResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | List of errors when disassociating secrets to cluster.
+    unprocessedScramSecrets :: Prelude.Maybe [UnprocessedScramSecret],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDisassociateScramSecretResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'batchDisassociateScramSecretResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'unprocessedScramSecrets', 'batchDisassociateScramSecretResponse_unprocessedScramSecrets' - List of errors when disassociating secrets to cluster.
+--
+-- 'httpStatus', 'batchDisassociateScramSecretResponse_httpStatus' - The response's http status code.
+newBatchDisassociateScramSecretResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchDisassociateScramSecretResponse
+newBatchDisassociateScramSecretResponse pHttpStatus_ =
+  BatchDisassociateScramSecretResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      unprocessedScramSecrets =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+batchDisassociateScramSecretResponse_clusterArn :: Lens.Lens' BatchDisassociateScramSecretResponse (Prelude.Maybe Prelude.Text)
+batchDisassociateScramSecretResponse_clusterArn = Lens.lens (\BatchDisassociateScramSecretResponse' {clusterArn} -> clusterArn) (\s@BatchDisassociateScramSecretResponse' {} a -> s {clusterArn = a} :: BatchDisassociateScramSecretResponse)
+
+-- | List of errors when disassociating secrets to cluster.
+batchDisassociateScramSecretResponse_unprocessedScramSecrets :: Lens.Lens' BatchDisassociateScramSecretResponse (Prelude.Maybe [UnprocessedScramSecret])
+batchDisassociateScramSecretResponse_unprocessedScramSecrets = Lens.lens (\BatchDisassociateScramSecretResponse' {unprocessedScramSecrets} -> unprocessedScramSecrets) (\s@BatchDisassociateScramSecretResponse' {} a -> s {unprocessedScramSecrets = a} :: BatchDisassociateScramSecretResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDisassociateScramSecretResponse_httpStatus :: Lens.Lens' BatchDisassociateScramSecretResponse Prelude.Int
+batchDisassociateScramSecretResponse_httpStatus = Lens.lens (\BatchDisassociateScramSecretResponse' {httpStatus} -> httpStatus) (\s@BatchDisassociateScramSecretResponse' {} a -> s {httpStatus = a} :: BatchDisassociateScramSecretResponse)
+
+instance
+  Prelude.NFData
+    BatchDisassociateScramSecretResponse
+  where
+  rnf BatchDisassociateScramSecretResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf unprocessedScramSecrets
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/CreateCluster.hs b/gen/Amazonka/Kafka/CreateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/CreateCluster.hs
@@ -0,0 +1,365 @@
+{-# 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.Kafka.CreateCluster
+-- 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 new MSK cluster.
+module Amazonka.Kafka.CreateCluster
+  ( -- * Creating a Request
+    CreateCluster (..),
+    newCreateCluster,
+
+    -- * Request Lenses
+    createCluster_clientAuthentication,
+    createCluster_configurationInfo,
+    createCluster_encryptionInfo,
+    createCluster_enhancedMonitoring,
+    createCluster_loggingInfo,
+    createCluster_openMonitoring,
+    createCluster_storageMode,
+    createCluster_tags,
+    createCluster_brokerNodeGroupInfo,
+    createCluster_kafkaVersion,
+    createCluster_numberOfBrokerNodes,
+    createCluster_clusterName,
+
+    -- * Destructuring the Response
+    CreateClusterResponse (..),
+    newCreateClusterResponse,
+
+    -- * Response Lenses
+    createClusterResponse_clusterArn,
+    createClusterResponse_clusterName,
+    createClusterResponse_state,
+    createClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateCluster' smart constructor.
+data CreateCluster = CreateCluster'
+  { -- | Includes all client authentication related information.
+    clientAuthentication :: Prelude.Maybe ClientAuthentication,
+    -- | Represents the configuration that you want MSK to use for the brokers in
+    -- a cluster.
+    configurationInfo :: Prelude.Maybe ConfigurationInfo,
+    -- | Includes all encryption-related information.
+    encryptionInfo :: Prelude.Maybe EncryptionInfo,
+    -- | Specifies the level of monitoring for the MSK cluster. The possible
+    -- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+    -- PER_TOPIC_PER_PARTITION.
+    enhancedMonitoring :: Prelude.Maybe EnhancedMonitoring,
+    loggingInfo :: Prelude.Maybe LoggingInfo,
+    -- | The settings for open monitoring.
+    openMonitoring :: Prelude.Maybe OpenMonitoringInfo,
+    -- | This controls storage mode for supported storage tiers.
+    storageMode :: Prelude.Maybe StorageMode,
+    -- | Create tags when creating the cluster.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Information about the broker nodes in the cluster.
+    brokerNodeGroupInfo :: BrokerNodeGroupInfo,
+    -- | The version of Apache Kafka.
+    kafkaVersion :: Prelude.Text,
+    -- | The number of broker nodes in the cluster.
+    numberOfBrokerNodes :: Prelude.Natural,
+    -- | The name of the cluster.
+    clusterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientAuthentication', 'createCluster_clientAuthentication' - Includes all client authentication related information.
+--
+-- 'configurationInfo', 'createCluster_configurationInfo' - Represents the configuration that you want MSK to use for the brokers in
+-- a cluster.
+--
+-- 'encryptionInfo', 'createCluster_encryptionInfo' - Includes all encryption-related information.
+--
+-- 'enhancedMonitoring', 'createCluster_enhancedMonitoring' - Specifies the level of monitoring for the MSK cluster. The possible
+-- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+-- PER_TOPIC_PER_PARTITION.
+--
+-- 'loggingInfo', 'createCluster_loggingInfo' - Undocumented member.
+--
+-- 'openMonitoring', 'createCluster_openMonitoring' - The settings for open monitoring.
+--
+-- 'storageMode', 'createCluster_storageMode' - This controls storage mode for supported storage tiers.
+--
+-- 'tags', 'createCluster_tags' - Create tags when creating the cluster.
+--
+-- 'brokerNodeGroupInfo', 'createCluster_brokerNodeGroupInfo' - Information about the broker nodes in the cluster.
+--
+-- 'kafkaVersion', 'createCluster_kafkaVersion' - The version of Apache Kafka.
+--
+-- 'numberOfBrokerNodes', 'createCluster_numberOfBrokerNodes' - The number of broker nodes in the cluster.
+--
+-- 'clusterName', 'createCluster_clusterName' - The name of the cluster.
+newCreateCluster ::
+  -- | 'brokerNodeGroupInfo'
+  BrokerNodeGroupInfo ->
+  -- | 'kafkaVersion'
+  Prelude.Text ->
+  -- | 'numberOfBrokerNodes'
+  Prelude.Natural ->
+  -- | 'clusterName'
+  Prelude.Text ->
+  CreateCluster
+newCreateCluster
+  pBrokerNodeGroupInfo_
+  pKafkaVersion_
+  pNumberOfBrokerNodes_
+  pClusterName_ =
+    CreateCluster'
+      { clientAuthentication =
+          Prelude.Nothing,
+        configurationInfo = Prelude.Nothing,
+        encryptionInfo = Prelude.Nothing,
+        enhancedMonitoring = Prelude.Nothing,
+        loggingInfo = Prelude.Nothing,
+        openMonitoring = Prelude.Nothing,
+        storageMode = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        brokerNodeGroupInfo = pBrokerNodeGroupInfo_,
+        kafkaVersion = pKafkaVersion_,
+        numberOfBrokerNodes = pNumberOfBrokerNodes_,
+        clusterName = pClusterName_
+      }
+
+-- | Includes all client authentication related information.
+createCluster_clientAuthentication :: Lens.Lens' CreateCluster (Prelude.Maybe ClientAuthentication)
+createCluster_clientAuthentication = Lens.lens (\CreateCluster' {clientAuthentication} -> clientAuthentication) (\s@CreateCluster' {} a -> s {clientAuthentication = a} :: CreateCluster)
+
+-- | Represents the configuration that you want MSK to use for the brokers in
+-- a cluster.
+createCluster_configurationInfo :: Lens.Lens' CreateCluster (Prelude.Maybe ConfigurationInfo)
+createCluster_configurationInfo = Lens.lens (\CreateCluster' {configurationInfo} -> configurationInfo) (\s@CreateCluster' {} a -> s {configurationInfo = a} :: CreateCluster)
+
+-- | Includes all encryption-related information.
+createCluster_encryptionInfo :: Lens.Lens' CreateCluster (Prelude.Maybe EncryptionInfo)
+createCluster_encryptionInfo = Lens.lens (\CreateCluster' {encryptionInfo} -> encryptionInfo) (\s@CreateCluster' {} a -> s {encryptionInfo = a} :: CreateCluster)
+
+-- | Specifies the level of monitoring for the MSK cluster. The possible
+-- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+-- PER_TOPIC_PER_PARTITION.
+createCluster_enhancedMonitoring :: Lens.Lens' CreateCluster (Prelude.Maybe EnhancedMonitoring)
+createCluster_enhancedMonitoring = Lens.lens (\CreateCluster' {enhancedMonitoring} -> enhancedMonitoring) (\s@CreateCluster' {} a -> s {enhancedMonitoring = a} :: CreateCluster)
+
+-- | Undocumented member.
+createCluster_loggingInfo :: Lens.Lens' CreateCluster (Prelude.Maybe LoggingInfo)
+createCluster_loggingInfo = Lens.lens (\CreateCluster' {loggingInfo} -> loggingInfo) (\s@CreateCluster' {} a -> s {loggingInfo = a} :: CreateCluster)
+
+-- | The settings for open monitoring.
+createCluster_openMonitoring :: Lens.Lens' CreateCluster (Prelude.Maybe OpenMonitoringInfo)
+createCluster_openMonitoring = Lens.lens (\CreateCluster' {openMonitoring} -> openMonitoring) (\s@CreateCluster' {} a -> s {openMonitoring = a} :: CreateCluster)
+
+-- | This controls storage mode for supported storage tiers.
+createCluster_storageMode :: Lens.Lens' CreateCluster (Prelude.Maybe StorageMode)
+createCluster_storageMode = Lens.lens (\CreateCluster' {storageMode} -> storageMode) (\s@CreateCluster' {} a -> s {storageMode = a} :: CreateCluster)
+
+-- | Create tags when creating the cluster.
+createCluster_tags :: Lens.Lens' CreateCluster (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createCluster_tags = Lens.lens (\CreateCluster' {tags} -> tags) (\s@CreateCluster' {} a -> s {tags = a} :: CreateCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | Information about the broker nodes in the cluster.
+createCluster_brokerNodeGroupInfo :: Lens.Lens' CreateCluster BrokerNodeGroupInfo
+createCluster_brokerNodeGroupInfo = Lens.lens (\CreateCluster' {brokerNodeGroupInfo} -> brokerNodeGroupInfo) (\s@CreateCluster' {} a -> s {brokerNodeGroupInfo = a} :: CreateCluster)
+
+-- | The version of Apache Kafka.
+createCluster_kafkaVersion :: Lens.Lens' CreateCluster Prelude.Text
+createCluster_kafkaVersion = Lens.lens (\CreateCluster' {kafkaVersion} -> kafkaVersion) (\s@CreateCluster' {} a -> s {kafkaVersion = a} :: CreateCluster)
+
+-- | The number of broker nodes in the cluster.
+createCluster_numberOfBrokerNodes :: Lens.Lens' CreateCluster Prelude.Natural
+createCluster_numberOfBrokerNodes = Lens.lens (\CreateCluster' {numberOfBrokerNodes} -> numberOfBrokerNodes) (\s@CreateCluster' {} a -> s {numberOfBrokerNodes = a} :: CreateCluster)
+
+-- | The name of the cluster.
+createCluster_clusterName :: Lens.Lens' CreateCluster Prelude.Text
+createCluster_clusterName = Lens.lens (\CreateCluster' {clusterName} -> clusterName) (\s@CreateCluster' {} a -> s {clusterName = a} :: CreateCluster)
+
+instance Core.AWSRequest CreateCluster where
+  type
+    AWSResponse CreateCluster =
+      CreateClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateClusterResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterName")
+            Prelude.<*> (x Data..?> "state")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateCluster where
+  hashWithSalt _salt CreateCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` configurationInfo
+      `Prelude.hashWithSalt` encryptionInfo
+      `Prelude.hashWithSalt` enhancedMonitoring
+      `Prelude.hashWithSalt` loggingInfo
+      `Prelude.hashWithSalt` openMonitoring
+      `Prelude.hashWithSalt` storageMode
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` brokerNodeGroupInfo
+      `Prelude.hashWithSalt` kafkaVersion
+      `Prelude.hashWithSalt` numberOfBrokerNodes
+      `Prelude.hashWithSalt` clusterName
+
+instance Prelude.NFData CreateCluster where
+  rnf CreateCluster' {..} =
+    Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf configurationInfo
+      `Prelude.seq` Prelude.rnf encryptionInfo
+      `Prelude.seq` Prelude.rnf enhancedMonitoring
+      `Prelude.seq` Prelude.rnf loggingInfo
+      `Prelude.seq` Prelude.rnf openMonitoring
+      `Prelude.seq` Prelude.rnf storageMode
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf brokerNodeGroupInfo
+      `Prelude.seq` Prelude.rnf kafkaVersion
+      `Prelude.seq` Prelude.rnf numberOfBrokerNodes
+      `Prelude.seq` Prelude.rnf clusterName
+
+instance Data.ToHeaders CreateCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateCluster where
+  toJSON CreateCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientAuthentication" Data..=)
+              Prelude.<$> clientAuthentication,
+            ("configurationInfo" Data..=)
+              Prelude.<$> configurationInfo,
+            ("encryptionInfo" Data..=)
+              Prelude.<$> encryptionInfo,
+            ("enhancedMonitoring" Data..=)
+              Prelude.<$> enhancedMonitoring,
+            ("loggingInfo" Data..=) Prelude.<$> loggingInfo,
+            ("openMonitoring" Data..=)
+              Prelude.<$> openMonitoring,
+            ("storageMode" Data..=) Prelude.<$> storageMode,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("brokerNodeGroupInfo" Data..= brokerNodeGroupInfo),
+            Prelude.Just ("kafkaVersion" Data..= kafkaVersion),
+            Prelude.Just
+              ("numberOfBrokerNodes" Data..= numberOfBrokerNodes),
+            Prelude.Just ("clusterName" Data..= clusterName)
+          ]
+      )
+
+instance Data.ToPath CreateCluster where
+  toPath = Prelude.const "/v1/clusters"
+
+instance Data.ToQuery CreateCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateClusterResponse' smart constructor.
+data CreateClusterResponse = CreateClusterResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the MSK cluster.
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | The state of the cluster. The possible states are ACTIVE, CREATING,
+    -- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+    state :: Prelude.Maybe ClusterState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'createClusterResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterName', 'createClusterResponse_clusterName' - The name of the MSK cluster.
+--
+-- 'state', 'createClusterResponse_state' - The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+--
+-- 'httpStatus', 'createClusterResponse_httpStatus' - The response's http status code.
+newCreateClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateClusterResponse
+newCreateClusterResponse pHttpStatus_ =
+  CreateClusterResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterName = Prelude.Nothing,
+      state = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+createClusterResponse_clusterArn :: Lens.Lens' CreateClusterResponse (Prelude.Maybe Prelude.Text)
+createClusterResponse_clusterArn = Lens.lens (\CreateClusterResponse' {clusterArn} -> clusterArn) (\s@CreateClusterResponse' {} a -> s {clusterArn = a} :: CreateClusterResponse)
+
+-- | The name of the MSK cluster.
+createClusterResponse_clusterName :: Lens.Lens' CreateClusterResponse (Prelude.Maybe Prelude.Text)
+createClusterResponse_clusterName = Lens.lens (\CreateClusterResponse' {clusterName} -> clusterName) (\s@CreateClusterResponse' {} a -> s {clusterName = a} :: CreateClusterResponse)
+
+-- | The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+createClusterResponse_state :: Lens.Lens' CreateClusterResponse (Prelude.Maybe ClusterState)
+createClusterResponse_state = Lens.lens (\CreateClusterResponse' {state} -> state) (\s@CreateClusterResponse' {} a -> s {state = a} :: CreateClusterResponse)
+
+-- | The response's http status code.
+createClusterResponse_httpStatus :: Lens.Lens' CreateClusterResponse Prelude.Int
+createClusterResponse_httpStatus = Lens.lens (\CreateClusterResponse' {httpStatus} -> httpStatus) (\s@CreateClusterResponse' {} a -> s {httpStatus = a} :: CreateClusterResponse)
+
+instance Prelude.NFData CreateClusterResponse where
+  rnf CreateClusterResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/CreateClusterV2.hs b/gen/Amazonka/Kafka/CreateClusterV2.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/CreateClusterV2.hs
@@ -0,0 +1,250 @@
+{-# 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.Kafka.CreateClusterV2
+-- 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 new MSK cluster.
+module Amazonka.Kafka.CreateClusterV2
+  ( -- * Creating a Request
+    CreateClusterV2 (..),
+    newCreateClusterV2,
+
+    -- * Request Lenses
+    createClusterV2_provisioned,
+    createClusterV2_serverless,
+    createClusterV2_tags,
+    createClusterV2_clusterName,
+
+    -- * Destructuring the Response
+    CreateClusterV2Response (..),
+    newCreateClusterV2Response,
+
+    -- * Response Lenses
+    createClusterV2Response_clusterArn,
+    createClusterV2Response_clusterName,
+    createClusterV2Response_clusterType,
+    createClusterV2Response_state,
+    createClusterV2Response_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateClusterV2' smart constructor.
+data CreateClusterV2 = CreateClusterV2'
+  { -- | Information about the provisioned cluster.
+    provisioned :: Prelude.Maybe ProvisionedRequest,
+    -- | Information about the serverless cluster.
+    serverless :: Prelude.Maybe ServerlessRequest,
+    -- | A map of tags that you want the cluster to have.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the cluster.
+    clusterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateClusterV2' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'provisioned', 'createClusterV2_provisioned' - Information about the provisioned cluster.
+--
+-- 'serverless', 'createClusterV2_serverless' - Information about the serverless cluster.
+--
+-- 'tags', 'createClusterV2_tags' - A map of tags that you want the cluster to have.
+--
+-- 'clusterName', 'createClusterV2_clusterName' - The name of the cluster.
+newCreateClusterV2 ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  CreateClusterV2
+newCreateClusterV2 pClusterName_ =
+  CreateClusterV2'
+    { provisioned = Prelude.Nothing,
+      serverless = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      clusterName = pClusterName_
+    }
+
+-- | Information about the provisioned cluster.
+createClusterV2_provisioned :: Lens.Lens' CreateClusterV2 (Prelude.Maybe ProvisionedRequest)
+createClusterV2_provisioned = Lens.lens (\CreateClusterV2' {provisioned} -> provisioned) (\s@CreateClusterV2' {} a -> s {provisioned = a} :: CreateClusterV2)
+
+-- | Information about the serverless cluster.
+createClusterV2_serverless :: Lens.Lens' CreateClusterV2 (Prelude.Maybe ServerlessRequest)
+createClusterV2_serverless = Lens.lens (\CreateClusterV2' {serverless} -> serverless) (\s@CreateClusterV2' {} a -> s {serverless = a} :: CreateClusterV2)
+
+-- | A map of tags that you want the cluster to have.
+createClusterV2_tags :: Lens.Lens' CreateClusterV2 (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createClusterV2_tags = Lens.lens (\CreateClusterV2' {tags} -> tags) (\s@CreateClusterV2' {} a -> s {tags = a} :: CreateClusterV2) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the cluster.
+createClusterV2_clusterName :: Lens.Lens' CreateClusterV2 Prelude.Text
+createClusterV2_clusterName = Lens.lens (\CreateClusterV2' {clusterName} -> clusterName) (\s@CreateClusterV2' {} a -> s {clusterName = a} :: CreateClusterV2)
+
+instance Core.AWSRequest CreateClusterV2 where
+  type
+    AWSResponse CreateClusterV2 =
+      CreateClusterV2Response
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateClusterV2Response'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterName")
+            Prelude.<*> (x Data..?> "clusterType")
+            Prelude.<*> (x Data..?> "state")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateClusterV2 where
+  hashWithSalt _salt CreateClusterV2' {..} =
+    _salt
+      `Prelude.hashWithSalt` provisioned
+      `Prelude.hashWithSalt` serverless
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clusterName
+
+instance Prelude.NFData CreateClusterV2 where
+  rnf CreateClusterV2' {..} =
+    Prelude.rnf provisioned
+      `Prelude.seq` Prelude.rnf serverless
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clusterName
+
+instance Data.ToHeaders CreateClusterV2 where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateClusterV2 where
+  toJSON CreateClusterV2' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("provisioned" Data..=) Prelude.<$> provisioned,
+            ("serverless" Data..=) Prelude.<$> serverless,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("clusterName" Data..= clusterName)
+          ]
+      )
+
+instance Data.ToPath CreateClusterV2 where
+  toPath = Prelude.const "/api/v2/clusters"
+
+instance Data.ToQuery CreateClusterV2 where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateClusterV2Response' smart constructor.
+data CreateClusterV2Response = CreateClusterV2Response'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the MSK cluster.
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | The type of the cluster. The possible states are PROVISIONED or
+    -- SERVERLESS.
+    clusterType :: Prelude.Maybe ClusterType,
+    -- | The state of the cluster. The possible states are ACTIVE, CREATING,
+    -- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+    state :: Prelude.Maybe ClusterState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateClusterV2Response' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'createClusterV2Response_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterName', 'createClusterV2Response_clusterName' - The name of the MSK cluster.
+--
+-- 'clusterType', 'createClusterV2Response_clusterType' - The type of the cluster. The possible states are PROVISIONED or
+-- SERVERLESS.
+--
+-- 'state', 'createClusterV2Response_state' - The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+--
+-- 'httpStatus', 'createClusterV2Response_httpStatus' - The response's http status code.
+newCreateClusterV2Response ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateClusterV2Response
+newCreateClusterV2Response pHttpStatus_ =
+  CreateClusterV2Response'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterName = Prelude.Nothing,
+      clusterType = Prelude.Nothing,
+      state = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+createClusterV2Response_clusterArn :: Lens.Lens' CreateClusterV2Response (Prelude.Maybe Prelude.Text)
+createClusterV2Response_clusterArn = Lens.lens (\CreateClusterV2Response' {clusterArn} -> clusterArn) (\s@CreateClusterV2Response' {} a -> s {clusterArn = a} :: CreateClusterV2Response)
+
+-- | The name of the MSK cluster.
+createClusterV2Response_clusterName :: Lens.Lens' CreateClusterV2Response (Prelude.Maybe Prelude.Text)
+createClusterV2Response_clusterName = Lens.lens (\CreateClusterV2Response' {clusterName} -> clusterName) (\s@CreateClusterV2Response' {} a -> s {clusterName = a} :: CreateClusterV2Response)
+
+-- | The type of the cluster. The possible states are PROVISIONED or
+-- SERVERLESS.
+createClusterV2Response_clusterType :: Lens.Lens' CreateClusterV2Response (Prelude.Maybe ClusterType)
+createClusterV2Response_clusterType = Lens.lens (\CreateClusterV2Response' {clusterType} -> clusterType) (\s@CreateClusterV2Response' {} a -> s {clusterType = a} :: CreateClusterV2Response)
+
+-- | The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+createClusterV2Response_state :: Lens.Lens' CreateClusterV2Response (Prelude.Maybe ClusterState)
+createClusterV2Response_state = Lens.lens (\CreateClusterV2Response' {state} -> state) (\s@CreateClusterV2Response' {} a -> s {state = a} :: CreateClusterV2Response)
+
+-- | The response's http status code.
+createClusterV2Response_httpStatus :: Lens.Lens' CreateClusterV2Response Prelude.Int
+createClusterV2Response_httpStatus = Lens.lens (\CreateClusterV2Response' {httpStatus} -> httpStatus) (\s@CreateClusterV2Response' {} a -> s {httpStatus = a} :: CreateClusterV2Response)
+
+instance Prelude.NFData CreateClusterV2Response where
+  rnf CreateClusterV2Response' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf clusterType
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/CreateConfiguration.hs b/gen/Amazonka/Kafka/CreateConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/CreateConfiguration.hs
@@ -0,0 +1,282 @@
+{-# 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.Kafka.CreateConfiguration
+-- 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 new MSK configuration.
+module Amazonka.Kafka.CreateConfiguration
+  ( -- * Creating a Request
+    CreateConfiguration (..),
+    newCreateConfiguration,
+
+    -- * Request Lenses
+    createConfiguration_description,
+    createConfiguration_kafkaVersions,
+    createConfiguration_serverProperties,
+    createConfiguration_name,
+
+    -- * Destructuring the Response
+    CreateConfigurationResponse (..),
+    newCreateConfigurationResponse,
+
+    -- * Response Lenses
+    createConfigurationResponse_arn,
+    createConfigurationResponse_creationTime,
+    createConfigurationResponse_latestRevision,
+    createConfigurationResponse_name,
+    createConfigurationResponse_state,
+    createConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateConfiguration' smart constructor.
+data CreateConfiguration = CreateConfiguration'
+  { -- | The description of the configuration.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The versions of Apache Kafka with which you can use this MSK
+    -- configuration.
+    kafkaVersions :: Prelude.Maybe [Prelude.Text],
+    -- | Contents of the server.properties file. When using the API, you must
+    -- ensure that the contents of the file are base64 encoded. When using the
+    -- AWS Management Console, the SDK, or the AWS CLI, the contents of
+    -- server.properties can be in plaintext.
+    serverProperties :: Data.Base64,
+    -- | The name of the configuration.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'createConfiguration_description' - The description of the configuration.
+--
+-- 'kafkaVersions', 'createConfiguration_kafkaVersions' - The versions of Apache Kafka with which you can use this MSK
+-- configuration.
+--
+-- 'serverProperties', 'createConfiguration_serverProperties' - Contents of the server.properties file. When using the API, you must
+-- ensure that the contents of the file are base64 encoded. When using the
+-- AWS Management Console, the SDK, or the AWS CLI, the contents of
+-- server.properties can be in plaintext.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'name', 'createConfiguration_name' - The name of the configuration.
+newCreateConfiguration ::
+  -- | 'serverProperties'
+  Prelude.ByteString ->
+  -- | 'name'
+  Prelude.Text ->
+  CreateConfiguration
+newCreateConfiguration pServerProperties_ pName_ =
+  CreateConfiguration'
+    { description = Prelude.Nothing,
+      kafkaVersions = Prelude.Nothing,
+      serverProperties =
+        Data._Base64 Lens.# pServerProperties_,
+      name = pName_
+    }
+
+-- | The description of the configuration.
+createConfiguration_description :: Lens.Lens' CreateConfiguration (Prelude.Maybe Prelude.Text)
+createConfiguration_description = Lens.lens (\CreateConfiguration' {description} -> description) (\s@CreateConfiguration' {} a -> s {description = a} :: CreateConfiguration)
+
+-- | The versions of Apache Kafka with which you can use this MSK
+-- configuration.
+createConfiguration_kafkaVersions :: Lens.Lens' CreateConfiguration (Prelude.Maybe [Prelude.Text])
+createConfiguration_kafkaVersions = Lens.lens (\CreateConfiguration' {kafkaVersions} -> kafkaVersions) (\s@CreateConfiguration' {} a -> s {kafkaVersions = a} :: CreateConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | Contents of the server.properties file. When using the API, you must
+-- ensure that the contents of the file are base64 encoded. When using the
+-- AWS Management Console, the SDK, or the AWS CLI, the contents of
+-- server.properties can be in plaintext.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+createConfiguration_serverProperties :: Lens.Lens' CreateConfiguration Prelude.ByteString
+createConfiguration_serverProperties = Lens.lens (\CreateConfiguration' {serverProperties} -> serverProperties) (\s@CreateConfiguration' {} a -> s {serverProperties = a} :: CreateConfiguration) Prelude.. Data._Base64
+
+-- | The name of the configuration.
+createConfiguration_name :: Lens.Lens' CreateConfiguration Prelude.Text
+createConfiguration_name = Lens.lens (\CreateConfiguration' {name} -> name) (\s@CreateConfiguration' {} a -> s {name = a} :: CreateConfiguration)
+
+instance Core.AWSRequest CreateConfiguration where
+  type
+    AWSResponse CreateConfiguration =
+      CreateConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateConfigurationResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "creationTime")
+            Prelude.<*> (x Data..?> "latestRevision")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (x Data..?> "state")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateConfiguration where
+  hashWithSalt _salt CreateConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` kafkaVersions
+      `Prelude.hashWithSalt` serverProperties
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData CreateConfiguration where
+  rnf CreateConfiguration' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf kafkaVersions
+      `Prelude.seq` Prelude.rnf serverProperties
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders CreateConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateConfiguration where
+  toJSON CreateConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("kafkaVersions" Data..=) Prelude.<$> kafkaVersions,
+            Prelude.Just
+              ("serverProperties" Data..= serverProperties),
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath CreateConfiguration where
+  toPath = Prelude.const "/v1/configurations"
+
+instance Data.ToQuery CreateConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateConfigurationResponse' smart constructor.
+data CreateConfigurationResponse = CreateConfigurationResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The time when the configuration was created.
+    creationTime :: Prelude.Maybe Data.ISO8601,
+    -- | Latest revision of the configuration.
+    latestRevision :: Prelude.Maybe ConfigurationRevision,
+    -- | The name of the configuration.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The state of the configuration. The possible states are ACTIVE,
+    -- DELETING, and DELETE_FAILED.
+    state :: Prelude.Maybe ConfigurationState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'createConfigurationResponse_arn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'creationTime', 'createConfigurationResponse_creationTime' - The time when the configuration was created.
+--
+-- 'latestRevision', 'createConfigurationResponse_latestRevision' - Latest revision of the configuration.
+--
+-- 'name', 'createConfigurationResponse_name' - The name of the configuration.
+--
+-- 'state', 'createConfigurationResponse_state' - The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+--
+-- 'httpStatus', 'createConfigurationResponse_httpStatus' - The response's http status code.
+newCreateConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateConfigurationResponse
+newCreateConfigurationResponse pHttpStatus_ =
+  CreateConfigurationResponse'
+    { arn = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      latestRevision = Prelude.Nothing,
+      name = Prelude.Nothing,
+      state = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+createConfigurationResponse_arn :: Lens.Lens' CreateConfigurationResponse (Prelude.Maybe Prelude.Text)
+createConfigurationResponse_arn = Lens.lens (\CreateConfigurationResponse' {arn} -> arn) (\s@CreateConfigurationResponse' {} a -> s {arn = a} :: CreateConfigurationResponse)
+
+-- | The time when the configuration was created.
+createConfigurationResponse_creationTime :: Lens.Lens' CreateConfigurationResponse (Prelude.Maybe Prelude.UTCTime)
+createConfigurationResponse_creationTime = Lens.lens (\CreateConfigurationResponse' {creationTime} -> creationTime) (\s@CreateConfigurationResponse' {} a -> s {creationTime = a} :: CreateConfigurationResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Latest revision of the configuration.
+createConfigurationResponse_latestRevision :: Lens.Lens' CreateConfigurationResponse (Prelude.Maybe ConfigurationRevision)
+createConfigurationResponse_latestRevision = Lens.lens (\CreateConfigurationResponse' {latestRevision} -> latestRevision) (\s@CreateConfigurationResponse' {} a -> s {latestRevision = a} :: CreateConfigurationResponse)
+
+-- | The name of the configuration.
+createConfigurationResponse_name :: Lens.Lens' CreateConfigurationResponse (Prelude.Maybe Prelude.Text)
+createConfigurationResponse_name = Lens.lens (\CreateConfigurationResponse' {name} -> name) (\s@CreateConfigurationResponse' {} a -> s {name = a} :: CreateConfigurationResponse)
+
+-- | The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+createConfigurationResponse_state :: Lens.Lens' CreateConfigurationResponse (Prelude.Maybe ConfigurationState)
+createConfigurationResponse_state = Lens.lens (\CreateConfigurationResponse' {state} -> state) (\s@CreateConfigurationResponse' {} a -> s {state = a} :: CreateConfigurationResponse)
+
+-- | The response's http status code.
+createConfigurationResponse_httpStatus :: Lens.Lens' CreateConfigurationResponse Prelude.Int
+createConfigurationResponse_httpStatus = Lens.lens (\CreateConfigurationResponse' {httpStatus} -> httpStatus) (\s@CreateConfigurationResponse' {} a -> s {httpStatus = a} :: CreateConfigurationResponse)
+
+instance Prelude.NFData CreateConfigurationResponse where
+  rnf CreateConfigurationResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf latestRevision
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DeleteCluster.hs b/gen/Amazonka/Kafka/DeleteCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DeleteCluster.hs
@@ -0,0 +1,193 @@
+{-# 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.Kafka.DeleteCluster
+-- 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 the MSK cluster specified by the Amazon Resource Name (ARN) in
+-- the request.
+module Amazonka.Kafka.DeleteCluster
+  ( -- * Creating a Request
+    DeleteCluster (..),
+    newDeleteCluster,
+
+    -- * Request Lenses
+    deleteCluster_currentVersion,
+    deleteCluster_clusterArn,
+
+    -- * Destructuring the Response
+    DeleteClusterResponse (..),
+    newDeleteClusterResponse,
+
+    -- * Response Lenses
+    deleteClusterResponse_clusterArn,
+    deleteClusterResponse_state,
+    deleteClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteCluster' smart constructor.
+data DeleteCluster = DeleteCluster'
+  { -- | The current version of the MSK cluster.
+    currentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'currentVersion', 'deleteCluster_currentVersion' - The current version of the MSK cluster.
+--
+-- 'clusterArn', 'deleteCluster_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+newDeleteCluster ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  DeleteCluster
+newDeleteCluster pClusterArn_ =
+  DeleteCluster'
+    { currentVersion = Prelude.Nothing,
+      clusterArn = pClusterArn_
+    }
+
+-- | The current version of the MSK cluster.
+deleteCluster_currentVersion :: Lens.Lens' DeleteCluster (Prelude.Maybe Prelude.Text)
+deleteCluster_currentVersion = Lens.lens (\DeleteCluster' {currentVersion} -> currentVersion) (\s@DeleteCluster' {} a -> s {currentVersion = a} :: DeleteCluster)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+deleteCluster_clusterArn :: Lens.Lens' DeleteCluster Prelude.Text
+deleteCluster_clusterArn = Lens.lens (\DeleteCluster' {clusterArn} -> clusterArn) (\s@DeleteCluster' {} a -> s {clusterArn = a} :: DeleteCluster)
+
+instance Core.AWSRequest DeleteCluster where
+  type
+    AWSResponse DeleteCluster =
+      DeleteClusterResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteClusterResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "state")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteCluster where
+  hashWithSalt _salt DeleteCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData DeleteCluster where
+  rnf DeleteCluster' {..} =
+    Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf clusterArn
+
+instance Data.ToHeaders DeleteCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteCluster where
+  toPath DeleteCluster' {..} =
+    Prelude.mconcat
+      ["/v1/clusters/", Data.toBS clusterArn]
+
+instance Data.ToQuery DeleteCluster where
+  toQuery DeleteCluster' {..} =
+    Prelude.mconcat
+      ["currentVersion" Data.=: currentVersion]
+
+-- | /See:/ 'newDeleteClusterResponse' smart constructor.
+data DeleteClusterResponse = DeleteClusterResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The state of the cluster. The possible states are ACTIVE, CREATING,
+    -- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+    state :: Prelude.Maybe ClusterState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'deleteClusterResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'state', 'deleteClusterResponse_state' - The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+--
+-- 'httpStatus', 'deleteClusterResponse_httpStatus' - The response's http status code.
+newDeleteClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteClusterResponse
+newDeleteClusterResponse pHttpStatus_ =
+  DeleteClusterResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      state = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+deleteClusterResponse_clusterArn :: Lens.Lens' DeleteClusterResponse (Prelude.Maybe Prelude.Text)
+deleteClusterResponse_clusterArn = Lens.lens (\DeleteClusterResponse' {clusterArn} -> clusterArn) (\s@DeleteClusterResponse' {} a -> s {clusterArn = a} :: DeleteClusterResponse)
+
+-- | The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+deleteClusterResponse_state :: Lens.Lens' DeleteClusterResponse (Prelude.Maybe ClusterState)
+deleteClusterResponse_state = Lens.lens (\DeleteClusterResponse' {state} -> state) (\s@DeleteClusterResponse' {} a -> s {state = a} :: DeleteClusterResponse)
+
+-- | The response's http status code.
+deleteClusterResponse_httpStatus :: Lens.Lens' DeleteClusterResponse Prelude.Int
+deleteClusterResponse_httpStatus = Lens.lens (\DeleteClusterResponse' {httpStatus} -> httpStatus) (\s@DeleteClusterResponse' {} a -> s {httpStatus = a} :: DeleteClusterResponse)
+
+instance Prelude.NFData DeleteClusterResponse where
+  rnf DeleteClusterResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DeleteConfiguration.hs b/gen/Amazonka/Kafka/DeleteConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DeleteConfiguration.hs
@@ -0,0 +1,179 @@
+{-# 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.Kafka.DeleteConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an MSK Configuration.
+module Amazonka.Kafka.DeleteConfiguration
+  ( -- * Creating a Request
+    DeleteConfiguration (..),
+    newDeleteConfiguration,
+
+    -- * Request Lenses
+    deleteConfiguration_arn,
+
+    -- * Destructuring the Response
+    DeleteConfigurationResponse (..),
+    newDeleteConfigurationResponse,
+
+    -- * Response Lenses
+    deleteConfigurationResponse_arn,
+    deleteConfigurationResponse_state,
+    deleteConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteConfiguration' smart constructor.
+data DeleteConfiguration = DeleteConfiguration'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+    -- configuration.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'deleteConfiguration_arn' - The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration.
+newDeleteConfiguration ::
+  -- | 'arn'
+  Prelude.Text ->
+  DeleteConfiguration
+newDeleteConfiguration pArn_ =
+  DeleteConfiguration' {arn = pArn_}
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration.
+deleteConfiguration_arn :: Lens.Lens' DeleteConfiguration Prelude.Text
+deleteConfiguration_arn = Lens.lens (\DeleteConfiguration' {arn} -> arn) (\s@DeleteConfiguration' {} a -> s {arn = a} :: DeleteConfiguration)
+
+instance Core.AWSRequest DeleteConfiguration where
+  type
+    AWSResponse DeleteConfiguration =
+      DeleteConfigurationResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteConfigurationResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "state")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteConfiguration where
+  hashWithSalt _salt DeleteConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DeleteConfiguration where
+  rnf DeleteConfiguration' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DeleteConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteConfiguration where
+  toPath DeleteConfiguration' {..} =
+    Prelude.mconcat
+      ["/v1/configurations/", Data.toBS arn]
+
+instance Data.ToQuery DeleteConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteConfigurationResponse' smart constructor.
+data DeleteConfigurationResponse = DeleteConfigurationResponse'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+    -- configuration.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The state of the configuration. The possible states are ACTIVE,
+    -- DELETING, and DELETE_FAILED.
+    state :: Prelude.Maybe ConfigurationState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'deleteConfigurationResponse_arn' - The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration.
+--
+-- 'state', 'deleteConfigurationResponse_state' - The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+--
+-- 'httpStatus', 'deleteConfigurationResponse_httpStatus' - The response's http status code.
+newDeleteConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteConfigurationResponse
+newDeleteConfigurationResponse pHttpStatus_ =
+  DeleteConfigurationResponse'
+    { arn = Prelude.Nothing,
+      state = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration.
+deleteConfigurationResponse_arn :: Lens.Lens' DeleteConfigurationResponse (Prelude.Maybe Prelude.Text)
+deleteConfigurationResponse_arn = Lens.lens (\DeleteConfigurationResponse' {arn} -> arn) (\s@DeleteConfigurationResponse' {} a -> s {arn = a} :: DeleteConfigurationResponse)
+
+-- | The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+deleteConfigurationResponse_state :: Lens.Lens' DeleteConfigurationResponse (Prelude.Maybe ConfigurationState)
+deleteConfigurationResponse_state = Lens.lens (\DeleteConfigurationResponse' {state} -> state) (\s@DeleteConfigurationResponse' {} a -> s {state = a} :: DeleteConfigurationResponse)
+
+-- | The response's http status code.
+deleteConfigurationResponse_httpStatus :: Lens.Lens' DeleteConfigurationResponse Prelude.Int
+deleteConfigurationResponse_httpStatus = Lens.lens (\DeleteConfigurationResponse' {httpStatus} -> httpStatus) (\s@DeleteConfigurationResponse' {} a -> s {httpStatus = a} :: DeleteConfigurationResponse)
+
+instance Prelude.NFData DeleteConfigurationResponse where
+  rnf DeleteConfigurationResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DescribeCluster.hs b/gen/Amazonka/Kafka/DescribeCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DescribeCluster.hs
@@ -0,0 +1,160 @@
+{-# 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.Kafka.DescribeCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a description of the MSK cluster whose Amazon Resource Name
+-- (ARN) is specified in the request.
+module Amazonka.Kafka.DescribeCluster
+  ( -- * Creating a Request
+    DescribeCluster (..),
+    newDescribeCluster,
+
+    -- * Request Lenses
+    describeCluster_clusterArn,
+
+    -- * Destructuring the Response
+    DescribeClusterResponse (..),
+    newDescribeClusterResponse,
+
+    -- * Response Lenses
+    describeClusterResponse_clusterInfo,
+    describeClusterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeCluster' smart constructor.
+data DescribeCluster = DescribeCluster'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeCluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'describeCluster_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+newDescribeCluster ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  DescribeCluster
+newDescribeCluster pClusterArn_ =
+  DescribeCluster' {clusterArn = pClusterArn_}
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+describeCluster_clusterArn :: Lens.Lens' DescribeCluster Prelude.Text
+describeCluster_clusterArn = Lens.lens (\DescribeCluster' {clusterArn} -> clusterArn) (\s@DescribeCluster' {} a -> s {clusterArn = a} :: DescribeCluster)
+
+instance Core.AWSRequest DescribeCluster where
+  type
+    AWSResponse DescribeCluster =
+      DescribeClusterResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeClusterResponse'
+            Prelude.<$> (x Data..?> "clusterInfo")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeCluster where
+  hashWithSalt _salt DescribeCluster' {..} =
+    _salt `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData DescribeCluster where
+  rnf DescribeCluster' {..} = Prelude.rnf clusterArn
+
+instance Data.ToHeaders DescribeCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeCluster where
+  toPath DescribeCluster' {..} =
+    Prelude.mconcat
+      ["/v1/clusters/", Data.toBS clusterArn]
+
+instance Data.ToQuery DescribeCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeClusterResponse' smart constructor.
+data DescribeClusterResponse = DescribeClusterResponse'
+  { -- | The cluster information.
+    clusterInfo :: Prelude.Maybe ClusterInfo,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterInfo', 'describeClusterResponse_clusterInfo' - The cluster information.
+--
+-- 'httpStatus', 'describeClusterResponse_httpStatus' - The response's http status code.
+newDescribeClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeClusterResponse
+newDescribeClusterResponse pHttpStatus_ =
+  DescribeClusterResponse'
+    { clusterInfo =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The cluster information.
+describeClusterResponse_clusterInfo :: Lens.Lens' DescribeClusterResponse (Prelude.Maybe ClusterInfo)
+describeClusterResponse_clusterInfo = Lens.lens (\DescribeClusterResponse' {clusterInfo} -> clusterInfo) (\s@DescribeClusterResponse' {} a -> s {clusterInfo = a} :: DescribeClusterResponse)
+
+-- | The response's http status code.
+describeClusterResponse_httpStatus :: Lens.Lens' DescribeClusterResponse Prelude.Int
+describeClusterResponse_httpStatus = Lens.lens (\DescribeClusterResponse' {httpStatus} -> httpStatus) (\s@DescribeClusterResponse' {} a -> s {httpStatus = a} :: DescribeClusterResponse)
+
+instance Prelude.NFData DescribeClusterResponse where
+  rnf DescribeClusterResponse' {..} =
+    Prelude.rnf clusterInfo
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DescribeClusterOperation.hs b/gen/Amazonka/Kafka/DescribeClusterOperation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DescribeClusterOperation.hs
@@ -0,0 +1,169 @@
+{-# 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.Kafka.DescribeClusterOperation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a description of the cluster operation specified by the ARN.
+module Amazonka.Kafka.DescribeClusterOperation
+  ( -- * Creating a Request
+    DescribeClusterOperation (..),
+    newDescribeClusterOperation,
+
+    -- * Request Lenses
+    describeClusterOperation_clusterOperationArn,
+
+    -- * Destructuring the Response
+    DescribeClusterOperationResponse (..),
+    newDescribeClusterOperationResponse,
+
+    -- * Response Lenses
+    describeClusterOperationResponse_clusterOperationInfo,
+    describeClusterOperationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeClusterOperation' smart constructor.
+data DescribeClusterOperation = DescribeClusterOperation'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the MSK cluster
+    -- operation.
+    clusterOperationArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusterOperation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterOperationArn', 'describeClusterOperation_clusterOperationArn' - The Amazon Resource Name (ARN) that uniquely identifies the MSK cluster
+-- operation.
+newDescribeClusterOperation ::
+  -- | 'clusterOperationArn'
+  Prelude.Text ->
+  DescribeClusterOperation
+newDescribeClusterOperation pClusterOperationArn_ =
+  DescribeClusterOperation'
+    { clusterOperationArn =
+        pClusterOperationArn_
+    }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the MSK cluster
+-- operation.
+describeClusterOperation_clusterOperationArn :: Lens.Lens' DescribeClusterOperation Prelude.Text
+describeClusterOperation_clusterOperationArn = Lens.lens (\DescribeClusterOperation' {clusterOperationArn} -> clusterOperationArn) (\s@DescribeClusterOperation' {} a -> s {clusterOperationArn = a} :: DescribeClusterOperation)
+
+instance Core.AWSRequest DescribeClusterOperation where
+  type
+    AWSResponse DescribeClusterOperation =
+      DescribeClusterOperationResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeClusterOperationResponse'
+            Prelude.<$> (x Data..?> "clusterOperationInfo")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeClusterOperation where
+  hashWithSalt _salt DescribeClusterOperation' {..} =
+    _salt `Prelude.hashWithSalt` clusterOperationArn
+
+instance Prelude.NFData DescribeClusterOperation where
+  rnf DescribeClusterOperation' {..} =
+    Prelude.rnf clusterOperationArn
+
+instance Data.ToHeaders DescribeClusterOperation where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeClusterOperation where
+  toPath DescribeClusterOperation' {..} =
+    Prelude.mconcat
+      ["/v1/operations/", Data.toBS clusterOperationArn]
+
+instance Data.ToQuery DescribeClusterOperation where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeClusterOperationResponse' smart constructor.
+data DescribeClusterOperationResponse = DescribeClusterOperationResponse'
+  { -- | Cluster operation information
+    clusterOperationInfo :: Prelude.Maybe ClusterOperationInfo,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusterOperationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterOperationInfo', 'describeClusterOperationResponse_clusterOperationInfo' - Cluster operation information
+--
+-- 'httpStatus', 'describeClusterOperationResponse_httpStatus' - The response's http status code.
+newDescribeClusterOperationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeClusterOperationResponse
+newDescribeClusterOperationResponse pHttpStatus_ =
+  DescribeClusterOperationResponse'
+    { clusterOperationInfo =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Cluster operation information
+describeClusterOperationResponse_clusterOperationInfo :: Lens.Lens' DescribeClusterOperationResponse (Prelude.Maybe ClusterOperationInfo)
+describeClusterOperationResponse_clusterOperationInfo = Lens.lens (\DescribeClusterOperationResponse' {clusterOperationInfo} -> clusterOperationInfo) (\s@DescribeClusterOperationResponse' {} a -> s {clusterOperationInfo = a} :: DescribeClusterOperationResponse)
+
+-- | The response's http status code.
+describeClusterOperationResponse_httpStatus :: Lens.Lens' DescribeClusterOperationResponse Prelude.Int
+describeClusterOperationResponse_httpStatus = Lens.lens (\DescribeClusterOperationResponse' {httpStatus} -> httpStatus) (\s@DescribeClusterOperationResponse' {} a -> s {httpStatus = a} :: DescribeClusterOperationResponse)
+
+instance
+  Prelude.NFData
+    DescribeClusterOperationResponse
+  where
+  rnf DescribeClusterOperationResponse' {..} =
+    Prelude.rnf clusterOperationInfo
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DescribeClusterV2.hs b/gen/Amazonka/Kafka/DescribeClusterV2.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DescribeClusterV2.hs
@@ -0,0 +1,160 @@
+{-# 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.Kafka.DescribeClusterV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a description of the MSK cluster whose Amazon Resource Name
+-- (ARN) is specified in the request.
+module Amazonka.Kafka.DescribeClusterV2
+  ( -- * Creating a Request
+    DescribeClusterV2 (..),
+    newDescribeClusterV2,
+
+    -- * Request Lenses
+    describeClusterV2_clusterArn,
+
+    -- * Destructuring the Response
+    DescribeClusterV2Response (..),
+    newDescribeClusterV2Response,
+
+    -- * Response Lenses
+    describeClusterV2Response_clusterInfo,
+    describeClusterV2Response_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeClusterV2' smart constructor.
+data DescribeClusterV2 = DescribeClusterV2'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusterV2' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'describeClusterV2_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+newDescribeClusterV2 ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  DescribeClusterV2
+newDescribeClusterV2 pClusterArn_ =
+  DescribeClusterV2' {clusterArn = pClusterArn_}
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+describeClusterV2_clusterArn :: Lens.Lens' DescribeClusterV2 Prelude.Text
+describeClusterV2_clusterArn = Lens.lens (\DescribeClusterV2' {clusterArn} -> clusterArn) (\s@DescribeClusterV2' {} a -> s {clusterArn = a} :: DescribeClusterV2)
+
+instance Core.AWSRequest DescribeClusterV2 where
+  type
+    AWSResponse DescribeClusterV2 =
+      DescribeClusterV2Response
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeClusterV2Response'
+            Prelude.<$> (x Data..?> "clusterInfo")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeClusterV2 where
+  hashWithSalt _salt DescribeClusterV2' {..} =
+    _salt `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData DescribeClusterV2 where
+  rnf DescribeClusterV2' {..} = Prelude.rnf clusterArn
+
+instance Data.ToHeaders DescribeClusterV2 where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeClusterV2 where
+  toPath DescribeClusterV2' {..} =
+    Prelude.mconcat
+      ["/api/v2/clusters/", Data.toBS clusterArn]
+
+instance Data.ToQuery DescribeClusterV2 where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeClusterV2Response' smart constructor.
+data DescribeClusterV2Response = DescribeClusterV2Response'
+  { -- | The cluster information.
+    clusterInfo :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusterV2Response' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterInfo', 'describeClusterV2Response_clusterInfo' - The cluster information.
+--
+-- 'httpStatus', 'describeClusterV2Response_httpStatus' - The response's http status code.
+newDescribeClusterV2Response ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeClusterV2Response
+newDescribeClusterV2Response pHttpStatus_ =
+  DescribeClusterV2Response'
+    { clusterInfo =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The cluster information.
+describeClusterV2Response_clusterInfo :: Lens.Lens' DescribeClusterV2Response (Prelude.Maybe Cluster)
+describeClusterV2Response_clusterInfo = Lens.lens (\DescribeClusterV2Response' {clusterInfo} -> clusterInfo) (\s@DescribeClusterV2Response' {} a -> s {clusterInfo = a} :: DescribeClusterV2Response)
+
+-- | The response's http status code.
+describeClusterV2Response_httpStatus :: Lens.Lens' DescribeClusterV2Response Prelude.Int
+describeClusterV2Response_httpStatus = Lens.lens (\DescribeClusterV2Response' {httpStatus} -> httpStatus) (\s@DescribeClusterV2Response' {} a -> s {httpStatus = a} :: DescribeClusterV2Response)
+
+instance Prelude.NFData DescribeClusterV2Response where
+  rnf DescribeClusterV2Response' {..} =
+    Prelude.rnf clusterInfo
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DescribeConfiguration.hs b/gen/Amazonka/Kafka/DescribeConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DescribeConfiguration.hs
@@ -0,0 +1,240 @@
+{-# 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.Kafka.DescribeConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a description of this MSK configuration.
+module Amazonka.Kafka.DescribeConfiguration
+  ( -- * Creating a Request
+    DescribeConfiguration (..),
+    newDescribeConfiguration,
+
+    -- * Request Lenses
+    describeConfiguration_arn,
+
+    -- * Destructuring the Response
+    DescribeConfigurationResponse (..),
+    newDescribeConfigurationResponse,
+
+    -- * Response Lenses
+    describeConfigurationResponse_arn,
+    describeConfigurationResponse_creationTime,
+    describeConfigurationResponse_description,
+    describeConfigurationResponse_kafkaVersions,
+    describeConfigurationResponse_latestRevision,
+    describeConfigurationResponse_name,
+    describeConfigurationResponse_state,
+    describeConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeConfiguration' smart constructor.
+data DescribeConfiguration = DescribeConfiguration'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+    -- configuration and all of its revisions.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeConfiguration_arn' - The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration and all of its revisions.
+newDescribeConfiguration ::
+  -- | 'arn'
+  Prelude.Text ->
+  DescribeConfiguration
+newDescribeConfiguration pArn_ =
+  DescribeConfiguration' {arn = pArn_}
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration and all of its revisions.
+describeConfiguration_arn :: Lens.Lens' DescribeConfiguration Prelude.Text
+describeConfiguration_arn = Lens.lens (\DescribeConfiguration' {arn} -> arn) (\s@DescribeConfiguration' {} a -> s {arn = a} :: DescribeConfiguration)
+
+instance Core.AWSRequest DescribeConfiguration where
+  type
+    AWSResponse DescribeConfiguration =
+      DescribeConfigurationResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeConfigurationResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "creationTime")
+            Prelude.<*> (x Data..?> "description")
+            Prelude.<*> (x Data..?> "kafkaVersions" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "latestRevision")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (x Data..?> "state")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeConfiguration where
+  hashWithSalt _salt DescribeConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DescribeConfiguration where
+  rnf DescribeConfiguration' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DescribeConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeConfiguration where
+  toPath DescribeConfiguration' {..} =
+    Prelude.mconcat
+      ["/v1/configurations/", Data.toBS arn]
+
+instance Data.ToQuery DescribeConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeConfigurationResponse' smart constructor.
+data DescribeConfigurationResponse = DescribeConfigurationResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The time when the configuration was created.
+    creationTime :: Prelude.Maybe Data.ISO8601,
+    -- | The description of the configuration.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The versions of Apache Kafka with which you can use this MSK
+    -- configuration.
+    kafkaVersions :: Prelude.Maybe [Prelude.Text],
+    -- | Latest revision of the configuration.
+    latestRevision :: Prelude.Maybe ConfigurationRevision,
+    -- | The name of the configuration.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The state of the configuration. The possible states are ACTIVE,
+    -- DELETING, and DELETE_FAILED.
+    state :: Prelude.Maybe ConfigurationState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeConfigurationResponse_arn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'creationTime', 'describeConfigurationResponse_creationTime' - The time when the configuration was created.
+--
+-- 'description', 'describeConfigurationResponse_description' - The description of the configuration.
+--
+-- 'kafkaVersions', 'describeConfigurationResponse_kafkaVersions' - The versions of Apache Kafka with which you can use this MSK
+-- configuration.
+--
+-- 'latestRevision', 'describeConfigurationResponse_latestRevision' - Latest revision of the configuration.
+--
+-- 'name', 'describeConfigurationResponse_name' - The name of the configuration.
+--
+-- 'state', 'describeConfigurationResponse_state' - The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+--
+-- 'httpStatus', 'describeConfigurationResponse_httpStatus' - The response's http status code.
+newDescribeConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeConfigurationResponse
+newDescribeConfigurationResponse pHttpStatus_ =
+  DescribeConfigurationResponse'
+    { arn =
+        Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      description = Prelude.Nothing,
+      kafkaVersions = Prelude.Nothing,
+      latestRevision = Prelude.Nothing,
+      name = Prelude.Nothing,
+      state = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+describeConfigurationResponse_arn :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe Prelude.Text)
+describeConfigurationResponse_arn = Lens.lens (\DescribeConfigurationResponse' {arn} -> arn) (\s@DescribeConfigurationResponse' {} a -> s {arn = a} :: DescribeConfigurationResponse)
+
+-- | The time when the configuration was created.
+describeConfigurationResponse_creationTime :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe Prelude.UTCTime)
+describeConfigurationResponse_creationTime = Lens.lens (\DescribeConfigurationResponse' {creationTime} -> creationTime) (\s@DescribeConfigurationResponse' {} a -> s {creationTime = a} :: DescribeConfigurationResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The description of the configuration.
+describeConfigurationResponse_description :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe Prelude.Text)
+describeConfigurationResponse_description = Lens.lens (\DescribeConfigurationResponse' {description} -> description) (\s@DescribeConfigurationResponse' {} a -> s {description = a} :: DescribeConfigurationResponse)
+
+-- | The versions of Apache Kafka with which you can use this MSK
+-- configuration.
+describeConfigurationResponse_kafkaVersions :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe [Prelude.Text])
+describeConfigurationResponse_kafkaVersions = Lens.lens (\DescribeConfigurationResponse' {kafkaVersions} -> kafkaVersions) (\s@DescribeConfigurationResponse' {} a -> s {kafkaVersions = a} :: DescribeConfigurationResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Latest revision of the configuration.
+describeConfigurationResponse_latestRevision :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe ConfigurationRevision)
+describeConfigurationResponse_latestRevision = Lens.lens (\DescribeConfigurationResponse' {latestRevision} -> latestRevision) (\s@DescribeConfigurationResponse' {} a -> s {latestRevision = a} :: DescribeConfigurationResponse)
+
+-- | The name of the configuration.
+describeConfigurationResponse_name :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe Prelude.Text)
+describeConfigurationResponse_name = Lens.lens (\DescribeConfigurationResponse' {name} -> name) (\s@DescribeConfigurationResponse' {} a -> s {name = a} :: DescribeConfigurationResponse)
+
+-- | The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+describeConfigurationResponse_state :: Lens.Lens' DescribeConfigurationResponse (Prelude.Maybe ConfigurationState)
+describeConfigurationResponse_state = Lens.lens (\DescribeConfigurationResponse' {state} -> state) (\s@DescribeConfigurationResponse' {} a -> s {state = a} :: DescribeConfigurationResponse)
+
+-- | The response's http status code.
+describeConfigurationResponse_httpStatus :: Lens.Lens' DescribeConfigurationResponse Prelude.Int
+describeConfigurationResponse_httpStatus = Lens.lens (\DescribeConfigurationResponse' {httpStatus} -> httpStatus) (\s@DescribeConfigurationResponse' {} a -> s {httpStatus = a} :: DescribeConfigurationResponse)
+
+instance Prelude.NFData DescribeConfigurationResponse where
+  rnf DescribeConfigurationResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf kafkaVersions
+      `Prelude.seq` Prelude.rnf latestRevision
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/DescribeConfigurationRevision.hs b/gen/Amazonka/Kafka/DescribeConfigurationRevision.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/DescribeConfigurationRevision.hs
@@ -0,0 +1,258 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.DescribeConfigurationRevision
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a description of this revision of the configuration.
+module Amazonka.Kafka.DescribeConfigurationRevision
+  ( -- * Creating a Request
+    DescribeConfigurationRevision (..),
+    newDescribeConfigurationRevision,
+
+    -- * Request Lenses
+    describeConfigurationRevision_revision,
+    describeConfigurationRevision_arn,
+
+    -- * Destructuring the Response
+    DescribeConfigurationRevisionResponse (..),
+    newDescribeConfigurationRevisionResponse,
+
+    -- * Response Lenses
+    describeConfigurationRevisionResponse_arn,
+    describeConfigurationRevisionResponse_creationTime,
+    describeConfigurationRevisionResponse_description,
+    describeConfigurationRevisionResponse_revision,
+    describeConfigurationRevisionResponse_serverProperties,
+    describeConfigurationRevisionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeConfigurationRevision' smart constructor.
+data DescribeConfigurationRevision = DescribeConfigurationRevision'
+  { -- | A string that uniquely identifies a revision of an MSK configuration.
+    revision :: Prelude.Integer,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+    -- configuration and all of its revisions.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeConfigurationRevision' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'revision', 'describeConfigurationRevision_revision' - A string that uniquely identifies a revision of an MSK configuration.
+--
+-- 'arn', 'describeConfigurationRevision_arn' - The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration and all of its revisions.
+newDescribeConfigurationRevision ::
+  -- | 'revision'
+  Prelude.Integer ->
+  -- | 'arn'
+  Prelude.Text ->
+  DescribeConfigurationRevision
+newDescribeConfigurationRevision pRevision_ pArn_ =
+  DescribeConfigurationRevision'
+    { revision =
+        pRevision_,
+      arn = pArn_
+    }
+
+-- | A string that uniquely identifies a revision of an MSK configuration.
+describeConfigurationRevision_revision :: Lens.Lens' DescribeConfigurationRevision Prelude.Integer
+describeConfigurationRevision_revision = Lens.lens (\DescribeConfigurationRevision' {revision} -> revision) (\s@DescribeConfigurationRevision' {} a -> s {revision = a} :: DescribeConfigurationRevision)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration and all of its revisions.
+describeConfigurationRevision_arn :: Lens.Lens' DescribeConfigurationRevision Prelude.Text
+describeConfigurationRevision_arn = Lens.lens (\DescribeConfigurationRevision' {arn} -> arn) (\s@DescribeConfigurationRevision' {} a -> s {arn = a} :: DescribeConfigurationRevision)
+
+instance
+  Core.AWSRequest
+    DescribeConfigurationRevision
+  where
+  type
+    AWSResponse DescribeConfigurationRevision =
+      DescribeConfigurationRevisionResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeConfigurationRevisionResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "creationTime")
+            Prelude.<*> (x Data..?> "description")
+            Prelude.<*> (x Data..?> "revision")
+            Prelude.<*> (x Data..?> "serverProperties")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeConfigurationRevision
+  where
+  hashWithSalt _salt DescribeConfigurationRevision' {..} =
+    _salt
+      `Prelude.hashWithSalt` revision
+      `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DescribeConfigurationRevision where
+  rnf DescribeConfigurationRevision' {..} =
+    Prelude.rnf revision `Prelude.seq` Prelude.rnf arn
+
+instance Data.ToHeaders DescribeConfigurationRevision where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeConfigurationRevision where
+  toPath DescribeConfigurationRevision' {..} =
+    Prelude.mconcat
+      [ "/v1/configurations/",
+        Data.toBS arn,
+        "/revisions/",
+        Data.toBS revision
+      ]
+
+instance Data.ToQuery DescribeConfigurationRevision where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeConfigurationRevisionResponse' smart constructor.
+data DescribeConfigurationRevisionResponse = DescribeConfigurationRevisionResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The time when the configuration was created.
+    creationTime :: Prelude.Maybe Data.ISO8601,
+    -- | The description of the configuration.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The revision number.
+    revision :: Prelude.Maybe Prelude.Integer,
+    -- | Contents of the server.properties file. When using the API, you must
+    -- ensure that the contents of the file are base64 encoded. When using the
+    -- AWS Management Console, the SDK, or the AWS CLI, the contents of
+    -- server.properties can be in plaintext.
+    serverProperties :: Prelude.Maybe Data.Base64,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeConfigurationRevisionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeConfigurationRevisionResponse_arn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'creationTime', 'describeConfigurationRevisionResponse_creationTime' - The time when the configuration was created.
+--
+-- 'description', 'describeConfigurationRevisionResponse_description' - The description of the configuration.
+--
+-- 'revision', 'describeConfigurationRevisionResponse_revision' - The revision number.
+--
+-- 'serverProperties', 'describeConfigurationRevisionResponse_serverProperties' - Contents of the server.properties file. When using the API, you must
+-- ensure that the contents of the file are base64 encoded. When using the
+-- AWS Management Console, the SDK, or the AWS CLI, the contents of
+-- server.properties can be in plaintext.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'httpStatus', 'describeConfigurationRevisionResponse_httpStatus' - The response's http status code.
+newDescribeConfigurationRevisionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeConfigurationRevisionResponse
+newDescribeConfigurationRevisionResponse pHttpStatus_ =
+  DescribeConfigurationRevisionResponse'
+    { arn =
+        Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      description = Prelude.Nothing,
+      revision = Prelude.Nothing,
+      serverProperties = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+describeConfigurationRevisionResponse_arn :: Lens.Lens' DescribeConfigurationRevisionResponse (Prelude.Maybe Prelude.Text)
+describeConfigurationRevisionResponse_arn = Lens.lens (\DescribeConfigurationRevisionResponse' {arn} -> arn) (\s@DescribeConfigurationRevisionResponse' {} a -> s {arn = a} :: DescribeConfigurationRevisionResponse)
+
+-- | The time when the configuration was created.
+describeConfigurationRevisionResponse_creationTime :: Lens.Lens' DescribeConfigurationRevisionResponse (Prelude.Maybe Prelude.UTCTime)
+describeConfigurationRevisionResponse_creationTime = Lens.lens (\DescribeConfigurationRevisionResponse' {creationTime} -> creationTime) (\s@DescribeConfigurationRevisionResponse' {} a -> s {creationTime = a} :: DescribeConfigurationRevisionResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The description of the configuration.
+describeConfigurationRevisionResponse_description :: Lens.Lens' DescribeConfigurationRevisionResponse (Prelude.Maybe Prelude.Text)
+describeConfigurationRevisionResponse_description = Lens.lens (\DescribeConfigurationRevisionResponse' {description} -> description) (\s@DescribeConfigurationRevisionResponse' {} a -> s {description = a} :: DescribeConfigurationRevisionResponse)
+
+-- | The revision number.
+describeConfigurationRevisionResponse_revision :: Lens.Lens' DescribeConfigurationRevisionResponse (Prelude.Maybe Prelude.Integer)
+describeConfigurationRevisionResponse_revision = Lens.lens (\DescribeConfigurationRevisionResponse' {revision} -> revision) (\s@DescribeConfigurationRevisionResponse' {} a -> s {revision = a} :: DescribeConfigurationRevisionResponse)
+
+-- | Contents of the server.properties file. When using the API, you must
+-- ensure that the contents of the file are base64 encoded. When using the
+-- AWS Management Console, the SDK, or the AWS CLI, the contents of
+-- server.properties can be in plaintext.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+describeConfigurationRevisionResponse_serverProperties :: Lens.Lens' DescribeConfigurationRevisionResponse (Prelude.Maybe Prelude.ByteString)
+describeConfigurationRevisionResponse_serverProperties = Lens.lens (\DescribeConfigurationRevisionResponse' {serverProperties} -> serverProperties) (\s@DescribeConfigurationRevisionResponse' {} a -> s {serverProperties = a} :: DescribeConfigurationRevisionResponse) Prelude.. Lens.mapping Data._Base64
+
+-- | The response's http status code.
+describeConfigurationRevisionResponse_httpStatus :: Lens.Lens' DescribeConfigurationRevisionResponse Prelude.Int
+describeConfigurationRevisionResponse_httpStatus = Lens.lens (\DescribeConfigurationRevisionResponse' {httpStatus} -> httpStatus) (\s@DescribeConfigurationRevisionResponse' {} a -> s {httpStatus = a} :: DescribeConfigurationRevisionResponse)
+
+instance
+  Prelude.NFData
+    DescribeConfigurationRevisionResponse
+  where
+  rnf DescribeConfigurationRevisionResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf revision
+      `Prelude.seq` Prelude.rnf serverProperties
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/GetBootstrapBrokers.hs b/gen/Amazonka/Kafka/GetBootstrapBrokers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/GetBootstrapBrokers.hs
@@ -0,0 +1,250 @@
+{-# 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.Kafka.GetBootstrapBrokers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- A list of brokers that a client application can use to bootstrap.
+module Amazonka.Kafka.GetBootstrapBrokers
+  ( -- * Creating a Request
+    GetBootstrapBrokers (..),
+    newGetBootstrapBrokers,
+
+    -- * Request Lenses
+    getBootstrapBrokers_clusterArn,
+
+    -- * Destructuring the Response
+    GetBootstrapBrokersResponse (..),
+    newGetBootstrapBrokersResponse,
+
+    -- * Response Lenses
+    getBootstrapBrokersResponse_bootstrapBrokerString,
+    getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslIam,
+    getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslScram,
+    getBootstrapBrokersResponse_bootstrapBrokerStringPublicTls,
+    getBootstrapBrokersResponse_bootstrapBrokerStringSaslIam,
+    getBootstrapBrokersResponse_bootstrapBrokerStringSaslScram,
+    getBootstrapBrokersResponse_bootstrapBrokerStringTls,
+    getBootstrapBrokersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetBootstrapBrokers' smart constructor.
+data GetBootstrapBrokers = GetBootstrapBrokers'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetBootstrapBrokers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'getBootstrapBrokers_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+newGetBootstrapBrokers ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  GetBootstrapBrokers
+newGetBootstrapBrokers pClusterArn_ =
+  GetBootstrapBrokers' {clusterArn = pClusterArn_}
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+getBootstrapBrokers_clusterArn :: Lens.Lens' GetBootstrapBrokers Prelude.Text
+getBootstrapBrokers_clusterArn = Lens.lens (\GetBootstrapBrokers' {clusterArn} -> clusterArn) (\s@GetBootstrapBrokers' {} a -> s {clusterArn = a} :: GetBootstrapBrokers)
+
+instance Core.AWSRequest GetBootstrapBrokers where
+  type
+    AWSResponse GetBootstrapBrokers =
+      GetBootstrapBrokersResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetBootstrapBrokersResponse'
+            Prelude.<$> (x Data..?> "bootstrapBrokerString")
+            Prelude.<*> (x Data..?> "bootstrapBrokerStringPublicSaslIam")
+            Prelude.<*> (x Data..?> "bootstrapBrokerStringPublicSaslScram")
+            Prelude.<*> (x Data..?> "bootstrapBrokerStringPublicTls")
+            Prelude.<*> (x Data..?> "bootstrapBrokerStringSaslIam")
+            Prelude.<*> (x Data..?> "bootstrapBrokerStringSaslScram")
+            Prelude.<*> (x Data..?> "bootstrapBrokerStringTls")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetBootstrapBrokers where
+  hashWithSalt _salt GetBootstrapBrokers' {..} =
+    _salt `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData GetBootstrapBrokers where
+  rnf GetBootstrapBrokers' {..} = Prelude.rnf clusterArn
+
+instance Data.ToHeaders GetBootstrapBrokers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetBootstrapBrokers where
+  toPath GetBootstrapBrokers' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/bootstrap-brokers"
+      ]
+
+instance Data.ToQuery GetBootstrapBrokers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetBootstrapBrokersResponse' smart constructor.
+data GetBootstrapBrokersResponse = GetBootstrapBrokersResponse'
+  { -- | A string containing one or more hostname:port pairs.
+    bootstrapBrokerString :: Prelude.Maybe Prelude.Text,
+    -- | A string that contains one or more DNS names (or IP addresses) and SASL
+    -- IAM port pairs.
+    bootstrapBrokerStringPublicSaslIam :: Prelude.Maybe Prelude.Text,
+    -- | A string containing one or more DNS names (or IP) and Sasl Scram port
+    -- pairs.
+    bootstrapBrokerStringPublicSaslScram :: Prelude.Maybe Prelude.Text,
+    -- | A string containing one or more DNS names (or IP) and TLS port pairs.
+    bootstrapBrokerStringPublicTls :: Prelude.Maybe Prelude.Text,
+    -- | A string that contains one or more DNS names (or IP addresses) and SASL
+    -- IAM port pairs.
+    bootstrapBrokerStringSaslIam :: Prelude.Maybe Prelude.Text,
+    -- | A string containing one or more DNS names (or IP) and Sasl Scram port
+    -- pairs.
+    bootstrapBrokerStringSaslScram :: Prelude.Maybe Prelude.Text,
+    -- | A string containing one or more DNS names (or IP) and TLS port pairs.
+    bootstrapBrokerStringTls :: 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 'GetBootstrapBrokersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bootstrapBrokerString', 'getBootstrapBrokersResponse_bootstrapBrokerString' - A string containing one or more hostname:port pairs.
+--
+-- 'bootstrapBrokerStringPublicSaslIam', 'getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslIam' - A string that contains one or more DNS names (or IP addresses) and SASL
+-- IAM port pairs.
+--
+-- 'bootstrapBrokerStringPublicSaslScram', 'getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslScram' - A string containing one or more DNS names (or IP) and Sasl Scram port
+-- pairs.
+--
+-- 'bootstrapBrokerStringPublicTls', 'getBootstrapBrokersResponse_bootstrapBrokerStringPublicTls' - A string containing one or more DNS names (or IP) and TLS port pairs.
+--
+-- 'bootstrapBrokerStringSaslIam', 'getBootstrapBrokersResponse_bootstrapBrokerStringSaslIam' - A string that contains one or more DNS names (or IP addresses) and SASL
+-- IAM port pairs.
+--
+-- 'bootstrapBrokerStringSaslScram', 'getBootstrapBrokersResponse_bootstrapBrokerStringSaslScram' - A string containing one or more DNS names (or IP) and Sasl Scram port
+-- pairs.
+--
+-- 'bootstrapBrokerStringTls', 'getBootstrapBrokersResponse_bootstrapBrokerStringTls' - A string containing one or more DNS names (or IP) and TLS port pairs.
+--
+-- 'httpStatus', 'getBootstrapBrokersResponse_httpStatus' - The response's http status code.
+newGetBootstrapBrokersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetBootstrapBrokersResponse
+newGetBootstrapBrokersResponse pHttpStatus_ =
+  GetBootstrapBrokersResponse'
+    { bootstrapBrokerString =
+        Prelude.Nothing,
+      bootstrapBrokerStringPublicSaslIam =
+        Prelude.Nothing,
+      bootstrapBrokerStringPublicSaslScram =
+        Prelude.Nothing,
+      bootstrapBrokerStringPublicTls =
+        Prelude.Nothing,
+      bootstrapBrokerStringSaslIam = Prelude.Nothing,
+      bootstrapBrokerStringSaslScram =
+        Prelude.Nothing,
+      bootstrapBrokerStringTls = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A string containing one or more hostname:port pairs.
+getBootstrapBrokersResponse_bootstrapBrokerString :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerString = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerString} -> bootstrapBrokerString) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerString = a} :: GetBootstrapBrokersResponse)
+
+-- | A string that contains one or more DNS names (or IP addresses) and SASL
+-- IAM port pairs.
+getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslIam :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslIam = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerStringPublicSaslIam} -> bootstrapBrokerStringPublicSaslIam) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerStringPublicSaslIam = a} :: GetBootstrapBrokersResponse)
+
+-- | A string containing one or more DNS names (or IP) and Sasl Scram port
+-- pairs.
+getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslScram :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslScram = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerStringPublicSaslScram} -> bootstrapBrokerStringPublicSaslScram) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerStringPublicSaslScram = a} :: GetBootstrapBrokersResponse)
+
+-- | A string containing one or more DNS names (or IP) and TLS port pairs.
+getBootstrapBrokersResponse_bootstrapBrokerStringPublicTls :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerStringPublicTls = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerStringPublicTls} -> bootstrapBrokerStringPublicTls) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerStringPublicTls = a} :: GetBootstrapBrokersResponse)
+
+-- | A string that contains one or more DNS names (or IP addresses) and SASL
+-- IAM port pairs.
+getBootstrapBrokersResponse_bootstrapBrokerStringSaslIam :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerStringSaslIam = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerStringSaslIam} -> bootstrapBrokerStringSaslIam) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerStringSaslIam = a} :: GetBootstrapBrokersResponse)
+
+-- | A string containing one or more DNS names (or IP) and Sasl Scram port
+-- pairs.
+getBootstrapBrokersResponse_bootstrapBrokerStringSaslScram :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerStringSaslScram = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerStringSaslScram} -> bootstrapBrokerStringSaslScram) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerStringSaslScram = a} :: GetBootstrapBrokersResponse)
+
+-- | A string containing one or more DNS names (or IP) and TLS port pairs.
+getBootstrapBrokersResponse_bootstrapBrokerStringTls :: Lens.Lens' GetBootstrapBrokersResponse (Prelude.Maybe Prelude.Text)
+getBootstrapBrokersResponse_bootstrapBrokerStringTls = Lens.lens (\GetBootstrapBrokersResponse' {bootstrapBrokerStringTls} -> bootstrapBrokerStringTls) (\s@GetBootstrapBrokersResponse' {} a -> s {bootstrapBrokerStringTls = a} :: GetBootstrapBrokersResponse)
+
+-- | The response's http status code.
+getBootstrapBrokersResponse_httpStatus :: Lens.Lens' GetBootstrapBrokersResponse Prelude.Int
+getBootstrapBrokersResponse_httpStatus = Lens.lens (\GetBootstrapBrokersResponse' {httpStatus} -> httpStatus) (\s@GetBootstrapBrokersResponse' {} a -> s {httpStatus = a} :: GetBootstrapBrokersResponse)
+
+instance Prelude.NFData GetBootstrapBrokersResponse where
+  rnf GetBootstrapBrokersResponse' {..} =
+    Prelude.rnf bootstrapBrokerString
+      `Prelude.seq` Prelude.rnf bootstrapBrokerStringPublicSaslIam
+      `Prelude.seq` Prelude.rnf bootstrapBrokerStringPublicSaslScram
+      `Prelude.seq` Prelude.rnf bootstrapBrokerStringPublicTls
+      `Prelude.seq` Prelude.rnf bootstrapBrokerStringSaslIam
+      `Prelude.seq` Prelude.rnf bootstrapBrokerStringSaslScram
+      `Prelude.seq` Prelude.rnf bootstrapBrokerStringTls
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/GetCompatibleKafkaVersions.hs b/gen/Amazonka/Kafka/GetCompatibleKafkaVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/GetCompatibleKafkaVersions.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.Kafka.GetCompatibleKafkaVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the Apache Kafka versions to which you can update the MSK cluster.
+module Amazonka.Kafka.GetCompatibleKafkaVersions
+  ( -- * Creating a Request
+    GetCompatibleKafkaVersions (..),
+    newGetCompatibleKafkaVersions,
+
+    -- * Request Lenses
+    getCompatibleKafkaVersions_clusterArn,
+
+    -- * Destructuring the Response
+    GetCompatibleKafkaVersionsResponse (..),
+    newGetCompatibleKafkaVersionsResponse,
+
+    -- * Response Lenses
+    getCompatibleKafkaVersionsResponse_compatibleKafkaVersions,
+    getCompatibleKafkaVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetCompatibleKafkaVersions' smart constructor.
+data GetCompatibleKafkaVersions = GetCompatibleKafkaVersions'
+  { -- | The Amazon Resource Name (ARN) of the cluster check.
+    clusterArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCompatibleKafkaVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'getCompatibleKafkaVersions_clusterArn' - The Amazon Resource Name (ARN) of the cluster check.
+newGetCompatibleKafkaVersions ::
+  GetCompatibleKafkaVersions
+newGetCompatibleKafkaVersions =
+  GetCompatibleKafkaVersions'
+    { clusterArn =
+        Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster check.
+getCompatibleKafkaVersions_clusterArn :: Lens.Lens' GetCompatibleKafkaVersions (Prelude.Maybe Prelude.Text)
+getCompatibleKafkaVersions_clusterArn = Lens.lens (\GetCompatibleKafkaVersions' {clusterArn} -> clusterArn) (\s@GetCompatibleKafkaVersions' {} a -> s {clusterArn = a} :: GetCompatibleKafkaVersions)
+
+instance Core.AWSRequest GetCompatibleKafkaVersions where
+  type
+    AWSResponse GetCompatibleKafkaVersions =
+      GetCompatibleKafkaVersionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetCompatibleKafkaVersionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "compatibleKafkaVersions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetCompatibleKafkaVersions where
+  hashWithSalt _salt GetCompatibleKafkaVersions' {..} =
+    _salt `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData GetCompatibleKafkaVersions where
+  rnf GetCompatibleKafkaVersions' {..} =
+    Prelude.rnf clusterArn
+
+instance Data.ToHeaders GetCompatibleKafkaVersions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetCompatibleKafkaVersions where
+  toPath =
+    Prelude.const "/v1/compatible-kafka-versions"
+
+instance Data.ToQuery GetCompatibleKafkaVersions where
+  toQuery GetCompatibleKafkaVersions' {..} =
+    Prelude.mconcat ["clusterArn" Data.=: clusterArn]
+
+-- | /See:/ 'newGetCompatibleKafkaVersionsResponse' smart constructor.
+data GetCompatibleKafkaVersionsResponse = GetCompatibleKafkaVersionsResponse'
+  { -- | A list of CompatibleKafkaVersion objects.
+    compatibleKafkaVersions :: Prelude.Maybe [CompatibleKafkaVersion],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCompatibleKafkaVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'compatibleKafkaVersions', 'getCompatibleKafkaVersionsResponse_compatibleKafkaVersions' - A list of CompatibleKafkaVersion objects.
+--
+-- 'httpStatus', 'getCompatibleKafkaVersionsResponse_httpStatus' - The response's http status code.
+newGetCompatibleKafkaVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetCompatibleKafkaVersionsResponse
+newGetCompatibleKafkaVersionsResponse pHttpStatus_ =
+  GetCompatibleKafkaVersionsResponse'
+    { compatibleKafkaVersions =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of CompatibleKafkaVersion objects.
+getCompatibleKafkaVersionsResponse_compatibleKafkaVersions :: Lens.Lens' GetCompatibleKafkaVersionsResponse (Prelude.Maybe [CompatibleKafkaVersion])
+getCompatibleKafkaVersionsResponse_compatibleKafkaVersions = Lens.lens (\GetCompatibleKafkaVersionsResponse' {compatibleKafkaVersions} -> compatibleKafkaVersions) (\s@GetCompatibleKafkaVersionsResponse' {} a -> s {compatibleKafkaVersions = a} :: GetCompatibleKafkaVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getCompatibleKafkaVersionsResponse_httpStatus :: Lens.Lens' GetCompatibleKafkaVersionsResponse Prelude.Int
+getCompatibleKafkaVersionsResponse_httpStatus = Lens.lens (\GetCompatibleKafkaVersionsResponse' {httpStatus} -> httpStatus) (\s@GetCompatibleKafkaVersionsResponse' {} a -> s {httpStatus = a} :: GetCompatibleKafkaVersionsResponse)
+
+instance
+  Prelude.NFData
+    GetCompatibleKafkaVersionsResponse
+  where
+  rnf GetCompatibleKafkaVersionsResponse' {..} =
+    Prelude.rnf compatibleKafkaVersions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/Lens.hs b/gen/Amazonka/Kafka/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Lens.hs
@@ -0,0 +1,687 @@
+{-# 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.Kafka.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.Kafka.Lens
+  ( -- * Operations
+
+    -- ** BatchAssociateScramSecret
+    batchAssociateScramSecret_clusterArn,
+    batchAssociateScramSecret_secretArnList,
+    batchAssociateScramSecretResponse_clusterArn,
+    batchAssociateScramSecretResponse_unprocessedScramSecrets,
+    batchAssociateScramSecretResponse_httpStatus,
+
+    -- ** BatchDisassociateScramSecret
+    batchDisassociateScramSecret_clusterArn,
+    batchDisassociateScramSecret_secretArnList,
+    batchDisassociateScramSecretResponse_clusterArn,
+    batchDisassociateScramSecretResponse_unprocessedScramSecrets,
+    batchDisassociateScramSecretResponse_httpStatus,
+
+    -- ** CreateCluster
+    createCluster_clientAuthentication,
+    createCluster_configurationInfo,
+    createCluster_encryptionInfo,
+    createCluster_enhancedMonitoring,
+    createCluster_loggingInfo,
+    createCluster_openMonitoring,
+    createCluster_storageMode,
+    createCluster_tags,
+    createCluster_brokerNodeGroupInfo,
+    createCluster_kafkaVersion,
+    createCluster_numberOfBrokerNodes,
+    createCluster_clusterName,
+    createClusterResponse_clusterArn,
+    createClusterResponse_clusterName,
+    createClusterResponse_state,
+    createClusterResponse_httpStatus,
+
+    -- ** CreateClusterV2
+    createClusterV2_provisioned,
+    createClusterV2_serverless,
+    createClusterV2_tags,
+    createClusterV2_clusterName,
+    createClusterV2Response_clusterArn,
+    createClusterV2Response_clusterName,
+    createClusterV2Response_clusterType,
+    createClusterV2Response_state,
+    createClusterV2Response_httpStatus,
+
+    -- ** CreateConfiguration
+    createConfiguration_description,
+    createConfiguration_kafkaVersions,
+    createConfiguration_serverProperties,
+    createConfiguration_name,
+    createConfigurationResponse_arn,
+    createConfigurationResponse_creationTime,
+    createConfigurationResponse_latestRevision,
+    createConfigurationResponse_name,
+    createConfigurationResponse_state,
+    createConfigurationResponse_httpStatus,
+
+    -- ** DeleteCluster
+    deleteCluster_currentVersion,
+    deleteCluster_clusterArn,
+    deleteClusterResponse_clusterArn,
+    deleteClusterResponse_state,
+    deleteClusterResponse_httpStatus,
+
+    -- ** DeleteConfiguration
+    deleteConfiguration_arn,
+    deleteConfigurationResponse_arn,
+    deleteConfigurationResponse_state,
+    deleteConfigurationResponse_httpStatus,
+
+    -- ** DescribeCluster
+    describeCluster_clusterArn,
+    describeClusterResponse_clusterInfo,
+    describeClusterResponse_httpStatus,
+
+    -- ** DescribeClusterOperation
+    describeClusterOperation_clusterOperationArn,
+    describeClusterOperationResponse_clusterOperationInfo,
+    describeClusterOperationResponse_httpStatus,
+
+    -- ** DescribeClusterV2
+    describeClusterV2_clusterArn,
+    describeClusterV2Response_clusterInfo,
+    describeClusterV2Response_httpStatus,
+
+    -- ** DescribeConfiguration
+    describeConfiguration_arn,
+    describeConfigurationResponse_arn,
+    describeConfigurationResponse_creationTime,
+    describeConfigurationResponse_description,
+    describeConfigurationResponse_kafkaVersions,
+    describeConfigurationResponse_latestRevision,
+    describeConfigurationResponse_name,
+    describeConfigurationResponse_state,
+    describeConfigurationResponse_httpStatus,
+
+    -- ** DescribeConfigurationRevision
+    describeConfigurationRevision_revision,
+    describeConfigurationRevision_arn,
+    describeConfigurationRevisionResponse_arn,
+    describeConfigurationRevisionResponse_creationTime,
+    describeConfigurationRevisionResponse_description,
+    describeConfigurationRevisionResponse_revision,
+    describeConfigurationRevisionResponse_serverProperties,
+    describeConfigurationRevisionResponse_httpStatus,
+
+    -- ** GetBootstrapBrokers
+    getBootstrapBrokers_clusterArn,
+    getBootstrapBrokersResponse_bootstrapBrokerString,
+    getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslIam,
+    getBootstrapBrokersResponse_bootstrapBrokerStringPublicSaslScram,
+    getBootstrapBrokersResponse_bootstrapBrokerStringPublicTls,
+    getBootstrapBrokersResponse_bootstrapBrokerStringSaslIam,
+    getBootstrapBrokersResponse_bootstrapBrokerStringSaslScram,
+    getBootstrapBrokersResponse_bootstrapBrokerStringTls,
+    getBootstrapBrokersResponse_httpStatus,
+
+    -- ** GetCompatibleKafkaVersions
+    getCompatibleKafkaVersions_clusterArn,
+    getCompatibleKafkaVersionsResponse_compatibleKafkaVersions,
+    getCompatibleKafkaVersionsResponse_httpStatus,
+
+    -- ** ListClusterOperations
+    listClusterOperations_maxResults,
+    listClusterOperations_nextToken,
+    listClusterOperations_clusterArn,
+    listClusterOperationsResponse_clusterOperationInfoList,
+    listClusterOperationsResponse_nextToken,
+    listClusterOperationsResponse_httpStatus,
+
+    -- ** ListClusters
+    listClusters_clusterNameFilter,
+    listClusters_maxResults,
+    listClusters_nextToken,
+    listClustersResponse_clusterInfoList,
+    listClustersResponse_nextToken,
+    listClustersResponse_httpStatus,
+
+    -- ** ListClustersV2
+    listClustersV2_clusterNameFilter,
+    listClustersV2_clusterTypeFilter,
+    listClustersV2_maxResults,
+    listClustersV2_nextToken,
+    listClustersV2Response_clusterInfoList,
+    listClustersV2Response_nextToken,
+    listClustersV2Response_httpStatus,
+
+    -- ** ListConfigurationRevisions
+    listConfigurationRevisions_maxResults,
+    listConfigurationRevisions_nextToken,
+    listConfigurationRevisions_arn,
+    listConfigurationRevisionsResponse_nextToken,
+    listConfigurationRevisionsResponse_revisions,
+    listConfigurationRevisionsResponse_httpStatus,
+
+    -- ** ListConfigurations
+    listConfigurations_maxResults,
+    listConfigurations_nextToken,
+    listConfigurationsResponse_configurations,
+    listConfigurationsResponse_nextToken,
+    listConfigurationsResponse_httpStatus,
+
+    -- ** ListKafkaVersions
+    listKafkaVersions_maxResults,
+    listKafkaVersions_nextToken,
+    listKafkaVersionsResponse_kafkaVersions,
+    listKafkaVersionsResponse_nextToken,
+    listKafkaVersionsResponse_httpStatus,
+
+    -- ** ListNodes
+    listNodes_maxResults,
+    listNodes_nextToken,
+    listNodes_clusterArn,
+    listNodesResponse_nextToken,
+    listNodesResponse_nodeInfoList,
+    listNodesResponse_httpStatus,
+
+    -- ** ListScramSecrets
+    listScramSecrets_maxResults,
+    listScramSecrets_nextToken,
+    listScramSecrets_clusterArn,
+    listScramSecretsResponse_nextToken,
+    listScramSecretsResponse_secretArnList,
+    listScramSecretsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** RebootBroker
+    rebootBroker_clusterArn,
+    rebootBroker_brokerIds,
+    rebootBrokerResponse_clusterArn,
+    rebootBrokerResponse_clusterOperationArn,
+    rebootBrokerResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- ** UntagResource
+    untagResource_tagKeys,
+    untagResource_resourceArn,
+
+    -- ** UpdateBrokerCount
+    updateBrokerCount_clusterArn,
+    updateBrokerCount_currentVersion,
+    updateBrokerCount_targetNumberOfBrokerNodes,
+    updateBrokerCountResponse_clusterArn,
+    updateBrokerCountResponse_clusterOperationArn,
+    updateBrokerCountResponse_httpStatus,
+
+    -- ** UpdateBrokerStorage
+    updateBrokerStorage_clusterArn,
+    updateBrokerStorage_targetBrokerEBSVolumeInfo,
+    updateBrokerStorage_currentVersion,
+    updateBrokerStorageResponse_clusterArn,
+    updateBrokerStorageResponse_clusterOperationArn,
+    updateBrokerStorageResponse_httpStatus,
+
+    -- ** UpdateBrokerType
+    updateBrokerType_clusterArn,
+    updateBrokerType_currentVersion,
+    updateBrokerType_targetInstanceType,
+    updateBrokerTypeResponse_clusterArn,
+    updateBrokerTypeResponse_clusterOperationArn,
+    updateBrokerTypeResponse_httpStatus,
+
+    -- ** UpdateClusterConfiguration
+    updateClusterConfiguration_clusterArn,
+    updateClusterConfiguration_currentVersion,
+    updateClusterConfiguration_configurationInfo,
+    updateClusterConfigurationResponse_clusterArn,
+    updateClusterConfigurationResponse_clusterOperationArn,
+    updateClusterConfigurationResponse_httpStatus,
+
+    -- ** UpdateClusterKafkaVersion
+    updateClusterKafkaVersion_configurationInfo,
+    updateClusterKafkaVersion_clusterArn,
+    updateClusterKafkaVersion_targetKafkaVersion,
+    updateClusterKafkaVersion_currentVersion,
+    updateClusterKafkaVersionResponse_clusterArn,
+    updateClusterKafkaVersionResponse_clusterOperationArn,
+    updateClusterKafkaVersionResponse_httpStatus,
+
+    -- ** UpdateConfiguration
+    updateConfiguration_description,
+    updateConfiguration_arn,
+    updateConfiguration_serverProperties,
+    updateConfigurationResponse_arn,
+    updateConfigurationResponse_latestRevision,
+    updateConfigurationResponse_httpStatus,
+
+    -- ** UpdateConnectivity
+    updateConnectivity_clusterArn,
+    updateConnectivity_connectivityInfo,
+    updateConnectivity_currentVersion,
+    updateConnectivityResponse_clusterArn,
+    updateConnectivityResponse_clusterOperationArn,
+    updateConnectivityResponse_httpStatus,
+
+    -- ** UpdateMonitoring
+    updateMonitoring_enhancedMonitoring,
+    updateMonitoring_loggingInfo,
+    updateMonitoring_openMonitoring,
+    updateMonitoring_clusterArn,
+    updateMonitoring_currentVersion,
+    updateMonitoringResponse_clusterArn,
+    updateMonitoringResponse_clusterOperationArn,
+    updateMonitoringResponse_httpStatus,
+
+    -- ** UpdateSecurity
+    updateSecurity_clientAuthentication,
+    updateSecurity_encryptionInfo,
+    updateSecurity_clusterArn,
+    updateSecurity_currentVersion,
+    updateSecurityResponse_clusterArn,
+    updateSecurityResponse_clusterOperationArn,
+    updateSecurityResponse_httpStatus,
+
+    -- ** UpdateStorage
+    updateStorage_provisionedThroughput,
+    updateStorage_storageMode,
+    updateStorage_volumeSizeGB,
+    updateStorage_clusterArn,
+    updateStorage_currentVersion,
+    updateStorageResponse_clusterArn,
+    updateStorageResponse_clusterOperationArn,
+    updateStorageResponse_httpStatus,
+
+    -- * Types
+
+    -- ** BrokerEBSVolumeInfo
+    brokerEBSVolumeInfo_provisionedThroughput,
+    brokerEBSVolumeInfo_volumeSizeGB,
+    brokerEBSVolumeInfo_kafkaBrokerNodeId,
+
+    -- ** BrokerLogs
+    brokerLogs_cloudWatchLogs,
+    brokerLogs_firehose,
+    brokerLogs_s3,
+
+    -- ** BrokerNodeGroupInfo
+    brokerNodeGroupInfo_brokerAZDistribution,
+    brokerNodeGroupInfo_connectivityInfo,
+    brokerNodeGroupInfo_securityGroups,
+    brokerNodeGroupInfo_storageInfo,
+    brokerNodeGroupInfo_clientSubnets,
+    brokerNodeGroupInfo_instanceType,
+
+    -- ** BrokerNodeInfo
+    brokerNodeInfo_attachedENIId,
+    brokerNodeInfo_brokerId,
+    brokerNodeInfo_clientSubnet,
+    brokerNodeInfo_clientVpcIpAddress,
+    brokerNodeInfo_currentBrokerSoftwareInfo,
+    brokerNodeInfo_endpoints,
+
+    -- ** BrokerSoftwareInfo
+    brokerSoftwareInfo_configurationArn,
+    brokerSoftwareInfo_configurationRevision,
+    brokerSoftwareInfo_kafkaVersion,
+
+    -- ** ClientAuthentication
+    clientAuthentication_sasl,
+    clientAuthentication_tls,
+    clientAuthentication_unauthenticated,
+
+    -- ** CloudWatchLogs
+    cloudWatchLogs_logGroup,
+    cloudWatchLogs_enabled,
+
+    -- ** Cluster
+    cluster_activeOperationArn,
+    cluster_clusterArn,
+    cluster_clusterName,
+    cluster_clusterType,
+    cluster_creationTime,
+    cluster_currentVersion,
+    cluster_provisioned,
+    cluster_serverless,
+    cluster_state,
+    cluster_stateInfo,
+    cluster_tags,
+
+    -- ** ClusterInfo
+    clusterInfo_activeOperationArn,
+    clusterInfo_brokerNodeGroupInfo,
+    clusterInfo_clientAuthentication,
+    clusterInfo_clusterArn,
+    clusterInfo_clusterName,
+    clusterInfo_creationTime,
+    clusterInfo_currentBrokerSoftwareInfo,
+    clusterInfo_currentVersion,
+    clusterInfo_encryptionInfo,
+    clusterInfo_enhancedMonitoring,
+    clusterInfo_loggingInfo,
+    clusterInfo_numberOfBrokerNodes,
+    clusterInfo_openMonitoring,
+    clusterInfo_state,
+    clusterInfo_stateInfo,
+    clusterInfo_storageMode,
+    clusterInfo_tags,
+    clusterInfo_zookeeperConnectString,
+    clusterInfo_zookeeperConnectStringTls,
+
+    -- ** ClusterOperationInfo
+    clusterOperationInfo_clientRequestId,
+    clusterOperationInfo_clusterArn,
+    clusterOperationInfo_creationTime,
+    clusterOperationInfo_endTime,
+    clusterOperationInfo_errorInfo,
+    clusterOperationInfo_operationArn,
+    clusterOperationInfo_operationState,
+    clusterOperationInfo_operationSteps,
+    clusterOperationInfo_operationType,
+    clusterOperationInfo_sourceClusterInfo,
+    clusterOperationInfo_targetClusterInfo,
+
+    -- ** ClusterOperationStep
+    clusterOperationStep_stepInfo,
+    clusterOperationStep_stepName,
+
+    -- ** ClusterOperationStepInfo
+    clusterOperationStepInfo_stepStatus,
+
+    -- ** CompatibleKafkaVersion
+    compatibleKafkaVersion_sourceVersion,
+    compatibleKafkaVersion_targetVersions,
+
+    -- ** Configuration
+    configuration_description,
+    configuration_latestRevision,
+    configuration_creationTime,
+    configuration_kafkaVersions,
+    configuration_arn,
+    configuration_name,
+    configuration_state,
+
+    -- ** ConfigurationInfo
+    configurationInfo_revision,
+    configurationInfo_arn,
+
+    -- ** ConfigurationRevision
+    configurationRevision_description,
+    configurationRevision_revision,
+    configurationRevision_creationTime,
+
+    -- ** ConnectivityInfo
+    connectivityInfo_publicAccess,
+
+    -- ** EBSStorageInfo
+    eBSStorageInfo_provisionedThroughput,
+    eBSStorageInfo_volumeSize,
+
+    -- ** EncryptionAtRest
+    encryptionAtRest_dataVolumeKMSKeyId,
+
+    -- ** EncryptionInTransit
+    encryptionInTransit_clientBroker,
+    encryptionInTransit_inCluster,
+
+    -- ** EncryptionInfo
+    encryptionInfo_encryptionAtRest,
+    encryptionInfo_encryptionInTransit,
+
+    -- ** ErrorInfo
+    errorInfo_errorCode,
+    errorInfo_errorString,
+
+    -- ** Firehose
+    firehose_deliveryStream,
+    firehose_enabled,
+
+    -- ** Iam
+    iam_enabled,
+
+    -- ** JmxExporter
+    jmxExporter_enabledInBroker,
+
+    -- ** JmxExporterInfo
+    jmxExporterInfo_enabledInBroker,
+
+    -- ** KafkaVersion
+    kafkaVersion_status,
+    kafkaVersion_version,
+
+    -- ** LoggingInfo
+    loggingInfo_brokerLogs,
+
+    -- ** MutableClusterInfo
+    mutableClusterInfo_brokerEBSVolumeInfo,
+    mutableClusterInfo_clientAuthentication,
+    mutableClusterInfo_configurationInfo,
+    mutableClusterInfo_connectivityInfo,
+    mutableClusterInfo_encryptionInfo,
+    mutableClusterInfo_enhancedMonitoring,
+    mutableClusterInfo_instanceType,
+    mutableClusterInfo_kafkaVersion,
+    mutableClusterInfo_loggingInfo,
+    mutableClusterInfo_numberOfBrokerNodes,
+    mutableClusterInfo_openMonitoring,
+    mutableClusterInfo_storageMode,
+
+    -- ** NodeExporter
+    nodeExporter_enabledInBroker,
+
+    -- ** NodeExporterInfo
+    nodeExporterInfo_enabledInBroker,
+
+    -- ** NodeInfo
+    nodeInfo_addedToClusterTime,
+    nodeInfo_brokerNodeInfo,
+    nodeInfo_instanceType,
+    nodeInfo_nodeARN,
+    nodeInfo_nodeType,
+    nodeInfo_zookeeperNodeInfo,
+
+    -- ** OpenMonitoring
+    openMonitoring_prometheus,
+
+    -- ** OpenMonitoringInfo
+    openMonitoringInfo_prometheus,
+
+    -- ** Prometheus
+    prometheus_jmxExporter,
+    prometheus_nodeExporter,
+
+    -- ** PrometheusInfo
+    prometheusInfo_jmxExporter,
+    prometheusInfo_nodeExporter,
+
+    -- ** Provisioned
+    provisioned_clientAuthentication,
+    provisioned_currentBrokerSoftwareInfo,
+    provisioned_encryptionInfo,
+    provisioned_enhancedMonitoring,
+    provisioned_loggingInfo,
+    provisioned_openMonitoring,
+    provisioned_storageMode,
+    provisioned_zookeeperConnectString,
+    provisioned_zookeeperConnectStringTls,
+    provisioned_brokerNodeGroupInfo,
+    provisioned_numberOfBrokerNodes,
+
+    -- ** ProvisionedRequest
+    provisionedRequest_clientAuthentication,
+    provisionedRequest_configurationInfo,
+    provisionedRequest_encryptionInfo,
+    provisionedRequest_enhancedMonitoring,
+    provisionedRequest_loggingInfo,
+    provisionedRequest_openMonitoring,
+    provisionedRequest_storageMode,
+    provisionedRequest_brokerNodeGroupInfo,
+    provisionedRequest_kafkaVersion,
+    provisionedRequest_numberOfBrokerNodes,
+
+    -- ** ProvisionedThroughput
+    provisionedThroughput_enabled,
+    provisionedThroughput_volumeThroughput,
+
+    -- ** PublicAccess
+    publicAccess_type,
+
+    -- ** S3
+    s3_bucket,
+    s3_prefix,
+    s3_enabled,
+
+    -- ** Sasl
+    sasl_iam,
+    sasl_scram,
+
+    -- ** Scram
+    scram_enabled,
+
+    -- ** Serverless
+    serverless_clientAuthentication,
+    serverless_vpcConfigs,
+
+    -- ** ServerlessClientAuthentication
+    serverlessClientAuthentication_sasl,
+
+    -- ** ServerlessRequest
+    serverlessRequest_clientAuthentication,
+    serverlessRequest_vpcConfigs,
+
+    -- ** ServerlessSasl
+    serverlessSasl_iam,
+
+    -- ** StateInfo
+    stateInfo_code,
+    stateInfo_message,
+
+    -- ** StorageInfo
+    storageInfo_ebsStorageInfo,
+
+    -- ** Tls
+    tls_certificateAuthorityArnList,
+    tls_enabled,
+
+    -- ** Unauthenticated
+    unauthenticated_enabled,
+
+    -- ** UnprocessedScramSecret
+    unprocessedScramSecret_errorCode,
+    unprocessedScramSecret_errorMessage,
+    unprocessedScramSecret_secretArn,
+
+    -- ** VpcConfig
+    vpcConfig_securityGroupIds,
+    vpcConfig_subnetIds,
+
+    -- ** ZookeeperNodeInfo
+    zookeeperNodeInfo_attachedENIId,
+    zookeeperNodeInfo_clientVpcIpAddress,
+    zookeeperNodeInfo_endpoints,
+    zookeeperNodeInfo_zookeeperId,
+    zookeeperNodeInfo_zookeeperVersion,
+  )
+where
+
+import Amazonka.Kafka.BatchAssociateScramSecret
+import Amazonka.Kafka.BatchDisassociateScramSecret
+import Amazonka.Kafka.CreateCluster
+import Amazonka.Kafka.CreateClusterV2
+import Amazonka.Kafka.CreateConfiguration
+import Amazonka.Kafka.DeleteCluster
+import Amazonka.Kafka.DeleteConfiguration
+import Amazonka.Kafka.DescribeCluster
+import Amazonka.Kafka.DescribeClusterOperation
+import Amazonka.Kafka.DescribeClusterV2
+import Amazonka.Kafka.DescribeConfiguration
+import Amazonka.Kafka.DescribeConfigurationRevision
+import Amazonka.Kafka.GetBootstrapBrokers
+import Amazonka.Kafka.GetCompatibleKafkaVersions
+import Amazonka.Kafka.ListClusterOperations
+import Amazonka.Kafka.ListClusters
+import Amazonka.Kafka.ListClustersV2
+import Amazonka.Kafka.ListConfigurationRevisions
+import Amazonka.Kafka.ListConfigurations
+import Amazonka.Kafka.ListKafkaVersions
+import Amazonka.Kafka.ListNodes
+import Amazonka.Kafka.ListScramSecrets
+import Amazonka.Kafka.ListTagsForResource
+import Amazonka.Kafka.RebootBroker
+import Amazonka.Kafka.TagResource
+import Amazonka.Kafka.Types.BrokerEBSVolumeInfo
+import Amazonka.Kafka.Types.BrokerLogs
+import Amazonka.Kafka.Types.BrokerNodeGroupInfo
+import Amazonka.Kafka.Types.BrokerNodeInfo
+import Amazonka.Kafka.Types.BrokerSoftwareInfo
+import Amazonka.Kafka.Types.ClientAuthentication
+import Amazonka.Kafka.Types.CloudWatchLogs
+import Amazonka.Kafka.Types.Cluster
+import Amazonka.Kafka.Types.ClusterInfo
+import Amazonka.Kafka.Types.ClusterOperationInfo
+import Amazonka.Kafka.Types.ClusterOperationStep
+import Amazonka.Kafka.Types.ClusterOperationStepInfo
+import Amazonka.Kafka.Types.CompatibleKafkaVersion
+import Amazonka.Kafka.Types.Configuration
+import Amazonka.Kafka.Types.ConfigurationInfo
+import Amazonka.Kafka.Types.ConfigurationRevision
+import Amazonka.Kafka.Types.ConnectivityInfo
+import Amazonka.Kafka.Types.EBSStorageInfo
+import Amazonka.Kafka.Types.EncryptionAtRest
+import Amazonka.Kafka.Types.EncryptionInTransit
+import Amazonka.Kafka.Types.EncryptionInfo
+import Amazonka.Kafka.Types.ErrorInfo
+import Amazonka.Kafka.Types.Firehose
+import Amazonka.Kafka.Types.Iam
+import Amazonka.Kafka.Types.JmxExporter
+import Amazonka.Kafka.Types.JmxExporterInfo
+import Amazonka.Kafka.Types.KafkaVersion
+import Amazonka.Kafka.Types.LoggingInfo
+import Amazonka.Kafka.Types.MutableClusterInfo
+import Amazonka.Kafka.Types.NodeExporter
+import Amazonka.Kafka.Types.NodeExporterInfo
+import Amazonka.Kafka.Types.NodeInfo
+import Amazonka.Kafka.Types.OpenMonitoring
+import Amazonka.Kafka.Types.OpenMonitoringInfo
+import Amazonka.Kafka.Types.Prometheus
+import Amazonka.Kafka.Types.PrometheusInfo
+import Amazonka.Kafka.Types.Provisioned
+import Amazonka.Kafka.Types.ProvisionedRequest
+import Amazonka.Kafka.Types.ProvisionedThroughput
+import Amazonka.Kafka.Types.PublicAccess
+import Amazonka.Kafka.Types.S3
+import Amazonka.Kafka.Types.Sasl
+import Amazonka.Kafka.Types.Scram
+import Amazonka.Kafka.Types.Serverless
+import Amazonka.Kafka.Types.ServerlessClientAuthentication
+import Amazonka.Kafka.Types.ServerlessRequest
+import Amazonka.Kafka.Types.ServerlessSasl
+import Amazonka.Kafka.Types.StateInfo
+import Amazonka.Kafka.Types.StorageInfo
+import Amazonka.Kafka.Types.Tls
+import Amazonka.Kafka.Types.Unauthenticated
+import Amazonka.Kafka.Types.UnprocessedScramSecret
+import Amazonka.Kafka.Types.VpcConfig
+import Amazonka.Kafka.Types.ZookeeperNodeInfo
+import Amazonka.Kafka.UntagResource
+import Amazonka.Kafka.UpdateBrokerCount
+import Amazonka.Kafka.UpdateBrokerStorage
+import Amazonka.Kafka.UpdateBrokerType
+import Amazonka.Kafka.UpdateClusterConfiguration
+import Amazonka.Kafka.UpdateClusterKafkaVersion
+import Amazonka.Kafka.UpdateConfiguration
+import Amazonka.Kafka.UpdateConnectivity
+import Amazonka.Kafka.UpdateMonitoring
+import Amazonka.Kafka.UpdateSecurity
+import Amazonka.Kafka.UpdateStorage
diff --git a/gen/Amazonka/Kafka/ListClusterOperations.hs b/gen/Amazonka/Kafka/ListClusterOperations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListClusterOperations.hs
@@ -0,0 +1,250 @@
+{-# 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.Kafka.ListClusterOperations
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of all the operations that have been performed on the
+-- specified MSK cluster.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListClusterOperations
+  ( -- * Creating a Request
+    ListClusterOperations (..),
+    newListClusterOperations,
+
+    -- * Request Lenses
+    listClusterOperations_maxResults,
+    listClusterOperations_nextToken,
+    listClusterOperations_clusterArn,
+
+    -- * Destructuring the Response
+    ListClusterOperationsResponse (..),
+    newListClusterOperationsResponse,
+
+    -- * Response Lenses
+    listClusterOperationsResponse_clusterOperationInfoList,
+    listClusterOperationsResponse_nextToken,
+    listClusterOperationsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListClusterOperations' smart constructor.
+data ListClusterOperations = ListClusterOperations'
+  { -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListClusterOperations' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listClusterOperations_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listClusterOperations_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+--
+-- 'clusterArn', 'listClusterOperations_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+newListClusterOperations ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  ListClusterOperations
+newListClusterOperations pClusterArn_ =
+  ListClusterOperations'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      clusterArn = pClusterArn_
+    }
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listClusterOperations_maxResults :: Lens.Lens' ListClusterOperations (Prelude.Maybe Prelude.Natural)
+listClusterOperations_maxResults = Lens.lens (\ListClusterOperations' {maxResults} -> maxResults) (\s@ListClusterOperations' {} a -> s {maxResults = a} :: ListClusterOperations)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listClusterOperations_nextToken :: Lens.Lens' ListClusterOperations (Prelude.Maybe Prelude.Text)
+listClusterOperations_nextToken = Lens.lens (\ListClusterOperations' {nextToken} -> nextToken) (\s@ListClusterOperations' {} a -> s {nextToken = a} :: ListClusterOperations)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+listClusterOperations_clusterArn :: Lens.Lens' ListClusterOperations Prelude.Text
+listClusterOperations_clusterArn = Lens.lens (\ListClusterOperations' {clusterArn} -> clusterArn) (\s@ListClusterOperations' {} a -> s {clusterArn = a} :: ListClusterOperations)
+
+instance Core.AWSPager ListClusterOperations where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listClusterOperationsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listClusterOperationsResponse_clusterOperationInfoList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listClusterOperations_nextToken
+          Lens..~ rs
+          Lens.^? listClusterOperationsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListClusterOperations where
+  type
+    AWSResponse ListClusterOperations =
+      ListClusterOperationsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListClusterOperationsResponse'
+            Prelude.<$> ( x
+                            Data..?> "clusterOperationInfoList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListClusterOperations where
+  hashWithSalt _salt ListClusterOperations' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData ListClusterOperations where
+  rnf ListClusterOperations' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf clusterArn
+
+instance Data.ToHeaders ListClusterOperations where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListClusterOperations where
+  toPath ListClusterOperations' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/operations"
+      ]
+
+instance Data.ToQuery ListClusterOperations where
+  toQuery ListClusterOperations' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListClusterOperationsResponse' smart constructor.
+data ListClusterOperationsResponse = ListClusterOperationsResponse'
+  { -- | An array of cluster operation information objects.
+    clusterOperationInfoList :: Prelude.Maybe [ClusterOperationInfo],
+    -- | If the response of ListClusterOperations is truncated, it returns a
+    -- NextToken in the response. This Nexttoken should be sent in the
+    -- subsequent request to ListClusterOperations.
+    nextToken :: 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 'ListClusterOperationsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterOperationInfoList', 'listClusterOperationsResponse_clusterOperationInfoList' - An array of cluster operation information objects.
+--
+-- 'nextToken', 'listClusterOperationsResponse_nextToken' - If the response of ListClusterOperations is truncated, it returns a
+-- NextToken in the response. This Nexttoken should be sent in the
+-- subsequent request to ListClusterOperations.
+--
+-- 'httpStatus', 'listClusterOperationsResponse_httpStatus' - The response's http status code.
+newListClusterOperationsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListClusterOperationsResponse
+newListClusterOperationsResponse pHttpStatus_ =
+  ListClusterOperationsResponse'
+    { clusterOperationInfoList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of cluster operation information objects.
+listClusterOperationsResponse_clusterOperationInfoList :: Lens.Lens' ListClusterOperationsResponse (Prelude.Maybe [ClusterOperationInfo])
+listClusterOperationsResponse_clusterOperationInfoList = Lens.lens (\ListClusterOperationsResponse' {clusterOperationInfoList} -> clusterOperationInfoList) (\s@ListClusterOperationsResponse' {} a -> s {clusterOperationInfoList = a} :: ListClusterOperationsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If the response of ListClusterOperations is truncated, it returns a
+-- NextToken in the response. This Nexttoken should be sent in the
+-- subsequent request to ListClusterOperations.
+listClusterOperationsResponse_nextToken :: Lens.Lens' ListClusterOperationsResponse (Prelude.Maybe Prelude.Text)
+listClusterOperationsResponse_nextToken = Lens.lens (\ListClusterOperationsResponse' {nextToken} -> nextToken) (\s@ListClusterOperationsResponse' {} a -> s {nextToken = a} :: ListClusterOperationsResponse)
+
+-- | The response's http status code.
+listClusterOperationsResponse_httpStatus :: Lens.Lens' ListClusterOperationsResponse Prelude.Int
+listClusterOperationsResponse_httpStatus = Lens.lens (\ListClusterOperationsResponse' {httpStatus} -> httpStatus) (\s@ListClusterOperationsResponse' {} a -> s {httpStatus = a} :: ListClusterOperationsResponse)
+
+instance Prelude.NFData ListClusterOperationsResponse where
+  rnf ListClusterOperationsResponse' {..} =
+    Prelude.rnf clusterOperationInfoList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListClusters.hs b/gen/Amazonka/Kafka/ListClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListClusters.hs
@@ -0,0 +1,243 @@
+{-# 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.Kafka.ListClusters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of all the MSK clusters in the current Region.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListClusters
+  ( -- * Creating a Request
+    ListClusters (..),
+    newListClusters,
+
+    -- * Request Lenses
+    listClusters_clusterNameFilter,
+    listClusters_maxResults,
+    listClusters_nextToken,
+
+    -- * Destructuring the Response
+    ListClustersResponse (..),
+    newListClustersResponse,
+
+    -- * Response Lenses
+    listClustersResponse_clusterInfoList,
+    listClustersResponse_nextToken,
+    listClustersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListClusters' smart constructor.
+data ListClusters = ListClusters'
+  { -- | Specify a prefix of the name of the clusters that you want to list. The
+    -- service lists all the clusters whose names start with this prefix.
+    clusterNameFilter :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListClusters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterNameFilter', 'listClusters_clusterNameFilter' - Specify a prefix of the name of the clusters that you want to list. The
+-- service lists all the clusters whose names start with this prefix.
+--
+-- 'maxResults', 'listClusters_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listClusters_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+newListClusters ::
+  ListClusters
+newListClusters =
+  ListClusters'
+    { clusterNameFilter = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Specify a prefix of the name of the clusters that you want to list. The
+-- service lists all the clusters whose names start with this prefix.
+listClusters_clusterNameFilter :: Lens.Lens' ListClusters (Prelude.Maybe Prelude.Text)
+listClusters_clusterNameFilter = Lens.lens (\ListClusters' {clusterNameFilter} -> clusterNameFilter) (\s@ListClusters' {} a -> s {clusterNameFilter = a} :: ListClusters)
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listClusters_maxResults :: Lens.Lens' ListClusters (Prelude.Maybe Prelude.Natural)
+listClusters_maxResults = Lens.lens (\ListClusters' {maxResults} -> maxResults) (\s@ListClusters' {} a -> s {maxResults = a} :: ListClusters)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listClusters_nextToken :: Lens.Lens' ListClusters (Prelude.Maybe Prelude.Text)
+listClusters_nextToken = Lens.lens (\ListClusters' {nextToken} -> nextToken) (\s@ListClusters' {} a -> s {nextToken = a} :: ListClusters)
+
+instance Core.AWSPager ListClusters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listClustersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listClustersResponse_clusterInfoList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listClusters_nextToken
+          Lens..~ rs
+          Lens.^? listClustersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListClusters where
+  type AWSResponse ListClusters = ListClustersResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListClustersResponse'
+            Prelude.<$> ( x
+                            Data..?> "clusterInfoList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListClusters where
+  hashWithSalt _salt ListClusters' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterNameFilter
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListClusters where
+  rnf ListClusters' {..} =
+    Prelude.rnf clusterNameFilter
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListClusters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListClusters where
+  toPath = Prelude.const "/v1/clusters"
+
+instance Data.ToQuery ListClusters where
+  toQuery ListClusters' {..} =
+    Prelude.mconcat
+      [ "clusterNameFilter" Data.=: clusterNameFilter,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListClustersResponse' smart constructor.
+data ListClustersResponse = ListClustersResponse'
+  { -- | Information on each of the MSK clusters in the response.
+    clusterInfoList :: Prelude.Maybe [ClusterInfo],
+    -- | The paginated results marker. When the result of a ListClusters
+    -- operation is truncated, the call returns NextToken in the response. To
+    -- get another batch of clusters, provide this token in your next request.
+    nextToken :: 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 'ListClustersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterInfoList', 'listClustersResponse_clusterInfoList' - Information on each of the MSK clusters in the response.
+--
+-- 'nextToken', 'listClustersResponse_nextToken' - The paginated results marker. When the result of a ListClusters
+-- operation is truncated, the call returns NextToken in the response. To
+-- get another batch of clusters, provide this token in your next request.
+--
+-- 'httpStatus', 'listClustersResponse_httpStatus' - The response's http status code.
+newListClustersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListClustersResponse
+newListClustersResponse pHttpStatus_ =
+  ListClustersResponse'
+    { clusterInfoList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information on each of the MSK clusters in the response.
+listClustersResponse_clusterInfoList :: Lens.Lens' ListClustersResponse (Prelude.Maybe [ClusterInfo])
+listClustersResponse_clusterInfoList = Lens.lens (\ListClustersResponse' {clusterInfoList} -> clusterInfoList) (\s@ListClustersResponse' {} a -> s {clusterInfoList = a} :: ListClustersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The paginated results marker. When the result of a ListClusters
+-- operation is truncated, the call returns NextToken in the response. To
+-- get another batch of clusters, provide this token in your next request.
+listClustersResponse_nextToken :: Lens.Lens' ListClustersResponse (Prelude.Maybe Prelude.Text)
+listClustersResponse_nextToken = Lens.lens (\ListClustersResponse' {nextToken} -> nextToken) (\s@ListClustersResponse' {} a -> s {nextToken = a} :: ListClustersResponse)
+
+-- | The response's http status code.
+listClustersResponse_httpStatus :: Lens.Lens' ListClustersResponse Prelude.Int
+listClustersResponse_httpStatus = Lens.lens (\ListClustersResponse' {httpStatus} -> httpStatus) (\s@ListClustersResponse' {} a -> s {httpStatus = a} :: ListClustersResponse)
+
+instance Prelude.NFData ListClustersResponse where
+  rnf ListClustersResponse' {..} =
+    Prelude.rnf clusterInfoList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListClustersV2.hs b/gen/Amazonka/Kafka/ListClustersV2.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListClustersV2.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.ListClustersV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of all the MSK clusters in the current Region.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListClustersV2
+  ( -- * Creating a Request
+    ListClustersV2 (..),
+    newListClustersV2,
+
+    -- * Request Lenses
+    listClustersV2_clusterNameFilter,
+    listClustersV2_clusterTypeFilter,
+    listClustersV2_maxResults,
+    listClustersV2_nextToken,
+
+    -- * Destructuring the Response
+    ListClustersV2Response (..),
+    newListClustersV2Response,
+
+    -- * Response Lenses
+    listClustersV2Response_clusterInfoList,
+    listClustersV2Response_nextToken,
+    listClustersV2Response_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListClustersV2' smart constructor.
+data ListClustersV2 = ListClustersV2'
+  { -- | Specify a prefix of the names of the clusters that you want to list. The
+    -- service lists all the clusters whose names start with this prefix.
+    clusterNameFilter :: Prelude.Maybe Prelude.Text,
+    -- | Specify either PROVISIONED or SERVERLESS.
+    clusterTypeFilter :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListClustersV2' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterNameFilter', 'listClustersV2_clusterNameFilter' - Specify a prefix of the names of the clusters that you want to list. The
+-- service lists all the clusters whose names start with this prefix.
+--
+-- 'clusterTypeFilter', 'listClustersV2_clusterTypeFilter' - Specify either PROVISIONED or SERVERLESS.
+--
+-- 'maxResults', 'listClustersV2_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listClustersV2_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+newListClustersV2 ::
+  ListClustersV2
+newListClustersV2 =
+  ListClustersV2'
+    { clusterNameFilter =
+        Prelude.Nothing,
+      clusterTypeFilter = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Specify a prefix of the names of the clusters that you want to list. The
+-- service lists all the clusters whose names start with this prefix.
+listClustersV2_clusterNameFilter :: Lens.Lens' ListClustersV2 (Prelude.Maybe Prelude.Text)
+listClustersV2_clusterNameFilter = Lens.lens (\ListClustersV2' {clusterNameFilter} -> clusterNameFilter) (\s@ListClustersV2' {} a -> s {clusterNameFilter = a} :: ListClustersV2)
+
+-- | Specify either PROVISIONED or SERVERLESS.
+listClustersV2_clusterTypeFilter :: Lens.Lens' ListClustersV2 (Prelude.Maybe Prelude.Text)
+listClustersV2_clusterTypeFilter = Lens.lens (\ListClustersV2' {clusterTypeFilter} -> clusterTypeFilter) (\s@ListClustersV2' {} a -> s {clusterTypeFilter = a} :: ListClustersV2)
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listClustersV2_maxResults :: Lens.Lens' ListClustersV2 (Prelude.Maybe Prelude.Natural)
+listClustersV2_maxResults = Lens.lens (\ListClustersV2' {maxResults} -> maxResults) (\s@ListClustersV2' {} a -> s {maxResults = a} :: ListClustersV2)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listClustersV2_nextToken :: Lens.Lens' ListClustersV2 (Prelude.Maybe Prelude.Text)
+listClustersV2_nextToken = Lens.lens (\ListClustersV2' {nextToken} -> nextToken) (\s@ListClustersV2' {} a -> s {nextToken = a} :: ListClustersV2)
+
+instance Core.AWSPager ListClustersV2 where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listClustersV2Response_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listClustersV2Response_clusterInfoList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listClustersV2_nextToken
+          Lens..~ rs
+          Lens.^? listClustersV2Response_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListClustersV2 where
+  type
+    AWSResponse ListClustersV2 =
+      ListClustersV2Response
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListClustersV2Response'
+            Prelude.<$> ( x
+                            Data..?> "clusterInfoList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListClustersV2 where
+  hashWithSalt _salt ListClustersV2' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterNameFilter
+      `Prelude.hashWithSalt` clusterTypeFilter
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListClustersV2 where
+  rnf ListClustersV2' {..} =
+    Prelude.rnf clusterNameFilter
+      `Prelude.seq` Prelude.rnf clusterTypeFilter
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListClustersV2 where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListClustersV2 where
+  toPath = Prelude.const "/api/v2/clusters"
+
+instance Data.ToQuery ListClustersV2 where
+  toQuery ListClustersV2' {..} =
+    Prelude.mconcat
+      [ "clusterNameFilter" Data.=: clusterNameFilter,
+        "clusterTypeFilter" Data.=: clusterTypeFilter,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListClustersV2Response' smart constructor.
+data ListClustersV2Response = ListClustersV2Response'
+  { -- | Information on each of the MSK clusters in the response.
+    clusterInfoList :: Prelude.Maybe [Cluster],
+    -- | The paginated results marker. When the result of a ListClusters
+    -- operation is truncated, the call returns NextToken in the response. To
+    -- get another batch of clusters, provide this token in your next request.
+    nextToken :: 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 'ListClustersV2Response' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterInfoList', 'listClustersV2Response_clusterInfoList' - Information on each of the MSK clusters in the response.
+--
+-- 'nextToken', 'listClustersV2Response_nextToken' - The paginated results marker. When the result of a ListClusters
+-- operation is truncated, the call returns NextToken in the response. To
+-- get another batch of clusters, provide this token in your next request.
+--
+-- 'httpStatus', 'listClustersV2Response_httpStatus' - The response's http status code.
+newListClustersV2Response ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListClustersV2Response
+newListClustersV2Response pHttpStatus_ =
+  ListClustersV2Response'
+    { clusterInfoList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information on each of the MSK clusters in the response.
+listClustersV2Response_clusterInfoList :: Lens.Lens' ListClustersV2Response (Prelude.Maybe [Cluster])
+listClustersV2Response_clusterInfoList = Lens.lens (\ListClustersV2Response' {clusterInfoList} -> clusterInfoList) (\s@ListClustersV2Response' {} a -> s {clusterInfoList = a} :: ListClustersV2Response) Prelude.. Lens.mapping Lens.coerced
+
+-- | The paginated results marker. When the result of a ListClusters
+-- operation is truncated, the call returns NextToken in the response. To
+-- get another batch of clusters, provide this token in your next request.
+listClustersV2Response_nextToken :: Lens.Lens' ListClustersV2Response (Prelude.Maybe Prelude.Text)
+listClustersV2Response_nextToken = Lens.lens (\ListClustersV2Response' {nextToken} -> nextToken) (\s@ListClustersV2Response' {} a -> s {nextToken = a} :: ListClustersV2Response)
+
+-- | The response's http status code.
+listClustersV2Response_httpStatus :: Lens.Lens' ListClustersV2Response Prelude.Int
+listClustersV2Response_httpStatus = Lens.lens (\ListClustersV2Response' {httpStatus} -> httpStatus) (\s@ListClustersV2Response' {} a -> s {httpStatus = a} :: ListClustersV2Response)
+
+instance Prelude.NFData ListClustersV2Response where
+  rnf ListClustersV2Response' {..} =
+    Prelude.rnf clusterInfoList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListConfigurationRevisions.hs b/gen/Amazonka/Kafka/ListConfigurationRevisions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListConfigurationRevisions.hs
@@ -0,0 +1,243 @@
+{-# 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.Kafka.ListConfigurationRevisions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of all the MSK configurations in this Region.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListConfigurationRevisions
+  ( -- * Creating a Request
+    ListConfigurationRevisions (..),
+    newListConfigurationRevisions,
+
+    -- * Request Lenses
+    listConfigurationRevisions_maxResults,
+    listConfigurationRevisions_nextToken,
+    listConfigurationRevisions_arn,
+
+    -- * Destructuring the Response
+    ListConfigurationRevisionsResponse (..),
+    newListConfigurationRevisionsResponse,
+
+    -- * Response Lenses
+    listConfigurationRevisionsResponse_nextToken,
+    listConfigurationRevisionsResponse_revisions,
+    listConfigurationRevisionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListConfigurationRevisions' smart constructor.
+data ListConfigurationRevisions = ListConfigurationRevisions'
+  { -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+    -- configuration and all of its revisions.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListConfigurationRevisions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listConfigurationRevisions_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listConfigurationRevisions_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+--
+-- 'arn', 'listConfigurationRevisions_arn' - The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration and all of its revisions.
+newListConfigurationRevisions ::
+  -- | 'arn'
+  Prelude.Text ->
+  ListConfigurationRevisions
+newListConfigurationRevisions pArn_ =
+  ListConfigurationRevisions'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      arn = pArn_
+    }
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listConfigurationRevisions_maxResults :: Lens.Lens' ListConfigurationRevisions (Prelude.Maybe Prelude.Natural)
+listConfigurationRevisions_maxResults = Lens.lens (\ListConfigurationRevisions' {maxResults} -> maxResults) (\s@ListConfigurationRevisions' {} a -> s {maxResults = a} :: ListConfigurationRevisions)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listConfigurationRevisions_nextToken :: Lens.Lens' ListConfigurationRevisions (Prelude.Maybe Prelude.Text)
+listConfigurationRevisions_nextToken = Lens.lens (\ListConfigurationRevisions' {nextToken} -> nextToken) (\s@ListConfigurationRevisions' {} a -> s {nextToken = a} :: ListConfigurationRevisions)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies an MSK
+-- configuration and all of its revisions.
+listConfigurationRevisions_arn :: Lens.Lens' ListConfigurationRevisions Prelude.Text
+listConfigurationRevisions_arn = Lens.lens (\ListConfigurationRevisions' {arn} -> arn) (\s@ListConfigurationRevisions' {} a -> s {arn = a} :: ListConfigurationRevisions)
+
+instance Core.AWSPager ListConfigurationRevisions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listConfigurationRevisionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listConfigurationRevisionsResponse_revisions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listConfigurationRevisions_nextToken
+          Lens..~ rs
+          Lens.^? listConfigurationRevisionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListConfigurationRevisions where
+  type
+    AWSResponse ListConfigurationRevisions =
+      ListConfigurationRevisionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListConfigurationRevisionsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "revisions" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListConfigurationRevisions where
+  hashWithSalt _salt ListConfigurationRevisions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData ListConfigurationRevisions where
+  rnf ListConfigurationRevisions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf arn
+
+instance Data.ToHeaders ListConfigurationRevisions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListConfigurationRevisions where
+  toPath ListConfigurationRevisions' {..} =
+    Prelude.mconcat
+      ["/v1/configurations/", Data.toBS arn, "/revisions"]
+
+instance Data.ToQuery ListConfigurationRevisions where
+  toQuery ListConfigurationRevisions' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListConfigurationRevisionsResponse' smart constructor.
+data ListConfigurationRevisionsResponse = ListConfigurationRevisionsResponse'
+  { -- | Paginated results marker.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | List of ConfigurationRevision objects.
+    revisions :: Prelude.Maybe [ConfigurationRevision],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListConfigurationRevisionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listConfigurationRevisionsResponse_nextToken' - Paginated results marker.
+--
+-- 'revisions', 'listConfigurationRevisionsResponse_revisions' - List of ConfigurationRevision objects.
+--
+-- 'httpStatus', 'listConfigurationRevisionsResponse_httpStatus' - The response's http status code.
+newListConfigurationRevisionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListConfigurationRevisionsResponse
+newListConfigurationRevisionsResponse pHttpStatus_ =
+  ListConfigurationRevisionsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      revisions = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Paginated results marker.
+listConfigurationRevisionsResponse_nextToken :: Lens.Lens' ListConfigurationRevisionsResponse (Prelude.Maybe Prelude.Text)
+listConfigurationRevisionsResponse_nextToken = Lens.lens (\ListConfigurationRevisionsResponse' {nextToken} -> nextToken) (\s@ListConfigurationRevisionsResponse' {} a -> s {nextToken = a} :: ListConfigurationRevisionsResponse)
+
+-- | List of ConfigurationRevision objects.
+listConfigurationRevisionsResponse_revisions :: Lens.Lens' ListConfigurationRevisionsResponse (Prelude.Maybe [ConfigurationRevision])
+listConfigurationRevisionsResponse_revisions = Lens.lens (\ListConfigurationRevisionsResponse' {revisions} -> revisions) (\s@ListConfigurationRevisionsResponse' {} a -> s {revisions = a} :: ListConfigurationRevisionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listConfigurationRevisionsResponse_httpStatus :: Lens.Lens' ListConfigurationRevisionsResponse Prelude.Int
+listConfigurationRevisionsResponse_httpStatus = Lens.lens (\ListConfigurationRevisionsResponse' {httpStatus} -> httpStatus) (\s@ListConfigurationRevisionsResponse' {} a -> s {httpStatus = a} :: ListConfigurationRevisionsResponse)
+
+instance
+  Prelude.NFData
+    ListConfigurationRevisionsResponse
+  where
+  rnf ListConfigurationRevisionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf revisions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListConfigurations.hs b/gen/Amazonka/Kafka/ListConfigurations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListConfigurations.hs
@@ -0,0 +1,229 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.ListConfigurations
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of all the MSK configurations in this Region.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListConfigurations
+  ( -- * Creating a Request
+    ListConfigurations (..),
+    newListConfigurations,
+
+    -- * Request Lenses
+    listConfigurations_maxResults,
+    listConfigurations_nextToken,
+
+    -- * Destructuring the Response
+    ListConfigurationsResponse (..),
+    newListConfigurationsResponse,
+
+    -- * Response Lenses
+    listConfigurationsResponse_configurations,
+    listConfigurationsResponse_nextToken,
+    listConfigurationsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListConfigurations' smart constructor.
+data ListConfigurations = ListConfigurations'
+  { -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListConfigurations' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listConfigurations_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listConfigurations_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+newListConfigurations ::
+  ListConfigurations
+newListConfigurations =
+  ListConfigurations'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listConfigurations_maxResults :: Lens.Lens' ListConfigurations (Prelude.Maybe Prelude.Natural)
+listConfigurations_maxResults = Lens.lens (\ListConfigurations' {maxResults} -> maxResults) (\s@ListConfigurations' {} a -> s {maxResults = a} :: ListConfigurations)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listConfigurations_nextToken :: Lens.Lens' ListConfigurations (Prelude.Maybe Prelude.Text)
+listConfigurations_nextToken = Lens.lens (\ListConfigurations' {nextToken} -> nextToken) (\s@ListConfigurations' {} a -> s {nextToken = a} :: ListConfigurations)
+
+instance Core.AWSPager ListConfigurations where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listConfigurationsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listConfigurationsResponse_configurations
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listConfigurations_nextToken
+          Lens..~ rs
+          Lens.^? listConfigurationsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListConfigurations where
+  type
+    AWSResponse ListConfigurations =
+      ListConfigurationsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListConfigurationsResponse'
+            Prelude.<$> (x Data..?> "configurations" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListConfigurations where
+  hashWithSalt _salt ListConfigurations' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListConfigurations where
+  rnf ListConfigurations' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListConfigurations where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListConfigurations where
+  toPath = Prelude.const "/v1/configurations"
+
+instance Data.ToQuery ListConfigurations where
+  toQuery ListConfigurations' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListConfigurationsResponse' smart constructor.
+data ListConfigurationsResponse = ListConfigurationsResponse'
+  { -- | An array of MSK configurations.
+    configurations :: Prelude.Maybe [Configuration],
+    -- | The paginated results marker. When the result of a ListConfigurations
+    -- operation is truncated, the call returns NextToken in the response. To
+    -- get another batch of configurations, provide this token in your next
+    -- request.
+    nextToken :: 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 'ListConfigurationsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listConfigurationsResponse_configurations' - An array of MSK configurations.
+--
+-- 'nextToken', 'listConfigurationsResponse_nextToken' - The paginated results marker. When the result of a ListConfigurations
+-- operation is truncated, the call returns NextToken in the response. To
+-- get another batch of configurations, provide this token in your next
+-- request.
+--
+-- 'httpStatus', 'listConfigurationsResponse_httpStatus' - The response's http status code.
+newListConfigurationsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListConfigurationsResponse
+newListConfigurationsResponse pHttpStatus_ =
+  ListConfigurationsResponse'
+    { configurations =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of MSK configurations.
+listConfigurationsResponse_configurations :: Lens.Lens' ListConfigurationsResponse (Prelude.Maybe [Configuration])
+listConfigurationsResponse_configurations = Lens.lens (\ListConfigurationsResponse' {configurations} -> configurations) (\s@ListConfigurationsResponse' {} a -> s {configurations = a} :: ListConfigurationsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The paginated results marker. When the result of a ListConfigurations
+-- operation is truncated, the call returns NextToken in the response. To
+-- get another batch of configurations, provide this token in your next
+-- request.
+listConfigurationsResponse_nextToken :: Lens.Lens' ListConfigurationsResponse (Prelude.Maybe Prelude.Text)
+listConfigurationsResponse_nextToken = Lens.lens (\ListConfigurationsResponse' {nextToken} -> nextToken) (\s@ListConfigurationsResponse' {} a -> s {nextToken = a} :: ListConfigurationsResponse)
+
+-- | The response's http status code.
+listConfigurationsResponse_httpStatus :: Lens.Lens' ListConfigurationsResponse Prelude.Int
+listConfigurationsResponse_httpStatus = Lens.lens (\ListConfigurationsResponse' {httpStatus} -> httpStatus) (\s@ListConfigurationsResponse' {} a -> s {httpStatus = a} :: ListConfigurationsResponse)
+
+instance Prelude.NFData ListConfigurationsResponse where
+  rnf ListConfigurationsResponse' {..} =
+    Prelude.rnf configurations
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListKafkaVersions.hs b/gen/Amazonka/Kafka/ListKafkaVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListKafkaVersions.hs
@@ -0,0 +1,218 @@
+{-# 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.Kafka.ListKafkaVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of Apache Kafka versions.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListKafkaVersions
+  ( -- * Creating a Request
+    ListKafkaVersions (..),
+    newListKafkaVersions,
+
+    -- * Request Lenses
+    listKafkaVersions_maxResults,
+    listKafkaVersions_nextToken,
+
+    -- * Destructuring the Response
+    ListKafkaVersionsResponse (..),
+    newListKafkaVersionsResponse,
+
+    -- * Response Lenses
+    listKafkaVersionsResponse_kafkaVersions,
+    listKafkaVersionsResponse_nextToken,
+    listKafkaVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListKafkaVersions' smart constructor.
+data ListKafkaVersions = ListKafkaVersions'
+  { -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListKafkaVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listKafkaVersions_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listKafkaVersions_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+newListKafkaVersions ::
+  ListKafkaVersions
+newListKafkaVersions =
+  ListKafkaVersions'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listKafkaVersions_maxResults :: Lens.Lens' ListKafkaVersions (Prelude.Maybe Prelude.Natural)
+listKafkaVersions_maxResults = Lens.lens (\ListKafkaVersions' {maxResults} -> maxResults) (\s@ListKafkaVersions' {} a -> s {maxResults = a} :: ListKafkaVersions)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listKafkaVersions_nextToken :: Lens.Lens' ListKafkaVersions (Prelude.Maybe Prelude.Text)
+listKafkaVersions_nextToken = Lens.lens (\ListKafkaVersions' {nextToken} -> nextToken) (\s@ListKafkaVersions' {} a -> s {nextToken = a} :: ListKafkaVersions)
+
+instance Core.AWSPager ListKafkaVersions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listKafkaVersionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listKafkaVersionsResponse_kafkaVersions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listKafkaVersions_nextToken
+          Lens..~ rs
+          Lens.^? listKafkaVersionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListKafkaVersions where
+  type
+    AWSResponse ListKafkaVersions =
+      ListKafkaVersionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListKafkaVersionsResponse'
+            Prelude.<$> (x Data..?> "kafkaVersions" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListKafkaVersions where
+  hashWithSalt _salt ListKafkaVersions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListKafkaVersions where
+  rnf ListKafkaVersions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListKafkaVersions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListKafkaVersions where
+  toPath = Prelude.const "/v1/kafka-versions"
+
+instance Data.ToQuery ListKafkaVersions where
+  toQuery ListKafkaVersions' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListKafkaVersionsResponse' smart constructor.
+data ListKafkaVersionsResponse = ListKafkaVersionsResponse'
+  { kafkaVersions :: Prelude.Maybe [KafkaVersion],
+    nextToken :: 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 'ListKafkaVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kafkaVersions', 'listKafkaVersionsResponse_kafkaVersions' - Undocumented member.
+--
+-- 'nextToken', 'listKafkaVersionsResponse_nextToken' - Undocumented member.
+--
+-- 'httpStatus', 'listKafkaVersionsResponse_httpStatus' - The response's http status code.
+newListKafkaVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListKafkaVersionsResponse
+newListKafkaVersionsResponse pHttpStatus_ =
+  ListKafkaVersionsResponse'
+    { kafkaVersions =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+listKafkaVersionsResponse_kafkaVersions :: Lens.Lens' ListKafkaVersionsResponse (Prelude.Maybe [KafkaVersion])
+listKafkaVersionsResponse_kafkaVersions = Lens.lens (\ListKafkaVersionsResponse' {kafkaVersions} -> kafkaVersions) (\s@ListKafkaVersionsResponse' {} a -> s {kafkaVersions = a} :: ListKafkaVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Undocumented member.
+listKafkaVersionsResponse_nextToken :: Lens.Lens' ListKafkaVersionsResponse (Prelude.Maybe Prelude.Text)
+listKafkaVersionsResponse_nextToken = Lens.lens (\ListKafkaVersionsResponse' {nextToken} -> nextToken) (\s@ListKafkaVersionsResponse' {} a -> s {nextToken = a} :: ListKafkaVersionsResponse)
+
+-- | The response's http status code.
+listKafkaVersionsResponse_httpStatus :: Lens.Lens' ListKafkaVersionsResponse Prelude.Int
+listKafkaVersionsResponse_httpStatus = Lens.lens (\ListKafkaVersionsResponse' {httpStatus} -> httpStatus) (\s@ListKafkaVersionsResponse' {} a -> s {httpStatus = a} :: ListKafkaVersionsResponse)
+
+instance Prelude.NFData ListKafkaVersionsResponse where
+  rnf ListKafkaVersionsResponse' {..} =
+    Prelude.rnf kafkaVersions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListNodes.hs b/gen/Amazonka/Kafka/ListNodes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListNodes.hs
@@ -0,0 +1,239 @@
+{-# 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.Kafka.ListNodes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of the broker nodes in the cluster.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListNodes
+  ( -- * Creating a Request
+    ListNodes (..),
+    newListNodes,
+
+    -- * Request Lenses
+    listNodes_maxResults,
+    listNodes_nextToken,
+    listNodes_clusterArn,
+
+    -- * Destructuring the Response
+    ListNodesResponse (..),
+    newListNodesResponse,
+
+    -- * Response Lenses
+    listNodesResponse_nextToken,
+    listNodesResponse_nodeInfoList,
+    listNodesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListNodes' smart constructor.
+data ListNodes = ListNodes'
+  { -- | The maximum number of results to return in the response. If there are
+    -- more results, the response includes a NextToken parameter.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The paginated results marker. When the result of the operation is
+    -- truncated, the call returns NextToken in the response. To get the next
+    -- batch, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNodes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listNodes_maxResults' - The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+--
+-- 'nextToken', 'listNodes_nextToken' - The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+--
+-- 'clusterArn', 'listNodes_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+newListNodes ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  ListNodes
+newListNodes pClusterArn_ =
+  ListNodes'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      clusterArn = pClusterArn_
+    }
+
+-- | The maximum number of results to return in the response. If there are
+-- more results, the response includes a NextToken parameter.
+listNodes_maxResults :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Natural)
+listNodes_maxResults = Lens.lens (\ListNodes' {maxResults} -> maxResults) (\s@ListNodes' {} a -> s {maxResults = a} :: ListNodes)
+
+-- | The paginated results marker. When the result of the operation is
+-- truncated, the call returns NextToken in the response. To get the next
+-- batch, provide this token in your next request.
+listNodes_nextToken :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Text)
+listNodes_nextToken = Lens.lens (\ListNodes' {nextToken} -> nextToken) (\s@ListNodes' {} a -> s {nextToken = a} :: ListNodes)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+listNodes_clusterArn :: Lens.Lens' ListNodes Prelude.Text
+listNodes_clusterArn = Lens.lens (\ListNodes' {clusterArn} -> clusterArn) (\s@ListNodes' {} a -> s {clusterArn = a} :: ListNodes)
+
+instance Core.AWSPager ListNodes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listNodesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listNodesResponse_nodeInfoList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listNodes_nextToken
+          Lens..~ rs
+          Lens.^? listNodesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListNodes where
+  type AWSResponse ListNodes = ListNodesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListNodesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "nodeInfoList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListNodes where
+  hashWithSalt _salt ListNodes' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData ListNodes where
+  rnf ListNodes' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf clusterArn
+
+instance Data.ToHeaders ListNodes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListNodes where
+  toPath ListNodes' {..} =
+    Prelude.mconcat
+      ["/v1/clusters/", Data.toBS clusterArn, "/nodes"]
+
+instance Data.ToQuery ListNodes where
+  toQuery ListNodes' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListNodesResponse' smart constructor.
+data ListNodesResponse = ListNodesResponse'
+  { -- | The paginated results marker. When the result of a ListNodes operation
+    -- is truncated, the call returns NextToken in the response. To get another
+    -- batch of nodes, provide this token in your next request.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | List containing a NodeInfo object.
+    nodeInfoList :: Prelude.Maybe [NodeInfo],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNodesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listNodesResponse_nextToken' - The paginated results marker. When the result of a ListNodes operation
+-- is truncated, the call returns NextToken in the response. To get another
+-- batch of nodes, provide this token in your next request.
+--
+-- 'nodeInfoList', 'listNodesResponse_nodeInfoList' - List containing a NodeInfo object.
+--
+-- 'httpStatus', 'listNodesResponse_httpStatus' - The response's http status code.
+newListNodesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListNodesResponse
+newListNodesResponse pHttpStatus_ =
+  ListNodesResponse'
+    { nextToken = Prelude.Nothing,
+      nodeInfoList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The paginated results marker. When the result of a ListNodes operation
+-- is truncated, the call returns NextToken in the response. To get another
+-- batch of nodes, provide this token in your next request.
+listNodesResponse_nextToken :: Lens.Lens' ListNodesResponse (Prelude.Maybe Prelude.Text)
+listNodesResponse_nextToken = Lens.lens (\ListNodesResponse' {nextToken} -> nextToken) (\s@ListNodesResponse' {} a -> s {nextToken = a} :: ListNodesResponse)
+
+-- | List containing a NodeInfo object.
+listNodesResponse_nodeInfoList :: Lens.Lens' ListNodesResponse (Prelude.Maybe [NodeInfo])
+listNodesResponse_nodeInfoList = Lens.lens (\ListNodesResponse' {nodeInfoList} -> nodeInfoList) (\s@ListNodesResponse' {} a -> s {nodeInfoList = a} :: ListNodesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listNodesResponse_httpStatus :: Lens.Lens' ListNodesResponse Prelude.Int
+listNodesResponse_httpStatus = Lens.lens (\ListNodesResponse' {httpStatus} -> httpStatus) (\s@ListNodesResponse' {} a -> s {httpStatus = a} :: ListNodesResponse)
+
+instance Prelude.NFData ListNodesResponse where
+  rnf ListNodesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf nodeInfoList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListScramSecrets.hs b/gen/Amazonka/Kafka/ListScramSecrets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListScramSecrets.hs
@@ -0,0 +1,231 @@
+{-# 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.Kafka.ListScramSecrets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of the Scram Secrets associated with an Amazon MSK
+-- cluster.
+--
+-- This operation returns paginated results.
+module Amazonka.Kafka.ListScramSecrets
+  ( -- * Creating a Request
+    ListScramSecrets (..),
+    newListScramSecrets,
+
+    -- * Request Lenses
+    listScramSecrets_maxResults,
+    listScramSecrets_nextToken,
+    listScramSecrets_clusterArn,
+
+    -- * Destructuring the Response
+    ListScramSecretsResponse (..),
+    newListScramSecretsResponse,
+
+    -- * Response Lenses
+    listScramSecretsResponse_nextToken,
+    listScramSecretsResponse_secretArnList,
+    listScramSecretsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListScramSecrets' smart constructor.
+data ListScramSecrets = ListScramSecrets'
+  { -- | The maxResults of the query.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The nextToken of the query.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The arn of the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListScramSecrets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listScramSecrets_maxResults' - The maxResults of the query.
+--
+-- 'nextToken', 'listScramSecrets_nextToken' - The nextToken of the query.
+--
+-- 'clusterArn', 'listScramSecrets_clusterArn' - The arn of the cluster.
+newListScramSecrets ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  ListScramSecrets
+newListScramSecrets pClusterArn_ =
+  ListScramSecrets'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      clusterArn = pClusterArn_
+    }
+
+-- | The maxResults of the query.
+listScramSecrets_maxResults :: Lens.Lens' ListScramSecrets (Prelude.Maybe Prelude.Natural)
+listScramSecrets_maxResults = Lens.lens (\ListScramSecrets' {maxResults} -> maxResults) (\s@ListScramSecrets' {} a -> s {maxResults = a} :: ListScramSecrets)
+
+-- | The nextToken of the query.
+listScramSecrets_nextToken :: Lens.Lens' ListScramSecrets (Prelude.Maybe Prelude.Text)
+listScramSecrets_nextToken = Lens.lens (\ListScramSecrets' {nextToken} -> nextToken) (\s@ListScramSecrets' {} a -> s {nextToken = a} :: ListScramSecrets)
+
+-- | The arn of the cluster.
+listScramSecrets_clusterArn :: Lens.Lens' ListScramSecrets Prelude.Text
+listScramSecrets_clusterArn = Lens.lens (\ListScramSecrets' {clusterArn} -> clusterArn) (\s@ListScramSecrets' {} a -> s {clusterArn = a} :: ListScramSecrets)
+
+instance Core.AWSPager ListScramSecrets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listScramSecretsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listScramSecretsResponse_secretArnList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listScramSecrets_nextToken
+          Lens..~ rs
+          Lens.^? listScramSecretsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListScramSecrets where
+  type
+    AWSResponse ListScramSecrets =
+      ListScramSecretsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListScramSecretsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "secretArnList" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListScramSecrets where
+  hashWithSalt _salt ListScramSecrets' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData ListScramSecrets where
+  rnf ListScramSecrets' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf clusterArn
+
+instance Data.ToHeaders ListScramSecrets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListScramSecrets where
+  toPath ListScramSecrets' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/scram-secrets"
+      ]
+
+instance Data.ToQuery ListScramSecrets where
+  toQuery ListScramSecrets' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListScramSecretsResponse' smart constructor.
+data ListScramSecretsResponse = ListScramSecretsResponse'
+  { -- | Paginated results marker.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of scram secrets associated with the cluster.
+    secretArnList :: 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 'ListScramSecretsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listScramSecretsResponse_nextToken' - Paginated results marker.
+--
+-- 'secretArnList', 'listScramSecretsResponse_secretArnList' - The list of scram secrets associated with the cluster.
+--
+-- 'httpStatus', 'listScramSecretsResponse_httpStatus' - The response's http status code.
+newListScramSecretsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListScramSecretsResponse
+newListScramSecretsResponse pHttpStatus_ =
+  ListScramSecretsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      secretArnList = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Paginated results marker.
+listScramSecretsResponse_nextToken :: Lens.Lens' ListScramSecretsResponse (Prelude.Maybe Prelude.Text)
+listScramSecretsResponse_nextToken = Lens.lens (\ListScramSecretsResponse' {nextToken} -> nextToken) (\s@ListScramSecretsResponse' {} a -> s {nextToken = a} :: ListScramSecretsResponse)
+
+-- | The list of scram secrets associated with the cluster.
+listScramSecretsResponse_secretArnList :: Lens.Lens' ListScramSecretsResponse (Prelude.Maybe [Prelude.Text])
+listScramSecretsResponse_secretArnList = Lens.lens (\ListScramSecretsResponse' {secretArnList} -> secretArnList) (\s@ListScramSecretsResponse' {} a -> s {secretArnList = a} :: ListScramSecretsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listScramSecretsResponse_httpStatus :: Lens.Lens' ListScramSecretsResponse Prelude.Int
+listScramSecretsResponse_httpStatus = Lens.lens (\ListScramSecretsResponse' {httpStatus} -> httpStatus) (\s@ListScramSecretsResponse' {} a -> s {httpStatus = a} :: ListScramSecretsResponse)
+
+instance Prelude.NFData ListScramSecretsResponse where
+  rnf ListScramSecretsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf secretArnList
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/ListTagsForResource.hs b/gen/Amazonka/Kafka/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/ListTagsForResource.hs
@@ -0,0 +1,163 @@
+{-# 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.Kafka.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)
+--
+-- Returns a list of the tags associated with the specified resource.
+module Amazonka.Kafka.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.Kafka.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 Amazon Resource Name (ARN) that uniquely identifies the resource
+    -- that\'s associated with the tags.
+    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 Amazon Resource Name (ARN) that uniquely identifies the resource
+-- that\'s associated with the tags.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the resource
+-- that\'s associated with the tags.
+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
+      ["/v1/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The key-value pair for the resource tag.
+    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 key-value pair for the resource tag.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The key-value pair for the resource tag.
+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/Kafka/RebootBroker.hs b/gen/Amazonka/Kafka/RebootBroker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/RebootBroker.hs
@@ -0,0 +1,199 @@
+{-# 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.Kafka.RebootBroker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Reboots brokers.
+module Amazonka.Kafka.RebootBroker
+  ( -- * Creating a Request
+    RebootBroker (..),
+    newRebootBroker,
+
+    -- * Request Lenses
+    rebootBroker_clusterArn,
+    rebootBroker_brokerIds,
+
+    -- * Destructuring the Response
+    RebootBrokerResponse (..),
+    newRebootBrokerResponse,
+
+    -- * Response Lenses
+    rebootBrokerResponse_clusterArn,
+    rebootBrokerResponse_clusterOperationArn,
+    rebootBrokerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Reboots a node.
+--
+-- /See:/ 'newRebootBroker' smart constructor.
+data RebootBroker = RebootBroker'
+  { -- | The Amazon Resource Name (ARN) of the cluster to be updated.
+    clusterArn :: Prelude.Text,
+    -- | The list of broker IDs to be rebooted. The reboot-broker operation
+    -- supports rebooting one broker at a time.
+    brokerIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RebootBroker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'rebootBroker_clusterArn' - The Amazon Resource Name (ARN) of the cluster to be updated.
+--
+-- 'brokerIds', 'rebootBroker_brokerIds' - The list of broker IDs to be rebooted. The reboot-broker operation
+-- supports rebooting one broker at a time.
+newRebootBroker ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  RebootBroker
+newRebootBroker pClusterArn_ =
+  RebootBroker'
+    { clusterArn = pClusterArn_,
+      brokerIds = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster to be updated.
+rebootBroker_clusterArn :: Lens.Lens' RebootBroker Prelude.Text
+rebootBroker_clusterArn = Lens.lens (\RebootBroker' {clusterArn} -> clusterArn) (\s@RebootBroker' {} a -> s {clusterArn = a} :: RebootBroker)
+
+-- | The list of broker IDs to be rebooted. The reboot-broker operation
+-- supports rebooting one broker at a time.
+rebootBroker_brokerIds :: Lens.Lens' RebootBroker [Prelude.Text]
+rebootBroker_brokerIds = Lens.lens (\RebootBroker' {brokerIds} -> brokerIds) (\s@RebootBroker' {} a -> s {brokerIds = a} :: RebootBroker) Prelude.. Lens.coerced
+
+instance Core.AWSRequest RebootBroker where
+  type AWSResponse RebootBroker = RebootBrokerResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RebootBrokerResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RebootBroker where
+  hashWithSalt _salt RebootBroker' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` brokerIds
+
+instance Prelude.NFData RebootBroker where
+  rnf RebootBroker' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf brokerIds
+
+instance Data.ToHeaders RebootBroker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RebootBroker where
+  toJSON RebootBroker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("brokerIds" Data..= brokerIds)]
+      )
+
+instance Data.ToPath RebootBroker where
+  toPath RebootBroker' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/reboot-broker"
+      ]
+
+instance Data.ToQuery RebootBroker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRebootBrokerResponse' smart constructor.
+data RebootBrokerResponse = RebootBrokerResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'RebootBrokerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'rebootBrokerResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'rebootBrokerResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'rebootBrokerResponse_httpStatus' - The response's http status code.
+newRebootBrokerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RebootBrokerResponse
+newRebootBrokerResponse pHttpStatus_ =
+  RebootBrokerResponse'
+    { clusterArn = Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+rebootBrokerResponse_clusterArn :: Lens.Lens' RebootBrokerResponse (Prelude.Maybe Prelude.Text)
+rebootBrokerResponse_clusterArn = Lens.lens (\RebootBrokerResponse' {clusterArn} -> clusterArn) (\s@RebootBrokerResponse' {} a -> s {clusterArn = a} :: RebootBrokerResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+rebootBrokerResponse_clusterOperationArn :: Lens.Lens' RebootBrokerResponse (Prelude.Maybe Prelude.Text)
+rebootBrokerResponse_clusterOperationArn = Lens.lens (\RebootBrokerResponse' {clusterOperationArn} -> clusterOperationArn) (\s@RebootBrokerResponse' {} a -> s {clusterOperationArn = a} :: RebootBrokerResponse)
+
+-- | The response's http status code.
+rebootBrokerResponse_httpStatus :: Lens.Lens' RebootBrokerResponse Prelude.Int
+rebootBrokerResponse_httpStatus = Lens.lens (\RebootBrokerResponse' {httpStatus} -> httpStatus) (\s@RebootBrokerResponse' {} a -> s {httpStatus = a} :: RebootBrokerResponse)
+
+instance Prelude.NFData RebootBrokerResponse where
+  rnf RebootBrokerResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/TagResource.hs b/gen/Amazonka/Kafka/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/TagResource.hs
@@ -0,0 +1,146 @@
+{-# 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.Kafka.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)
+--
+-- Adds tags to the specified MSK resource.
+module Amazonka.Kafka.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.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 Amazon Resource Name (ARN) that uniquely identifies the resource
+    -- that\'s associated with the tags.
+    resourceArn :: Prelude.Text,
+    -- | The key-value pair for the resource tag.
+    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 Amazon Resource Name (ARN) that uniquely identifies the resource
+-- that\'s associated with the tags.
+--
+-- 'tags', 'tagResource_tags' - The key-value pair for the resource tag.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the resource
+-- that\'s associated with the tags.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The key-value pair for the resource tag.
+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.receiveNull TagResourceResponse'
+
+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
+      ["/v1/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  {
+  }
+  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.
+newTagResourceResponse ::
+  TagResourceResponse
+newTagResourceResponse = TagResourceResponse'
+
+instance Prelude.NFData TagResourceResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Kafka/Types.hs b/gen/Amazonka/Kafka/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types.hs
@@ -0,0 +1,655 @@
+{-# 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.Kafka.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.Kafka.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _BadRequestException,
+    _ConflictException,
+    _ForbiddenException,
+    _InternalServerErrorException,
+    _NotFoundException,
+    _ServiceUnavailableException,
+    _TooManyRequestsException,
+    _UnauthorizedException,
+
+    -- * BrokerAZDistribution
+    BrokerAZDistribution (..),
+
+    -- * ClientBroker
+    ClientBroker (..),
+
+    -- * ClusterState
+    ClusterState (..),
+
+    -- * ClusterType
+    ClusterType (..),
+
+    -- * ConfigurationState
+    ConfigurationState (..),
+
+    -- * EnhancedMonitoring
+    EnhancedMonitoring (..),
+
+    -- * KafkaVersionStatus
+    KafkaVersionStatus (..),
+
+    -- * NodeType
+    NodeType (..),
+
+    -- * StorageMode
+    StorageMode (..),
+
+    -- * BrokerEBSVolumeInfo
+    BrokerEBSVolumeInfo (..),
+    newBrokerEBSVolumeInfo,
+    brokerEBSVolumeInfo_provisionedThroughput,
+    brokerEBSVolumeInfo_volumeSizeGB,
+    brokerEBSVolumeInfo_kafkaBrokerNodeId,
+
+    -- * BrokerLogs
+    BrokerLogs (..),
+    newBrokerLogs,
+    brokerLogs_cloudWatchLogs,
+    brokerLogs_firehose,
+    brokerLogs_s3,
+
+    -- * BrokerNodeGroupInfo
+    BrokerNodeGroupInfo (..),
+    newBrokerNodeGroupInfo,
+    brokerNodeGroupInfo_brokerAZDistribution,
+    brokerNodeGroupInfo_connectivityInfo,
+    brokerNodeGroupInfo_securityGroups,
+    brokerNodeGroupInfo_storageInfo,
+    brokerNodeGroupInfo_clientSubnets,
+    brokerNodeGroupInfo_instanceType,
+
+    -- * BrokerNodeInfo
+    BrokerNodeInfo (..),
+    newBrokerNodeInfo,
+    brokerNodeInfo_attachedENIId,
+    brokerNodeInfo_brokerId,
+    brokerNodeInfo_clientSubnet,
+    brokerNodeInfo_clientVpcIpAddress,
+    brokerNodeInfo_currentBrokerSoftwareInfo,
+    brokerNodeInfo_endpoints,
+
+    -- * BrokerSoftwareInfo
+    BrokerSoftwareInfo (..),
+    newBrokerSoftwareInfo,
+    brokerSoftwareInfo_configurationArn,
+    brokerSoftwareInfo_configurationRevision,
+    brokerSoftwareInfo_kafkaVersion,
+
+    -- * ClientAuthentication
+    ClientAuthentication (..),
+    newClientAuthentication,
+    clientAuthentication_sasl,
+    clientAuthentication_tls,
+    clientAuthentication_unauthenticated,
+
+    -- * CloudWatchLogs
+    CloudWatchLogs (..),
+    newCloudWatchLogs,
+    cloudWatchLogs_logGroup,
+    cloudWatchLogs_enabled,
+
+    -- * Cluster
+    Cluster (..),
+    newCluster,
+    cluster_activeOperationArn,
+    cluster_clusterArn,
+    cluster_clusterName,
+    cluster_clusterType,
+    cluster_creationTime,
+    cluster_currentVersion,
+    cluster_provisioned,
+    cluster_serverless,
+    cluster_state,
+    cluster_stateInfo,
+    cluster_tags,
+
+    -- * ClusterInfo
+    ClusterInfo (..),
+    newClusterInfo,
+    clusterInfo_activeOperationArn,
+    clusterInfo_brokerNodeGroupInfo,
+    clusterInfo_clientAuthentication,
+    clusterInfo_clusterArn,
+    clusterInfo_clusterName,
+    clusterInfo_creationTime,
+    clusterInfo_currentBrokerSoftwareInfo,
+    clusterInfo_currentVersion,
+    clusterInfo_encryptionInfo,
+    clusterInfo_enhancedMonitoring,
+    clusterInfo_loggingInfo,
+    clusterInfo_numberOfBrokerNodes,
+    clusterInfo_openMonitoring,
+    clusterInfo_state,
+    clusterInfo_stateInfo,
+    clusterInfo_storageMode,
+    clusterInfo_tags,
+    clusterInfo_zookeeperConnectString,
+    clusterInfo_zookeeperConnectStringTls,
+
+    -- * ClusterOperationInfo
+    ClusterOperationInfo (..),
+    newClusterOperationInfo,
+    clusterOperationInfo_clientRequestId,
+    clusterOperationInfo_clusterArn,
+    clusterOperationInfo_creationTime,
+    clusterOperationInfo_endTime,
+    clusterOperationInfo_errorInfo,
+    clusterOperationInfo_operationArn,
+    clusterOperationInfo_operationState,
+    clusterOperationInfo_operationSteps,
+    clusterOperationInfo_operationType,
+    clusterOperationInfo_sourceClusterInfo,
+    clusterOperationInfo_targetClusterInfo,
+
+    -- * ClusterOperationStep
+    ClusterOperationStep (..),
+    newClusterOperationStep,
+    clusterOperationStep_stepInfo,
+    clusterOperationStep_stepName,
+
+    -- * ClusterOperationStepInfo
+    ClusterOperationStepInfo (..),
+    newClusterOperationStepInfo,
+    clusterOperationStepInfo_stepStatus,
+
+    -- * CompatibleKafkaVersion
+    CompatibleKafkaVersion (..),
+    newCompatibleKafkaVersion,
+    compatibleKafkaVersion_sourceVersion,
+    compatibleKafkaVersion_targetVersions,
+
+    -- * Configuration
+    Configuration (..),
+    newConfiguration,
+    configuration_description,
+    configuration_latestRevision,
+    configuration_creationTime,
+    configuration_kafkaVersions,
+    configuration_arn,
+    configuration_name,
+    configuration_state,
+
+    -- * ConfigurationInfo
+    ConfigurationInfo (..),
+    newConfigurationInfo,
+    configurationInfo_revision,
+    configurationInfo_arn,
+
+    -- * ConfigurationRevision
+    ConfigurationRevision (..),
+    newConfigurationRevision,
+    configurationRevision_description,
+    configurationRevision_revision,
+    configurationRevision_creationTime,
+
+    -- * ConnectivityInfo
+    ConnectivityInfo (..),
+    newConnectivityInfo,
+    connectivityInfo_publicAccess,
+
+    -- * EBSStorageInfo
+    EBSStorageInfo (..),
+    newEBSStorageInfo,
+    eBSStorageInfo_provisionedThroughput,
+    eBSStorageInfo_volumeSize,
+
+    -- * EncryptionAtRest
+    EncryptionAtRest (..),
+    newEncryptionAtRest,
+    encryptionAtRest_dataVolumeKMSKeyId,
+
+    -- * EncryptionInTransit
+    EncryptionInTransit (..),
+    newEncryptionInTransit,
+    encryptionInTransit_clientBroker,
+    encryptionInTransit_inCluster,
+
+    -- * EncryptionInfo
+    EncryptionInfo (..),
+    newEncryptionInfo,
+    encryptionInfo_encryptionAtRest,
+    encryptionInfo_encryptionInTransit,
+
+    -- * ErrorInfo
+    ErrorInfo (..),
+    newErrorInfo,
+    errorInfo_errorCode,
+    errorInfo_errorString,
+
+    -- * Firehose
+    Firehose (..),
+    newFirehose,
+    firehose_deliveryStream,
+    firehose_enabled,
+
+    -- * Iam
+    Iam (..),
+    newIam,
+    iam_enabled,
+
+    -- * JmxExporter
+    JmxExporter (..),
+    newJmxExporter,
+    jmxExporter_enabledInBroker,
+
+    -- * JmxExporterInfo
+    JmxExporterInfo (..),
+    newJmxExporterInfo,
+    jmxExporterInfo_enabledInBroker,
+
+    -- * KafkaVersion
+    KafkaVersion (..),
+    newKafkaVersion,
+    kafkaVersion_status,
+    kafkaVersion_version,
+
+    -- * LoggingInfo
+    LoggingInfo (..),
+    newLoggingInfo,
+    loggingInfo_brokerLogs,
+
+    -- * MutableClusterInfo
+    MutableClusterInfo (..),
+    newMutableClusterInfo,
+    mutableClusterInfo_brokerEBSVolumeInfo,
+    mutableClusterInfo_clientAuthentication,
+    mutableClusterInfo_configurationInfo,
+    mutableClusterInfo_connectivityInfo,
+    mutableClusterInfo_encryptionInfo,
+    mutableClusterInfo_enhancedMonitoring,
+    mutableClusterInfo_instanceType,
+    mutableClusterInfo_kafkaVersion,
+    mutableClusterInfo_loggingInfo,
+    mutableClusterInfo_numberOfBrokerNodes,
+    mutableClusterInfo_openMonitoring,
+    mutableClusterInfo_storageMode,
+
+    -- * NodeExporter
+    NodeExporter (..),
+    newNodeExporter,
+    nodeExporter_enabledInBroker,
+
+    -- * NodeExporterInfo
+    NodeExporterInfo (..),
+    newNodeExporterInfo,
+    nodeExporterInfo_enabledInBroker,
+
+    -- * NodeInfo
+    NodeInfo (..),
+    newNodeInfo,
+    nodeInfo_addedToClusterTime,
+    nodeInfo_brokerNodeInfo,
+    nodeInfo_instanceType,
+    nodeInfo_nodeARN,
+    nodeInfo_nodeType,
+    nodeInfo_zookeeperNodeInfo,
+
+    -- * OpenMonitoring
+    OpenMonitoring (..),
+    newOpenMonitoring,
+    openMonitoring_prometheus,
+
+    -- * OpenMonitoringInfo
+    OpenMonitoringInfo (..),
+    newOpenMonitoringInfo,
+    openMonitoringInfo_prometheus,
+
+    -- * Prometheus
+    Prometheus (..),
+    newPrometheus,
+    prometheus_jmxExporter,
+    prometheus_nodeExporter,
+
+    -- * PrometheusInfo
+    PrometheusInfo (..),
+    newPrometheusInfo,
+    prometheusInfo_jmxExporter,
+    prometheusInfo_nodeExporter,
+
+    -- * Provisioned
+    Provisioned (..),
+    newProvisioned,
+    provisioned_clientAuthentication,
+    provisioned_currentBrokerSoftwareInfo,
+    provisioned_encryptionInfo,
+    provisioned_enhancedMonitoring,
+    provisioned_loggingInfo,
+    provisioned_openMonitoring,
+    provisioned_storageMode,
+    provisioned_zookeeperConnectString,
+    provisioned_zookeeperConnectStringTls,
+    provisioned_brokerNodeGroupInfo,
+    provisioned_numberOfBrokerNodes,
+
+    -- * ProvisionedRequest
+    ProvisionedRequest (..),
+    newProvisionedRequest,
+    provisionedRequest_clientAuthentication,
+    provisionedRequest_configurationInfo,
+    provisionedRequest_encryptionInfo,
+    provisionedRequest_enhancedMonitoring,
+    provisionedRequest_loggingInfo,
+    provisionedRequest_openMonitoring,
+    provisionedRequest_storageMode,
+    provisionedRequest_brokerNodeGroupInfo,
+    provisionedRequest_kafkaVersion,
+    provisionedRequest_numberOfBrokerNodes,
+
+    -- * ProvisionedThroughput
+    ProvisionedThroughput (..),
+    newProvisionedThroughput,
+    provisionedThroughput_enabled,
+    provisionedThroughput_volumeThroughput,
+
+    -- * PublicAccess
+    PublicAccess (..),
+    newPublicAccess,
+    publicAccess_type,
+
+    -- * S3
+    S3 (..),
+    newS3,
+    s3_bucket,
+    s3_prefix,
+    s3_enabled,
+
+    -- * Sasl
+    Sasl (..),
+    newSasl,
+    sasl_iam,
+    sasl_scram,
+
+    -- * Scram
+    Scram (..),
+    newScram,
+    scram_enabled,
+
+    -- * Serverless
+    Serverless (..),
+    newServerless,
+    serverless_clientAuthentication,
+    serverless_vpcConfigs,
+
+    -- * ServerlessClientAuthentication
+    ServerlessClientAuthentication (..),
+    newServerlessClientAuthentication,
+    serverlessClientAuthentication_sasl,
+
+    -- * ServerlessRequest
+    ServerlessRequest (..),
+    newServerlessRequest,
+    serverlessRequest_clientAuthentication,
+    serverlessRequest_vpcConfigs,
+
+    -- * ServerlessSasl
+    ServerlessSasl (..),
+    newServerlessSasl,
+    serverlessSasl_iam,
+
+    -- * StateInfo
+    StateInfo (..),
+    newStateInfo,
+    stateInfo_code,
+    stateInfo_message,
+
+    -- * StorageInfo
+    StorageInfo (..),
+    newStorageInfo,
+    storageInfo_ebsStorageInfo,
+
+    -- * Tls
+    Tls (..),
+    newTls,
+    tls_certificateAuthorityArnList,
+    tls_enabled,
+
+    -- * Unauthenticated
+    Unauthenticated (..),
+    newUnauthenticated,
+    unauthenticated_enabled,
+
+    -- * UnprocessedScramSecret
+    UnprocessedScramSecret (..),
+    newUnprocessedScramSecret,
+    unprocessedScramSecret_errorCode,
+    unprocessedScramSecret_errorMessage,
+    unprocessedScramSecret_secretArn,
+
+    -- * VpcConfig
+    VpcConfig (..),
+    newVpcConfig,
+    vpcConfig_securityGroupIds,
+    vpcConfig_subnetIds,
+
+    -- * ZookeeperNodeInfo
+    ZookeeperNodeInfo (..),
+    newZookeeperNodeInfo,
+    zookeeperNodeInfo_attachedENIId,
+    zookeeperNodeInfo_clientVpcIpAddress,
+    zookeeperNodeInfo_endpoints,
+    zookeeperNodeInfo_zookeeperId,
+    zookeeperNodeInfo_zookeeperVersion,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.Kafka.Types.BrokerAZDistribution
+import Amazonka.Kafka.Types.BrokerEBSVolumeInfo
+import Amazonka.Kafka.Types.BrokerLogs
+import Amazonka.Kafka.Types.BrokerNodeGroupInfo
+import Amazonka.Kafka.Types.BrokerNodeInfo
+import Amazonka.Kafka.Types.BrokerSoftwareInfo
+import Amazonka.Kafka.Types.ClientAuthentication
+import Amazonka.Kafka.Types.ClientBroker
+import Amazonka.Kafka.Types.CloudWatchLogs
+import Amazonka.Kafka.Types.Cluster
+import Amazonka.Kafka.Types.ClusterInfo
+import Amazonka.Kafka.Types.ClusterOperationInfo
+import Amazonka.Kafka.Types.ClusterOperationStep
+import Amazonka.Kafka.Types.ClusterOperationStepInfo
+import Amazonka.Kafka.Types.ClusterState
+import Amazonka.Kafka.Types.ClusterType
+import Amazonka.Kafka.Types.CompatibleKafkaVersion
+import Amazonka.Kafka.Types.Configuration
+import Amazonka.Kafka.Types.ConfigurationInfo
+import Amazonka.Kafka.Types.ConfigurationRevision
+import Amazonka.Kafka.Types.ConfigurationState
+import Amazonka.Kafka.Types.ConnectivityInfo
+import Amazonka.Kafka.Types.EBSStorageInfo
+import Amazonka.Kafka.Types.EncryptionAtRest
+import Amazonka.Kafka.Types.EncryptionInTransit
+import Amazonka.Kafka.Types.EncryptionInfo
+import Amazonka.Kafka.Types.EnhancedMonitoring
+import Amazonka.Kafka.Types.ErrorInfo
+import Amazonka.Kafka.Types.Firehose
+import Amazonka.Kafka.Types.Iam
+import Amazonka.Kafka.Types.JmxExporter
+import Amazonka.Kafka.Types.JmxExporterInfo
+import Amazonka.Kafka.Types.KafkaVersion
+import Amazonka.Kafka.Types.KafkaVersionStatus
+import Amazonka.Kafka.Types.LoggingInfo
+import Amazonka.Kafka.Types.MutableClusterInfo
+import Amazonka.Kafka.Types.NodeExporter
+import Amazonka.Kafka.Types.NodeExporterInfo
+import Amazonka.Kafka.Types.NodeInfo
+import Amazonka.Kafka.Types.NodeType
+import Amazonka.Kafka.Types.OpenMonitoring
+import Amazonka.Kafka.Types.OpenMonitoringInfo
+import Amazonka.Kafka.Types.Prometheus
+import Amazonka.Kafka.Types.PrometheusInfo
+import Amazonka.Kafka.Types.Provisioned
+import Amazonka.Kafka.Types.ProvisionedRequest
+import Amazonka.Kafka.Types.ProvisionedThroughput
+import Amazonka.Kafka.Types.PublicAccess
+import Amazonka.Kafka.Types.S3
+import Amazonka.Kafka.Types.Sasl
+import Amazonka.Kafka.Types.Scram
+import Amazonka.Kafka.Types.Serverless
+import Amazonka.Kafka.Types.ServerlessClientAuthentication
+import Amazonka.Kafka.Types.ServerlessRequest
+import Amazonka.Kafka.Types.ServerlessSasl
+import Amazonka.Kafka.Types.StateInfo
+import Amazonka.Kafka.Types.StorageInfo
+import Amazonka.Kafka.Types.StorageMode
+import Amazonka.Kafka.Types.Tls
+import Amazonka.Kafka.Types.Unauthenticated
+import Amazonka.Kafka.Types.UnprocessedScramSecret
+import Amazonka.Kafka.Types.VpcConfig
+import Amazonka.Kafka.Types.ZookeeperNodeInfo
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2018-11-14@ of the Amazon Managed Streaming for Kafka SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Kafka",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "kafka",
+      Core.signingName = "kafka",
+      Core.version = "2018-11-14",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Kafka",
+      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
+
+-- | Returns information about an error.
+_BadRequestException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_BadRequestException =
+  Core._MatchServiceError
+    defaultService
+    "BadRequestException"
+    Prelude.. Core.hasStatus 400
+
+-- | Returns information about an error.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | Returns information about an error.
+_ForbiddenException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ForbiddenException =
+  Core._MatchServiceError
+    defaultService
+    "ForbiddenException"
+    Prelude.. Core.hasStatus 403
+
+-- | Returns information about an error.
+_InternalServerErrorException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerErrorException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerErrorException"
+    Prelude.. Core.hasStatus 500
+
+-- | Returns information about an error.
+_NotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "NotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | Returns information about an error.
+_ServiceUnavailableException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceUnavailableException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceUnavailableException"
+    Prelude.. Core.hasStatus 503
+
+-- | Returns information about an error.
+_TooManyRequestsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyRequestsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyRequestsException"
+    Prelude.. Core.hasStatus 429
+
+-- | Returns information about an error.
+_UnauthorizedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnauthorizedException =
+  Core._MatchServiceError
+    defaultService
+    "UnauthorizedException"
+    Prelude.. Core.hasStatus 401
diff --git a/gen/Amazonka/Kafka/Types/BrokerAZDistribution.hs b/gen/Amazonka/Kafka/Types/BrokerAZDistribution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/BrokerAZDistribution.hs
@@ -0,0 +1,74 @@
+{-# 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.Kafka.Types.BrokerAZDistribution
+-- 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.Kafka.Types.BrokerAZDistribution
+  ( BrokerAZDistribution
+      ( ..,
+        BrokerAZDistribution_DEFAULT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The distribution of broker nodes across Availability Zones. This is an
+-- optional parameter. If you don\'t specify it, Amazon MSK gives it the
+-- value DEFAULT. You can also explicitly set this parameter to the value
+-- DEFAULT. No other values are currently allowed.
+--
+-- Amazon MSK distributes the broker nodes evenly across the Availability
+-- Zones that correspond to the subnets you provide when you create the
+-- cluster.
+newtype BrokerAZDistribution = BrokerAZDistribution'
+  { fromBrokerAZDistribution ::
+      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 BrokerAZDistribution_DEFAULT :: BrokerAZDistribution
+pattern BrokerAZDistribution_DEFAULT = BrokerAZDistribution' "DEFAULT"
+
+{-# COMPLETE
+  BrokerAZDistribution_DEFAULT,
+  BrokerAZDistribution'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/BrokerEBSVolumeInfo.hs b/gen/Amazonka/Kafka/Types/BrokerEBSVolumeInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/BrokerEBSVolumeInfo.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.Kafka.Types.BrokerEBSVolumeInfo
+-- 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.Kafka.Types.BrokerEBSVolumeInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ProvisionedThroughput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the EBS volume upgrade information. The broker identifier must
+-- be set to the keyword ALL. This means the changes apply to all the
+-- brokers in the cluster.
+--
+-- /See:/ 'newBrokerEBSVolumeInfo' smart constructor.
+data BrokerEBSVolumeInfo = BrokerEBSVolumeInfo'
+  { -- | EBS volume provisioned throughput information.
+    provisionedThroughput :: Prelude.Maybe ProvisionedThroughput,
+    -- | Size of the EBS volume to update.
+    volumeSizeGB :: Prelude.Maybe Prelude.Int,
+    -- | The ID of the broker to update.
+    kafkaBrokerNodeId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BrokerEBSVolumeInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'provisionedThroughput', 'brokerEBSVolumeInfo_provisionedThroughput' - EBS volume provisioned throughput information.
+--
+-- 'volumeSizeGB', 'brokerEBSVolumeInfo_volumeSizeGB' - Size of the EBS volume to update.
+--
+-- 'kafkaBrokerNodeId', 'brokerEBSVolumeInfo_kafkaBrokerNodeId' - The ID of the broker to update.
+newBrokerEBSVolumeInfo ::
+  -- | 'kafkaBrokerNodeId'
+  Prelude.Text ->
+  BrokerEBSVolumeInfo
+newBrokerEBSVolumeInfo pKafkaBrokerNodeId_ =
+  BrokerEBSVolumeInfo'
+    { provisionedThroughput =
+        Prelude.Nothing,
+      volumeSizeGB = Prelude.Nothing,
+      kafkaBrokerNodeId = pKafkaBrokerNodeId_
+    }
+
+-- | EBS volume provisioned throughput information.
+brokerEBSVolumeInfo_provisionedThroughput :: Lens.Lens' BrokerEBSVolumeInfo (Prelude.Maybe ProvisionedThroughput)
+brokerEBSVolumeInfo_provisionedThroughput = Lens.lens (\BrokerEBSVolumeInfo' {provisionedThroughput} -> provisionedThroughput) (\s@BrokerEBSVolumeInfo' {} a -> s {provisionedThroughput = a} :: BrokerEBSVolumeInfo)
+
+-- | Size of the EBS volume to update.
+brokerEBSVolumeInfo_volumeSizeGB :: Lens.Lens' BrokerEBSVolumeInfo (Prelude.Maybe Prelude.Int)
+brokerEBSVolumeInfo_volumeSizeGB = Lens.lens (\BrokerEBSVolumeInfo' {volumeSizeGB} -> volumeSizeGB) (\s@BrokerEBSVolumeInfo' {} a -> s {volumeSizeGB = a} :: BrokerEBSVolumeInfo)
+
+-- | The ID of the broker to update.
+brokerEBSVolumeInfo_kafkaBrokerNodeId :: Lens.Lens' BrokerEBSVolumeInfo Prelude.Text
+brokerEBSVolumeInfo_kafkaBrokerNodeId = Lens.lens (\BrokerEBSVolumeInfo' {kafkaBrokerNodeId} -> kafkaBrokerNodeId) (\s@BrokerEBSVolumeInfo' {} a -> s {kafkaBrokerNodeId = a} :: BrokerEBSVolumeInfo)
+
+instance Data.FromJSON BrokerEBSVolumeInfo where
+  parseJSON =
+    Data.withObject
+      "BrokerEBSVolumeInfo"
+      ( \x ->
+          BrokerEBSVolumeInfo'
+            Prelude.<$> (x Data..:? "provisionedThroughput")
+            Prelude.<*> (x Data..:? "volumeSizeGB")
+            Prelude.<*> (x Data..: "kafkaBrokerNodeId")
+      )
+
+instance Prelude.Hashable BrokerEBSVolumeInfo where
+  hashWithSalt _salt BrokerEBSVolumeInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` provisionedThroughput
+      `Prelude.hashWithSalt` volumeSizeGB
+      `Prelude.hashWithSalt` kafkaBrokerNodeId
+
+instance Prelude.NFData BrokerEBSVolumeInfo where
+  rnf BrokerEBSVolumeInfo' {..} =
+    Prelude.rnf provisionedThroughput
+      `Prelude.seq` Prelude.rnf volumeSizeGB
+      `Prelude.seq` Prelude.rnf kafkaBrokerNodeId
+
+instance Data.ToJSON BrokerEBSVolumeInfo where
+  toJSON BrokerEBSVolumeInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("provisionedThroughput" Data..=)
+              Prelude.<$> provisionedThroughput,
+            ("volumeSizeGB" Data..=) Prelude.<$> volumeSizeGB,
+            Prelude.Just
+              ("kafkaBrokerNodeId" Data..= kafkaBrokerNodeId)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/BrokerLogs.hs b/gen/Amazonka/Kafka/Types/BrokerLogs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/BrokerLogs.hs
@@ -0,0 +1,105 @@
+{-# 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.Kafka.Types.BrokerLogs
+-- 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.Kafka.Types.BrokerLogs where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.CloudWatchLogs
+import Amazonka.Kafka.Types.Firehose
+import Amazonka.Kafka.Types.S3
+import qualified Amazonka.Prelude as Prelude
+
+-- | /See:/ 'newBrokerLogs' smart constructor.
+data BrokerLogs = BrokerLogs'
+  { cloudWatchLogs :: Prelude.Maybe CloudWatchLogs,
+    firehose :: Prelude.Maybe Firehose,
+    s3 :: Prelude.Maybe S3
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BrokerLogs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cloudWatchLogs', 'brokerLogs_cloudWatchLogs' - Undocumented member.
+--
+-- 'firehose', 'brokerLogs_firehose' - Undocumented member.
+--
+-- 's3', 'brokerLogs_s3' - Undocumented member.
+newBrokerLogs ::
+  BrokerLogs
+newBrokerLogs =
+  BrokerLogs'
+    { cloudWatchLogs = Prelude.Nothing,
+      firehose = Prelude.Nothing,
+      s3 = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+brokerLogs_cloudWatchLogs :: Lens.Lens' BrokerLogs (Prelude.Maybe CloudWatchLogs)
+brokerLogs_cloudWatchLogs = Lens.lens (\BrokerLogs' {cloudWatchLogs} -> cloudWatchLogs) (\s@BrokerLogs' {} a -> s {cloudWatchLogs = a} :: BrokerLogs)
+
+-- | Undocumented member.
+brokerLogs_firehose :: Lens.Lens' BrokerLogs (Prelude.Maybe Firehose)
+brokerLogs_firehose = Lens.lens (\BrokerLogs' {firehose} -> firehose) (\s@BrokerLogs' {} a -> s {firehose = a} :: BrokerLogs)
+
+-- | Undocumented member.
+brokerLogs_s3 :: Lens.Lens' BrokerLogs (Prelude.Maybe S3)
+brokerLogs_s3 = Lens.lens (\BrokerLogs' {s3} -> s3) (\s@BrokerLogs' {} a -> s {s3 = a} :: BrokerLogs)
+
+instance Data.FromJSON BrokerLogs where
+  parseJSON =
+    Data.withObject
+      "BrokerLogs"
+      ( \x ->
+          BrokerLogs'
+            Prelude.<$> (x Data..:? "cloudWatchLogs")
+            Prelude.<*> (x Data..:? "firehose")
+            Prelude.<*> (x Data..:? "s3")
+      )
+
+instance Prelude.Hashable BrokerLogs where
+  hashWithSalt _salt BrokerLogs' {..} =
+    _salt
+      `Prelude.hashWithSalt` cloudWatchLogs
+      `Prelude.hashWithSalt` firehose
+      `Prelude.hashWithSalt` s3
+
+instance Prelude.NFData BrokerLogs where
+  rnf BrokerLogs' {..} =
+    Prelude.rnf cloudWatchLogs
+      `Prelude.seq` Prelude.rnf firehose
+      `Prelude.seq` Prelude.rnf s3
+
+instance Data.ToJSON BrokerLogs where
+  toJSON BrokerLogs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("cloudWatchLogs" Data..=)
+              Prelude.<$> cloudWatchLogs,
+            ("firehose" Data..=) Prelude.<$> firehose,
+            ("s3" Data..=) Prelude.<$> s3
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/BrokerNodeGroupInfo.hs b/gen/Amazonka/Kafka/Types/BrokerNodeGroupInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/BrokerNodeGroupInfo.hs
@@ -0,0 +1,206 @@
+{-# 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.Kafka.Types.BrokerNodeGroupInfo
+-- 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.Kafka.Types.BrokerNodeGroupInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerAZDistribution
+import Amazonka.Kafka.Types.ConnectivityInfo
+import Amazonka.Kafka.Types.StorageInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the setup to be used for Apache Kafka broker nodes in the
+-- cluster.
+--
+-- /See:/ 'newBrokerNodeGroupInfo' smart constructor.
+data BrokerNodeGroupInfo = BrokerNodeGroupInfo'
+  { -- | The distribution of broker nodes across Availability Zones. This is an
+    -- optional parameter. If you don\'t specify it, Amazon MSK gives it the
+    -- value DEFAULT. You can also explicitly set this parameter to the value
+    -- DEFAULT. No other values are currently allowed.
+    --
+    -- Amazon MSK distributes the broker nodes evenly across the Availability
+    -- Zones that correspond to the subnets you provide when you create the
+    -- cluster.
+    brokerAZDistribution :: Prelude.Maybe BrokerAZDistribution,
+    -- | Information about the broker access configuration.
+    connectivityInfo :: Prelude.Maybe ConnectivityInfo,
+    -- | The AWS security groups to associate with the elastic network interfaces
+    -- in order to specify who can connect to and communicate with the Amazon
+    -- MSK cluster. If you don\'t specify a security group, Amazon MSK uses the
+    -- default security group associated with the VPC.
+    securityGroups :: Prelude.Maybe [Prelude.Text],
+    -- | Contains information about storage volumes attached to MSK broker nodes.
+    storageInfo :: Prelude.Maybe StorageInfo,
+    -- | The list of subnets to connect to in the client virtual private cloud
+    -- (VPC). AWS creates elastic network interfaces inside these subnets.
+    -- Client applications use elastic network interfaces to produce and
+    -- consume data. Client subnets can\'t occupy the Availability Zone with ID
+    -- use use1-az3.
+    clientSubnets :: [Prelude.Text],
+    -- | The type of Amazon EC2 instances to use for Apache Kafka brokers. The
+    -- following instance types are allowed: kafka.m5.large, kafka.m5.xlarge,
+    -- kafka.m5.2xlarge, kafka.m5.4xlarge, kafka.m5.12xlarge, and
+    -- kafka.m5.24xlarge.
+    instanceType :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BrokerNodeGroupInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'brokerAZDistribution', 'brokerNodeGroupInfo_brokerAZDistribution' - The distribution of broker nodes across Availability Zones. This is an
+-- optional parameter. If you don\'t specify it, Amazon MSK gives it the
+-- value DEFAULT. You can also explicitly set this parameter to the value
+-- DEFAULT. No other values are currently allowed.
+--
+-- Amazon MSK distributes the broker nodes evenly across the Availability
+-- Zones that correspond to the subnets you provide when you create the
+-- cluster.
+--
+-- 'connectivityInfo', 'brokerNodeGroupInfo_connectivityInfo' - Information about the broker access configuration.
+--
+-- 'securityGroups', 'brokerNodeGroupInfo_securityGroups' - The AWS security groups to associate with the elastic network interfaces
+-- in order to specify who can connect to and communicate with the Amazon
+-- MSK cluster. If you don\'t specify a security group, Amazon MSK uses the
+-- default security group associated with the VPC.
+--
+-- 'storageInfo', 'brokerNodeGroupInfo_storageInfo' - Contains information about storage volumes attached to MSK broker nodes.
+--
+-- 'clientSubnets', 'brokerNodeGroupInfo_clientSubnets' - The list of subnets to connect to in the client virtual private cloud
+-- (VPC). AWS creates elastic network interfaces inside these subnets.
+-- Client applications use elastic network interfaces to produce and
+-- consume data. Client subnets can\'t occupy the Availability Zone with ID
+-- use use1-az3.
+--
+-- 'instanceType', 'brokerNodeGroupInfo_instanceType' - The type of Amazon EC2 instances to use for Apache Kafka brokers. The
+-- following instance types are allowed: kafka.m5.large, kafka.m5.xlarge,
+-- kafka.m5.2xlarge, kafka.m5.4xlarge, kafka.m5.12xlarge, and
+-- kafka.m5.24xlarge.
+newBrokerNodeGroupInfo ::
+  -- | 'instanceType'
+  Prelude.Text ->
+  BrokerNodeGroupInfo
+newBrokerNodeGroupInfo pInstanceType_ =
+  BrokerNodeGroupInfo'
+    { brokerAZDistribution =
+        Prelude.Nothing,
+      connectivityInfo = Prelude.Nothing,
+      securityGroups = Prelude.Nothing,
+      storageInfo = Prelude.Nothing,
+      clientSubnets = Prelude.mempty,
+      instanceType = pInstanceType_
+    }
+
+-- | The distribution of broker nodes across Availability Zones. This is an
+-- optional parameter. If you don\'t specify it, Amazon MSK gives it the
+-- value DEFAULT. You can also explicitly set this parameter to the value
+-- DEFAULT. No other values are currently allowed.
+--
+-- Amazon MSK distributes the broker nodes evenly across the Availability
+-- Zones that correspond to the subnets you provide when you create the
+-- cluster.
+brokerNodeGroupInfo_brokerAZDistribution :: Lens.Lens' BrokerNodeGroupInfo (Prelude.Maybe BrokerAZDistribution)
+brokerNodeGroupInfo_brokerAZDistribution = Lens.lens (\BrokerNodeGroupInfo' {brokerAZDistribution} -> brokerAZDistribution) (\s@BrokerNodeGroupInfo' {} a -> s {brokerAZDistribution = a} :: BrokerNodeGroupInfo)
+
+-- | Information about the broker access configuration.
+brokerNodeGroupInfo_connectivityInfo :: Lens.Lens' BrokerNodeGroupInfo (Prelude.Maybe ConnectivityInfo)
+brokerNodeGroupInfo_connectivityInfo = Lens.lens (\BrokerNodeGroupInfo' {connectivityInfo} -> connectivityInfo) (\s@BrokerNodeGroupInfo' {} a -> s {connectivityInfo = a} :: BrokerNodeGroupInfo)
+
+-- | The AWS security groups to associate with the elastic network interfaces
+-- in order to specify who can connect to and communicate with the Amazon
+-- MSK cluster. If you don\'t specify a security group, Amazon MSK uses the
+-- default security group associated with the VPC.
+brokerNodeGroupInfo_securityGroups :: Lens.Lens' BrokerNodeGroupInfo (Prelude.Maybe [Prelude.Text])
+brokerNodeGroupInfo_securityGroups = Lens.lens (\BrokerNodeGroupInfo' {securityGroups} -> securityGroups) (\s@BrokerNodeGroupInfo' {} a -> s {securityGroups = a} :: BrokerNodeGroupInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | Contains information about storage volumes attached to MSK broker nodes.
+brokerNodeGroupInfo_storageInfo :: Lens.Lens' BrokerNodeGroupInfo (Prelude.Maybe StorageInfo)
+brokerNodeGroupInfo_storageInfo = Lens.lens (\BrokerNodeGroupInfo' {storageInfo} -> storageInfo) (\s@BrokerNodeGroupInfo' {} a -> s {storageInfo = a} :: BrokerNodeGroupInfo)
+
+-- | The list of subnets to connect to in the client virtual private cloud
+-- (VPC). AWS creates elastic network interfaces inside these subnets.
+-- Client applications use elastic network interfaces to produce and
+-- consume data. Client subnets can\'t occupy the Availability Zone with ID
+-- use use1-az3.
+brokerNodeGroupInfo_clientSubnets :: Lens.Lens' BrokerNodeGroupInfo [Prelude.Text]
+brokerNodeGroupInfo_clientSubnets = Lens.lens (\BrokerNodeGroupInfo' {clientSubnets} -> clientSubnets) (\s@BrokerNodeGroupInfo' {} a -> s {clientSubnets = a} :: BrokerNodeGroupInfo) Prelude.. Lens.coerced
+
+-- | The type of Amazon EC2 instances to use for Apache Kafka brokers. The
+-- following instance types are allowed: kafka.m5.large, kafka.m5.xlarge,
+-- kafka.m5.2xlarge, kafka.m5.4xlarge, kafka.m5.12xlarge, and
+-- kafka.m5.24xlarge.
+brokerNodeGroupInfo_instanceType :: Lens.Lens' BrokerNodeGroupInfo Prelude.Text
+brokerNodeGroupInfo_instanceType = Lens.lens (\BrokerNodeGroupInfo' {instanceType} -> instanceType) (\s@BrokerNodeGroupInfo' {} a -> s {instanceType = a} :: BrokerNodeGroupInfo)
+
+instance Data.FromJSON BrokerNodeGroupInfo where
+  parseJSON =
+    Data.withObject
+      "BrokerNodeGroupInfo"
+      ( \x ->
+          BrokerNodeGroupInfo'
+            Prelude.<$> (x Data..:? "brokerAZDistribution")
+            Prelude.<*> (x Data..:? "connectivityInfo")
+            Prelude.<*> (x Data..:? "securityGroups" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "storageInfo")
+            Prelude.<*> (x Data..:? "clientSubnets" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "instanceType")
+      )
+
+instance Prelude.Hashable BrokerNodeGroupInfo where
+  hashWithSalt _salt BrokerNodeGroupInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` brokerAZDistribution
+      `Prelude.hashWithSalt` connectivityInfo
+      `Prelude.hashWithSalt` securityGroups
+      `Prelude.hashWithSalt` storageInfo
+      `Prelude.hashWithSalt` clientSubnets
+      `Prelude.hashWithSalt` instanceType
+
+instance Prelude.NFData BrokerNodeGroupInfo where
+  rnf BrokerNodeGroupInfo' {..} =
+    Prelude.rnf brokerAZDistribution
+      `Prelude.seq` Prelude.rnf connectivityInfo
+      `Prelude.seq` Prelude.rnf securityGroups
+      `Prelude.seq` Prelude.rnf storageInfo
+      `Prelude.seq` Prelude.rnf clientSubnets
+      `Prelude.seq` Prelude.rnf instanceType
+
+instance Data.ToJSON BrokerNodeGroupInfo where
+  toJSON BrokerNodeGroupInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("brokerAZDistribution" Data..=)
+              Prelude.<$> brokerAZDistribution,
+            ("connectivityInfo" Data..=)
+              Prelude.<$> connectivityInfo,
+            ("securityGroups" Data..=)
+              Prelude.<$> securityGroups,
+            ("storageInfo" Data..=) Prelude.<$> storageInfo,
+            Prelude.Just ("clientSubnets" Data..= clientSubnets),
+            Prelude.Just ("instanceType" Data..= instanceType)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/BrokerNodeInfo.hs b/gen/Amazonka/Kafka/Types/BrokerNodeInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/BrokerNodeInfo.hs
@@ -0,0 +1,136 @@
+{-# 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.Kafka.Types.BrokerNodeInfo
+-- 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.Kafka.Types.BrokerNodeInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerSoftwareInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | BrokerNodeInfo
+--
+-- /See:/ 'newBrokerNodeInfo' smart constructor.
+data BrokerNodeInfo = BrokerNodeInfo'
+  { -- | The attached elastic network interface of the broker.
+    attachedENIId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the broker.
+    brokerId :: Prelude.Maybe Prelude.Double,
+    -- | The client subnet to which this broker node belongs.
+    clientSubnet :: Prelude.Maybe Prelude.Text,
+    -- | The virtual private cloud (VPC) of the client.
+    clientVpcIpAddress :: Prelude.Maybe Prelude.Text,
+    -- | Information about the version of software currently deployed on the
+    -- Apache Kafka brokers in the cluster.
+    currentBrokerSoftwareInfo :: Prelude.Maybe BrokerSoftwareInfo,
+    -- | Endpoints for accessing the broker.
+    endpoints :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BrokerNodeInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attachedENIId', 'brokerNodeInfo_attachedENIId' - The attached elastic network interface of the broker.
+--
+-- 'brokerId', 'brokerNodeInfo_brokerId' - The ID of the broker.
+--
+-- 'clientSubnet', 'brokerNodeInfo_clientSubnet' - The client subnet to which this broker node belongs.
+--
+-- 'clientVpcIpAddress', 'brokerNodeInfo_clientVpcIpAddress' - The virtual private cloud (VPC) of the client.
+--
+-- 'currentBrokerSoftwareInfo', 'brokerNodeInfo_currentBrokerSoftwareInfo' - Information about the version of software currently deployed on the
+-- Apache Kafka brokers in the cluster.
+--
+-- 'endpoints', 'brokerNodeInfo_endpoints' - Endpoints for accessing the broker.
+newBrokerNodeInfo ::
+  BrokerNodeInfo
+newBrokerNodeInfo =
+  BrokerNodeInfo'
+    { attachedENIId = Prelude.Nothing,
+      brokerId = Prelude.Nothing,
+      clientSubnet = Prelude.Nothing,
+      clientVpcIpAddress = Prelude.Nothing,
+      currentBrokerSoftwareInfo = Prelude.Nothing,
+      endpoints = Prelude.Nothing
+    }
+
+-- | The attached elastic network interface of the broker.
+brokerNodeInfo_attachedENIId :: Lens.Lens' BrokerNodeInfo (Prelude.Maybe Prelude.Text)
+brokerNodeInfo_attachedENIId = Lens.lens (\BrokerNodeInfo' {attachedENIId} -> attachedENIId) (\s@BrokerNodeInfo' {} a -> s {attachedENIId = a} :: BrokerNodeInfo)
+
+-- | The ID of the broker.
+brokerNodeInfo_brokerId :: Lens.Lens' BrokerNodeInfo (Prelude.Maybe Prelude.Double)
+brokerNodeInfo_brokerId = Lens.lens (\BrokerNodeInfo' {brokerId} -> brokerId) (\s@BrokerNodeInfo' {} a -> s {brokerId = a} :: BrokerNodeInfo)
+
+-- | The client subnet to which this broker node belongs.
+brokerNodeInfo_clientSubnet :: Lens.Lens' BrokerNodeInfo (Prelude.Maybe Prelude.Text)
+brokerNodeInfo_clientSubnet = Lens.lens (\BrokerNodeInfo' {clientSubnet} -> clientSubnet) (\s@BrokerNodeInfo' {} a -> s {clientSubnet = a} :: BrokerNodeInfo)
+
+-- | The virtual private cloud (VPC) of the client.
+brokerNodeInfo_clientVpcIpAddress :: Lens.Lens' BrokerNodeInfo (Prelude.Maybe Prelude.Text)
+brokerNodeInfo_clientVpcIpAddress = Lens.lens (\BrokerNodeInfo' {clientVpcIpAddress} -> clientVpcIpAddress) (\s@BrokerNodeInfo' {} a -> s {clientVpcIpAddress = a} :: BrokerNodeInfo)
+
+-- | Information about the version of software currently deployed on the
+-- Apache Kafka brokers in the cluster.
+brokerNodeInfo_currentBrokerSoftwareInfo :: Lens.Lens' BrokerNodeInfo (Prelude.Maybe BrokerSoftwareInfo)
+brokerNodeInfo_currentBrokerSoftwareInfo = Lens.lens (\BrokerNodeInfo' {currentBrokerSoftwareInfo} -> currentBrokerSoftwareInfo) (\s@BrokerNodeInfo' {} a -> s {currentBrokerSoftwareInfo = a} :: BrokerNodeInfo)
+
+-- | Endpoints for accessing the broker.
+brokerNodeInfo_endpoints :: Lens.Lens' BrokerNodeInfo (Prelude.Maybe [Prelude.Text])
+brokerNodeInfo_endpoints = Lens.lens (\BrokerNodeInfo' {endpoints} -> endpoints) (\s@BrokerNodeInfo' {} a -> s {endpoints = a} :: BrokerNodeInfo) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON BrokerNodeInfo where
+  parseJSON =
+    Data.withObject
+      "BrokerNodeInfo"
+      ( \x ->
+          BrokerNodeInfo'
+            Prelude.<$> (x Data..:? "attachedENIId")
+            Prelude.<*> (x Data..:? "brokerId")
+            Prelude.<*> (x Data..:? "clientSubnet")
+            Prelude.<*> (x Data..:? "clientVpcIpAddress")
+            Prelude.<*> (x Data..:? "currentBrokerSoftwareInfo")
+            Prelude.<*> (x Data..:? "endpoints" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable BrokerNodeInfo where
+  hashWithSalt _salt BrokerNodeInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` attachedENIId
+      `Prelude.hashWithSalt` brokerId
+      `Prelude.hashWithSalt` clientSubnet
+      `Prelude.hashWithSalt` clientVpcIpAddress
+      `Prelude.hashWithSalt` currentBrokerSoftwareInfo
+      `Prelude.hashWithSalt` endpoints
+
+instance Prelude.NFData BrokerNodeInfo where
+  rnf BrokerNodeInfo' {..} =
+    Prelude.rnf attachedENIId
+      `Prelude.seq` Prelude.rnf brokerId
+      `Prelude.seq` Prelude.rnf clientSubnet
+      `Prelude.seq` Prelude.rnf clientVpcIpAddress
+      `Prelude.seq` Prelude.rnf currentBrokerSoftwareInfo
+      `Prelude.seq` Prelude.rnf endpoints
diff --git a/gen/Amazonka/Kafka/Types/BrokerSoftwareInfo.hs b/gen/Amazonka/Kafka/Types/BrokerSoftwareInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/BrokerSoftwareInfo.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.BrokerSoftwareInfo
+-- 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.Kafka.Types.BrokerSoftwareInfo 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
+
+-- | Information about the current software installed on the cluster.
+--
+-- /See:/ 'newBrokerSoftwareInfo' smart constructor.
+data BrokerSoftwareInfo = BrokerSoftwareInfo'
+  { -- | The Amazon Resource Name (ARN) of the configuration used for the
+    -- cluster. This field isn\'t visible in this preview release.
+    configurationArn :: Prelude.Maybe Prelude.Text,
+    -- | The revision of the configuration to use. This field isn\'t visible in
+    -- this preview release.
+    configurationRevision :: Prelude.Maybe Prelude.Integer,
+    -- | The version of Apache Kafka.
+    kafkaVersion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BrokerSoftwareInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationArn', 'brokerSoftwareInfo_configurationArn' - The Amazon Resource Name (ARN) of the configuration used for the
+-- cluster. This field isn\'t visible in this preview release.
+--
+-- 'configurationRevision', 'brokerSoftwareInfo_configurationRevision' - The revision of the configuration to use. This field isn\'t visible in
+-- this preview release.
+--
+-- 'kafkaVersion', 'brokerSoftwareInfo_kafkaVersion' - The version of Apache Kafka.
+newBrokerSoftwareInfo ::
+  BrokerSoftwareInfo
+newBrokerSoftwareInfo =
+  BrokerSoftwareInfo'
+    { configurationArn =
+        Prelude.Nothing,
+      configurationRevision = Prelude.Nothing,
+      kafkaVersion = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration used for the
+-- cluster. This field isn\'t visible in this preview release.
+brokerSoftwareInfo_configurationArn :: Lens.Lens' BrokerSoftwareInfo (Prelude.Maybe Prelude.Text)
+brokerSoftwareInfo_configurationArn = Lens.lens (\BrokerSoftwareInfo' {configurationArn} -> configurationArn) (\s@BrokerSoftwareInfo' {} a -> s {configurationArn = a} :: BrokerSoftwareInfo)
+
+-- | The revision of the configuration to use. This field isn\'t visible in
+-- this preview release.
+brokerSoftwareInfo_configurationRevision :: Lens.Lens' BrokerSoftwareInfo (Prelude.Maybe Prelude.Integer)
+brokerSoftwareInfo_configurationRevision = Lens.lens (\BrokerSoftwareInfo' {configurationRevision} -> configurationRevision) (\s@BrokerSoftwareInfo' {} a -> s {configurationRevision = a} :: BrokerSoftwareInfo)
+
+-- | The version of Apache Kafka.
+brokerSoftwareInfo_kafkaVersion :: Lens.Lens' BrokerSoftwareInfo (Prelude.Maybe Prelude.Text)
+brokerSoftwareInfo_kafkaVersion = Lens.lens (\BrokerSoftwareInfo' {kafkaVersion} -> kafkaVersion) (\s@BrokerSoftwareInfo' {} a -> s {kafkaVersion = a} :: BrokerSoftwareInfo)
+
+instance Data.FromJSON BrokerSoftwareInfo where
+  parseJSON =
+    Data.withObject
+      "BrokerSoftwareInfo"
+      ( \x ->
+          BrokerSoftwareInfo'
+            Prelude.<$> (x Data..:? "configurationArn")
+            Prelude.<*> (x Data..:? "configurationRevision")
+            Prelude.<*> (x Data..:? "kafkaVersion")
+      )
+
+instance Prelude.Hashable BrokerSoftwareInfo where
+  hashWithSalt _salt BrokerSoftwareInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationArn
+      `Prelude.hashWithSalt` configurationRevision
+      `Prelude.hashWithSalt` kafkaVersion
+
+instance Prelude.NFData BrokerSoftwareInfo where
+  rnf BrokerSoftwareInfo' {..} =
+    Prelude.rnf configurationArn
+      `Prelude.seq` Prelude.rnf configurationRevision
+      `Prelude.seq` Prelude.rnf kafkaVersion
diff --git a/gen/Amazonka/Kafka/Types/ClientAuthentication.hs b/gen/Amazonka/Kafka/Types/ClientAuthentication.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClientAuthentication.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.ClientAuthentication
+-- 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.Kafka.Types.ClientAuthentication where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.Sasl
+import Amazonka.Kafka.Types.Tls
+import Amazonka.Kafka.Types.Unauthenticated
+import qualified Amazonka.Prelude as Prelude
+
+-- | Includes all client authentication information.
+--
+-- /See:/ 'newClientAuthentication' smart constructor.
+data ClientAuthentication = ClientAuthentication'
+  { -- | Details for ClientAuthentication using SASL.
+    sasl :: Prelude.Maybe Sasl,
+    -- | Details for ClientAuthentication using TLS.
+    tls :: Prelude.Maybe Tls,
+    -- | Contains information about unauthenticated traffic to the cluster.
+    unauthenticated :: Prelude.Maybe Unauthenticated
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClientAuthentication' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'sasl', 'clientAuthentication_sasl' - Details for ClientAuthentication using SASL.
+--
+-- 'tls', 'clientAuthentication_tls' - Details for ClientAuthentication using TLS.
+--
+-- 'unauthenticated', 'clientAuthentication_unauthenticated' - Contains information about unauthenticated traffic to the cluster.
+newClientAuthentication ::
+  ClientAuthentication
+newClientAuthentication =
+  ClientAuthentication'
+    { sasl = Prelude.Nothing,
+      tls = Prelude.Nothing,
+      unauthenticated = Prelude.Nothing
+    }
+
+-- | Details for ClientAuthentication using SASL.
+clientAuthentication_sasl :: Lens.Lens' ClientAuthentication (Prelude.Maybe Sasl)
+clientAuthentication_sasl = Lens.lens (\ClientAuthentication' {sasl} -> sasl) (\s@ClientAuthentication' {} a -> s {sasl = a} :: ClientAuthentication)
+
+-- | Details for ClientAuthentication using TLS.
+clientAuthentication_tls :: Lens.Lens' ClientAuthentication (Prelude.Maybe Tls)
+clientAuthentication_tls = Lens.lens (\ClientAuthentication' {tls} -> tls) (\s@ClientAuthentication' {} a -> s {tls = a} :: ClientAuthentication)
+
+-- | Contains information about unauthenticated traffic to the cluster.
+clientAuthentication_unauthenticated :: Lens.Lens' ClientAuthentication (Prelude.Maybe Unauthenticated)
+clientAuthentication_unauthenticated = Lens.lens (\ClientAuthentication' {unauthenticated} -> unauthenticated) (\s@ClientAuthentication' {} a -> s {unauthenticated = a} :: ClientAuthentication)
+
+instance Data.FromJSON ClientAuthentication where
+  parseJSON =
+    Data.withObject
+      "ClientAuthentication"
+      ( \x ->
+          ClientAuthentication'
+            Prelude.<$> (x Data..:? "sasl")
+            Prelude.<*> (x Data..:? "tls")
+            Prelude.<*> (x Data..:? "unauthenticated")
+      )
+
+instance Prelude.Hashable ClientAuthentication where
+  hashWithSalt _salt ClientAuthentication' {..} =
+    _salt
+      `Prelude.hashWithSalt` sasl
+      `Prelude.hashWithSalt` tls
+      `Prelude.hashWithSalt` unauthenticated
+
+instance Prelude.NFData ClientAuthentication where
+  rnf ClientAuthentication' {..} =
+    Prelude.rnf sasl
+      `Prelude.seq` Prelude.rnf tls
+      `Prelude.seq` Prelude.rnf unauthenticated
+
+instance Data.ToJSON ClientAuthentication where
+  toJSON ClientAuthentication' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("sasl" Data..=) Prelude.<$> sasl,
+            ("tls" Data..=) Prelude.<$> tls,
+            ("unauthenticated" Data..=)
+              Prelude.<$> unauthenticated
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/ClientBroker.hs b/gen/Amazonka/Kafka/Types/ClientBroker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClientBroker.hs
@@ -0,0 +1,77 @@
+{-# 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.Kafka.Types.ClientBroker
+-- 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.Kafka.Types.ClientBroker
+  ( ClientBroker
+      ( ..,
+        ClientBroker_PLAINTEXT,
+        ClientBroker_TLS,
+        ClientBroker_TLS_PLAINTEXT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Client-broker encryption in transit setting.
+newtype ClientBroker = ClientBroker'
+  { fromClientBroker ::
+      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 ClientBroker_PLAINTEXT :: ClientBroker
+pattern ClientBroker_PLAINTEXT = ClientBroker' "PLAINTEXT"
+
+pattern ClientBroker_TLS :: ClientBroker
+pattern ClientBroker_TLS = ClientBroker' "TLS"
+
+pattern ClientBroker_TLS_PLAINTEXT :: ClientBroker
+pattern ClientBroker_TLS_PLAINTEXT = ClientBroker' "TLS_PLAINTEXT"
+
+{-# COMPLETE
+  ClientBroker_PLAINTEXT,
+  ClientBroker_TLS,
+  ClientBroker_TLS_PLAINTEXT,
+  ClientBroker'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/CloudWatchLogs.hs b/gen/Amazonka/Kafka/Types/CloudWatchLogs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/CloudWatchLogs.hs
@@ -0,0 +1,91 @@
+{-# 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.Kafka.Types.CloudWatchLogs
+-- 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.Kafka.Types.CloudWatchLogs 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
+
+-- | /See:/ 'newCloudWatchLogs' smart constructor.
+data CloudWatchLogs = CloudWatchLogs'
+  { logGroup :: Prelude.Maybe Prelude.Text,
+    enabled :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CloudWatchLogs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'logGroup', 'cloudWatchLogs_logGroup' - Undocumented member.
+--
+-- 'enabled', 'cloudWatchLogs_enabled' - Undocumented member.
+newCloudWatchLogs ::
+  -- | 'enabled'
+  Prelude.Bool ->
+  CloudWatchLogs
+newCloudWatchLogs pEnabled_ =
+  CloudWatchLogs'
+    { logGroup = Prelude.Nothing,
+      enabled = pEnabled_
+    }
+
+-- | Undocumented member.
+cloudWatchLogs_logGroup :: Lens.Lens' CloudWatchLogs (Prelude.Maybe Prelude.Text)
+cloudWatchLogs_logGroup = Lens.lens (\CloudWatchLogs' {logGroup} -> logGroup) (\s@CloudWatchLogs' {} a -> s {logGroup = a} :: CloudWatchLogs)
+
+-- | Undocumented member.
+cloudWatchLogs_enabled :: Lens.Lens' CloudWatchLogs Prelude.Bool
+cloudWatchLogs_enabled = Lens.lens (\CloudWatchLogs' {enabled} -> enabled) (\s@CloudWatchLogs' {} a -> s {enabled = a} :: CloudWatchLogs)
+
+instance Data.FromJSON CloudWatchLogs where
+  parseJSON =
+    Data.withObject
+      "CloudWatchLogs"
+      ( \x ->
+          CloudWatchLogs'
+            Prelude.<$> (x Data..:? "logGroup")
+            Prelude.<*> (x Data..: "enabled")
+      )
+
+instance Prelude.Hashable CloudWatchLogs where
+  hashWithSalt _salt CloudWatchLogs' {..} =
+    _salt
+      `Prelude.hashWithSalt` logGroup
+      `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData CloudWatchLogs where
+  rnf CloudWatchLogs' {..} =
+    Prelude.rnf logGroup
+      `Prelude.seq` Prelude.rnf enabled
+
+instance Data.ToJSON CloudWatchLogs where
+  toJSON CloudWatchLogs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("logGroup" Data..=) Prelude.<$> logGroup,
+            Prelude.Just ("enabled" Data..= enabled)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Cluster.hs b/gen/Amazonka/Kafka/Types/Cluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Cluster.hs
@@ -0,0 +1,203 @@
+{-# 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.Kafka.Types.Cluster
+-- 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.Kafka.Types.Cluster where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ClusterState
+import Amazonka.Kafka.Types.ClusterType
+import Amazonka.Kafka.Types.Provisioned
+import Amazonka.Kafka.Types.Serverless
+import Amazonka.Kafka.Types.StateInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Returns information about a cluster.
+--
+-- /See:/ 'newCluster' smart constructor.
+data Cluster = Cluster'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies a cluster
+    -- operation.
+    activeOperationArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the cluster.
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | Cluster Type.
+    clusterType :: Prelude.Maybe ClusterType,
+    -- | The time when the cluster was created.
+    creationTime :: Prelude.Maybe Data.ISO8601,
+    -- | The current version of the MSK cluster.
+    currentVersion :: Prelude.Maybe Prelude.Text,
+    -- | Information about the provisioned cluster.
+    provisioned :: Prelude.Maybe Provisioned,
+    -- | Information about the serverless cluster.
+    serverless :: Prelude.Maybe Serverless,
+    -- | The state of the cluster. The possible states are ACTIVE, CREATING,
+    -- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+    state :: Prelude.Maybe ClusterState,
+    -- | State Info for the Amazon MSK cluster.
+    stateInfo :: Prelude.Maybe StateInfo,
+    -- | Tags attached to the cluster.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Cluster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'activeOperationArn', 'cluster_activeOperationArn' - The Amazon Resource Name (ARN) that uniquely identifies a cluster
+-- operation.
+--
+-- 'clusterArn', 'cluster_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'clusterName', 'cluster_clusterName' - The name of the cluster.
+--
+-- 'clusterType', 'cluster_clusterType' - Cluster Type.
+--
+-- 'creationTime', 'cluster_creationTime' - The time when the cluster was created.
+--
+-- 'currentVersion', 'cluster_currentVersion' - The current version of the MSK cluster.
+--
+-- 'provisioned', 'cluster_provisioned' - Information about the provisioned cluster.
+--
+-- 'serverless', 'cluster_serverless' - Information about the serverless cluster.
+--
+-- 'state', 'cluster_state' - The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+--
+-- 'stateInfo', 'cluster_stateInfo' - State Info for the Amazon MSK cluster.
+--
+-- 'tags', 'cluster_tags' - Tags attached to the cluster.
+newCluster ::
+  Cluster
+newCluster =
+  Cluster'
+    { activeOperationArn = Prelude.Nothing,
+      clusterArn = Prelude.Nothing,
+      clusterName = Prelude.Nothing,
+      clusterType = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      currentVersion = Prelude.Nothing,
+      provisioned = Prelude.Nothing,
+      serverless = Prelude.Nothing,
+      state = Prelude.Nothing,
+      stateInfo = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies a cluster
+-- operation.
+cluster_activeOperationArn :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_activeOperationArn = Lens.lens (\Cluster' {activeOperationArn} -> activeOperationArn) (\s@Cluster' {} a -> s {activeOperationArn = a} :: Cluster)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+cluster_clusterArn :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_clusterArn = Lens.lens (\Cluster' {clusterArn} -> clusterArn) (\s@Cluster' {} a -> s {clusterArn = a} :: Cluster)
+
+-- | The name of the cluster.
+cluster_clusterName :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_clusterName = Lens.lens (\Cluster' {clusterName} -> clusterName) (\s@Cluster' {} a -> s {clusterName = a} :: Cluster)
+
+-- | Cluster Type.
+cluster_clusterType :: Lens.Lens' Cluster (Prelude.Maybe ClusterType)
+cluster_clusterType = Lens.lens (\Cluster' {clusterType} -> clusterType) (\s@Cluster' {} a -> s {clusterType = a} :: Cluster)
+
+-- | The time when the cluster was created.
+cluster_creationTime :: Lens.Lens' Cluster (Prelude.Maybe Prelude.UTCTime)
+cluster_creationTime = Lens.lens (\Cluster' {creationTime} -> creationTime) (\s@Cluster' {} a -> s {creationTime = a} :: Cluster) Prelude.. Lens.mapping Data._Time
+
+-- | The current version of the MSK cluster.
+cluster_currentVersion :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_currentVersion = Lens.lens (\Cluster' {currentVersion} -> currentVersion) (\s@Cluster' {} a -> s {currentVersion = a} :: Cluster)
+
+-- | Information about the provisioned cluster.
+cluster_provisioned :: Lens.Lens' Cluster (Prelude.Maybe Provisioned)
+cluster_provisioned = Lens.lens (\Cluster' {provisioned} -> provisioned) (\s@Cluster' {} a -> s {provisioned = a} :: Cluster)
+
+-- | Information about the serverless cluster.
+cluster_serverless :: Lens.Lens' Cluster (Prelude.Maybe Serverless)
+cluster_serverless = Lens.lens (\Cluster' {serverless} -> serverless) (\s@Cluster' {} a -> s {serverless = a} :: Cluster)
+
+-- | The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+cluster_state :: Lens.Lens' Cluster (Prelude.Maybe ClusterState)
+cluster_state = Lens.lens (\Cluster' {state} -> state) (\s@Cluster' {} a -> s {state = a} :: Cluster)
+
+-- | State Info for the Amazon MSK cluster.
+cluster_stateInfo :: Lens.Lens' Cluster (Prelude.Maybe StateInfo)
+cluster_stateInfo = Lens.lens (\Cluster' {stateInfo} -> stateInfo) (\s@Cluster' {} a -> s {stateInfo = a} :: Cluster)
+
+-- | Tags attached to the cluster.
+cluster_tags :: Lens.Lens' Cluster (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+cluster_tags = Lens.lens (\Cluster' {tags} -> tags) (\s@Cluster' {} a -> s {tags = a} :: Cluster) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Cluster where
+  parseJSON =
+    Data.withObject
+      "Cluster"
+      ( \x ->
+          Cluster'
+            Prelude.<$> (x Data..:? "activeOperationArn")
+            Prelude.<*> (x Data..:? "clusterArn")
+            Prelude.<*> (x Data..:? "clusterName")
+            Prelude.<*> (x Data..:? "clusterType")
+            Prelude.<*> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "currentVersion")
+            Prelude.<*> (x Data..:? "provisioned")
+            Prelude.<*> (x Data..:? "serverless")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "stateInfo")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Cluster where
+  hashWithSalt _salt Cluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` activeOperationArn
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` clusterType
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` provisioned
+      `Prelude.hashWithSalt` serverless
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` stateInfo
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData Cluster where
+  rnf Cluster' {..} =
+    Prelude.rnf activeOperationArn
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf clusterType
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf provisioned
+      `Prelude.seq` Prelude.rnf serverless
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf stateInfo
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/Kafka/Types/ClusterInfo.hs b/gen/Amazonka/Kafka/Types/ClusterInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClusterInfo.hs
@@ -0,0 +1,318 @@
+{-# 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.Kafka.Types.ClusterInfo
+-- 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.Kafka.Types.ClusterInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerNodeGroupInfo
+import Amazonka.Kafka.Types.BrokerSoftwareInfo
+import Amazonka.Kafka.Types.ClientAuthentication
+import Amazonka.Kafka.Types.ClusterState
+import Amazonka.Kafka.Types.EncryptionInfo
+import Amazonka.Kafka.Types.EnhancedMonitoring
+import Amazonka.Kafka.Types.LoggingInfo
+import Amazonka.Kafka.Types.OpenMonitoring
+import Amazonka.Kafka.Types.StateInfo
+import Amazonka.Kafka.Types.StorageMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Returns information about a cluster.
+--
+-- /See:/ 'newClusterInfo' smart constructor.
+data ClusterInfo = ClusterInfo'
+  { -- | Arn of active cluster operation.
+    activeOperationArn :: Prelude.Maybe Prelude.Text,
+    -- | Information about the broker nodes.
+    brokerNodeGroupInfo :: Prelude.Maybe BrokerNodeGroupInfo,
+    -- | Includes all client authentication information.
+    clientAuthentication :: Prelude.Maybe ClientAuthentication,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the cluster.
+    clusterName :: Prelude.Maybe Prelude.Text,
+    -- | The time when the cluster was created.
+    creationTime :: Prelude.Maybe Data.ISO8601,
+    -- | Information about the version of software currently deployed on the
+    -- Apache Kafka brokers in the cluster.
+    currentBrokerSoftwareInfo :: Prelude.Maybe BrokerSoftwareInfo,
+    -- | The current version of the MSK cluster.
+    currentVersion :: Prelude.Maybe Prelude.Text,
+    -- | Includes all encryption-related information.
+    encryptionInfo :: Prelude.Maybe EncryptionInfo,
+    -- | Specifies which metrics are gathered for the MSK cluster. This property
+    -- has the following possible values: DEFAULT, PER_BROKER,
+    -- PER_TOPIC_PER_BROKER, and PER_TOPIC_PER_PARTITION. For a list of the
+    -- metrics associated with each of these levels of monitoring, see
+    -- <https://docs.aws.amazon.com/msk/latest/developerguide/monitoring.html Monitoring>.
+    enhancedMonitoring :: Prelude.Maybe EnhancedMonitoring,
+    loggingInfo :: Prelude.Maybe LoggingInfo,
+    -- | The number of broker nodes in the cluster.
+    numberOfBrokerNodes :: Prelude.Maybe Prelude.Int,
+    -- | Settings for open monitoring using Prometheus.
+    openMonitoring :: Prelude.Maybe OpenMonitoring,
+    -- | The state of the cluster. The possible states are ACTIVE, CREATING,
+    -- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+    state :: Prelude.Maybe ClusterState,
+    stateInfo :: Prelude.Maybe StateInfo,
+    -- | This controls storage mode for supported storage tiers.
+    storageMode :: Prelude.Maybe StorageMode,
+    -- | Tags attached to the cluster.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The connection string to use to connect to the Apache ZooKeeper cluster.
+    zookeeperConnectString :: Prelude.Maybe Prelude.Text,
+    -- | The connection string to use to connect to zookeeper cluster on Tls
+    -- port.
+    zookeeperConnectStringTls :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'activeOperationArn', 'clusterInfo_activeOperationArn' - Arn of active cluster operation.
+--
+-- 'brokerNodeGroupInfo', 'clusterInfo_brokerNodeGroupInfo' - Information about the broker nodes.
+--
+-- 'clientAuthentication', 'clusterInfo_clientAuthentication' - Includes all client authentication information.
+--
+-- 'clusterArn', 'clusterInfo_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'clusterName', 'clusterInfo_clusterName' - The name of the cluster.
+--
+-- 'creationTime', 'clusterInfo_creationTime' - The time when the cluster was created.
+--
+-- 'currentBrokerSoftwareInfo', 'clusterInfo_currentBrokerSoftwareInfo' - Information about the version of software currently deployed on the
+-- Apache Kafka brokers in the cluster.
+--
+-- 'currentVersion', 'clusterInfo_currentVersion' - The current version of the MSK cluster.
+--
+-- 'encryptionInfo', 'clusterInfo_encryptionInfo' - Includes all encryption-related information.
+--
+-- 'enhancedMonitoring', 'clusterInfo_enhancedMonitoring' - Specifies which metrics are gathered for the MSK cluster. This property
+-- has the following possible values: DEFAULT, PER_BROKER,
+-- PER_TOPIC_PER_BROKER, and PER_TOPIC_PER_PARTITION. For a list of the
+-- metrics associated with each of these levels of monitoring, see
+-- <https://docs.aws.amazon.com/msk/latest/developerguide/monitoring.html Monitoring>.
+--
+-- 'loggingInfo', 'clusterInfo_loggingInfo' - Undocumented member.
+--
+-- 'numberOfBrokerNodes', 'clusterInfo_numberOfBrokerNodes' - The number of broker nodes in the cluster.
+--
+-- 'openMonitoring', 'clusterInfo_openMonitoring' - Settings for open monitoring using Prometheus.
+--
+-- 'state', 'clusterInfo_state' - The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+--
+-- 'stateInfo', 'clusterInfo_stateInfo' - Undocumented member.
+--
+-- 'storageMode', 'clusterInfo_storageMode' - This controls storage mode for supported storage tiers.
+--
+-- 'tags', 'clusterInfo_tags' - Tags attached to the cluster.
+--
+-- 'zookeeperConnectString', 'clusterInfo_zookeeperConnectString' - The connection string to use to connect to the Apache ZooKeeper cluster.
+--
+-- 'zookeeperConnectStringTls', 'clusterInfo_zookeeperConnectStringTls' - The connection string to use to connect to zookeeper cluster on Tls
+-- port.
+newClusterInfo ::
+  ClusterInfo
+newClusterInfo =
+  ClusterInfo'
+    { activeOperationArn = Prelude.Nothing,
+      brokerNodeGroupInfo = Prelude.Nothing,
+      clientAuthentication = Prelude.Nothing,
+      clusterArn = Prelude.Nothing,
+      clusterName = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      currentBrokerSoftwareInfo = Prelude.Nothing,
+      currentVersion = Prelude.Nothing,
+      encryptionInfo = Prelude.Nothing,
+      enhancedMonitoring = Prelude.Nothing,
+      loggingInfo = Prelude.Nothing,
+      numberOfBrokerNodes = Prelude.Nothing,
+      openMonitoring = Prelude.Nothing,
+      state = Prelude.Nothing,
+      stateInfo = Prelude.Nothing,
+      storageMode = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      zookeeperConnectString = Prelude.Nothing,
+      zookeeperConnectStringTls = Prelude.Nothing
+    }
+
+-- | Arn of active cluster operation.
+clusterInfo_activeOperationArn :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Text)
+clusterInfo_activeOperationArn = Lens.lens (\ClusterInfo' {activeOperationArn} -> activeOperationArn) (\s@ClusterInfo' {} a -> s {activeOperationArn = a} :: ClusterInfo)
+
+-- | Information about the broker nodes.
+clusterInfo_brokerNodeGroupInfo :: Lens.Lens' ClusterInfo (Prelude.Maybe BrokerNodeGroupInfo)
+clusterInfo_brokerNodeGroupInfo = Lens.lens (\ClusterInfo' {brokerNodeGroupInfo} -> brokerNodeGroupInfo) (\s@ClusterInfo' {} a -> s {brokerNodeGroupInfo = a} :: ClusterInfo)
+
+-- | Includes all client authentication information.
+clusterInfo_clientAuthentication :: Lens.Lens' ClusterInfo (Prelude.Maybe ClientAuthentication)
+clusterInfo_clientAuthentication = Lens.lens (\ClusterInfo' {clientAuthentication} -> clientAuthentication) (\s@ClusterInfo' {} a -> s {clientAuthentication = a} :: ClusterInfo)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+clusterInfo_clusterArn :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Text)
+clusterInfo_clusterArn = Lens.lens (\ClusterInfo' {clusterArn} -> clusterArn) (\s@ClusterInfo' {} a -> s {clusterArn = a} :: ClusterInfo)
+
+-- | The name of the cluster.
+clusterInfo_clusterName :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Text)
+clusterInfo_clusterName = Lens.lens (\ClusterInfo' {clusterName} -> clusterName) (\s@ClusterInfo' {} a -> s {clusterName = a} :: ClusterInfo)
+
+-- | The time when the cluster was created.
+clusterInfo_creationTime :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.UTCTime)
+clusterInfo_creationTime = Lens.lens (\ClusterInfo' {creationTime} -> creationTime) (\s@ClusterInfo' {} a -> s {creationTime = a} :: ClusterInfo) Prelude.. Lens.mapping Data._Time
+
+-- | Information about the version of software currently deployed on the
+-- Apache Kafka brokers in the cluster.
+clusterInfo_currentBrokerSoftwareInfo :: Lens.Lens' ClusterInfo (Prelude.Maybe BrokerSoftwareInfo)
+clusterInfo_currentBrokerSoftwareInfo = Lens.lens (\ClusterInfo' {currentBrokerSoftwareInfo} -> currentBrokerSoftwareInfo) (\s@ClusterInfo' {} a -> s {currentBrokerSoftwareInfo = a} :: ClusterInfo)
+
+-- | The current version of the MSK cluster.
+clusterInfo_currentVersion :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Text)
+clusterInfo_currentVersion = Lens.lens (\ClusterInfo' {currentVersion} -> currentVersion) (\s@ClusterInfo' {} a -> s {currentVersion = a} :: ClusterInfo)
+
+-- | Includes all encryption-related information.
+clusterInfo_encryptionInfo :: Lens.Lens' ClusterInfo (Prelude.Maybe EncryptionInfo)
+clusterInfo_encryptionInfo = Lens.lens (\ClusterInfo' {encryptionInfo} -> encryptionInfo) (\s@ClusterInfo' {} a -> s {encryptionInfo = a} :: ClusterInfo)
+
+-- | Specifies which metrics are gathered for the MSK cluster. This property
+-- has the following possible values: DEFAULT, PER_BROKER,
+-- PER_TOPIC_PER_BROKER, and PER_TOPIC_PER_PARTITION. For a list of the
+-- metrics associated with each of these levels of monitoring, see
+-- <https://docs.aws.amazon.com/msk/latest/developerguide/monitoring.html Monitoring>.
+clusterInfo_enhancedMonitoring :: Lens.Lens' ClusterInfo (Prelude.Maybe EnhancedMonitoring)
+clusterInfo_enhancedMonitoring = Lens.lens (\ClusterInfo' {enhancedMonitoring} -> enhancedMonitoring) (\s@ClusterInfo' {} a -> s {enhancedMonitoring = a} :: ClusterInfo)
+
+-- | Undocumented member.
+clusterInfo_loggingInfo :: Lens.Lens' ClusterInfo (Prelude.Maybe LoggingInfo)
+clusterInfo_loggingInfo = Lens.lens (\ClusterInfo' {loggingInfo} -> loggingInfo) (\s@ClusterInfo' {} a -> s {loggingInfo = a} :: ClusterInfo)
+
+-- | The number of broker nodes in the cluster.
+clusterInfo_numberOfBrokerNodes :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Int)
+clusterInfo_numberOfBrokerNodes = Lens.lens (\ClusterInfo' {numberOfBrokerNodes} -> numberOfBrokerNodes) (\s@ClusterInfo' {} a -> s {numberOfBrokerNodes = a} :: ClusterInfo)
+
+-- | Settings for open monitoring using Prometheus.
+clusterInfo_openMonitoring :: Lens.Lens' ClusterInfo (Prelude.Maybe OpenMonitoring)
+clusterInfo_openMonitoring = Lens.lens (\ClusterInfo' {openMonitoring} -> openMonitoring) (\s@ClusterInfo' {} a -> s {openMonitoring = a} :: ClusterInfo)
+
+-- | The state of the cluster. The possible states are ACTIVE, CREATING,
+-- DELETING, FAILED, HEALING, MAINTENANCE, REBOOTING_BROKER, and UPDATING.
+clusterInfo_state :: Lens.Lens' ClusterInfo (Prelude.Maybe ClusterState)
+clusterInfo_state = Lens.lens (\ClusterInfo' {state} -> state) (\s@ClusterInfo' {} a -> s {state = a} :: ClusterInfo)
+
+-- | Undocumented member.
+clusterInfo_stateInfo :: Lens.Lens' ClusterInfo (Prelude.Maybe StateInfo)
+clusterInfo_stateInfo = Lens.lens (\ClusterInfo' {stateInfo} -> stateInfo) (\s@ClusterInfo' {} a -> s {stateInfo = a} :: ClusterInfo)
+
+-- | This controls storage mode for supported storage tiers.
+clusterInfo_storageMode :: Lens.Lens' ClusterInfo (Prelude.Maybe StorageMode)
+clusterInfo_storageMode = Lens.lens (\ClusterInfo' {storageMode} -> storageMode) (\s@ClusterInfo' {} a -> s {storageMode = a} :: ClusterInfo)
+
+-- | Tags attached to the cluster.
+clusterInfo_tags :: Lens.Lens' ClusterInfo (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+clusterInfo_tags = Lens.lens (\ClusterInfo' {tags} -> tags) (\s@ClusterInfo' {} a -> s {tags = a} :: ClusterInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | The connection string to use to connect to the Apache ZooKeeper cluster.
+clusterInfo_zookeeperConnectString :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Text)
+clusterInfo_zookeeperConnectString = Lens.lens (\ClusterInfo' {zookeeperConnectString} -> zookeeperConnectString) (\s@ClusterInfo' {} a -> s {zookeeperConnectString = a} :: ClusterInfo)
+
+-- | The connection string to use to connect to zookeeper cluster on Tls
+-- port.
+clusterInfo_zookeeperConnectStringTls :: Lens.Lens' ClusterInfo (Prelude.Maybe Prelude.Text)
+clusterInfo_zookeeperConnectStringTls = Lens.lens (\ClusterInfo' {zookeeperConnectStringTls} -> zookeeperConnectStringTls) (\s@ClusterInfo' {} a -> s {zookeeperConnectStringTls = a} :: ClusterInfo)
+
+instance Data.FromJSON ClusterInfo where
+  parseJSON =
+    Data.withObject
+      "ClusterInfo"
+      ( \x ->
+          ClusterInfo'
+            Prelude.<$> (x Data..:? "activeOperationArn")
+            Prelude.<*> (x Data..:? "brokerNodeGroupInfo")
+            Prelude.<*> (x Data..:? "clientAuthentication")
+            Prelude.<*> (x Data..:? "clusterArn")
+            Prelude.<*> (x Data..:? "clusterName")
+            Prelude.<*> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "currentBrokerSoftwareInfo")
+            Prelude.<*> (x Data..:? "currentVersion")
+            Prelude.<*> (x Data..:? "encryptionInfo")
+            Prelude.<*> (x Data..:? "enhancedMonitoring")
+            Prelude.<*> (x Data..:? "loggingInfo")
+            Prelude.<*> (x Data..:? "numberOfBrokerNodes")
+            Prelude.<*> (x Data..:? "openMonitoring")
+            Prelude.<*> (x Data..:? "state")
+            Prelude.<*> (x Data..:? "stateInfo")
+            Prelude.<*> (x Data..:? "storageMode")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "zookeeperConnectString")
+            Prelude.<*> (x Data..:? "zookeeperConnectStringTls")
+      )
+
+instance Prelude.Hashable ClusterInfo where
+  hashWithSalt _salt ClusterInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` activeOperationArn
+      `Prelude.hashWithSalt` brokerNodeGroupInfo
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` clusterName
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` currentBrokerSoftwareInfo
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` encryptionInfo
+      `Prelude.hashWithSalt` enhancedMonitoring
+      `Prelude.hashWithSalt` loggingInfo
+      `Prelude.hashWithSalt` numberOfBrokerNodes
+      `Prelude.hashWithSalt` openMonitoring
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` stateInfo
+      `Prelude.hashWithSalt` storageMode
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` zookeeperConnectString
+      `Prelude.hashWithSalt` zookeeperConnectStringTls
+
+instance Prelude.NFData ClusterInfo where
+  rnf ClusterInfo' {..} =
+    Prelude.rnf activeOperationArn
+      `Prelude.seq` Prelude.rnf brokerNodeGroupInfo
+      `Prelude.seq` Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterName
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf currentBrokerSoftwareInfo
+      `Prelude.seq` Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf encryptionInfo
+      `Prelude.seq` Prelude.rnf enhancedMonitoring
+      `Prelude.seq` Prelude.rnf loggingInfo
+      `Prelude.seq` Prelude.rnf numberOfBrokerNodes
+      `Prelude.seq` Prelude.rnf openMonitoring
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf stateInfo
+      `Prelude.seq` Prelude.rnf storageMode
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf zookeeperConnectString
+      `Prelude.seq` Prelude.rnf
+        zookeeperConnectStringTls
diff --git a/gen/Amazonka/Kafka/Types/ClusterOperationInfo.hs b/gen/Amazonka/Kafka/Types/ClusterOperationInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClusterOperationInfo.hs
@@ -0,0 +1,196 @@
+{-# 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.Kafka.Types.ClusterOperationInfo
+-- 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.Kafka.Types.ClusterOperationInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ClusterOperationStep
+import Amazonka.Kafka.Types.ErrorInfo
+import Amazonka.Kafka.Types.MutableClusterInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Returns information about a cluster operation.
+--
+-- /See:/ 'newClusterOperationInfo' smart constructor.
+data ClusterOperationInfo = ClusterOperationInfo'
+  { -- | The ID of the API request that triggered this operation.
+    clientRequestId :: Prelude.Maybe Prelude.Text,
+    -- | ARN of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The time that the operation was created.
+    creationTime :: Prelude.Maybe Data.ISO8601,
+    -- | The time at which the operation finished.
+    endTime :: Prelude.Maybe Data.ISO8601,
+    -- | Describes the error if the operation fails.
+    errorInfo :: Prelude.Maybe ErrorInfo,
+    -- | ARN of the cluster operation.
+    operationArn :: Prelude.Maybe Prelude.Text,
+    -- | State of the cluster operation.
+    operationState :: Prelude.Maybe Prelude.Text,
+    -- | Steps completed during the operation.
+    operationSteps :: Prelude.Maybe [ClusterOperationStep],
+    -- | Type of the cluster operation.
+    operationType :: Prelude.Maybe Prelude.Text,
+    -- | Information about cluster attributes before a cluster is updated.
+    sourceClusterInfo :: Prelude.Maybe MutableClusterInfo,
+    -- | Information about cluster attributes after a cluster is updated.
+    targetClusterInfo :: Prelude.Maybe MutableClusterInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterOperationInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientRequestId', 'clusterOperationInfo_clientRequestId' - The ID of the API request that triggered this operation.
+--
+-- 'clusterArn', 'clusterOperationInfo_clusterArn' - ARN of the cluster.
+--
+-- 'creationTime', 'clusterOperationInfo_creationTime' - The time that the operation was created.
+--
+-- 'endTime', 'clusterOperationInfo_endTime' - The time at which the operation finished.
+--
+-- 'errorInfo', 'clusterOperationInfo_errorInfo' - Describes the error if the operation fails.
+--
+-- 'operationArn', 'clusterOperationInfo_operationArn' - ARN of the cluster operation.
+--
+-- 'operationState', 'clusterOperationInfo_operationState' - State of the cluster operation.
+--
+-- 'operationSteps', 'clusterOperationInfo_operationSteps' - Steps completed during the operation.
+--
+-- 'operationType', 'clusterOperationInfo_operationType' - Type of the cluster operation.
+--
+-- 'sourceClusterInfo', 'clusterOperationInfo_sourceClusterInfo' - Information about cluster attributes before a cluster is updated.
+--
+-- 'targetClusterInfo', 'clusterOperationInfo_targetClusterInfo' - Information about cluster attributes after a cluster is updated.
+newClusterOperationInfo ::
+  ClusterOperationInfo
+newClusterOperationInfo =
+  ClusterOperationInfo'
+    { clientRequestId =
+        Prelude.Nothing,
+      clusterArn = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      errorInfo = Prelude.Nothing,
+      operationArn = Prelude.Nothing,
+      operationState = Prelude.Nothing,
+      operationSteps = Prelude.Nothing,
+      operationType = Prelude.Nothing,
+      sourceClusterInfo = Prelude.Nothing,
+      targetClusterInfo = Prelude.Nothing
+    }
+
+-- | The ID of the API request that triggered this operation.
+clusterOperationInfo_clientRequestId :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.Text)
+clusterOperationInfo_clientRequestId = Lens.lens (\ClusterOperationInfo' {clientRequestId} -> clientRequestId) (\s@ClusterOperationInfo' {} a -> s {clientRequestId = a} :: ClusterOperationInfo)
+
+-- | ARN of the cluster.
+clusterOperationInfo_clusterArn :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.Text)
+clusterOperationInfo_clusterArn = Lens.lens (\ClusterOperationInfo' {clusterArn} -> clusterArn) (\s@ClusterOperationInfo' {} a -> s {clusterArn = a} :: ClusterOperationInfo)
+
+-- | The time that the operation was created.
+clusterOperationInfo_creationTime :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.UTCTime)
+clusterOperationInfo_creationTime = Lens.lens (\ClusterOperationInfo' {creationTime} -> creationTime) (\s@ClusterOperationInfo' {} a -> s {creationTime = a} :: ClusterOperationInfo) Prelude.. Lens.mapping Data._Time
+
+-- | The time at which the operation finished.
+clusterOperationInfo_endTime :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.UTCTime)
+clusterOperationInfo_endTime = Lens.lens (\ClusterOperationInfo' {endTime} -> endTime) (\s@ClusterOperationInfo' {} a -> s {endTime = a} :: ClusterOperationInfo) Prelude.. Lens.mapping Data._Time
+
+-- | Describes the error if the operation fails.
+clusterOperationInfo_errorInfo :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe ErrorInfo)
+clusterOperationInfo_errorInfo = Lens.lens (\ClusterOperationInfo' {errorInfo} -> errorInfo) (\s@ClusterOperationInfo' {} a -> s {errorInfo = a} :: ClusterOperationInfo)
+
+-- | ARN of the cluster operation.
+clusterOperationInfo_operationArn :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.Text)
+clusterOperationInfo_operationArn = Lens.lens (\ClusterOperationInfo' {operationArn} -> operationArn) (\s@ClusterOperationInfo' {} a -> s {operationArn = a} :: ClusterOperationInfo)
+
+-- | State of the cluster operation.
+clusterOperationInfo_operationState :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.Text)
+clusterOperationInfo_operationState = Lens.lens (\ClusterOperationInfo' {operationState} -> operationState) (\s@ClusterOperationInfo' {} a -> s {operationState = a} :: ClusterOperationInfo)
+
+-- | Steps completed during the operation.
+clusterOperationInfo_operationSteps :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe [ClusterOperationStep])
+clusterOperationInfo_operationSteps = Lens.lens (\ClusterOperationInfo' {operationSteps} -> operationSteps) (\s@ClusterOperationInfo' {} a -> s {operationSteps = a} :: ClusterOperationInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | Type of the cluster operation.
+clusterOperationInfo_operationType :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe Prelude.Text)
+clusterOperationInfo_operationType = Lens.lens (\ClusterOperationInfo' {operationType} -> operationType) (\s@ClusterOperationInfo' {} a -> s {operationType = a} :: ClusterOperationInfo)
+
+-- | Information about cluster attributes before a cluster is updated.
+clusterOperationInfo_sourceClusterInfo :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe MutableClusterInfo)
+clusterOperationInfo_sourceClusterInfo = Lens.lens (\ClusterOperationInfo' {sourceClusterInfo} -> sourceClusterInfo) (\s@ClusterOperationInfo' {} a -> s {sourceClusterInfo = a} :: ClusterOperationInfo)
+
+-- | Information about cluster attributes after a cluster is updated.
+clusterOperationInfo_targetClusterInfo :: Lens.Lens' ClusterOperationInfo (Prelude.Maybe MutableClusterInfo)
+clusterOperationInfo_targetClusterInfo = Lens.lens (\ClusterOperationInfo' {targetClusterInfo} -> targetClusterInfo) (\s@ClusterOperationInfo' {} a -> s {targetClusterInfo = a} :: ClusterOperationInfo)
+
+instance Data.FromJSON ClusterOperationInfo where
+  parseJSON =
+    Data.withObject
+      "ClusterOperationInfo"
+      ( \x ->
+          ClusterOperationInfo'
+            Prelude.<$> (x Data..:? "clientRequestId")
+            Prelude.<*> (x Data..:? "clusterArn")
+            Prelude.<*> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "errorInfo")
+            Prelude.<*> (x Data..:? "operationArn")
+            Prelude.<*> (x Data..:? "operationState")
+            Prelude.<*> (x Data..:? "operationSteps" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "operationType")
+            Prelude.<*> (x Data..:? "sourceClusterInfo")
+            Prelude.<*> (x Data..:? "targetClusterInfo")
+      )
+
+instance Prelude.Hashable ClusterOperationInfo where
+  hashWithSalt _salt ClusterOperationInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientRequestId
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` errorInfo
+      `Prelude.hashWithSalt` operationArn
+      `Prelude.hashWithSalt` operationState
+      `Prelude.hashWithSalt` operationSteps
+      `Prelude.hashWithSalt` operationType
+      `Prelude.hashWithSalt` sourceClusterInfo
+      `Prelude.hashWithSalt` targetClusterInfo
+
+instance Prelude.NFData ClusterOperationInfo where
+  rnf ClusterOperationInfo' {..} =
+    Prelude.rnf clientRequestId
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf operationArn
+      `Prelude.seq` Prelude.rnf operationState
+      `Prelude.seq` Prelude.rnf operationSteps
+      `Prelude.seq` Prelude.rnf operationType
+      `Prelude.seq` Prelude.rnf sourceClusterInfo
+      `Prelude.seq` Prelude.rnf targetClusterInfo
diff --git a/gen/Amazonka/Kafka/Types/ClusterOperationStep.hs b/gen/Amazonka/Kafka/Types/ClusterOperationStep.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClusterOperationStep.hs
@@ -0,0 +1,85 @@
+{-# 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.Kafka.Types.ClusterOperationStep
+-- 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.Kafka.Types.ClusterOperationStep where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ClusterOperationStepInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Step taken during a cluster operation.
+--
+-- /See:/ 'newClusterOperationStep' smart constructor.
+data ClusterOperationStep = ClusterOperationStep'
+  { -- | Information about the step and its status.
+    stepInfo :: Prelude.Maybe ClusterOperationStepInfo,
+    -- | The name of the step.
+    stepName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterOperationStep' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'stepInfo', 'clusterOperationStep_stepInfo' - Information about the step and its status.
+--
+-- 'stepName', 'clusterOperationStep_stepName' - The name of the step.
+newClusterOperationStep ::
+  ClusterOperationStep
+newClusterOperationStep =
+  ClusterOperationStep'
+    { stepInfo = Prelude.Nothing,
+      stepName = Prelude.Nothing
+    }
+
+-- | Information about the step and its status.
+clusterOperationStep_stepInfo :: Lens.Lens' ClusterOperationStep (Prelude.Maybe ClusterOperationStepInfo)
+clusterOperationStep_stepInfo = Lens.lens (\ClusterOperationStep' {stepInfo} -> stepInfo) (\s@ClusterOperationStep' {} a -> s {stepInfo = a} :: ClusterOperationStep)
+
+-- | The name of the step.
+clusterOperationStep_stepName :: Lens.Lens' ClusterOperationStep (Prelude.Maybe Prelude.Text)
+clusterOperationStep_stepName = Lens.lens (\ClusterOperationStep' {stepName} -> stepName) (\s@ClusterOperationStep' {} a -> s {stepName = a} :: ClusterOperationStep)
+
+instance Data.FromJSON ClusterOperationStep where
+  parseJSON =
+    Data.withObject
+      "ClusterOperationStep"
+      ( \x ->
+          ClusterOperationStep'
+            Prelude.<$> (x Data..:? "stepInfo")
+            Prelude.<*> (x Data..:? "stepName")
+      )
+
+instance Prelude.Hashable ClusterOperationStep where
+  hashWithSalt _salt ClusterOperationStep' {..} =
+    _salt
+      `Prelude.hashWithSalt` stepInfo
+      `Prelude.hashWithSalt` stepName
+
+instance Prelude.NFData ClusterOperationStep where
+  rnf ClusterOperationStep' {..} =
+    Prelude.rnf stepInfo
+      `Prelude.seq` Prelude.rnf stepName
diff --git a/gen/Amazonka/Kafka/Types/ClusterOperationStepInfo.hs b/gen/Amazonka/Kafka/Types/ClusterOperationStepInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClusterOperationStepInfo.hs
@@ -0,0 +1,72 @@
+{-# 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.Kafka.Types.ClusterOperationStepInfo
+-- 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.Kafka.Types.ClusterOperationStepInfo 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
+
+-- | State information about the operation step.
+--
+-- /See:/ 'newClusterOperationStepInfo' smart constructor.
+data ClusterOperationStepInfo = ClusterOperationStepInfo'
+  { -- | The steps current status.
+    stepStatus :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterOperationStepInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'stepStatus', 'clusterOperationStepInfo_stepStatus' - The steps current status.
+newClusterOperationStepInfo ::
+  ClusterOperationStepInfo
+newClusterOperationStepInfo =
+  ClusterOperationStepInfo'
+    { stepStatus =
+        Prelude.Nothing
+    }
+
+-- | The steps current status.
+clusterOperationStepInfo_stepStatus :: Lens.Lens' ClusterOperationStepInfo (Prelude.Maybe Prelude.Text)
+clusterOperationStepInfo_stepStatus = Lens.lens (\ClusterOperationStepInfo' {stepStatus} -> stepStatus) (\s@ClusterOperationStepInfo' {} a -> s {stepStatus = a} :: ClusterOperationStepInfo)
+
+instance Data.FromJSON ClusterOperationStepInfo where
+  parseJSON =
+    Data.withObject
+      "ClusterOperationStepInfo"
+      ( \x ->
+          ClusterOperationStepInfo'
+            Prelude.<$> (x Data..:? "stepStatus")
+      )
+
+instance Prelude.Hashable ClusterOperationStepInfo where
+  hashWithSalt _salt ClusterOperationStepInfo' {..} =
+    _salt `Prelude.hashWithSalt` stepStatus
+
+instance Prelude.NFData ClusterOperationStepInfo where
+  rnf ClusterOperationStepInfo' {..} =
+    Prelude.rnf stepStatus
diff --git a/gen/Amazonka/Kafka/Types/ClusterState.hs b/gen/Amazonka/Kafka/Types/ClusterState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClusterState.hs
@@ -0,0 +1,102 @@
+{-# 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.Kafka.Types.ClusterState
+-- 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.Kafka.Types.ClusterState
+  ( ClusterState
+      ( ..,
+        ClusterState_ACTIVE,
+        ClusterState_CREATING,
+        ClusterState_DELETING,
+        ClusterState_FAILED,
+        ClusterState_HEALING,
+        ClusterState_MAINTENANCE,
+        ClusterState_REBOOTING_BROKER,
+        ClusterState_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The state of the Apache Kafka cluster.
+newtype ClusterState = ClusterState'
+  { fromClusterState ::
+      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 ClusterState_ACTIVE :: ClusterState
+pattern ClusterState_ACTIVE = ClusterState' "ACTIVE"
+
+pattern ClusterState_CREATING :: ClusterState
+pattern ClusterState_CREATING = ClusterState' "CREATING"
+
+pattern ClusterState_DELETING :: ClusterState
+pattern ClusterState_DELETING = ClusterState' "DELETING"
+
+pattern ClusterState_FAILED :: ClusterState
+pattern ClusterState_FAILED = ClusterState' "FAILED"
+
+pattern ClusterState_HEALING :: ClusterState
+pattern ClusterState_HEALING = ClusterState' "HEALING"
+
+pattern ClusterState_MAINTENANCE :: ClusterState
+pattern ClusterState_MAINTENANCE = ClusterState' "MAINTENANCE"
+
+pattern ClusterState_REBOOTING_BROKER :: ClusterState
+pattern ClusterState_REBOOTING_BROKER = ClusterState' "REBOOTING_BROKER"
+
+pattern ClusterState_UPDATING :: ClusterState
+pattern ClusterState_UPDATING = ClusterState' "UPDATING"
+
+{-# COMPLETE
+  ClusterState_ACTIVE,
+  ClusterState_CREATING,
+  ClusterState_DELETING,
+  ClusterState_FAILED,
+  ClusterState_HEALING,
+  ClusterState_MAINTENANCE,
+  ClusterState_REBOOTING_BROKER,
+  ClusterState_UPDATING,
+  ClusterState'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/ClusterType.hs b/gen/Amazonka/Kafka/Types/ClusterType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ClusterType.hs
@@ -0,0 +1,72 @@
+{-# 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.Kafka.Types.ClusterType
+-- 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.Kafka.Types.ClusterType
+  ( ClusterType
+      ( ..,
+        ClusterType_PROVISIONED,
+        ClusterType_SERVERLESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The type of cluster.
+newtype ClusterType = ClusterType'
+  { fromClusterType ::
+      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 ClusterType_PROVISIONED :: ClusterType
+pattern ClusterType_PROVISIONED = ClusterType' "PROVISIONED"
+
+pattern ClusterType_SERVERLESS :: ClusterType
+pattern ClusterType_SERVERLESS = ClusterType' "SERVERLESS"
+
+{-# COMPLETE
+  ClusterType_PROVISIONED,
+  ClusterType_SERVERLESS,
+  ClusterType'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/CompatibleKafkaVersion.hs b/gen/Amazonka/Kafka/Types/CompatibleKafkaVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/CompatibleKafkaVersion.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.CompatibleKafkaVersion
+-- 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.Kafka.Types.CompatibleKafkaVersion 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
+
+-- | Contains source Apache Kafka versions and compatible target Apache Kafka
+-- versions.
+--
+-- /See:/ 'newCompatibleKafkaVersion' smart constructor.
+data CompatibleKafkaVersion = CompatibleKafkaVersion'
+  { -- | An Apache Kafka version.
+    sourceVersion :: Prelude.Maybe Prelude.Text,
+    -- | A list of Apache Kafka versions.
+    targetVersions :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CompatibleKafkaVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'sourceVersion', 'compatibleKafkaVersion_sourceVersion' - An Apache Kafka version.
+--
+-- 'targetVersions', 'compatibleKafkaVersion_targetVersions' - A list of Apache Kafka versions.
+newCompatibleKafkaVersion ::
+  CompatibleKafkaVersion
+newCompatibleKafkaVersion =
+  CompatibleKafkaVersion'
+    { sourceVersion =
+        Prelude.Nothing,
+      targetVersions = Prelude.Nothing
+    }
+
+-- | An Apache Kafka version.
+compatibleKafkaVersion_sourceVersion :: Lens.Lens' CompatibleKafkaVersion (Prelude.Maybe Prelude.Text)
+compatibleKafkaVersion_sourceVersion = Lens.lens (\CompatibleKafkaVersion' {sourceVersion} -> sourceVersion) (\s@CompatibleKafkaVersion' {} a -> s {sourceVersion = a} :: CompatibleKafkaVersion)
+
+-- | A list of Apache Kafka versions.
+compatibleKafkaVersion_targetVersions :: Lens.Lens' CompatibleKafkaVersion (Prelude.Maybe [Prelude.Text])
+compatibleKafkaVersion_targetVersions = Lens.lens (\CompatibleKafkaVersion' {targetVersions} -> targetVersions) (\s@CompatibleKafkaVersion' {} a -> s {targetVersions = a} :: CompatibleKafkaVersion) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON CompatibleKafkaVersion where
+  parseJSON =
+    Data.withObject
+      "CompatibleKafkaVersion"
+      ( \x ->
+          CompatibleKafkaVersion'
+            Prelude.<$> (x Data..:? "sourceVersion")
+            Prelude.<*> ( x
+                            Data..:? "targetVersions"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable CompatibleKafkaVersion where
+  hashWithSalt _salt CompatibleKafkaVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` sourceVersion
+      `Prelude.hashWithSalt` targetVersions
+
+instance Prelude.NFData CompatibleKafkaVersion where
+  rnf CompatibleKafkaVersion' {..} =
+    Prelude.rnf sourceVersion
+      `Prelude.seq` Prelude.rnf targetVersions
diff --git a/gen/Amazonka/Kafka/Types/Configuration.hs b/gen/Amazonka/Kafka/Types/Configuration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Configuration.hs
@@ -0,0 +1,176 @@
+{-# 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.Kafka.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.Kafka.Types.Configuration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ConfigurationRevision
+import Amazonka.Kafka.Types.ConfigurationState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents an MSK Configuration.
+--
+-- /See:/ 'newConfiguration' smart constructor.
+data Configuration = Configuration'
+  { -- | The description of the configuration.
+    description :: Prelude.Text,
+    -- | Latest revision of the configuration.
+    latestRevision :: ConfigurationRevision,
+    -- | The time when the configuration was created.
+    creationTime :: Data.ISO8601,
+    -- | An array of the versions of Apache Kafka with which you can use this MSK
+    -- configuration. You can use this configuration for an MSK cluster only if
+    -- the Apache Kafka version specified for the cluster appears in this
+    -- array.
+    kafkaVersions :: [Prelude.Text],
+    -- | The Amazon Resource Name (ARN) of the configuration.
+    arn :: Prelude.Text,
+    -- | The name of the configuration.
+    name :: Prelude.Text,
+    -- | The state of the configuration. The possible states are ACTIVE,
+    -- DELETING, and DELETE_FAILED.
+    state :: ConfigurationState
+  }
+  deriving (Prelude.Eq, Prelude.Read, 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:
+--
+-- 'description', 'configuration_description' - The description of the configuration.
+--
+-- 'latestRevision', 'configuration_latestRevision' - Latest revision of the configuration.
+--
+-- 'creationTime', 'configuration_creationTime' - The time when the configuration was created.
+--
+-- 'kafkaVersions', 'configuration_kafkaVersions' - An array of the versions of Apache Kafka with which you can use this MSK
+-- configuration. You can use this configuration for an MSK cluster only if
+-- the Apache Kafka version specified for the cluster appears in this
+-- array.
+--
+-- 'arn', 'configuration_arn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'name', 'configuration_name' - The name of the configuration.
+--
+-- 'state', 'configuration_state' - The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+newConfiguration ::
+  -- | 'description'
+  Prelude.Text ->
+  -- | 'latestRevision'
+  ConfigurationRevision ->
+  -- | 'creationTime'
+  Prelude.UTCTime ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'state'
+  ConfigurationState ->
+  Configuration
+newConfiguration
+  pDescription_
+  pLatestRevision_
+  pCreationTime_
+  pArn_
+  pName_
+  pState_ =
+    Configuration'
+      { description = pDescription_,
+        latestRevision = pLatestRevision_,
+        creationTime = Data._Time Lens.# pCreationTime_,
+        kafkaVersions = Prelude.mempty,
+        arn = pArn_,
+        name = pName_,
+        state = pState_
+      }
+
+-- | The description of the configuration.
+configuration_description :: Lens.Lens' Configuration Prelude.Text
+configuration_description = Lens.lens (\Configuration' {description} -> description) (\s@Configuration' {} a -> s {description = a} :: Configuration)
+
+-- | Latest revision of the configuration.
+configuration_latestRevision :: Lens.Lens' Configuration ConfigurationRevision
+configuration_latestRevision = Lens.lens (\Configuration' {latestRevision} -> latestRevision) (\s@Configuration' {} a -> s {latestRevision = a} :: Configuration)
+
+-- | The time when the configuration was created.
+configuration_creationTime :: Lens.Lens' Configuration Prelude.UTCTime
+configuration_creationTime = Lens.lens (\Configuration' {creationTime} -> creationTime) (\s@Configuration' {} a -> s {creationTime = a} :: Configuration) Prelude.. Data._Time
+
+-- | An array of the versions of Apache Kafka with which you can use this MSK
+-- configuration. You can use this configuration for an MSK cluster only if
+-- the Apache Kafka version specified for the cluster appears in this
+-- array.
+configuration_kafkaVersions :: Lens.Lens' Configuration [Prelude.Text]
+configuration_kafkaVersions = Lens.lens (\Configuration' {kafkaVersions} -> kafkaVersions) (\s@Configuration' {} a -> s {kafkaVersions = a} :: Configuration) Prelude.. Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+configuration_arn :: Lens.Lens' Configuration Prelude.Text
+configuration_arn = Lens.lens (\Configuration' {arn} -> arn) (\s@Configuration' {} a -> s {arn = a} :: Configuration)
+
+-- | The name of the configuration.
+configuration_name :: Lens.Lens' Configuration Prelude.Text
+configuration_name = Lens.lens (\Configuration' {name} -> name) (\s@Configuration' {} a -> s {name = a} :: Configuration)
+
+-- | The state of the configuration. The possible states are ACTIVE,
+-- DELETING, and DELETE_FAILED.
+configuration_state :: Lens.Lens' Configuration ConfigurationState
+configuration_state = Lens.lens (\Configuration' {state} -> state) (\s@Configuration' {} a -> s {state = a} :: Configuration)
+
+instance Data.FromJSON Configuration where
+  parseJSON =
+    Data.withObject
+      "Configuration"
+      ( \x ->
+          Configuration'
+            Prelude.<$> (x Data..: "description")
+            Prelude.<*> (x Data..: "latestRevision")
+            Prelude.<*> (x Data..: "creationTime")
+            Prelude.<*> (x Data..:? "kafkaVersions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable Configuration where
+  hashWithSalt _salt Configuration' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` latestRevision
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` kafkaVersions
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData Configuration where
+  rnf Configuration' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf latestRevision
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf kafkaVersions
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/Kafka/Types/ConfigurationInfo.hs b/gen/Amazonka/Kafka/Types/ConfigurationInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ConfigurationInfo.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.ConfigurationInfo
+-- 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.Kafka.Types.ConfigurationInfo 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
+
+-- | Specifies the configuration to use for the brokers.
+--
+-- /See:/ 'newConfigurationInfo' smart constructor.
+data ConfigurationInfo = ConfigurationInfo'
+  { -- | The revision of the configuration to use.
+    revision :: Prelude.Integer,
+    -- | ARN of the configuration to use.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'revision', 'configurationInfo_revision' - The revision of the configuration to use.
+--
+-- 'arn', 'configurationInfo_arn' - ARN of the configuration to use.
+newConfigurationInfo ::
+  -- | 'revision'
+  Prelude.Integer ->
+  -- | 'arn'
+  Prelude.Text ->
+  ConfigurationInfo
+newConfigurationInfo pRevision_ pArn_ =
+  ConfigurationInfo'
+    { revision = pRevision_,
+      arn = pArn_
+    }
+
+-- | The revision of the configuration to use.
+configurationInfo_revision :: Lens.Lens' ConfigurationInfo Prelude.Integer
+configurationInfo_revision = Lens.lens (\ConfigurationInfo' {revision} -> revision) (\s@ConfigurationInfo' {} a -> s {revision = a} :: ConfigurationInfo)
+
+-- | ARN of the configuration to use.
+configurationInfo_arn :: Lens.Lens' ConfigurationInfo Prelude.Text
+configurationInfo_arn = Lens.lens (\ConfigurationInfo' {arn} -> arn) (\s@ConfigurationInfo' {} a -> s {arn = a} :: ConfigurationInfo)
+
+instance Data.FromJSON ConfigurationInfo where
+  parseJSON =
+    Data.withObject
+      "ConfigurationInfo"
+      ( \x ->
+          ConfigurationInfo'
+            Prelude.<$> (x Data..: "revision")
+            Prelude.<*> (x Data..: "arn")
+      )
+
+instance Prelude.Hashable ConfigurationInfo where
+  hashWithSalt _salt ConfigurationInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` revision
+      `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData ConfigurationInfo where
+  rnf ConfigurationInfo' {..} =
+    Prelude.rnf revision `Prelude.seq` Prelude.rnf arn
+
+instance Data.ToJSON ConfigurationInfo where
+  toJSON ConfigurationInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("revision" Data..= revision),
+            Prelude.Just ("arn" Data..= arn)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/ConfigurationRevision.hs b/gen/Amazonka/Kafka/Types/ConfigurationRevision.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ConfigurationRevision.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.ConfigurationRevision
+-- 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.Kafka.Types.ConfigurationRevision 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
+
+-- | Describes a configuration revision.
+--
+-- /See:/ 'newConfigurationRevision' smart constructor.
+data ConfigurationRevision = ConfigurationRevision'
+  { -- | The description of the configuration revision.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The revision number.
+    revision :: Prelude.Integer,
+    -- | The time when the configuration revision was created.
+    creationTime :: Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationRevision' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'configurationRevision_description' - The description of the configuration revision.
+--
+-- 'revision', 'configurationRevision_revision' - The revision number.
+--
+-- 'creationTime', 'configurationRevision_creationTime' - The time when the configuration revision was created.
+newConfigurationRevision ::
+  -- | 'revision'
+  Prelude.Integer ->
+  -- | 'creationTime'
+  Prelude.UTCTime ->
+  ConfigurationRevision
+newConfigurationRevision pRevision_ pCreationTime_ =
+  ConfigurationRevision'
+    { description =
+        Prelude.Nothing,
+      revision = pRevision_,
+      creationTime = Data._Time Lens.# pCreationTime_
+    }
+
+-- | The description of the configuration revision.
+configurationRevision_description :: Lens.Lens' ConfigurationRevision (Prelude.Maybe Prelude.Text)
+configurationRevision_description = Lens.lens (\ConfigurationRevision' {description} -> description) (\s@ConfigurationRevision' {} a -> s {description = a} :: ConfigurationRevision)
+
+-- | The revision number.
+configurationRevision_revision :: Lens.Lens' ConfigurationRevision Prelude.Integer
+configurationRevision_revision = Lens.lens (\ConfigurationRevision' {revision} -> revision) (\s@ConfigurationRevision' {} a -> s {revision = a} :: ConfigurationRevision)
+
+-- | The time when the configuration revision was created.
+configurationRevision_creationTime :: Lens.Lens' ConfigurationRevision Prelude.UTCTime
+configurationRevision_creationTime = Lens.lens (\ConfigurationRevision' {creationTime} -> creationTime) (\s@ConfigurationRevision' {} a -> s {creationTime = a} :: ConfigurationRevision) Prelude.. Data._Time
+
+instance Data.FromJSON ConfigurationRevision where
+  parseJSON =
+    Data.withObject
+      "ConfigurationRevision"
+      ( \x ->
+          ConfigurationRevision'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..: "revision")
+            Prelude.<*> (x Data..: "creationTime")
+      )
+
+instance Prelude.Hashable ConfigurationRevision where
+  hashWithSalt _salt ConfigurationRevision' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` revision
+      `Prelude.hashWithSalt` creationTime
+
+instance Prelude.NFData ConfigurationRevision where
+  rnf ConfigurationRevision' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf revision
+      `Prelude.seq` Prelude.rnf creationTime
diff --git a/gen/Amazonka/Kafka/Types/ConfigurationState.hs b/gen/Amazonka/Kafka/Types/ConfigurationState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ConfigurationState.hs
@@ -0,0 +1,77 @@
+{-# 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.Kafka.Types.ConfigurationState
+-- 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.Kafka.Types.ConfigurationState
+  ( ConfigurationState
+      ( ..,
+        ConfigurationState_ACTIVE,
+        ConfigurationState_DELETE_FAILED,
+        ConfigurationState_DELETING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The state of a configuration.
+newtype ConfigurationState = ConfigurationState'
+  { fromConfigurationState ::
+      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 ConfigurationState_ACTIVE :: ConfigurationState
+pattern ConfigurationState_ACTIVE = ConfigurationState' "ACTIVE"
+
+pattern ConfigurationState_DELETE_FAILED :: ConfigurationState
+pattern ConfigurationState_DELETE_FAILED = ConfigurationState' "DELETE_FAILED"
+
+pattern ConfigurationState_DELETING :: ConfigurationState
+pattern ConfigurationState_DELETING = ConfigurationState' "DELETING"
+
+{-# COMPLETE
+  ConfigurationState_ACTIVE,
+  ConfigurationState_DELETE_FAILED,
+  ConfigurationState_DELETING,
+  ConfigurationState'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/ConnectivityInfo.hs b/gen/Amazonka/Kafka/Types/ConnectivityInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ConnectivityInfo.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.Kafka.Types.ConnectivityInfo
+-- 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.Kafka.Types.ConnectivityInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.PublicAccess
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the broker access configuration.
+--
+-- /See:/ 'newConnectivityInfo' smart constructor.
+data ConnectivityInfo = ConnectivityInfo'
+  { -- | Public access control for brokers.
+    publicAccess :: Prelude.Maybe PublicAccess
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConnectivityInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'publicAccess', 'connectivityInfo_publicAccess' - Public access control for brokers.
+newConnectivityInfo ::
+  ConnectivityInfo
+newConnectivityInfo =
+  ConnectivityInfo' {publicAccess = Prelude.Nothing}
+
+-- | Public access control for brokers.
+connectivityInfo_publicAccess :: Lens.Lens' ConnectivityInfo (Prelude.Maybe PublicAccess)
+connectivityInfo_publicAccess = Lens.lens (\ConnectivityInfo' {publicAccess} -> publicAccess) (\s@ConnectivityInfo' {} a -> s {publicAccess = a} :: ConnectivityInfo)
+
+instance Data.FromJSON ConnectivityInfo where
+  parseJSON =
+    Data.withObject
+      "ConnectivityInfo"
+      ( \x ->
+          ConnectivityInfo'
+            Prelude.<$> (x Data..:? "publicAccess")
+      )
+
+instance Prelude.Hashable ConnectivityInfo where
+  hashWithSalt _salt ConnectivityInfo' {..} =
+    _salt `Prelude.hashWithSalt` publicAccess
+
+instance Prelude.NFData ConnectivityInfo where
+  rnf ConnectivityInfo' {..} = Prelude.rnf publicAccess
+
+instance Data.ToJSON ConnectivityInfo where
+  toJSON ConnectivityInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("publicAccess" Data..=) Prelude.<$> publicAccess]
+      )
diff --git a/gen/Amazonka/Kafka/Types/EBSStorageInfo.hs b/gen/Amazonka/Kafka/Types/EBSStorageInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/EBSStorageInfo.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.EBSStorageInfo
+-- 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.Kafka.Types.EBSStorageInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ProvisionedThroughput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the EBS storage volumes attached to Apache
+-- Kafka broker nodes.
+--
+-- /See:/ 'newEBSStorageInfo' smart constructor.
+data EBSStorageInfo = EBSStorageInfo'
+  { -- | EBS volume provisioned throughput information.
+    provisionedThroughput :: Prelude.Maybe ProvisionedThroughput,
+    -- | The size in GiB of the EBS volume for the data drive on each broker
+    -- node.
+    volumeSize :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EBSStorageInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'provisionedThroughput', 'eBSStorageInfo_provisionedThroughput' - EBS volume provisioned throughput information.
+--
+-- 'volumeSize', 'eBSStorageInfo_volumeSize' - The size in GiB of the EBS volume for the data drive on each broker
+-- node.
+newEBSStorageInfo ::
+  EBSStorageInfo
+newEBSStorageInfo =
+  EBSStorageInfo'
+    { provisionedThroughput =
+        Prelude.Nothing,
+      volumeSize = Prelude.Nothing
+    }
+
+-- | EBS volume provisioned throughput information.
+eBSStorageInfo_provisionedThroughput :: Lens.Lens' EBSStorageInfo (Prelude.Maybe ProvisionedThroughput)
+eBSStorageInfo_provisionedThroughput = Lens.lens (\EBSStorageInfo' {provisionedThroughput} -> provisionedThroughput) (\s@EBSStorageInfo' {} a -> s {provisionedThroughput = a} :: EBSStorageInfo)
+
+-- | The size in GiB of the EBS volume for the data drive on each broker
+-- node.
+eBSStorageInfo_volumeSize :: Lens.Lens' EBSStorageInfo (Prelude.Maybe Prelude.Natural)
+eBSStorageInfo_volumeSize = Lens.lens (\EBSStorageInfo' {volumeSize} -> volumeSize) (\s@EBSStorageInfo' {} a -> s {volumeSize = a} :: EBSStorageInfo)
+
+instance Data.FromJSON EBSStorageInfo where
+  parseJSON =
+    Data.withObject
+      "EBSStorageInfo"
+      ( \x ->
+          EBSStorageInfo'
+            Prelude.<$> (x Data..:? "provisionedThroughput")
+            Prelude.<*> (x Data..:? "volumeSize")
+      )
+
+instance Prelude.Hashable EBSStorageInfo where
+  hashWithSalt _salt EBSStorageInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` provisionedThroughput
+      `Prelude.hashWithSalt` volumeSize
+
+instance Prelude.NFData EBSStorageInfo where
+  rnf EBSStorageInfo' {..} =
+    Prelude.rnf provisionedThroughput
+      `Prelude.seq` Prelude.rnf volumeSize
+
+instance Data.ToJSON EBSStorageInfo where
+  toJSON EBSStorageInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("provisionedThroughput" Data..=)
+              Prelude.<$> provisionedThroughput,
+            ("volumeSize" Data..=) Prelude.<$> volumeSize
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/EncryptionAtRest.hs b/gen/Amazonka/Kafka/Types/EncryptionAtRest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/EncryptionAtRest.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.EncryptionAtRest
+-- 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.Kafka.Types.EncryptionAtRest 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 data-volume encryption details.
+--
+-- /See:/ 'newEncryptionAtRest' smart constructor.
+data EncryptionAtRest = EncryptionAtRest'
+  { -- | The ARN of the AWS KMS key for encrypting data at rest. If you don\'t
+    -- specify a KMS key, MSK creates one for you and uses it.
+    dataVolumeKMSKeyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionAtRest' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataVolumeKMSKeyId', 'encryptionAtRest_dataVolumeKMSKeyId' - The ARN of the AWS KMS key for encrypting data at rest. If you don\'t
+-- specify a KMS key, MSK creates one for you and uses it.
+newEncryptionAtRest ::
+  -- | 'dataVolumeKMSKeyId'
+  Prelude.Text ->
+  EncryptionAtRest
+newEncryptionAtRest pDataVolumeKMSKeyId_ =
+  EncryptionAtRest'
+    { dataVolumeKMSKeyId =
+        pDataVolumeKMSKeyId_
+    }
+
+-- | The ARN of the AWS KMS key for encrypting data at rest. If you don\'t
+-- specify a KMS key, MSK creates one for you and uses it.
+encryptionAtRest_dataVolumeKMSKeyId :: Lens.Lens' EncryptionAtRest Prelude.Text
+encryptionAtRest_dataVolumeKMSKeyId = Lens.lens (\EncryptionAtRest' {dataVolumeKMSKeyId} -> dataVolumeKMSKeyId) (\s@EncryptionAtRest' {} a -> s {dataVolumeKMSKeyId = a} :: EncryptionAtRest)
+
+instance Data.FromJSON EncryptionAtRest where
+  parseJSON =
+    Data.withObject
+      "EncryptionAtRest"
+      ( \x ->
+          EncryptionAtRest'
+            Prelude.<$> (x Data..: "dataVolumeKMSKeyId")
+      )
+
+instance Prelude.Hashable EncryptionAtRest where
+  hashWithSalt _salt EncryptionAtRest' {..} =
+    _salt `Prelude.hashWithSalt` dataVolumeKMSKeyId
+
+instance Prelude.NFData EncryptionAtRest where
+  rnf EncryptionAtRest' {..} =
+    Prelude.rnf dataVolumeKMSKeyId
+
+instance Data.ToJSON EncryptionAtRest where
+  toJSON EncryptionAtRest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("dataVolumeKMSKeyId" Data..= dataVolumeKMSKeyId)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/EncryptionInTransit.hs b/gen/Amazonka/Kafka/Types/EncryptionInTransit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/EncryptionInTransit.hs
@@ -0,0 +1,140 @@
+{-# 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.Kafka.Types.EncryptionInTransit
+-- 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.Kafka.Types.EncryptionInTransit where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ClientBroker
+import qualified Amazonka.Prelude as Prelude
+
+-- | The settings for encrypting data in transit.
+--
+-- /See:/ 'newEncryptionInTransit' smart constructor.
+data EncryptionInTransit = EncryptionInTransit'
+  { -- | Indicates the encryption setting for data in transit between clients and
+    -- brokers. The following are the possible values.
+    --
+    -- TLS means that client-broker communication is enabled with TLS only.
+    --
+    -- TLS_PLAINTEXT means that client-broker communication is enabled for both
+    -- TLS-encrypted, as well as plaintext data.
+    --
+    -- PLAINTEXT means that client-broker communication is enabled in plaintext
+    -- only.
+    --
+    -- The default value is TLS_PLAINTEXT.
+    clientBroker :: Prelude.Maybe ClientBroker,
+    -- | When set to true, it indicates that data communication among the broker
+    -- nodes of the cluster is encrypted. When set to false, the communication
+    -- happens in plaintext.
+    --
+    -- The default value is true.
+    inCluster :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionInTransit' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientBroker', 'encryptionInTransit_clientBroker' - Indicates the encryption setting for data in transit between clients and
+-- brokers. The following are the possible values.
+--
+-- TLS means that client-broker communication is enabled with TLS only.
+--
+-- TLS_PLAINTEXT means that client-broker communication is enabled for both
+-- TLS-encrypted, as well as plaintext data.
+--
+-- PLAINTEXT means that client-broker communication is enabled in plaintext
+-- only.
+--
+-- The default value is TLS_PLAINTEXT.
+--
+-- 'inCluster', 'encryptionInTransit_inCluster' - When set to true, it indicates that data communication among the broker
+-- nodes of the cluster is encrypted. When set to false, the communication
+-- happens in plaintext.
+--
+-- The default value is true.
+newEncryptionInTransit ::
+  EncryptionInTransit
+newEncryptionInTransit =
+  EncryptionInTransit'
+    { clientBroker =
+        Prelude.Nothing,
+      inCluster = Prelude.Nothing
+    }
+
+-- | Indicates the encryption setting for data in transit between clients and
+-- brokers. The following are the possible values.
+--
+-- TLS means that client-broker communication is enabled with TLS only.
+--
+-- TLS_PLAINTEXT means that client-broker communication is enabled for both
+-- TLS-encrypted, as well as plaintext data.
+--
+-- PLAINTEXT means that client-broker communication is enabled in plaintext
+-- only.
+--
+-- The default value is TLS_PLAINTEXT.
+encryptionInTransit_clientBroker :: Lens.Lens' EncryptionInTransit (Prelude.Maybe ClientBroker)
+encryptionInTransit_clientBroker = Lens.lens (\EncryptionInTransit' {clientBroker} -> clientBroker) (\s@EncryptionInTransit' {} a -> s {clientBroker = a} :: EncryptionInTransit)
+
+-- | When set to true, it indicates that data communication among the broker
+-- nodes of the cluster is encrypted. When set to false, the communication
+-- happens in plaintext.
+--
+-- The default value is true.
+encryptionInTransit_inCluster :: Lens.Lens' EncryptionInTransit (Prelude.Maybe Prelude.Bool)
+encryptionInTransit_inCluster = Lens.lens (\EncryptionInTransit' {inCluster} -> inCluster) (\s@EncryptionInTransit' {} a -> s {inCluster = a} :: EncryptionInTransit)
+
+instance Data.FromJSON EncryptionInTransit where
+  parseJSON =
+    Data.withObject
+      "EncryptionInTransit"
+      ( \x ->
+          EncryptionInTransit'
+            Prelude.<$> (x Data..:? "clientBroker")
+            Prelude.<*> (x Data..:? "inCluster")
+      )
+
+instance Prelude.Hashable EncryptionInTransit where
+  hashWithSalt _salt EncryptionInTransit' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientBroker
+      `Prelude.hashWithSalt` inCluster
+
+instance Prelude.NFData EncryptionInTransit where
+  rnf EncryptionInTransit' {..} =
+    Prelude.rnf clientBroker
+      `Prelude.seq` Prelude.rnf inCluster
+
+instance Data.ToJSON EncryptionInTransit where
+  toJSON EncryptionInTransit' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientBroker" Data..=) Prelude.<$> clientBroker,
+            ("inCluster" Data..=) Prelude.<$> inCluster
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/EncryptionInfo.hs b/gen/Amazonka/Kafka/Types/EncryptionInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/EncryptionInfo.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.Kafka.Types.EncryptionInfo
+-- 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.Kafka.Types.EncryptionInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.EncryptionAtRest
+import Amazonka.Kafka.Types.EncryptionInTransit
+import qualified Amazonka.Prelude as Prelude
+
+-- | Includes encryption-related information, such as the AWS KMS key used
+-- for encrypting data at rest and whether you want MSK to encrypt your
+-- data in transit.
+--
+-- /See:/ 'newEncryptionInfo' smart constructor.
+data EncryptionInfo = EncryptionInfo'
+  { -- | The data-volume encryption details.
+    encryptionAtRest :: Prelude.Maybe EncryptionAtRest,
+    -- | The details for encryption in transit.
+    encryptionInTransit :: Prelude.Maybe EncryptionInTransit
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'encryptionAtRest', 'encryptionInfo_encryptionAtRest' - The data-volume encryption details.
+--
+-- 'encryptionInTransit', 'encryptionInfo_encryptionInTransit' - The details for encryption in transit.
+newEncryptionInfo ::
+  EncryptionInfo
+newEncryptionInfo =
+  EncryptionInfo'
+    { encryptionAtRest = Prelude.Nothing,
+      encryptionInTransit = Prelude.Nothing
+    }
+
+-- | The data-volume encryption details.
+encryptionInfo_encryptionAtRest :: Lens.Lens' EncryptionInfo (Prelude.Maybe EncryptionAtRest)
+encryptionInfo_encryptionAtRest = Lens.lens (\EncryptionInfo' {encryptionAtRest} -> encryptionAtRest) (\s@EncryptionInfo' {} a -> s {encryptionAtRest = a} :: EncryptionInfo)
+
+-- | The details for encryption in transit.
+encryptionInfo_encryptionInTransit :: Lens.Lens' EncryptionInfo (Prelude.Maybe EncryptionInTransit)
+encryptionInfo_encryptionInTransit = Lens.lens (\EncryptionInfo' {encryptionInTransit} -> encryptionInTransit) (\s@EncryptionInfo' {} a -> s {encryptionInTransit = a} :: EncryptionInfo)
+
+instance Data.FromJSON EncryptionInfo where
+  parseJSON =
+    Data.withObject
+      "EncryptionInfo"
+      ( \x ->
+          EncryptionInfo'
+            Prelude.<$> (x Data..:? "encryptionAtRest")
+            Prelude.<*> (x Data..:? "encryptionInTransit")
+      )
+
+instance Prelude.Hashable EncryptionInfo where
+  hashWithSalt _salt EncryptionInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` encryptionAtRest
+      `Prelude.hashWithSalt` encryptionInTransit
+
+instance Prelude.NFData EncryptionInfo where
+  rnf EncryptionInfo' {..} =
+    Prelude.rnf encryptionAtRest
+      `Prelude.seq` Prelude.rnf encryptionInTransit
+
+instance Data.ToJSON EncryptionInfo where
+  toJSON EncryptionInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("encryptionAtRest" Data..=)
+              Prelude.<$> encryptionAtRest,
+            ("encryptionInTransit" Data..=)
+              Prelude.<$> encryptionInTransit
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/EnhancedMonitoring.hs b/gen/Amazonka/Kafka/Types/EnhancedMonitoring.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/EnhancedMonitoring.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.Kafka.Types.EnhancedMonitoring
+-- 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.Kafka.Types.EnhancedMonitoring
+  ( EnhancedMonitoring
+      ( ..,
+        EnhancedMonitoring_DEFAULT,
+        EnhancedMonitoring_PER_BROKER,
+        EnhancedMonitoring_PER_TOPIC_PER_BROKER,
+        EnhancedMonitoring_PER_TOPIC_PER_PARTITION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies which metrics are gathered for the MSK cluster. This property
+-- has the following possible values: DEFAULT, PER_BROKER,
+-- PER_TOPIC_PER_BROKER, and PER_TOPIC_PER_PARTITION. For a list of the
+-- metrics associated with each of these levels of monitoring, see
+-- <https://docs.aws.amazon.com/msk/latest/developerguide/monitoring.html Monitoring>.
+newtype EnhancedMonitoring = EnhancedMonitoring'
+  { fromEnhancedMonitoring ::
+      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 EnhancedMonitoring_DEFAULT :: EnhancedMonitoring
+pattern EnhancedMonitoring_DEFAULT = EnhancedMonitoring' "DEFAULT"
+
+pattern EnhancedMonitoring_PER_BROKER :: EnhancedMonitoring
+pattern EnhancedMonitoring_PER_BROKER = EnhancedMonitoring' "PER_BROKER"
+
+pattern EnhancedMonitoring_PER_TOPIC_PER_BROKER :: EnhancedMonitoring
+pattern EnhancedMonitoring_PER_TOPIC_PER_BROKER = EnhancedMonitoring' "PER_TOPIC_PER_BROKER"
+
+pattern EnhancedMonitoring_PER_TOPIC_PER_PARTITION :: EnhancedMonitoring
+pattern EnhancedMonitoring_PER_TOPIC_PER_PARTITION = EnhancedMonitoring' "PER_TOPIC_PER_PARTITION"
+
+{-# COMPLETE
+  EnhancedMonitoring_DEFAULT,
+  EnhancedMonitoring_PER_BROKER,
+  EnhancedMonitoring_PER_TOPIC_PER_BROKER,
+  EnhancedMonitoring_PER_TOPIC_PER_PARTITION,
+  EnhancedMonitoring'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/ErrorInfo.hs b/gen/Amazonka/Kafka/Types/ErrorInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ErrorInfo.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.Kafka.Types.ErrorInfo
+-- 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.Kafka.Types.ErrorInfo 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
+
+-- | Returns information about an error state of the cluster.
+--
+-- /See:/ 'newErrorInfo' smart constructor.
+data ErrorInfo = ErrorInfo'
+  { -- | A number describing the error programmatically.
+    errorCode :: Prelude.Maybe Prelude.Text,
+    -- | An optional field to provide more details about the error.
+    errorString :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ErrorInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'errorInfo_errorCode' - A number describing the error programmatically.
+--
+-- 'errorString', 'errorInfo_errorString' - An optional field to provide more details about the error.
+newErrorInfo ::
+  ErrorInfo
+newErrorInfo =
+  ErrorInfo'
+    { errorCode = Prelude.Nothing,
+      errorString = Prelude.Nothing
+    }
+
+-- | A number describing the error programmatically.
+errorInfo_errorCode :: Lens.Lens' ErrorInfo (Prelude.Maybe Prelude.Text)
+errorInfo_errorCode = Lens.lens (\ErrorInfo' {errorCode} -> errorCode) (\s@ErrorInfo' {} a -> s {errorCode = a} :: ErrorInfo)
+
+-- | An optional field to provide more details about the error.
+errorInfo_errorString :: Lens.Lens' ErrorInfo (Prelude.Maybe Prelude.Text)
+errorInfo_errorString = Lens.lens (\ErrorInfo' {errorString} -> errorString) (\s@ErrorInfo' {} a -> s {errorString = a} :: ErrorInfo)
+
+instance Data.FromJSON ErrorInfo where
+  parseJSON =
+    Data.withObject
+      "ErrorInfo"
+      ( \x ->
+          ErrorInfo'
+            Prelude.<$> (x Data..:? "errorCode")
+            Prelude.<*> (x Data..:? "errorString")
+      )
+
+instance Prelude.Hashable ErrorInfo where
+  hashWithSalt _salt ErrorInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` errorString
+
+instance Prelude.NFData ErrorInfo where
+  rnf ErrorInfo' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorString
diff --git a/gen/Amazonka/Kafka/Types/Firehose.hs b/gen/Amazonka/Kafka/Types/Firehose.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Firehose.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Firehose
+-- 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.Kafka.Types.Firehose 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
+
+-- | /See:/ 'newFirehose' smart constructor.
+data Firehose = Firehose'
+  { deliveryStream :: Prelude.Maybe Prelude.Text,
+    enabled :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Firehose' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deliveryStream', 'firehose_deliveryStream' - Undocumented member.
+--
+-- 'enabled', 'firehose_enabled' - Undocumented member.
+newFirehose ::
+  -- | 'enabled'
+  Prelude.Bool ->
+  Firehose
+newFirehose pEnabled_ =
+  Firehose'
+    { deliveryStream = Prelude.Nothing,
+      enabled = pEnabled_
+    }
+
+-- | Undocumented member.
+firehose_deliveryStream :: Lens.Lens' Firehose (Prelude.Maybe Prelude.Text)
+firehose_deliveryStream = Lens.lens (\Firehose' {deliveryStream} -> deliveryStream) (\s@Firehose' {} a -> s {deliveryStream = a} :: Firehose)
+
+-- | Undocumented member.
+firehose_enabled :: Lens.Lens' Firehose Prelude.Bool
+firehose_enabled = Lens.lens (\Firehose' {enabled} -> enabled) (\s@Firehose' {} a -> s {enabled = a} :: Firehose)
+
+instance Data.FromJSON Firehose where
+  parseJSON =
+    Data.withObject
+      "Firehose"
+      ( \x ->
+          Firehose'
+            Prelude.<$> (x Data..:? "deliveryStream")
+            Prelude.<*> (x Data..: "enabled")
+      )
+
+instance Prelude.Hashable Firehose where
+  hashWithSalt _salt Firehose' {..} =
+    _salt
+      `Prelude.hashWithSalt` deliveryStream
+      `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData Firehose where
+  rnf Firehose' {..} =
+    Prelude.rnf deliveryStream
+      `Prelude.seq` Prelude.rnf enabled
+
+instance Data.ToJSON Firehose where
+  toJSON Firehose' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("deliveryStream" Data..=)
+              Prelude.<$> deliveryStream,
+            Prelude.Just ("enabled" Data..= enabled)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Iam.hs b/gen/Amazonka/Kafka/Types/Iam.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Iam.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Iam
+-- 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.Kafka.Types.Iam 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
+
+-- | Details for IAM access control.
+--
+-- /See:/ 'newIam' smart constructor.
+data Iam = Iam'
+  { -- | Indicates whether IAM access control is enabled.
+    enabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Iam' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'iam_enabled' - Indicates whether IAM access control is enabled.
+newIam ::
+  Iam
+newIam = Iam' {enabled = Prelude.Nothing}
+
+-- | Indicates whether IAM access control is enabled.
+iam_enabled :: Lens.Lens' Iam (Prelude.Maybe Prelude.Bool)
+iam_enabled = Lens.lens (\Iam' {enabled} -> enabled) (\s@Iam' {} a -> s {enabled = a} :: Iam)
+
+instance Data.FromJSON Iam where
+  parseJSON =
+    Data.withObject
+      "Iam"
+      (\x -> Iam' Prelude.<$> (x Data..:? "enabled"))
+
+instance Prelude.Hashable Iam where
+  hashWithSalt _salt Iam' {..} =
+    _salt `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData Iam where
+  rnf Iam' {..} = Prelude.rnf enabled
+
+instance Data.ToJSON Iam where
+  toJSON Iam' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("enabled" Data..=) Prelude.<$> enabled]
+      )
diff --git a/gen/Amazonka/Kafka/Types/JmxExporter.hs b/gen/Amazonka/Kafka/Types/JmxExporter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/JmxExporter.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.JmxExporter
+-- 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.Kafka.Types.JmxExporter 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
+
+-- | Indicates whether you want to turn on or turn off the JMX Exporter.
+--
+-- /See:/ 'newJmxExporter' smart constructor.
+data JmxExporter = JmxExporter'
+  { -- | Indicates whether you want to turn on or turn off the JMX Exporter.
+    enabledInBroker :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JmxExporter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabledInBroker', 'jmxExporter_enabledInBroker' - Indicates whether you want to turn on or turn off the JMX Exporter.
+newJmxExporter ::
+  -- | 'enabledInBroker'
+  Prelude.Bool ->
+  JmxExporter
+newJmxExporter pEnabledInBroker_ =
+  JmxExporter' {enabledInBroker = pEnabledInBroker_}
+
+-- | Indicates whether you want to turn on or turn off the JMX Exporter.
+jmxExporter_enabledInBroker :: Lens.Lens' JmxExporter Prelude.Bool
+jmxExporter_enabledInBroker = Lens.lens (\JmxExporter' {enabledInBroker} -> enabledInBroker) (\s@JmxExporter' {} a -> s {enabledInBroker = a} :: JmxExporter)
+
+instance Data.FromJSON JmxExporter where
+  parseJSON =
+    Data.withObject
+      "JmxExporter"
+      ( \x ->
+          JmxExporter'
+            Prelude.<$> (x Data..: "enabledInBroker")
+      )
+
+instance Prelude.Hashable JmxExporter where
+  hashWithSalt _salt JmxExporter' {..} =
+    _salt `Prelude.hashWithSalt` enabledInBroker
+
+instance Prelude.NFData JmxExporter where
+  rnf JmxExporter' {..} = Prelude.rnf enabledInBroker
diff --git a/gen/Amazonka/Kafka/Types/JmxExporterInfo.hs b/gen/Amazonka/Kafka/Types/JmxExporterInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/JmxExporterInfo.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.JmxExporterInfo
+-- 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.Kafka.Types.JmxExporterInfo 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
+
+-- | Indicates whether you want to turn on or turn off the JMX Exporter.
+--
+-- /See:/ 'newJmxExporterInfo' smart constructor.
+data JmxExporterInfo = JmxExporterInfo'
+  { -- | Indicates whether you want to turn on or turn off the JMX Exporter.
+    enabledInBroker :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JmxExporterInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabledInBroker', 'jmxExporterInfo_enabledInBroker' - Indicates whether you want to turn on or turn off the JMX Exporter.
+newJmxExporterInfo ::
+  -- | 'enabledInBroker'
+  Prelude.Bool ->
+  JmxExporterInfo
+newJmxExporterInfo pEnabledInBroker_ =
+  JmxExporterInfo'
+    { enabledInBroker =
+        pEnabledInBroker_
+    }
+
+-- | Indicates whether you want to turn on or turn off the JMX Exporter.
+jmxExporterInfo_enabledInBroker :: Lens.Lens' JmxExporterInfo Prelude.Bool
+jmxExporterInfo_enabledInBroker = Lens.lens (\JmxExporterInfo' {enabledInBroker} -> enabledInBroker) (\s@JmxExporterInfo' {} a -> s {enabledInBroker = a} :: JmxExporterInfo)
+
+instance Data.FromJSON JmxExporterInfo where
+  parseJSON =
+    Data.withObject
+      "JmxExporterInfo"
+      ( \x ->
+          JmxExporterInfo'
+            Prelude.<$> (x Data..: "enabledInBroker")
+      )
+
+instance Prelude.Hashable JmxExporterInfo where
+  hashWithSalt _salt JmxExporterInfo' {..} =
+    _salt `Prelude.hashWithSalt` enabledInBroker
+
+instance Prelude.NFData JmxExporterInfo where
+  rnf JmxExporterInfo' {..} =
+    Prelude.rnf enabledInBroker
+
+instance Data.ToJSON JmxExporterInfo where
+  toJSON JmxExporterInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("enabledInBroker" Data..= enabledInBroker)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/KafkaVersion.hs b/gen/Amazonka/Kafka/Types/KafkaVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/KafkaVersion.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.KafkaVersion
+-- 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.Kafka.Types.KafkaVersion where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.KafkaVersionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | /See:/ 'newKafkaVersion' smart constructor.
+data KafkaVersion = KafkaVersion'
+  { status :: Prelude.Maybe KafkaVersionStatus,
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KafkaVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'kafkaVersion_status' - Undocumented member.
+--
+-- 'version', 'kafkaVersion_version' - Undocumented member.
+newKafkaVersion ::
+  KafkaVersion
+newKafkaVersion =
+  KafkaVersion'
+    { status = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+kafkaVersion_status :: Lens.Lens' KafkaVersion (Prelude.Maybe KafkaVersionStatus)
+kafkaVersion_status = Lens.lens (\KafkaVersion' {status} -> status) (\s@KafkaVersion' {} a -> s {status = a} :: KafkaVersion)
+
+-- | Undocumented member.
+kafkaVersion_version :: Lens.Lens' KafkaVersion (Prelude.Maybe Prelude.Text)
+kafkaVersion_version = Lens.lens (\KafkaVersion' {version} -> version) (\s@KafkaVersion' {} a -> s {version = a} :: KafkaVersion)
+
+instance Data.FromJSON KafkaVersion where
+  parseJSON =
+    Data.withObject
+      "KafkaVersion"
+      ( \x ->
+          KafkaVersion'
+            Prelude.<$> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "version")
+      )
+
+instance Prelude.Hashable KafkaVersion where
+  hashWithSalt _salt KafkaVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData KafkaVersion where
+  rnf KafkaVersion' {..} =
+    Prelude.rnf status
+      `Prelude.seq` Prelude.rnf version
diff --git a/gen/Amazonka/Kafka/Types/KafkaVersionStatus.hs b/gen/Amazonka/Kafka/Types/KafkaVersionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/KafkaVersionStatus.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.Kafka.Types.KafkaVersionStatus
+-- 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.Kafka.Types.KafkaVersionStatus
+  ( KafkaVersionStatus
+      ( ..,
+        KafkaVersionStatus_ACTIVE,
+        KafkaVersionStatus_DEPRECATED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype KafkaVersionStatus = KafkaVersionStatus'
+  { fromKafkaVersionStatus ::
+      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 KafkaVersionStatus_ACTIVE :: KafkaVersionStatus
+pattern KafkaVersionStatus_ACTIVE = KafkaVersionStatus' "ACTIVE"
+
+pattern KafkaVersionStatus_DEPRECATED :: KafkaVersionStatus
+pattern KafkaVersionStatus_DEPRECATED = KafkaVersionStatus' "DEPRECATED"
+
+{-# COMPLETE
+  KafkaVersionStatus_ACTIVE,
+  KafkaVersionStatus_DEPRECATED,
+  KafkaVersionStatus'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/LoggingInfo.hs b/gen/Amazonka/Kafka/Types/LoggingInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/LoggingInfo.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.LoggingInfo
+-- 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.Kafka.Types.LoggingInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerLogs
+import qualified Amazonka.Prelude as Prelude
+
+-- | /See:/ 'newLoggingInfo' smart constructor.
+data LoggingInfo = LoggingInfo'
+  { brokerLogs :: BrokerLogs
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LoggingInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'brokerLogs', 'loggingInfo_brokerLogs' - Undocumented member.
+newLoggingInfo ::
+  -- | 'brokerLogs'
+  BrokerLogs ->
+  LoggingInfo
+newLoggingInfo pBrokerLogs_ =
+  LoggingInfo' {brokerLogs = pBrokerLogs_}
+
+-- | Undocumented member.
+loggingInfo_brokerLogs :: Lens.Lens' LoggingInfo BrokerLogs
+loggingInfo_brokerLogs = Lens.lens (\LoggingInfo' {brokerLogs} -> brokerLogs) (\s@LoggingInfo' {} a -> s {brokerLogs = a} :: LoggingInfo)
+
+instance Data.FromJSON LoggingInfo where
+  parseJSON =
+    Data.withObject
+      "LoggingInfo"
+      ( \x ->
+          LoggingInfo' Prelude.<$> (x Data..: "brokerLogs")
+      )
+
+instance Prelude.Hashable LoggingInfo where
+  hashWithSalt _salt LoggingInfo' {..} =
+    _salt `Prelude.hashWithSalt` brokerLogs
+
+instance Prelude.NFData LoggingInfo where
+  rnf LoggingInfo' {..} = Prelude.rnf brokerLogs
+
+instance Data.ToJSON LoggingInfo where
+  toJSON LoggingInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("brokerLogs" Data..= brokerLogs)]
+      )
diff --git a/gen/Amazonka/Kafka/Types/MutableClusterInfo.hs b/gen/Amazonka/Kafka/Types/MutableClusterInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/MutableClusterInfo.hs
@@ -0,0 +1,230 @@
+{-# 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.Kafka.Types.MutableClusterInfo
+-- 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.Kafka.Types.MutableClusterInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerEBSVolumeInfo
+import Amazonka.Kafka.Types.ClientAuthentication
+import Amazonka.Kafka.Types.ConfigurationInfo
+import Amazonka.Kafka.Types.ConnectivityInfo
+import Amazonka.Kafka.Types.EncryptionInfo
+import Amazonka.Kafka.Types.EnhancedMonitoring
+import Amazonka.Kafka.Types.LoggingInfo
+import Amazonka.Kafka.Types.OpenMonitoring
+import Amazonka.Kafka.Types.StorageMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about cluster attributes that can be updated via update
+-- APIs.
+--
+-- /See:/ 'newMutableClusterInfo' smart constructor.
+data MutableClusterInfo = MutableClusterInfo'
+  { -- | Specifies the size of the EBS volume and the ID of the associated
+    -- broker.
+    brokerEBSVolumeInfo :: Prelude.Maybe [BrokerEBSVolumeInfo],
+    -- | Includes all client authentication information.
+    clientAuthentication :: Prelude.Maybe ClientAuthentication,
+    -- | Information about the changes in the configuration of the brokers.
+    configurationInfo :: Prelude.Maybe ConfigurationInfo,
+    -- | Information about the broker access configuration.
+    connectivityInfo :: Prelude.Maybe ConnectivityInfo,
+    -- | Includes all encryption-related information.
+    encryptionInfo :: Prelude.Maybe EncryptionInfo,
+    -- | Specifies which Apache Kafka metrics Amazon MSK gathers and sends to
+    -- Amazon CloudWatch for this cluster.
+    enhancedMonitoring :: Prelude.Maybe EnhancedMonitoring,
+    -- | Information about the Amazon MSK broker type.
+    instanceType :: Prelude.Maybe Prelude.Text,
+    -- | The Apache Kafka version.
+    kafkaVersion :: Prelude.Maybe Prelude.Text,
+    -- | You can configure your MSK cluster to send broker logs to different
+    -- destination types. This is a container for the configuration details
+    -- related to broker logs.
+    loggingInfo :: Prelude.Maybe LoggingInfo,
+    -- | The number of broker nodes in the cluster.
+    numberOfBrokerNodes :: Prelude.Maybe Prelude.Int,
+    -- | The settings for open monitoring.
+    openMonitoring :: Prelude.Maybe OpenMonitoring,
+    -- | This controls storage mode for supported storage tiers.
+    storageMode :: Prelude.Maybe StorageMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MutableClusterInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'brokerEBSVolumeInfo', 'mutableClusterInfo_brokerEBSVolumeInfo' - Specifies the size of the EBS volume and the ID of the associated
+-- broker.
+--
+-- 'clientAuthentication', 'mutableClusterInfo_clientAuthentication' - Includes all client authentication information.
+--
+-- 'configurationInfo', 'mutableClusterInfo_configurationInfo' - Information about the changes in the configuration of the brokers.
+--
+-- 'connectivityInfo', 'mutableClusterInfo_connectivityInfo' - Information about the broker access configuration.
+--
+-- 'encryptionInfo', 'mutableClusterInfo_encryptionInfo' - Includes all encryption-related information.
+--
+-- 'enhancedMonitoring', 'mutableClusterInfo_enhancedMonitoring' - Specifies which Apache Kafka metrics Amazon MSK gathers and sends to
+-- Amazon CloudWatch for this cluster.
+--
+-- 'instanceType', 'mutableClusterInfo_instanceType' - Information about the Amazon MSK broker type.
+--
+-- 'kafkaVersion', 'mutableClusterInfo_kafkaVersion' - The Apache Kafka version.
+--
+-- 'loggingInfo', 'mutableClusterInfo_loggingInfo' - You can configure your MSK cluster to send broker logs to different
+-- destination types. This is a container for the configuration details
+-- related to broker logs.
+--
+-- 'numberOfBrokerNodes', 'mutableClusterInfo_numberOfBrokerNodes' - The number of broker nodes in the cluster.
+--
+-- 'openMonitoring', 'mutableClusterInfo_openMonitoring' - The settings for open monitoring.
+--
+-- 'storageMode', 'mutableClusterInfo_storageMode' - This controls storage mode for supported storage tiers.
+newMutableClusterInfo ::
+  MutableClusterInfo
+newMutableClusterInfo =
+  MutableClusterInfo'
+    { brokerEBSVolumeInfo =
+        Prelude.Nothing,
+      clientAuthentication = Prelude.Nothing,
+      configurationInfo = Prelude.Nothing,
+      connectivityInfo = Prelude.Nothing,
+      encryptionInfo = Prelude.Nothing,
+      enhancedMonitoring = Prelude.Nothing,
+      instanceType = Prelude.Nothing,
+      kafkaVersion = Prelude.Nothing,
+      loggingInfo = Prelude.Nothing,
+      numberOfBrokerNodes = Prelude.Nothing,
+      openMonitoring = Prelude.Nothing,
+      storageMode = Prelude.Nothing
+    }
+
+-- | Specifies the size of the EBS volume and the ID of the associated
+-- broker.
+mutableClusterInfo_brokerEBSVolumeInfo :: Lens.Lens' MutableClusterInfo (Prelude.Maybe [BrokerEBSVolumeInfo])
+mutableClusterInfo_brokerEBSVolumeInfo = Lens.lens (\MutableClusterInfo' {brokerEBSVolumeInfo} -> brokerEBSVolumeInfo) (\s@MutableClusterInfo' {} a -> s {brokerEBSVolumeInfo = a} :: MutableClusterInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | Includes all client authentication information.
+mutableClusterInfo_clientAuthentication :: Lens.Lens' MutableClusterInfo (Prelude.Maybe ClientAuthentication)
+mutableClusterInfo_clientAuthentication = Lens.lens (\MutableClusterInfo' {clientAuthentication} -> clientAuthentication) (\s@MutableClusterInfo' {} a -> s {clientAuthentication = a} :: MutableClusterInfo)
+
+-- | Information about the changes in the configuration of the brokers.
+mutableClusterInfo_configurationInfo :: Lens.Lens' MutableClusterInfo (Prelude.Maybe ConfigurationInfo)
+mutableClusterInfo_configurationInfo = Lens.lens (\MutableClusterInfo' {configurationInfo} -> configurationInfo) (\s@MutableClusterInfo' {} a -> s {configurationInfo = a} :: MutableClusterInfo)
+
+-- | Information about the broker access configuration.
+mutableClusterInfo_connectivityInfo :: Lens.Lens' MutableClusterInfo (Prelude.Maybe ConnectivityInfo)
+mutableClusterInfo_connectivityInfo = Lens.lens (\MutableClusterInfo' {connectivityInfo} -> connectivityInfo) (\s@MutableClusterInfo' {} a -> s {connectivityInfo = a} :: MutableClusterInfo)
+
+-- | Includes all encryption-related information.
+mutableClusterInfo_encryptionInfo :: Lens.Lens' MutableClusterInfo (Prelude.Maybe EncryptionInfo)
+mutableClusterInfo_encryptionInfo = Lens.lens (\MutableClusterInfo' {encryptionInfo} -> encryptionInfo) (\s@MutableClusterInfo' {} a -> s {encryptionInfo = a} :: MutableClusterInfo)
+
+-- | Specifies which Apache Kafka metrics Amazon MSK gathers and sends to
+-- Amazon CloudWatch for this cluster.
+mutableClusterInfo_enhancedMonitoring :: Lens.Lens' MutableClusterInfo (Prelude.Maybe EnhancedMonitoring)
+mutableClusterInfo_enhancedMonitoring = Lens.lens (\MutableClusterInfo' {enhancedMonitoring} -> enhancedMonitoring) (\s@MutableClusterInfo' {} a -> s {enhancedMonitoring = a} :: MutableClusterInfo)
+
+-- | Information about the Amazon MSK broker type.
+mutableClusterInfo_instanceType :: Lens.Lens' MutableClusterInfo (Prelude.Maybe Prelude.Text)
+mutableClusterInfo_instanceType = Lens.lens (\MutableClusterInfo' {instanceType} -> instanceType) (\s@MutableClusterInfo' {} a -> s {instanceType = a} :: MutableClusterInfo)
+
+-- | The Apache Kafka version.
+mutableClusterInfo_kafkaVersion :: Lens.Lens' MutableClusterInfo (Prelude.Maybe Prelude.Text)
+mutableClusterInfo_kafkaVersion = Lens.lens (\MutableClusterInfo' {kafkaVersion} -> kafkaVersion) (\s@MutableClusterInfo' {} a -> s {kafkaVersion = a} :: MutableClusterInfo)
+
+-- | You can configure your MSK cluster to send broker logs to different
+-- destination types. This is a container for the configuration details
+-- related to broker logs.
+mutableClusterInfo_loggingInfo :: Lens.Lens' MutableClusterInfo (Prelude.Maybe LoggingInfo)
+mutableClusterInfo_loggingInfo = Lens.lens (\MutableClusterInfo' {loggingInfo} -> loggingInfo) (\s@MutableClusterInfo' {} a -> s {loggingInfo = a} :: MutableClusterInfo)
+
+-- | The number of broker nodes in the cluster.
+mutableClusterInfo_numberOfBrokerNodes :: Lens.Lens' MutableClusterInfo (Prelude.Maybe Prelude.Int)
+mutableClusterInfo_numberOfBrokerNodes = Lens.lens (\MutableClusterInfo' {numberOfBrokerNodes} -> numberOfBrokerNodes) (\s@MutableClusterInfo' {} a -> s {numberOfBrokerNodes = a} :: MutableClusterInfo)
+
+-- | The settings for open monitoring.
+mutableClusterInfo_openMonitoring :: Lens.Lens' MutableClusterInfo (Prelude.Maybe OpenMonitoring)
+mutableClusterInfo_openMonitoring = Lens.lens (\MutableClusterInfo' {openMonitoring} -> openMonitoring) (\s@MutableClusterInfo' {} a -> s {openMonitoring = a} :: MutableClusterInfo)
+
+-- | This controls storage mode for supported storage tiers.
+mutableClusterInfo_storageMode :: Lens.Lens' MutableClusterInfo (Prelude.Maybe StorageMode)
+mutableClusterInfo_storageMode = Lens.lens (\MutableClusterInfo' {storageMode} -> storageMode) (\s@MutableClusterInfo' {} a -> s {storageMode = a} :: MutableClusterInfo)
+
+instance Data.FromJSON MutableClusterInfo where
+  parseJSON =
+    Data.withObject
+      "MutableClusterInfo"
+      ( \x ->
+          MutableClusterInfo'
+            Prelude.<$> ( x
+                            Data..:? "brokerEBSVolumeInfo"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "clientAuthentication")
+            Prelude.<*> (x Data..:? "configurationInfo")
+            Prelude.<*> (x Data..:? "connectivityInfo")
+            Prelude.<*> (x Data..:? "encryptionInfo")
+            Prelude.<*> (x Data..:? "enhancedMonitoring")
+            Prelude.<*> (x Data..:? "instanceType")
+            Prelude.<*> (x Data..:? "kafkaVersion")
+            Prelude.<*> (x Data..:? "loggingInfo")
+            Prelude.<*> (x Data..:? "numberOfBrokerNodes")
+            Prelude.<*> (x Data..:? "openMonitoring")
+            Prelude.<*> (x Data..:? "storageMode")
+      )
+
+instance Prelude.Hashable MutableClusterInfo where
+  hashWithSalt _salt MutableClusterInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` brokerEBSVolumeInfo
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` configurationInfo
+      `Prelude.hashWithSalt` connectivityInfo
+      `Prelude.hashWithSalt` encryptionInfo
+      `Prelude.hashWithSalt` enhancedMonitoring
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` kafkaVersion
+      `Prelude.hashWithSalt` loggingInfo
+      `Prelude.hashWithSalt` numberOfBrokerNodes
+      `Prelude.hashWithSalt` openMonitoring
+      `Prelude.hashWithSalt` storageMode
+
+instance Prelude.NFData MutableClusterInfo where
+  rnf MutableClusterInfo' {..} =
+    Prelude.rnf brokerEBSVolumeInfo
+      `Prelude.seq` Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf configurationInfo
+      `Prelude.seq` Prelude.rnf connectivityInfo
+      `Prelude.seq` Prelude.rnf encryptionInfo
+      `Prelude.seq` Prelude.rnf enhancedMonitoring
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf kafkaVersion
+      `Prelude.seq` Prelude.rnf loggingInfo
+      `Prelude.seq` Prelude.rnf numberOfBrokerNodes
+      `Prelude.seq` Prelude.rnf openMonitoring
+      `Prelude.seq` Prelude.rnf storageMode
diff --git a/gen/Amazonka/Kafka/Types/NodeExporter.hs b/gen/Amazonka/Kafka/Types/NodeExporter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/NodeExporter.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.NodeExporter
+-- 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.Kafka.Types.NodeExporter 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
+
+-- | Indicates whether you want to turn on or turn off the Node Exporter.
+--
+-- /See:/ 'newNodeExporter' smart constructor.
+data NodeExporter = NodeExporter'
+  { -- | Indicates whether you want to turn on or turn off the Node Exporter.
+    enabledInBroker :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeExporter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabledInBroker', 'nodeExporter_enabledInBroker' - Indicates whether you want to turn on or turn off the Node Exporter.
+newNodeExporter ::
+  -- | 'enabledInBroker'
+  Prelude.Bool ->
+  NodeExporter
+newNodeExporter pEnabledInBroker_ =
+  NodeExporter' {enabledInBroker = pEnabledInBroker_}
+
+-- | Indicates whether you want to turn on or turn off the Node Exporter.
+nodeExporter_enabledInBroker :: Lens.Lens' NodeExporter Prelude.Bool
+nodeExporter_enabledInBroker = Lens.lens (\NodeExporter' {enabledInBroker} -> enabledInBroker) (\s@NodeExporter' {} a -> s {enabledInBroker = a} :: NodeExporter)
+
+instance Data.FromJSON NodeExporter where
+  parseJSON =
+    Data.withObject
+      "NodeExporter"
+      ( \x ->
+          NodeExporter'
+            Prelude.<$> (x Data..: "enabledInBroker")
+      )
+
+instance Prelude.Hashable NodeExporter where
+  hashWithSalt _salt NodeExporter' {..} =
+    _salt `Prelude.hashWithSalt` enabledInBroker
+
+instance Prelude.NFData NodeExporter where
+  rnf NodeExporter' {..} = Prelude.rnf enabledInBroker
diff --git a/gen/Amazonka/Kafka/Types/NodeExporterInfo.hs b/gen/Amazonka/Kafka/Types/NodeExporterInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/NodeExporterInfo.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.NodeExporterInfo
+-- 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.Kafka.Types.NodeExporterInfo 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
+
+-- | Indicates whether you want to turn on or turn off the Node Exporter.
+--
+-- /See:/ 'newNodeExporterInfo' smart constructor.
+data NodeExporterInfo = NodeExporterInfo'
+  { -- | Indicates whether you want to turn on or turn off the Node Exporter.
+    enabledInBroker :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeExporterInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabledInBroker', 'nodeExporterInfo_enabledInBroker' - Indicates whether you want to turn on or turn off the Node Exporter.
+newNodeExporterInfo ::
+  -- | 'enabledInBroker'
+  Prelude.Bool ->
+  NodeExporterInfo
+newNodeExporterInfo pEnabledInBroker_ =
+  NodeExporterInfo'
+    { enabledInBroker =
+        pEnabledInBroker_
+    }
+
+-- | Indicates whether you want to turn on or turn off the Node Exporter.
+nodeExporterInfo_enabledInBroker :: Lens.Lens' NodeExporterInfo Prelude.Bool
+nodeExporterInfo_enabledInBroker = Lens.lens (\NodeExporterInfo' {enabledInBroker} -> enabledInBroker) (\s@NodeExporterInfo' {} a -> s {enabledInBroker = a} :: NodeExporterInfo)
+
+instance Data.FromJSON NodeExporterInfo where
+  parseJSON =
+    Data.withObject
+      "NodeExporterInfo"
+      ( \x ->
+          NodeExporterInfo'
+            Prelude.<$> (x Data..: "enabledInBroker")
+      )
+
+instance Prelude.Hashable NodeExporterInfo where
+  hashWithSalt _salt NodeExporterInfo' {..} =
+    _salt `Prelude.hashWithSalt` enabledInBroker
+
+instance Prelude.NFData NodeExporterInfo where
+  rnf NodeExporterInfo' {..} =
+    Prelude.rnf enabledInBroker
+
+instance Data.ToJSON NodeExporterInfo where
+  toJSON NodeExporterInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("enabledInBroker" Data..= enabledInBroker)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/NodeInfo.hs b/gen/Amazonka/Kafka/Types/NodeInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/NodeInfo.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.NodeInfo
+-- 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.Kafka.Types.NodeInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerNodeInfo
+import Amazonka.Kafka.Types.NodeType
+import Amazonka.Kafka.Types.ZookeeperNodeInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | The node information object.
+--
+-- /See:/ 'newNodeInfo' smart constructor.
+data NodeInfo = NodeInfo'
+  { -- | The start time.
+    addedToClusterTime :: Prelude.Maybe Prelude.Text,
+    -- | The broker node info.
+    brokerNodeInfo :: Prelude.Maybe BrokerNodeInfo,
+    -- | The instance type.
+    instanceType :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the node.
+    nodeARN :: Prelude.Maybe Prelude.Text,
+    -- | The node type.
+    nodeType :: Prelude.Maybe NodeType,
+    -- | The ZookeeperNodeInfo.
+    zookeeperNodeInfo :: Prelude.Maybe ZookeeperNodeInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'addedToClusterTime', 'nodeInfo_addedToClusterTime' - The start time.
+--
+-- 'brokerNodeInfo', 'nodeInfo_brokerNodeInfo' - The broker node info.
+--
+-- 'instanceType', 'nodeInfo_instanceType' - The instance type.
+--
+-- 'nodeARN', 'nodeInfo_nodeARN' - The Amazon Resource Name (ARN) of the node.
+--
+-- 'nodeType', 'nodeInfo_nodeType' - The node type.
+--
+-- 'zookeeperNodeInfo', 'nodeInfo_zookeeperNodeInfo' - The ZookeeperNodeInfo.
+newNodeInfo ::
+  NodeInfo
+newNodeInfo =
+  NodeInfo'
+    { addedToClusterTime = Prelude.Nothing,
+      brokerNodeInfo = Prelude.Nothing,
+      instanceType = Prelude.Nothing,
+      nodeARN = Prelude.Nothing,
+      nodeType = Prelude.Nothing,
+      zookeeperNodeInfo = Prelude.Nothing
+    }
+
+-- | The start time.
+nodeInfo_addedToClusterTime :: Lens.Lens' NodeInfo (Prelude.Maybe Prelude.Text)
+nodeInfo_addedToClusterTime = Lens.lens (\NodeInfo' {addedToClusterTime} -> addedToClusterTime) (\s@NodeInfo' {} a -> s {addedToClusterTime = a} :: NodeInfo)
+
+-- | The broker node info.
+nodeInfo_brokerNodeInfo :: Lens.Lens' NodeInfo (Prelude.Maybe BrokerNodeInfo)
+nodeInfo_brokerNodeInfo = Lens.lens (\NodeInfo' {brokerNodeInfo} -> brokerNodeInfo) (\s@NodeInfo' {} a -> s {brokerNodeInfo = a} :: NodeInfo)
+
+-- | The instance type.
+nodeInfo_instanceType :: Lens.Lens' NodeInfo (Prelude.Maybe Prelude.Text)
+nodeInfo_instanceType = Lens.lens (\NodeInfo' {instanceType} -> instanceType) (\s@NodeInfo' {} a -> s {instanceType = a} :: NodeInfo)
+
+-- | The Amazon Resource Name (ARN) of the node.
+nodeInfo_nodeARN :: Lens.Lens' NodeInfo (Prelude.Maybe Prelude.Text)
+nodeInfo_nodeARN = Lens.lens (\NodeInfo' {nodeARN} -> nodeARN) (\s@NodeInfo' {} a -> s {nodeARN = a} :: NodeInfo)
+
+-- | The node type.
+nodeInfo_nodeType :: Lens.Lens' NodeInfo (Prelude.Maybe NodeType)
+nodeInfo_nodeType = Lens.lens (\NodeInfo' {nodeType} -> nodeType) (\s@NodeInfo' {} a -> s {nodeType = a} :: NodeInfo)
+
+-- | The ZookeeperNodeInfo.
+nodeInfo_zookeeperNodeInfo :: Lens.Lens' NodeInfo (Prelude.Maybe ZookeeperNodeInfo)
+nodeInfo_zookeeperNodeInfo = Lens.lens (\NodeInfo' {zookeeperNodeInfo} -> zookeeperNodeInfo) (\s@NodeInfo' {} a -> s {zookeeperNodeInfo = a} :: NodeInfo)
+
+instance Data.FromJSON NodeInfo where
+  parseJSON =
+    Data.withObject
+      "NodeInfo"
+      ( \x ->
+          NodeInfo'
+            Prelude.<$> (x Data..:? "addedToClusterTime")
+            Prelude.<*> (x Data..:? "brokerNodeInfo")
+            Prelude.<*> (x Data..:? "instanceType")
+            Prelude.<*> (x Data..:? "nodeARN")
+            Prelude.<*> (x Data..:? "nodeType")
+            Prelude.<*> (x Data..:? "zookeeperNodeInfo")
+      )
+
+instance Prelude.Hashable NodeInfo where
+  hashWithSalt _salt NodeInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` addedToClusterTime
+      `Prelude.hashWithSalt` brokerNodeInfo
+      `Prelude.hashWithSalt` instanceType
+      `Prelude.hashWithSalt` nodeARN
+      `Prelude.hashWithSalt` nodeType
+      `Prelude.hashWithSalt` zookeeperNodeInfo
+
+instance Prelude.NFData NodeInfo where
+  rnf NodeInfo' {..} =
+    Prelude.rnf addedToClusterTime
+      `Prelude.seq` Prelude.rnf brokerNodeInfo
+      `Prelude.seq` Prelude.rnf instanceType
+      `Prelude.seq` Prelude.rnf nodeARN
+      `Prelude.seq` Prelude.rnf nodeType
+      `Prelude.seq` Prelude.rnf zookeeperNodeInfo
diff --git a/gen/Amazonka/Kafka/Types/NodeType.hs b/gen/Amazonka/Kafka/Types/NodeType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/NodeType.hs
@@ -0,0 +1,67 @@
+{-# 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.Kafka.Types.NodeType
+-- 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.Kafka.Types.NodeType
+  ( NodeType
+      ( ..,
+        NodeType_BROKER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The broker or Zookeeper node.
+newtype NodeType = NodeType'
+  { fromNodeType ::
+      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 NodeType_BROKER :: NodeType
+pattern NodeType_BROKER = NodeType' "BROKER"
+
+{-# COMPLETE
+  NodeType_BROKER,
+  NodeType'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/OpenMonitoring.hs b/gen/Amazonka/Kafka/Types/OpenMonitoring.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/OpenMonitoring.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.OpenMonitoring
+-- 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.Kafka.Types.OpenMonitoring where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.Prometheus
+import qualified Amazonka.Prelude as Prelude
+
+-- | JMX and Node monitoring for the MSK cluster.
+--
+-- /See:/ 'newOpenMonitoring' smart constructor.
+data OpenMonitoring = OpenMonitoring'
+  { -- | Prometheus settings.
+    prometheus :: Prometheus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OpenMonitoring' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'prometheus', 'openMonitoring_prometheus' - Prometheus settings.
+newOpenMonitoring ::
+  -- | 'prometheus'
+  Prometheus ->
+  OpenMonitoring
+newOpenMonitoring pPrometheus_ =
+  OpenMonitoring' {prometheus = pPrometheus_}
+
+-- | Prometheus settings.
+openMonitoring_prometheus :: Lens.Lens' OpenMonitoring Prometheus
+openMonitoring_prometheus = Lens.lens (\OpenMonitoring' {prometheus} -> prometheus) (\s@OpenMonitoring' {} a -> s {prometheus = a} :: OpenMonitoring)
+
+instance Data.FromJSON OpenMonitoring where
+  parseJSON =
+    Data.withObject
+      "OpenMonitoring"
+      ( \x ->
+          OpenMonitoring' Prelude.<$> (x Data..: "prometheus")
+      )
+
+instance Prelude.Hashable OpenMonitoring where
+  hashWithSalt _salt OpenMonitoring' {..} =
+    _salt `Prelude.hashWithSalt` prometheus
+
+instance Prelude.NFData OpenMonitoring where
+  rnf OpenMonitoring' {..} = Prelude.rnf prometheus
diff --git a/gen/Amazonka/Kafka/Types/OpenMonitoringInfo.hs b/gen/Amazonka/Kafka/Types/OpenMonitoringInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/OpenMonitoringInfo.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.OpenMonitoringInfo
+-- 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.Kafka.Types.OpenMonitoringInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.PrometheusInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | JMX and Node monitoring for the MSK cluster.
+--
+-- /See:/ 'newOpenMonitoringInfo' smart constructor.
+data OpenMonitoringInfo = OpenMonitoringInfo'
+  { -- | Prometheus settings.
+    prometheus :: PrometheusInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OpenMonitoringInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'prometheus', 'openMonitoringInfo_prometheus' - Prometheus settings.
+newOpenMonitoringInfo ::
+  -- | 'prometheus'
+  PrometheusInfo ->
+  OpenMonitoringInfo
+newOpenMonitoringInfo pPrometheus_ =
+  OpenMonitoringInfo' {prometheus = pPrometheus_}
+
+-- | Prometheus settings.
+openMonitoringInfo_prometheus :: Lens.Lens' OpenMonitoringInfo PrometheusInfo
+openMonitoringInfo_prometheus = Lens.lens (\OpenMonitoringInfo' {prometheus} -> prometheus) (\s@OpenMonitoringInfo' {} a -> s {prometheus = a} :: OpenMonitoringInfo)
+
+instance Data.FromJSON OpenMonitoringInfo where
+  parseJSON =
+    Data.withObject
+      "OpenMonitoringInfo"
+      ( \x ->
+          OpenMonitoringInfo'
+            Prelude.<$> (x Data..: "prometheus")
+      )
+
+instance Prelude.Hashable OpenMonitoringInfo where
+  hashWithSalt _salt OpenMonitoringInfo' {..} =
+    _salt `Prelude.hashWithSalt` prometheus
+
+instance Prelude.NFData OpenMonitoringInfo where
+  rnf OpenMonitoringInfo' {..} = Prelude.rnf prometheus
+
+instance Data.ToJSON OpenMonitoringInfo where
+  toJSON OpenMonitoringInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("prometheus" Data..= prometheus)]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Prometheus.hs b/gen/Amazonka/Kafka/Types/Prometheus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Prometheus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Prometheus
+-- 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.Kafka.Types.Prometheus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.JmxExporter
+import Amazonka.Kafka.Types.NodeExporter
+import qualified Amazonka.Prelude as Prelude
+
+-- | Prometheus settings.
+--
+-- /See:/ 'newPrometheus' smart constructor.
+data Prometheus = Prometheus'
+  { -- | Indicates whether you want to turn on or turn off the JMX Exporter.
+    jmxExporter :: Prelude.Maybe JmxExporter,
+    -- | Indicates whether you want to turn on or turn off the Node Exporter.
+    nodeExporter :: Prelude.Maybe NodeExporter
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Prometheus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jmxExporter', 'prometheus_jmxExporter' - Indicates whether you want to turn on or turn off the JMX Exporter.
+--
+-- 'nodeExporter', 'prometheus_nodeExporter' - Indicates whether you want to turn on or turn off the Node Exporter.
+newPrometheus ::
+  Prometheus
+newPrometheus =
+  Prometheus'
+    { jmxExporter = Prelude.Nothing,
+      nodeExporter = Prelude.Nothing
+    }
+
+-- | Indicates whether you want to turn on or turn off the JMX Exporter.
+prometheus_jmxExporter :: Lens.Lens' Prometheus (Prelude.Maybe JmxExporter)
+prometheus_jmxExporter = Lens.lens (\Prometheus' {jmxExporter} -> jmxExporter) (\s@Prometheus' {} a -> s {jmxExporter = a} :: Prometheus)
+
+-- | Indicates whether you want to turn on or turn off the Node Exporter.
+prometheus_nodeExporter :: Lens.Lens' Prometheus (Prelude.Maybe NodeExporter)
+prometheus_nodeExporter = Lens.lens (\Prometheus' {nodeExporter} -> nodeExporter) (\s@Prometheus' {} a -> s {nodeExporter = a} :: Prometheus)
+
+instance Data.FromJSON Prometheus where
+  parseJSON =
+    Data.withObject
+      "Prometheus"
+      ( \x ->
+          Prometheus'
+            Prelude.<$> (x Data..:? "jmxExporter")
+            Prelude.<*> (x Data..:? "nodeExporter")
+      )
+
+instance Prelude.Hashable Prometheus where
+  hashWithSalt _salt Prometheus' {..} =
+    _salt
+      `Prelude.hashWithSalt` jmxExporter
+      `Prelude.hashWithSalt` nodeExporter
+
+instance Prelude.NFData Prometheus where
+  rnf Prometheus' {..} =
+    Prelude.rnf jmxExporter
+      `Prelude.seq` Prelude.rnf nodeExporter
diff --git a/gen/Amazonka/Kafka/Types/PrometheusInfo.hs b/gen/Amazonka/Kafka/Types/PrometheusInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/PrometheusInfo.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.Kafka.Types.PrometheusInfo
+-- 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.Kafka.Types.PrometheusInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.JmxExporterInfo
+import Amazonka.Kafka.Types.NodeExporterInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Prometheus settings.
+--
+-- /See:/ 'newPrometheusInfo' smart constructor.
+data PrometheusInfo = PrometheusInfo'
+  { -- | Indicates whether you want to turn on or turn off the JMX Exporter.
+    jmxExporter :: Prelude.Maybe JmxExporterInfo,
+    -- | Indicates whether you want to turn on or turn off the Node Exporter.
+    nodeExporter :: Prelude.Maybe NodeExporterInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PrometheusInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jmxExporter', 'prometheusInfo_jmxExporter' - Indicates whether you want to turn on or turn off the JMX Exporter.
+--
+-- 'nodeExporter', 'prometheusInfo_nodeExporter' - Indicates whether you want to turn on or turn off the Node Exporter.
+newPrometheusInfo ::
+  PrometheusInfo
+newPrometheusInfo =
+  PrometheusInfo'
+    { jmxExporter = Prelude.Nothing,
+      nodeExporter = Prelude.Nothing
+    }
+
+-- | Indicates whether you want to turn on or turn off the JMX Exporter.
+prometheusInfo_jmxExporter :: Lens.Lens' PrometheusInfo (Prelude.Maybe JmxExporterInfo)
+prometheusInfo_jmxExporter = Lens.lens (\PrometheusInfo' {jmxExporter} -> jmxExporter) (\s@PrometheusInfo' {} a -> s {jmxExporter = a} :: PrometheusInfo)
+
+-- | Indicates whether you want to turn on or turn off the Node Exporter.
+prometheusInfo_nodeExporter :: Lens.Lens' PrometheusInfo (Prelude.Maybe NodeExporterInfo)
+prometheusInfo_nodeExporter = Lens.lens (\PrometheusInfo' {nodeExporter} -> nodeExporter) (\s@PrometheusInfo' {} a -> s {nodeExporter = a} :: PrometheusInfo)
+
+instance Data.FromJSON PrometheusInfo where
+  parseJSON =
+    Data.withObject
+      "PrometheusInfo"
+      ( \x ->
+          PrometheusInfo'
+            Prelude.<$> (x Data..:? "jmxExporter")
+            Prelude.<*> (x Data..:? "nodeExporter")
+      )
+
+instance Prelude.Hashable PrometheusInfo where
+  hashWithSalt _salt PrometheusInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` jmxExporter
+      `Prelude.hashWithSalt` nodeExporter
+
+instance Prelude.NFData PrometheusInfo where
+  rnf PrometheusInfo' {..} =
+    Prelude.rnf jmxExporter
+      `Prelude.seq` Prelude.rnf nodeExporter
+
+instance Data.ToJSON PrometheusInfo where
+  toJSON PrometheusInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("jmxExporter" Data..=) Prelude.<$> jmxExporter,
+            ("nodeExporter" Data..=) Prelude.<$> nodeExporter
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Provisioned.hs b/gen/Amazonka/Kafka/Types/Provisioned.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Provisioned.hs
@@ -0,0 +1,216 @@
+{-# 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.Kafka.Types.Provisioned
+-- 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.Kafka.Types.Provisioned where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerNodeGroupInfo
+import Amazonka.Kafka.Types.BrokerSoftwareInfo
+import Amazonka.Kafka.Types.ClientAuthentication
+import Amazonka.Kafka.Types.EncryptionInfo
+import Amazonka.Kafka.Types.EnhancedMonitoring
+import Amazonka.Kafka.Types.LoggingInfo
+import Amazonka.Kafka.Types.OpenMonitoringInfo
+import Amazonka.Kafka.Types.StorageMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provisioned cluster.
+--
+-- /See:/ 'newProvisioned' smart constructor.
+data Provisioned = Provisioned'
+  { -- | Includes all client authentication information.
+    clientAuthentication :: Prelude.Maybe ClientAuthentication,
+    -- | Information about the Apache Kafka version deployed on the brokers.
+    currentBrokerSoftwareInfo :: Prelude.Maybe BrokerSoftwareInfo,
+    -- | Includes all encryption-related information.
+    encryptionInfo :: Prelude.Maybe EncryptionInfo,
+    -- | Specifies the level of monitoring for the MSK cluster. The possible
+    -- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+    -- PER_TOPIC_PER_PARTITION.
+    enhancedMonitoring :: Prelude.Maybe EnhancedMonitoring,
+    -- | Log delivery information for the cluster.
+    loggingInfo :: Prelude.Maybe LoggingInfo,
+    -- | The settings for open monitoring.
+    openMonitoring :: Prelude.Maybe OpenMonitoringInfo,
+    -- | This controls storage mode for supported storage tiers.
+    storageMode :: Prelude.Maybe StorageMode,
+    -- | The connection string to use to connect to the Apache ZooKeeper cluster.
+    zookeeperConnectString :: Prelude.Maybe Prelude.Text,
+    -- | The connection string to use to connect to the Apache ZooKeeper cluster
+    -- on a TLS port.
+    zookeeperConnectStringTls :: Prelude.Maybe Prelude.Text,
+    -- | Information about the brokers.
+    brokerNodeGroupInfo :: BrokerNodeGroupInfo,
+    -- | The number of broker nodes in the cluster.
+    numberOfBrokerNodes :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Provisioned' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientAuthentication', 'provisioned_clientAuthentication' - Includes all client authentication information.
+--
+-- 'currentBrokerSoftwareInfo', 'provisioned_currentBrokerSoftwareInfo' - Information about the Apache Kafka version deployed on the brokers.
+--
+-- 'encryptionInfo', 'provisioned_encryptionInfo' - Includes all encryption-related information.
+--
+-- 'enhancedMonitoring', 'provisioned_enhancedMonitoring' - Specifies the level of monitoring for the MSK cluster. The possible
+-- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+-- PER_TOPIC_PER_PARTITION.
+--
+-- 'loggingInfo', 'provisioned_loggingInfo' - Log delivery information for the cluster.
+--
+-- 'openMonitoring', 'provisioned_openMonitoring' - The settings for open monitoring.
+--
+-- 'storageMode', 'provisioned_storageMode' - This controls storage mode for supported storage tiers.
+--
+-- 'zookeeperConnectString', 'provisioned_zookeeperConnectString' - The connection string to use to connect to the Apache ZooKeeper cluster.
+--
+-- 'zookeeperConnectStringTls', 'provisioned_zookeeperConnectStringTls' - The connection string to use to connect to the Apache ZooKeeper cluster
+-- on a TLS port.
+--
+-- 'brokerNodeGroupInfo', 'provisioned_brokerNodeGroupInfo' - Information about the brokers.
+--
+-- 'numberOfBrokerNodes', 'provisioned_numberOfBrokerNodes' - The number of broker nodes in the cluster.
+newProvisioned ::
+  -- | 'brokerNodeGroupInfo'
+  BrokerNodeGroupInfo ->
+  -- | 'numberOfBrokerNodes'
+  Prelude.Natural ->
+  Provisioned
+newProvisioned
+  pBrokerNodeGroupInfo_
+  pNumberOfBrokerNodes_ =
+    Provisioned'
+      { clientAuthentication =
+          Prelude.Nothing,
+        currentBrokerSoftwareInfo = Prelude.Nothing,
+        encryptionInfo = Prelude.Nothing,
+        enhancedMonitoring = Prelude.Nothing,
+        loggingInfo = Prelude.Nothing,
+        openMonitoring = Prelude.Nothing,
+        storageMode = Prelude.Nothing,
+        zookeeperConnectString = Prelude.Nothing,
+        zookeeperConnectStringTls = Prelude.Nothing,
+        brokerNodeGroupInfo = pBrokerNodeGroupInfo_,
+        numberOfBrokerNodes = pNumberOfBrokerNodes_
+      }
+
+-- | Includes all client authentication information.
+provisioned_clientAuthentication :: Lens.Lens' Provisioned (Prelude.Maybe ClientAuthentication)
+provisioned_clientAuthentication = Lens.lens (\Provisioned' {clientAuthentication} -> clientAuthentication) (\s@Provisioned' {} a -> s {clientAuthentication = a} :: Provisioned)
+
+-- | Information about the Apache Kafka version deployed on the brokers.
+provisioned_currentBrokerSoftwareInfo :: Lens.Lens' Provisioned (Prelude.Maybe BrokerSoftwareInfo)
+provisioned_currentBrokerSoftwareInfo = Lens.lens (\Provisioned' {currentBrokerSoftwareInfo} -> currentBrokerSoftwareInfo) (\s@Provisioned' {} a -> s {currentBrokerSoftwareInfo = a} :: Provisioned)
+
+-- | Includes all encryption-related information.
+provisioned_encryptionInfo :: Lens.Lens' Provisioned (Prelude.Maybe EncryptionInfo)
+provisioned_encryptionInfo = Lens.lens (\Provisioned' {encryptionInfo} -> encryptionInfo) (\s@Provisioned' {} a -> s {encryptionInfo = a} :: Provisioned)
+
+-- | Specifies the level of monitoring for the MSK cluster. The possible
+-- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+-- PER_TOPIC_PER_PARTITION.
+provisioned_enhancedMonitoring :: Lens.Lens' Provisioned (Prelude.Maybe EnhancedMonitoring)
+provisioned_enhancedMonitoring = Lens.lens (\Provisioned' {enhancedMonitoring} -> enhancedMonitoring) (\s@Provisioned' {} a -> s {enhancedMonitoring = a} :: Provisioned)
+
+-- | Log delivery information for the cluster.
+provisioned_loggingInfo :: Lens.Lens' Provisioned (Prelude.Maybe LoggingInfo)
+provisioned_loggingInfo = Lens.lens (\Provisioned' {loggingInfo} -> loggingInfo) (\s@Provisioned' {} a -> s {loggingInfo = a} :: Provisioned)
+
+-- | The settings for open monitoring.
+provisioned_openMonitoring :: Lens.Lens' Provisioned (Prelude.Maybe OpenMonitoringInfo)
+provisioned_openMonitoring = Lens.lens (\Provisioned' {openMonitoring} -> openMonitoring) (\s@Provisioned' {} a -> s {openMonitoring = a} :: Provisioned)
+
+-- | This controls storage mode for supported storage tiers.
+provisioned_storageMode :: Lens.Lens' Provisioned (Prelude.Maybe StorageMode)
+provisioned_storageMode = Lens.lens (\Provisioned' {storageMode} -> storageMode) (\s@Provisioned' {} a -> s {storageMode = a} :: Provisioned)
+
+-- | The connection string to use to connect to the Apache ZooKeeper cluster.
+provisioned_zookeeperConnectString :: Lens.Lens' Provisioned (Prelude.Maybe Prelude.Text)
+provisioned_zookeeperConnectString = Lens.lens (\Provisioned' {zookeeperConnectString} -> zookeeperConnectString) (\s@Provisioned' {} a -> s {zookeeperConnectString = a} :: Provisioned)
+
+-- | The connection string to use to connect to the Apache ZooKeeper cluster
+-- on a TLS port.
+provisioned_zookeeperConnectStringTls :: Lens.Lens' Provisioned (Prelude.Maybe Prelude.Text)
+provisioned_zookeeperConnectStringTls = Lens.lens (\Provisioned' {zookeeperConnectStringTls} -> zookeeperConnectStringTls) (\s@Provisioned' {} a -> s {zookeeperConnectStringTls = a} :: Provisioned)
+
+-- | Information about the brokers.
+provisioned_brokerNodeGroupInfo :: Lens.Lens' Provisioned BrokerNodeGroupInfo
+provisioned_brokerNodeGroupInfo = Lens.lens (\Provisioned' {brokerNodeGroupInfo} -> brokerNodeGroupInfo) (\s@Provisioned' {} a -> s {brokerNodeGroupInfo = a} :: Provisioned)
+
+-- | The number of broker nodes in the cluster.
+provisioned_numberOfBrokerNodes :: Lens.Lens' Provisioned Prelude.Natural
+provisioned_numberOfBrokerNodes = Lens.lens (\Provisioned' {numberOfBrokerNodes} -> numberOfBrokerNodes) (\s@Provisioned' {} a -> s {numberOfBrokerNodes = a} :: Provisioned)
+
+instance Data.FromJSON Provisioned where
+  parseJSON =
+    Data.withObject
+      "Provisioned"
+      ( \x ->
+          Provisioned'
+            Prelude.<$> (x Data..:? "clientAuthentication")
+            Prelude.<*> (x Data..:? "currentBrokerSoftwareInfo")
+            Prelude.<*> (x Data..:? "encryptionInfo")
+            Prelude.<*> (x Data..:? "enhancedMonitoring")
+            Prelude.<*> (x Data..:? "loggingInfo")
+            Prelude.<*> (x Data..:? "openMonitoring")
+            Prelude.<*> (x Data..:? "storageMode")
+            Prelude.<*> (x Data..:? "zookeeperConnectString")
+            Prelude.<*> (x Data..:? "zookeeperConnectStringTls")
+            Prelude.<*> (x Data..: "brokerNodeGroupInfo")
+            Prelude.<*> (x Data..: "numberOfBrokerNodes")
+      )
+
+instance Prelude.Hashable Provisioned where
+  hashWithSalt _salt Provisioned' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` currentBrokerSoftwareInfo
+      `Prelude.hashWithSalt` encryptionInfo
+      `Prelude.hashWithSalt` enhancedMonitoring
+      `Prelude.hashWithSalt` loggingInfo
+      `Prelude.hashWithSalt` openMonitoring
+      `Prelude.hashWithSalt` storageMode
+      `Prelude.hashWithSalt` zookeeperConnectString
+      `Prelude.hashWithSalt` zookeeperConnectStringTls
+      `Prelude.hashWithSalt` brokerNodeGroupInfo
+      `Prelude.hashWithSalt` numberOfBrokerNodes
+
+instance Prelude.NFData Provisioned where
+  rnf Provisioned' {..} =
+    Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf currentBrokerSoftwareInfo
+      `Prelude.seq` Prelude.rnf encryptionInfo
+      `Prelude.seq` Prelude.rnf enhancedMonitoring
+      `Prelude.seq` Prelude.rnf loggingInfo
+      `Prelude.seq` Prelude.rnf openMonitoring
+      `Prelude.seq` Prelude.rnf storageMode
+      `Prelude.seq` Prelude.rnf zookeeperConnectString
+      `Prelude.seq` Prelude.rnf zookeeperConnectStringTls
+      `Prelude.seq` Prelude.rnf brokerNodeGroupInfo
+      `Prelude.seq` Prelude.rnf numberOfBrokerNodes
diff --git a/gen/Amazonka/Kafka/Types/ProvisionedRequest.hs b/gen/Amazonka/Kafka/Types/ProvisionedRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ProvisionedRequest.hs
@@ -0,0 +1,213 @@
+{-# 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.Kafka.Types.ProvisionedRequest
+-- 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.Kafka.Types.ProvisionedRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.BrokerNodeGroupInfo
+import Amazonka.Kafka.Types.ClientAuthentication
+import Amazonka.Kafka.Types.ConfigurationInfo
+import Amazonka.Kafka.Types.EncryptionInfo
+import Amazonka.Kafka.Types.EnhancedMonitoring
+import Amazonka.Kafka.Types.LoggingInfo
+import Amazonka.Kafka.Types.OpenMonitoringInfo
+import Amazonka.Kafka.Types.StorageMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provisioned cluster request.
+--
+-- /See:/ 'newProvisionedRequest' smart constructor.
+data ProvisionedRequest = ProvisionedRequest'
+  { -- | Includes all client authentication information.
+    clientAuthentication :: Prelude.Maybe ClientAuthentication,
+    -- | Represents the configuration that you want Amazon MSK to use for the
+    -- brokers in a cluster.
+    configurationInfo :: Prelude.Maybe ConfigurationInfo,
+    -- | Includes all encryption-related information.
+    encryptionInfo :: Prelude.Maybe EncryptionInfo,
+    -- | Specifies the level of monitoring for the MSK cluster. The possible
+    -- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+    -- PER_TOPIC_PER_PARTITION.
+    enhancedMonitoring :: Prelude.Maybe EnhancedMonitoring,
+    -- | Log delivery information for the cluster.
+    loggingInfo :: Prelude.Maybe LoggingInfo,
+    -- | The settings for open monitoring.
+    openMonitoring :: Prelude.Maybe OpenMonitoringInfo,
+    -- | This controls storage mode for supported storage tiers.
+    storageMode :: Prelude.Maybe StorageMode,
+    -- | Information about the brokers.
+    brokerNodeGroupInfo :: BrokerNodeGroupInfo,
+    -- | The Apache Kafka version that you want for the cluster.
+    kafkaVersion :: Prelude.Text,
+    -- | The number of broker nodes in the cluster.
+    numberOfBrokerNodes :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProvisionedRequest' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientAuthentication', 'provisionedRequest_clientAuthentication' - Includes all client authentication information.
+--
+-- 'configurationInfo', 'provisionedRequest_configurationInfo' - Represents the configuration that you want Amazon MSK to use for the
+-- brokers in a cluster.
+--
+-- 'encryptionInfo', 'provisionedRequest_encryptionInfo' - Includes all encryption-related information.
+--
+-- 'enhancedMonitoring', 'provisionedRequest_enhancedMonitoring' - Specifies the level of monitoring for the MSK cluster. The possible
+-- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+-- PER_TOPIC_PER_PARTITION.
+--
+-- 'loggingInfo', 'provisionedRequest_loggingInfo' - Log delivery information for the cluster.
+--
+-- 'openMonitoring', 'provisionedRequest_openMonitoring' - The settings for open monitoring.
+--
+-- 'storageMode', 'provisionedRequest_storageMode' - This controls storage mode for supported storage tiers.
+--
+-- 'brokerNodeGroupInfo', 'provisionedRequest_brokerNodeGroupInfo' - Information about the brokers.
+--
+-- 'kafkaVersion', 'provisionedRequest_kafkaVersion' - The Apache Kafka version that you want for the cluster.
+--
+-- 'numberOfBrokerNodes', 'provisionedRequest_numberOfBrokerNodes' - The number of broker nodes in the cluster.
+newProvisionedRequest ::
+  -- | 'brokerNodeGroupInfo'
+  BrokerNodeGroupInfo ->
+  -- | 'kafkaVersion'
+  Prelude.Text ->
+  -- | 'numberOfBrokerNodes'
+  Prelude.Natural ->
+  ProvisionedRequest
+newProvisionedRequest
+  pBrokerNodeGroupInfo_
+  pKafkaVersion_
+  pNumberOfBrokerNodes_ =
+    ProvisionedRequest'
+      { clientAuthentication =
+          Prelude.Nothing,
+        configurationInfo = Prelude.Nothing,
+        encryptionInfo = Prelude.Nothing,
+        enhancedMonitoring = Prelude.Nothing,
+        loggingInfo = Prelude.Nothing,
+        openMonitoring = Prelude.Nothing,
+        storageMode = Prelude.Nothing,
+        brokerNodeGroupInfo = pBrokerNodeGroupInfo_,
+        kafkaVersion = pKafkaVersion_,
+        numberOfBrokerNodes = pNumberOfBrokerNodes_
+      }
+
+-- | Includes all client authentication information.
+provisionedRequest_clientAuthentication :: Lens.Lens' ProvisionedRequest (Prelude.Maybe ClientAuthentication)
+provisionedRequest_clientAuthentication = Lens.lens (\ProvisionedRequest' {clientAuthentication} -> clientAuthentication) (\s@ProvisionedRequest' {} a -> s {clientAuthentication = a} :: ProvisionedRequest)
+
+-- | Represents the configuration that you want Amazon MSK to use for the
+-- brokers in a cluster.
+provisionedRequest_configurationInfo :: Lens.Lens' ProvisionedRequest (Prelude.Maybe ConfigurationInfo)
+provisionedRequest_configurationInfo = Lens.lens (\ProvisionedRequest' {configurationInfo} -> configurationInfo) (\s@ProvisionedRequest' {} a -> s {configurationInfo = a} :: ProvisionedRequest)
+
+-- | Includes all encryption-related information.
+provisionedRequest_encryptionInfo :: Lens.Lens' ProvisionedRequest (Prelude.Maybe EncryptionInfo)
+provisionedRequest_encryptionInfo = Lens.lens (\ProvisionedRequest' {encryptionInfo} -> encryptionInfo) (\s@ProvisionedRequest' {} a -> s {encryptionInfo = a} :: ProvisionedRequest)
+
+-- | Specifies the level of monitoring for the MSK cluster. The possible
+-- values are DEFAULT, PER_BROKER, PER_TOPIC_PER_BROKER, and
+-- PER_TOPIC_PER_PARTITION.
+provisionedRequest_enhancedMonitoring :: Lens.Lens' ProvisionedRequest (Prelude.Maybe EnhancedMonitoring)
+provisionedRequest_enhancedMonitoring = Lens.lens (\ProvisionedRequest' {enhancedMonitoring} -> enhancedMonitoring) (\s@ProvisionedRequest' {} a -> s {enhancedMonitoring = a} :: ProvisionedRequest)
+
+-- | Log delivery information for the cluster.
+provisionedRequest_loggingInfo :: Lens.Lens' ProvisionedRequest (Prelude.Maybe LoggingInfo)
+provisionedRequest_loggingInfo = Lens.lens (\ProvisionedRequest' {loggingInfo} -> loggingInfo) (\s@ProvisionedRequest' {} a -> s {loggingInfo = a} :: ProvisionedRequest)
+
+-- | The settings for open monitoring.
+provisionedRequest_openMonitoring :: Lens.Lens' ProvisionedRequest (Prelude.Maybe OpenMonitoringInfo)
+provisionedRequest_openMonitoring = Lens.lens (\ProvisionedRequest' {openMonitoring} -> openMonitoring) (\s@ProvisionedRequest' {} a -> s {openMonitoring = a} :: ProvisionedRequest)
+
+-- | This controls storage mode for supported storage tiers.
+provisionedRequest_storageMode :: Lens.Lens' ProvisionedRequest (Prelude.Maybe StorageMode)
+provisionedRequest_storageMode = Lens.lens (\ProvisionedRequest' {storageMode} -> storageMode) (\s@ProvisionedRequest' {} a -> s {storageMode = a} :: ProvisionedRequest)
+
+-- | Information about the brokers.
+provisionedRequest_brokerNodeGroupInfo :: Lens.Lens' ProvisionedRequest BrokerNodeGroupInfo
+provisionedRequest_brokerNodeGroupInfo = Lens.lens (\ProvisionedRequest' {brokerNodeGroupInfo} -> brokerNodeGroupInfo) (\s@ProvisionedRequest' {} a -> s {brokerNodeGroupInfo = a} :: ProvisionedRequest)
+
+-- | The Apache Kafka version that you want for the cluster.
+provisionedRequest_kafkaVersion :: Lens.Lens' ProvisionedRequest Prelude.Text
+provisionedRequest_kafkaVersion = Lens.lens (\ProvisionedRequest' {kafkaVersion} -> kafkaVersion) (\s@ProvisionedRequest' {} a -> s {kafkaVersion = a} :: ProvisionedRequest)
+
+-- | The number of broker nodes in the cluster.
+provisionedRequest_numberOfBrokerNodes :: Lens.Lens' ProvisionedRequest Prelude.Natural
+provisionedRequest_numberOfBrokerNodes = Lens.lens (\ProvisionedRequest' {numberOfBrokerNodes} -> numberOfBrokerNodes) (\s@ProvisionedRequest' {} a -> s {numberOfBrokerNodes = a} :: ProvisionedRequest)
+
+instance Prelude.Hashable ProvisionedRequest where
+  hashWithSalt _salt ProvisionedRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` configurationInfo
+      `Prelude.hashWithSalt` encryptionInfo
+      `Prelude.hashWithSalt` enhancedMonitoring
+      `Prelude.hashWithSalt` loggingInfo
+      `Prelude.hashWithSalt` openMonitoring
+      `Prelude.hashWithSalt` storageMode
+      `Prelude.hashWithSalt` brokerNodeGroupInfo
+      `Prelude.hashWithSalt` kafkaVersion
+      `Prelude.hashWithSalt` numberOfBrokerNodes
+
+instance Prelude.NFData ProvisionedRequest where
+  rnf ProvisionedRequest' {..} =
+    Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf configurationInfo
+      `Prelude.seq` Prelude.rnf encryptionInfo
+      `Prelude.seq` Prelude.rnf enhancedMonitoring
+      `Prelude.seq` Prelude.rnf loggingInfo
+      `Prelude.seq` Prelude.rnf openMonitoring
+      `Prelude.seq` Prelude.rnf storageMode
+      `Prelude.seq` Prelude.rnf brokerNodeGroupInfo
+      `Prelude.seq` Prelude.rnf kafkaVersion
+      `Prelude.seq` Prelude.rnf numberOfBrokerNodes
+
+instance Data.ToJSON ProvisionedRequest where
+  toJSON ProvisionedRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientAuthentication" Data..=)
+              Prelude.<$> clientAuthentication,
+            ("configurationInfo" Data..=)
+              Prelude.<$> configurationInfo,
+            ("encryptionInfo" Data..=)
+              Prelude.<$> encryptionInfo,
+            ("enhancedMonitoring" Data..=)
+              Prelude.<$> enhancedMonitoring,
+            ("loggingInfo" Data..=) Prelude.<$> loggingInfo,
+            ("openMonitoring" Data..=)
+              Prelude.<$> openMonitoring,
+            ("storageMode" Data..=) Prelude.<$> storageMode,
+            Prelude.Just
+              ("brokerNodeGroupInfo" Data..= brokerNodeGroupInfo),
+            Prelude.Just ("kafkaVersion" Data..= kafkaVersion),
+            Prelude.Just
+              ("numberOfBrokerNodes" Data..= numberOfBrokerNodes)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/ProvisionedThroughput.hs b/gen/Amazonka/Kafka/Types/ProvisionedThroughput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ProvisionedThroughput.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.ProvisionedThroughput
+-- 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.Kafka.Types.ProvisionedThroughput 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
+
+-- | Contains information about provisioned throughput for EBS storage
+-- volumes attached to kafka broker nodes.
+--
+-- /See:/ 'newProvisionedThroughput' smart constructor.
+data ProvisionedThroughput = ProvisionedThroughput'
+  { -- | Provisioned throughput is enabled or not.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | Throughput value of the EBS volumes for the data drive on each kafka
+    -- broker node in MiB per second.
+    volumeThroughput :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProvisionedThroughput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'provisionedThroughput_enabled' - Provisioned throughput is enabled or not.
+--
+-- 'volumeThroughput', 'provisionedThroughput_volumeThroughput' - Throughput value of the EBS volumes for the data drive on each kafka
+-- broker node in MiB per second.
+newProvisionedThroughput ::
+  ProvisionedThroughput
+newProvisionedThroughput =
+  ProvisionedThroughput'
+    { enabled = Prelude.Nothing,
+      volumeThroughput = Prelude.Nothing
+    }
+
+-- | Provisioned throughput is enabled or not.
+provisionedThroughput_enabled :: Lens.Lens' ProvisionedThroughput (Prelude.Maybe Prelude.Bool)
+provisionedThroughput_enabled = Lens.lens (\ProvisionedThroughput' {enabled} -> enabled) (\s@ProvisionedThroughput' {} a -> s {enabled = a} :: ProvisionedThroughput)
+
+-- | Throughput value of the EBS volumes for the data drive on each kafka
+-- broker node in MiB per second.
+provisionedThroughput_volumeThroughput :: Lens.Lens' ProvisionedThroughput (Prelude.Maybe Prelude.Int)
+provisionedThroughput_volumeThroughput = Lens.lens (\ProvisionedThroughput' {volumeThroughput} -> volumeThroughput) (\s@ProvisionedThroughput' {} a -> s {volumeThroughput = a} :: ProvisionedThroughput)
+
+instance Data.FromJSON ProvisionedThroughput where
+  parseJSON =
+    Data.withObject
+      "ProvisionedThroughput"
+      ( \x ->
+          ProvisionedThroughput'
+            Prelude.<$> (x Data..:? "enabled")
+            Prelude.<*> (x Data..:? "volumeThroughput")
+      )
+
+instance Prelude.Hashable ProvisionedThroughput where
+  hashWithSalt _salt ProvisionedThroughput' {..} =
+    _salt
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` volumeThroughput
+
+instance Prelude.NFData ProvisionedThroughput where
+  rnf ProvisionedThroughput' {..} =
+    Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf volumeThroughput
+
+instance Data.ToJSON ProvisionedThroughput where
+  toJSON ProvisionedThroughput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("enabled" Data..=) Prelude.<$> enabled,
+            ("volumeThroughput" Data..=)
+              Prelude.<$> volumeThroughput
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/PublicAccess.hs b/gen/Amazonka/Kafka/Types/PublicAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/PublicAccess.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.PublicAccess
+-- 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.Kafka.Types.PublicAccess 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
+
+-- | Public access control for brokers.
+--
+-- /See:/ 'newPublicAccess' smart constructor.
+data PublicAccess = PublicAccess'
+  { -- | The value DISABLED indicates that public access is turned off.
+    -- SERVICE_PROVIDED_EIPS indicates that public access is turned on.
+    type' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PublicAccess' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'type'', 'publicAccess_type' - The value DISABLED indicates that public access is turned off.
+-- SERVICE_PROVIDED_EIPS indicates that public access is turned on.
+newPublicAccess ::
+  PublicAccess
+newPublicAccess =
+  PublicAccess' {type' = Prelude.Nothing}
+
+-- | The value DISABLED indicates that public access is turned off.
+-- SERVICE_PROVIDED_EIPS indicates that public access is turned on.
+publicAccess_type :: Lens.Lens' PublicAccess (Prelude.Maybe Prelude.Text)
+publicAccess_type = Lens.lens (\PublicAccess' {type'} -> type') (\s@PublicAccess' {} a -> s {type' = a} :: PublicAccess)
+
+instance Data.FromJSON PublicAccess where
+  parseJSON =
+    Data.withObject
+      "PublicAccess"
+      ( \x ->
+          PublicAccess' Prelude.<$> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable PublicAccess where
+  hashWithSalt _salt PublicAccess' {..} =
+    _salt `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData PublicAccess where
+  rnf PublicAccess' {..} = Prelude.rnf type'
+
+instance Data.ToJSON PublicAccess where
+  toJSON PublicAccess' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("type" Data..=) Prelude.<$> type']
+      )
diff --git a/gen/Amazonka/Kafka/Types/S3.hs b/gen/Amazonka/Kafka/Types/S3.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/S3.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.S3
+-- 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.Kafka.Types.S3 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
+
+-- | /See:/ 'newS3' smart constructor.
+data S3 = S3'
+  { bucket :: Prelude.Maybe Prelude.Text,
+    prefix :: Prelude.Maybe Prelude.Text,
+    enabled :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bucket', 's3_bucket' - Undocumented member.
+--
+-- 'prefix', 's3_prefix' - Undocumented member.
+--
+-- 'enabled', 's3_enabled' - Undocumented member.
+newS3 ::
+  -- | 'enabled'
+  Prelude.Bool ->
+  S3
+newS3 pEnabled_ =
+  S3'
+    { bucket = Prelude.Nothing,
+      prefix = Prelude.Nothing,
+      enabled = pEnabled_
+    }
+
+-- | Undocumented member.
+s3_bucket :: Lens.Lens' S3 (Prelude.Maybe Prelude.Text)
+s3_bucket = Lens.lens (\S3' {bucket} -> bucket) (\s@S3' {} a -> s {bucket = a} :: S3)
+
+-- | Undocumented member.
+s3_prefix :: Lens.Lens' S3 (Prelude.Maybe Prelude.Text)
+s3_prefix = Lens.lens (\S3' {prefix} -> prefix) (\s@S3' {} a -> s {prefix = a} :: S3)
+
+-- | Undocumented member.
+s3_enabled :: Lens.Lens' S3 Prelude.Bool
+s3_enabled = Lens.lens (\S3' {enabled} -> enabled) (\s@S3' {} a -> s {enabled = a} :: S3)
+
+instance Data.FromJSON S3 where
+  parseJSON =
+    Data.withObject
+      "S3"
+      ( \x ->
+          S3'
+            Prelude.<$> (x Data..:? "bucket")
+            Prelude.<*> (x Data..:? "prefix")
+            Prelude.<*> (x Data..: "enabled")
+      )
+
+instance Prelude.Hashable S3 where
+  hashWithSalt _salt S3' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData S3 where
+  rnf S3' {..} =
+    Prelude.rnf bucket
+      `Prelude.seq` Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf enabled
+
+instance Data.ToJSON S3 where
+  toJSON S3' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("bucket" Data..=) Prelude.<$> bucket,
+            ("prefix" Data..=) Prelude.<$> prefix,
+            Prelude.Just ("enabled" Data..= enabled)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Sasl.hs b/gen/Amazonka/Kafka/Types/Sasl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Sasl.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.Kafka.Types.Sasl
+-- 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.Kafka.Types.Sasl where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.Iam
+import Amazonka.Kafka.Types.Scram
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details for client authentication using SASL.
+--
+-- /See:/ 'newSasl' smart constructor.
+data Sasl = Sasl'
+  { -- | Indicates whether IAM access control is enabled.
+    iam :: Prelude.Maybe Iam,
+    -- | Details for SASL\/SCRAM client authentication.
+    scram :: Prelude.Maybe Scram
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Sasl' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'iam', 'sasl_iam' - Indicates whether IAM access control is enabled.
+--
+-- 'scram', 'sasl_scram' - Details for SASL\/SCRAM client authentication.
+newSasl ::
+  Sasl
+newSasl =
+  Sasl'
+    { iam = Prelude.Nothing,
+      scram = Prelude.Nothing
+    }
+
+-- | Indicates whether IAM access control is enabled.
+sasl_iam :: Lens.Lens' Sasl (Prelude.Maybe Iam)
+sasl_iam = Lens.lens (\Sasl' {iam} -> iam) (\s@Sasl' {} a -> s {iam = a} :: Sasl)
+
+-- | Details for SASL\/SCRAM client authentication.
+sasl_scram :: Lens.Lens' Sasl (Prelude.Maybe Scram)
+sasl_scram = Lens.lens (\Sasl' {scram} -> scram) (\s@Sasl' {} a -> s {scram = a} :: Sasl)
+
+instance Data.FromJSON Sasl where
+  parseJSON =
+    Data.withObject
+      "Sasl"
+      ( \x ->
+          Sasl'
+            Prelude.<$> (x Data..:? "iam")
+            Prelude.<*> (x Data..:? "scram")
+      )
+
+instance Prelude.Hashable Sasl where
+  hashWithSalt _salt Sasl' {..} =
+    _salt
+      `Prelude.hashWithSalt` iam
+      `Prelude.hashWithSalt` scram
+
+instance Prelude.NFData Sasl where
+  rnf Sasl' {..} =
+    Prelude.rnf iam `Prelude.seq` Prelude.rnf scram
+
+instance Data.ToJSON Sasl where
+  toJSON Sasl' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("iam" Data..=) Prelude.<$> iam,
+            ("scram" Data..=) Prelude.<$> scram
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Scram.hs b/gen/Amazonka/Kafka/Types/Scram.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Scram.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Scram
+-- 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.Kafka.Types.Scram 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
+
+-- | Details for SASL\/SCRAM client authentication.
+--
+-- /See:/ 'newScram' smart constructor.
+data Scram = Scram'
+  { -- | SASL\/SCRAM authentication is enabled or not.
+    enabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Scram' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'scram_enabled' - SASL\/SCRAM authentication is enabled or not.
+newScram ::
+  Scram
+newScram = Scram' {enabled = Prelude.Nothing}
+
+-- | SASL\/SCRAM authentication is enabled or not.
+scram_enabled :: Lens.Lens' Scram (Prelude.Maybe Prelude.Bool)
+scram_enabled = Lens.lens (\Scram' {enabled} -> enabled) (\s@Scram' {} a -> s {enabled = a} :: Scram)
+
+instance Data.FromJSON Scram where
+  parseJSON =
+    Data.withObject
+      "Scram"
+      (\x -> Scram' Prelude.<$> (x Data..:? "enabled"))
+
+instance Prelude.Hashable Scram where
+  hashWithSalt _salt Scram' {..} =
+    _salt `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData Scram where
+  rnf Scram' {..} = Prelude.rnf enabled
+
+instance Data.ToJSON Scram where
+  toJSON Scram' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("enabled" Data..=) Prelude.<$> enabled]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Serverless.hs b/gen/Amazonka/Kafka/Types/Serverless.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Serverless.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Serverless
+-- 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.Kafka.Types.Serverless where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ServerlessClientAuthentication
+import Amazonka.Kafka.Types.VpcConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Serverless cluster.
+--
+-- /See:/ 'newServerless' smart constructor.
+data Serverless = Serverless'
+  { -- | Includes all client authentication information.
+    clientAuthentication :: Prelude.Maybe ServerlessClientAuthentication,
+    -- | The configuration of the Amazon VPCs for the cluster.
+    vpcConfigs :: [VpcConfig]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Serverless' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientAuthentication', 'serverless_clientAuthentication' - Includes all client authentication information.
+--
+-- 'vpcConfigs', 'serverless_vpcConfigs' - The configuration of the Amazon VPCs for the cluster.
+newServerless ::
+  Serverless
+newServerless =
+  Serverless'
+    { clientAuthentication = Prelude.Nothing,
+      vpcConfigs = Prelude.mempty
+    }
+
+-- | Includes all client authentication information.
+serverless_clientAuthentication :: Lens.Lens' Serverless (Prelude.Maybe ServerlessClientAuthentication)
+serverless_clientAuthentication = Lens.lens (\Serverless' {clientAuthentication} -> clientAuthentication) (\s@Serverless' {} a -> s {clientAuthentication = a} :: Serverless)
+
+-- | The configuration of the Amazon VPCs for the cluster.
+serverless_vpcConfigs :: Lens.Lens' Serverless [VpcConfig]
+serverless_vpcConfigs = Lens.lens (\Serverless' {vpcConfigs} -> vpcConfigs) (\s@Serverless' {} a -> s {vpcConfigs = a} :: Serverless) Prelude.. Lens.coerced
+
+instance Data.FromJSON Serverless where
+  parseJSON =
+    Data.withObject
+      "Serverless"
+      ( \x ->
+          Serverless'
+            Prelude.<$> (x Data..:? "clientAuthentication")
+            Prelude.<*> (x Data..:? "vpcConfigs" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Serverless where
+  hashWithSalt _salt Serverless' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` vpcConfigs
+
+instance Prelude.NFData Serverless where
+  rnf Serverless' {..} =
+    Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf vpcConfigs
diff --git a/gen/Amazonka/Kafka/Types/ServerlessClientAuthentication.hs b/gen/Amazonka/Kafka/Types/ServerlessClientAuthentication.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ServerlessClientAuthentication.hs
@@ -0,0 +1,88 @@
+{-# 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.Kafka.Types.ServerlessClientAuthentication
+-- 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.Kafka.Types.ServerlessClientAuthentication where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ServerlessSasl
+import qualified Amazonka.Prelude as Prelude
+
+-- | Includes all client authentication information.
+--
+-- /See:/ 'newServerlessClientAuthentication' smart constructor.
+data ServerlessClientAuthentication = ServerlessClientAuthentication'
+  { -- | Details for ClientAuthentication using SASL.
+    sasl :: Prelude.Maybe ServerlessSasl
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServerlessClientAuthentication' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'sasl', 'serverlessClientAuthentication_sasl' - Details for ClientAuthentication using SASL.
+newServerlessClientAuthentication ::
+  ServerlessClientAuthentication
+newServerlessClientAuthentication =
+  ServerlessClientAuthentication'
+    { sasl =
+        Prelude.Nothing
+    }
+
+-- | Details for ClientAuthentication using SASL.
+serverlessClientAuthentication_sasl :: Lens.Lens' ServerlessClientAuthentication (Prelude.Maybe ServerlessSasl)
+serverlessClientAuthentication_sasl = Lens.lens (\ServerlessClientAuthentication' {sasl} -> sasl) (\s@ServerlessClientAuthentication' {} a -> s {sasl = a} :: ServerlessClientAuthentication)
+
+instance Data.FromJSON ServerlessClientAuthentication where
+  parseJSON =
+    Data.withObject
+      "ServerlessClientAuthentication"
+      ( \x ->
+          ServerlessClientAuthentication'
+            Prelude.<$> (x Data..:? "sasl")
+      )
+
+instance
+  Prelude.Hashable
+    ServerlessClientAuthentication
+  where
+  hashWithSalt
+    _salt
+    ServerlessClientAuthentication' {..} =
+      _salt `Prelude.hashWithSalt` sasl
+
+instance
+  Prelude.NFData
+    ServerlessClientAuthentication
+  where
+  rnf ServerlessClientAuthentication' {..} =
+    Prelude.rnf sasl
+
+instance Data.ToJSON ServerlessClientAuthentication where
+  toJSON ServerlessClientAuthentication' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("sasl" Data..=) Prelude.<$> sasl]
+      )
diff --git a/gen/Amazonka/Kafka/Types/ServerlessRequest.hs b/gen/Amazonka/Kafka/Types/ServerlessRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ServerlessRequest.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.ServerlessRequest
+-- 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.Kafka.Types.ServerlessRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.ServerlessClientAuthentication
+import Amazonka.Kafka.Types.VpcConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Serverless cluster request.
+--
+-- /See:/ 'newServerlessRequest' smart constructor.
+data ServerlessRequest = ServerlessRequest'
+  { -- | Includes all client authentication information.
+    clientAuthentication :: Prelude.Maybe ServerlessClientAuthentication,
+    -- | The configuration of the Amazon VPCs for the cluster.
+    vpcConfigs :: [VpcConfig]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServerlessRequest' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientAuthentication', 'serverlessRequest_clientAuthentication' - Includes all client authentication information.
+--
+-- 'vpcConfigs', 'serverlessRequest_vpcConfigs' - The configuration of the Amazon VPCs for the cluster.
+newServerlessRequest ::
+  ServerlessRequest
+newServerlessRequest =
+  ServerlessRequest'
+    { clientAuthentication =
+        Prelude.Nothing,
+      vpcConfigs = Prelude.mempty
+    }
+
+-- | Includes all client authentication information.
+serverlessRequest_clientAuthentication :: Lens.Lens' ServerlessRequest (Prelude.Maybe ServerlessClientAuthentication)
+serverlessRequest_clientAuthentication = Lens.lens (\ServerlessRequest' {clientAuthentication} -> clientAuthentication) (\s@ServerlessRequest' {} a -> s {clientAuthentication = a} :: ServerlessRequest)
+
+-- | The configuration of the Amazon VPCs for the cluster.
+serverlessRequest_vpcConfigs :: Lens.Lens' ServerlessRequest [VpcConfig]
+serverlessRequest_vpcConfigs = Lens.lens (\ServerlessRequest' {vpcConfigs} -> vpcConfigs) (\s@ServerlessRequest' {} a -> s {vpcConfigs = a} :: ServerlessRequest) Prelude.. Lens.coerced
+
+instance Prelude.Hashable ServerlessRequest where
+  hashWithSalt _salt ServerlessRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` vpcConfigs
+
+instance Prelude.NFData ServerlessRequest where
+  rnf ServerlessRequest' {..} =
+    Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf vpcConfigs
+
+instance Data.ToJSON ServerlessRequest where
+  toJSON ServerlessRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientAuthentication" Data..=)
+              Prelude.<$> clientAuthentication,
+            Prelude.Just ("vpcConfigs" Data..= vpcConfigs)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/ServerlessSasl.hs b/gen/Amazonka/Kafka/Types/ServerlessSasl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ServerlessSasl.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.Kafka.Types.ServerlessSasl
+-- 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.Kafka.Types.ServerlessSasl where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.Iam
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details for client authentication using SASL.
+--
+-- /See:/ 'newServerlessSasl' smart constructor.
+data ServerlessSasl = ServerlessSasl'
+  { -- | Indicates whether IAM access control is enabled.
+    iam :: Prelude.Maybe Iam
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServerlessSasl' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'iam', 'serverlessSasl_iam' - Indicates whether IAM access control is enabled.
+newServerlessSasl ::
+  ServerlessSasl
+newServerlessSasl =
+  ServerlessSasl' {iam = Prelude.Nothing}
+
+-- | Indicates whether IAM access control is enabled.
+serverlessSasl_iam :: Lens.Lens' ServerlessSasl (Prelude.Maybe Iam)
+serverlessSasl_iam = Lens.lens (\ServerlessSasl' {iam} -> iam) (\s@ServerlessSasl' {} a -> s {iam = a} :: ServerlessSasl)
+
+instance Data.FromJSON ServerlessSasl where
+  parseJSON =
+    Data.withObject
+      "ServerlessSasl"
+      ( \x ->
+          ServerlessSasl' Prelude.<$> (x Data..:? "iam")
+      )
+
+instance Prelude.Hashable ServerlessSasl where
+  hashWithSalt _salt ServerlessSasl' {..} =
+    _salt `Prelude.hashWithSalt` iam
+
+instance Prelude.NFData ServerlessSasl where
+  rnf ServerlessSasl' {..} = Prelude.rnf iam
+
+instance Data.ToJSON ServerlessSasl where
+  toJSON ServerlessSasl' {..} =
+    Data.object
+      (Prelude.catMaybes [("iam" Data..=) Prelude.<$> iam])
diff --git a/gen/Amazonka/Kafka/Types/StateInfo.hs b/gen/Amazonka/Kafka/Types/StateInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/StateInfo.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.Kafka.Types.StateInfo
+-- 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.Kafka.Types.StateInfo 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
+
+-- | /See:/ 'newStateInfo' smart constructor.
+data StateInfo = StateInfo'
+  { code :: Prelude.Maybe Prelude.Text,
+    message :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StateInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'code', 'stateInfo_code' - Undocumented member.
+--
+-- 'message', 'stateInfo_message' - Undocumented member.
+newStateInfo ::
+  StateInfo
+newStateInfo =
+  StateInfo'
+    { code = Prelude.Nothing,
+      message = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+stateInfo_code :: Lens.Lens' StateInfo (Prelude.Maybe Prelude.Text)
+stateInfo_code = Lens.lens (\StateInfo' {code} -> code) (\s@StateInfo' {} a -> s {code = a} :: StateInfo)
+
+-- | Undocumented member.
+stateInfo_message :: Lens.Lens' StateInfo (Prelude.Maybe Prelude.Text)
+stateInfo_message = Lens.lens (\StateInfo' {message} -> message) (\s@StateInfo' {} a -> s {message = a} :: StateInfo)
+
+instance Data.FromJSON StateInfo where
+  parseJSON =
+    Data.withObject
+      "StateInfo"
+      ( \x ->
+          StateInfo'
+            Prelude.<$> (x Data..:? "code")
+            Prelude.<*> (x Data..:? "message")
+      )
+
+instance Prelude.Hashable StateInfo where
+  hashWithSalt _salt StateInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData StateInfo where
+  rnf StateInfo' {..} =
+    Prelude.rnf code `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/Kafka/Types/StorageInfo.hs b/gen/Amazonka/Kafka/Types/StorageInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/StorageInfo.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.StorageInfo
+-- 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.Kafka.Types.StorageInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types.EBSStorageInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about storage volumes attached to MSK broker nodes.
+--
+-- /See:/ 'newStorageInfo' smart constructor.
+data StorageInfo = StorageInfo'
+  { -- | EBS volume information.
+    ebsStorageInfo :: Prelude.Maybe EBSStorageInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StorageInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ebsStorageInfo', 'storageInfo_ebsStorageInfo' - EBS volume information.
+newStorageInfo ::
+  StorageInfo
+newStorageInfo =
+  StorageInfo' {ebsStorageInfo = Prelude.Nothing}
+
+-- | EBS volume information.
+storageInfo_ebsStorageInfo :: Lens.Lens' StorageInfo (Prelude.Maybe EBSStorageInfo)
+storageInfo_ebsStorageInfo = Lens.lens (\StorageInfo' {ebsStorageInfo} -> ebsStorageInfo) (\s@StorageInfo' {} a -> s {ebsStorageInfo = a} :: StorageInfo)
+
+instance Data.FromJSON StorageInfo where
+  parseJSON =
+    Data.withObject
+      "StorageInfo"
+      ( \x ->
+          StorageInfo'
+            Prelude.<$> (x Data..:? "ebsStorageInfo")
+      )
+
+instance Prelude.Hashable StorageInfo where
+  hashWithSalt _salt StorageInfo' {..} =
+    _salt `Prelude.hashWithSalt` ebsStorageInfo
+
+instance Prelude.NFData StorageInfo where
+  rnf StorageInfo' {..} = Prelude.rnf ebsStorageInfo
+
+instance Data.ToJSON StorageInfo where
+  toJSON StorageInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ebsStorageInfo" Data..=)
+              Prelude.<$> ebsStorageInfo
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/StorageMode.hs b/gen/Amazonka/Kafka/Types/StorageMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/StorageMode.hs
@@ -0,0 +1,72 @@
+{-# 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.Kafka.Types.StorageMode
+-- 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.Kafka.Types.StorageMode
+  ( StorageMode
+      ( ..,
+        StorageMode_LOCAL,
+        StorageMode_TIERED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Controls storage mode for various supported storage tiers.
+newtype StorageMode = StorageMode'
+  { fromStorageMode ::
+      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 StorageMode_LOCAL :: StorageMode
+pattern StorageMode_LOCAL = StorageMode' "LOCAL"
+
+pattern StorageMode_TIERED :: StorageMode
+pattern StorageMode_TIERED = StorageMode' "TIERED"
+
+{-# COMPLETE
+  StorageMode_LOCAL,
+  StorageMode_TIERED,
+  StorageMode'
+  #-}
diff --git a/gen/Amazonka/Kafka/Types/Tls.hs b/gen/Amazonka/Kafka/Types/Tls.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Tls.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Tls
+-- 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.Kafka.Types.Tls 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
+
+-- | Details for client authentication using TLS.
+--
+-- /See:/ 'newTls' smart constructor.
+data Tls = Tls'
+  { -- | List of ACM Certificate Authority ARNs.
+    certificateAuthorityArnList :: Prelude.Maybe [Prelude.Text],
+    -- | Specifies whether you want to turn on or turn off TLS authentication.
+    enabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tls' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'certificateAuthorityArnList', 'tls_certificateAuthorityArnList' - List of ACM Certificate Authority ARNs.
+--
+-- 'enabled', 'tls_enabled' - Specifies whether you want to turn on or turn off TLS authentication.
+newTls ::
+  Tls
+newTls =
+  Tls'
+    { certificateAuthorityArnList = Prelude.Nothing,
+      enabled = Prelude.Nothing
+    }
+
+-- | List of ACM Certificate Authority ARNs.
+tls_certificateAuthorityArnList :: Lens.Lens' Tls (Prelude.Maybe [Prelude.Text])
+tls_certificateAuthorityArnList = Lens.lens (\Tls' {certificateAuthorityArnList} -> certificateAuthorityArnList) (\s@Tls' {} a -> s {certificateAuthorityArnList = a} :: Tls) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specifies whether you want to turn on or turn off TLS authentication.
+tls_enabled :: Lens.Lens' Tls (Prelude.Maybe Prelude.Bool)
+tls_enabled = Lens.lens (\Tls' {enabled} -> enabled) (\s@Tls' {} a -> s {enabled = a} :: Tls)
+
+instance Data.FromJSON Tls where
+  parseJSON =
+    Data.withObject
+      "Tls"
+      ( \x ->
+          Tls'
+            Prelude.<$> ( x
+                            Data..:? "certificateAuthorityArnList"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "enabled")
+      )
+
+instance Prelude.Hashable Tls where
+  hashWithSalt _salt Tls' {..} =
+    _salt
+      `Prelude.hashWithSalt` certificateAuthorityArnList
+      `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData Tls where
+  rnf Tls' {..} =
+    Prelude.rnf certificateAuthorityArnList
+      `Prelude.seq` Prelude.rnf enabled
+
+instance Data.ToJSON Tls where
+  toJSON Tls' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("certificateAuthorityArnList" Data..=)
+              Prelude.<$> certificateAuthorityArnList,
+            ("enabled" Data..=) Prelude.<$> enabled
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/Unauthenticated.hs b/gen/Amazonka/Kafka/Types/Unauthenticated.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/Unauthenticated.hs
@@ -0,0 +1,75 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.Unauthenticated
+-- 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.Kafka.Types.Unauthenticated 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
+
+-- | /See:/ 'newUnauthenticated' smart constructor.
+data Unauthenticated = Unauthenticated'
+  { -- | Specifies whether you want to turn on or turn off unauthenticated
+    -- traffic to your cluster.
+    enabled :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Unauthenticated' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enabled', 'unauthenticated_enabled' - Specifies whether you want to turn on or turn off unauthenticated
+-- traffic to your cluster.
+newUnauthenticated ::
+  Unauthenticated
+newUnauthenticated =
+  Unauthenticated' {enabled = Prelude.Nothing}
+
+-- | Specifies whether you want to turn on or turn off unauthenticated
+-- traffic to your cluster.
+unauthenticated_enabled :: Lens.Lens' Unauthenticated (Prelude.Maybe Prelude.Bool)
+unauthenticated_enabled = Lens.lens (\Unauthenticated' {enabled} -> enabled) (\s@Unauthenticated' {} a -> s {enabled = a} :: Unauthenticated)
+
+instance Data.FromJSON Unauthenticated where
+  parseJSON =
+    Data.withObject
+      "Unauthenticated"
+      ( \x ->
+          Unauthenticated' Prelude.<$> (x Data..:? "enabled")
+      )
+
+instance Prelude.Hashable Unauthenticated where
+  hashWithSalt _salt Unauthenticated' {..} =
+    _salt `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData Unauthenticated where
+  rnf Unauthenticated' {..} = Prelude.rnf enabled
+
+instance Data.ToJSON Unauthenticated where
+  toJSON Unauthenticated' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("enabled" Data..=) Prelude.<$> enabled]
+      )
diff --git a/gen/Amazonka/Kafka/Types/UnprocessedScramSecret.hs b/gen/Amazonka/Kafka/Types/UnprocessedScramSecret.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/UnprocessedScramSecret.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.UnprocessedScramSecret
+-- 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.Kafka.Types.UnprocessedScramSecret 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
+
+-- | Error info for scram secret associate\/disassociate failure.
+--
+-- /See:/ 'newUnprocessedScramSecret' smart constructor.
+data UnprocessedScramSecret = UnprocessedScramSecret'
+  { -- | Error code for associate\/disassociate failure.
+    errorCode :: Prelude.Maybe Prelude.Text,
+    -- | Error message for associate\/disassociate failure.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | AWS Secrets Manager secret ARN.
+    secretArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UnprocessedScramSecret' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'unprocessedScramSecret_errorCode' - Error code for associate\/disassociate failure.
+--
+-- 'errorMessage', 'unprocessedScramSecret_errorMessage' - Error message for associate\/disassociate failure.
+--
+-- 'secretArn', 'unprocessedScramSecret_secretArn' - AWS Secrets Manager secret ARN.
+newUnprocessedScramSecret ::
+  UnprocessedScramSecret
+newUnprocessedScramSecret =
+  UnprocessedScramSecret'
+    { errorCode =
+        Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      secretArn = Prelude.Nothing
+    }
+
+-- | Error code for associate\/disassociate failure.
+unprocessedScramSecret_errorCode :: Lens.Lens' UnprocessedScramSecret (Prelude.Maybe Prelude.Text)
+unprocessedScramSecret_errorCode = Lens.lens (\UnprocessedScramSecret' {errorCode} -> errorCode) (\s@UnprocessedScramSecret' {} a -> s {errorCode = a} :: UnprocessedScramSecret)
+
+-- | Error message for associate\/disassociate failure.
+unprocessedScramSecret_errorMessage :: Lens.Lens' UnprocessedScramSecret (Prelude.Maybe Prelude.Text)
+unprocessedScramSecret_errorMessage = Lens.lens (\UnprocessedScramSecret' {errorMessage} -> errorMessage) (\s@UnprocessedScramSecret' {} a -> s {errorMessage = a} :: UnprocessedScramSecret)
+
+-- | AWS Secrets Manager secret ARN.
+unprocessedScramSecret_secretArn :: Lens.Lens' UnprocessedScramSecret (Prelude.Maybe Prelude.Text)
+unprocessedScramSecret_secretArn = Lens.lens (\UnprocessedScramSecret' {secretArn} -> secretArn) (\s@UnprocessedScramSecret' {} a -> s {secretArn = a} :: UnprocessedScramSecret)
+
+instance Data.FromJSON UnprocessedScramSecret where
+  parseJSON =
+    Data.withObject
+      "UnprocessedScramSecret"
+      ( \x ->
+          UnprocessedScramSecret'
+            Prelude.<$> (x Data..:? "errorCode")
+            Prelude.<*> (x Data..:? "errorMessage")
+            Prelude.<*> (x Data..:? "secretArn")
+      )
+
+instance Prelude.Hashable UnprocessedScramSecret where
+  hashWithSalt _salt UnprocessedScramSecret' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` secretArn
+
+instance Prelude.NFData UnprocessedScramSecret where
+  rnf UnprocessedScramSecret' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf secretArn
diff --git a/gen/Amazonka/Kafka/Types/VpcConfig.hs b/gen/Amazonka/Kafka/Types/VpcConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/VpcConfig.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.VpcConfig
+-- 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.Kafka.Types.VpcConfig 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 configuration of the Amazon VPCs for the cluster.
+--
+-- /See:/ 'newVpcConfig' smart constructor.
+data VpcConfig = VpcConfig'
+  { -- | The IDs of the security groups associated with the cluster.
+    securityGroupIds :: Prelude.Maybe [Prelude.Text],
+    -- | The IDs of the subnets associated with the cluster.
+    subnetIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VpcConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'securityGroupIds', 'vpcConfig_securityGroupIds' - The IDs of the security groups associated with the cluster.
+--
+-- 'subnetIds', 'vpcConfig_subnetIds' - The IDs of the subnets associated with the cluster.
+newVpcConfig ::
+  VpcConfig
+newVpcConfig =
+  VpcConfig'
+    { securityGroupIds = Prelude.Nothing,
+      subnetIds = Prelude.mempty
+    }
+
+-- | The IDs of the security groups associated with the cluster.
+vpcConfig_securityGroupIds :: Lens.Lens' VpcConfig (Prelude.Maybe [Prelude.Text])
+vpcConfig_securityGroupIds = Lens.lens (\VpcConfig' {securityGroupIds} -> securityGroupIds) (\s@VpcConfig' {} a -> s {securityGroupIds = a} :: VpcConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | The IDs of the subnets associated with the cluster.
+vpcConfig_subnetIds :: Lens.Lens' VpcConfig [Prelude.Text]
+vpcConfig_subnetIds = Lens.lens (\VpcConfig' {subnetIds} -> subnetIds) (\s@VpcConfig' {} a -> s {subnetIds = a} :: VpcConfig) Prelude.. Lens.coerced
+
+instance Data.FromJSON VpcConfig where
+  parseJSON =
+    Data.withObject
+      "VpcConfig"
+      ( \x ->
+          VpcConfig'
+            Prelude.<$> ( x
+                            Data..:? "securityGroupIds"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "subnetIds" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable VpcConfig where
+  hashWithSalt _salt VpcConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` securityGroupIds
+      `Prelude.hashWithSalt` subnetIds
+
+instance Prelude.NFData VpcConfig where
+  rnf VpcConfig' {..} =
+    Prelude.rnf securityGroupIds
+      `Prelude.seq` Prelude.rnf subnetIds
+
+instance Data.ToJSON VpcConfig where
+  toJSON VpcConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("securityGroupIds" Data..=)
+              Prelude.<$> securityGroupIds,
+            Prelude.Just ("subnetIds" Data..= subnetIds)
+          ]
+      )
diff --git a/gen/Amazonka/Kafka/Types/ZookeeperNodeInfo.hs b/gen/Amazonka/Kafka/Types/ZookeeperNodeInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/Types/ZookeeperNodeInfo.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.Types.ZookeeperNodeInfo
+-- 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.Kafka.Types.ZookeeperNodeInfo 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
+
+-- | Zookeeper node information.
+--
+-- /See:/ 'newZookeeperNodeInfo' smart constructor.
+data ZookeeperNodeInfo = ZookeeperNodeInfo'
+  { -- | The attached elastic network interface of the broker.
+    attachedENIId :: Prelude.Maybe Prelude.Text,
+    -- | The virtual private cloud (VPC) IP address of the client.
+    clientVpcIpAddress :: Prelude.Maybe Prelude.Text,
+    -- | Endpoints for accessing the ZooKeeper.
+    endpoints :: Prelude.Maybe [Prelude.Text],
+    -- | The role-specific ID for Zookeeper.
+    zookeeperId :: Prelude.Maybe Prelude.Double,
+    -- | The version of Zookeeper.
+    zookeeperVersion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ZookeeperNodeInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attachedENIId', 'zookeeperNodeInfo_attachedENIId' - The attached elastic network interface of the broker.
+--
+-- 'clientVpcIpAddress', 'zookeeperNodeInfo_clientVpcIpAddress' - The virtual private cloud (VPC) IP address of the client.
+--
+-- 'endpoints', 'zookeeperNodeInfo_endpoints' - Endpoints for accessing the ZooKeeper.
+--
+-- 'zookeeperId', 'zookeeperNodeInfo_zookeeperId' - The role-specific ID for Zookeeper.
+--
+-- 'zookeeperVersion', 'zookeeperNodeInfo_zookeeperVersion' - The version of Zookeeper.
+newZookeeperNodeInfo ::
+  ZookeeperNodeInfo
+newZookeeperNodeInfo =
+  ZookeeperNodeInfo'
+    { attachedENIId = Prelude.Nothing,
+      clientVpcIpAddress = Prelude.Nothing,
+      endpoints = Prelude.Nothing,
+      zookeeperId = Prelude.Nothing,
+      zookeeperVersion = Prelude.Nothing
+    }
+
+-- | The attached elastic network interface of the broker.
+zookeeperNodeInfo_attachedENIId :: Lens.Lens' ZookeeperNodeInfo (Prelude.Maybe Prelude.Text)
+zookeeperNodeInfo_attachedENIId = Lens.lens (\ZookeeperNodeInfo' {attachedENIId} -> attachedENIId) (\s@ZookeeperNodeInfo' {} a -> s {attachedENIId = a} :: ZookeeperNodeInfo)
+
+-- | The virtual private cloud (VPC) IP address of the client.
+zookeeperNodeInfo_clientVpcIpAddress :: Lens.Lens' ZookeeperNodeInfo (Prelude.Maybe Prelude.Text)
+zookeeperNodeInfo_clientVpcIpAddress = Lens.lens (\ZookeeperNodeInfo' {clientVpcIpAddress} -> clientVpcIpAddress) (\s@ZookeeperNodeInfo' {} a -> s {clientVpcIpAddress = a} :: ZookeeperNodeInfo)
+
+-- | Endpoints for accessing the ZooKeeper.
+zookeeperNodeInfo_endpoints :: Lens.Lens' ZookeeperNodeInfo (Prelude.Maybe [Prelude.Text])
+zookeeperNodeInfo_endpoints = Lens.lens (\ZookeeperNodeInfo' {endpoints} -> endpoints) (\s@ZookeeperNodeInfo' {} a -> s {endpoints = a} :: ZookeeperNodeInfo) Prelude.. Lens.mapping Lens.coerced
+
+-- | The role-specific ID for Zookeeper.
+zookeeperNodeInfo_zookeeperId :: Lens.Lens' ZookeeperNodeInfo (Prelude.Maybe Prelude.Double)
+zookeeperNodeInfo_zookeeperId = Lens.lens (\ZookeeperNodeInfo' {zookeeperId} -> zookeeperId) (\s@ZookeeperNodeInfo' {} a -> s {zookeeperId = a} :: ZookeeperNodeInfo)
+
+-- | The version of Zookeeper.
+zookeeperNodeInfo_zookeeperVersion :: Lens.Lens' ZookeeperNodeInfo (Prelude.Maybe Prelude.Text)
+zookeeperNodeInfo_zookeeperVersion = Lens.lens (\ZookeeperNodeInfo' {zookeeperVersion} -> zookeeperVersion) (\s@ZookeeperNodeInfo' {} a -> s {zookeeperVersion = a} :: ZookeeperNodeInfo)
+
+instance Data.FromJSON ZookeeperNodeInfo where
+  parseJSON =
+    Data.withObject
+      "ZookeeperNodeInfo"
+      ( \x ->
+          ZookeeperNodeInfo'
+            Prelude.<$> (x Data..:? "attachedENIId")
+            Prelude.<*> (x Data..:? "clientVpcIpAddress")
+            Prelude.<*> (x Data..:? "endpoints" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "zookeeperId")
+            Prelude.<*> (x Data..:? "zookeeperVersion")
+      )
+
+instance Prelude.Hashable ZookeeperNodeInfo where
+  hashWithSalt _salt ZookeeperNodeInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` attachedENIId
+      `Prelude.hashWithSalt` clientVpcIpAddress
+      `Prelude.hashWithSalt` endpoints
+      `Prelude.hashWithSalt` zookeeperId
+      `Prelude.hashWithSalt` zookeeperVersion
+
+instance Prelude.NFData ZookeeperNodeInfo where
+  rnf ZookeeperNodeInfo' {..} =
+    Prelude.rnf attachedENIId
+      `Prelude.seq` Prelude.rnf clientVpcIpAddress
+      `Prelude.seq` Prelude.rnf endpoints
+      `Prelude.seq` Prelude.rnf zookeeperId
+      `Prelude.seq` Prelude.rnf zookeeperVersion
diff --git a/gen/Amazonka/Kafka/UntagResource.hs b/gen/Amazonka/Kafka/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UntagResource.hs
@@ -0,0 +1,187 @@
+{-# 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.Kafka.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 the tags associated with the keys that are provided in the
+-- query.
+module Amazonka.Kafka.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_tagKeys,
+    untagResource_resourceArn,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.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'
+  { -- | Tag keys must be unique for a given cluster. In addition, the following
+    -- restrictions apply:
+    --
+    -- -   Each tag key must be unique. If you add a tag with a key that\'s
+    --     already in use, your new tag overwrites the existing key-value pair.
+    --
+    -- -   You can\'t start a tag key with aws: because this prefix is reserved
+    --     for use by AWS. AWS creates tags that begin with this prefix on your
+    --     behalf, but you can\'t edit or delete them.
+    --
+    -- -   Tag keys must be between 1 and 128 Unicode characters in length.
+    --
+    -- -   Tag keys must consist of the following characters: Unicode letters,
+    --     digits, white space, and the following special characters: _ . \/ =
+    --     + - \@.
+    tagKeys :: [Prelude.Text],
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the resource
+    -- that\'s associated with the tags.
+    resourceArn :: 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:
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Tag keys must be unique for a given cluster. In addition, the following
+-- restrictions apply:
+--
+-- -   Each tag key must be unique. If you add a tag with a key that\'s
+--     already in use, your new tag overwrites the existing key-value pair.
+--
+-- -   You can\'t start a tag key with aws: because this prefix is reserved
+--     for use by AWS. AWS creates tags that begin with this prefix on your
+--     behalf, but you can\'t edit or delete them.
+--
+-- -   Tag keys must be between 1 and 128 Unicode characters in length.
+--
+-- -   Tag keys must consist of the following characters: Unicode letters,
+--     digits, white space, and the following special characters: _ . \/ =
+--     + - \@.
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) that uniquely identifies the resource
+-- that\'s associated with the tags.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { tagKeys = Prelude.mempty,
+      resourceArn = pResourceArn_
+    }
+
+-- | Tag keys must be unique for a given cluster. In addition, the following
+-- restrictions apply:
+--
+-- -   Each tag key must be unique. If you add a tag with a key that\'s
+--     already in use, your new tag overwrites the existing key-value pair.
+--
+-- -   You can\'t start a tag key with aws: because this prefix is reserved
+--     for use by AWS. AWS creates tags that begin with this prefix on your
+--     behalf, but you can\'t edit or delete them.
+--
+-- -   Tag keys must be between 1 and 128 Unicode characters in length.
+--
+-- -   Tag keys must consist of the following characters: Unicode letters,
+--     digits, white space, and the following special characters: _ . \/ =
+--     + - \@.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the resource
+-- that\'s associated with the tags.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveNull UntagResourceResponse'
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` tagKeys
+      `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf tagKeys
+      `Prelude.seq` Prelude.rnf resourceArn
+
+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
+      ["/v1/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'
+  {
+  }
+  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.
+newUntagResourceResponse ::
+  UntagResourceResponse
+newUntagResourceResponse = UntagResourceResponse'
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Kafka/UpdateBrokerCount.hs b/gen/Amazonka/Kafka/UpdateBrokerCount.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateBrokerCount.hs
@@ -0,0 +1,229 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.UpdateBrokerCount
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the number of broker nodes in the cluster.
+module Amazonka.Kafka.UpdateBrokerCount
+  ( -- * Creating a Request
+    UpdateBrokerCount (..),
+    newUpdateBrokerCount,
+
+    -- * Request Lenses
+    updateBrokerCount_clusterArn,
+    updateBrokerCount_currentVersion,
+    updateBrokerCount_targetNumberOfBrokerNodes,
+
+    -- * Destructuring the Response
+    UpdateBrokerCountResponse (..),
+    newUpdateBrokerCountResponse,
+
+    -- * Response Lenses
+    updateBrokerCountResponse_clusterArn,
+    updateBrokerCountResponse_clusterOperationArn,
+    updateBrokerCountResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateBrokerCount' smart constructor.
+data UpdateBrokerCount = UpdateBrokerCount'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text,
+    -- | The version of cluster to update from. A successful operation will then
+    -- generate a new version.
+    currentVersion :: Prelude.Text,
+    -- | The number of broker nodes that you want the cluster to have after this
+    -- operation completes successfully.
+    targetNumberOfBrokerNodes :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateBrokerCount' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateBrokerCount_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'currentVersion', 'updateBrokerCount_currentVersion' - The version of cluster to update from. A successful operation will then
+-- generate a new version.
+--
+-- 'targetNumberOfBrokerNodes', 'updateBrokerCount_targetNumberOfBrokerNodes' - The number of broker nodes that you want the cluster to have after this
+-- operation completes successfully.
+newUpdateBrokerCount ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  -- | 'targetNumberOfBrokerNodes'
+  Prelude.Natural ->
+  UpdateBrokerCount
+newUpdateBrokerCount
+  pClusterArn_
+  pCurrentVersion_
+  pTargetNumberOfBrokerNodes_ =
+    UpdateBrokerCount'
+      { clusterArn = pClusterArn_,
+        currentVersion = pCurrentVersion_,
+        targetNumberOfBrokerNodes =
+          pTargetNumberOfBrokerNodes_
+      }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+updateBrokerCount_clusterArn :: Lens.Lens' UpdateBrokerCount Prelude.Text
+updateBrokerCount_clusterArn = Lens.lens (\UpdateBrokerCount' {clusterArn} -> clusterArn) (\s@UpdateBrokerCount' {} a -> s {clusterArn = a} :: UpdateBrokerCount)
+
+-- | The version of cluster to update from. A successful operation will then
+-- generate a new version.
+updateBrokerCount_currentVersion :: Lens.Lens' UpdateBrokerCount Prelude.Text
+updateBrokerCount_currentVersion = Lens.lens (\UpdateBrokerCount' {currentVersion} -> currentVersion) (\s@UpdateBrokerCount' {} a -> s {currentVersion = a} :: UpdateBrokerCount)
+
+-- | The number of broker nodes that you want the cluster to have after this
+-- operation completes successfully.
+updateBrokerCount_targetNumberOfBrokerNodes :: Lens.Lens' UpdateBrokerCount Prelude.Natural
+updateBrokerCount_targetNumberOfBrokerNodes = Lens.lens (\UpdateBrokerCount' {targetNumberOfBrokerNodes} -> targetNumberOfBrokerNodes) (\s@UpdateBrokerCount' {} a -> s {targetNumberOfBrokerNodes = a} :: UpdateBrokerCount)
+
+instance Core.AWSRequest UpdateBrokerCount where
+  type
+    AWSResponse UpdateBrokerCount =
+      UpdateBrokerCountResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateBrokerCountResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateBrokerCount where
+  hashWithSalt _salt UpdateBrokerCount' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` targetNumberOfBrokerNodes
+
+instance Prelude.NFData UpdateBrokerCount where
+  rnf UpdateBrokerCount' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf targetNumberOfBrokerNodes
+
+instance Data.ToHeaders UpdateBrokerCount where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateBrokerCount where
+  toJSON UpdateBrokerCount' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("currentVersion" Data..= currentVersion),
+            Prelude.Just
+              ( "targetNumberOfBrokerNodes"
+                  Data..= targetNumberOfBrokerNodes
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateBrokerCount where
+  toPath UpdateBrokerCount' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/nodes/count"
+      ]
+
+instance Data.ToQuery UpdateBrokerCount where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateBrokerCountResponse' smart constructor.
+data UpdateBrokerCountResponse = UpdateBrokerCountResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateBrokerCountResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateBrokerCountResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateBrokerCountResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateBrokerCountResponse_httpStatus' - The response's http status code.
+newUpdateBrokerCountResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateBrokerCountResponse
+newUpdateBrokerCountResponse pHttpStatus_ =
+  UpdateBrokerCountResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateBrokerCountResponse_clusterArn :: Lens.Lens' UpdateBrokerCountResponse (Prelude.Maybe Prelude.Text)
+updateBrokerCountResponse_clusterArn = Lens.lens (\UpdateBrokerCountResponse' {clusterArn} -> clusterArn) (\s@UpdateBrokerCountResponse' {} a -> s {clusterArn = a} :: UpdateBrokerCountResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateBrokerCountResponse_clusterOperationArn :: Lens.Lens' UpdateBrokerCountResponse (Prelude.Maybe Prelude.Text)
+updateBrokerCountResponse_clusterOperationArn = Lens.lens (\UpdateBrokerCountResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateBrokerCountResponse' {} a -> s {clusterOperationArn = a} :: UpdateBrokerCountResponse)
+
+-- | The response's http status code.
+updateBrokerCountResponse_httpStatus :: Lens.Lens' UpdateBrokerCountResponse Prelude.Int
+updateBrokerCountResponse_httpStatus = Lens.lens (\UpdateBrokerCountResponse' {httpStatus} -> httpStatus) (\s@UpdateBrokerCountResponse' {} a -> s {httpStatus = a} :: UpdateBrokerCountResponse)
+
+instance Prelude.NFData UpdateBrokerCountResponse where
+  rnf UpdateBrokerCountResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateBrokerStorage.hs b/gen/Amazonka/Kafka/UpdateBrokerStorage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateBrokerStorage.hs
@@ -0,0 +1,223 @@
+{-# 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.Kafka.UpdateBrokerStorage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the EBS storage associated with MSK brokers.
+module Amazonka.Kafka.UpdateBrokerStorage
+  ( -- * Creating a Request
+    UpdateBrokerStorage (..),
+    newUpdateBrokerStorage,
+
+    -- * Request Lenses
+    updateBrokerStorage_clusterArn,
+    updateBrokerStorage_targetBrokerEBSVolumeInfo,
+    updateBrokerStorage_currentVersion,
+
+    -- * Destructuring the Response
+    UpdateBrokerStorageResponse (..),
+    newUpdateBrokerStorageResponse,
+
+    -- * Response Lenses
+    updateBrokerStorageResponse_clusterArn,
+    updateBrokerStorageResponse_clusterOperationArn,
+    updateBrokerStorageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateBrokerStorage' smart constructor.
+data UpdateBrokerStorage = UpdateBrokerStorage'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text,
+    -- | Describes the target volume size and the ID of the broker to apply the
+    -- update to.
+    targetBrokerEBSVolumeInfo :: [BrokerEBSVolumeInfo],
+    -- | The version of cluster to update from. A successful operation will then
+    -- generate a new version.
+    currentVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateBrokerStorage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateBrokerStorage_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'targetBrokerEBSVolumeInfo', 'updateBrokerStorage_targetBrokerEBSVolumeInfo' - Describes the target volume size and the ID of the broker to apply the
+-- update to.
+--
+-- 'currentVersion', 'updateBrokerStorage_currentVersion' - The version of cluster to update from. A successful operation will then
+-- generate a new version.
+newUpdateBrokerStorage ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  UpdateBrokerStorage
+newUpdateBrokerStorage pClusterArn_ pCurrentVersion_ =
+  UpdateBrokerStorage'
+    { clusterArn = pClusterArn_,
+      targetBrokerEBSVolumeInfo = Prelude.mempty,
+      currentVersion = pCurrentVersion_
+    }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+updateBrokerStorage_clusterArn :: Lens.Lens' UpdateBrokerStorage Prelude.Text
+updateBrokerStorage_clusterArn = Lens.lens (\UpdateBrokerStorage' {clusterArn} -> clusterArn) (\s@UpdateBrokerStorage' {} a -> s {clusterArn = a} :: UpdateBrokerStorage)
+
+-- | Describes the target volume size and the ID of the broker to apply the
+-- update to.
+updateBrokerStorage_targetBrokerEBSVolumeInfo :: Lens.Lens' UpdateBrokerStorage [BrokerEBSVolumeInfo]
+updateBrokerStorage_targetBrokerEBSVolumeInfo = Lens.lens (\UpdateBrokerStorage' {targetBrokerEBSVolumeInfo} -> targetBrokerEBSVolumeInfo) (\s@UpdateBrokerStorage' {} a -> s {targetBrokerEBSVolumeInfo = a} :: UpdateBrokerStorage) Prelude.. Lens.coerced
+
+-- | The version of cluster to update from. A successful operation will then
+-- generate a new version.
+updateBrokerStorage_currentVersion :: Lens.Lens' UpdateBrokerStorage Prelude.Text
+updateBrokerStorage_currentVersion = Lens.lens (\UpdateBrokerStorage' {currentVersion} -> currentVersion) (\s@UpdateBrokerStorage' {} a -> s {currentVersion = a} :: UpdateBrokerStorage)
+
+instance Core.AWSRequest UpdateBrokerStorage where
+  type
+    AWSResponse UpdateBrokerStorage =
+      UpdateBrokerStorageResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateBrokerStorageResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateBrokerStorage where
+  hashWithSalt _salt UpdateBrokerStorage' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` targetBrokerEBSVolumeInfo
+      `Prelude.hashWithSalt` currentVersion
+
+instance Prelude.NFData UpdateBrokerStorage where
+  rnf UpdateBrokerStorage' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf targetBrokerEBSVolumeInfo
+      `Prelude.seq` Prelude.rnf currentVersion
+
+instance Data.ToHeaders UpdateBrokerStorage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateBrokerStorage where
+  toJSON UpdateBrokerStorage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "targetBrokerEBSVolumeInfo"
+                  Data..= targetBrokerEBSVolumeInfo
+              ),
+            Prelude.Just
+              ("currentVersion" Data..= currentVersion)
+          ]
+      )
+
+instance Data.ToPath UpdateBrokerStorage where
+  toPath UpdateBrokerStorage' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/nodes/storage"
+      ]
+
+instance Data.ToQuery UpdateBrokerStorage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateBrokerStorageResponse' smart constructor.
+data UpdateBrokerStorageResponse = UpdateBrokerStorageResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateBrokerStorageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateBrokerStorageResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateBrokerStorageResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateBrokerStorageResponse_httpStatus' - The response's http status code.
+newUpdateBrokerStorageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateBrokerStorageResponse
+newUpdateBrokerStorageResponse pHttpStatus_ =
+  UpdateBrokerStorageResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateBrokerStorageResponse_clusterArn :: Lens.Lens' UpdateBrokerStorageResponse (Prelude.Maybe Prelude.Text)
+updateBrokerStorageResponse_clusterArn = Lens.lens (\UpdateBrokerStorageResponse' {clusterArn} -> clusterArn) (\s@UpdateBrokerStorageResponse' {} a -> s {clusterArn = a} :: UpdateBrokerStorageResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateBrokerStorageResponse_clusterOperationArn :: Lens.Lens' UpdateBrokerStorageResponse (Prelude.Maybe Prelude.Text)
+updateBrokerStorageResponse_clusterOperationArn = Lens.lens (\UpdateBrokerStorageResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateBrokerStorageResponse' {} a -> s {clusterOperationArn = a} :: UpdateBrokerStorageResponse)
+
+-- | The response's http status code.
+updateBrokerStorageResponse_httpStatus :: Lens.Lens' UpdateBrokerStorageResponse Prelude.Int
+updateBrokerStorageResponse_httpStatus = Lens.lens (\UpdateBrokerStorageResponse' {httpStatus} -> httpStatus) (\s@UpdateBrokerStorageResponse' {} a -> s {httpStatus = a} :: UpdateBrokerStorageResponse)
+
+instance Prelude.NFData UpdateBrokerStorageResponse where
+  rnf UpdateBrokerStorageResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateBrokerType.hs b/gen/Amazonka/Kafka/UpdateBrokerType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateBrokerType.hs
@@ -0,0 +1,226 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.UpdateBrokerType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates EC2 instance type.
+module Amazonka.Kafka.UpdateBrokerType
+  ( -- * Creating a Request
+    UpdateBrokerType (..),
+    newUpdateBrokerType,
+
+    -- * Request Lenses
+    updateBrokerType_clusterArn,
+    updateBrokerType_currentVersion,
+    updateBrokerType_targetInstanceType,
+
+    -- * Destructuring the Response
+    UpdateBrokerTypeResponse (..),
+    newUpdateBrokerTypeResponse,
+
+    -- * Response Lenses
+    updateBrokerTypeResponse_clusterArn,
+    updateBrokerTypeResponse_clusterOperationArn,
+    updateBrokerTypeResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateBrokerType' smart constructor.
+data UpdateBrokerType = UpdateBrokerType'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text,
+    -- | The cluster version that you want to change. After this operation
+    -- completes successfully, the cluster will have a new version.
+    currentVersion :: Prelude.Text,
+    -- | The Amazon MSK broker type that you want all of the brokers in this
+    -- cluster to be.
+    targetInstanceType :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateBrokerType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateBrokerType_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'currentVersion', 'updateBrokerType_currentVersion' - The cluster version that you want to change. After this operation
+-- completes successfully, the cluster will have a new version.
+--
+-- 'targetInstanceType', 'updateBrokerType_targetInstanceType' - The Amazon MSK broker type that you want all of the brokers in this
+-- cluster to be.
+newUpdateBrokerType ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  -- | 'targetInstanceType'
+  Prelude.Text ->
+  UpdateBrokerType
+newUpdateBrokerType
+  pClusterArn_
+  pCurrentVersion_
+  pTargetInstanceType_ =
+    UpdateBrokerType'
+      { clusterArn = pClusterArn_,
+        currentVersion = pCurrentVersion_,
+        targetInstanceType = pTargetInstanceType_
+      }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+updateBrokerType_clusterArn :: Lens.Lens' UpdateBrokerType Prelude.Text
+updateBrokerType_clusterArn = Lens.lens (\UpdateBrokerType' {clusterArn} -> clusterArn) (\s@UpdateBrokerType' {} a -> s {clusterArn = a} :: UpdateBrokerType)
+
+-- | The cluster version that you want to change. After this operation
+-- completes successfully, the cluster will have a new version.
+updateBrokerType_currentVersion :: Lens.Lens' UpdateBrokerType Prelude.Text
+updateBrokerType_currentVersion = Lens.lens (\UpdateBrokerType' {currentVersion} -> currentVersion) (\s@UpdateBrokerType' {} a -> s {currentVersion = a} :: UpdateBrokerType)
+
+-- | The Amazon MSK broker type that you want all of the brokers in this
+-- cluster to be.
+updateBrokerType_targetInstanceType :: Lens.Lens' UpdateBrokerType Prelude.Text
+updateBrokerType_targetInstanceType = Lens.lens (\UpdateBrokerType' {targetInstanceType} -> targetInstanceType) (\s@UpdateBrokerType' {} a -> s {targetInstanceType = a} :: UpdateBrokerType)
+
+instance Core.AWSRequest UpdateBrokerType where
+  type
+    AWSResponse UpdateBrokerType =
+      UpdateBrokerTypeResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateBrokerTypeResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateBrokerType where
+  hashWithSalt _salt UpdateBrokerType' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` targetInstanceType
+
+instance Prelude.NFData UpdateBrokerType where
+  rnf UpdateBrokerType' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf targetInstanceType
+
+instance Data.ToHeaders UpdateBrokerType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateBrokerType where
+  toJSON UpdateBrokerType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("currentVersion" Data..= currentVersion),
+            Prelude.Just
+              ("targetInstanceType" Data..= targetInstanceType)
+          ]
+      )
+
+instance Data.ToPath UpdateBrokerType where
+  toPath UpdateBrokerType' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/nodes/type"
+      ]
+
+instance Data.ToQuery UpdateBrokerType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateBrokerTypeResponse' smart constructor.
+data UpdateBrokerTypeResponse = UpdateBrokerTypeResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateBrokerTypeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateBrokerTypeResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateBrokerTypeResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateBrokerTypeResponse_httpStatus' - The response's http status code.
+newUpdateBrokerTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateBrokerTypeResponse
+newUpdateBrokerTypeResponse pHttpStatus_ =
+  UpdateBrokerTypeResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateBrokerTypeResponse_clusterArn :: Lens.Lens' UpdateBrokerTypeResponse (Prelude.Maybe Prelude.Text)
+updateBrokerTypeResponse_clusterArn = Lens.lens (\UpdateBrokerTypeResponse' {clusterArn} -> clusterArn) (\s@UpdateBrokerTypeResponse' {} a -> s {clusterArn = a} :: UpdateBrokerTypeResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateBrokerTypeResponse_clusterOperationArn :: Lens.Lens' UpdateBrokerTypeResponse (Prelude.Maybe Prelude.Text)
+updateBrokerTypeResponse_clusterOperationArn = Lens.lens (\UpdateBrokerTypeResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateBrokerTypeResponse' {} a -> s {clusterOperationArn = a} :: UpdateBrokerTypeResponse)
+
+-- | The response's http status code.
+updateBrokerTypeResponse_httpStatus :: Lens.Lens' UpdateBrokerTypeResponse Prelude.Int
+updateBrokerTypeResponse_httpStatus = Lens.lens (\UpdateBrokerTypeResponse' {httpStatus} -> httpStatus) (\s@UpdateBrokerTypeResponse' {} a -> s {httpStatus = a} :: UpdateBrokerTypeResponse)
+
+instance Prelude.NFData UpdateBrokerTypeResponse where
+  rnf UpdateBrokerTypeResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateClusterConfiguration.hs b/gen/Amazonka/Kafka/UpdateClusterConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateClusterConfiguration.hs
@@ -0,0 +1,228 @@
+{-# 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.Kafka.UpdateClusterConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the cluster with the configuration that is specified in the
+-- request body.
+module Amazonka.Kafka.UpdateClusterConfiguration
+  ( -- * Creating a Request
+    UpdateClusterConfiguration (..),
+    newUpdateClusterConfiguration,
+
+    -- * Request Lenses
+    updateClusterConfiguration_clusterArn,
+    updateClusterConfiguration_currentVersion,
+    updateClusterConfiguration_configurationInfo,
+
+    -- * Destructuring the Response
+    UpdateClusterConfigurationResponse (..),
+    newUpdateClusterConfigurationResponse,
+
+    -- * Response Lenses
+    updateClusterConfigurationResponse_clusterArn,
+    updateClusterConfigurationResponse_clusterOperationArn,
+    updateClusterConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateClusterConfiguration' smart constructor.
+data UpdateClusterConfiguration = UpdateClusterConfiguration'
+  { -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text,
+    -- | The version of the cluster that needs to be updated.
+    currentVersion :: Prelude.Text,
+    -- | Represents the configuration that you want MSK to use for the brokers in
+    -- a cluster.
+    configurationInfo :: ConfigurationInfo
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateClusterConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateClusterConfiguration_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'currentVersion', 'updateClusterConfiguration_currentVersion' - The version of the cluster that needs to be updated.
+--
+-- 'configurationInfo', 'updateClusterConfiguration_configurationInfo' - Represents the configuration that you want MSK to use for the brokers in
+-- a cluster.
+newUpdateClusterConfiguration ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  -- | 'configurationInfo'
+  ConfigurationInfo ->
+  UpdateClusterConfiguration
+newUpdateClusterConfiguration
+  pClusterArn_
+  pCurrentVersion_
+  pConfigurationInfo_ =
+    UpdateClusterConfiguration'
+      { clusterArn =
+          pClusterArn_,
+        currentVersion = pCurrentVersion_,
+        configurationInfo = pConfigurationInfo_
+      }
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+updateClusterConfiguration_clusterArn :: Lens.Lens' UpdateClusterConfiguration Prelude.Text
+updateClusterConfiguration_clusterArn = Lens.lens (\UpdateClusterConfiguration' {clusterArn} -> clusterArn) (\s@UpdateClusterConfiguration' {} a -> s {clusterArn = a} :: UpdateClusterConfiguration)
+
+-- | The version of the cluster that needs to be updated.
+updateClusterConfiguration_currentVersion :: Lens.Lens' UpdateClusterConfiguration Prelude.Text
+updateClusterConfiguration_currentVersion = Lens.lens (\UpdateClusterConfiguration' {currentVersion} -> currentVersion) (\s@UpdateClusterConfiguration' {} a -> s {currentVersion = a} :: UpdateClusterConfiguration)
+
+-- | Represents the configuration that you want MSK to use for the brokers in
+-- a cluster.
+updateClusterConfiguration_configurationInfo :: Lens.Lens' UpdateClusterConfiguration ConfigurationInfo
+updateClusterConfiguration_configurationInfo = Lens.lens (\UpdateClusterConfiguration' {configurationInfo} -> configurationInfo) (\s@UpdateClusterConfiguration' {} a -> s {configurationInfo = a} :: UpdateClusterConfiguration)
+
+instance Core.AWSRequest UpdateClusterConfiguration where
+  type
+    AWSResponse UpdateClusterConfiguration =
+      UpdateClusterConfigurationResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateClusterConfigurationResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateClusterConfiguration where
+  hashWithSalt _salt UpdateClusterConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` currentVersion
+      `Prelude.hashWithSalt` configurationInfo
+
+instance Prelude.NFData UpdateClusterConfiguration where
+  rnf UpdateClusterConfiguration' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf currentVersion
+      `Prelude.seq` Prelude.rnf configurationInfo
+
+instance Data.ToHeaders UpdateClusterConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateClusterConfiguration where
+  toJSON UpdateClusterConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("currentVersion" Data..= currentVersion),
+            Prelude.Just
+              ("configurationInfo" Data..= configurationInfo)
+          ]
+      )
+
+instance Data.ToPath UpdateClusterConfiguration where
+  toPath UpdateClusterConfiguration' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/configuration"
+      ]
+
+instance Data.ToQuery UpdateClusterConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateClusterConfigurationResponse' smart constructor.
+data UpdateClusterConfigurationResponse = UpdateClusterConfigurationResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateClusterConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateClusterConfigurationResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateClusterConfigurationResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateClusterConfigurationResponse_httpStatus' - The response's http status code.
+newUpdateClusterConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateClusterConfigurationResponse
+newUpdateClusterConfigurationResponse pHttpStatus_ =
+  UpdateClusterConfigurationResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateClusterConfigurationResponse_clusterArn :: Lens.Lens' UpdateClusterConfigurationResponse (Prelude.Maybe Prelude.Text)
+updateClusterConfigurationResponse_clusterArn = Lens.lens (\UpdateClusterConfigurationResponse' {clusterArn} -> clusterArn) (\s@UpdateClusterConfigurationResponse' {} a -> s {clusterArn = a} :: UpdateClusterConfigurationResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateClusterConfigurationResponse_clusterOperationArn :: Lens.Lens' UpdateClusterConfigurationResponse (Prelude.Maybe Prelude.Text)
+updateClusterConfigurationResponse_clusterOperationArn = Lens.lens (\UpdateClusterConfigurationResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateClusterConfigurationResponse' {} a -> s {clusterOperationArn = a} :: UpdateClusterConfigurationResponse)
+
+-- | The response's http status code.
+updateClusterConfigurationResponse_httpStatus :: Lens.Lens' UpdateClusterConfigurationResponse Prelude.Int
+updateClusterConfigurationResponse_httpStatus = Lens.lens (\UpdateClusterConfigurationResponse' {httpStatus} -> httpStatus) (\s@UpdateClusterConfigurationResponse' {} a -> s {httpStatus = a} :: UpdateClusterConfigurationResponse)
+
+instance
+  Prelude.NFData
+    UpdateClusterConfigurationResponse
+  where
+  rnf UpdateClusterConfigurationResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateClusterKafkaVersion.hs b/gen/Amazonka/Kafka/UpdateClusterKafkaVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateClusterKafkaVersion.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.UpdateClusterKafkaVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the Apache Kafka version for the cluster.
+module Amazonka.Kafka.UpdateClusterKafkaVersion
+  ( -- * Creating a Request
+    UpdateClusterKafkaVersion (..),
+    newUpdateClusterKafkaVersion,
+
+    -- * Request Lenses
+    updateClusterKafkaVersion_configurationInfo,
+    updateClusterKafkaVersion_clusterArn,
+    updateClusterKafkaVersion_targetKafkaVersion,
+    updateClusterKafkaVersion_currentVersion,
+
+    -- * Destructuring the Response
+    UpdateClusterKafkaVersionResponse (..),
+    newUpdateClusterKafkaVersionResponse,
+
+    -- * Response Lenses
+    updateClusterKafkaVersionResponse_clusterArn,
+    updateClusterKafkaVersionResponse_clusterOperationArn,
+    updateClusterKafkaVersionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateClusterKafkaVersion' smart constructor.
+data UpdateClusterKafkaVersion = UpdateClusterKafkaVersion'
+  { -- | The custom configuration that should be applied on the new version of
+    -- cluster.
+    configurationInfo :: Prelude.Maybe ConfigurationInfo,
+    -- | The Amazon Resource Name (ARN) of the cluster to be updated.
+    clusterArn :: Prelude.Text,
+    -- | Target Kafka version.
+    targetKafkaVersion :: Prelude.Text,
+    -- | Current cluster version.
+    currentVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateClusterKafkaVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'configurationInfo', 'updateClusterKafkaVersion_configurationInfo' - The custom configuration that should be applied on the new version of
+-- cluster.
+--
+-- 'clusterArn', 'updateClusterKafkaVersion_clusterArn' - The Amazon Resource Name (ARN) of the cluster to be updated.
+--
+-- 'targetKafkaVersion', 'updateClusterKafkaVersion_targetKafkaVersion' - Target Kafka version.
+--
+-- 'currentVersion', 'updateClusterKafkaVersion_currentVersion' - Current cluster version.
+newUpdateClusterKafkaVersion ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'targetKafkaVersion'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  UpdateClusterKafkaVersion
+newUpdateClusterKafkaVersion
+  pClusterArn_
+  pTargetKafkaVersion_
+  pCurrentVersion_ =
+    UpdateClusterKafkaVersion'
+      { configurationInfo =
+          Prelude.Nothing,
+        clusterArn = pClusterArn_,
+        targetKafkaVersion = pTargetKafkaVersion_,
+        currentVersion = pCurrentVersion_
+      }
+
+-- | The custom configuration that should be applied on the new version of
+-- cluster.
+updateClusterKafkaVersion_configurationInfo :: Lens.Lens' UpdateClusterKafkaVersion (Prelude.Maybe ConfigurationInfo)
+updateClusterKafkaVersion_configurationInfo = Lens.lens (\UpdateClusterKafkaVersion' {configurationInfo} -> configurationInfo) (\s@UpdateClusterKafkaVersion' {} a -> s {configurationInfo = a} :: UpdateClusterKafkaVersion)
+
+-- | The Amazon Resource Name (ARN) of the cluster to be updated.
+updateClusterKafkaVersion_clusterArn :: Lens.Lens' UpdateClusterKafkaVersion Prelude.Text
+updateClusterKafkaVersion_clusterArn = Lens.lens (\UpdateClusterKafkaVersion' {clusterArn} -> clusterArn) (\s@UpdateClusterKafkaVersion' {} a -> s {clusterArn = a} :: UpdateClusterKafkaVersion)
+
+-- | Target Kafka version.
+updateClusterKafkaVersion_targetKafkaVersion :: Lens.Lens' UpdateClusterKafkaVersion Prelude.Text
+updateClusterKafkaVersion_targetKafkaVersion = Lens.lens (\UpdateClusterKafkaVersion' {targetKafkaVersion} -> targetKafkaVersion) (\s@UpdateClusterKafkaVersion' {} a -> s {targetKafkaVersion = a} :: UpdateClusterKafkaVersion)
+
+-- | Current cluster version.
+updateClusterKafkaVersion_currentVersion :: Lens.Lens' UpdateClusterKafkaVersion Prelude.Text
+updateClusterKafkaVersion_currentVersion = Lens.lens (\UpdateClusterKafkaVersion' {currentVersion} -> currentVersion) (\s@UpdateClusterKafkaVersion' {} a -> s {currentVersion = a} :: UpdateClusterKafkaVersion)
+
+instance Core.AWSRequest UpdateClusterKafkaVersion where
+  type
+    AWSResponse UpdateClusterKafkaVersion =
+      UpdateClusterKafkaVersionResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateClusterKafkaVersionResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateClusterKafkaVersion where
+  hashWithSalt _salt UpdateClusterKafkaVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` configurationInfo
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` targetKafkaVersion
+      `Prelude.hashWithSalt` currentVersion
+
+instance Prelude.NFData UpdateClusterKafkaVersion where
+  rnf UpdateClusterKafkaVersion' {..} =
+    Prelude.rnf configurationInfo
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf targetKafkaVersion
+      `Prelude.seq` Prelude.rnf currentVersion
+
+instance Data.ToHeaders UpdateClusterKafkaVersion where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateClusterKafkaVersion where
+  toJSON UpdateClusterKafkaVersion' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("configurationInfo" Data..=)
+              Prelude.<$> configurationInfo,
+            Prelude.Just
+              ("targetKafkaVersion" Data..= targetKafkaVersion),
+            Prelude.Just
+              ("currentVersion" Data..= currentVersion)
+          ]
+      )
+
+instance Data.ToPath UpdateClusterKafkaVersion where
+  toPath UpdateClusterKafkaVersion' {..} =
+    Prelude.mconcat
+      ["/v1/clusters/", Data.toBS clusterArn, "/version"]
+
+instance Data.ToQuery UpdateClusterKafkaVersion where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateClusterKafkaVersionResponse' smart constructor.
+data UpdateClusterKafkaVersionResponse = UpdateClusterKafkaVersionResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateClusterKafkaVersionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateClusterKafkaVersionResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateClusterKafkaVersionResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateClusterKafkaVersionResponse_httpStatus' - The response's http status code.
+newUpdateClusterKafkaVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateClusterKafkaVersionResponse
+newUpdateClusterKafkaVersionResponse pHttpStatus_ =
+  UpdateClusterKafkaVersionResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateClusterKafkaVersionResponse_clusterArn :: Lens.Lens' UpdateClusterKafkaVersionResponse (Prelude.Maybe Prelude.Text)
+updateClusterKafkaVersionResponse_clusterArn = Lens.lens (\UpdateClusterKafkaVersionResponse' {clusterArn} -> clusterArn) (\s@UpdateClusterKafkaVersionResponse' {} a -> s {clusterArn = a} :: UpdateClusterKafkaVersionResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateClusterKafkaVersionResponse_clusterOperationArn :: Lens.Lens' UpdateClusterKafkaVersionResponse (Prelude.Maybe Prelude.Text)
+updateClusterKafkaVersionResponse_clusterOperationArn = Lens.lens (\UpdateClusterKafkaVersionResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateClusterKafkaVersionResponse' {} a -> s {clusterOperationArn = a} :: UpdateClusterKafkaVersionResponse)
+
+-- | The response's http status code.
+updateClusterKafkaVersionResponse_httpStatus :: Lens.Lens' UpdateClusterKafkaVersionResponse Prelude.Int
+updateClusterKafkaVersionResponse_httpStatus = Lens.lens (\UpdateClusterKafkaVersionResponse' {httpStatus} -> httpStatus) (\s@UpdateClusterKafkaVersionResponse' {} a -> s {httpStatus = a} :: UpdateClusterKafkaVersionResponse)
+
+instance
+  Prelude.NFData
+    UpdateClusterKafkaVersionResponse
+  where
+  rnf UpdateClusterKafkaVersionResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateConfiguration.hs b/gen/Amazonka/Kafka/UpdateConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateConfiguration.hs
@@ -0,0 +1,228 @@
+{-# 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.Kafka.UpdateConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an MSK configuration.
+module Amazonka.Kafka.UpdateConfiguration
+  ( -- * Creating a Request
+    UpdateConfiguration (..),
+    newUpdateConfiguration,
+
+    -- * Request Lenses
+    updateConfiguration_description,
+    updateConfiguration_arn,
+    updateConfiguration_serverProperties,
+
+    -- * Destructuring the Response
+    UpdateConfigurationResponse (..),
+    newUpdateConfigurationResponse,
+
+    -- * Response Lenses
+    updateConfigurationResponse_arn,
+    updateConfigurationResponse_latestRevision,
+    updateConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateConfiguration' smart constructor.
+data UpdateConfiguration = UpdateConfiguration'
+  { -- | The description of the configuration revision.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the configuration.
+    arn :: Prelude.Text,
+    -- | Contents of the server.properties file. When using the API, you must
+    -- ensure that the contents of the file are base64 encoded. When using the
+    -- AWS Management Console, the SDK, or the AWS CLI, the contents of
+    -- server.properties can be in plaintext.
+    serverProperties :: Data.Base64
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'updateConfiguration_description' - The description of the configuration revision.
+--
+-- 'arn', 'updateConfiguration_arn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'serverProperties', 'updateConfiguration_serverProperties' - Contents of the server.properties file. When using the API, you must
+-- ensure that the contents of the file are base64 encoded. When using the
+-- AWS Management Console, the SDK, or the AWS CLI, the contents of
+-- server.properties can be in plaintext.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+newUpdateConfiguration ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'serverProperties'
+  Prelude.ByteString ->
+  UpdateConfiguration
+newUpdateConfiguration pArn_ pServerProperties_ =
+  UpdateConfiguration'
+    { description = Prelude.Nothing,
+      arn = pArn_,
+      serverProperties =
+        Data._Base64 Lens.# pServerProperties_
+    }
+
+-- | The description of the configuration revision.
+updateConfiguration_description :: Lens.Lens' UpdateConfiguration (Prelude.Maybe Prelude.Text)
+updateConfiguration_description = Lens.lens (\UpdateConfiguration' {description} -> description) (\s@UpdateConfiguration' {} a -> s {description = a} :: UpdateConfiguration)
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+updateConfiguration_arn :: Lens.Lens' UpdateConfiguration Prelude.Text
+updateConfiguration_arn = Lens.lens (\UpdateConfiguration' {arn} -> arn) (\s@UpdateConfiguration' {} a -> s {arn = a} :: UpdateConfiguration)
+
+-- | Contents of the server.properties file. When using the API, you must
+-- ensure that the contents of the file are base64 encoded. When using the
+-- AWS Management Console, the SDK, or the AWS CLI, the contents of
+-- server.properties can be in plaintext.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+updateConfiguration_serverProperties :: Lens.Lens' UpdateConfiguration Prelude.ByteString
+updateConfiguration_serverProperties = Lens.lens (\UpdateConfiguration' {serverProperties} -> serverProperties) (\s@UpdateConfiguration' {} a -> s {serverProperties = a} :: UpdateConfiguration) Prelude.. Data._Base64
+
+instance Core.AWSRequest UpdateConfiguration where
+  type
+    AWSResponse UpdateConfiguration =
+      UpdateConfigurationResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateConfigurationResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "latestRevision")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateConfiguration where
+  hashWithSalt _salt UpdateConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` serverProperties
+
+instance Prelude.NFData UpdateConfiguration where
+  rnf UpdateConfiguration' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf serverProperties
+
+instance Data.ToHeaders UpdateConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateConfiguration where
+  toJSON UpdateConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            Prelude.Just
+              ("serverProperties" Data..= serverProperties)
+          ]
+      )
+
+instance Data.ToPath UpdateConfiguration where
+  toPath UpdateConfiguration' {..} =
+    Prelude.mconcat
+      ["/v1/configurations/", Data.toBS arn]
+
+instance Data.ToQuery UpdateConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateConfigurationResponse' smart constructor.
+data UpdateConfigurationResponse = UpdateConfigurationResponse'
+  { -- | The Amazon Resource Name (ARN) of the configuration.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | Latest revision of the configuration.
+    latestRevision :: Prelude.Maybe ConfigurationRevision,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'updateConfigurationResponse_arn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'latestRevision', 'updateConfigurationResponse_latestRevision' - Latest revision of the configuration.
+--
+-- 'httpStatus', 'updateConfigurationResponse_httpStatus' - The response's http status code.
+newUpdateConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateConfigurationResponse
+newUpdateConfigurationResponse pHttpStatus_ =
+  UpdateConfigurationResponse'
+    { arn = Prelude.Nothing,
+      latestRevision = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+updateConfigurationResponse_arn :: Lens.Lens' UpdateConfigurationResponse (Prelude.Maybe Prelude.Text)
+updateConfigurationResponse_arn = Lens.lens (\UpdateConfigurationResponse' {arn} -> arn) (\s@UpdateConfigurationResponse' {} a -> s {arn = a} :: UpdateConfigurationResponse)
+
+-- | Latest revision of the configuration.
+updateConfigurationResponse_latestRevision :: Lens.Lens' UpdateConfigurationResponse (Prelude.Maybe ConfigurationRevision)
+updateConfigurationResponse_latestRevision = Lens.lens (\UpdateConfigurationResponse' {latestRevision} -> latestRevision) (\s@UpdateConfigurationResponse' {} a -> s {latestRevision = a} :: UpdateConfigurationResponse)
+
+-- | The response's http status code.
+updateConfigurationResponse_httpStatus :: Lens.Lens' UpdateConfigurationResponse Prelude.Int
+updateConfigurationResponse_httpStatus = Lens.lens (\UpdateConfigurationResponse' {httpStatus} -> httpStatus) (\s@UpdateConfigurationResponse' {} a -> s {httpStatus = a} :: UpdateConfigurationResponse)
+
+instance Prelude.NFData UpdateConfigurationResponse where
+  rnf UpdateConfigurationResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf latestRevision
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateConnectivity.hs b/gen/Amazonka/Kafka/UpdateConnectivity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateConnectivity.hs
@@ -0,0 +1,231 @@
+{-# 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.Kafka.UpdateConnectivity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the cluster\'s connectivity configuration.
+module Amazonka.Kafka.UpdateConnectivity
+  ( -- * Creating a Request
+    UpdateConnectivity (..),
+    newUpdateConnectivity,
+
+    -- * Request Lenses
+    updateConnectivity_clusterArn,
+    updateConnectivity_connectivityInfo,
+    updateConnectivity_currentVersion,
+
+    -- * Destructuring the Response
+    UpdateConnectivityResponse (..),
+    newUpdateConnectivityResponse,
+
+    -- * Response Lenses
+    updateConnectivityResponse_clusterArn,
+    updateConnectivityResponse_clusterOperationArn,
+    updateConnectivityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request body for UpdateConnectivity.
+--
+-- /See:/ 'newUpdateConnectivity' smart constructor.
+data UpdateConnectivity = UpdateConnectivity'
+  { -- | The Amazon Resource Name (ARN) of the configuration.
+    clusterArn :: Prelude.Text,
+    -- | Information about the broker access configuration.
+    connectivityInfo :: ConnectivityInfo,
+    -- | The version of the MSK cluster to update. Cluster versions aren\'t
+    -- simple numbers. You can describe an MSK cluster to find its version.
+    -- When this update operation is successful, it generates a new cluster
+    -- version.
+    currentVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateConnectivity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateConnectivity_clusterArn' - The Amazon Resource Name (ARN) of the configuration.
+--
+-- 'connectivityInfo', 'updateConnectivity_connectivityInfo' - Information about the broker access configuration.
+--
+-- 'currentVersion', 'updateConnectivity_currentVersion' - The version of the MSK cluster to update. Cluster versions aren\'t
+-- simple numbers. You can describe an MSK cluster to find its version.
+-- When this update operation is successful, it generates a new cluster
+-- version.
+newUpdateConnectivity ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'connectivityInfo'
+  ConnectivityInfo ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  UpdateConnectivity
+newUpdateConnectivity
+  pClusterArn_
+  pConnectivityInfo_
+  pCurrentVersion_ =
+    UpdateConnectivity'
+      { clusterArn = pClusterArn_,
+        connectivityInfo = pConnectivityInfo_,
+        currentVersion = pCurrentVersion_
+      }
+
+-- | The Amazon Resource Name (ARN) of the configuration.
+updateConnectivity_clusterArn :: Lens.Lens' UpdateConnectivity Prelude.Text
+updateConnectivity_clusterArn = Lens.lens (\UpdateConnectivity' {clusterArn} -> clusterArn) (\s@UpdateConnectivity' {} a -> s {clusterArn = a} :: UpdateConnectivity)
+
+-- | Information about the broker access configuration.
+updateConnectivity_connectivityInfo :: Lens.Lens' UpdateConnectivity ConnectivityInfo
+updateConnectivity_connectivityInfo = Lens.lens (\UpdateConnectivity' {connectivityInfo} -> connectivityInfo) (\s@UpdateConnectivity' {} a -> s {connectivityInfo = a} :: UpdateConnectivity)
+
+-- | The version of the MSK cluster to update. Cluster versions aren\'t
+-- simple numbers. You can describe an MSK cluster to find its version.
+-- When this update operation is successful, it generates a new cluster
+-- version.
+updateConnectivity_currentVersion :: Lens.Lens' UpdateConnectivity Prelude.Text
+updateConnectivity_currentVersion = Lens.lens (\UpdateConnectivity' {currentVersion} -> currentVersion) (\s@UpdateConnectivity' {} a -> s {currentVersion = a} :: UpdateConnectivity)
+
+instance Core.AWSRequest UpdateConnectivity where
+  type
+    AWSResponse UpdateConnectivity =
+      UpdateConnectivityResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateConnectivityResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateConnectivity where
+  hashWithSalt _salt UpdateConnectivity' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` connectivityInfo
+      `Prelude.hashWithSalt` currentVersion
+
+instance Prelude.NFData UpdateConnectivity where
+  rnf UpdateConnectivity' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf connectivityInfo
+      `Prelude.seq` Prelude.rnf currentVersion
+
+instance Data.ToHeaders UpdateConnectivity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateConnectivity where
+  toJSON UpdateConnectivity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("connectivityInfo" Data..= connectivityInfo),
+            Prelude.Just
+              ("currentVersion" Data..= currentVersion)
+          ]
+      )
+
+instance Data.ToPath UpdateConnectivity where
+  toPath UpdateConnectivity' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/connectivity"
+      ]
+
+instance Data.ToQuery UpdateConnectivity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateConnectivityResponse' smart constructor.
+data UpdateConnectivityResponse = UpdateConnectivityResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateConnectivityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateConnectivityResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateConnectivityResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateConnectivityResponse_httpStatus' - The response's http status code.
+newUpdateConnectivityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateConnectivityResponse
+newUpdateConnectivityResponse pHttpStatus_ =
+  UpdateConnectivityResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateConnectivityResponse_clusterArn :: Lens.Lens' UpdateConnectivityResponse (Prelude.Maybe Prelude.Text)
+updateConnectivityResponse_clusterArn = Lens.lens (\UpdateConnectivityResponse' {clusterArn} -> clusterArn) (\s@UpdateConnectivityResponse' {} a -> s {clusterArn = a} :: UpdateConnectivityResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateConnectivityResponse_clusterOperationArn :: Lens.Lens' UpdateConnectivityResponse (Prelude.Maybe Prelude.Text)
+updateConnectivityResponse_clusterOperationArn = Lens.lens (\UpdateConnectivityResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateConnectivityResponse' {} a -> s {clusterOperationArn = a} :: UpdateConnectivityResponse)
+
+-- | The response's http status code.
+updateConnectivityResponse_httpStatus :: Lens.Lens' UpdateConnectivityResponse Prelude.Int
+updateConnectivityResponse_httpStatus = Lens.lens (\UpdateConnectivityResponse' {httpStatus} -> httpStatus) (\s@UpdateConnectivityResponse' {} a -> s {httpStatus = a} :: UpdateConnectivityResponse)
+
+instance Prelude.NFData UpdateConnectivityResponse where
+  rnf UpdateConnectivityResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateMonitoring.hs b/gen/Amazonka/Kafka/UpdateMonitoring.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateMonitoring.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Kafka.UpdateMonitoring
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the monitoring settings for the cluster. You can use this
+-- operation to specify which Apache Kafka metrics you want Amazon MSK to
+-- send to Amazon CloudWatch. You can also specify settings for open
+-- monitoring with Prometheus.
+module Amazonka.Kafka.UpdateMonitoring
+  ( -- * Creating a Request
+    UpdateMonitoring (..),
+    newUpdateMonitoring,
+
+    -- * Request Lenses
+    updateMonitoring_enhancedMonitoring,
+    updateMonitoring_loggingInfo,
+    updateMonitoring_openMonitoring,
+    updateMonitoring_clusterArn,
+    updateMonitoring_currentVersion,
+
+    -- * Destructuring the Response
+    UpdateMonitoringResponse (..),
+    newUpdateMonitoringResponse,
+
+    -- * Response Lenses
+    updateMonitoringResponse_clusterArn,
+    updateMonitoringResponse_clusterOperationArn,
+    updateMonitoringResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request body for UpdateMonitoring.
+--
+-- /See:/ 'newUpdateMonitoring' smart constructor.
+data UpdateMonitoring = UpdateMonitoring'
+  { -- | Specifies which Apache Kafka metrics Amazon MSK gathers and sends to
+    -- Amazon CloudWatch for this cluster.
+    enhancedMonitoring :: Prelude.Maybe EnhancedMonitoring,
+    loggingInfo :: Prelude.Maybe LoggingInfo,
+    -- | The settings for open monitoring.
+    openMonitoring :: Prelude.Maybe OpenMonitoringInfo,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text,
+    -- | The version of the MSK cluster to update. Cluster versions aren\'t
+    -- simple numbers. You can describe an MSK cluster to find its version.
+    -- When this update operation is successful, it generates a new cluster
+    -- version.
+    currentVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMonitoring' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enhancedMonitoring', 'updateMonitoring_enhancedMonitoring' - Specifies which Apache Kafka metrics Amazon MSK gathers and sends to
+-- Amazon CloudWatch for this cluster.
+--
+-- 'loggingInfo', 'updateMonitoring_loggingInfo' - Undocumented member.
+--
+-- 'openMonitoring', 'updateMonitoring_openMonitoring' - The settings for open monitoring.
+--
+-- 'clusterArn', 'updateMonitoring_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'currentVersion', 'updateMonitoring_currentVersion' - The version of the MSK cluster to update. Cluster versions aren\'t
+-- simple numbers. You can describe an MSK cluster to find its version.
+-- When this update operation is successful, it generates a new cluster
+-- version.
+newUpdateMonitoring ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  UpdateMonitoring
+newUpdateMonitoring pClusterArn_ pCurrentVersion_ =
+  UpdateMonitoring'
+    { enhancedMonitoring =
+        Prelude.Nothing,
+      loggingInfo = Prelude.Nothing,
+      openMonitoring = Prelude.Nothing,
+      clusterArn = pClusterArn_,
+      currentVersion = pCurrentVersion_
+    }
+
+-- | Specifies which Apache Kafka metrics Amazon MSK gathers and sends to
+-- Amazon CloudWatch for this cluster.
+updateMonitoring_enhancedMonitoring :: Lens.Lens' UpdateMonitoring (Prelude.Maybe EnhancedMonitoring)
+updateMonitoring_enhancedMonitoring = Lens.lens (\UpdateMonitoring' {enhancedMonitoring} -> enhancedMonitoring) (\s@UpdateMonitoring' {} a -> s {enhancedMonitoring = a} :: UpdateMonitoring)
+
+-- | Undocumented member.
+updateMonitoring_loggingInfo :: Lens.Lens' UpdateMonitoring (Prelude.Maybe LoggingInfo)
+updateMonitoring_loggingInfo = Lens.lens (\UpdateMonitoring' {loggingInfo} -> loggingInfo) (\s@UpdateMonitoring' {} a -> s {loggingInfo = a} :: UpdateMonitoring)
+
+-- | The settings for open monitoring.
+updateMonitoring_openMonitoring :: Lens.Lens' UpdateMonitoring (Prelude.Maybe OpenMonitoringInfo)
+updateMonitoring_openMonitoring = Lens.lens (\UpdateMonitoring' {openMonitoring} -> openMonitoring) (\s@UpdateMonitoring' {} a -> s {openMonitoring = a} :: UpdateMonitoring)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+updateMonitoring_clusterArn :: Lens.Lens' UpdateMonitoring Prelude.Text
+updateMonitoring_clusterArn = Lens.lens (\UpdateMonitoring' {clusterArn} -> clusterArn) (\s@UpdateMonitoring' {} a -> s {clusterArn = a} :: UpdateMonitoring)
+
+-- | The version of the MSK cluster to update. Cluster versions aren\'t
+-- simple numbers. You can describe an MSK cluster to find its version.
+-- When this update operation is successful, it generates a new cluster
+-- version.
+updateMonitoring_currentVersion :: Lens.Lens' UpdateMonitoring Prelude.Text
+updateMonitoring_currentVersion = Lens.lens (\UpdateMonitoring' {currentVersion} -> currentVersion) (\s@UpdateMonitoring' {} a -> s {currentVersion = a} :: UpdateMonitoring)
+
+instance Core.AWSRequest UpdateMonitoring where
+  type
+    AWSResponse UpdateMonitoring =
+      UpdateMonitoringResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateMonitoringResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateMonitoring where
+  hashWithSalt _salt UpdateMonitoring' {..} =
+    _salt
+      `Prelude.hashWithSalt` enhancedMonitoring
+      `Prelude.hashWithSalt` loggingInfo
+      `Prelude.hashWithSalt` openMonitoring
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` currentVersion
+
+instance Prelude.NFData UpdateMonitoring where
+  rnf UpdateMonitoring' {..} =
+    Prelude.rnf enhancedMonitoring
+      `Prelude.seq` Prelude.rnf loggingInfo
+      `Prelude.seq` Prelude.rnf openMonitoring
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf currentVersion
+
+instance Data.ToHeaders UpdateMonitoring where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateMonitoring where
+  toJSON UpdateMonitoring' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("enhancedMonitoring" Data..=)
+              Prelude.<$> enhancedMonitoring,
+            ("loggingInfo" Data..=) Prelude.<$> loggingInfo,
+            ("openMonitoring" Data..=)
+              Prelude.<$> openMonitoring,
+            Prelude.Just
+              ("currentVersion" Data..= currentVersion)
+          ]
+      )
+
+instance Data.ToPath UpdateMonitoring where
+  toPath UpdateMonitoring' {..} =
+    Prelude.mconcat
+      [ "/v1/clusters/",
+        Data.toBS clusterArn,
+        "/monitoring"
+      ]
+
+instance Data.ToQuery UpdateMonitoring where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateMonitoringResponse' smart constructor.
+data UpdateMonitoringResponse = UpdateMonitoringResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateMonitoringResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateMonitoringResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateMonitoringResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateMonitoringResponse_httpStatus' - The response's http status code.
+newUpdateMonitoringResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateMonitoringResponse
+newUpdateMonitoringResponse pHttpStatus_ =
+  UpdateMonitoringResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateMonitoringResponse_clusterArn :: Lens.Lens' UpdateMonitoringResponse (Prelude.Maybe Prelude.Text)
+updateMonitoringResponse_clusterArn = Lens.lens (\UpdateMonitoringResponse' {clusterArn} -> clusterArn) (\s@UpdateMonitoringResponse' {} a -> s {clusterArn = a} :: UpdateMonitoringResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateMonitoringResponse_clusterOperationArn :: Lens.Lens' UpdateMonitoringResponse (Prelude.Maybe Prelude.Text)
+updateMonitoringResponse_clusterOperationArn = Lens.lens (\UpdateMonitoringResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateMonitoringResponse' {} a -> s {clusterOperationArn = a} :: UpdateMonitoringResponse)
+
+-- | The response's http status code.
+updateMonitoringResponse_httpStatus :: Lens.Lens' UpdateMonitoringResponse Prelude.Int
+updateMonitoringResponse_httpStatus = Lens.lens (\UpdateMonitoringResponse' {httpStatus} -> httpStatus) (\s@UpdateMonitoringResponse' {} a -> s {httpStatus = a} :: UpdateMonitoringResponse)
+
+instance Prelude.NFData UpdateMonitoringResponse where
+  rnf UpdateMonitoringResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateSecurity.hs b/gen/Amazonka/Kafka/UpdateSecurity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateSecurity.hs
@@ -0,0 +1,237 @@
+{-# 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.Kafka.UpdateSecurity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the security settings for the cluster. You can use this
+-- operation to specify encryption and authentication on existing clusters.
+module Amazonka.Kafka.UpdateSecurity
+  ( -- * Creating a Request
+    UpdateSecurity (..),
+    newUpdateSecurity,
+
+    -- * Request Lenses
+    updateSecurity_clientAuthentication,
+    updateSecurity_encryptionInfo,
+    updateSecurity_clusterArn,
+    updateSecurity_currentVersion,
+
+    -- * Destructuring the Response
+    UpdateSecurityResponse (..),
+    newUpdateSecurityResponse,
+
+    -- * Response Lenses
+    updateSecurityResponse_clusterArn,
+    updateSecurityResponse_clusterOperationArn,
+    updateSecurityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateSecurity' smart constructor.
+data UpdateSecurity = UpdateSecurity'
+  { -- | Includes all client authentication related information.
+    clientAuthentication :: Prelude.Maybe ClientAuthentication,
+    -- | Includes all encryption-related information.
+    encryptionInfo :: Prelude.Maybe EncryptionInfo,
+    -- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+    clusterArn :: Prelude.Text,
+    -- | The version of the MSK cluster to update. Cluster versions aren\'t
+    -- simple numbers. You can describe an MSK cluster to find its version.
+    -- When this update operation is successful, it generates a new cluster
+    -- version.
+    currentVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateSecurity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientAuthentication', 'updateSecurity_clientAuthentication' - Includes all client authentication related information.
+--
+-- 'encryptionInfo', 'updateSecurity_encryptionInfo' - Includes all encryption-related information.
+--
+-- 'clusterArn', 'updateSecurity_clusterArn' - The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+--
+-- 'currentVersion', 'updateSecurity_currentVersion' - The version of the MSK cluster to update. Cluster versions aren\'t
+-- simple numbers. You can describe an MSK cluster to find its version.
+-- When this update operation is successful, it generates a new cluster
+-- version.
+newUpdateSecurity ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  UpdateSecurity
+newUpdateSecurity pClusterArn_ pCurrentVersion_ =
+  UpdateSecurity'
+    { clientAuthentication =
+        Prelude.Nothing,
+      encryptionInfo = Prelude.Nothing,
+      clusterArn = pClusterArn_,
+      currentVersion = pCurrentVersion_
+    }
+
+-- | Includes all client authentication related information.
+updateSecurity_clientAuthentication :: Lens.Lens' UpdateSecurity (Prelude.Maybe ClientAuthentication)
+updateSecurity_clientAuthentication = Lens.lens (\UpdateSecurity' {clientAuthentication} -> clientAuthentication) (\s@UpdateSecurity' {} a -> s {clientAuthentication = a} :: UpdateSecurity)
+
+-- | Includes all encryption-related information.
+updateSecurity_encryptionInfo :: Lens.Lens' UpdateSecurity (Prelude.Maybe EncryptionInfo)
+updateSecurity_encryptionInfo = Lens.lens (\UpdateSecurity' {encryptionInfo} -> encryptionInfo) (\s@UpdateSecurity' {} a -> s {encryptionInfo = a} :: UpdateSecurity)
+
+-- | The Amazon Resource Name (ARN) that uniquely identifies the cluster.
+updateSecurity_clusterArn :: Lens.Lens' UpdateSecurity Prelude.Text
+updateSecurity_clusterArn = Lens.lens (\UpdateSecurity' {clusterArn} -> clusterArn) (\s@UpdateSecurity' {} a -> s {clusterArn = a} :: UpdateSecurity)
+
+-- | The version of the MSK cluster to update. Cluster versions aren\'t
+-- simple numbers. You can describe an MSK cluster to find its version.
+-- When this update operation is successful, it generates a new cluster
+-- version.
+updateSecurity_currentVersion :: Lens.Lens' UpdateSecurity Prelude.Text
+updateSecurity_currentVersion = Lens.lens (\UpdateSecurity' {currentVersion} -> currentVersion) (\s@UpdateSecurity' {} a -> s {currentVersion = a} :: UpdateSecurity)
+
+instance Core.AWSRequest UpdateSecurity where
+  type
+    AWSResponse UpdateSecurity =
+      UpdateSecurityResponse
+  request overrides =
+    Request.patchJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateSecurityResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateSecurity where
+  hashWithSalt _salt UpdateSecurity' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientAuthentication
+      `Prelude.hashWithSalt` encryptionInfo
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` currentVersion
+
+instance Prelude.NFData UpdateSecurity where
+  rnf UpdateSecurity' {..} =
+    Prelude.rnf clientAuthentication
+      `Prelude.seq` Prelude.rnf encryptionInfo
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf currentVersion
+
+instance Data.ToHeaders UpdateSecurity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateSecurity where
+  toJSON UpdateSecurity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientAuthentication" Data..=)
+              Prelude.<$> clientAuthentication,
+            ("encryptionInfo" Data..=)
+              Prelude.<$> encryptionInfo,
+            Prelude.Just
+              ("currentVersion" Data..= currentVersion)
+          ]
+      )
+
+instance Data.ToPath UpdateSecurity where
+  toPath UpdateSecurity' {..} =
+    Prelude.mconcat
+      ["/v1/clusters/", Data.toBS clusterArn, "/security"]
+
+instance Data.ToQuery UpdateSecurity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateSecurityResponse' smart constructor.
+data UpdateSecurityResponse = UpdateSecurityResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateSecurityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateSecurityResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateSecurityResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateSecurityResponse_httpStatus' - The response's http status code.
+newUpdateSecurityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateSecurityResponse
+newUpdateSecurityResponse pHttpStatus_ =
+  UpdateSecurityResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateSecurityResponse_clusterArn :: Lens.Lens' UpdateSecurityResponse (Prelude.Maybe Prelude.Text)
+updateSecurityResponse_clusterArn = Lens.lens (\UpdateSecurityResponse' {clusterArn} -> clusterArn) (\s@UpdateSecurityResponse' {} a -> s {clusterArn = a} :: UpdateSecurityResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateSecurityResponse_clusterOperationArn :: Lens.Lens' UpdateSecurityResponse (Prelude.Maybe Prelude.Text)
+updateSecurityResponse_clusterOperationArn = Lens.lens (\UpdateSecurityResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateSecurityResponse' {} a -> s {clusterOperationArn = a} :: UpdateSecurityResponse)
+
+-- | The response's http status code.
+updateSecurityResponse_httpStatus :: Lens.Lens' UpdateSecurityResponse Prelude.Int
+updateSecurityResponse_httpStatus = Lens.lens (\UpdateSecurityResponse' {httpStatus} -> httpStatus) (\s@UpdateSecurityResponse' {} a -> s {httpStatus = a} :: UpdateSecurityResponse)
+
+instance Prelude.NFData UpdateSecurityResponse where
+  rnf UpdateSecurityResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/UpdateStorage.hs b/gen/Amazonka/Kafka/UpdateStorage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/UpdateStorage.hs
@@ -0,0 +1,246 @@
+{-# 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.Kafka.UpdateStorage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates cluster broker volume size (or) sets cluster storage mode to
+-- TIERED.
+module Amazonka.Kafka.UpdateStorage
+  ( -- * Creating a Request
+    UpdateStorage (..),
+    newUpdateStorage,
+
+    -- * Request Lenses
+    updateStorage_provisionedThroughput,
+    updateStorage_storageMode,
+    updateStorage_volumeSizeGB,
+    updateStorage_clusterArn,
+    updateStorage_currentVersion,
+
+    -- * Destructuring the Response
+    UpdateStorageResponse (..),
+    newUpdateStorageResponse,
+
+    -- * Response Lenses
+    updateStorageResponse_clusterArn,
+    updateStorageResponse_clusterOperationArn,
+    updateStorageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Request object for UpdateStorage api. Its used to update the storage
+-- attributes for the cluster.
+--
+-- /See:/ 'newUpdateStorage' smart constructor.
+data UpdateStorage = UpdateStorage'
+  { -- | EBS volume provisioned throughput information.
+    provisionedThroughput :: Prelude.Maybe ProvisionedThroughput,
+    -- | Controls storage mode for supported storage tiers.
+    storageMode :: Prelude.Maybe StorageMode,
+    -- | size of the EBS volume to update.
+    volumeSizeGB :: Prelude.Maybe Prelude.Int,
+    -- | The Amazon Resource Name (ARN) of the cluster to be updated.
+    clusterArn :: Prelude.Text,
+    -- | The version of cluster to update from. A successful operation will then
+    -- generate a new version.
+    currentVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateStorage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'provisionedThroughput', 'updateStorage_provisionedThroughput' - EBS volume provisioned throughput information.
+--
+-- 'storageMode', 'updateStorage_storageMode' - Controls storage mode for supported storage tiers.
+--
+-- 'volumeSizeGB', 'updateStorage_volumeSizeGB' - size of the EBS volume to update.
+--
+-- 'clusterArn', 'updateStorage_clusterArn' - The Amazon Resource Name (ARN) of the cluster to be updated.
+--
+-- 'currentVersion', 'updateStorage_currentVersion' - The version of cluster to update from. A successful operation will then
+-- generate a new version.
+newUpdateStorage ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'currentVersion'
+  Prelude.Text ->
+  UpdateStorage
+newUpdateStorage pClusterArn_ pCurrentVersion_ =
+  UpdateStorage'
+    { provisionedThroughput =
+        Prelude.Nothing,
+      storageMode = Prelude.Nothing,
+      volumeSizeGB = Prelude.Nothing,
+      clusterArn = pClusterArn_,
+      currentVersion = pCurrentVersion_
+    }
+
+-- | EBS volume provisioned throughput information.
+updateStorage_provisionedThroughput :: Lens.Lens' UpdateStorage (Prelude.Maybe ProvisionedThroughput)
+updateStorage_provisionedThroughput = Lens.lens (\UpdateStorage' {provisionedThroughput} -> provisionedThroughput) (\s@UpdateStorage' {} a -> s {provisionedThroughput = a} :: UpdateStorage)
+
+-- | Controls storage mode for supported storage tiers.
+updateStorage_storageMode :: Lens.Lens' UpdateStorage (Prelude.Maybe StorageMode)
+updateStorage_storageMode = Lens.lens (\UpdateStorage' {storageMode} -> storageMode) (\s@UpdateStorage' {} a -> s {storageMode = a} :: UpdateStorage)
+
+-- | size of the EBS volume to update.
+updateStorage_volumeSizeGB :: Lens.Lens' UpdateStorage (Prelude.Maybe Prelude.Int)
+updateStorage_volumeSizeGB = Lens.lens (\UpdateStorage' {volumeSizeGB} -> volumeSizeGB) (\s@UpdateStorage' {} a -> s {volumeSizeGB = a} :: UpdateStorage)
+
+-- | The Amazon Resource Name (ARN) of the cluster to be updated.
+updateStorage_clusterArn :: Lens.Lens' UpdateStorage Prelude.Text
+updateStorage_clusterArn = Lens.lens (\UpdateStorage' {clusterArn} -> clusterArn) (\s@UpdateStorage' {} a -> s {clusterArn = a} :: UpdateStorage)
+
+-- | The version of cluster to update from. A successful operation will then
+-- generate a new version.
+updateStorage_currentVersion :: Lens.Lens' UpdateStorage Prelude.Text
+updateStorage_currentVersion = Lens.lens (\UpdateStorage' {currentVersion} -> currentVersion) (\s@UpdateStorage' {} a -> s {currentVersion = a} :: UpdateStorage)
+
+instance Core.AWSRequest UpdateStorage where
+  type
+    AWSResponse UpdateStorage =
+      UpdateStorageResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateStorageResponse'
+            Prelude.<$> (x Data..?> "clusterArn")
+            Prelude.<*> (x Data..?> "clusterOperationArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateStorage where
+  hashWithSalt _salt UpdateStorage' {..} =
+    _salt
+      `Prelude.hashWithSalt` provisionedThroughput
+      `Prelude.hashWithSalt` storageMode
+      `Prelude.hashWithSalt` volumeSizeGB
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` currentVersion
+
+instance Prelude.NFData UpdateStorage where
+  rnf UpdateStorage' {..} =
+    Prelude.rnf provisionedThroughput
+      `Prelude.seq` Prelude.rnf storageMode
+      `Prelude.seq` Prelude.rnf volumeSizeGB
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf currentVersion
+
+instance Data.ToHeaders UpdateStorage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateStorage where
+  toJSON UpdateStorage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("provisionedThroughput" Data..=)
+              Prelude.<$> provisionedThroughput,
+            ("storageMode" Data..=) Prelude.<$> storageMode,
+            ("volumeSizeGB" Data..=) Prelude.<$> volumeSizeGB,
+            Prelude.Just
+              ("currentVersion" Data..= currentVersion)
+          ]
+      )
+
+instance Data.ToPath UpdateStorage where
+  toPath UpdateStorage' {..} =
+    Prelude.mconcat
+      ["/v1/clusters/", Data.toBS clusterArn, "/storage"]
+
+instance Data.ToQuery UpdateStorage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateStorageResponse' smart constructor.
+data UpdateStorageResponse = UpdateStorageResponse'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster operation.
+    clusterOperationArn :: 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 'UpdateStorageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clusterArn', 'updateStorageResponse_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterOperationArn', 'updateStorageResponse_clusterOperationArn' - The Amazon Resource Name (ARN) of the cluster operation.
+--
+-- 'httpStatus', 'updateStorageResponse_httpStatus' - The response's http status code.
+newUpdateStorageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateStorageResponse
+newUpdateStorageResponse pHttpStatus_ =
+  UpdateStorageResponse'
+    { clusterArn =
+        Prelude.Nothing,
+      clusterOperationArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+updateStorageResponse_clusterArn :: Lens.Lens' UpdateStorageResponse (Prelude.Maybe Prelude.Text)
+updateStorageResponse_clusterArn = Lens.lens (\UpdateStorageResponse' {clusterArn} -> clusterArn) (\s@UpdateStorageResponse' {} a -> s {clusterArn = a} :: UpdateStorageResponse)
+
+-- | The Amazon Resource Name (ARN) of the cluster operation.
+updateStorageResponse_clusterOperationArn :: Lens.Lens' UpdateStorageResponse (Prelude.Maybe Prelude.Text)
+updateStorageResponse_clusterOperationArn = Lens.lens (\UpdateStorageResponse' {clusterOperationArn} -> clusterOperationArn) (\s@UpdateStorageResponse' {} a -> s {clusterOperationArn = a} :: UpdateStorageResponse)
+
+-- | The response's http status code.
+updateStorageResponse_httpStatus :: Lens.Lens' UpdateStorageResponse Prelude.Int
+updateStorageResponse_httpStatus = Lens.lens (\UpdateStorageResponse' {httpStatus} -> httpStatus) (\s@UpdateStorageResponse' {} a -> s {httpStatus = a} :: UpdateStorageResponse)
+
+instance Prelude.NFData UpdateStorageResponse where
+  rnf UpdateStorageResponse' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterOperationArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Kafka/Waiters.hs b/gen/Amazonka/Kafka/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Kafka/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.Kafka.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.Kafka.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Kafka.Lens
+import Amazonka.Kafka.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.Kafka
+import Test.Amazonka.Kafka.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Kafka"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Kafka.hs b/test/Test/Amazonka/Gen/Kafka.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Kafka.hs
@@ -0,0 +1,758 @@
+{-# 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.Kafka
+-- 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.Kafka where
+
+import Amazonka.Kafka
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Kafka.Internal
+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"
+--         [ requestBatchAssociateScramSecret $
+--             newBatchAssociateScramSecret
+--
+--         , requestBatchDisassociateScramSecret $
+--             newBatchDisassociateScramSecret
+--
+--         , requestCreateCluster $
+--             newCreateCluster
+--
+--         , requestCreateClusterV2 $
+--             newCreateClusterV2
+--
+--         , requestCreateConfiguration $
+--             newCreateConfiguration
+--
+--         , requestDeleteCluster $
+--             newDeleteCluster
+--
+--         , requestDeleteConfiguration $
+--             newDeleteConfiguration
+--
+--         , requestDescribeCluster $
+--             newDescribeCluster
+--
+--         , requestDescribeClusterOperation $
+--             newDescribeClusterOperation
+--
+--         , requestDescribeClusterV2 $
+--             newDescribeClusterV2
+--
+--         , requestDescribeConfiguration $
+--             newDescribeConfiguration
+--
+--         , requestDescribeConfigurationRevision $
+--             newDescribeConfigurationRevision
+--
+--         , requestGetBootstrapBrokers $
+--             newGetBootstrapBrokers
+--
+--         , requestGetCompatibleKafkaVersions $
+--             newGetCompatibleKafkaVersions
+--
+--         , requestListClusterOperations $
+--             newListClusterOperations
+--
+--         , requestListClusters $
+--             newListClusters
+--
+--         , requestListClustersV2 $
+--             newListClustersV2
+--
+--         , requestListConfigurationRevisions $
+--             newListConfigurationRevisions
+--
+--         , requestListConfigurations $
+--             newListConfigurations
+--
+--         , requestListKafkaVersions $
+--             newListKafkaVersions
+--
+--         , requestListNodes $
+--             newListNodes
+--
+--         , requestListScramSecrets $
+--             newListScramSecrets
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestRebootBroker $
+--             newRebootBroker
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateBrokerCount $
+--             newUpdateBrokerCount
+--
+--         , requestUpdateBrokerStorage $
+--             newUpdateBrokerStorage
+--
+--         , requestUpdateBrokerType $
+--             newUpdateBrokerType
+--
+--         , requestUpdateClusterConfiguration $
+--             newUpdateClusterConfiguration
+--
+--         , requestUpdateClusterKafkaVersion $
+--             newUpdateClusterKafkaVersion
+--
+--         , requestUpdateConfiguration $
+--             newUpdateConfiguration
+--
+--         , requestUpdateConnectivity $
+--             newUpdateConnectivity
+--
+--         , requestUpdateMonitoring $
+--             newUpdateMonitoring
+--
+--         , requestUpdateSecurity $
+--             newUpdateSecurity
+--
+--         , requestUpdateStorage $
+--             newUpdateStorage
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchAssociateScramSecret $
+--             newBatchAssociateScramSecretResponse
+--
+--         , responseBatchDisassociateScramSecret $
+--             newBatchDisassociateScramSecretResponse
+--
+--         , responseCreateCluster $
+--             newCreateClusterResponse
+--
+--         , responseCreateClusterV2 $
+--             newCreateClusterV2Response
+--
+--         , responseCreateConfiguration $
+--             newCreateConfigurationResponse
+--
+--         , responseDeleteCluster $
+--             newDeleteClusterResponse
+--
+--         , responseDeleteConfiguration $
+--             newDeleteConfigurationResponse
+--
+--         , responseDescribeCluster $
+--             newDescribeClusterResponse
+--
+--         , responseDescribeClusterOperation $
+--             newDescribeClusterOperationResponse
+--
+--         , responseDescribeClusterV2 $
+--             newDescribeClusterV2Response
+--
+--         , responseDescribeConfiguration $
+--             newDescribeConfigurationResponse
+--
+--         , responseDescribeConfigurationRevision $
+--             newDescribeConfigurationRevisionResponse
+--
+--         , responseGetBootstrapBrokers $
+--             newGetBootstrapBrokersResponse
+--
+--         , responseGetCompatibleKafkaVersions $
+--             newGetCompatibleKafkaVersionsResponse
+--
+--         , responseListClusterOperations $
+--             newListClusterOperationsResponse
+--
+--         , responseListClusters $
+--             newListClustersResponse
+--
+--         , responseListClustersV2 $
+--             newListClustersV2Response
+--
+--         , responseListConfigurationRevisions $
+--             newListConfigurationRevisionsResponse
+--
+--         , responseListConfigurations $
+--             newListConfigurationsResponse
+--
+--         , responseListKafkaVersions $
+--             newListKafkaVersionsResponse
+--
+--         , responseListNodes $
+--             newListNodesResponse
+--
+--         , responseListScramSecrets $
+--             newListScramSecretsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseRebootBroker $
+--             newRebootBrokerResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateBrokerCount $
+--             newUpdateBrokerCountResponse
+--
+--         , responseUpdateBrokerStorage $
+--             newUpdateBrokerStorageResponse
+--
+--         , responseUpdateBrokerType $
+--             newUpdateBrokerTypeResponse
+--
+--         , responseUpdateClusterConfiguration $
+--             newUpdateClusterConfigurationResponse
+--
+--         , responseUpdateClusterKafkaVersion $
+--             newUpdateClusterKafkaVersionResponse
+--
+--         , responseUpdateConfiguration $
+--             newUpdateConfigurationResponse
+--
+--         , responseUpdateConnectivity $
+--             newUpdateConnectivityResponse
+--
+--         , responseUpdateMonitoring $
+--             newUpdateMonitoringResponse
+--
+--         , responseUpdateSecurity $
+--             newUpdateSecurityResponse
+--
+--         , responseUpdateStorage $
+--             newUpdateStorageResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchAssociateScramSecret :: BatchAssociateScramSecret -> TestTree
+requestBatchAssociateScramSecret =
+  req
+    "BatchAssociateScramSecret"
+    "fixture/BatchAssociateScramSecret.yaml"
+
+requestBatchDisassociateScramSecret :: BatchDisassociateScramSecret -> TestTree
+requestBatchDisassociateScramSecret =
+  req
+    "BatchDisassociateScramSecret"
+    "fixture/BatchDisassociateScramSecret.yaml"
+
+requestCreateCluster :: CreateCluster -> TestTree
+requestCreateCluster =
+  req
+    "CreateCluster"
+    "fixture/CreateCluster.yaml"
+
+requestCreateClusterV2 :: CreateClusterV2 -> TestTree
+requestCreateClusterV2 =
+  req
+    "CreateClusterV2"
+    "fixture/CreateClusterV2.yaml"
+
+requestCreateConfiguration :: CreateConfiguration -> TestTree
+requestCreateConfiguration =
+  req
+    "CreateConfiguration"
+    "fixture/CreateConfiguration.yaml"
+
+requestDeleteCluster :: DeleteCluster -> TestTree
+requestDeleteCluster =
+  req
+    "DeleteCluster"
+    "fixture/DeleteCluster.yaml"
+
+requestDeleteConfiguration :: DeleteConfiguration -> TestTree
+requestDeleteConfiguration =
+  req
+    "DeleteConfiguration"
+    "fixture/DeleteConfiguration.yaml"
+
+requestDescribeCluster :: DescribeCluster -> TestTree
+requestDescribeCluster =
+  req
+    "DescribeCluster"
+    "fixture/DescribeCluster.yaml"
+
+requestDescribeClusterOperation :: DescribeClusterOperation -> TestTree
+requestDescribeClusterOperation =
+  req
+    "DescribeClusterOperation"
+    "fixture/DescribeClusterOperation.yaml"
+
+requestDescribeClusterV2 :: DescribeClusterV2 -> TestTree
+requestDescribeClusterV2 =
+  req
+    "DescribeClusterV2"
+    "fixture/DescribeClusterV2.yaml"
+
+requestDescribeConfiguration :: DescribeConfiguration -> TestTree
+requestDescribeConfiguration =
+  req
+    "DescribeConfiguration"
+    "fixture/DescribeConfiguration.yaml"
+
+requestDescribeConfigurationRevision :: DescribeConfigurationRevision -> TestTree
+requestDescribeConfigurationRevision =
+  req
+    "DescribeConfigurationRevision"
+    "fixture/DescribeConfigurationRevision.yaml"
+
+requestGetBootstrapBrokers :: GetBootstrapBrokers -> TestTree
+requestGetBootstrapBrokers =
+  req
+    "GetBootstrapBrokers"
+    "fixture/GetBootstrapBrokers.yaml"
+
+requestGetCompatibleKafkaVersions :: GetCompatibleKafkaVersions -> TestTree
+requestGetCompatibleKafkaVersions =
+  req
+    "GetCompatibleKafkaVersions"
+    "fixture/GetCompatibleKafkaVersions.yaml"
+
+requestListClusterOperations :: ListClusterOperations -> TestTree
+requestListClusterOperations =
+  req
+    "ListClusterOperations"
+    "fixture/ListClusterOperations.yaml"
+
+requestListClusters :: ListClusters -> TestTree
+requestListClusters =
+  req
+    "ListClusters"
+    "fixture/ListClusters.yaml"
+
+requestListClustersV2 :: ListClustersV2 -> TestTree
+requestListClustersV2 =
+  req
+    "ListClustersV2"
+    "fixture/ListClustersV2.yaml"
+
+requestListConfigurationRevisions :: ListConfigurationRevisions -> TestTree
+requestListConfigurationRevisions =
+  req
+    "ListConfigurationRevisions"
+    "fixture/ListConfigurationRevisions.yaml"
+
+requestListConfigurations :: ListConfigurations -> TestTree
+requestListConfigurations =
+  req
+    "ListConfigurations"
+    "fixture/ListConfigurations.yaml"
+
+requestListKafkaVersions :: ListKafkaVersions -> TestTree
+requestListKafkaVersions =
+  req
+    "ListKafkaVersions"
+    "fixture/ListKafkaVersions.yaml"
+
+requestListNodes :: ListNodes -> TestTree
+requestListNodes =
+  req
+    "ListNodes"
+    "fixture/ListNodes.yaml"
+
+requestListScramSecrets :: ListScramSecrets -> TestTree
+requestListScramSecrets =
+  req
+    "ListScramSecrets"
+    "fixture/ListScramSecrets.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestRebootBroker :: RebootBroker -> TestTree
+requestRebootBroker =
+  req
+    "RebootBroker"
+    "fixture/RebootBroker.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateBrokerCount :: UpdateBrokerCount -> TestTree
+requestUpdateBrokerCount =
+  req
+    "UpdateBrokerCount"
+    "fixture/UpdateBrokerCount.yaml"
+
+requestUpdateBrokerStorage :: UpdateBrokerStorage -> TestTree
+requestUpdateBrokerStorage =
+  req
+    "UpdateBrokerStorage"
+    "fixture/UpdateBrokerStorage.yaml"
+
+requestUpdateBrokerType :: UpdateBrokerType -> TestTree
+requestUpdateBrokerType =
+  req
+    "UpdateBrokerType"
+    "fixture/UpdateBrokerType.yaml"
+
+requestUpdateClusterConfiguration :: UpdateClusterConfiguration -> TestTree
+requestUpdateClusterConfiguration =
+  req
+    "UpdateClusterConfiguration"
+    "fixture/UpdateClusterConfiguration.yaml"
+
+requestUpdateClusterKafkaVersion :: UpdateClusterKafkaVersion -> TestTree
+requestUpdateClusterKafkaVersion =
+  req
+    "UpdateClusterKafkaVersion"
+    "fixture/UpdateClusterKafkaVersion.yaml"
+
+requestUpdateConfiguration :: UpdateConfiguration -> TestTree
+requestUpdateConfiguration =
+  req
+    "UpdateConfiguration"
+    "fixture/UpdateConfiguration.yaml"
+
+requestUpdateConnectivity :: UpdateConnectivity -> TestTree
+requestUpdateConnectivity =
+  req
+    "UpdateConnectivity"
+    "fixture/UpdateConnectivity.yaml"
+
+requestUpdateMonitoring :: UpdateMonitoring -> TestTree
+requestUpdateMonitoring =
+  req
+    "UpdateMonitoring"
+    "fixture/UpdateMonitoring.yaml"
+
+requestUpdateSecurity :: UpdateSecurity -> TestTree
+requestUpdateSecurity =
+  req
+    "UpdateSecurity"
+    "fixture/UpdateSecurity.yaml"
+
+requestUpdateStorage :: UpdateStorage -> TestTree
+requestUpdateStorage =
+  req
+    "UpdateStorage"
+    "fixture/UpdateStorage.yaml"
+
+-- Responses
+
+responseBatchAssociateScramSecret :: BatchAssociateScramSecretResponse -> TestTree
+responseBatchAssociateScramSecret =
+  res
+    "BatchAssociateScramSecretResponse"
+    "fixture/BatchAssociateScramSecretResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchAssociateScramSecret)
+
+responseBatchDisassociateScramSecret :: BatchDisassociateScramSecretResponse -> TestTree
+responseBatchDisassociateScramSecret =
+  res
+    "BatchDisassociateScramSecretResponse"
+    "fixture/BatchDisassociateScramSecretResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDisassociateScramSecret)
+
+responseCreateCluster :: CreateClusterResponse -> TestTree
+responseCreateCluster =
+  res
+    "CreateClusterResponse"
+    "fixture/CreateClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateCluster)
+
+responseCreateClusterV2 :: CreateClusterV2Response -> TestTree
+responseCreateClusterV2 =
+  res
+    "CreateClusterV2Response"
+    "fixture/CreateClusterV2Response.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateClusterV2)
+
+responseCreateConfiguration :: CreateConfigurationResponse -> TestTree
+responseCreateConfiguration =
+  res
+    "CreateConfigurationResponse"
+    "fixture/CreateConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateConfiguration)
+
+responseDeleteCluster :: DeleteClusterResponse -> TestTree
+responseDeleteCluster =
+  res
+    "DeleteClusterResponse"
+    "fixture/DeleteClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCluster)
+
+responseDeleteConfiguration :: DeleteConfigurationResponse -> TestTree
+responseDeleteConfiguration =
+  res
+    "DeleteConfigurationResponse"
+    "fixture/DeleteConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteConfiguration)
+
+responseDescribeCluster :: DescribeClusterResponse -> TestTree
+responseDescribeCluster =
+  res
+    "DescribeClusterResponse"
+    "fixture/DescribeClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeCluster)
+
+responseDescribeClusterOperation :: DescribeClusterOperationResponse -> TestTree
+responseDescribeClusterOperation =
+  res
+    "DescribeClusterOperationResponse"
+    "fixture/DescribeClusterOperationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeClusterOperation)
+
+responseDescribeClusterV2 :: DescribeClusterV2Response -> TestTree
+responseDescribeClusterV2 =
+  res
+    "DescribeClusterV2Response"
+    "fixture/DescribeClusterV2Response.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeClusterV2)
+
+responseDescribeConfiguration :: DescribeConfigurationResponse -> TestTree
+responseDescribeConfiguration =
+  res
+    "DescribeConfigurationResponse"
+    "fixture/DescribeConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeConfiguration)
+
+responseDescribeConfigurationRevision :: DescribeConfigurationRevisionResponse -> TestTree
+responseDescribeConfigurationRevision =
+  res
+    "DescribeConfigurationRevisionResponse"
+    "fixture/DescribeConfigurationRevisionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeConfigurationRevision)
+
+responseGetBootstrapBrokers :: GetBootstrapBrokersResponse -> TestTree
+responseGetBootstrapBrokers =
+  res
+    "GetBootstrapBrokersResponse"
+    "fixture/GetBootstrapBrokersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetBootstrapBrokers)
+
+responseGetCompatibleKafkaVersions :: GetCompatibleKafkaVersionsResponse -> TestTree
+responseGetCompatibleKafkaVersions =
+  res
+    "GetCompatibleKafkaVersionsResponse"
+    "fixture/GetCompatibleKafkaVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetCompatibleKafkaVersions)
+
+responseListClusterOperations :: ListClusterOperationsResponse -> TestTree
+responseListClusterOperations =
+  res
+    "ListClusterOperationsResponse"
+    "fixture/ListClusterOperationsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListClusterOperations)
+
+responseListClusters :: ListClustersResponse -> TestTree
+responseListClusters =
+  res
+    "ListClustersResponse"
+    "fixture/ListClustersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListClusters)
+
+responseListClustersV2 :: ListClustersV2Response -> TestTree
+responseListClustersV2 =
+  res
+    "ListClustersV2Response"
+    "fixture/ListClustersV2Response.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListClustersV2)
+
+responseListConfigurationRevisions :: ListConfigurationRevisionsResponse -> TestTree
+responseListConfigurationRevisions =
+  res
+    "ListConfigurationRevisionsResponse"
+    "fixture/ListConfigurationRevisionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListConfigurationRevisions)
+
+responseListConfigurations :: ListConfigurationsResponse -> TestTree
+responseListConfigurations =
+  res
+    "ListConfigurationsResponse"
+    "fixture/ListConfigurationsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListConfigurations)
+
+responseListKafkaVersions :: ListKafkaVersionsResponse -> TestTree
+responseListKafkaVersions =
+  res
+    "ListKafkaVersionsResponse"
+    "fixture/ListKafkaVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListKafkaVersions)
+
+responseListNodes :: ListNodesResponse -> TestTree
+responseListNodes =
+  res
+    "ListNodesResponse"
+    "fixture/ListNodesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListNodes)
+
+responseListScramSecrets :: ListScramSecretsResponse -> TestTree
+responseListScramSecrets =
+  res
+    "ListScramSecretsResponse"
+    "fixture/ListScramSecretsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListScramSecrets)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseRebootBroker :: RebootBrokerResponse -> TestTree
+responseRebootBroker =
+  res
+    "RebootBrokerResponse"
+    "fixture/RebootBrokerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RebootBroker)
+
+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)
+
+responseUpdateBrokerCount :: UpdateBrokerCountResponse -> TestTree
+responseUpdateBrokerCount =
+  res
+    "UpdateBrokerCountResponse"
+    "fixture/UpdateBrokerCountResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateBrokerCount)
+
+responseUpdateBrokerStorage :: UpdateBrokerStorageResponse -> TestTree
+responseUpdateBrokerStorage =
+  res
+    "UpdateBrokerStorageResponse"
+    "fixture/UpdateBrokerStorageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateBrokerStorage)
+
+responseUpdateBrokerType :: UpdateBrokerTypeResponse -> TestTree
+responseUpdateBrokerType =
+  res
+    "UpdateBrokerTypeResponse"
+    "fixture/UpdateBrokerTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateBrokerType)
+
+responseUpdateClusterConfiguration :: UpdateClusterConfigurationResponse -> TestTree
+responseUpdateClusterConfiguration =
+  res
+    "UpdateClusterConfigurationResponse"
+    "fixture/UpdateClusterConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateClusterConfiguration)
+
+responseUpdateClusterKafkaVersion :: UpdateClusterKafkaVersionResponse -> TestTree
+responseUpdateClusterKafkaVersion =
+  res
+    "UpdateClusterKafkaVersionResponse"
+    "fixture/UpdateClusterKafkaVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateClusterKafkaVersion)
+
+responseUpdateConfiguration :: UpdateConfigurationResponse -> TestTree
+responseUpdateConfiguration =
+  res
+    "UpdateConfigurationResponse"
+    "fixture/UpdateConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateConfiguration)
+
+responseUpdateConnectivity :: UpdateConnectivityResponse -> TestTree
+responseUpdateConnectivity =
+  res
+    "UpdateConnectivityResponse"
+    "fixture/UpdateConnectivityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateConnectivity)
+
+responseUpdateMonitoring :: UpdateMonitoringResponse -> TestTree
+responseUpdateMonitoring =
+  res
+    "UpdateMonitoringResponse"
+    "fixture/UpdateMonitoringResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateMonitoring)
+
+responseUpdateSecurity :: UpdateSecurityResponse -> TestTree
+responseUpdateSecurity =
+  res
+    "UpdateSecurityResponse"
+    "fixture/UpdateSecurityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateSecurity)
+
+responseUpdateStorage :: UpdateStorageResponse -> TestTree
+responseUpdateStorage =
+  res
+    "UpdateStorageResponse"
+    "fixture/UpdateStorageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateStorage)
diff --git a/test/Test/Amazonka/Kafka.hs b/test/Test/Amazonka/Kafka.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Kafka.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Kafka
+-- 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.Kafka
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Kafka/Internal.hs b/test/Test/Amazonka/Kafka/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Kafka/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Kafka.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.Kafka.Internal where
