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 IoT Greengrass V2 SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-11-30@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-greengrassv2)
+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.GreengrassV2](http://hackage.haskell.org/package/amazonka-greengrassv2/docs/Amazonka-GreengrassV2.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-greengrassv2` 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-greengrassv2.cabal b/amazonka-greengrassv2.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-greengrassv2.cabal
@@ -0,0 +1,171 @@
+cabal-version:      2.2
+name:               amazonka-greengrassv2
+version:            2.0
+synopsis:           Amazon IoT Greengrass V2 SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2020-11-30@ 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.GreengrassV2.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.GreengrassV2" 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-greengrassv2
+
+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.GreengrassV2
+    Amazonka.GreengrassV2.AssociateServiceRoleToAccount
+    Amazonka.GreengrassV2.BatchAssociateClientDeviceWithCoreDevice
+    Amazonka.GreengrassV2.BatchDisassociateClientDeviceFromCoreDevice
+    Amazonka.GreengrassV2.CancelDeployment
+    Amazonka.GreengrassV2.CreateComponentVersion
+    Amazonka.GreengrassV2.CreateDeployment
+    Amazonka.GreengrassV2.DeleteComponent
+    Amazonka.GreengrassV2.DeleteCoreDevice
+    Amazonka.GreengrassV2.DeleteDeployment
+    Amazonka.GreengrassV2.DescribeComponent
+    Amazonka.GreengrassV2.DisassociateServiceRoleFromAccount
+    Amazonka.GreengrassV2.GetComponent
+    Amazonka.GreengrassV2.GetComponentVersionArtifact
+    Amazonka.GreengrassV2.GetConnectivityInfo
+    Amazonka.GreengrassV2.GetCoreDevice
+    Amazonka.GreengrassV2.GetDeployment
+    Amazonka.GreengrassV2.GetServiceRoleForAccount
+    Amazonka.GreengrassV2.Lens
+    Amazonka.GreengrassV2.ListClientDevicesAssociatedWithCoreDevice
+    Amazonka.GreengrassV2.ListComponents
+    Amazonka.GreengrassV2.ListComponentVersions
+    Amazonka.GreengrassV2.ListCoreDevices
+    Amazonka.GreengrassV2.ListDeployments
+    Amazonka.GreengrassV2.ListEffectiveDeployments
+    Amazonka.GreengrassV2.ListInstalledComponents
+    Amazonka.GreengrassV2.ListTagsForResource
+    Amazonka.GreengrassV2.ResolveComponentCandidates
+    Amazonka.GreengrassV2.TagResource
+    Amazonka.GreengrassV2.Types
+    Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceEntry
+    Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceErrorEntry
+    Amazonka.GreengrassV2.Types.AssociatedClientDevice
+    Amazonka.GreengrassV2.Types.CloudComponentState
+    Amazonka.GreengrassV2.Types.CloudComponentStatus
+    Amazonka.GreengrassV2.Types.Component
+    Amazonka.GreengrassV2.Types.ComponentCandidate
+    Amazonka.GreengrassV2.Types.ComponentConfigurationUpdate
+    Amazonka.GreengrassV2.Types.ComponentDependencyRequirement
+    Amazonka.GreengrassV2.Types.ComponentDependencyType
+    Amazonka.GreengrassV2.Types.ComponentDeploymentSpecification
+    Amazonka.GreengrassV2.Types.ComponentLatestVersion
+    Amazonka.GreengrassV2.Types.ComponentPlatform
+    Amazonka.GreengrassV2.Types.ComponentRunWith
+    Amazonka.GreengrassV2.Types.ComponentVersionListItem
+    Amazonka.GreengrassV2.Types.ComponentVisibilityScope
+    Amazonka.GreengrassV2.Types.ConnectivityInfo
+    Amazonka.GreengrassV2.Types.CoreDevice
+    Amazonka.GreengrassV2.Types.CoreDeviceStatus
+    Amazonka.GreengrassV2.Types.Deployment
+    Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicy
+    Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicyAction
+    Amazonka.GreengrassV2.Types.DeploymentConfigurationValidationPolicy
+    Amazonka.GreengrassV2.Types.DeploymentFailureHandlingPolicy
+    Amazonka.GreengrassV2.Types.DeploymentHistoryFilter
+    Amazonka.GreengrassV2.Types.DeploymentIoTJobConfiguration
+    Amazonka.GreengrassV2.Types.DeploymentPolicies
+    Amazonka.GreengrassV2.Types.DeploymentStatus
+    Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceEntry
+    Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceErrorEntry
+    Amazonka.GreengrassV2.Types.EffectiveDeployment
+    Amazonka.GreengrassV2.Types.EffectiveDeploymentExecutionStatus
+    Amazonka.GreengrassV2.Types.EffectiveDeploymentStatusDetails
+    Amazonka.GreengrassV2.Types.InstalledComponent
+    Amazonka.GreengrassV2.Types.InstalledComponentLifecycleState
+    Amazonka.GreengrassV2.Types.InstalledComponentTopologyFilter
+    Amazonka.GreengrassV2.Types.IoTJobAbortAction
+    Amazonka.GreengrassV2.Types.IoTJobAbortConfig
+    Amazonka.GreengrassV2.Types.IoTJobAbortCriteria
+    Amazonka.GreengrassV2.Types.IoTJobExecutionFailureType
+    Amazonka.GreengrassV2.Types.IoTJobExecutionsRolloutConfig
+    Amazonka.GreengrassV2.Types.IoTJobExponentialRolloutRate
+    Amazonka.GreengrassV2.Types.IoTJobRateIncreaseCriteria
+    Amazonka.GreengrassV2.Types.IoTJobTimeoutConfig
+    Amazonka.GreengrassV2.Types.LambdaContainerParams
+    Amazonka.GreengrassV2.Types.LambdaDeviceMount
+    Amazonka.GreengrassV2.Types.LambdaEventSource
+    Amazonka.GreengrassV2.Types.LambdaEventSourceType
+    Amazonka.GreengrassV2.Types.LambdaExecutionParameters
+    Amazonka.GreengrassV2.Types.LambdaFilesystemPermission
+    Amazonka.GreengrassV2.Types.LambdaFunctionRecipeSource
+    Amazonka.GreengrassV2.Types.LambdaInputPayloadEncodingType
+    Amazonka.GreengrassV2.Types.LambdaIsolationMode
+    Amazonka.GreengrassV2.Types.LambdaLinuxProcessParams
+    Amazonka.GreengrassV2.Types.LambdaVolumeMount
+    Amazonka.GreengrassV2.Types.RecipeOutputFormat
+    Amazonka.GreengrassV2.Types.ResolvedComponentVersion
+    Amazonka.GreengrassV2.Types.SystemResourceLimits
+    Amazonka.GreengrassV2.Types.VendorGuidance
+    Amazonka.GreengrassV2.UntagResource
+    Amazonka.GreengrassV2.UpdateConnectivityInfo
+    Amazonka.GreengrassV2.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-greengrassv2-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.GreengrassV2
+    Test.Amazonka.GreengrassV2
+    Test.Amazonka.GreengrassV2.Internal
+
+  build-depends:
+    , amazonka-core          >=2.0 && <2.1
+    , amazonka-greengrassv2
+    , amazonka-test          >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AssociateServiceRoleToAccount.yaml b/fixture/AssociateServiceRoleToAccount.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateServiceRoleToAccount.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/AssociateServiceRoleToAccountResponse.proto b/fixture/AssociateServiceRoleToAccountResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateServiceRoleToAccountResponse.proto
diff --git a/fixture/BatchAssociateClientDeviceWithCoreDevice.yaml b/fixture/BatchAssociateClientDeviceWithCoreDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchAssociateClientDeviceWithCoreDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/BatchAssociateClientDeviceWithCoreDeviceResponse.proto b/fixture/BatchAssociateClientDeviceWithCoreDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchAssociateClientDeviceWithCoreDeviceResponse.proto
diff --git a/fixture/BatchDisassociateClientDeviceFromCoreDevice.yaml b/fixture/BatchDisassociateClientDeviceFromCoreDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDisassociateClientDeviceFromCoreDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/BatchDisassociateClientDeviceFromCoreDeviceResponse.proto b/fixture/BatchDisassociateClientDeviceFromCoreDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDisassociateClientDeviceFromCoreDeviceResponse.proto
diff --git a/fixture/CancelDeployment.yaml b/fixture/CancelDeployment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CancelDeployment.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/CancelDeploymentResponse.proto b/fixture/CancelDeploymentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CancelDeploymentResponse.proto
diff --git a/fixture/CreateComponentVersion.yaml b/fixture/CreateComponentVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateComponentVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/CreateComponentVersionResponse.proto b/fixture/CreateComponentVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateComponentVersionResponse.proto
diff --git a/fixture/CreateDeployment.yaml b/fixture/CreateDeployment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDeployment.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/CreateDeploymentResponse.proto b/fixture/CreateDeploymentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDeploymentResponse.proto
diff --git a/fixture/DeleteComponent.yaml b/fixture/DeleteComponent.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteComponent.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/DeleteComponentResponse.proto b/fixture/DeleteComponentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteComponentResponse.proto
diff --git a/fixture/DeleteCoreDevice.yaml b/fixture/DeleteCoreDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCoreDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/DeleteCoreDeviceResponse.proto b/fixture/DeleteCoreDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCoreDeviceResponse.proto
diff --git a/fixture/DeleteDeployment.yaml b/fixture/DeleteDeployment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDeployment.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/DeleteDeploymentResponse.proto b/fixture/DeleteDeploymentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDeploymentResponse.proto
diff --git a/fixture/DescribeComponent.yaml b/fixture/DescribeComponent.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeComponent.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/DescribeComponentResponse.proto b/fixture/DescribeComponentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeComponentResponse.proto
diff --git a/fixture/DisassociateServiceRoleFromAccount.yaml b/fixture/DisassociateServiceRoleFromAccount.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateServiceRoleFromAccount.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/DisassociateServiceRoleFromAccountResponse.proto b/fixture/DisassociateServiceRoleFromAccountResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateServiceRoleFromAccountResponse.proto
diff --git a/fixture/GetComponent.yaml b/fixture/GetComponent.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetComponent.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/GetComponentResponse.proto b/fixture/GetComponentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetComponentResponse.proto
diff --git a/fixture/GetComponentVersionArtifact.yaml b/fixture/GetComponentVersionArtifact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetComponentVersionArtifact.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/GetComponentVersionArtifactResponse.proto b/fixture/GetComponentVersionArtifactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetComponentVersionArtifactResponse.proto
diff --git a/fixture/GetConnectivityInfo.yaml b/fixture/GetConnectivityInfo.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetConnectivityInfo.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/GetConnectivityInfoResponse.proto b/fixture/GetConnectivityInfoResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetConnectivityInfoResponse.proto
diff --git a/fixture/GetCoreDevice.yaml b/fixture/GetCoreDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCoreDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/GetCoreDeviceResponse.proto b/fixture/GetCoreDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCoreDeviceResponse.proto
diff --git a/fixture/GetDeployment.yaml b/fixture/GetDeployment.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDeployment.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/GetDeploymentResponse.proto b/fixture/GetDeploymentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDeploymentResponse.proto
diff --git a/fixture/GetServiceRoleForAccount.yaml b/fixture/GetServiceRoleForAccount.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetServiceRoleForAccount.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/GetServiceRoleForAccountResponse.proto b/fixture/GetServiceRoleForAccountResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetServiceRoleForAccountResponse.proto
diff --git a/fixture/ListClientDevicesAssociatedWithCoreDevice.yaml b/fixture/ListClientDevicesAssociatedWithCoreDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListClientDevicesAssociatedWithCoreDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListClientDevicesAssociatedWithCoreDeviceResponse.proto b/fixture/ListClientDevicesAssociatedWithCoreDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListClientDevicesAssociatedWithCoreDeviceResponse.proto
diff --git a/fixture/ListComponentVersions.yaml b/fixture/ListComponentVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListComponentVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListComponentVersionsResponse.proto b/fixture/ListComponentVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListComponentVersionsResponse.proto
diff --git a/fixture/ListComponents.yaml b/fixture/ListComponents.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListComponents.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListComponentsResponse.proto b/fixture/ListComponentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListComponentsResponse.proto
diff --git a/fixture/ListCoreDevices.yaml b/fixture/ListCoreDevices.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListCoreDevices.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListCoreDevicesResponse.proto b/fixture/ListCoreDevicesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListCoreDevicesResponse.proto
diff --git a/fixture/ListDeployments.yaml b/fixture/ListDeployments.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDeployments.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListDeploymentsResponse.proto b/fixture/ListDeploymentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDeploymentsResponse.proto
diff --git a/fixture/ListEffectiveDeployments.yaml b/fixture/ListEffectiveDeployments.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListEffectiveDeployments.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListEffectiveDeploymentsResponse.proto b/fixture/ListEffectiveDeploymentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListEffectiveDeploymentsResponse.proto
diff --git a/fixture/ListInstalledComponents.yaml b/fixture/ListInstalledComponents.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListInstalledComponents.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ListInstalledComponentsResponse.proto b/fixture/ListInstalledComponentsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListInstalledComponentsResponse.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/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ResolveComponentCandidates.yaml b/fixture/ResolveComponentCandidates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ResolveComponentCandidates.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/ResolveComponentCandidatesResponse.proto b/fixture/ResolveComponentCandidatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ResolveComponentCandidatesResponse.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/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/UpdateConnectivityInfo.yaml b/fixture/UpdateConnectivityInfo.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConnectivityInfo.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/greengrass/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  greengrass.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/UpdateConnectivityInfoResponse.proto b/fixture/UpdateConnectivityInfoResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConnectivityInfoResponse.proto
diff --git a/gen/Amazonka/GreengrassV2.hs b/gen/Amazonka/GreengrassV2.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2.hs
@@ -0,0 +1,522 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.GreengrassV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2020-11-30@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- IoT Greengrass brings local compute, messaging, data management, sync,
+-- and ML inference capabilities to edge devices. This enables devices to
+-- collect and analyze data closer to the source of information, react
+-- autonomously to local events, and communicate securely with each other
+-- on local networks. Local devices can also communicate securely with
+-- Amazon Web Services IoT Core and export IoT data to the Amazon Web
+-- Services Cloud. IoT Greengrass developers can use Lambda functions and
+-- components to create and deploy applications to fleets of edge devices
+-- for local operation.
+--
+-- IoT Greengrass Version 2 provides a new major version of the IoT
+-- Greengrass Core software, new APIs, and a new console. Use this API
+-- reference to learn how to use the IoT Greengrass V2 API operations to
+-- manage components, manage deployments, and core devices.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html What is IoT Greengrass?>
+-- in the /IoT Greengrass V2 Developer Guide/.
+module Amazonka.GreengrassV2
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** RequestAlreadyInProgressException
+    _RequestAlreadyInProgressException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AssociateServiceRoleToAccount
+    AssociateServiceRoleToAccount (AssociateServiceRoleToAccount'),
+    newAssociateServiceRoleToAccount,
+    AssociateServiceRoleToAccountResponse (AssociateServiceRoleToAccountResponse'),
+    newAssociateServiceRoleToAccountResponse,
+
+    -- ** BatchAssociateClientDeviceWithCoreDevice
+    BatchAssociateClientDeviceWithCoreDevice (BatchAssociateClientDeviceWithCoreDevice'),
+    newBatchAssociateClientDeviceWithCoreDevice,
+    BatchAssociateClientDeviceWithCoreDeviceResponse (BatchAssociateClientDeviceWithCoreDeviceResponse'),
+    newBatchAssociateClientDeviceWithCoreDeviceResponse,
+
+    -- ** BatchDisassociateClientDeviceFromCoreDevice
+    BatchDisassociateClientDeviceFromCoreDevice (BatchDisassociateClientDeviceFromCoreDevice'),
+    newBatchDisassociateClientDeviceFromCoreDevice,
+    BatchDisassociateClientDeviceFromCoreDeviceResponse (BatchDisassociateClientDeviceFromCoreDeviceResponse'),
+    newBatchDisassociateClientDeviceFromCoreDeviceResponse,
+
+    -- ** CancelDeployment
+    CancelDeployment (CancelDeployment'),
+    newCancelDeployment,
+    CancelDeploymentResponse (CancelDeploymentResponse'),
+    newCancelDeploymentResponse,
+
+    -- ** CreateComponentVersion
+    CreateComponentVersion (CreateComponentVersion'),
+    newCreateComponentVersion,
+    CreateComponentVersionResponse (CreateComponentVersionResponse'),
+    newCreateComponentVersionResponse,
+
+    -- ** CreateDeployment
+    CreateDeployment (CreateDeployment'),
+    newCreateDeployment,
+    CreateDeploymentResponse (CreateDeploymentResponse'),
+    newCreateDeploymentResponse,
+
+    -- ** DeleteComponent
+    DeleteComponent (DeleteComponent'),
+    newDeleteComponent,
+    DeleteComponentResponse (DeleteComponentResponse'),
+    newDeleteComponentResponse,
+
+    -- ** DeleteCoreDevice
+    DeleteCoreDevice (DeleteCoreDevice'),
+    newDeleteCoreDevice,
+    DeleteCoreDeviceResponse (DeleteCoreDeviceResponse'),
+    newDeleteCoreDeviceResponse,
+
+    -- ** DeleteDeployment
+    DeleteDeployment (DeleteDeployment'),
+    newDeleteDeployment,
+    DeleteDeploymentResponse (DeleteDeploymentResponse'),
+    newDeleteDeploymentResponse,
+
+    -- ** DescribeComponent
+    DescribeComponent (DescribeComponent'),
+    newDescribeComponent,
+    DescribeComponentResponse (DescribeComponentResponse'),
+    newDescribeComponentResponse,
+
+    -- ** DisassociateServiceRoleFromAccount
+    DisassociateServiceRoleFromAccount (DisassociateServiceRoleFromAccount'),
+    newDisassociateServiceRoleFromAccount,
+    DisassociateServiceRoleFromAccountResponse (DisassociateServiceRoleFromAccountResponse'),
+    newDisassociateServiceRoleFromAccountResponse,
+
+    -- ** GetComponent
+    GetComponent (GetComponent'),
+    newGetComponent,
+    GetComponentResponse (GetComponentResponse'),
+    newGetComponentResponse,
+
+    -- ** GetComponentVersionArtifact
+    GetComponentVersionArtifact (GetComponentVersionArtifact'),
+    newGetComponentVersionArtifact,
+    GetComponentVersionArtifactResponse (GetComponentVersionArtifactResponse'),
+    newGetComponentVersionArtifactResponse,
+
+    -- ** GetConnectivityInfo
+    GetConnectivityInfo (GetConnectivityInfo'),
+    newGetConnectivityInfo,
+    GetConnectivityInfoResponse (GetConnectivityInfoResponse'),
+    newGetConnectivityInfoResponse,
+
+    -- ** GetCoreDevice
+    GetCoreDevice (GetCoreDevice'),
+    newGetCoreDevice,
+    GetCoreDeviceResponse (GetCoreDeviceResponse'),
+    newGetCoreDeviceResponse,
+
+    -- ** GetDeployment
+    GetDeployment (GetDeployment'),
+    newGetDeployment,
+    GetDeploymentResponse (GetDeploymentResponse'),
+    newGetDeploymentResponse,
+
+    -- ** GetServiceRoleForAccount
+    GetServiceRoleForAccount (GetServiceRoleForAccount'),
+    newGetServiceRoleForAccount,
+    GetServiceRoleForAccountResponse (GetServiceRoleForAccountResponse'),
+    newGetServiceRoleForAccountResponse,
+
+    -- ** ListClientDevicesAssociatedWithCoreDevice (Paginated)
+    ListClientDevicesAssociatedWithCoreDevice (ListClientDevicesAssociatedWithCoreDevice'),
+    newListClientDevicesAssociatedWithCoreDevice,
+    ListClientDevicesAssociatedWithCoreDeviceResponse (ListClientDevicesAssociatedWithCoreDeviceResponse'),
+    newListClientDevicesAssociatedWithCoreDeviceResponse,
+
+    -- ** ListComponentVersions (Paginated)
+    ListComponentVersions (ListComponentVersions'),
+    newListComponentVersions,
+    ListComponentVersionsResponse (ListComponentVersionsResponse'),
+    newListComponentVersionsResponse,
+
+    -- ** ListComponents (Paginated)
+    ListComponents (ListComponents'),
+    newListComponents,
+    ListComponentsResponse (ListComponentsResponse'),
+    newListComponentsResponse,
+
+    -- ** ListCoreDevices (Paginated)
+    ListCoreDevices (ListCoreDevices'),
+    newListCoreDevices,
+    ListCoreDevicesResponse (ListCoreDevicesResponse'),
+    newListCoreDevicesResponse,
+
+    -- ** ListDeployments (Paginated)
+    ListDeployments (ListDeployments'),
+    newListDeployments,
+    ListDeploymentsResponse (ListDeploymentsResponse'),
+    newListDeploymentsResponse,
+
+    -- ** ListEffectiveDeployments (Paginated)
+    ListEffectiveDeployments (ListEffectiveDeployments'),
+    newListEffectiveDeployments,
+    ListEffectiveDeploymentsResponse (ListEffectiveDeploymentsResponse'),
+    newListEffectiveDeploymentsResponse,
+
+    -- ** ListInstalledComponents (Paginated)
+    ListInstalledComponents (ListInstalledComponents'),
+    newListInstalledComponents,
+    ListInstalledComponentsResponse (ListInstalledComponentsResponse'),
+    newListInstalledComponentsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ResolveComponentCandidates
+    ResolveComponentCandidates (ResolveComponentCandidates'),
+    newResolveComponentCandidates,
+    ResolveComponentCandidatesResponse (ResolveComponentCandidatesResponse'),
+    newResolveComponentCandidatesResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateConnectivityInfo
+    UpdateConnectivityInfo (UpdateConnectivityInfo'),
+    newUpdateConnectivityInfo,
+    UpdateConnectivityInfoResponse (UpdateConnectivityInfoResponse'),
+    newUpdateConnectivityInfoResponse,
+
+    -- * Types
+
+    -- ** CloudComponentState
+    CloudComponentState (..),
+
+    -- ** ComponentDependencyType
+    ComponentDependencyType (..),
+
+    -- ** ComponentVisibilityScope
+    ComponentVisibilityScope (..),
+
+    -- ** CoreDeviceStatus
+    CoreDeviceStatus (..),
+
+    -- ** DeploymentComponentUpdatePolicyAction
+    DeploymentComponentUpdatePolicyAction (..),
+
+    -- ** DeploymentFailureHandlingPolicy
+    DeploymentFailureHandlingPolicy (..),
+
+    -- ** DeploymentHistoryFilter
+    DeploymentHistoryFilter (..),
+
+    -- ** DeploymentStatus
+    DeploymentStatus (..),
+
+    -- ** EffectiveDeploymentExecutionStatus
+    EffectiveDeploymentExecutionStatus (..),
+
+    -- ** InstalledComponentLifecycleState
+    InstalledComponentLifecycleState (..),
+
+    -- ** InstalledComponentTopologyFilter
+    InstalledComponentTopologyFilter (..),
+
+    -- ** IoTJobAbortAction
+    IoTJobAbortAction (..),
+
+    -- ** IoTJobExecutionFailureType
+    IoTJobExecutionFailureType (..),
+
+    -- ** LambdaEventSourceType
+    LambdaEventSourceType (..),
+
+    -- ** LambdaFilesystemPermission
+    LambdaFilesystemPermission (..),
+
+    -- ** LambdaInputPayloadEncodingType
+    LambdaInputPayloadEncodingType (..),
+
+    -- ** LambdaIsolationMode
+    LambdaIsolationMode (..),
+
+    -- ** RecipeOutputFormat
+    RecipeOutputFormat (..),
+
+    -- ** VendorGuidance
+    VendorGuidance (..),
+
+    -- ** AssociateClientDeviceWithCoreDeviceEntry
+    AssociateClientDeviceWithCoreDeviceEntry (AssociateClientDeviceWithCoreDeviceEntry'),
+    newAssociateClientDeviceWithCoreDeviceEntry,
+
+    -- ** AssociateClientDeviceWithCoreDeviceErrorEntry
+    AssociateClientDeviceWithCoreDeviceErrorEntry (AssociateClientDeviceWithCoreDeviceErrorEntry'),
+    newAssociateClientDeviceWithCoreDeviceErrorEntry,
+
+    -- ** AssociatedClientDevice
+    AssociatedClientDevice (AssociatedClientDevice'),
+    newAssociatedClientDevice,
+
+    -- ** CloudComponentStatus
+    CloudComponentStatus (CloudComponentStatus'),
+    newCloudComponentStatus,
+
+    -- ** Component
+    Component (Component'),
+    newComponent,
+
+    -- ** ComponentCandidate
+    ComponentCandidate (ComponentCandidate'),
+    newComponentCandidate,
+
+    -- ** ComponentConfigurationUpdate
+    ComponentConfigurationUpdate (ComponentConfigurationUpdate'),
+    newComponentConfigurationUpdate,
+
+    -- ** ComponentDependencyRequirement
+    ComponentDependencyRequirement (ComponentDependencyRequirement'),
+    newComponentDependencyRequirement,
+
+    -- ** ComponentDeploymentSpecification
+    ComponentDeploymentSpecification (ComponentDeploymentSpecification'),
+    newComponentDeploymentSpecification,
+
+    -- ** ComponentLatestVersion
+    ComponentLatestVersion (ComponentLatestVersion'),
+    newComponentLatestVersion,
+
+    -- ** ComponentPlatform
+    ComponentPlatform (ComponentPlatform'),
+    newComponentPlatform,
+
+    -- ** ComponentRunWith
+    ComponentRunWith (ComponentRunWith'),
+    newComponentRunWith,
+
+    -- ** ComponentVersionListItem
+    ComponentVersionListItem (ComponentVersionListItem'),
+    newComponentVersionListItem,
+
+    -- ** ConnectivityInfo
+    ConnectivityInfo (ConnectivityInfo'),
+    newConnectivityInfo,
+
+    -- ** CoreDevice
+    CoreDevice (CoreDevice'),
+    newCoreDevice,
+
+    -- ** Deployment
+    Deployment (Deployment'),
+    newDeployment,
+
+    -- ** DeploymentComponentUpdatePolicy
+    DeploymentComponentUpdatePolicy (DeploymentComponentUpdatePolicy'),
+    newDeploymentComponentUpdatePolicy,
+
+    -- ** DeploymentConfigurationValidationPolicy
+    DeploymentConfigurationValidationPolicy (DeploymentConfigurationValidationPolicy'),
+    newDeploymentConfigurationValidationPolicy,
+
+    -- ** DeploymentIoTJobConfiguration
+    DeploymentIoTJobConfiguration (DeploymentIoTJobConfiguration'),
+    newDeploymentIoTJobConfiguration,
+
+    -- ** DeploymentPolicies
+    DeploymentPolicies (DeploymentPolicies'),
+    newDeploymentPolicies,
+
+    -- ** DisassociateClientDeviceFromCoreDeviceEntry
+    DisassociateClientDeviceFromCoreDeviceEntry (DisassociateClientDeviceFromCoreDeviceEntry'),
+    newDisassociateClientDeviceFromCoreDeviceEntry,
+
+    -- ** DisassociateClientDeviceFromCoreDeviceErrorEntry
+    DisassociateClientDeviceFromCoreDeviceErrorEntry (DisassociateClientDeviceFromCoreDeviceErrorEntry'),
+    newDisassociateClientDeviceFromCoreDeviceErrorEntry,
+
+    -- ** EffectiveDeployment
+    EffectiveDeployment (EffectiveDeployment'),
+    newEffectiveDeployment,
+
+    -- ** EffectiveDeploymentStatusDetails
+    EffectiveDeploymentStatusDetails (EffectiveDeploymentStatusDetails'),
+    newEffectiveDeploymentStatusDetails,
+
+    -- ** InstalledComponent
+    InstalledComponent (InstalledComponent'),
+    newInstalledComponent,
+
+    -- ** IoTJobAbortConfig
+    IoTJobAbortConfig (IoTJobAbortConfig'),
+    newIoTJobAbortConfig,
+
+    -- ** IoTJobAbortCriteria
+    IoTJobAbortCriteria (IoTJobAbortCriteria'),
+    newIoTJobAbortCriteria,
+
+    -- ** IoTJobExecutionsRolloutConfig
+    IoTJobExecutionsRolloutConfig (IoTJobExecutionsRolloutConfig'),
+    newIoTJobExecutionsRolloutConfig,
+
+    -- ** IoTJobExponentialRolloutRate
+    IoTJobExponentialRolloutRate (IoTJobExponentialRolloutRate'),
+    newIoTJobExponentialRolloutRate,
+
+    -- ** IoTJobRateIncreaseCriteria
+    IoTJobRateIncreaseCriteria (IoTJobRateIncreaseCriteria'),
+    newIoTJobRateIncreaseCriteria,
+
+    -- ** IoTJobTimeoutConfig
+    IoTJobTimeoutConfig (IoTJobTimeoutConfig'),
+    newIoTJobTimeoutConfig,
+
+    -- ** LambdaContainerParams
+    LambdaContainerParams (LambdaContainerParams'),
+    newLambdaContainerParams,
+
+    -- ** LambdaDeviceMount
+    LambdaDeviceMount (LambdaDeviceMount'),
+    newLambdaDeviceMount,
+
+    -- ** LambdaEventSource
+    LambdaEventSource (LambdaEventSource'),
+    newLambdaEventSource,
+
+    -- ** LambdaExecutionParameters
+    LambdaExecutionParameters (LambdaExecutionParameters'),
+    newLambdaExecutionParameters,
+
+    -- ** LambdaFunctionRecipeSource
+    LambdaFunctionRecipeSource (LambdaFunctionRecipeSource'),
+    newLambdaFunctionRecipeSource,
+
+    -- ** LambdaLinuxProcessParams
+    LambdaLinuxProcessParams (LambdaLinuxProcessParams'),
+    newLambdaLinuxProcessParams,
+
+    -- ** LambdaVolumeMount
+    LambdaVolumeMount (LambdaVolumeMount'),
+    newLambdaVolumeMount,
+
+    -- ** ResolvedComponentVersion
+    ResolvedComponentVersion (ResolvedComponentVersion'),
+    newResolvedComponentVersion,
+
+    -- ** SystemResourceLimits
+    SystemResourceLimits (SystemResourceLimits'),
+    newSystemResourceLimits,
+  )
+where
+
+import Amazonka.GreengrassV2.AssociateServiceRoleToAccount
+import Amazonka.GreengrassV2.BatchAssociateClientDeviceWithCoreDevice
+import Amazonka.GreengrassV2.BatchDisassociateClientDeviceFromCoreDevice
+import Amazonka.GreengrassV2.CancelDeployment
+import Amazonka.GreengrassV2.CreateComponentVersion
+import Amazonka.GreengrassV2.CreateDeployment
+import Amazonka.GreengrassV2.DeleteComponent
+import Amazonka.GreengrassV2.DeleteCoreDevice
+import Amazonka.GreengrassV2.DeleteDeployment
+import Amazonka.GreengrassV2.DescribeComponent
+import Amazonka.GreengrassV2.DisassociateServiceRoleFromAccount
+import Amazonka.GreengrassV2.GetComponent
+import Amazonka.GreengrassV2.GetComponentVersionArtifact
+import Amazonka.GreengrassV2.GetConnectivityInfo
+import Amazonka.GreengrassV2.GetCoreDevice
+import Amazonka.GreengrassV2.GetDeployment
+import Amazonka.GreengrassV2.GetServiceRoleForAccount
+import Amazonka.GreengrassV2.Lens
+import Amazonka.GreengrassV2.ListClientDevicesAssociatedWithCoreDevice
+import Amazonka.GreengrassV2.ListComponentVersions
+import Amazonka.GreengrassV2.ListComponents
+import Amazonka.GreengrassV2.ListCoreDevices
+import Amazonka.GreengrassV2.ListDeployments
+import Amazonka.GreengrassV2.ListEffectiveDeployments
+import Amazonka.GreengrassV2.ListInstalledComponents
+import Amazonka.GreengrassV2.ListTagsForResource
+import Amazonka.GreengrassV2.ResolveComponentCandidates
+import Amazonka.GreengrassV2.TagResource
+import Amazonka.GreengrassV2.Types
+import Amazonka.GreengrassV2.UntagResource
+import Amazonka.GreengrassV2.UpdateConnectivityInfo
+import Amazonka.GreengrassV2.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 'GreengrassV2'.
+
+-- $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/GreengrassV2/AssociateServiceRoleToAccount.hs b/gen/Amazonka/GreengrassV2/AssociateServiceRoleToAccount.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/AssociateServiceRoleToAccount.hs
@@ -0,0 +1,183 @@
+{-# 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.GreengrassV2.AssociateServiceRoleToAccount
+-- 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 a Greengrass service role with IoT Greengrass for your Amazon
+-- Web Services account in this Amazon Web Services Region. IoT Greengrass
+-- uses this role to verify the identity of client devices and manage core
+-- device connectivity information. The role must include the
+-- <https://console.aws.amazon.com/iam/home#/policies/arn:awsiam::aws:policy/service-role/AWSGreengrassResourceAccessRolePolicy AWSGreengrassResourceAccessRolePolicy>
+-- managed policy or a custom policy that defines equivalent permissions
+-- for the IoT Greengrass features that you use. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-service-role.html Greengrass service role>
+-- in the /IoT Greengrass Version 2 Developer Guide/.
+module Amazonka.GreengrassV2.AssociateServiceRoleToAccount
+  ( -- * Creating a Request
+    AssociateServiceRoleToAccount (..),
+    newAssociateServiceRoleToAccount,
+
+    -- * Request Lenses
+    associateServiceRoleToAccount_roleArn,
+
+    -- * Destructuring the Response
+    AssociateServiceRoleToAccountResponse (..),
+    newAssociateServiceRoleToAccountResponse,
+
+    -- * Response Lenses
+    associateServiceRoleToAccountResponse_associatedAt,
+    associateServiceRoleToAccountResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAssociateServiceRoleToAccount' smart constructor.
+data AssociateServiceRoleToAccount = AssociateServiceRoleToAccount'
+  { -- | The Amazon Resource Name (ARN) of the service role to associate with IoT
+    -- Greengrass for your Amazon Web Services account in this Amazon Web
+    -- Services Region.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateServiceRoleToAccount' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'roleArn', 'associateServiceRoleToAccount_roleArn' - The Amazon Resource Name (ARN) of the service role to associate with IoT
+-- Greengrass for your Amazon Web Services account in this Amazon Web
+-- Services Region.
+newAssociateServiceRoleToAccount ::
+  -- | 'roleArn'
+  Prelude.Text ->
+  AssociateServiceRoleToAccount
+newAssociateServiceRoleToAccount pRoleArn_ =
+  AssociateServiceRoleToAccount' {roleArn = pRoleArn_}
+
+-- | The Amazon Resource Name (ARN) of the service role to associate with IoT
+-- Greengrass for your Amazon Web Services account in this Amazon Web
+-- Services Region.
+associateServiceRoleToAccount_roleArn :: Lens.Lens' AssociateServiceRoleToAccount Prelude.Text
+associateServiceRoleToAccount_roleArn = Lens.lens (\AssociateServiceRoleToAccount' {roleArn} -> roleArn) (\s@AssociateServiceRoleToAccount' {} a -> s {roleArn = a} :: AssociateServiceRoleToAccount)
+
+instance
+  Core.AWSRequest
+    AssociateServiceRoleToAccount
+  where
+  type
+    AWSResponse AssociateServiceRoleToAccount =
+      AssociateServiceRoleToAccountResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AssociateServiceRoleToAccountResponse'
+            Prelude.<$> (x Data..?> "AssociatedAt")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    AssociateServiceRoleToAccount
+  where
+  hashWithSalt _salt AssociateServiceRoleToAccount' {..} =
+    _salt `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData AssociateServiceRoleToAccount where
+  rnf AssociateServiceRoleToAccount' {..} =
+    Prelude.rnf roleArn
+
+instance Data.ToHeaders AssociateServiceRoleToAccount where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON AssociateServiceRoleToAccount where
+  toJSON AssociateServiceRoleToAccount' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("RoleArn" Data..= roleArn)]
+      )
+
+instance Data.ToPath AssociateServiceRoleToAccount where
+  toPath = Prelude.const "/greengrass/servicerole"
+
+instance Data.ToQuery AssociateServiceRoleToAccount where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAssociateServiceRoleToAccountResponse' smart constructor.
+data AssociateServiceRoleToAccountResponse = AssociateServiceRoleToAccountResponse'
+  { -- | The time when the service role was associated with IoT Greengrass for
+    -- your Amazon Web Services account in this Amazon Web Services Region.
+    associatedAt :: 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 'AssociateServiceRoleToAccountResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'associatedAt', 'associateServiceRoleToAccountResponse_associatedAt' - The time when the service role was associated with IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+--
+-- 'httpStatus', 'associateServiceRoleToAccountResponse_httpStatus' - The response's http status code.
+newAssociateServiceRoleToAccountResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AssociateServiceRoleToAccountResponse
+newAssociateServiceRoleToAccountResponse pHttpStatus_ =
+  AssociateServiceRoleToAccountResponse'
+    { associatedAt =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the service role was associated with IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+associateServiceRoleToAccountResponse_associatedAt :: Lens.Lens' AssociateServiceRoleToAccountResponse (Prelude.Maybe Prelude.Text)
+associateServiceRoleToAccountResponse_associatedAt = Lens.lens (\AssociateServiceRoleToAccountResponse' {associatedAt} -> associatedAt) (\s@AssociateServiceRoleToAccountResponse' {} a -> s {associatedAt = a} :: AssociateServiceRoleToAccountResponse)
+
+-- | The response's http status code.
+associateServiceRoleToAccountResponse_httpStatus :: Lens.Lens' AssociateServiceRoleToAccountResponse Prelude.Int
+associateServiceRoleToAccountResponse_httpStatus = Lens.lens (\AssociateServiceRoleToAccountResponse' {httpStatus} -> httpStatus) (\s@AssociateServiceRoleToAccountResponse' {} a -> s {httpStatus = a} :: AssociateServiceRoleToAccountResponse)
+
+instance
+  Prelude.NFData
+    AssociateServiceRoleToAccountResponse
+  where
+  rnf AssociateServiceRoleToAccountResponse' {..} =
+    Prelude.rnf associatedAt
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/BatchAssociateClientDeviceWithCoreDevice.hs b/gen/Amazonka/GreengrassV2/BatchAssociateClientDeviceWithCoreDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/BatchAssociateClientDeviceWithCoreDevice.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.GreengrassV2.BatchAssociateClientDeviceWithCoreDevice
+-- 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 a list of client devices with a core device. Use this API
+-- operation to specify which client devices can discover a core device
+-- through cloud discovery. With cloud discovery, client devices connect to
+-- IoT Greengrass to retrieve associated core devices\' connectivity
+-- information and certificates. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-cloud-discovery.html Configure cloud discovery>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- Client devices are local IoT devices that connect to and communicate
+-- with an IoT Greengrass core device over MQTT. You can connect client
+-- devices to a core device to sync MQTT messages and data to Amazon Web
+-- Services IoT Core and interact with client devices in Greengrass
+-- components. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/interact-with-local-iot-devices.html Interact with local IoT devices>
+-- in the /IoT Greengrass V2 Developer Guide/.
+module Amazonka.GreengrassV2.BatchAssociateClientDeviceWithCoreDevice
+  ( -- * Creating a Request
+    BatchAssociateClientDeviceWithCoreDevice (..),
+    newBatchAssociateClientDeviceWithCoreDevice,
+
+    -- * Request Lenses
+    batchAssociateClientDeviceWithCoreDevice_entries,
+    batchAssociateClientDeviceWithCoreDevice_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    BatchAssociateClientDeviceWithCoreDeviceResponse (..),
+    newBatchAssociateClientDeviceWithCoreDeviceResponse,
+
+    -- * Response Lenses
+    batchAssociateClientDeviceWithCoreDeviceResponse_errorEntries,
+    batchAssociateClientDeviceWithCoreDeviceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchAssociateClientDeviceWithCoreDevice' smart constructor.
+data BatchAssociateClientDeviceWithCoreDevice = BatchAssociateClientDeviceWithCoreDevice'
+  { -- | The list of client devices to associate.
+    entries :: Prelude.Maybe (Prelude.NonEmpty AssociateClientDeviceWithCoreDeviceEntry),
+    -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchAssociateClientDeviceWithCoreDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'entries', 'batchAssociateClientDeviceWithCoreDevice_entries' - The list of client devices to associate.
+--
+-- 'coreDeviceThingName', 'batchAssociateClientDeviceWithCoreDevice_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newBatchAssociateClientDeviceWithCoreDevice ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  BatchAssociateClientDeviceWithCoreDevice
+newBatchAssociateClientDeviceWithCoreDevice
+  pCoreDeviceThingName_ =
+    BatchAssociateClientDeviceWithCoreDevice'
+      { entries =
+          Prelude.Nothing,
+        coreDeviceThingName =
+          pCoreDeviceThingName_
+      }
+
+-- | The list of client devices to associate.
+batchAssociateClientDeviceWithCoreDevice_entries :: Lens.Lens' BatchAssociateClientDeviceWithCoreDevice (Prelude.Maybe (Prelude.NonEmpty AssociateClientDeviceWithCoreDeviceEntry))
+batchAssociateClientDeviceWithCoreDevice_entries = Lens.lens (\BatchAssociateClientDeviceWithCoreDevice' {entries} -> entries) (\s@BatchAssociateClientDeviceWithCoreDevice' {} a -> s {entries = a} :: BatchAssociateClientDeviceWithCoreDevice) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the core device. This is also the name of the IoT thing.
+batchAssociateClientDeviceWithCoreDevice_coreDeviceThingName :: Lens.Lens' BatchAssociateClientDeviceWithCoreDevice Prelude.Text
+batchAssociateClientDeviceWithCoreDevice_coreDeviceThingName = Lens.lens (\BatchAssociateClientDeviceWithCoreDevice' {coreDeviceThingName} -> coreDeviceThingName) (\s@BatchAssociateClientDeviceWithCoreDevice' {} a -> s {coreDeviceThingName = a} :: BatchAssociateClientDeviceWithCoreDevice)
+
+instance
+  Core.AWSRequest
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  type
+    AWSResponse
+      BatchAssociateClientDeviceWithCoreDevice =
+      BatchAssociateClientDeviceWithCoreDeviceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchAssociateClientDeviceWithCoreDeviceResponse'
+            Prelude.<$> (x Data..?> "errorEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  hashWithSalt
+    _salt
+    BatchAssociateClientDeviceWithCoreDevice' {..} =
+      _salt
+        `Prelude.hashWithSalt` entries
+        `Prelude.hashWithSalt` coreDeviceThingName
+
+instance
+  Prelude.NFData
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  rnf BatchAssociateClientDeviceWithCoreDevice' {..} =
+    Prelude.rnf entries
+      `Prelude.seq` Prelude.rnf coreDeviceThingName
+
+instance
+  Data.ToHeaders
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance
+  Data.ToJSON
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  toJSON BatchAssociateClientDeviceWithCoreDevice' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("entries" Data..=) Prelude.<$> entries]
+      )
+
+instance
+  Data.ToPath
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  toPath BatchAssociateClientDeviceWithCoreDevice' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/coreDevices/",
+        Data.toBS coreDeviceThingName,
+        "/associateClientDevices"
+      ]
+
+instance
+  Data.ToQuery
+    BatchAssociateClientDeviceWithCoreDevice
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchAssociateClientDeviceWithCoreDeviceResponse' smart constructor.
+data BatchAssociateClientDeviceWithCoreDeviceResponse = BatchAssociateClientDeviceWithCoreDeviceResponse'
+  { -- | The list of any errors for the entries in the request. Each error entry
+    -- contains the name of the IoT thing that failed to associate.
+    errorEntries :: Prelude.Maybe [AssociateClientDeviceWithCoreDeviceErrorEntry],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchAssociateClientDeviceWithCoreDeviceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorEntries', 'batchAssociateClientDeviceWithCoreDeviceResponse_errorEntries' - The list of any errors for the entries in the request. Each error entry
+-- contains the name of the IoT thing that failed to associate.
+--
+-- 'httpStatus', 'batchAssociateClientDeviceWithCoreDeviceResponse_httpStatus' - The response's http status code.
+newBatchAssociateClientDeviceWithCoreDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchAssociateClientDeviceWithCoreDeviceResponse
+newBatchAssociateClientDeviceWithCoreDeviceResponse
+  pHttpStatus_ =
+    BatchAssociateClientDeviceWithCoreDeviceResponse'
+      { errorEntries =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The list of any errors for the entries in the request. Each error entry
+-- contains the name of the IoT thing that failed to associate.
+batchAssociateClientDeviceWithCoreDeviceResponse_errorEntries :: Lens.Lens' BatchAssociateClientDeviceWithCoreDeviceResponse (Prelude.Maybe [AssociateClientDeviceWithCoreDeviceErrorEntry])
+batchAssociateClientDeviceWithCoreDeviceResponse_errorEntries = Lens.lens (\BatchAssociateClientDeviceWithCoreDeviceResponse' {errorEntries} -> errorEntries) (\s@BatchAssociateClientDeviceWithCoreDeviceResponse' {} a -> s {errorEntries = a} :: BatchAssociateClientDeviceWithCoreDeviceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchAssociateClientDeviceWithCoreDeviceResponse_httpStatus :: Lens.Lens' BatchAssociateClientDeviceWithCoreDeviceResponse Prelude.Int
+batchAssociateClientDeviceWithCoreDeviceResponse_httpStatus = Lens.lens (\BatchAssociateClientDeviceWithCoreDeviceResponse' {httpStatus} -> httpStatus) (\s@BatchAssociateClientDeviceWithCoreDeviceResponse' {} a -> s {httpStatus = a} :: BatchAssociateClientDeviceWithCoreDeviceResponse)
+
+instance
+  Prelude.NFData
+    BatchAssociateClientDeviceWithCoreDeviceResponse
+  where
+  rnf
+    BatchAssociateClientDeviceWithCoreDeviceResponse' {..} =
+      Prelude.rnf errorEntries
+        `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/BatchDisassociateClientDeviceFromCoreDevice.hs b/gen/Amazonka/GreengrassV2/BatchDisassociateClientDeviceFromCoreDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/BatchDisassociateClientDeviceFromCoreDevice.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.GreengrassV2.BatchDisassociateClientDeviceFromCoreDevice
+-- 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 a list of client devices from a core device. After you
+-- disassociate a client device from a core device, the client device
+-- won\'t be able to use cloud discovery to retrieve the core device\'s
+-- connectivity information and certificates.
+module Amazonka.GreengrassV2.BatchDisassociateClientDeviceFromCoreDevice
+  ( -- * Creating a Request
+    BatchDisassociateClientDeviceFromCoreDevice (..),
+    newBatchDisassociateClientDeviceFromCoreDevice,
+
+    -- * Request Lenses
+    batchDisassociateClientDeviceFromCoreDevice_entries,
+    batchDisassociateClientDeviceFromCoreDevice_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    BatchDisassociateClientDeviceFromCoreDeviceResponse (..),
+    newBatchDisassociateClientDeviceFromCoreDeviceResponse,
+
+    -- * Response Lenses
+    batchDisassociateClientDeviceFromCoreDeviceResponse_errorEntries,
+    batchDisassociateClientDeviceFromCoreDeviceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchDisassociateClientDeviceFromCoreDevice' smart constructor.
+data BatchDisassociateClientDeviceFromCoreDevice = BatchDisassociateClientDeviceFromCoreDevice'
+  { -- | The list of client devices to disassociate.
+    entries :: Prelude.Maybe (Prelude.NonEmpty DisassociateClientDeviceFromCoreDeviceEntry),
+    -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDisassociateClientDeviceFromCoreDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'entries', 'batchDisassociateClientDeviceFromCoreDevice_entries' - The list of client devices to disassociate.
+--
+-- 'coreDeviceThingName', 'batchDisassociateClientDeviceFromCoreDevice_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newBatchDisassociateClientDeviceFromCoreDevice ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  BatchDisassociateClientDeviceFromCoreDevice
+newBatchDisassociateClientDeviceFromCoreDevice
+  pCoreDeviceThingName_ =
+    BatchDisassociateClientDeviceFromCoreDevice'
+      { entries =
+          Prelude.Nothing,
+        coreDeviceThingName =
+          pCoreDeviceThingName_
+      }
+
+-- | The list of client devices to disassociate.
+batchDisassociateClientDeviceFromCoreDevice_entries :: Lens.Lens' BatchDisassociateClientDeviceFromCoreDevice (Prelude.Maybe (Prelude.NonEmpty DisassociateClientDeviceFromCoreDeviceEntry))
+batchDisassociateClientDeviceFromCoreDevice_entries = Lens.lens (\BatchDisassociateClientDeviceFromCoreDevice' {entries} -> entries) (\s@BatchDisassociateClientDeviceFromCoreDevice' {} a -> s {entries = a} :: BatchDisassociateClientDeviceFromCoreDevice) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the core device. This is also the name of the IoT thing.
+batchDisassociateClientDeviceFromCoreDevice_coreDeviceThingName :: Lens.Lens' BatchDisassociateClientDeviceFromCoreDevice Prelude.Text
+batchDisassociateClientDeviceFromCoreDevice_coreDeviceThingName = Lens.lens (\BatchDisassociateClientDeviceFromCoreDevice' {coreDeviceThingName} -> coreDeviceThingName) (\s@BatchDisassociateClientDeviceFromCoreDevice' {} a -> s {coreDeviceThingName = a} :: BatchDisassociateClientDeviceFromCoreDevice)
+
+instance
+  Core.AWSRequest
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  type
+    AWSResponse
+      BatchDisassociateClientDeviceFromCoreDevice =
+      BatchDisassociateClientDeviceFromCoreDeviceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDisassociateClientDeviceFromCoreDeviceResponse'
+            Prelude.<$> (x Data..?> "errorEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  hashWithSalt
+    _salt
+    BatchDisassociateClientDeviceFromCoreDevice' {..} =
+      _salt
+        `Prelude.hashWithSalt` entries
+        `Prelude.hashWithSalt` coreDeviceThingName
+
+instance
+  Prelude.NFData
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  rnf BatchDisassociateClientDeviceFromCoreDevice' {..} =
+    Prelude.rnf entries
+      `Prelude.seq` Prelude.rnf coreDeviceThingName
+
+instance
+  Data.ToHeaders
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance
+  Data.ToJSON
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  toJSON
+    BatchDisassociateClientDeviceFromCoreDevice' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [("entries" Data..=) Prelude.<$> entries]
+        )
+
+instance
+  Data.ToPath
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  toPath
+    BatchDisassociateClientDeviceFromCoreDevice' {..} =
+      Prelude.mconcat
+        [ "/greengrass/v2/coreDevices/",
+          Data.toBS coreDeviceThingName,
+          "/disassociateClientDevices"
+        ]
+
+instance
+  Data.ToQuery
+    BatchDisassociateClientDeviceFromCoreDevice
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchDisassociateClientDeviceFromCoreDeviceResponse' smart constructor.
+data BatchDisassociateClientDeviceFromCoreDeviceResponse = BatchDisassociateClientDeviceFromCoreDeviceResponse'
+  { -- | The list of any errors for the entries in the request. Each error entry
+    -- contains the name of the IoT thing that failed to disassociate.
+    errorEntries :: Prelude.Maybe [DisassociateClientDeviceFromCoreDeviceErrorEntry],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDisassociateClientDeviceFromCoreDeviceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorEntries', 'batchDisassociateClientDeviceFromCoreDeviceResponse_errorEntries' - The list of any errors for the entries in the request. Each error entry
+-- contains the name of the IoT thing that failed to disassociate.
+--
+-- 'httpStatus', 'batchDisassociateClientDeviceFromCoreDeviceResponse_httpStatus' - The response's http status code.
+newBatchDisassociateClientDeviceFromCoreDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchDisassociateClientDeviceFromCoreDeviceResponse
+newBatchDisassociateClientDeviceFromCoreDeviceResponse
+  pHttpStatus_ =
+    BatchDisassociateClientDeviceFromCoreDeviceResponse'
+      { errorEntries =
+          Prelude.Nothing,
+        httpStatus =
+          pHttpStatus_
+      }
+
+-- | The list of any errors for the entries in the request. Each error entry
+-- contains the name of the IoT thing that failed to disassociate.
+batchDisassociateClientDeviceFromCoreDeviceResponse_errorEntries :: Lens.Lens' BatchDisassociateClientDeviceFromCoreDeviceResponse (Prelude.Maybe [DisassociateClientDeviceFromCoreDeviceErrorEntry])
+batchDisassociateClientDeviceFromCoreDeviceResponse_errorEntries = Lens.lens (\BatchDisassociateClientDeviceFromCoreDeviceResponse' {errorEntries} -> errorEntries) (\s@BatchDisassociateClientDeviceFromCoreDeviceResponse' {} a -> s {errorEntries = a} :: BatchDisassociateClientDeviceFromCoreDeviceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDisassociateClientDeviceFromCoreDeviceResponse_httpStatus :: Lens.Lens' BatchDisassociateClientDeviceFromCoreDeviceResponse Prelude.Int
+batchDisassociateClientDeviceFromCoreDeviceResponse_httpStatus = Lens.lens (\BatchDisassociateClientDeviceFromCoreDeviceResponse' {httpStatus} -> httpStatus) (\s@BatchDisassociateClientDeviceFromCoreDeviceResponse' {} a -> s {httpStatus = a} :: BatchDisassociateClientDeviceFromCoreDeviceResponse)
+
+instance
+  Prelude.NFData
+    BatchDisassociateClientDeviceFromCoreDeviceResponse
+  where
+  rnf
+    BatchDisassociateClientDeviceFromCoreDeviceResponse' {..} =
+      Prelude.rnf errorEntries
+        `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/CancelDeployment.hs b/gen/Amazonka/GreengrassV2/CancelDeployment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/CancelDeployment.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.CancelDeployment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Cancels a deployment. This operation cancels the deployment for devices
+-- that haven\'t yet received it. If a device already received the
+-- deployment, this operation doesn\'t change anything for that device.
+module Amazonka.GreengrassV2.CancelDeployment
+  ( -- * Creating a Request
+    CancelDeployment (..),
+    newCancelDeployment,
+
+    -- * Request Lenses
+    cancelDeployment_deploymentId,
+
+    -- * Destructuring the Response
+    CancelDeploymentResponse (..),
+    newCancelDeploymentResponse,
+
+    -- * Response Lenses
+    cancelDeploymentResponse_message,
+    cancelDeploymentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCancelDeployment' smart constructor.
+data CancelDeployment = CancelDeployment'
+  { -- | The ID of the deployment.
+    deploymentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelDeployment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deploymentId', 'cancelDeployment_deploymentId' - The ID of the deployment.
+newCancelDeployment ::
+  -- | 'deploymentId'
+  Prelude.Text ->
+  CancelDeployment
+newCancelDeployment pDeploymentId_ =
+  CancelDeployment' {deploymentId = pDeploymentId_}
+
+-- | The ID of the deployment.
+cancelDeployment_deploymentId :: Lens.Lens' CancelDeployment Prelude.Text
+cancelDeployment_deploymentId = Lens.lens (\CancelDeployment' {deploymentId} -> deploymentId) (\s@CancelDeployment' {} a -> s {deploymentId = a} :: CancelDeployment)
+
+instance Core.AWSRequest CancelDeployment where
+  type
+    AWSResponse CancelDeployment =
+      CancelDeploymentResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CancelDeploymentResponse'
+            Prelude.<$> (x Data..?> "message")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CancelDeployment where
+  hashWithSalt _salt CancelDeployment' {..} =
+    _salt `Prelude.hashWithSalt` deploymentId
+
+instance Prelude.NFData CancelDeployment where
+  rnf CancelDeployment' {..} = Prelude.rnf deploymentId
+
+instance Data.ToHeaders CancelDeployment where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CancelDeployment where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath CancelDeployment where
+  toPath CancelDeployment' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/deployments/",
+        Data.toBS deploymentId,
+        "/cancel"
+      ]
+
+instance Data.ToQuery CancelDeployment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCancelDeploymentResponse' smart constructor.
+data CancelDeploymentResponse = CancelDeploymentResponse'
+  { -- | A message that communicates if the cancel was successful.
+    message :: 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 'CancelDeploymentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'message', 'cancelDeploymentResponse_message' - A message that communicates if the cancel was successful.
+--
+-- 'httpStatus', 'cancelDeploymentResponse_httpStatus' - The response's http status code.
+newCancelDeploymentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CancelDeploymentResponse
+newCancelDeploymentResponse pHttpStatus_ =
+  CancelDeploymentResponse'
+    { message =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A message that communicates if the cancel was successful.
+cancelDeploymentResponse_message :: Lens.Lens' CancelDeploymentResponse (Prelude.Maybe Prelude.Text)
+cancelDeploymentResponse_message = Lens.lens (\CancelDeploymentResponse' {message} -> message) (\s@CancelDeploymentResponse' {} a -> s {message = a} :: CancelDeploymentResponse)
+
+-- | The response's http status code.
+cancelDeploymentResponse_httpStatus :: Lens.Lens' CancelDeploymentResponse Prelude.Int
+cancelDeploymentResponse_httpStatus = Lens.lens (\CancelDeploymentResponse' {httpStatus} -> httpStatus) (\s@CancelDeploymentResponse' {} a -> s {httpStatus = a} :: CancelDeploymentResponse)
+
+instance Prelude.NFData CancelDeploymentResponse where
+  rnf CancelDeploymentResponse' {..} =
+    Prelude.rnf message
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/CreateComponentVersion.hs b/gen/Amazonka/GreengrassV2/CreateComponentVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/CreateComponentVersion.hs
@@ -0,0 +1,386 @@
+{-# 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.GreengrassV2.CreateComponentVersion
+-- 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 component. Components are software that run on Greengrass core
+-- devices. After you develop and test a component on your core device, you
+-- can use this operation to upload your component to IoT Greengrass. Then,
+-- you can deploy the component to other core devices.
+--
+-- You can use this operation to do the following:
+--
+-- -   __Create components from recipes__
+--
+--     Create a component from a recipe, which is a file that defines the
+--     component\'s metadata, parameters, dependencies, lifecycle,
+--     artifacts, and platform capability. For more information, see
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/component-recipe-reference.html IoT Greengrass component recipe reference>
+--     in the /IoT Greengrass V2 Developer Guide/.
+--
+--     To create a component from a recipe, specify @inlineRecipe@ when you
+--     call this operation.
+--
+-- -   __Create components from Lambda functions__
+--
+--     Create a component from an Lambda function that runs on IoT
+--     Greengrass. This creates a recipe and artifacts from the Lambda
+--     function\'s deployment package. You can use this operation to
+--     migrate Lambda functions from IoT Greengrass V1 to IoT Greengrass
+--     V2.
+--
+--     This function only accepts Lambda functions that use the following
+--     runtimes:
+--
+--     -   Python 2.7 – @python2.7@
+--
+--     -   Python 3.7 – @python3.7@
+--
+--     -   Python 3.8 – @python3.8@
+--
+--     -   Python 3.9 – @python3.9@
+--
+--     -   Java 8 – @java8@
+--
+--     -   Java 11 – @java11@
+--
+--     -   Node.js 10 – @nodejs10.x@
+--
+--     -   Node.js 12 – @nodejs12.x@
+--
+--     -   Node.js 14 – @nodejs14.x@
+--
+--     To create a component from a Lambda function, specify
+--     @lambdaFunction@ when you call this operation.
+--
+--     IoT Greengrass currently supports Lambda functions on only Linux
+--     core devices.
+module Amazonka.GreengrassV2.CreateComponentVersion
+  ( -- * Creating a Request
+    CreateComponentVersion (..),
+    newCreateComponentVersion,
+
+    -- * Request Lenses
+    createComponentVersion_clientToken,
+    createComponentVersion_inlineRecipe,
+    createComponentVersion_lambdaFunction,
+    createComponentVersion_tags,
+
+    -- * Destructuring the Response
+    CreateComponentVersionResponse (..),
+    newCreateComponentVersionResponse,
+
+    -- * Response Lenses
+    createComponentVersionResponse_arn,
+    createComponentVersionResponse_httpStatus,
+    createComponentVersionResponse_componentName,
+    createComponentVersionResponse_componentVersion,
+    createComponentVersionResponse_creationTimestamp,
+    createComponentVersionResponse_status,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateComponentVersion' smart constructor.
+data CreateComponentVersion = CreateComponentVersion'
+  { -- | A unique, case-sensitive identifier that you can provide to ensure that
+    -- the request is idempotent. Idempotency means that the request is
+    -- successfully processed only once, even if you send the request multiple
+    -- times. When a request succeeds, and you specify the same client token
+    -- for subsequent successful requests, the IoT Greengrass V2 service
+    -- returns the successful response that it caches from the previous
+    -- request. IoT Greengrass V2 caches successful responses for idempotent
+    -- requests for up to 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The recipe to use to create the component. The recipe defines the
+    -- component\'s metadata, parameters, dependencies, lifecycle, artifacts,
+    -- and platform compatibility.
+    --
+    -- You must specify either @inlineRecipe@ or @lambdaFunction@.
+    inlineRecipe :: Prelude.Maybe Data.Base64,
+    -- | The parameters to create a component from a Lambda function.
+    --
+    -- You must specify either @inlineRecipe@ or @lambdaFunction@.
+    lambdaFunction :: Prelude.Maybe LambdaFunctionRecipeSource,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateComponentVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createComponentVersion_clientToken' - A unique, case-sensitive identifier that you can provide to ensure that
+-- the request is idempotent. Idempotency means that the request is
+-- successfully processed only once, even if you send the request multiple
+-- times. When a request succeeds, and you specify the same client token
+-- for subsequent successful requests, the IoT Greengrass V2 service
+-- returns the successful response that it caches from the previous
+-- request. IoT Greengrass V2 caches successful responses for idempotent
+-- requests for up to 8 hours.
+--
+-- 'inlineRecipe', 'createComponentVersion_inlineRecipe' - The recipe to use to create the component. The recipe defines the
+-- component\'s metadata, parameters, dependencies, lifecycle, artifacts,
+-- and platform compatibility.
+--
+-- You must specify either @inlineRecipe@ or @lambdaFunction@.--
+-- -- /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.
+--
+-- 'lambdaFunction', 'createComponentVersion_lambdaFunction' - The parameters to create a component from a Lambda function.
+--
+-- You must specify either @inlineRecipe@ or @lambdaFunction@.
+--
+-- 'tags', 'createComponentVersion_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+newCreateComponentVersion ::
+  CreateComponentVersion
+newCreateComponentVersion =
+  CreateComponentVersion'
+    { clientToken =
+        Prelude.Nothing,
+      inlineRecipe = Prelude.Nothing,
+      lambdaFunction = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | A unique, case-sensitive identifier that you can provide to ensure that
+-- the request is idempotent. Idempotency means that the request is
+-- successfully processed only once, even if you send the request multiple
+-- times. When a request succeeds, and you specify the same client token
+-- for subsequent successful requests, the IoT Greengrass V2 service
+-- returns the successful response that it caches from the previous
+-- request. IoT Greengrass V2 caches successful responses for idempotent
+-- requests for up to 8 hours.
+createComponentVersion_clientToken :: Lens.Lens' CreateComponentVersion (Prelude.Maybe Prelude.Text)
+createComponentVersion_clientToken = Lens.lens (\CreateComponentVersion' {clientToken} -> clientToken) (\s@CreateComponentVersion' {} a -> s {clientToken = a} :: CreateComponentVersion)
+
+-- | The recipe to use to create the component. The recipe defines the
+-- component\'s metadata, parameters, dependencies, lifecycle, artifacts,
+-- and platform compatibility.
+--
+-- You must specify either @inlineRecipe@ or @lambdaFunction@.--
+-- -- /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.
+createComponentVersion_inlineRecipe :: Lens.Lens' CreateComponentVersion (Prelude.Maybe Prelude.ByteString)
+createComponentVersion_inlineRecipe = Lens.lens (\CreateComponentVersion' {inlineRecipe} -> inlineRecipe) (\s@CreateComponentVersion' {} a -> s {inlineRecipe = a} :: CreateComponentVersion) Prelude.. Lens.mapping Data._Base64
+
+-- | The parameters to create a component from a Lambda function.
+--
+-- You must specify either @inlineRecipe@ or @lambdaFunction@.
+createComponentVersion_lambdaFunction :: Lens.Lens' CreateComponentVersion (Prelude.Maybe LambdaFunctionRecipeSource)
+createComponentVersion_lambdaFunction = Lens.lens (\CreateComponentVersion' {lambdaFunction} -> lambdaFunction) (\s@CreateComponentVersion' {} a -> s {lambdaFunction = a} :: CreateComponentVersion)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+createComponentVersion_tags :: Lens.Lens' CreateComponentVersion (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createComponentVersion_tags = Lens.lens (\CreateComponentVersion' {tags} -> tags) (\s@CreateComponentVersion' {} a -> s {tags = a} :: CreateComponentVersion) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSRequest CreateComponentVersion where
+  type
+    AWSResponse CreateComponentVersion =
+      CreateComponentVersionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateComponentVersionResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "componentName")
+            Prelude.<*> (x Data..:> "componentVersion")
+            Prelude.<*> (x Data..:> "creationTimestamp")
+            Prelude.<*> (x Data..:> "status")
+      )
+
+instance Prelude.Hashable CreateComponentVersion where
+  hashWithSalt _salt CreateComponentVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` inlineRecipe
+      `Prelude.hashWithSalt` lambdaFunction
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData CreateComponentVersion where
+  rnf CreateComponentVersion' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf inlineRecipe
+      `Prelude.seq` Prelude.rnf lambdaFunction
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders CreateComponentVersion where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CreateComponentVersion where
+  toJSON CreateComponentVersion' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("inlineRecipe" Data..=) Prelude.<$> inlineRecipe,
+            ("lambdaFunction" Data..=)
+              Prelude.<$> lambdaFunction,
+            ("tags" Data..=) Prelude.<$> tags
+          ]
+      )
+
+instance Data.ToPath CreateComponentVersion where
+  toPath =
+    Prelude.const
+      "/greengrass/v2/createComponentVersion"
+
+instance Data.ToQuery CreateComponentVersion where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateComponentVersionResponse' smart constructor.
+data CreateComponentVersionResponse = CreateComponentVersionResponse'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The name of the component.
+    componentName :: Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Text,
+    -- | The time at which the component was created, expressed in ISO 8601
+    -- format.
+    creationTimestamp :: Data.POSIX,
+    -- | The status of the component version in IoT Greengrass V2. This status is
+    -- different from the status of the component on a core device.
+    status :: CloudComponentStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateComponentVersionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'createComponentVersionResponse_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+--
+-- 'httpStatus', 'createComponentVersionResponse_httpStatus' - The response's http status code.
+--
+-- 'componentName', 'createComponentVersionResponse_componentName' - The name of the component.
+--
+-- 'componentVersion', 'createComponentVersionResponse_componentVersion' - The version of the component.
+--
+-- 'creationTimestamp', 'createComponentVersionResponse_creationTimestamp' - The time at which the component was created, expressed in ISO 8601
+-- format.
+--
+-- 'status', 'createComponentVersionResponse_status' - The status of the component version in IoT Greengrass V2. This status is
+-- different from the status of the component on a core device.
+newCreateComponentVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'componentName'
+  Prelude.Text ->
+  -- | 'componentVersion'
+  Prelude.Text ->
+  -- | 'creationTimestamp'
+  Prelude.UTCTime ->
+  -- | 'status'
+  CloudComponentStatus ->
+  CreateComponentVersionResponse
+newCreateComponentVersionResponse
+  pHttpStatus_
+  pComponentName_
+  pComponentVersion_
+  pCreationTimestamp_
+  pStatus_ =
+    CreateComponentVersionResponse'
+      { arn =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        componentName = pComponentName_,
+        componentVersion = pComponentVersion_,
+        creationTimestamp =
+          Data._Time Lens.# pCreationTimestamp_,
+        status = pStatus_
+      }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+createComponentVersionResponse_arn :: Lens.Lens' CreateComponentVersionResponse (Prelude.Maybe Prelude.Text)
+createComponentVersionResponse_arn = Lens.lens (\CreateComponentVersionResponse' {arn} -> arn) (\s@CreateComponentVersionResponse' {} a -> s {arn = a} :: CreateComponentVersionResponse)
+
+-- | The response's http status code.
+createComponentVersionResponse_httpStatus :: Lens.Lens' CreateComponentVersionResponse Prelude.Int
+createComponentVersionResponse_httpStatus = Lens.lens (\CreateComponentVersionResponse' {httpStatus} -> httpStatus) (\s@CreateComponentVersionResponse' {} a -> s {httpStatus = a} :: CreateComponentVersionResponse)
+
+-- | The name of the component.
+createComponentVersionResponse_componentName :: Lens.Lens' CreateComponentVersionResponse Prelude.Text
+createComponentVersionResponse_componentName = Lens.lens (\CreateComponentVersionResponse' {componentName} -> componentName) (\s@CreateComponentVersionResponse' {} a -> s {componentName = a} :: CreateComponentVersionResponse)
+
+-- | The version of the component.
+createComponentVersionResponse_componentVersion :: Lens.Lens' CreateComponentVersionResponse Prelude.Text
+createComponentVersionResponse_componentVersion = Lens.lens (\CreateComponentVersionResponse' {componentVersion} -> componentVersion) (\s@CreateComponentVersionResponse' {} a -> s {componentVersion = a} :: CreateComponentVersionResponse)
+
+-- | The time at which the component was created, expressed in ISO 8601
+-- format.
+createComponentVersionResponse_creationTimestamp :: Lens.Lens' CreateComponentVersionResponse Prelude.UTCTime
+createComponentVersionResponse_creationTimestamp = Lens.lens (\CreateComponentVersionResponse' {creationTimestamp} -> creationTimestamp) (\s@CreateComponentVersionResponse' {} a -> s {creationTimestamp = a} :: CreateComponentVersionResponse) Prelude.. Data._Time
+
+-- | The status of the component version in IoT Greengrass V2. This status is
+-- different from the status of the component on a core device.
+createComponentVersionResponse_status :: Lens.Lens' CreateComponentVersionResponse CloudComponentStatus
+createComponentVersionResponse_status = Lens.lens (\CreateComponentVersionResponse' {status} -> status) (\s@CreateComponentVersionResponse' {} a -> s {status = a} :: CreateComponentVersionResponse)
+
+instance
+  Prelude.NFData
+    CreateComponentVersionResponse
+  where
+  rnf CreateComponentVersionResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/GreengrassV2/CreateDeployment.hs b/gen/Amazonka/GreengrassV2/CreateDeployment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/CreateDeployment.hs
@@ -0,0 +1,362 @@
+{-# 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.GreengrassV2.CreateDeployment
+-- 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 continuous deployment for a target, which is a Greengrass core
+-- device or group of core devices. When you add a new core device to a
+-- group of core devices that has a deployment, IoT Greengrass deploys that
+-- group\'s deployment to the new device.
+--
+-- You can define one deployment for each target. When you create a new
+-- deployment for a target that has an existing deployment, you replace the
+-- previous deployment. IoT Greengrass applies the new deployment to the
+-- target devices.
+--
+-- Every deployment has a revision number that indicates how many
+-- deployment revisions you define for a target. Use this operation to
+-- create a new revision of an existing deployment.
+--
+-- For more information, see the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html Create deployments>
+-- in the /IoT Greengrass V2 Developer Guide/.
+module Amazonka.GreengrassV2.CreateDeployment
+  ( -- * Creating a Request
+    CreateDeployment (..),
+    newCreateDeployment,
+
+    -- * Request Lenses
+    createDeployment_clientToken,
+    createDeployment_components,
+    createDeployment_deploymentName,
+    createDeployment_deploymentPolicies,
+    createDeployment_iotJobConfiguration,
+    createDeployment_parentTargetArn,
+    createDeployment_tags,
+    createDeployment_targetArn,
+
+    -- * Destructuring the Response
+    CreateDeploymentResponse (..),
+    newCreateDeploymentResponse,
+
+    -- * Response Lenses
+    createDeploymentResponse_deploymentId,
+    createDeploymentResponse_iotJobArn,
+    createDeploymentResponse_iotJobId,
+    createDeploymentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDeployment' smart constructor.
+data CreateDeployment = CreateDeployment'
+  { -- | A unique, case-sensitive identifier that you can provide to ensure that
+    -- the request is idempotent. Idempotency means that the request is
+    -- successfully processed only once, even if you send the request multiple
+    -- times. When a request succeeds, and you specify the same client token
+    -- for subsequent successful requests, the IoT Greengrass V2 service
+    -- returns the successful response that it caches from the previous
+    -- request. IoT Greengrass V2 caches successful responses for idempotent
+    -- requests for up to 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The components to deploy. This is a dictionary, where each key is the
+    -- name of a component, and each key\'s value is the version and
+    -- configuration to deploy for that component.
+    components :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentDeploymentSpecification),
+    -- | The name of the deployment.
+    deploymentName :: Prelude.Maybe Prelude.Text,
+    -- | The deployment policies for the deployment. These policies define how
+    -- the deployment updates components and handles failure.
+    deploymentPolicies :: Prelude.Maybe DeploymentPolicies,
+    -- | The job configuration for the deployment configuration. The job
+    -- configuration specifies the rollout, timeout, and stop configurations
+    -- for the deployment configuration.
+    iotJobConfiguration :: Prelude.Maybe DeploymentIoTJobConfiguration,
+    -- | The parent deployment\'s target
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- within a subdeployment.
+    parentTargetArn :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the target IoT thing or thing group. When creating a subdeployment,
+    -- the targetARN can only be a thing group.
+    targetArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDeployment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createDeployment_clientToken' - A unique, case-sensitive identifier that you can provide to ensure that
+-- the request is idempotent. Idempotency means that the request is
+-- successfully processed only once, even if you send the request multiple
+-- times. When a request succeeds, and you specify the same client token
+-- for subsequent successful requests, the IoT Greengrass V2 service
+-- returns the successful response that it caches from the previous
+-- request. IoT Greengrass V2 caches successful responses for idempotent
+-- requests for up to 8 hours.
+--
+-- 'components', 'createDeployment_components' - The components to deploy. This is a dictionary, where each key is the
+-- name of a component, and each key\'s value is the version and
+-- configuration to deploy for that component.
+--
+-- 'deploymentName', 'createDeployment_deploymentName' - The name of the deployment.
+--
+-- 'deploymentPolicies', 'createDeployment_deploymentPolicies' - The deployment policies for the deployment. These policies define how
+-- the deployment updates components and handles failure.
+--
+-- 'iotJobConfiguration', 'createDeployment_iotJobConfiguration' - The job configuration for the deployment configuration. The job
+-- configuration specifies the rollout, timeout, and stop configurations
+-- for the deployment configuration.
+--
+-- 'parentTargetArn', 'createDeployment_parentTargetArn' - The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+--
+-- 'tags', 'createDeployment_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'targetArn', 'createDeployment_targetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group. When creating a subdeployment,
+-- the targetARN can only be a thing group.
+newCreateDeployment ::
+  -- | 'targetArn'
+  Prelude.Text ->
+  CreateDeployment
+newCreateDeployment pTargetArn_ =
+  CreateDeployment'
+    { clientToken = Prelude.Nothing,
+      components = Prelude.Nothing,
+      deploymentName = Prelude.Nothing,
+      deploymentPolicies = Prelude.Nothing,
+      iotJobConfiguration = Prelude.Nothing,
+      parentTargetArn = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      targetArn = pTargetArn_
+    }
+
+-- | A unique, case-sensitive identifier that you can provide to ensure that
+-- the request is idempotent. Idempotency means that the request is
+-- successfully processed only once, even if you send the request multiple
+-- times. When a request succeeds, and you specify the same client token
+-- for subsequent successful requests, the IoT Greengrass V2 service
+-- returns the successful response that it caches from the previous
+-- request. IoT Greengrass V2 caches successful responses for idempotent
+-- requests for up to 8 hours.
+createDeployment_clientToken :: Lens.Lens' CreateDeployment (Prelude.Maybe Prelude.Text)
+createDeployment_clientToken = Lens.lens (\CreateDeployment' {clientToken} -> clientToken) (\s@CreateDeployment' {} a -> s {clientToken = a} :: CreateDeployment)
+
+-- | The components to deploy. This is a dictionary, where each key is the
+-- name of a component, and each key\'s value is the version and
+-- configuration to deploy for that component.
+createDeployment_components :: Lens.Lens' CreateDeployment (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentDeploymentSpecification))
+createDeployment_components = Lens.lens (\CreateDeployment' {components} -> components) (\s@CreateDeployment' {} a -> s {components = a} :: CreateDeployment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the deployment.
+createDeployment_deploymentName :: Lens.Lens' CreateDeployment (Prelude.Maybe Prelude.Text)
+createDeployment_deploymentName = Lens.lens (\CreateDeployment' {deploymentName} -> deploymentName) (\s@CreateDeployment' {} a -> s {deploymentName = a} :: CreateDeployment)
+
+-- | The deployment policies for the deployment. These policies define how
+-- the deployment updates components and handles failure.
+createDeployment_deploymentPolicies :: Lens.Lens' CreateDeployment (Prelude.Maybe DeploymentPolicies)
+createDeployment_deploymentPolicies = Lens.lens (\CreateDeployment' {deploymentPolicies} -> deploymentPolicies) (\s@CreateDeployment' {} a -> s {deploymentPolicies = a} :: CreateDeployment)
+
+-- | The job configuration for the deployment configuration. The job
+-- configuration specifies the rollout, timeout, and stop configurations
+-- for the deployment configuration.
+createDeployment_iotJobConfiguration :: Lens.Lens' CreateDeployment (Prelude.Maybe DeploymentIoTJobConfiguration)
+createDeployment_iotJobConfiguration = Lens.lens (\CreateDeployment' {iotJobConfiguration} -> iotJobConfiguration) (\s@CreateDeployment' {} a -> s {iotJobConfiguration = a} :: CreateDeployment)
+
+-- | The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+createDeployment_parentTargetArn :: Lens.Lens' CreateDeployment (Prelude.Maybe Prelude.Text)
+createDeployment_parentTargetArn = Lens.lens (\CreateDeployment' {parentTargetArn} -> parentTargetArn) (\s@CreateDeployment' {} a -> s {parentTargetArn = a} :: CreateDeployment)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+createDeployment_tags :: Lens.Lens' CreateDeployment (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createDeployment_tags = Lens.lens (\CreateDeployment' {tags} -> tags) (\s@CreateDeployment' {} a -> s {tags = a} :: CreateDeployment) Prelude.. Lens.mapping Lens.coerced
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group. When creating a subdeployment,
+-- the targetARN can only be a thing group.
+createDeployment_targetArn :: Lens.Lens' CreateDeployment Prelude.Text
+createDeployment_targetArn = Lens.lens (\CreateDeployment' {targetArn} -> targetArn) (\s@CreateDeployment' {} a -> s {targetArn = a} :: CreateDeployment)
+
+instance Core.AWSRequest CreateDeployment where
+  type
+    AWSResponse CreateDeployment =
+      CreateDeploymentResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDeploymentResponse'
+            Prelude.<$> (x Data..?> "deploymentId")
+            Prelude.<*> (x Data..?> "iotJobArn")
+            Prelude.<*> (x Data..?> "iotJobId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDeployment where
+  hashWithSalt _salt CreateDeployment' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` components
+      `Prelude.hashWithSalt` deploymentName
+      `Prelude.hashWithSalt` deploymentPolicies
+      `Prelude.hashWithSalt` iotJobConfiguration
+      `Prelude.hashWithSalt` parentTargetArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targetArn
+
+instance Prelude.NFData CreateDeployment where
+  rnf CreateDeployment' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf components
+      `Prelude.seq` Prelude.rnf deploymentName
+      `Prelude.seq` Prelude.rnf deploymentPolicies
+      `Prelude.seq` Prelude.rnf iotJobConfiguration
+      `Prelude.seq` Prelude.rnf parentTargetArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targetArn
+
+instance Data.ToHeaders CreateDeployment where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON CreateDeployment where
+  toJSON CreateDeployment' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("components" Data..=) Prelude.<$> components,
+            ("deploymentName" Data..=)
+              Prelude.<$> deploymentName,
+            ("deploymentPolicies" Data..=)
+              Prelude.<$> deploymentPolicies,
+            ("iotJobConfiguration" Data..=)
+              Prelude.<$> iotJobConfiguration,
+            ("parentTargetArn" Data..=)
+              Prelude.<$> parentTargetArn,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("targetArn" Data..= targetArn)
+          ]
+      )
+
+instance Data.ToPath CreateDeployment where
+  toPath = Prelude.const "/greengrass/v2/deployments"
+
+instance Data.ToQuery CreateDeployment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDeploymentResponse' smart constructor.
+data CreateDeploymentResponse = CreateDeploymentResponse'
+  { -- | The ID of the deployment.
+    deploymentId :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IoT job that applies the deployment to target devices.
+    iotJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the IoT job that applies the deployment to target devices.
+    iotJobId :: 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 'CreateDeploymentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deploymentId', 'createDeploymentResponse_deploymentId' - The ID of the deployment.
+--
+-- 'iotJobArn', 'createDeploymentResponse_iotJobArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT job that applies the deployment to target devices.
+--
+-- 'iotJobId', 'createDeploymentResponse_iotJobId' - The ID of the IoT job that applies the deployment to target devices.
+--
+-- 'httpStatus', 'createDeploymentResponse_httpStatus' - The response's http status code.
+newCreateDeploymentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDeploymentResponse
+newCreateDeploymentResponse pHttpStatus_ =
+  CreateDeploymentResponse'
+    { deploymentId =
+        Prelude.Nothing,
+      iotJobArn = Prelude.Nothing,
+      iotJobId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ID of the deployment.
+createDeploymentResponse_deploymentId :: Lens.Lens' CreateDeploymentResponse (Prelude.Maybe Prelude.Text)
+createDeploymentResponse_deploymentId = Lens.lens (\CreateDeploymentResponse' {deploymentId} -> deploymentId) (\s@CreateDeploymentResponse' {} a -> s {deploymentId = a} :: CreateDeploymentResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT job that applies the deployment to target devices.
+createDeploymentResponse_iotJobArn :: Lens.Lens' CreateDeploymentResponse (Prelude.Maybe Prelude.Text)
+createDeploymentResponse_iotJobArn = Lens.lens (\CreateDeploymentResponse' {iotJobArn} -> iotJobArn) (\s@CreateDeploymentResponse' {} a -> s {iotJobArn = a} :: CreateDeploymentResponse)
+
+-- | The ID of the IoT job that applies the deployment to target devices.
+createDeploymentResponse_iotJobId :: Lens.Lens' CreateDeploymentResponse (Prelude.Maybe Prelude.Text)
+createDeploymentResponse_iotJobId = Lens.lens (\CreateDeploymentResponse' {iotJobId} -> iotJobId) (\s@CreateDeploymentResponse' {} a -> s {iotJobId = a} :: CreateDeploymentResponse)
+
+-- | The response's http status code.
+createDeploymentResponse_httpStatus :: Lens.Lens' CreateDeploymentResponse Prelude.Int
+createDeploymentResponse_httpStatus = Lens.lens (\CreateDeploymentResponse' {httpStatus} -> httpStatus) (\s@CreateDeploymentResponse' {} a -> s {httpStatus = a} :: CreateDeploymentResponse)
+
+instance Prelude.NFData CreateDeploymentResponse where
+  rnf CreateDeploymentResponse' {..} =
+    Prelude.rnf deploymentId
+      `Prelude.seq` Prelude.rnf iotJobArn
+      `Prelude.seq` Prelude.rnf iotJobId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/DeleteComponent.hs b/gen/Amazonka/GreengrassV2/DeleteComponent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/DeleteComponent.hs
@@ -0,0 +1,127 @@
+{-# 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.GreengrassV2.DeleteComponent
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a version of a component from IoT Greengrass.
+--
+-- This operation deletes the component\'s recipe and artifacts. As a
+-- result, deployments that refer to this component version will fail. If
+-- you have deployments that use this component version, you can remove the
+-- component from the deployment or update the deployment to use a valid
+-- version.
+module Amazonka.GreengrassV2.DeleteComponent
+  ( -- * Creating a Request
+    DeleteComponent (..),
+    newDeleteComponent,
+
+    -- * Request Lenses
+    deleteComponent_arn,
+
+    -- * Destructuring the Response
+    DeleteComponentResponse (..),
+    newDeleteComponentResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteComponent' smart constructor.
+data DeleteComponent = DeleteComponent'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteComponent' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'deleteComponent_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+newDeleteComponent ::
+  -- | 'arn'
+  Prelude.Text ->
+  DeleteComponent
+newDeleteComponent pArn_ =
+  DeleteComponent' {arn = pArn_}
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+deleteComponent_arn :: Lens.Lens' DeleteComponent Prelude.Text
+deleteComponent_arn = Lens.lens (\DeleteComponent' {arn} -> arn) (\s@DeleteComponent' {} a -> s {arn = a} :: DeleteComponent)
+
+instance Core.AWSRequest DeleteComponent where
+  type
+    AWSResponse DeleteComponent =
+      DeleteComponentResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveNull DeleteComponentResponse'
+
+instance Prelude.Hashable DeleteComponent where
+  hashWithSalt _salt DeleteComponent' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DeleteComponent where
+  rnf DeleteComponent' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DeleteComponent where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteComponent where
+  toPath DeleteComponent' {..} =
+    Prelude.mconcat
+      ["/greengrass/v2/components/", Data.toBS arn]
+
+instance Data.ToQuery DeleteComponent where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteComponentResponse' smart constructor.
+data DeleteComponentResponse = DeleteComponentResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteComponentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteComponentResponse ::
+  DeleteComponentResponse
+newDeleteComponentResponse = DeleteComponentResponse'
+
+instance Prelude.NFData DeleteComponentResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/GreengrassV2/DeleteCoreDevice.hs b/gen/Amazonka/GreengrassV2/DeleteCoreDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/DeleteCoreDevice.hs
@@ -0,0 +1,127 @@
+{-# 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.GreengrassV2.DeleteCoreDevice
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a Greengrass core device, which is an IoT thing. This operation
+-- removes the core device from the list of core devices. This operation
+-- doesn\'t delete the IoT thing. For more information about how to delete
+-- the IoT thing, see
+-- <https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteThing.html DeleteThing>
+-- in the /IoT API Reference/.
+module Amazonka.GreengrassV2.DeleteCoreDevice
+  ( -- * Creating a Request
+    DeleteCoreDevice (..),
+    newDeleteCoreDevice,
+
+    -- * Request Lenses
+    deleteCoreDevice_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    DeleteCoreDeviceResponse (..),
+    newDeleteCoreDeviceResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteCoreDevice' smart constructor.
+data DeleteCoreDevice = DeleteCoreDevice'
+  { -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCoreDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'coreDeviceThingName', 'deleteCoreDevice_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newDeleteCoreDevice ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  DeleteCoreDevice
+newDeleteCoreDevice pCoreDeviceThingName_ =
+  DeleteCoreDevice'
+    { coreDeviceThingName =
+        pCoreDeviceThingName_
+    }
+
+-- | The name of the core device. This is also the name of the IoT thing.
+deleteCoreDevice_coreDeviceThingName :: Lens.Lens' DeleteCoreDevice Prelude.Text
+deleteCoreDevice_coreDeviceThingName = Lens.lens (\DeleteCoreDevice' {coreDeviceThingName} -> coreDeviceThingName) (\s@DeleteCoreDevice' {} a -> s {coreDeviceThingName = a} :: DeleteCoreDevice)
+
+instance Core.AWSRequest DeleteCoreDevice where
+  type
+    AWSResponse DeleteCoreDevice =
+      DeleteCoreDeviceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveNull DeleteCoreDeviceResponse'
+
+instance Prelude.Hashable DeleteCoreDevice where
+  hashWithSalt _salt DeleteCoreDevice' {..} =
+    _salt `Prelude.hashWithSalt` coreDeviceThingName
+
+instance Prelude.NFData DeleteCoreDevice where
+  rnf DeleteCoreDevice' {..} =
+    Prelude.rnf coreDeviceThingName
+
+instance Data.ToHeaders DeleteCoreDevice where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteCoreDevice where
+  toPath DeleteCoreDevice' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/coreDevices/",
+        Data.toBS coreDeviceThingName
+      ]
+
+instance Data.ToQuery DeleteCoreDevice where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteCoreDeviceResponse' smart constructor.
+data DeleteCoreDeviceResponse = DeleteCoreDeviceResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCoreDeviceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteCoreDeviceResponse ::
+  DeleteCoreDeviceResponse
+newDeleteCoreDeviceResponse =
+  DeleteCoreDeviceResponse'
+
+instance Prelude.NFData DeleteCoreDeviceResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/GreengrassV2/DeleteDeployment.hs b/gen/Amazonka/GreengrassV2/DeleteDeployment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/DeleteDeployment.hs
@@ -0,0 +1,125 @@
+{-# 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.GreengrassV2.DeleteDeployment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a deployment. To delete an active deployment, you must first
+-- cancel it. For more information, see
+-- <https://docs.aws.amazon.com/iot/latest/apireference/API_CancelDeployment.html CancelDeployment>.
+--
+-- Deleting a deployment doesn\'t affect core devices that run that
+-- deployment, because core devices store the deployment\'s configuration
+-- on the device. Additionally, core devices can roll back to a previous
+-- deployment that has been deleted.
+module Amazonka.GreengrassV2.DeleteDeployment
+  ( -- * Creating a Request
+    DeleteDeployment (..),
+    newDeleteDeployment,
+
+    -- * Request Lenses
+    deleteDeployment_deploymentId,
+
+    -- * Destructuring the Response
+    DeleteDeploymentResponse (..),
+    newDeleteDeploymentResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDeployment' smart constructor.
+data DeleteDeployment = DeleteDeployment'
+  { -- | The ID of the deployment.
+    deploymentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDeployment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deploymentId', 'deleteDeployment_deploymentId' - The ID of the deployment.
+newDeleteDeployment ::
+  -- | 'deploymentId'
+  Prelude.Text ->
+  DeleteDeployment
+newDeleteDeployment pDeploymentId_ =
+  DeleteDeployment' {deploymentId = pDeploymentId_}
+
+-- | The ID of the deployment.
+deleteDeployment_deploymentId :: Lens.Lens' DeleteDeployment Prelude.Text
+deleteDeployment_deploymentId = Lens.lens (\DeleteDeployment' {deploymentId} -> deploymentId) (\s@DeleteDeployment' {} a -> s {deploymentId = a} :: DeleteDeployment)
+
+instance Core.AWSRequest DeleteDeployment where
+  type
+    AWSResponse DeleteDeployment =
+      DeleteDeploymentResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveNull DeleteDeploymentResponse'
+
+instance Prelude.Hashable DeleteDeployment where
+  hashWithSalt _salt DeleteDeployment' {..} =
+    _salt `Prelude.hashWithSalt` deploymentId
+
+instance Prelude.NFData DeleteDeployment where
+  rnf DeleteDeployment' {..} = Prelude.rnf deploymentId
+
+instance Data.ToHeaders DeleteDeployment where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteDeployment where
+  toPath DeleteDeployment' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/deployments/",
+        Data.toBS deploymentId
+      ]
+
+instance Data.ToQuery DeleteDeployment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDeploymentResponse' smart constructor.
+data DeleteDeploymentResponse = DeleteDeploymentResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDeploymentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteDeploymentResponse ::
+  DeleteDeploymentResponse
+newDeleteDeploymentResponse =
+  DeleteDeploymentResponse'
+
+instance Prelude.NFData DeleteDeploymentResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/GreengrassV2/DescribeComponent.hs b/gen/Amazonka/GreengrassV2/DescribeComponent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/DescribeComponent.hs
@@ -0,0 +1,276 @@
+{-# 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.GreengrassV2.DescribeComponent
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves metadata for a version of a component.
+module Amazonka.GreengrassV2.DescribeComponent
+  ( -- * Creating a Request
+    DescribeComponent (..),
+    newDescribeComponent,
+
+    -- * Request Lenses
+    describeComponent_arn,
+
+    -- * Destructuring the Response
+    DescribeComponentResponse (..),
+    newDescribeComponentResponse,
+
+    -- * Response Lenses
+    describeComponentResponse_arn,
+    describeComponentResponse_componentName,
+    describeComponentResponse_componentVersion,
+    describeComponentResponse_creationTimestamp,
+    describeComponentResponse_description,
+    describeComponentResponse_platforms,
+    describeComponentResponse_publisher,
+    describeComponentResponse_status,
+    describeComponentResponse_tags,
+    describeComponentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeComponent' smart constructor.
+data DescribeComponent = DescribeComponent'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeComponent' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeComponent_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+newDescribeComponent ::
+  -- | 'arn'
+  Prelude.Text ->
+  DescribeComponent
+newDescribeComponent pArn_ =
+  DescribeComponent' {arn = pArn_}
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+describeComponent_arn :: Lens.Lens' DescribeComponent Prelude.Text
+describeComponent_arn = Lens.lens (\DescribeComponent' {arn} -> arn) (\s@DescribeComponent' {} a -> s {arn = a} :: DescribeComponent)
+
+instance Core.AWSRequest DescribeComponent where
+  type
+    AWSResponse DescribeComponent =
+      DescribeComponentResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeComponentResponse'
+            Prelude.<$> (x Data..?> "arn")
+            Prelude.<*> (x Data..?> "componentName")
+            Prelude.<*> (x Data..?> "componentVersion")
+            Prelude.<*> (x Data..?> "creationTimestamp")
+            Prelude.<*> (x Data..?> "description")
+            Prelude.<*> (x Data..?> "platforms" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "publisher")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeComponent where
+  hashWithSalt _salt DescribeComponent' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData DescribeComponent where
+  rnf DescribeComponent' {..} = Prelude.rnf arn
+
+instance Data.ToHeaders DescribeComponent where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DescribeComponent where
+  toPath DescribeComponent' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/components/",
+        Data.toBS arn,
+        "/metadata"
+      ]
+
+instance Data.ToQuery DescribeComponent where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeComponentResponse' smart constructor.
+data DescribeComponentResponse = DescribeComponentResponse'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the component was created, expressed in ISO 8601
+    -- format.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The description of the component version.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The platforms that the component version supports.
+    platforms :: Prelude.Maybe [ComponentPlatform],
+    -- | The publisher of the component version.
+    publisher :: Prelude.Maybe Prelude.Text,
+    -- | The status of the component version in IoT Greengrass V2. This status is
+    -- different from the status of the component on a core device.
+    status :: Prelude.Maybe CloudComponentStatus,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    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 'DescribeComponentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeComponentResponse_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+--
+-- 'componentName', 'describeComponentResponse_componentName' - The name of the component.
+--
+-- 'componentVersion', 'describeComponentResponse_componentVersion' - The version of the component.
+--
+-- 'creationTimestamp', 'describeComponentResponse_creationTimestamp' - The time at which the component was created, expressed in ISO 8601
+-- format.
+--
+-- 'description', 'describeComponentResponse_description' - The description of the component version.
+--
+-- 'platforms', 'describeComponentResponse_platforms' - The platforms that the component version supports.
+--
+-- 'publisher', 'describeComponentResponse_publisher' - The publisher of the component version.
+--
+-- 'status', 'describeComponentResponse_status' - The status of the component version in IoT Greengrass V2. This status is
+-- different from the status of the component on a core device.
+--
+-- 'tags', 'describeComponentResponse_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'httpStatus', 'describeComponentResponse_httpStatus' - The response's http status code.
+newDescribeComponentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeComponentResponse
+newDescribeComponentResponse pHttpStatus_ =
+  DescribeComponentResponse'
+    { arn = Prelude.Nothing,
+      componentName = Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      creationTimestamp = Prelude.Nothing,
+      description = Prelude.Nothing,
+      platforms = Prelude.Nothing,
+      publisher = Prelude.Nothing,
+      status = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+describeComponentResponse_arn :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe Prelude.Text)
+describeComponentResponse_arn = Lens.lens (\DescribeComponentResponse' {arn} -> arn) (\s@DescribeComponentResponse' {} a -> s {arn = a} :: DescribeComponentResponse)
+
+-- | The name of the component.
+describeComponentResponse_componentName :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe Prelude.Text)
+describeComponentResponse_componentName = Lens.lens (\DescribeComponentResponse' {componentName} -> componentName) (\s@DescribeComponentResponse' {} a -> s {componentName = a} :: DescribeComponentResponse)
+
+-- | The version of the component.
+describeComponentResponse_componentVersion :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe Prelude.Text)
+describeComponentResponse_componentVersion = Lens.lens (\DescribeComponentResponse' {componentVersion} -> componentVersion) (\s@DescribeComponentResponse' {} a -> s {componentVersion = a} :: DescribeComponentResponse)
+
+-- | The time at which the component was created, expressed in ISO 8601
+-- format.
+describeComponentResponse_creationTimestamp :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe Prelude.UTCTime)
+describeComponentResponse_creationTimestamp = Lens.lens (\DescribeComponentResponse' {creationTimestamp} -> creationTimestamp) (\s@DescribeComponentResponse' {} a -> s {creationTimestamp = a} :: DescribeComponentResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The description of the component version.
+describeComponentResponse_description :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe Prelude.Text)
+describeComponentResponse_description = Lens.lens (\DescribeComponentResponse' {description} -> description) (\s@DescribeComponentResponse' {} a -> s {description = a} :: DescribeComponentResponse)
+
+-- | The platforms that the component version supports.
+describeComponentResponse_platforms :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe [ComponentPlatform])
+describeComponentResponse_platforms = Lens.lens (\DescribeComponentResponse' {platforms} -> platforms) (\s@DescribeComponentResponse' {} a -> s {platforms = a} :: DescribeComponentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The publisher of the component version.
+describeComponentResponse_publisher :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe Prelude.Text)
+describeComponentResponse_publisher = Lens.lens (\DescribeComponentResponse' {publisher} -> publisher) (\s@DescribeComponentResponse' {} a -> s {publisher = a} :: DescribeComponentResponse)
+
+-- | The status of the component version in IoT Greengrass V2. This status is
+-- different from the status of the component on a core device.
+describeComponentResponse_status :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe CloudComponentStatus)
+describeComponentResponse_status = Lens.lens (\DescribeComponentResponse' {status} -> status) (\s@DescribeComponentResponse' {} a -> s {status = a} :: DescribeComponentResponse)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+describeComponentResponse_tags :: Lens.Lens' DescribeComponentResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+describeComponentResponse_tags = Lens.lens (\DescribeComponentResponse' {tags} -> tags) (\s@DescribeComponentResponse' {} a -> s {tags = a} :: DescribeComponentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeComponentResponse_httpStatus :: Lens.Lens' DescribeComponentResponse Prelude.Int
+describeComponentResponse_httpStatus = Lens.lens (\DescribeComponentResponse' {httpStatus} -> httpStatus) (\s@DescribeComponentResponse' {} a -> s {httpStatus = a} :: DescribeComponentResponse)
+
+instance Prelude.NFData DescribeComponentResponse where
+  rnf DescribeComponentResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf platforms
+      `Prelude.seq` Prelude.rnf publisher
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/DisassociateServiceRoleFromAccount.hs b/gen/Amazonka/GreengrassV2/DisassociateServiceRoleFromAccount.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/DisassociateServiceRoleFromAccount.hs
@@ -0,0 +1,165 @@
+{-# 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.GreengrassV2.DisassociateServiceRoleFromAccount
+-- 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 the Greengrass service role from IoT Greengrass for your
+-- Amazon Web Services account in this Amazon Web Services Region. Without
+-- a service role, IoT Greengrass can\'t verify the identity of client
+-- devices or manage core device connectivity information. For more
+-- information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-service-role.html Greengrass service role>
+-- in the /IoT Greengrass Version 2 Developer Guide/.
+module Amazonka.GreengrassV2.DisassociateServiceRoleFromAccount
+  ( -- * Creating a Request
+    DisassociateServiceRoleFromAccount (..),
+    newDisassociateServiceRoleFromAccount,
+
+    -- * Destructuring the Response
+    DisassociateServiceRoleFromAccountResponse (..),
+    newDisassociateServiceRoleFromAccountResponse,
+
+    -- * Response Lenses
+    disassociateServiceRoleFromAccountResponse_disassociatedAt,
+    disassociateServiceRoleFromAccountResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDisassociateServiceRoleFromAccount' smart constructor.
+data DisassociateServiceRoleFromAccount = DisassociateServiceRoleFromAccount'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateServiceRoleFromAccount' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDisassociateServiceRoleFromAccount ::
+  DisassociateServiceRoleFromAccount
+newDisassociateServiceRoleFromAccount =
+  DisassociateServiceRoleFromAccount'
+
+instance
+  Core.AWSRequest
+    DisassociateServiceRoleFromAccount
+  where
+  type
+    AWSResponse DisassociateServiceRoleFromAccount =
+      DisassociateServiceRoleFromAccountResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DisassociateServiceRoleFromAccountResponse'
+            Prelude.<$> (x Data..?> "DisassociatedAt")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DisassociateServiceRoleFromAccount
+  where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance
+  Prelude.NFData
+    DisassociateServiceRoleFromAccount
+  where
+  rnf _ = ()
+
+instance
+  Data.ToHeaders
+    DisassociateServiceRoleFromAccount
+  where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance
+  Data.ToPath
+    DisassociateServiceRoleFromAccount
+  where
+  toPath = Prelude.const "/greengrass/servicerole"
+
+instance
+  Data.ToQuery
+    DisassociateServiceRoleFromAccount
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDisassociateServiceRoleFromAccountResponse' smart constructor.
+data DisassociateServiceRoleFromAccountResponse = DisassociateServiceRoleFromAccountResponse'
+  { -- | The time when the service role was disassociated from IoT Greengrass for
+    -- your Amazon Web Services account in this Amazon Web Services Region.
+    disassociatedAt :: 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 'DisassociateServiceRoleFromAccountResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'disassociatedAt', 'disassociateServiceRoleFromAccountResponse_disassociatedAt' - The time when the service role was disassociated from IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+--
+-- 'httpStatus', 'disassociateServiceRoleFromAccountResponse_httpStatus' - The response's http status code.
+newDisassociateServiceRoleFromAccountResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DisassociateServiceRoleFromAccountResponse
+newDisassociateServiceRoleFromAccountResponse
+  pHttpStatus_ =
+    DisassociateServiceRoleFromAccountResponse'
+      { disassociatedAt =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The time when the service role was disassociated from IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+disassociateServiceRoleFromAccountResponse_disassociatedAt :: Lens.Lens' DisassociateServiceRoleFromAccountResponse (Prelude.Maybe Prelude.Text)
+disassociateServiceRoleFromAccountResponse_disassociatedAt = Lens.lens (\DisassociateServiceRoleFromAccountResponse' {disassociatedAt} -> disassociatedAt) (\s@DisassociateServiceRoleFromAccountResponse' {} a -> s {disassociatedAt = a} :: DisassociateServiceRoleFromAccountResponse)
+
+-- | The response's http status code.
+disassociateServiceRoleFromAccountResponse_httpStatus :: Lens.Lens' DisassociateServiceRoleFromAccountResponse Prelude.Int
+disassociateServiceRoleFromAccountResponse_httpStatus = Lens.lens (\DisassociateServiceRoleFromAccountResponse' {httpStatus} -> httpStatus) (\s@DisassociateServiceRoleFromAccountResponse' {} a -> s {httpStatus = a} :: DisassociateServiceRoleFromAccountResponse)
+
+instance
+  Prelude.NFData
+    DisassociateServiceRoleFromAccountResponse
+  where
+  rnf DisassociateServiceRoleFromAccountResponse' {..} =
+    Prelude.rnf disassociatedAt
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/GetComponent.hs b/gen/Amazonka/GreengrassV2/GetComponent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/GetComponent.hs
@@ -0,0 +1,220 @@
+{-# 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.GreengrassV2.GetComponent
+-- 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 recipe for a version of a component.
+module Amazonka.GreengrassV2.GetComponent
+  ( -- * Creating a Request
+    GetComponent (..),
+    newGetComponent,
+
+    -- * Request Lenses
+    getComponent_recipeOutputFormat,
+    getComponent_arn,
+
+    -- * Destructuring the Response
+    GetComponentResponse (..),
+    newGetComponentResponse,
+
+    -- * Response Lenses
+    getComponentResponse_tags,
+    getComponentResponse_httpStatus,
+    getComponentResponse_recipeOutputFormat,
+    getComponentResponse_recipe,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetComponent' smart constructor.
+data GetComponent = GetComponent'
+  { -- | The format of the recipe.
+    recipeOutputFormat :: Prelude.Maybe RecipeOutputFormat,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetComponent' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recipeOutputFormat', 'getComponent_recipeOutputFormat' - The format of the recipe.
+--
+-- 'arn', 'getComponent_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+newGetComponent ::
+  -- | 'arn'
+  Prelude.Text ->
+  GetComponent
+newGetComponent pArn_ =
+  GetComponent'
+    { recipeOutputFormat = Prelude.Nothing,
+      arn = pArn_
+    }
+
+-- | The format of the recipe.
+getComponent_recipeOutputFormat :: Lens.Lens' GetComponent (Prelude.Maybe RecipeOutputFormat)
+getComponent_recipeOutputFormat = Lens.lens (\GetComponent' {recipeOutputFormat} -> recipeOutputFormat) (\s@GetComponent' {} a -> s {recipeOutputFormat = a} :: GetComponent)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+getComponent_arn :: Lens.Lens' GetComponent Prelude.Text
+getComponent_arn = Lens.lens (\GetComponent' {arn} -> arn) (\s@GetComponent' {} a -> s {arn = a} :: GetComponent)
+
+instance Core.AWSRequest GetComponent where
+  type AWSResponse GetComponent = GetComponentResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetComponentResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "recipeOutputFormat")
+            Prelude.<*> (x Data..:> "recipe")
+      )
+
+instance Prelude.Hashable GetComponent where
+  hashWithSalt _salt GetComponent' {..} =
+    _salt
+      `Prelude.hashWithSalt` recipeOutputFormat
+      `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData GetComponent where
+  rnf GetComponent' {..} =
+    Prelude.rnf recipeOutputFormat
+      `Prelude.seq` Prelude.rnf arn
+
+instance Data.ToHeaders GetComponent where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetComponent where
+  toPath GetComponent' {..} =
+    Prelude.mconcat
+      ["/greengrass/v2/components/", Data.toBS arn]
+
+instance Data.ToQuery GetComponent where
+  toQuery GetComponent' {..} =
+    Prelude.mconcat
+      ["recipeOutputFormat" Data.=: recipeOutputFormat]
+
+-- | /See:/ 'newGetComponentResponse' smart constructor.
+data GetComponentResponse = GetComponentResponse'
+  { -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The format of the recipe.
+    recipeOutputFormat :: RecipeOutputFormat,
+    -- | The recipe of the component version.
+    recipe :: Data.Base64
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetComponentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getComponentResponse_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'httpStatus', 'getComponentResponse_httpStatus' - The response's http status code.
+--
+-- 'recipeOutputFormat', 'getComponentResponse_recipeOutputFormat' - The format of the recipe.
+--
+-- 'recipe', 'getComponentResponse_recipe' - The recipe of the component version.--
+-- -- /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.
+newGetComponentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'recipeOutputFormat'
+  RecipeOutputFormat ->
+  -- | 'recipe'
+  Prelude.ByteString ->
+  GetComponentResponse
+newGetComponentResponse
+  pHttpStatus_
+  pRecipeOutputFormat_
+  pRecipe_ =
+    GetComponentResponse'
+      { tags = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        recipeOutputFormat = pRecipeOutputFormat_,
+        recipe = Data._Base64 Lens.# pRecipe_
+      }
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+getComponentResponse_tags :: Lens.Lens' GetComponentResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getComponentResponse_tags = Lens.lens (\GetComponentResponse' {tags} -> tags) (\s@GetComponentResponse' {} a -> s {tags = a} :: GetComponentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getComponentResponse_httpStatus :: Lens.Lens' GetComponentResponse Prelude.Int
+getComponentResponse_httpStatus = Lens.lens (\GetComponentResponse' {httpStatus} -> httpStatus) (\s@GetComponentResponse' {} a -> s {httpStatus = a} :: GetComponentResponse)
+
+-- | The format of the recipe.
+getComponentResponse_recipeOutputFormat :: Lens.Lens' GetComponentResponse RecipeOutputFormat
+getComponentResponse_recipeOutputFormat = Lens.lens (\GetComponentResponse' {recipeOutputFormat} -> recipeOutputFormat) (\s@GetComponentResponse' {} a -> s {recipeOutputFormat = a} :: GetComponentResponse)
+
+-- | The recipe of the component version.--
+-- -- /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.
+getComponentResponse_recipe :: Lens.Lens' GetComponentResponse Prelude.ByteString
+getComponentResponse_recipe = Lens.lens (\GetComponentResponse' {recipe} -> recipe) (\s@GetComponentResponse' {} a -> s {recipe = a} :: GetComponentResponse) Prelude.. Data._Base64
+
+instance Prelude.NFData GetComponentResponse where
+  rnf GetComponentResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf recipeOutputFormat
+      `Prelude.seq` Prelude.rnf recipe
diff --git a/gen/Amazonka/GreengrassV2/GetComponentVersionArtifact.hs b/gen/Amazonka/GreengrassV2/GetComponentVersionArtifact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/GetComponentVersionArtifact.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.GreengrassV2.GetComponentVersionArtifact
+-- 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 pre-signed URL to download a public or a Lambda component
+-- artifact. Core devices call this operation to identify the URL that they
+-- can use to download an artifact to install.
+module Amazonka.GreengrassV2.GetComponentVersionArtifact
+  ( -- * Creating a Request
+    GetComponentVersionArtifact (..),
+    newGetComponentVersionArtifact,
+
+    -- * Request Lenses
+    getComponentVersionArtifact_arn,
+    getComponentVersionArtifact_artifactName,
+
+    -- * Destructuring the Response
+    GetComponentVersionArtifactResponse (..),
+    newGetComponentVersionArtifactResponse,
+
+    -- * Response Lenses
+    getComponentVersionArtifactResponse_httpStatus,
+    getComponentVersionArtifactResponse_preSignedUrl,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetComponentVersionArtifact' smart constructor.
+data GetComponentVersionArtifact = GetComponentVersionArtifact'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version. Specify the ARN of a public or a Lambda
+    -- component version.
+    arn :: Prelude.Text,
+    -- | The name of the artifact.
+    --
+    -- You can use the
+    -- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_GetComponent.html GetComponent>
+    -- operation to download the component recipe, which includes the URI of
+    -- the artifact. The artifact name is the section of the URI after the
+    -- scheme. For example, in the artifact URI @greengrass:SomeArtifact.zip@,
+    -- the artifact name is @SomeArtifact.zip@.
+    artifactName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetComponentVersionArtifact' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'getComponentVersionArtifact_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version. Specify the ARN of a public or a Lambda
+-- component version.
+--
+-- 'artifactName', 'getComponentVersionArtifact_artifactName' - The name of the artifact.
+--
+-- You can use the
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_GetComponent.html GetComponent>
+-- operation to download the component recipe, which includes the URI of
+-- the artifact. The artifact name is the section of the URI after the
+-- scheme. For example, in the artifact URI @greengrass:SomeArtifact.zip@,
+-- the artifact name is @SomeArtifact.zip@.
+newGetComponentVersionArtifact ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'artifactName'
+  Prelude.Text ->
+  GetComponentVersionArtifact
+newGetComponentVersionArtifact pArn_ pArtifactName_ =
+  GetComponentVersionArtifact'
+    { arn = pArn_,
+      artifactName = pArtifactName_
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version. Specify the ARN of a public or a Lambda
+-- component version.
+getComponentVersionArtifact_arn :: Lens.Lens' GetComponentVersionArtifact Prelude.Text
+getComponentVersionArtifact_arn = Lens.lens (\GetComponentVersionArtifact' {arn} -> arn) (\s@GetComponentVersionArtifact' {} a -> s {arn = a} :: GetComponentVersionArtifact)
+
+-- | The name of the artifact.
+--
+-- You can use the
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_GetComponent.html GetComponent>
+-- operation to download the component recipe, which includes the URI of
+-- the artifact. The artifact name is the section of the URI after the
+-- scheme. For example, in the artifact URI @greengrass:SomeArtifact.zip@,
+-- the artifact name is @SomeArtifact.zip@.
+getComponentVersionArtifact_artifactName :: Lens.Lens' GetComponentVersionArtifact Prelude.Text
+getComponentVersionArtifact_artifactName = Lens.lens (\GetComponentVersionArtifact' {artifactName} -> artifactName) (\s@GetComponentVersionArtifact' {} a -> s {artifactName = a} :: GetComponentVersionArtifact)
+
+instance Core.AWSRequest GetComponentVersionArtifact where
+  type
+    AWSResponse GetComponentVersionArtifact =
+      GetComponentVersionArtifactResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetComponentVersionArtifactResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "preSignedUrl")
+      )
+
+instance Prelude.Hashable GetComponentVersionArtifact where
+  hashWithSalt _salt GetComponentVersionArtifact' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` artifactName
+
+instance Prelude.NFData GetComponentVersionArtifact where
+  rnf GetComponentVersionArtifact' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf artifactName
+
+instance Data.ToHeaders GetComponentVersionArtifact where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetComponentVersionArtifact where
+  toPath GetComponentVersionArtifact' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/components/",
+        Data.toBS arn,
+        "/artifacts/",
+        Data.toBS artifactName
+      ]
+
+instance Data.ToQuery GetComponentVersionArtifact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetComponentVersionArtifactResponse' smart constructor.
+data GetComponentVersionArtifactResponse = GetComponentVersionArtifactResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The URL of the artifact.
+    preSignedUrl :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetComponentVersionArtifactResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'getComponentVersionArtifactResponse_httpStatus' - The response's http status code.
+--
+-- 'preSignedUrl', 'getComponentVersionArtifactResponse_preSignedUrl' - The URL of the artifact.
+newGetComponentVersionArtifactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'preSignedUrl'
+  Prelude.Text ->
+  GetComponentVersionArtifactResponse
+newGetComponentVersionArtifactResponse
+  pHttpStatus_
+  pPreSignedUrl_ =
+    GetComponentVersionArtifactResponse'
+      { httpStatus =
+          pHttpStatus_,
+        preSignedUrl = pPreSignedUrl_
+      }
+
+-- | The response's http status code.
+getComponentVersionArtifactResponse_httpStatus :: Lens.Lens' GetComponentVersionArtifactResponse Prelude.Int
+getComponentVersionArtifactResponse_httpStatus = Lens.lens (\GetComponentVersionArtifactResponse' {httpStatus} -> httpStatus) (\s@GetComponentVersionArtifactResponse' {} a -> s {httpStatus = a} :: GetComponentVersionArtifactResponse)
+
+-- | The URL of the artifact.
+getComponentVersionArtifactResponse_preSignedUrl :: Lens.Lens' GetComponentVersionArtifactResponse Prelude.Text
+getComponentVersionArtifactResponse_preSignedUrl = Lens.lens (\GetComponentVersionArtifactResponse' {preSignedUrl} -> preSignedUrl) (\s@GetComponentVersionArtifactResponse' {} a -> s {preSignedUrl = a} :: GetComponentVersionArtifactResponse)
+
+instance
+  Prelude.NFData
+    GetComponentVersionArtifactResponse
+  where
+  rnf GetComponentVersionArtifactResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf preSignedUrl
diff --git a/gen/Amazonka/GreengrassV2/GetConnectivityInfo.hs b/gen/Amazonka/GreengrassV2/GetConnectivityInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/GetConnectivityInfo.hs
@@ -0,0 +1,178 @@
+{-# 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.GreengrassV2.GetConnectivityInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves connectivity information for a Greengrass core device.
+--
+-- Connectivity information includes endpoints and ports where client
+-- devices can connect to an MQTT broker on the core device. When a client
+-- device calls the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-discover-api.html IoT Greengrass discovery API>,
+-- IoT Greengrass returns connectivity information for all of the core
+-- devices where the client device can connect. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/connect-client-devices.html Connect client devices to core devices>
+-- in the /IoT Greengrass Version 2 Developer Guide/.
+module Amazonka.GreengrassV2.GetConnectivityInfo
+  ( -- * Creating a Request
+    GetConnectivityInfo (..),
+    newGetConnectivityInfo,
+
+    -- * Request Lenses
+    getConnectivityInfo_thingName,
+
+    -- * Destructuring the Response
+    GetConnectivityInfoResponse (..),
+    newGetConnectivityInfoResponse,
+
+    -- * Response Lenses
+    getConnectivityInfoResponse_connectivityInfo,
+    getConnectivityInfoResponse_message,
+    getConnectivityInfoResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetConnectivityInfo' smart constructor.
+data GetConnectivityInfo = GetConnectivityInfo'
+  { -- | The name of the core device. This is also the name of the IoT thing.
+    thingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetConnectivityInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'thingName', 'getConnectivityInfo_thingName' - The name of the core device. This is also the name of the IoT thing.
+newGetConnectivityInfo ::
+  -- | 'thingName'
+  Prelude.Text ->
+  GetConnectivityInfo
+newGetConnectivityInfo pThingName_ =
+  GetConnectivityInfo' {thingName = pThingName_}
+
+-- | The name of the core device. This is also the name of the IoT thing.
+getConnectivityInfo_thingName :: Lens.Lens' GetConnectivityInfo Prelude.Text
+getConnectivityInfo_thingName = Lens.lens (\GetConnectivityInfo' {thingName} -> thingName) (\s@GetConnectivityInfo' {} a -> s {thingName = a} :: GetConnectivityInfo)
+
+instance Core.AWSRequest GetConnectivityInfo where
+  type
+    AWSResponse GetConnectivityInfo =
+      GetConnectivityInfoResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetConnectivityInfoResponse'
+            Prelude.<$> ( x
+                            Data..?> "ConnectivityInfo"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "Message")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetConnectivityInfo where
+  hashWithSalt _salt GetConnectivityInfo' {..} =
+    _salt `Prelude.hashWithSalt` thingName
+
+instance Prelude.NFData GetConnectivityInfo where
+  rnf GetConnectivityInfo' {..} = Prelude.rnf thingName
+
+instance Data.ToHeaders GetConnectivityInfo where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetConnectivityInfo where
+  toPath GetConnectivityInfo' {..} =
+    Prelude.mconcat
+      [ "/greengrass/things/",
+        Data.toBS thingName,
+        "/connectivityInfo"
+      ]
+
+instance Data.ToQuery GetConnectivityInfo where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetConnectivityInfoResponse' smart constructor.
+data GetConnectivityInfoResponse = GetConnectivityInfoResponse'
+  { -- | The connectivity information for the core device.
+    connectivityInfo :: Prelude.Maybe [ConnectivityInfo],
+    -- | A message about the connectivity information request.
+    message :: 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 'GetConnectivityInfoResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'connectivityInfo', 'getConnectivityInfoResponse_connectivityInfo' - The connectivity information for the core device.
+--
+-- 'message', 'getConnectivityInfoResponse_message' - A message about the connectivity information request.
+--
+-- 'httpStatus', 'getConnectivityInfoResponse_httpStatus' - The response's http status code.
+newGetConnectivityInfoResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetConnectivityInfoResponse
+newGetConnectivityInfoResponse pHttpStatus_ =
+  GetConnectivityInfoResponse'
+    { connectivityInfo =
+        Prelude.Nothing,
+      message = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The connectivity information for the core device.
+getConnectivityInfoResponse_connectivityInfo :: Lens.Lens' GetConnectivityInfoResponse (Prelude.Maybe [ConnectivityInfo])
+getConnectivityInfoResponse_connectivityInfo = Lens.lens (\GetConnectivityInfoResponse' {connectivityInfo} -> connectivityInfo) (\s@GetConnectivityInfoResponse' {} a -> s {connectivityInfo = a} :: GetConnectivityInfoResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A message about the connectivity information request.
+getConnectivityInfoResponse_message :: Lens.Lens' GetConnectivityInfoResponse (Prelude.Maybe Prelude.Text)
+getConnectivityInfoResponse_message = Lens.lens (\GetConnectivityInfoResponse' {message} -> message) (\s@GetConnectivityInfoResponse' {} a -> s {message = a} :: GetConnectivityInfoResponse)
+
+-- | The response's http status code.
+getConnectivityInfoResponse_httpStatus :: Lens.Lens' GetConnectivityInfoResponse Prelude.Int
+getConnectivityInfoResponse_httpStatus = Lens.lens (\GetConnectivityInfoResponse' {httpStatus} -> httpStatus) (\s@GetConnectivityInfoResponse' {} a -> s {httpStatus = a} :: GetConnectivityInfoResponse)
+
+instance Prelude.NFData GetConnectivityInfoResponse where
+  rnf GetConnectivityInfoResponse' {..} =
+    Prelude.rnf connectivityInfo
+      `Prelude.seq` Prelude.rnf message
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/GetCoreDevice.hs b/gen/Amazonka/GreengrassV2/GetCoreDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/GetCoreDevice.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.GetCoreDevice
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves metadata for a Greengrass core device.
+--
+-- IoT Greengrass relies on individual devices to send status updates to
+-- the Amazon Web Services Cloud. If the IoT Greengrass Core software
+-- isn\'t running on the device, or if device isn\'t connected to the
+-- Amazon Web Services Cloud, then the reported status of that device might
+-- not reflect its current status. The status timestamp indicates when the
+-- device status was last updated.
+--
+-- Core devices send status updates at the following times:
+--
+-- -   When the IoT Greengrass Core software starts
+--
+-- -   When the core device receives a deployment from the Amazon Web
+--     Services Cloud
+--
+-- -   When the status of any component on the core device becomes @BROKEN@
+--
+-- -   At a
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html#greengrass-nucleus-component-configuration-fss regular interval that you can configure>,
+--     which defaults to 24 hours
+--
+-- -   For IoT Greengrass Core v2.7.0, the core device sends status updates
+--     upon local deployment and cloud deployment
+module Amazonka.GreengrassV2.GetCoreDevice
+  ( -- * Creating a Request
+    GetCoreDevice (..),
+    newGetCoreDevice,
+
+    -- * Request Lenses
+    getCoreDevice_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    GetCoreDeviceResponse (..),
+    newGetCoreDeviceResponse,
+
+    -- * Response Lenses
+    getCoreDeviceResponse_architecture,
+    getCoreDeviceResponse_coreDeviceThingName,
+    getCoreDeviceResponse_coreVersion,
+    getCoreDeviceResponse_lastStatusUpdateTimestamp,
+    getCoreDeviceResponse_platform,
+    getCoreDeviceResponse_status,
+    getCoreDeviceResponse_tags,
+    getCoreDeviceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetCoreDevice' smart constructor.
+data GetCoreDevice = GetCoreDevice'
+  { -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCoreDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'coreDeviceThingName', 'getCoreDevice_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newGetCoreDevice ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  GetCoreDevice
+newGetCoreDevice pCoreDeviceThingName_ =
+  GetCoreDevice'
+    { coreDeviceThingName =
+        pCoreDeviceThingName_
+    }
+
+-- | The name of the core device. This is also the name of the IoT thing.
+getCoreDevice_coreDeviceThingName :: Lens.Lens' GetCoreDevice Prelude.Text
+getCoreDevice_coreDeviceThingName = Lens.lens (\GetCoreDevice' {coreDeviceThingName} -> coreDeviceThingName) (\s@GetCoreDevice' {} a -> s {coreDeviceThingName = a} :: GetCoreDevice)
+
+instance Core.AWSRequest GetCoreDevice where
+  type
+    AWSResponse GetCoreDevice =
+      GetCoreDeviceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetCoreDeviceResponse'
+            Prelude.<$> (x Data..?> "architecture")
+            Prelude.<*> (x Data..?> "coreDeviceThingName")
+            Prelude.<*> (x Data..?> "coreVersion")
+            Prelude.<*> (x Data..?> "lastStatusUpdateTimestamp")
+            Prelude.<*> (x Data..?> "platform")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetCoreDevice where
+  hashWithSalt _salt GetCoreDevice' {..} =
+    _salt `Prelude.hashWithSalt` coreDeviceThingName
+
+instance Prelude.NFData GetCoreDevice where
+  rnf GetCoreDevice' {..} =
+    Prelude.rnf coreDeviceThingName
+
+instance Data.ToHeaders GetCoreDevice where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetCoreDevice where
+  toPath GetCoreDevice' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/coreDevices/",
+        Data.toBS coreDeviceThingName
+      ]
+
+instance Data.ToQuery GetCoreDevice where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetCoreDeviceResponse' smart constructor.
+data GetCoreDeviceResponse = GetCoreDeviceResponse'
+  { -- | The computer architecture of the core device.
+    architecture :: Prelude.Maybe Prelude.Text,
+    -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the IoT Greengrass Core software that the core device
+    -- runs. This version is equivalent to the version of the Greengrass
+    -- nucleus component that runs on the core device. For more information,
+    -- see the
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html Greengrass nucleus component>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    coreVersion :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the core device\'s status last updated, expressed in
+    -- ISO 8601 format.
+    lastStatusUpdateTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The operating system platform that the core device runs.
+    platform :: Prelude.Maybe Prelude.Text,
+    -- | The status of the core device. The core device status can be:
+    --
+    -- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+    --     on the core device without issue.
+    --
+    -- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+    --     a failed state on the core device.
+    status :: Prelude.Maybe CoreDeviceStatus,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    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 'GetCoreDeviceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'architecture', 'getCoreDeviceResponse_architecture' - The computer architecture of the core device.
+--
+-- 'coreDeviceThingName', 'getCoreDeviceResponse_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+--
+-- 'coreVersion', 'getCoreDeviceResponse_coreVersion' - The version of the IoT Greengrass Core software that the core device
+-- runs. This version is equivalent to the version of the Greengrass
+-- nucleus component that runs on the core device. For more information,
+-- see the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html Greengrass nucleus component>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'lastStatusUpdateTimestamp', 'getCoreDeviceResponse_lastStatusUpdateTimestamp' - The time at which the core device\'s status last updated, expressed in
+-- ISO 8601 format.
+--
+-- 'platform', 'getCoreDeviceResponse_platform' - The operating system platform that the core device runs.
+--
+-- 'status', 'getCoreDeviceResponse_status' - The status of the core device. The core device status can be:
+--
+-- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+--     on the core device without issue.
+--
+-- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+--     a failed state on the core device.
+--
+-- 'tags', 'getCoreDeviceResponse_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'httpStatus', 'getCoreDeviceResponse_httpStatus' - The response's http status code.
+newGetCoreDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetCoreDeviceResponse
+newGetCoreDeviceResponse pHttpStatus_ =
+  GetCoreDeviceResponse'
+    { architecture =
+        Prelude.Nothing,
+      coreDeviceThingName = Prelude.Nothing,
+      coreVersion = Prelude.Nothing,
+      lastStatusUpdateTimestamp = Prelude.Nothing,
+      platform = Prelude.Nothing,
+      status = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The computer architecture of the core device.
+getCoreDeviceResponse_architecture :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe Prelude.Text)
+getCoreDeviceResponse_architecture = Lens.lens (\GetCoreDeviceResponse' {architecture} -> architecture) (\s@GetCoreDeviceResponse' {} a -> s {architecture = a} :: GetCoreDeviceResponse)
+
+-- | The name of the core device. This is also the name of the IoT thing.
+getCoreDeviceResponse_coreDeviceThingName :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe Prelude.Text)
+getCoreDeviceResponse_coreDeviceThingName = Lens.lens (\GetCoreDeviceResponse' {coreDeviceThingName} -> coreDeviceThingName) (\s@GetCoreDeviceResponse' {} a -> s {coreDeviceThingName = a} :: GetCoreDeviceResponse)
+
+-- | The version of the IoT Greengrass Core software that the core device
+-- runs. This version is equivalent to the version of the Greengrass
+-- nucleus component that runs on the core device. For more information,
+-- see the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html Greengrass nucleus component>
+-- in the /IoT Greengrass V2 Developer Guide/.
+getCoreDeviceResponse_coreVersion :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe Prelude.Text)
+getCoreDeviceResponse_coreVersion = Lens.lens (\GetCoreDeviceResponse' {coreVersion} -> coreVersion) (\s@GetCoreDeviceResponse' {} a -> s {coreVersion = a} :: GetCoreDeviceResponse)
+
+-- | The time at which the core device\'s status last updated, expressed in
+-- ISO 8601 format.
+getCoreDeviceResponse_lastStatusUpdateTimestamp :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe Prelude.UTCTime)
+getCoreDeviceResponse_lastStatusUpdateTimestamp = Lens.lens (\GetCoreDeviceResponse' {lastStatusUpdateTimestamp} -> lastStatusUpdateTimestamp) (\s@GetCoreDeviceResponse' {} a -> s {lastStatusUpdateTimestamp = a} :: GetCoreDeviceResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The operating system platform that the core device runs.
+getCoreDeviceResponse_platform :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe Prelude.Text)
+getCoreDeviceResponse_platform = Lens.lens (\GetCoreDeviceResponse' {platform} -> platform) (\s@GetCoreDeviceResponse' {} a -> s {platform = a} :: GetCoreDeviceResponse)
+
+-- | The status of the core device. The core device status can be:
+--
+-- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+--     on the core device without issue.
+--
+-- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+--     a failed state on the core device.
+getCoreDeviceResponse_status :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe CoreDeviceStatus)
+getCoreDeviceResponse_status = Lens.lens (\GetCoreDeviceResponse' {status} -> status) (\s@GetCoreDeviceResponse' {} a -> s {status = a} :: GetCoreDeviceResponse)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+getCoreDeviceResponse_tags :: Lens.Lens' GetCoreDeviceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getCoreDeviceResponse_tags = Lens.lens (\GetCoreDeviceResponse' {tags} -> tags) (\s@GetCoreDeviceResponse' {} a -> s {tags = a} :: GetCoreDeviceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getCoreDeviceResponse_httpStatus :: Lens.Lens' GetCoreDeviceResponse Prelude.Int
+getCoreDeviceResponse_httpStatus = Lens.lens (\GetCoreDeviceResponse' {httpStatus} -> httpStatus) (\s@GetCoreDeviceResponse' {} a -> s {httpStatus = a} :: GetCoreDeviceResponse)
+
+instance Prelude.NFData GetCoreDeviceResponse where
+  rnf GetCoreDeviceResponse' {..} =
+    Prelude.rnf architecture
+      `Prelude.seq` Prelude.rnf coreDeviceThingName
+      `Prelude.seq` Prelude.rnf coreVersion
+      `Prelude.seq` Prelude.rnf lastStatusUpdateTimestamp
+      `Prelude.seq` Prelude.rnf platform
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/GetDeployment.hs b/gen/Amazonka/GreengrassV2/GetDeployment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/GetDeployment.hs
@@ -0,0 +1,355 @@
+{-# 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.GreengrassV2.GetDeployment
+-- 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 a deployment. Deployments define the components that run on
+-- Greengrass core devices.
+module Amazonka.GreengrassV2.GetDeployment
+  ( -- * Creating a Request
+    GetDeployment (..),
+    newGetDeployment,
+
+    -- * Request Lenses
+    getDeployment_deploymentId,
+
+    -- * Destructuring the Response
+    GetDeploymentResponse (..),
+    newGetDeploymentResponse,
+
+    -- * Response Lenses
+    getDeploymentResponse_components,
+    getDeploymentResponse_creationTimestamp,
+    getDeploymentResponse_deploymentId,
+    getDeploymentResponse_deploymentName,
+    getDeploymentResponse_deploymentPolicies,
+    getDeploymentResponse_deploymentStatus,
+    getDeploymentResponse_iotJobArn,
+    getDeploymentResponse_iotJobConfiguration,
+    getDeploymentResponse_iotJobId,
+    getDeploymentResponse_isLatestForTarget,
+    getDeploymentResponse_parentTargetArn,
+    getDeploymentResponse_revisionId,
+    getDeploymentResponse_tags,
+    getDeploymentResponse_targetArn,
+    getDeploymentResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetDeployment' smart constructor.
+data GetDeployment = GetDeployment'
+  { -- | The ID of the deployment.
+    deploymentId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDeployment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deploymentId', 'getDeployment_deploymentId' - The ID of the deployment.
+newGetDeployment ::
+  -- | 'deploymentId'
+  Prelude.Text ->
+  GetDeployment
+newGetDeployment pDeploymentId_ =
+  GetDeployment' {deploymentId = pDeploymentId_}
+
+-- | The ID of the deployment.
+getDeployment_deploymentId :: Lens.Lens' GetDeployment Prelude.Text
+getDeployment_deploymentId = Lens.lens (\GetDeployment' {deploymentId} -> deploymentId) (\s@GetDeployment' {} a -> s {deploymentId = a} :: GetDeployment)
+
+instance Core.AWSRequest GetDeployment where
+  type
+    AWSResponse GetDeployment =
+      GetDeploymentResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDeploymentResponse'
+            Prelude.<$> (x Data..?> "components" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "creationTimestamp")
+            Prelude.<*> (x Data..?> "deploymentId")
+            Prelude.<*> (x Data..?> "deploymentName")
+            Prelude.<*> (x Data..?> "deploymentPolicies")
+            Prelude.<*> (x Data..?> "deploymentStatus")
+            Prelude.<*> (x Data..?> "iotJobArn")
+            Prelude.<*> (x Data..?> "iotJobConfiguration")
+            Prelude.<*> (x Data..?> "iotJobId")
+            Prelude.<*> (x Data..?> "isLatestForTarget")
+            Prelude.<*> (x Data..?> "parentTargetArn")
+            Prelude.<*> (x Data..?> "revisionId")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "targetArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDeployment where
+  hashWithSalt _salt GetDeployment' {..} =
+    _salt `Prelude.hashWithSalt` deploymentId
+
+instance Prelude.NFData GetDeployment where
+  rnf GetDeployment' {..} = Prelude.rnf deploymentId
+
+instance Data.ToHeaders GetDeployment where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetDeployment where
+  toPath GetDeployment' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/deployments/",
+        Data.toBS deploymentId
+      ]
+
+instance Data.ToQuery GetDeployment where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetDeploymentResponse' smart constructor.
+data GetDeploymentResponse = GetDeploymentResponse'
+  { -- | The components to deploy. This is a dictionary, where each key is the
+    -- name of a component, and each key\'s value is the version and
+    -- configuration to deploy for that component.
+    components :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentDeploymentSpecification),
+    -- | The time at which the deployment was created, expressed in ISO 8601
+    -- format.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the deployment.
+    deploymentId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the deployment.
+    deploymentName :: Prelude.Maybe Prelude.Text,
+    -- | The deployment policies for the deployment. These policies define how
+    -- the deployment updates components and handles failure.
+    deploymentPolicies :: Prelude.Maybe DeploymentPolicies,
+    -- | The status of the deployment.
+    deploymentStatus :: Prelude.Maybe DeploymentStatus,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IoT job that applies the deployment to target devices.
+    iotJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The job configuration for the deployment configuration. The job
+    -- configuration specifies the rollout, timeout, and stop configurations
+    -- for the deployment configuration.
+    iotJobConfiguration :: Prelude.Maybe DeploymentIoTJobConfiguration,
+    -- | The ID of the IoT job that applies the deployment to target devices.
+    iotJobId :: Prelude.Maybe Prelude.Text,
+    -- | Whether or not the deployment is the latest revision for its target.
+    isLatestForTarget :: Prelude.Maybe Prelude.Bool,
+    -- | The parent deployment\'s target
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- within a subdeployment.
+    parentTargetArn :: Prelude.Maybe Prelude.Text,
+    -- | The revision number of the deployment.
+    revisionId :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the target IoT thing or thing group.
+    targetArn :: 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 'GetDeploymentResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'components', 'getDeploymentResponse_components' - The components to deploy. This is a dictionary, where each key is the
+-- name of a component, and each key\'s value is the version and
+-- configuration to deploy for that component.
+--
+-- 'creationTimestamp', 'getDeploymentResponse_creationTimestamp' - The time at which the deployment was created, expressed in ISO 8601
+-- format.
+--
+-- 'deploymentId', 'getDeploymentResponse_deploymentId' - The ID of the deployment.
+--
+-- 'deploymentName', 'getDeploymentResponse_deploymentName' - The name of the deployment.
+--
+-- 'deploymentPolicies', 'getDeploymentResponse_deploymentPolicies' - The deployment policies for the deployment. These policies define how
+-- the deployment updates components and handles failure.
+--
+-- 'deploymentStatus', 'getDeploymentResponse_deploymentStatus' - The status of the deployment.
+--
+-- 'iotJobArn', 'getDeploymentResponse_iotJobArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT job that applies the deployment to target devices.
+--
+-- 'iotJobConfiguration', 'getDeploymentResponse_iotJobConfiguration' - The job configuration for the deployment configuration. The job
+-- configuration specifies the rollout, timeout, and stop configurations
+-- for the deployment configuration.
+--
+-- 'iotJobId', 'getDeploymentResponse_iotJobId' - The ID of the IoT job that applies the deployment to target devices.
+--
+-- 'isLatestForTarget', 'getDeploymentResponse_isLatestForTarget' - Whether or not the deployment is the latest revision for its target.
+--
+-- 'parentTargetArn', 'getDeploymentResponse_parentTargetArn' - The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+--
+-- 'revisionId', 'getDeploymentResponse_revisionId' - The revision number of the deployment.
+--
+-- 'tags', 'getDeploymentResponse_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'targetArn', 'getDeploymentResponse_targetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group.
+--
+-- 'httpStatus', 'getDeploymentResponse_httpStatus' - The response's http status code.
+newGetDeploymentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDeploymentResponse
+newGetDeploymentResponse pHttpStatus_ =
+  GetDeploymentResponse'
+    { components =
+        Prelude.Nothing,
+      creationTimestamp = Prelude.Nothing,
+      deploymentId = Prelude.Nothing,
+      deploymentName = Prelude.Nothing,
+      deploymentPolicies = Prelude.Nothing,
+      deploymentStatus = Prelude.Nothing,
+      iotJobArn = Prelude.Nothing,
+      iotJobConfiguration = Prelude.Nothing,
+      iotJobId = Prelude.Nothing,
+      isLatestForTarget = Prelude.Nothing,
+      parentTargetArn = Prelude.Nothing,
+      revisionId = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      targetArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The components to deploy. This is a dictionary, where each key is the
+-- name of a component, and each key\'s value is the version and
+-- configuration to deploy for that component.
+getDeploymentResponse_components :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentDeploymentSpecification))
+getDeploymentResponse_components = Lens.lens (\GetDeploymentResponse' {components} -> components) (\s@GetDeploymentResponse' {} a -> s {components = a} :: GetDeploymentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time at which the deployment was created, expressed in ISO 8601
+-- format.
+getDeploymentResponse_creationTimestamp :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.UTCTime)
+getDeploymentResponse_creationTimestamp = Lens.lens (\GetDeploymentResponse' {creationTimestamp} -> creationTimestamp) (\s@GetDeploymentResponse' {} a -> s {creationTimestamp = a} :: GetDeploymentResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the deployment.
+getDeploymentResponse_deploymentId :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_deploymentId = Lens.lens (\GetDeploymentResponse' {deploymentId} -> deploymentId) (\s@GetDeploymentResponse' {} a -> s {deploymentId = a} :: GetDeploymentResponse)
+
+-- | The name of the deployment.
+getDeploymentResponse_deploymentName :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_deploymentName = Lens.lens (\GetDeploymentResponse' {deploymentName} -> deploymentName) (\s@GetDeploymentResponse' {} a -> s {deploymentName = a} :: GetDeploymentResponse)
+
+-- | The deployment policies for the deployment. These policies define how
+-- the deployment updates components and handles failure.
+getDeploymentResponse_deploymentPolicies :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe DeploymentPolicies)
+getDeploymentResponse_deploymentPolicies = Lens.lens (\GetDeploymentResponse' {deploymentPolicies} -> deploymentPolicies) (\s@GetDeploymentResponse' {} a -> s {deploymentPolicies = a} :: GetDeploymentResponse)
+
+-- | The status of the deployment.
+getDeploymentResponse_deploymentStatus :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe DeploymentStatus)
+getDeploymentResponse_deploymentStatus = Lens.lens (\GetDeploymentResponse' {deploymentStatus} -> deploymentStatus) (\s@GetDeploymentResponse' {} a -> s {deploymentStatus = a} :: GetDeploymentResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT job that applies the deployment to target devices.
+getDeploymentResponse_iotJobArn :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_iotJobArn = Lens.lens (\GetDeploymentResponse' {iotJobArn} -> iotJobArn) (\s@GetDeploymentResponse' {} a -> s {iotJobArn = a} :: GetDeploymentResponse)
+
+-- | The job configuration for the deployment configuration. The job
+-- configuration specifies the rollout, timeout, and stop configurations
+-- for the deployment configuration.
+getDeploymentResponse_iotJobConfiguration :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe DeploymentIoTJobConfiguration)
+getDeploymentResponse_iotJobConfiguration = Lens.lens (\GetDeploymentResponse' {iotJobConfiguration} -> iotJobConfiguration) (\s@GetDeploymentResponse' {} a -> s {iotJobConfiguration = a} :: GetDeploymentResponse)
+
+-- | The ID of the IoT job that applies the deployment to target devices.
+getDeploymentResponse_iotJobId :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_iotJobId = Lens.lens (\GetDeploymentResponse' {iotJobId} -> iotJobId) (\s@GetDeploymentResponse' {} a -> s {iotJobId = a} :: GetDeploymentResponse)
+
+-- | Whether or not the deployment is the latest revision for its target.
+getDeploymentResponse_isLatestForTarget :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Bool)
+getDeploymentResponse_isLatestForTarget = Lens.lens (\GetDeploymentResponse' {isLatestForTarget} -> isLatestForTarget) (\s@GetDeploymentResponse' {} a -> s {isLatestForTarget = a} :: GetDeploymentResponse)
+
+-- | The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+getDeploymentResponse_parentTargetArn :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_parentTargetArn = Lens.lens (\GetDeploymentResponse' {parentTargetArn} -> parentTargetArn) (\s@GetDeploymentResponse' {} a -> s {parentTargetArn = a} :: GetDeploymentResponse)
+
+-- | The revision number of the deployment.
+getDeploymentResponse_revisionId :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_revisionId = Lens.lens (\GetDeploymentResponse' {revisionId} -> revisionId) (\s@GetDeploymentResponse' {} a -> s {revisionId = a} :: GetDeploymentResponse)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+getDeploymentResponse_tags :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getDeploymentResponse_tags = Lens.lens (\GetDeploymentResponse' {tags} -> tags) (\s@GetDeploymentResponse' {} a -> s {tags = a} :: GetDeploymentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group.
+getDeploymentResponse_targetArn :: Lens.Lens' GetDeploymentResponse (Prelude.Maybe Prelude.Text)
+getDeploymentResponse_targetArn = Lens.lens (\GetDeploymentResponse' {targetArn} -> targetArn) (\s@GetDeploymentResponse' {} a -> s {targetArn = a} :: GetDeploymentResponse)
+
+-- | The response's http status code.
+getDeploymentResponse_httpStatus :: Lens.Lens' GetDeploymentResponse Prelude.Int
+getDeploymentResponse_httpStatus = Lens.lens (\GetDeploymentResponse' {httpStatus} -> httpStatus) (\s@GetDeploymentResponse' {} a -> s {httpStatus = a} :: GetDeploymentResponse)
+
+instance Prelude.NFData GetDeploymentResponse where
+  rnf GetDeploymentResponse' {..} =
+    Prelude.rnf components
+      `Prelude.seq` Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf deploymentId
+      `Prelude.seq` Prelude.rnf deploymentName
+      `Prelude.seq` Prelude.rnf deploymentPolicies
+      `Prelude.seq` Prelude.rnf deploymentStatus
+      `Prelude.seq` Prelude.rnf iotJobArn
+      `Prelude.seq` Prelude.rnf iotJobConfiguration
+      `Prelude.seq` Prelude.rnf iotJobId
+      `Prelude.seq` Prelude.rnf isLatestForTarget
+      `Prelude.seq` Prelude.rnf parentTargetArn
+      `Prelude.seq` Prelude.rnf revisionId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targetArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/GetServiceRoleForAccount.hs b/gen/Amazonka/GreengrassV2/GetServiceRoleForAccount.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/GetServiceRoleForAccount.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.GreengrassV2.GetServiceRoleForAccount
+-- 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 service role associated with IoT Greengrass for your Amazon Web
+-- Services account in this Amazon Web Services Region. IoT Greengrass uses
+-- this role to verify the identity of client devices and manage core
+-- device connectivity information. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-service-role.html Greengrass service role>
+-- in the /IoT Greengrass Version 2 Developer Guide/.
+module Amazonka.GreengrassV2.GetServiceRoleForAccount
+  ( -- * Creating a Request
+    GetServiceRoleForAccount (..),
+    newGetServiceRoleForAccount,
+
+    -- * Destructuring the Response
+    GetServiceRoleForAccountResponse (..),
+    newGetServiceRoleForAccountResponse,
+
+    -- * Response Lenses
+    getServiceRoleForAccountResponse_associatedAt,
+    getServiceRoleForAccountResponse_roleArn,
+    getServiceRoleForAccountResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetServiceRoleForAccount' smart constructor.
+data GetServiceRoleForAccount = GetServiceRoleForAccount'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetServiceRoleForAccount' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newGetServiceRoleForAccount ::
+  GetServiceRoleForAccount
+newGetServiceRoleForAccount =
+  GetServiceRoleForAccount'
+
+instance Core.AWSRequest GetServiceRoleForAccount where
+  type
+    AWSResponse GetServiceRoleForAccount =
+      GetServiceRoleForAccountResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetServiceRoleForAccountResponse'
+            Prelude.<$> (x Data..?> "AssociatedAt")
+            Prelude.<*> (x Data..?> "RoleArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetServiceRoleForAccount where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData GetServiceRoleForAccount where
+  rnf _ = ()
+
+instance Data.ToHeaders GetServiceRoleForAccount where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetServiceRoleForAccount where
+  toPath = Prelude.const "/greengrass/servicerole"
+
+instance Data.ToQuery GetServiceRoleForAccount where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetServiceRoleForAccountResponse' smart constructor.
+data GetServiceRoleForAccountResponse = GetServiceRoleForAccountResponse'
+  { -- | The time when the service role was associated with IoT Greengrass for
+    -- your Amazon Web Services account in this Amazon Web Services Region.
+    associatedAt :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the service role that is associated with IoT Greengrass for
+    -- your Amazon Web Services account in this Amazon Web Services Region.
+    roleArn :: 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 'GetServiceRoleForAccountResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'associatedAt', 'getServiceRoleForAccountResponse_associatedAt' - The time when the service role was associated with IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+--
+-- 'roleArn', 'getServiceRoleForAccountResponse_roleArn' - The ARN of the service role that is associated with IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+--
+-- 'httpStatus', 'getServiceRoleForAccountResponse_httpStatus' - The response's http status code.
+newGetServiceRoleForAccountResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetServiceRoleForAccountResponse
+newGetServiceRoleForAccountResponse pHttpStatus_ =
+  GetServiceRoleForAccountResponse'
+    { associatedAt =
+        Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time when the service role was associated with IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+getServiceRoleForAccountResponse_associatedAt :: Lens.Lens' GetServiceRoleForAccountResponse (Prelude.Maybe Prelude.Text)
+getServiceRoleForAccountResponse_associatedAt = Lens.lens (\GetServiceRoleForAccountResponse' {associatedAt} -> associatedAt) (\s@GetServiceRoleForAccountResponse' {} a -> s {associatedAt = a} :: GetServiceRoleForAccountResponse)
+
+-- | The ARN of the service role that is associated with IoT Greengrass for
+-- your Amazon Web Services account in this Amazon Web Services Region.
+getServiceRoleForAccountResponse_roleArn :: Lens.Lens' GetServiceRoleForAccountResponse (Prelude.Maybe Prelude.Text)
+getServiceRoleForAccountResponse_roleArn = Lens.lens (\GetServiceRoleForAccountResponse' {roleArn} -> roleArn) (\s@GetServiceRoleForAccountResponse' {} a -> s {roleArn = a} :: GetServiceRoleForAccountResponse)
+
+-- | The response's http status code.
+getServiceRoleForAccountResponse_httpStatus :: Lens.Lens' GetServiceRoleForAccountResponse Prelude.Int
+getServiceRoleForAccountResponse_httpStatus = Lens.lens (\GetServiceRoleForAccountResponse' {httpStatus} -> httpStatus) (\s@GetServiceRoleForAccountResponse' {} a -> s {httpStatus = a} :: GetServiceRoleForAccountResponse)
+
+instance
+  Prelude.NFData
+    GetServiceRoleForAccountResponse
+  where
+  rnf GetServiceRoleForAccountResponse' {..} =
+    Prelude.rnf associatedAt
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/Lens.hs b/gen/Amazonka/GreengrassV2/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Lens.hs
@@ -0,0 +1,526 @@
+{-# 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.GreengrassV2.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.GreengrassV2.Lens
+  ( -- * Operations
+
+    -- ** AssociateServiceRoleToAccount
+    associateServiceRoleToAccount_roleArn,
+    associateServiceRoleToAccountResponse_associatedAt,
+    associateServiceRoleToAccountResponse_httpStatus,
+
+    -- ** BatchAssociateClientDeviceWithCoreDevice
+    batchAssociateClientDeviceWithCoreDevice_entries,
+    batchAssociateClientDeviceWithCoreDevice_coreDeviceThingName,
+    batchAssociateClientDeviceWithCoreDeviceResponse_errorEntries,
+    batchAssociateClientDeviceWithCoreDeviceResponse_httpStatus,
+
+    -- ** BatchDisassociateClientDeviceFromCoreDevice
+    batchDisassociateClientDeviceFromCoreDevice_entries,
+    batchDisassociateClientDeviceFromCoreDevice_coreDeviceThingName,
+    batchDisassociateClientDeviceFromCoreDeviceResponse_errorEntries,
+    batchDisassociateClientDeviceFromCoreDeviceResponse_httpStatus,
+
+    -- ** CancelDeployment
+    cancelDeployment_deploymentId,
+    cancelDeploymentResponse_message,
+    cancelDeploymentResponse_httpStatus,
+
+    -- ** CreateComponentVersion
+    createComponentVersion_clientToken,
+    createComponentVersion_inlineRecipe,
+    createComponentVersion_lambdaFunction,
+    createComponentVersion_tags,
+    createComponentVersionResponse_arn,
+    createComponentVersionResponse_httpStatus,
+    createComponentVersionResponse_componentName,
+    createComponentVersionResponse_componentVersion,
+    createComponentVersionResponse_creationTimestamp,
+    createComponentVersionResponse_status,
+
+    -- ** CreateDeployment
+    createDeployment_clientToken,
+    createDeployment_components,
+    createDeployment_deploymentName,
+    createDeployment_deploymentPolicies,
+    createDeployment_iotJobConfiguration,
+    createDeployment_parentTargetArn,
+    createDeployment_tags,
+    createDeployment_targetArn,
+    createDeploymentResponse_deploymentId,
+    createDeploymentResponse_iotJobArn,
+    createDeploymentResponse_iotJobId,
+    createDeploymentResponse_httpStatus,
+
+    -- ** DeleteComponent
+    deleteComponent_arn,
+
+    -- ** DeleteCoreDevice
+    deleteCoreDevice_coreDeviceThingName,
+
+    -- ** DeleteDeployment
+    deleteDeployment_deploymentId,
+
+    -- ** DescribeComponent
+    describeComponent_arn,
+    describeComponentResponse_arn,
+    describeComponentResponse_componentName,
+    describeComponentResponse_componentVersion,
+    describeComponentResponse_creationTimestamp,
+    describeComponentResponse_description,
+    describeComponentResponse_platforms,
+    describeComponentResponse_publisher,
+    describeComponentResponse_status,
+    describeComponentResponse_tags,
+    describeComponentResponse_httpStatus,
+
+    -- ** DisassociateServiceRoleFromAccount
+    disassociateServiceRoleFromAccountResponse_disassociatedAt,
+    disassociateServiceRoleFromAccountResponse_httpStatus,
+
+    -- ** GetComponent
+    getComponent_recipeOutputFormat,
+    getComponent_arn,
+    getComponentResponse_tags,
+    getComponentResponse_httpStatus,
+    getComponentResponse_recipeOutputFormat,
+    getComponentResponse_recipe,
+
+    -- ** GetComponentVersionArtifact
+    getComponentVersionArtifact_arn,
+    getComponentVersionArtifact_artifactName,
+    getComponentVersionArtifactResponse_httpStatus,
+    getComponentVersionArtifactResponse_preSignedUrl,
+
+    -- ** GetConnectivityInfo
+    getConnectivityInfo_thingName,
+    getConnectivityInfoResponse_connectivityInfo,
+    getConnectivityInfoResponse_message,
+    getConnectivityInfoResponse_httpStatus,
+
+    -- ** GetCoreDevice
+    getCoreDevice_coreDeviceThingName,
+    getCoreDeviceResponse_architecture,
+    getCoreDeviceResponse_coreDeviceThingName,
+    getCoreDeviceResponse_coreVersion,
+    getCoreDeviceResponse_lastStatusUpdateTimestamp,
+    getCoreDeviceResponse_platform,
+    getCoreDeviceResponse_status,
+    getCoreDeviceResponse_tags,
+    getCoreDeviceResponse_httpStatus,
+
+    -- ** GetDeployment
+    getDeployment_deploymentId,
+    getDeploymentResponse_components,
+    getDeploymentResponse_creationTimestamp,
+    getDeploymentResponse_deploymentId,
+    getDeploymentResponse_deploymentName,
+    getDeploymentResponse_deploymentPolicies,
+    getDeploymentResponse_deploymentStatus,
+    getDeploymentResponse_iotJobArn,
+    getDeploymentResponse_iotJobConfiguration,
+    getDeploymentResponse_iotJobId,
+    getDeploymentResponse_isLatestForTarget,
+    getDeploymentResponse_parentTargetArn,
+    getDeploymentResponse_revisionId,
+    getDeploymentResponse_tags,
+    getDeploymentResponse_targetArn,
+    getDeploymentResponse_httpStatus,
+
+    -- ** GetServiceRoleForAccount
+    getServiceRoleForAccountResponse_associatedAt,
+    getServiceRoleForAccountResponse_roleArn,
+    getServiceRoleForAccountResponse_httpStatus,
+
+    -- ** ListClientDevicesAssociatedWithCoreDevice
+    listClientDevicesAssociatedWithCoreDevice_maxResults,
+    listClientDevicesAssociatedWithCoreDevice_nextToken,
+    listClientDevicesAssociatedWithCoreDevice_coreDeviceThingName,
+    listClientDevicesAssociatedWithCoreDeviceResponse_associatedClientDevices,
+    listClientDevicesAssociatedWithCoreDeviceResponse_nextToken,
+    listClientDevicesAssociatedWithCoreDeviceResponse_httpStatus,
+
+    -- ** ListComponentVersions
+    listComponentVersions_maxResults,
+    listComponentVersions_nextToken,
+    listComponentVersions_arn,
+    listComponentVersionsResponse_componentVersions,
+    listComponentVersionsResponse_nextToken,
+    listComponentVersionsResponse_httpStatus,
+
+    -- ** ListComponents
+    listComponents_maxResults,
+    listComponents_nextToken,
+    listComponents_scope,
+    listComponentsResponse_components,
+    listComponentsResponse_nextToken,
+    listComponentsResponse_httpStatus,
+
+    -- ** ListCoreDevices
+    listCoreDevices_maxResults,
+    listCoreDevices_nextToken,
+    listCoreDevices_status,
+    listCoreDevices_thingGroupArn,
+    listCoreDevicesResponse_coreDevices,
+    listCoreDevicesResponse_nextToken,
+    listCoreDevicesResponse_httpStatus,
+
+    -- ** ListDeployments
+    listDeployments_historyFilter,
+    listDeployments_maxResults,
+    listDeployments_nextToken,
+    listDeployments_parentTargetArn,
+    listDeployments_targetArn,
+    listDeploymentsResponse_deployments,
+    listDeploymentsResponse_nextToken,
+    listDeploymentsResponse_httpStatus,
+
+    -- ** ListEffectiveDeployments
+    listEffectiveDeployments_maxResults,
+    listEffectiveDeployments_nextToken,
+    listEffectiveDeployments_coreDeviceThingName,
+    listEffectiveDeploymentsResponse_effectiveDeployments,
+    listEffectiveDeploymentsResponse_nextToken,
+    listEffectiveDeploymentsResponse_httpStatus,
+
+    -- ** ListInstalledComponents
+    listInstalledComponents_maxResults,
+    listInstalledComponents_nextToken,
+    listInstalledComponents_topologyFilter,
+    listInstalledComponents_coreDeviceThingName,
+    listInstalledComponentsResponse_installedComponents,
+    listInstalledComponentsResponse_nextToken,
+    listInstalledComponentsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ResolveComponentCandidates
+    resolveComponentCandidates_componentCandidates,
+    resolveComponentCandidates_platform,
+    resolveComponentCandidatesResponse_resolvedComponentVersions,
+    resolveComponentCandidatesResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateConnectivityInfo
+    updateConnectivityInfo_thingName,
+    updateConnectivityInfo_connectivityInfo,
+    updateConnectivityInfoResponse_message,
+    updateConnectivityInfoResponse_version,
+    updateConnectivityInfoResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AssociateClientDeviceWithCoreDeviceEntry
+    associateClientDeviceWithCoreDeviceEntry_thingName,
+
+    -- ** AssociateClientDeviceWithCoreDeviceErrorEntry
+    associateClientDeviceWithCoreDeviceErrorEntry_code,
+    associateClientDeviceWithCoreDeviceErrorEntry_message,
+    associateClientDeviceWithCoreDeviceErrorEntry_thingName,
+
+    -- ** AssociatedClientDevice
+    associatedClientDevice_associationTimestamp,
+    associatedClientDevice_thingName,
+
+    -- ** CloudComponentStatus
+    cloudComponentStatus_componentState,
+    cloudComponentStatus_errors,
+    cloudComponentStatus_message,
+    cloudComponentStatus_vendorGuidance,
+    cloudComponentStatus_vendorGuidanceMessage,
+
+    -- ** Component
+    component_arn,
+    component_componentName,
+    component_latestVersion,
+
+    -- ** ComponentCandidate
+    componentCandidate_componentName,
+    componentCandidate_componentVersion,
+    componentCandidate_versionRequirements,
+
+    -- ** ComponentConfigurationUpdate
+    componentConfigurationUpdate_merge,
+    componentConfigurationUpdate_reset,
+
+    -- ** ComponentDependencyRequirement
+    componentDependencyRequirement_dependencyType,
+    componentDependencyRequirement_versionRequirement,
+
+    -- ** ComponentDeploymentSpecification
+    componentDeploymentSpecification_componentVersion,
+    componentDeploymentSpecification_configurationUpdate,
+    componentDeploymentSpecification_runWith,
+
+    -- ** ComponentLatestVersion
+    componentLatestVersion_arn,
+    componentLatestVersion_componentVersion,
+    componentLatestVersion_creationTimestamp,
+    componentLatestVersion_description,
+    componentLatestVersion_platforms,
+    componentLatestVersion_publisher,
+
+    -- ** ComponentPlatform
+    componentPlatform_attributes,
+    componentPlatform_name,
+
+    -- ** ComponentRunWith
+    componentRunWith_posixUser,
+    componentRunWith_systemResourceLimits,
+    componentRunWith_windowsUser,
+
+    -- ** ComponentVersionListItem
+    componentVersionListItem_arn,
+    componentVersionListItem_componentName,
+    componentVersionListItem_componentVersion,
+
+    -- ** ConnectivityInfo
+    connectivityInfo_hostAddress,
+    connectivityInfo_id,
+    connectivityInfo_metadata,
+    connectivityInfo_portNumber,
+
+    -- ** CoreDevice
+    coreDevice_coreDeviceThingName,
+    coreDevice_lastStatusUpdateTimestamp,
+    coreDevice_status,
+
+    -- ** Deployment
+    deployment_creationTimestamp,
+    deployment_deploymentId,
+    deployment_deploymentName,
+    deployment_deploymentStatus,
+    deployment_isLatestForTarget,
+    deployment_parentTargetArn,
+    deployment_revisionId,
+    deployment_targetArn,
+
+    -- ** DeploymentComponentUpdatePolicy
+    deploymentComponentUpdatePolicy_action,
+    deploymentComponentUpdatePolicy_timeoutInSeconds,
+
+    -- ** DeploymentConfigurationValidationPolicy
+    deploymentConfigurationValidationPolicy_timeoutInSeconds,
+
+    -- ** DeploymentIoTJobConfiguration
+    deploymentIoTJobConfiguration_abortConfig,
+    deploymentIoTJobConfiguration_jobExecutionsRolloutConfig,
+    deploymentIoTJobConfiguration_timeoutConfig,
+
+    -- ** DeploymentPolicies
+    deploymentPolicies_componentUpdatePolicy,
+    deploymentPolicies_configurationValidationPolicy,
+    deploymentPolicies_failureHandlingPolicy,
+
+    -- ** DisassociateClientDeviceFromCoreDeviceEntry
+    disassociateClientDeviceFromCoreDeviceEntry_thingName,
+
+    -- ** DisassociateClientDeviceFromCoreDeviceErrorEntry
+    disassociateClientDeviceFromCoreDeviceErrorEntry_code,
+    disassociateClientDeviceFromCoreDeviceErrorEntry_message,
+    disassociateClientDeviceFromCoreDeviceErrorEntry_thingName,
+
+    -- ** EffectiveDeployment
+    effectiveDeployment_description,
+    effectiveDeployment_iotJobArn,
+    effectiveDeployment_iotJobId,
+    effectiveDeployment_reason,
+    effectiveDeployment_statusDetails,
+    effectiveDeployment_deploymentId,
+    effectiveDeployment_deploymentName,
+    effectiveDeployment_targetArn,
+    effectiveDeployment_coreDeviceExecutionStatus,
+    effectiveDeployment_creationTimestamp,
+    effectiveDeployment_modifiedTimestamp,
+
+    -- ** EffectiveDeploymentStatusDetails
+    effectiveDeploymentStatusDetails_errorStack,
+    effectiveDeploymentStatusDetails_errorTypes,
+
+    -- ** InstalledComponent
+    installedComponent_componentName,
+    installedComponent_componentVersion,
+    installedComponent_isRoot,
+    installedComponent_lastInstallationSource,
+    installedComponent_lastReportedTimestamp,
+    installedComponent_lastStatusChangeTimestamp,
+    installedComponent_lifecycleState,
+    installedComponent_lifecycleStateDetails,
+    installedComponent_lifecycleStatusCodes,
+
+    -- ** IoTJobAbortConfig
+    ioTJobAbortConfig_criteriaList,
+
+    -- ** IoTJobAbortCriteria
+    ioTJobAbortCriteria_failureType,
+    ioTJobAbortCriteria_action,
+    ioTJobAbortCriteria_thresholdPercentage,
+    ioTJobAbortCriteria_minNumberOfExecutedThings,
+
+    -- ** IoTJobExecutionsRolloutConfig
+    ioTJobExecutionsRolloutConfig_exponentialRate,
+    ioTJobExecutionsRolloutConfig_maximumPerMinute,
+
+    -- ** IoTJobExponentialRolloutRate
+    ioTJobExponentialRolloutRate_baseRatePerMinute,
+    ioTJobExponentialRolloutRate_incrementFactor,
+    ioTJobExponentialRolloutRate_rateIncreaseCriteria,
+
+    -- ** IoTJobRateIncreaseCriteria
+    ioTJobRateIncreaseCriteria_numberOfNotifiedThings,
+    ioTJobRateIncreaseCriteria_numberOfSucceededThings,
+
+    -- ** IoTJobTimeoutConfig
+    ioTJobTimeoutConfig_inProgressTimeoutInMinutes,
+
+    -- ** LambdaContainerParams
+    lambdaContainerParams_devices,
+    lambdaContainerParams_memorySizeInKB,
+    lambdaContainerParams_mountROSysfs,
+    lambdaContainerParams_volumes,
+
+    -- ** LambdaDeviceMount
+    lambdaDeviceMount_addGroupOwner,
+    lambdaDeviceMount_permission,
+    lambdaDeviceMount_path,
+
+    -- ** LambdaEventSource
+    lambdaEventSource_topic,
+    lambdaEventSource_type,
+
+    -- ** LambdaExecutionParameters
+    lambdaExecutionParameters_environmentVariables,
+    lambdaExecutionParameters_eventSources,
+    lambdaExecutionParameters_execArgs,
+    lambdaExecutionParameters_inputPayloadEncodingType,
+    lambdaExecutionParameters_linuxProcessParams,
+    lambdaExecutionParameters_maxIdleTimeInSeconds,
+    lambdaExecutionParameters_maxInstancesCount,
+    lambdaExecutionParameters_maxQueueSize,
+    lambdaExecutionParameters_pinned,
+    lambdaExecutionParameters_statusTimeoutInSeconds,
+    lambdaExecutionParameters_timeoutInSeconds,
+
+    -- ** LambdaFunctionRecipeSource
+    lambdaFunctionRecipeSource_componentDependencies,
+    lambdaFunctionRecipeSource_componentLambdaParameters,
+    lambdaFunctionRecipeSource_componentName,
+    lambdaFunctionRecipeSource_componentPlatforms,
+    lambdaFunctionRecipeSource_componentVersion,
+    lambdaFunctionRecipeSource_lambdaArn,
+
+    -- ** LambdaLinuxProcessParams
+    lambdaLinuxProcessParams_containerParams,
+    lambdaLinuxProcessParams_isolationMode,
+
+    -- ** LambdaVolumeMount
+    lambdaVolumeMount_addGroupOwner,
+    lambdaVolumeMount_permission,
+    lambdaVolumeMount_sourcePath,
+    lambdaVolumeMount_destinationPath,
+
+    -- ** ResolvedComponentVersion
+    resolvedComponentVersion_arn,
+    resolvedComponentVersion_componentName,
+    resolvedComponentVersion_componentVersion,
+    resolvedComponentVersion_message,
+    resolvedComponentVersion_recipe,
+    resolvedComponentVersion_vendorGuidance,
+
+    -- ** SystemResourceLimits
+    systemResourceLimits_cpus,
+    systemResourceLimits_memory,
+  )
+where
+
+import Amazonka.GreengrassV2.AssociateServiceRoleToAccount
+import Amazonka.GreengrassV2.BatchAssociateClientDeviceWithCoreDevice
+import Amazonka.GreengrassV2.BatchDisassociateClientDeviceFromCoreDevice
+import Amazonka.GreengrassV2.CancelDeployment
+import Amazonka.GreengrassV2.CreateComponentVersion
+import Amazonka.GreengrassV2.CreateDeployment
+import Amazonka.GreengrassV2.DeleteComponent
+import Amazonka.GreengrassV2.DeleteCoreDevice
+import Amazonka.GreengrassV2.DeleteDeployment
+import Amazonka.GreengrassV2.DescribeComponent
+import Amazonka.GreengrassV2.DisassociateServiceRoleFromAccount
+import Amazonka.GreengrassV2.GetComponent
+import Amazonka.GreengrassV2.GetComponentVersionArtifact
+import Amazonka.GreengrassV2.GetConnectivityInfo
+import Amazonka.GreengrassV2.GetCoreDevice
+import Amazonka.GreengrassV2.GetDeployment
+import Amazonka.GreengrassV2.GetServiceRoleForAccount
+import Amazonka.GreengrassV2.ListClientDevicesAssociatedWithCoreDevice
+import Amazonka.GreengrassV2.ListComponentVersions
+import Amazonka.GreengrassV2.ListComponents
+import Amazonka.GreengrassV2.ListCoreDevices
+import Amazonka.GreengrassV2.ListDeployments
+import Amazonka.GreengrassV2.ListEffectiveDeployments
+import Amazonka.GreengrassV2.ListInstalledComponents
+import Amazonka.GreengrassV2.ListTagsForResource
+import Amazonka.GreengrassV2.ResolveComponentCandidates
+import Amazonka.GreengrassV2.TagResource
+import Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceEntry
+import Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceErrorEntry
+import Amazonka.GreengrassV2.Types.AssociatedClientDevice
+import Amazonka.GreengrassV2.Types.CloudComponentStatus
+import Amazonka.GreengrassV2.Types.Component
+import Amazonka.GreengrassV2.Types.ComponentCandidate
+import Amazonka.GreengrassV2.Types.ComponentConfigurationUpdate
+import Amazonka.GreengrassV2.Types.ComponentDependencyRequirement
+import Amazonka.GreengrassV2.Types.ComponentDeploymentSpecification
+import Amazonka.GreengrassV2.Types.ComponentLatestVersion
+import Amazonka.GreengrassV2.Types.ComponentPlatform
+import Amazonka.GreengrassV2.Types.ComponentRunWith
+import Amazonka.GreengrassV2.Types.ComponentVersionListItem
+import Amazonka.GreengrassV2.Types.ConnectivityInfo
+import Amazonka.GreengrassV2.Types.CoreDevice
+import Amazonka.GreengrassV2.Types.Deployment
+import Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicy
+import Amazonka.GreengrassV2.Types.DeploymentConfigurationValidationPolicy
+import Amazonka.GreengrassV2.Types.DeploymentIoTJobConfiguration
+import Amazonka.GreengrassV2.Types.DeploymentPolicies
+import Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceEntry
+import Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceErrorEntry
+import Amazonka.GreengrassV2.Types.EffectiveDeployment
+import Amazonka.GreengrassV2.Types.EffectiveDeploymentStatusDetails
+import Amazonka.GreengrassV2.Types.InstalledComponent
+import Amazonka.GreengrassV2.Types.IoTJobAbortConfig
+import Amazonka.GreengrassV2.Types.IoTJobAbortCriteria
+import Amazonka.GreengrassV2.Types.IoTJobExecutionsRolloutConfig
+import Amazonka.GreengrassV2.Types.IoTJobExponentialRolloutRate
+import Amazonka.GreengrassV2.Types.IoTJobRateIncreaseCriteria
+import Amazonka.GreengrassV2.Types.IoTJobTimeoutConfig
+import Amazonka.GreengrassV2.Types.LambdaContainerParams
+import Amazonka.GreengrassV2.Types.LambdaDeviceMount
+import Amazonka.GreengrassV2.Types.LambdaEventSource
+import Amazonka.GreengrassV2.Types.LambdaExecutionParameters
+import Amazonka.GreengrassV2.Types.LambdaFunctionRecipeSource
+import Amazonka.GreengrassV2.Types.LambdaLinuxProcessParams
+import Amazonka.GreengrassV2.Types.LambdaVolumeMount
+import Amazonka.GreengrassV2.Types.ResolvedComponentVersion
+import Amazonka.GreengrassV2.Types.SystemResourceLimits
+import Amazonka.GreengrassV2.UntagResource
+import Amazonka.GreengrassV2.UpdateConnectivityInfo
diff --git a/gen/Amazonka/GreengrassV2/ListClientDevicesAssociatedWithCoreDevice.hs b/gen/Amazonka/GreengrassV2/ListClientDevicesAssociatedWithCoreDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListClientDevicesAssociatedWithCoreDevice.hs
@@ -0,0 +1,265 @@
+{-# 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.GreengrassV2.ListClientDevicesAssociatedWithCoreDevice
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of client devices that are associated with a
+-- core device.
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListClientDevicesAssociatedWithCoreDevice
+  ( -- * Creating a Request
+    ListClientDevicesAssociatedWithCoreDevice (..),
+    newListClientDevicesAssociatedWithCoreDevice,
+
+    -- * Request Lenses
+    listClientDevicesAssociatedWithCoreDevice_maxResults,
+    listClientDevicesAssociatedWithCoreDevice_nextToken,
+    listClientDevicesAssociatedWithCoreDevice_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    ListClientDevicesAssociatedWithCoreDeviceResponse (..),
+    newListClientDevicesAssociatedWithCoreDeviceResponse,
+
+    -- * Response Lenses
+    listClientDevicesAssociatedWithCoreDeviceResponse_associatedClientDevices,
+    listClientDevicesAssociatedWithCoreDeviceResponse_nextToken,
+    listClientDevicesAssociatedWithCoreDeviceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListClientDevicesAssociatedWithCoreDevice' smart constructor.
+data ListClientDevicesAssociatedWithCoreDevice = ListClientDevicesAssociatedWithCoreDevice'
+  { -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListClientDevicesAssociatedWithCoreDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listClientDevicesAssociatedWithCoreDevice_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listClientDevicesAssociatedWithCoreDevice_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'coreDeviceThingName', 'listClientDevicesAssociatedWithCoreDevice_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newListClientDevicesAssociatedWithCoreDevice ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  ListClientDevicesAssociatedWithCoreDevice
+newListClientDevicesAssociatedWithCoreDevice
+  pCoreDeviceThingName_ =
+    ListClientDevicesAssociatedWithCoreDevice'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        coreDeviceThingName =
+          pCoreDeviceThingName_
+      }
+
+-- | The maximum number of results to be returned per paginated request.
+listClientDevicesAssociatedWithCoreDevice_maxResults :: Lens.Lens' ListClientDevicesAssociatedWithCoreDevice (Prelude.Maybe Prelude.Natural)
+listClientDevicesAssociatedWithCoreDevice_maxResults = Lens.lens (\ListClientDevicesAssociatedWithCoreDevice' {maxResults} -> maxResults) (\s@ListClientDevicesAssociatedWithCoreDevice' {} a -> s {maxResults = a} :: ListClientDevicesAssociatedWithCoreDevice)
+
+-- | The token to be used for the next set of paginated results.
+listClientDevicesAssociatedWithCoreDevice_nextToken :: Lens.Lens' ListClientDevicesAssociatedWithCoreDevice (Prelude.Maybe Prelude.Text)
+listClientDevicesAssociatedWithCoreDevice_nextToken = Lens.lens (\ListClientDevicesAssociatedWithCoreDevice' {nextToken} -> nextToken) (\s@ListClientDevicesAssociatedWithCoreDevice' {} a -> s {nextToken = a} :: ListClientDevicesAssociatedWithCoreDevice)
+
+-- | The name of the core device. This is also the name of the IoT thing.
+listClientDevicesAssociatedWithCoreDevice_coreDeviceThingName :: Lens.Lens' ListClientDevicesAssociatedWithCoreDevice Prelude.Text
+listClientDevicesAssociatedWithCoreDevice_coreDeviceThingName = Lens.lens (\ListClientDevicesAssociatedWithCoreDevice' {coreDeviceThingName} -> coreDeviceThingName) (\s@ListClientDevicesAssociatedWithCoreDevice' {} a -> s {coreDeviceThingName = a} :: ListClientDevicesAssociatedWithCoreDevice)
+
+instance
+  Core.AWSPager
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listClientDevicesAssociatedWithCoreDeviceResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listClientDevicesAssociatedWithCoreDeviceResponse_associatedClientDevices
+            Prelude.. Lens._Just
+            Prelude.. Lens.to Prelude.toList
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listClientDevicesAssociatedWithCoreDevice_nextToken
+          Lens..~ rs
+          Lens.^? listClientDevicesAssociatedWithCoreDeviceResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  type
+    AWSResponse
+      ListClientDevicesAssociatedWithCoreDevice =
+      ListClientDevicesAssociatedWithCoreDeviceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListClientDevicesAssociatedWithCoreDeviceResponse'
+            Prelude.<$> (x Data..?> "associatedClientDevices")
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  hashWithSalt
+    _salt
+    ListClientDevicesAssociatedWithCoreDevice' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` coreDeviceThingName
+
+instance
+  Prelude.NFData
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  rnf ListClientDevicesAssociatedWithCoreDevice' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf coreDeviceThingName
+
+instance
+  Data.ToHeaders
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance
+  Data.ToPath
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  toPath ListClientDevicesAssociatedWithCoreDevice' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/coreDevices/",
+        Data.toBS coreDeviceThingName,
+        "/associatedClientDevices"
+      ]
+
+instance
+  Data.ToQuery
+    ListClientDevicesAssociatedWithCoreDevice
+  where
+  toQuery
+    ListClientDevicesAssociatedWithCoreDevice' {..} =
+      Prelude.mconcat
+        [ "maxResults" Data.=: maxResults,
+          "nextToken" Data.=: nextToken
+        ]
+
+-- | /See:/ 'newListClientDevicesAssociatedWithCoreDeviceResponse' smart constructor.
+data ListClientDevicesAssociatedWithCoreDeviceResponse = ListClientDevicesAssociatedWithCoreDeviceResponse'
+  { -- | A list that describes the client devices that are associated with the
+    -- core device.
+    associatedClientDevices :: Prelude.Maybe (Prelude.NonEmpty AssociatedClientDevice),
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListClientDevicesAssociatedWithCoreDeviceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'associatedClientDevices', 'listClientDevicesAssociatedWithCoreDeviceResponse_associatedClientDevices' - A list that describes the client devices that are associated with the
+-- core device.
+--
+-- 'nextToken', 'listClientDevicesAssociatedWithCoreDeviceResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listClientDevicesAssociatedWithCoreDeviceResponse_httpStatus' - The response's http status code.
+newListClientDevicesAssociatedWithCoreDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListClientDevicesAssociatedWithCoreDeviceResponse
+newListClientDevicesAssociatedWithCoreDeviceResponse
+  pHttpStatus_ =
+    ListClientDevicesAssociatedWithCoreDeviceResponse'
+      { associatedClientDevices =
+          Prelude.Nothing,
+        nextToken =
+          Prelude.Nothing,
+        httpStatus =
+          pHttpStatus_
+      }
+
+-- | A list that describes the client devices that are associated with the
+-- core device.
+listClientDevicesAssociatedWithCoreDeviceResponse_associatedClientDevices :: Lens.Lens' ListClientDevicesAssociatedWithCoreDeviceResponse (Prelude.Maybe (Prelude.NonEmpty AssociatedClientDevice))
+listClientDevicesAssociatedWithCoreDeviceResponse_associatedClientDevices = Lens.lens (\ListClientDevicesAssociatedWithCoreDeviceResponse' {associatedClientDevices} -> associatedClientDevices) (\s@ListClientDevicesAssociatedWithCoreDeviceResponse' {} a -> s {associatedClientDevices = a} :: ListClientDevicesAssociatedWithCoreDeviceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listClientDevicesAssociatedWithCoreDeviceResponse_nextToken :: Lens.Lens' ListClientDevicesAssociatedWithCoreDeviceResponse (Prelude.Maybe Prelude.Text)
+listClientDevicesAssociatedWithCoreDeviceResponse_nextToken = Lens.lens (\ListClientDevicesAssociatedWithCoreDeviceResponse' {nextToken} -> nextToken) (\s@ListClientDevicesAssociatedWithCoreDeviceResponse' {} a -> s {nextToken = a} :: ListClientDevicesAssociatedWithCoreDeviceResponse)
+
+-- | The response's http status code.
+listClientDevicesAssociatedWithCoreDeviceResponse_httpStatus :: Lens.Lens' ListClientDevicesAssociatedWithCoreDeviceResponse Prelude.Int
+listClientDevicesAssociatedWithCoreDeviceResponse_httpStatus = Lens.lens (\ListClientDevicesAssociatedWithCoreDeviceResponse' {httpStatus} -> httpStatus) (\s@ListClientDevicesAssociatedWithCoreDeviceResponse' {} a -> s {httpStatus = a} :: ListClientDevicesAssociatedWithCoreDeviceResponse)
+
+instance
+  Prelude.NFData
+    ListClientDevicesAssociatedWithCoreDeviceResponse
+  where
+  rnf
+    ListClientDevicesAssociatedWithCoreDeviceResponse' {..} =
+      Prelude.rnf associatedClientDevices
+        `Prelude.seq` Prelude.rnf nextToken
+        `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListComponentVersions.hs b/gen/Amazonka/GreengrassV2/ListComponentVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListComponentVersions.hs
@@ -0,0 +1,236 @@
+{-# 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.GreengrassV2.ListComponentVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of all versions for a component. Greater
+-- versions are listed first.
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListComponentVersions
+  ( -- * Creating a Request
+    ListComponentVersions (..),
+    newListComponentVersions,
+
+    -- * Request Lenses
+    listComponentVersions_maxResults,
+    listComponentVersions_nextToken,
+    listComponentVersions_arn,
+
+    -- * Destructuring the Response
+    ListComponentVersionsResponse (..),
+    newListComponentVersionsResponse,
+
+    -- * Response Lenses
+    listComponentVersionsResponse_componentVersions,
+    listComponentVersionsResponse_nextToken,
+    listComponentVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListComponentVersions' smart constructor.
+data ListComponentVersions = ListComponentVersions'
+  { -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListComponentVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listComponentVersions_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listComponentVersions_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'arn', 'listComponentVersions_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component.
+newListComponentVersions ::
+  -- | 'arn'
+  Prelude.Text ->
+  ListComponentVersions
+newListComponentVersions pArn_ =
+  ListComponentVersions'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      arn = pArn_
+    }
+
+-- | The maximum number of results to be returned per paginated request.
+listComponentVersions_maxResults :: Lens.Lens' ListComponentVersions (Prelude.Maybe Prelude.Natural)
+listComponentVersions_maxResults = Lens.lens (\ListComponentVersions' {maxResults} -> maxResults) (\s@ListComponentVersions' {} a -> s {maxResults = a} :: ListComponentVersions)
+
+-- | The token to be used for the next set of paginated results.
+listComponentVersions_nextToken :: Lens.Lens' ListComponentVersions (Prelude.Maybe Prelude.Text)
+listComponentVersions_nextToken = Lens.lens (\ListComponentVersions' {nextToken} -> nextToken) (\s@ListComponentVersions' {} a -> s {nextToken = a} :: ListComponentVersions)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component.
+listComponentVersions_arn :: Lens.Lens' ListComponentVersions Prelude.Text
+listComponentVersions_arn = Lens.lens (\ListComponentVersions' {arn} -> arn) (\s@ListComponentVersions' {} a -> s {arn = a} :: ListComponentVersions)
+
+instance Core.AWSPager ListComponentVersions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listComponentVersionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listComponentVersionsResponse_componentVersions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listComponentVersions_nextToken
+          Lens..~ rs
+          Lens.^? listComponentVersionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListComponentVersions where
+  type
+    AWSResponse ListComponentVersions =
+      ListComponentVersionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListComponentVersionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "componentVersions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListComponentVersions where
+  hashWithSalt _salt ListComponentVersions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData ListComponentVersions where
+  rnf ListComponentVersions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf arn
+
+instance Data.ToHeaders ListComponentVersions where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListComponentVersions where
+  toPath ListComponentVersions' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/components/",
+        Data.toBS arn,
+        "/versions"
+      ]
+
+instance Data.ToQuery ListComponentVersions where
+  toQuery ListComponentVersions' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListComponentVersionsResponse' smart constructor.
+data ListComponentVersionsResponse = ListComponentVersionsResponse'
+  { -- | A list of versions that exist for the component.
+    componentVersions :: Prelude.Maybe [ComponentVersionListItem],
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListComponentVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentVersions', 'listComponentVersionsResponse_componentVersions' - A list of versions that exist for the component.
+--
+-- 'nextToken', 'listComponentVersionsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listComponentVersionsResponse_httpStatus' - The response's http status code.
+newListComponentVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListComponentVersionsResponse
+newListComponentVersionsResponse pHttpStatus_ =
+  ListComponentVersionsResponse'
+    { componentVersions =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of versions that exist for the component.
+listComponentVersionsResponse_componentVersions :: Lens.Lens' ListComponentVersionsResponse (Prelude.Maybe [ComponentVersionListItem])
+listComponentVersionsResponse_componentVersions = Lens.lens (\ListComponentVersionsResponse' {componentVersions} -> componentVersions) (\s@ListComponentVersionsResponse' {} a -> s {componentVersions = a} :: ListComponentVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listComponentVersionsResponse_nextToken :: Lens.Lens' ListComponentVersionsResponse (Prelude.Maybe Prelude.Text)
+listComponentVersionsResponse_nextToken = Lens.lens (\ListComponentVersionsResponse' {nextToken} -> nextToken) (\s@ListComponentVersionsResponse' {} a -> s {nextToken = a} :: ListComponentVersionsResponse)
+
+-- | The response's http status code.
+listComponentVersionsResponse_httpStatus :: Lens.Lens' ListComponentVersionsResponse Prelude.Int
+listComponentVersionsResponse_httpStatus = Lens.lens (\ListComponentVersionsResponse' {httpStatus} -> httpStatus) (\s@ListComponentVersionsResponse' {} a -> s {httpStatus = a} :: ListComponentVersionsResponse)
+
+instance Prelude.NFData ListComponentVersionsResponse where
+  rnf ListComponentVersionsResponse' {..} =
+    Prelude.rnf componentVersions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListComponents.hs b/gen/Amazonka/GreengrassV2/ListComponents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListComponents.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.GreengrassV2.ListComponents
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of component summaries. This list includes
+-- components that you have permission to view.
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListComponents
+  ( -- * Creating a Request
+    ListComponents (..),
+    newListComponents,
+
+    -- * Request Lenses
+    listComponents_maxResults,
+    listComponents_nextToken,
+    listComponents_scope,
+
+    -- * Destructuring the Response
+    ListComponentsResponse (..),
+    newListComponentsResponse,
+
+    -- * Response Lenses
+    listComponentsResponse_components,
+    listComponentsResponse_nextToken,
+    listComponentsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListComponents' smart constructor.
+data ListComponents = ListComponents'
+  { -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The scope of the components to list.
+    --
+    -- Default: @PRIVATE@
+    scope :: Prelude.Maybe ComponentVisibilityScope
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListComponents' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listComponents_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listComponents_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'scope', 'listComponents_scope' - The scope of the components to list.
+--
+-- Default: @PRIVATE@
+newListComponents ::
+  ListComponents
+newListComponents =
+  ListComponents'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      scope = Prelude.Nothing
+    }
+
+-- | The maximum number of results to be returned per paginated request.
+listComponents_maxResults :: Lens.Lens' ListComponents (Prelude.Maybe Prelude.Natural)
+listComponents_maxResults = Lens.lens (\ListComponents' {maxResults} -> maxResults) (\s@ListComponents' {} a -> s {maxResults = a} :: ListComponents)
+
+-- | The token to be used for the next set of paginated results.
+listComponents_nextToken :: Lens.Lens' ListComponents (Prelude.Maybe Prelude.Text)
+listComponents_nextToken = Lens.lens (\ListComponents' {nextToken} -> nextToken) (\s@ListComponents' {} a -> s {nextToken = a} :: ListComponents)
+
+-- | The scope of the components to list.
+--
+-- Default: @PRIVATE@
+listComponents_scope :: Lens.Lens' ListComponents (Prelude.Maybe ComponentVisibilityScope)
+listComponents_scope = Lens.lens (\ListComponents' {scope} -> scope) (\s@ListComponents' {} a -> s {scope = a} :: ListComponents)
+
+instance Core.AWSPager ListComponents where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listComponentsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listComponentsResponse_components
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listComponents_nextToken
+          Lens..~ rs
+          Lens.^? listComponentsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListComponents where
+  type
+    AWSResponse ListComponents =
+      ListComponentsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListComponentsResponse'
+            Prelude.<$> (x Data..?> "components" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListComponents where
+  hashWithSalt _salt ListComponents' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` scope
+
+instance Prelude.NFData ListComponents where
+  rnf ListComponents' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf scope
+
+instance Data.ToHeaders ListComponents where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListComponents where
+  toPath = Prelude.const "/greengrass/v2/components"
+
+instance Data.ToQuery ListComponents where
+  toQuery ListComponents' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "scope" Data.=: scope
+      ]
+
+-- | /See:/ 'newListComponentsResponse' smart constructor.
+data ListComponentsResponse = ListComponentsResponse'
+  { -- | A list that summarizes each component.
+    components :: Prelude.Maybe [Component],
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListComponentsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'components', 'listComponentsResponse_components' - A list that summarizes each component.
+--
+-- 'nextToken', 'listComponentsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listComponentsResponse_httpStatus' - The response's http status code.
+newListComponentsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListComponentsResponse
+newListComponentsResponse pHttpStatus_ =
+  ListComponentsResponse'
+    { components =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list that summarizes each component.
+listComponentsResponse_components :: Lens.Lens' ListComponentsResponse (Prelude.Maybe [Component])
+listComponentsResponse_components = Lens.lens (\ListComponentsResponse' {components} -> components) (\s@ListComponentsResponse' {} a -> s {components = a} :: ListComponentsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listComponentsResponse_nextToken :: Lens.Lens' ListComponentsResponse (Prelude.Maybe Prelude.Text)
+listComponentsResponse_nextToken = Lens.lens (\ListComponentsResponse' {nextToken} -> nextToken) (\s@ListComponentsResponse' {} a -> s {nextToken = a} :: ListComponentsResponse)
+
+-- | The response's http status code.
+listComponentsResponse_httpStatus :: Lens.Lens' ListComponentsResponse Prelude.Int
+listComponentsResponse_httpStatus = Lens.lens (\ListComponentsResponse' {httpStatus} -> httpStatus) (\s@ListComponentsResponse' {} a -> s {httpStatus = a} :: ListComponentsResponse)
+
+instance Prelude.NFData ListComponentsResponse where
+  rnf ListComponentsResponse' {..} =
+    Prelude.rnf components
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListCoreDevices.hs b/gen/Amazonka/GreengrassV2/ListCoreDevices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListCoreDevices.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.ListCoreDevices
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of Greengrass core devices.
+--
+-- IoT Greengrass relies on individual devices to send status updates to
+-- the Amazon Web Services Cloud. If the IoT Greengrass Core software
+-- isn\'t running on the device, or if device isn\'t connected to the
+-- Amazon Web Services Cloud, then the reported status of that device might
+-- not reflect its current status. The status timestamp indicates when the
+-- device status was last updated.
+--
+-- Core devices send status updates at the following times:
+--
+-- -   When the IoT Greengrass Core software starts
+--
+-- -   When the core device receives a deployment from the Amazon Web
+--     Services Cloud
+--
+-- -   When the status of any component on the core device becomes @BROKEN@
+--
+-- -   At a
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html#greengrass-nucleus-component-configuration-fss regular interval that you can configure>,
+--     which defaults to 24 hours
+--
+-- -   For IoT Greengrass Core v2.7.0, the core device sends status updates
+--     upon local deployment and cloud deployment
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListCoreDevices
+  ( -- * Creating a Request
+    ListCoreDevices (..),
+    newListCoreDevices,
+
+    -- * Request Lenses
+    listCoreDevices_maxResults,
+    listCoreDevices_nextToken,
+    listCoreDevices_status,
+    listCoreDevices_thingGroupArn,
+
+    -- * Destructuring the Response
+    ListCoreDevicesResponse (..),
+    newListCoreDevicesResponse,
+
+    -- * Response Lenses
+    listCoreDevicesResponse_coreDevices,
+    listCoreDevicesResponse_nextToken,
+    listCoreDevicesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListCoreDevices' smart constructor.
+data ListCoreDevices = ListCoreDevices'
+  { -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The core device status by which to filter. If you specify this
+    -- parameter, the list includes only core devices that have this status.
+    -- Choose one of the following options:
+    --
+    -- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+    --     on the core device without issue.
+    --
+    -- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+    --     a failed state on the core device.
+    status :: Prelude.Maybe CoreDeviceStatus,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IoT thing group by which to filter. If you specify this
+    -- parameter, the list includes only core devices that have successfully
+    -- deployed a deployment that targets the thing group. When you remove a
+    -- core device from a thing group, the list continues to include that core
+    -- device.
+    thingGroupArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCoreDevices' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listCoreDevices_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listCoreDevices_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'status', 'listCoreDevices_status' - The core device status by which to filter. If you specify this
+-- parameter, the list includes only core devices that have this status.
+-- Choose one of the following options:
+--
+-- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+--     on the core device without issue.
+--
+-- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+--     a failed state on the core device.
+--
+-- 'thingGroupArn', 'listCoreDevices_thingGroupArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT thing group by which to filter. If you specify this
+-- parameter, the list includes only core devices that have successfully
+-- deployed a deployment that targets the thing group. When you remove a
+-- core device from a thing group, the list continues to include that core
+-- device.
+newListCoreDevices ::
+  ListCoreDevices
+newListCoreDevices =
+  ListCoreDevices'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      status = Prelude.Nothing,
+      thingGroupArn = Prelude.Nothing
+    }
+
+-- | The maximum number of results to be returned per paginated request.
+listCoreDevices_maxResults :: Lens.Lens' ListCoreDevices (Prelude.Maybe Prelude.Natural)
+listCoreDevices_maxResults = Lens.lens (\ListCoreDevices' {maxResults} -> maxResults) (\s@ListCoreDevices' {} a -> s {maxResults = a} :: ListCoreDevices)
+
+-- | The token to be used for the next set of paginated results.
+listCoreDevices_nextToken :: Lens.Lens' ListCoreDevices (Prelude.Maybe Prelude.Text)
+listCoreDevices_nextToken = Lens.lens (\ListCoreDevices' {nextToken} -> nextToken) (\s@ListCoreDevices' {} a -> s {nextToken = a} :: ListCoreDevices)
+
+-- | The core device status by which to filter. If you specify this
+-- parameter, the list includes only core devices that have this status.
+-- Choose one of the following options:
+--
+-- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+--     on the core device without issue.
+--
+-- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+--     a failed state on the core device.
+listCoreDevices_status :: Lens.Lens' ListCoreDevices (Prelude.Maybe CoreDeviceStatus)
+listCoreDevices_status = Lens.lens (\ListCoreDevices' {status} -> status) (\s@ListCoreDevices' {} a -> s {status = a} :: ListCoreDevices)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT thing group by which to filter. If you specify this
+-- parameter, the list includes only core devices that have successfully
+-- deployed a deployment that targets the thing group. When you remove a
+-- core device from a thing group, the list continues to include that core
+-- device.
+listCoreDevices_thingGroupArn :: Lens.Lens' ListCoreDevices (Prelude.Maybe Prelude.Text)
+listCoreDevices_thingGroupArn = Lens.lens (\ListCoreDevices' {thingGroupArn} -> thingGroupArn) (\s@ListCoreDevices' {} a -> s {thingGroupArn = a} :: ListCoreDevices)
+
+instance Core.AWSPager ListCoreDevices where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listCoreDevicesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listCoreDevicesResponse_coreDevices
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listCoreDevices_nextToken
+          Lens..~ rs
+          Lens.^? listCoreDevicesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListCoreDevices where
+  type
+    AWSResponse ListCoreDevices =
+      ListCoreDevicesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListCoreDevicesResponse'
+            Prelude.<$> (x Data..?> "coreDevices" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListCoreDevices where
+  hashWithSalt _salt ListCoreDevices' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` thingGroupArn
+
+instance Prelude.NFData ListCoreDevices where
+  rnf ListCoreDevices' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf thingGroupArn
+
+instance Data.ToHeaders ListCoreDevices where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListCoreDevices where
+  toPath = Prelude.const "/greengrass/v2/coreDevices"
+
+instance Data.ToQuery ListCoreDevices where
+  toQuery ListCoreDevices' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "status" Data.=: status,
+        "thingGroupArn" Data.=: thingGroupArn
+      ]
+
+-- | /See:/ 'newListCoreDevicesResponse' smart constructor.
+data ListCoreDevicesResponse = ListCoreDevicesResponse'
+  { -- | A list that summarizes each core device.
+    coreDevices :: Prelude.Maybe [CoreDevice],
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListCoreDevicesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'coreDevices', 'listCoreDevicesResponse_coreDevices' - A list that summarizes each core device.
+--
+-- 'nextToken', 'listCoreDevicesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listCoreDevicesResponse_httpStatus' - The response's http status code.
+newListCoreDevicesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListCoreDevicesResponse
+newListCoreDevicesResponse pHttpStatus_ =
+  ListCoreDevicesResponse'
+    { coreDevices =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list that summarizes each core device.
+listCoreDevicesResponse_coreDevices :: Lens.Lens' ListCoreDevicesResponse (Prelude.Maybe [CoreDevice])
+listCoreDevicesResponse_coreDevices = Lens.lens (\ListCoreDevicesResponse' {coreDevices} -> coreDevices) (\s@ListCoreDevicesResponse' {} a -> s {coreDevices = a} :: ListCoreDevicesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listCoreDevicesResponse_nextToken :: Lens.Lens' ListCoreDevicesResponse (Prelude.Maybe Prelude.Text)
+listCoreDevicesResponse_nextToken = Lens.lens (\ListCoreDevicesResponse' {nextToken} -> nextToken) (\s@ListCoreDevicesResponse' {} a -> s {nextToken = a} :: ListCoreDevicesResponse)
+
+-- | The response's http status code.
+listCoreDevicesResponse_httpStatus :: Lens.Lens' ListCoreDevicesResponse Prelude.Int
+listCoreDevicesResponse_httpStatus = Lens.lens (\ListCoreDevicesResponse' {httpStatus} -> httpStatus) (\s@ListCoreDevicesResponse' {} a -> s {httpStatus = a} :: ListCoreDevicesResponse)
+
+instance Prelude.NFData ListCoreDevicesResponse where
+  rnf ListCoreDevicesResponse' {..} =
+    Prelude.rnf coreDevices
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListDeployments.hs b/gen/Amazonka/GreengrassV2/ListDeployments.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListDeployments.hs
@@ -0,0 +1,281 @@
+{-# 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.GreengrassV2.ListDeployments
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of deployments.
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListDeployments
+  ( -- * Creating a Request
+    ListDeployments (..),
+    newListDeployments,
+
+    -- * Request Lenses
+    listDeployments_historyFilter,
+    listDeployments_maxResults,
+    listDeployments_nextToken,
+    listDeployments_parentTargetArn,
+    listDeployments_targetArn,
+
+    -- * Destructuring the Response
+    ListDeploymentsResponse (..),
+    newListDeploymentsResponse,
+
+    -- * Response Lenses
+    listDeploymentsResponse_deployments,
+    listDeploymentsResponse_nextToken,
+    listDeploymentsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDeployments' smart constructor.
+data ListDeployments = ListDeployments'
+  { -- | The filter for the list of deployments. Choose one of the following
+    -- options:
+    --
+    -- -   @ALL@ – The list includes all deployments.
+    --
+    -- -   @LATEST_ONLY@ – The list includes only the latest revision of each
+    --     deployment.
+    --
+    -- Default: @LATEST_ONLY@
+    historyFilter :: Prelude.Maybe DeploymentHistoryFilter,
+    -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The parent deployment\'s target
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- within a subdeployment.
+    parentTargetArn :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the target IoT thing or thing group.
+    targetArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDeployments' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'historyFilter', 'listDeployments_historyFilter' - The filter for the list of deployments. Choose one of the following
+-- options:
+--
+-- -   @ALL@ – The list includes all deployments.
+--
+-- -   @LATEST_ONLY@ – The list includes only the latest revision of each
+--     deployment.
+--
+-- Default: @LATEST_ONLY@
+--
+-- 'maxResults', 'listDeployments_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listDeployments_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'parentTargetArn', 'listDeployments_parentTargetArn' - The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+--
+-- 'targetArn', 'listDeployments_targetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group.
+newListDeployments ::
+  ListDeployments
+newListDeployments =
+  ListDeployments'
+    { historyFilter = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      parentTargetArn = Prelude.Nothing,
+      targetArn = Prelude.Nothing
+    }
+
+-- | The filter for the list of deployments. Choose one of the following
+-- options:
+--
+-- -   @ALL@ – The list includes all deployments.
+--
+-- -   @LATEST_ONLY@ – The list includes only the latest revision of each
+--     deployment.
+--
+-- Default: @LATEST_ONLY@
+listDeployments_historyFilter :: Lens.Lens' ListDeployments (Prelude.Maybe DeploymentHistoryFilter)
+listDeployments_historyFilter = Lens.lens (\ListDeployments' {historyFilter} -> historyFilter) (\s@ListDeployments' {} a -> s {historyFilter = a} :: ListDeployments)
+
+-- | The maximum number of results to be returned per paginated request.
+listDeployments_maxResults :: Lens.Lens' ListDeployments (Prelude.Maybe Prelude.Natural)
+listDeployments_maxResults = Lens.lens (\ListDeployments' {maxResults} -> maxResults) (\s@ListDeployments' {} a -> s {maxResults = a} :: ListDeployments)
+
+-- | The token to be used for the next set of paginated results.
+listDeployments_nextToken :: Lens.Lens' ListDeployments (Prelude.Maybe Prelude.Text)
+listDeployments_nextToken = Lens.lens (\ListDeployments' {nextToken} -> nextToken) (\s@ListDeployments' {} a -> s {nextToken = a} :: ListDeployments)
+
+-- | The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+listDeployments_parentTargetArn :: Lens.Lens' ListDeployments (Prelude.Maybe Prelude.Text)
+listDeployments_parentTargetArn = Lens.lens (\ListDeployments' {parentTargetArn} -> parentTargetArn) (\s@ListDeployments' {} a -> s {parentTargetArn = a} :: ListDeployments)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group.
+listDeployments_targetArn :: Lens.Lens' ListDeployments (Prelude.Maybe Prelude.Text)
+listDeployments_targetArn = Lens.lens (\ListDeployments' {targetArn} -> targetArn) (\s@ListDeployments' {} a -> s {targetArn = a} :: ListDeployments)
+
+instance Core.AWSPager ListDeployments where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDeploymentsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDeploymentsResponse_deployments
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDeployments_nextToken
+          Lens..~ rs
+          Lens.^? listDeploymentsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDeployments where
+  type
+    AWSResponse ListDeployments =
+      ListDeploymentsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDeploymentsResponse'
+            Prelude.<$> (x Data..?> "deployments" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDeployments where
+  hashWithSalt _salt ListDeployments' {..} =
+    _salt
+      `Prelude.hashWithSalt` historyFilter
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` parentTargetArn
+      `Prelude.hashWithSalt` targetArn
+
+instance Prelude.NFData ListDeployments where
+  rnf ListDeployments' {..} =
+    Prelude.rnf historyFilter
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf parentTargetArn
+      `Prelude.seq` Prelude.rnf targetArn
+
+instance Data.ToHeaders ListDeployments where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListDeployments where
+  toPath = Prelude.const "/greengrass/v2/deployments"
+
+instance Data.ToQuery ListDeployments where
+  toQuery ListDeployments' {..} =
+    Prelude.mconcat
+      [ "historyFilter" Data.=: historyFilter,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "parentTargetArn" Data.=: parentTargetArn,
+        "targetArn" Data.=: targetArn
+      ]
+
+-- | /See:/ 'newListDeploymentsResponse' smart constructor.
+data ListDeploymentsResponse = ListDeploymentsResponse'
+  { -- | A list that summarizes each deployment.
+    deployments :: Prelude.Maybe [Deployment],
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListDeploymentsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'deployments', 'listDeploymentsResponse_deployments' - A list that summarizes each deployment.
+--
+-- 'nextToken', 'listDeploymentsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listDeploymentsResponse_httpStatus' - The response's http status code.
+newListDeploymentsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDeploymentsResponse
+newListDeploymentsResponse pHttpStatus_ =
+  ListDeploymentsResponse'
+    { deployments =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list that summarizes each deployment.
+listDeploymentsResponse_deployments :: Lens.Lens' ListDeploymentsResponse (Prelude.Maybe [Deployment])
+listDeploymentsResponse_deployments = Lens.lens (\ListDeploymentsResponse' {deployments} -> deployments) (\s@ListDeploymentsResponse' {} a -> s {deployments = a} :: ListDeploymentsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listDeploymentsResponse_nextToken :: Lens.Lens' ListDeploymentsResponse (Prelude.Maybe Prelude.Text)
+listDeploymentsResponse_nextToken = Lens.lens (\ListDeploymentsResponse' {nextToken} -> nextToken) (\s@ListDeploymentsResponse' {} a -> s {nextToken = a} :: ListDeploymentsResponse)
+
+-- | The response's http status code.
+listDeploymentsResponse_httpStatus :: Lens.Lens' ListDeploymentsResponse Prelude.Int
+listDeploymentsResponse_httpStatus = Lens.lens (\ListDeploymentsResponse' {httpStatus} -> httpStatus) (\s@ListDeploymentsResponse' {} a -> s {httpStatus = a} :: ListDeploymentsResponse)
+
+instance Prelude.NFData ListDeploymentsResponse where
+  rnf ListDeploymentsResponse' {..} =
+    Prelude.rnf deployments
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListEffectiveDeployments.hs b/gen/Amazonka/GreengrassV2/ListEffectiveDeployments.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListEffectiveDeployments.hs
@@ -0,0 +1,233 @@
+{-# 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.GreengrassV2.ListEffectiveDeployments
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of deployment jobs that IoT Greengrass sends
+-- to Greengrass core devices.
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListEffectiveDeployments
+  ( -- * Creating a Request
+    ListEffectiveDeployments (..),
+    newListEffectiveDeployments,
+
+    -- * Request Lenses
+    listEffectiveDeployments_maxResults,
+    listEffectiveDeployments_nextToken,
+    listEffectiveDeployments_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    ListEffectiveDeploymentsResponse (..),
+    newListEffectiveDeploymentsResponse,
+
+    -- * Response Lenses
+    listEffectiveDeploymentsResponse_effectiveDeployments,
+    listEffectiveDeploymentsResponse_nextToken,
+    listEffectiveDeploymentsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListEffectiveDeployments' smart constructor.
+data ListEffectiveDeployments = ListEffectiveDeployments'
+  { -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEffectiveDeployments' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listEffectiveDeployments_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listEffectiveDeployments_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'coreDeviceThingName', 'listEffectiveDeployments_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newListEffectiveDeployments ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  ListEffectiveDeployments
+newListEffectiveDeployments pCoreDeviceThingName_ =
+  ListEffectiveDeployments'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      coreDeviceThingName = pCoreDeviceThingName_
+    }
+
+-- | The maximum number of results to be returned per paginated request.
+listEffectiveDeployments_maxResults :: Lens.Lens' ListEffectiveDeployments (Prelude.Maybe Prelude.Natural)
+listEffectiveDeployments_maxResults = Lens.lens (\ListEffectiveDeployments' {maxResults} -> maxResults) (\s@ListEffectiveDeployments' {} a -> s {maxResults = a} :: ListEffectiveDeployments)
+
+-- | The token to be used for the next set of paginated results.
+listEffectiveDeployments_nextToken :: Lens.Lens' ListEffectiveDeployments (Prelude.Maybe Prelude.Text)
+listEffectiveDeployments_nextToken = Lens.lens (\ListEffectiveDeployments' {nextToken} -> nextToken) (\s@ListEffectiveDeployments' {} a -> s {nextToken = a} :: ListEffectiveDeployments)
+
+-- | The name of the core device. This is also the name of the IoT thing.
+listEffectiveDeployments_coreDeviceThingName :: Lens.Lens' ListEffectiveDeployments Prelude.Text
+listEffectiveDeployments_coreDeviceThingName = Lens.lens (\ListEffectiveDeployments' {coreDeviceThingName} -> coreDeviceThingName) (\s@ListEffectiveDeployments' {} a -> s {coreDeviceThingName = a} :: ListEffectiveDeployments)
+
+instance Core.AWSPager ListEffectiveDeployments where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listEffectiveDeploymentsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listEffectiveDeploymentsResponse_effectiveDeployments
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listEffectiveDeployments_nextToken
+          Lens..~ rs
+          Lens.^? listEffectiveDeploymentsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListEffectiveDeployments where
+  type
+    AWSResponse ListEffectiveDeployments =
+      ListEffectiveDeploymentsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListEffectiveDeploymentsResponse'
+            Prelude.<$> ( x
+                            Data..?> "effectiveDeployments"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListEffectiveDeployments where
+  hashWithSalt _salt ListEffectiveDeployments' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` coreDeviceThingName
+
+instance Prelude.NFData ListEffectiveDeployments where
+  rnf ListEffectiveDeployments' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf coreDeviceThingName
+
+instance Data.ToHeaders ListEffectiveDeployments where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListEffectiveDeployments where
+  toPath ListEffectiveDeployments' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/coreDevices/",
+        Data.toBS coreDeviceThingName,
+        "/effectiveDeployments"
+      ]
+
+instance Data.ToQuery ListEffectiveDeployments where
+  toQuery ListEffectiveDeployments' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListEffectiveDeploymentsResponse' smart constructor.
+data ListEffectiveDeploymentsResponse = ListEffectiveDeploymentsResponse'
+  { -- | A list that summarizes each deployment on the core device.
+    effectiveDeployments :: Prelude.Maybe [EffectiveDeployment],
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListEffectiveDeploymentsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'effectiveDeployments', 'listEffectiveDeploymentsResponse_effectiveDeployments' - A list that summarizes each deployment on the core device.
+--
+-- 'nextToken', 'listEffectiveDeploymentsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listEffectiveDeploymentsResponse_httpStatus' - The response's http status code.
+newListEffectiveDeploymentsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListEffectiveDeploymentsResponse
+newListEffectiveDeploymentsResponse pHttpStatus_ =
+  ListEffectiveDeploymentsResponse'
+    { effectiveDeployments =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list that summarizes each deployment on the core device.
+listEffectiveDeploymentsResponse_effectiveDeployments :: Lens.Lens' ListEffectiveDeploymentsResponse (Prelude.Maybe [EffectiveDeployment])
+listEffectiveDeploymentsResponse_effectiveDeployments = Lens.lens (\ListEffectiveDeploymentsResponse' {effectiveDeployments} -> effectiveDeployments) (\s@ListEffectiveDeploymentsResponse' {} a -> s {effectiveDeployments = a} :: ListEffectiveDeploymentsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listEffectiveDeploymentsResponse_nextToken :: Lens.Lens' ListEffectiveDeploymentsResponse (Prelude.Maybe Prelude.Text)
+listEffectiveDeploymentsResponse_nextToken = Lens.lens (\ListEffectiveDeploymentsResponse' {nextToken} -> nextToken) (\s@ListEffectiveDeploymentsResponse' {} a -> s {nextToken = a} :: ListEffectiveDeploymentsResponse)
+
+-- | The response's http status code.
+listEffectiveDeploymentsResponse_httpStatus :: Lens.Lens' ListEffectiveDeploymentsResponse Prelude.Int
+listEffectiveDeploymentsResponse_httpStatus = Lens.lens (\ListEffectiveDeploymentsResponse' {httpStatus} -> httpStatus) (\s@ListEffectiveDeploymentsResponse' {} a -> s {httpStatus = a} :: ListEffectiveDeploymentsResponse)
+
+instance
+  Prelude.NFData
+    ListEffectiveDeploymentsResponse
+  where
+  rnf ListEffectiveDeploymentsResponse' {..} =
+    Prelude.rnf effectiveDeployments
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListInstalledComponents.hs b/gen/Amazonka/GreengrassV2/ListInstalledComponents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListInstalledComponents.hs
@@ -0,0 +1,331 @@
+{-# 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.GreengrassV2.ListInstalledComponents
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of the components that a Greengrass core
+-- device runs. By default, this list doesn\'t include components that are
+-- deployed as dependencies of other components. To include dependencies in
+-- the response, set the @topologyFilter@ parameter to @ALL@.
+--
+-- IoT Greengrass relies on individual devices to send status updates to
+-- the Amazon Web Services Cloud. If the IoT Greengrass Core software
+-- isn\'t running on the device, or if device isn\'t connected to the
+-- Amazon Web Services Cloud, then the reported status of that device might
+-- not reflect its current status. The status timestamp indicates when the
+-- device status was last updated.
+--
+-- Core devices send status updates at the following times:
+--
+-- -   When the IoT Greengrass Core software starts
+--
+-- -   When the core device receives a deployment from the Amazon Web
+--     Services Cloud
+--
+-- -   When the status of any component on the core device becomes @BROKEN@
+--
+-- -   At a
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html#greengrass-nucleus-component-configuration-fss regular interval that you can configure>,
+--     which defaults to 24 hours
+--
+-- -   For IoT Greengrass Core v2.7.0, the core device sends status updates
+--     upon local deployment and cloud deployment
+--
+-- This operation returns paginated results.
+module Amazonka.GreengrassV2.ListInstalledComponents
+  ( -- * Creating a Request
+    ListInstalledComponents (..),
+    newListInstalledComponents,
+
+    -- * Request Lenses
+    listInstalledComponents_maxResults,
+    listInstalledComponents_nextToken,
+    listInstalledComponents_topologyFilter,
+    listInstalledComponents_coreDeviceThingName,
+
+    -- * Destructuring the Response
+    ListInstalledComponentsResponse (..),
+    newListInstalledComponentsResponse,
+
+    -- * Response Lenses
+    listInstalledComponentsResponse_installedComponents,
+    listInstalledComponentsResponse_nextToken,
+    listInstalledComponentsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListInstalledComponents' smart constructor.
+data ListInstalledComponents = ListInstalledComponents'
+  { -- | The maximum number of results to be returned per paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The filter for the list of components. Choose from the following
+    -- options:
+    --
+    -- -   @ALL@ – The list includes all components installed on the core
+    --     device.
+    --
+    -- -   @ROOT@ – The list includes only /root/ components, which are
+    --     components that you specify in a deployment. When you choose this
+    --     option, the list doesn\'t include components that the core device
+    --     installs as dependencies of other components.
+    --
+    -- Default: @ROOT@
+    topologyFilter :: Prelude.Maybe InstalledComponentTopologyFilter,
+    -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListInstalledComponents' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'listInstalledComponents_maxResults' - The maximum number of results to be returned per paginated request.
+--
+-- 'nextToken', 'listInstalledComponents_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'topologyFilter', 'listInstalledComponents_topologyFilter' - The filter for the list of components. Choose from the following
+-- options:
+--
+-- -   @ALL@ – The list includes all components installed on the core
+--     device.
+--
+-- -   @ROOT@ – The list includes only /root/ components, which are
+--     components that you specify in a deployment. When you choose this
+--     option, the list doesn\'t include components that the core device
+--     installs as dependencies of other components.
+--
+-- Default: @ROOT@
+--
+-- 'coreDeviceThingName', 'listInstalledComponents_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+newListInstalledComponents ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  ListInstalledComponents
+newListInstalledComponents pCoreDeviceThingName_ =
+  ListInstalledComponents'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      topologyFilter = Prelude.Nothing,
+      coreDeviceThingName = pCoreDeviceThingName_
+    }
+
+-- | The maximum number of results to be returned per paginated request.
+listInstalledComponents_maxResults :: Lens.Lens' ListInstalledComponents (Prelude.Maybe Prelude.Natural)
+listInstalledComponents_maxResults = Lens.lens (\ListInstalledComponents' {maxResults} -> maxResults) (\s@ListInstalledComponents' {} a -> s {maxResults = a} :: ListInstalledComponents)
+
+-- | The token to be used for the next set of paginated results.
+listInstalledComponents_nextToken :: Lens.Lens' ListInstalledComponents (Prelude.Maybe Prelude.Text)
+listInstalledComponents_nextToken = Lens.lens (\ListInstalledComponents' {nextToken} -> nextToken) (\s@ListInstalledComponents' {} a -> s {nextToken = a} :: ListInstalledComponents)
+
+-- | The filter for the list of components. Choose from the following
+-- options:
+--
+-- -   @ALL@ – The list includes all components installed on the core
+--     device.
+--
+-- -   @ROOT@ – The list includes only /root/ components, which are
+--     components that you specify in a deployment. When you choose this
+--     option, the list doesn\'t include components that the core device
+--     installs as dependencies of other components.
+--
+-- Default: @ROOT@
+listInstalledComponents_topologyFilter :: Lens.Lens' ListInstalledComponents (Prelude.Maybe InstalledComponentTopologyFilter)
+listInstalledComponents_topologyFilter = Lens.lens (\ListInstalledComponents' {topologyFilter} -> topologyFilter) (\s@ListInstalledComponents' {} a -> s {topologyFilter = a} :: ListInstalledComponents)
+
+-- | The name of the core device. This is also the name of the IoT thing.
+listInstalledComponents_coreDeviceThingName :: Lens.Lens' ListInstalledComponents Prelude.Text
+listInstalledComponents_coreDeviceThingName = Lens.lens (\ListInstalledComponents' {coreDeviceThingName} -> coreDeviceThingName) (\s@ListInstalledComponents' {} a -> s {coreDeviceThingName = a} :: ListInstalledComponents)
+
+instance Core.AWSPager ListInstalledComponents where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listInstalledComponentsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listInstalledComponentsResponse_installedComponents
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listInstalledComponents_nextToken
+          Lens..~ rs
+          Lens.^? listInstalledComponentsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListInstalledComponents where
+  type
+    AWSResponse ListInstalledComponents =
+      ListInstalledComponentsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListInstalledComponentsResponse'
+            Prelude.<$> ( x
+                            Data..?> "installedComponents"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListInstalledComponents where
+  hashWithSalt _salt ListInstalledComponents' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` topologyFilter
+      `Prelude.hashWithSalt` coreDeviceThingName
+
+instance Prelude.NFData ListInstalledComponents where
+  rnf ListInstalledComponents' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf topologyFilter
+      `Prelude.seq` Prelude.rnf coreDeviceThingName
+
+instance Data.ToHeaders ListInstalledComponents where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListInstalledComponents where
+  toPath ListInstalledComponents' {..} =
+    Prelude.mconcat
+      [ "/greengrass/v2/coreDevices/",
+        Data.toBS coreDeviceThingName,
+        "/installedComponents"
+      ]
+
+instance Data.ToQuery ListInstalledComponents where
+  toQuery ListInstalledComponents' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "topologyFilter" Data.=: topologyFilter
+      ]
+
+-- | /See:/ 'newListInstalledComponentsResponse' smart constructor.
+data ListInstalledComponentsResponse = ListInstalledComponentsResponse'
+  { -- | A list that summarizes each component on the core device.
+    --
+    -- Greengrass nucleus v2.7.0 or later is required to get an accurate
+    -- @lastStatusChangeTimestamp@ response. This response can be inaccurate in
+    -- earlier Greengrass nucleus versions.
+    --
+    -- Greengrass nucleus v2.8.0 or later is required to get an accurate
+    -- @lastInstallationSource@ and @lastReportedTimestamp@ response. This
+    -- response can be inaccurate or null in earlier Greengrass nucleus
+    -- versions.
+    installedComponents :: Prelude.Maybe [InstalledComponent],
+    -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    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 'ListInstalledComponentsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'installedComponents', 'listInstalledComponentsResponse_installedComponents' - A list that summarizes each component on the core device.
+--
+-- Greengrass nucleus v2.7.0 or later is required to get an accurate
+-- @lastStatusChangeTimestamp@ response. This response can be inaccurate in
+-- earlier Greengrass nucleus versions.
+--
+-- Greengrass nucleus v2.8.0 or later is required to get an accurate
+-- @lastInstallationSource@ and @lastReportedTimestamp@ response. This
+-- response can be inaccurate or null in earlier Greengrass nucleus
+-- versions.
+--
+-- 'nextToken', 'listInstalledComponentsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listInstalledComponentsResponse_httpStatus' - The response's http status code.
+newListInstalledComponentsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListInstalledComponentsResponse
+newListInstalledComponentsResponse pHttpStatus_ =
+  ListInstalledComponentsResponse'
+    { installedComponents =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list that summarizes each component on the core device.
+--
+-- Greengrass nucleus v2.7.0 or later is required to get an accurate
+-- @lastStatusChangeTimestamp@ response. This response can be inaccurate in
+-- earlier Greengrass nucleus versions.
+--
+-- Greengrass nucleus v2.8.0 or later is required to get an accurate
+-- @lastInstallationSource@ and @lastReportedTimestamp@ response. This
+-- response can be inaccurate or null in earlier Greengrass nucleus
+-- versions.
+listInstalledComponentsResponse_installedComponents :: Lens.Lens' ListInstalledComponentsResponse (Prelude.Maybe [InstalledComponent])
+listInstalledComponentsResponse_installedComponents = Lens.lens (\ListInstalledComponentsResponse' {installedComponents} -> installedComponents) (\s@ListInstalledComponentsResponse' {} a -> s {installedComponents = a} :: ListInstalledComponentsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listInstalledComponentsResponse_nextToken :: Lens.Lens' ListInstalledComponentsResponse (Prelude.Maybe Prelude.Text)
+listInstalledComponentsResponse_nextToken = Lens.lens (\ListInstalledComponentsResponse' {nextToken} -> nextToken) (\s@ListInstalledComponentsResponse' {} a -> s {nextToken = a} :: ListInstalledComponentsResponse)
+
+-- | The response's http status code.
+listInstalledComponentsResponse_httpStatus :: Lens.Lens' ListInstalledComponentsResponse Prelude.Int
+listInstalledComponentsResponse_httpStatus = Lens.lens (\ListInstalledComponentsResponse' {httpStatus} -> httpStatus) (\s@ListInstalledComponentsResponse' {} a -> s {httpStatus = a} :: ListInstalledComponentsResponse)
+
+instance
+  Prelude.NFData
+    ListInstalledComponentsResponse
+  where
+  rnf ListInstalledComponentsResponse' {..} =
+    Prelude.rnf installedComponents
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/ListTagsForResource.hs b/gen/Amazonka/GreengrassV2/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ListTagsForResource.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.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)
+--
+-- Retrieves the list of tags for an IoT Greengrass resource.
+module Amazonka.GreengrassV2.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.GreengrassV2.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
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the resource.
+    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
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource.
+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.mempty
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    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' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+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/GreengrassV2/ResolveComponentCandidates.hs b/gen/Amazonka/GreengrassV2/ResolveComponentCandidates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/ResolveComponentCandidates.hs
@@ -0,0 +1,207 @@
+{-# 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.GreengrassV2.ResolveComponentCandidates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a list of components that meet the component, version, and
+-- platform requirements of a deployment. Greengrass core devices call this
+-- operation when they receive a deployment to identify the components to
+-- install.
+--
+-- This operation identifies components that meet all dependency
+-- requirements for a deployment. If the requirements conflict, then this
+-- operation returns an error and the deployment fails. For example, this
+-- occurs if component @A@ requires version @>2.0.0@ and component @B@
+-- requires version @\<2.0.0@ of a component dependency.
+--
+-- When you specify the component candidates to resolve, IoT Greengrass
+-- compares each component\'s digest from the core device with the
+-- component\'s digest in the Amazon Web Services Cloud. If the digests
+-- don\'t match, then IoT Greengrass specifies to use the version from the
+-- Amazon Web Services Cloud.
+--
+-- To use this operation, you must use the data plane API endpoint and
+-- authenticate with an IoT device certificate. For more information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/greengrass.html IoT Greengrass endpoints and quotas>.
+module Amazonka.GreengrassV2.ResolveComponentCandidates
+  ( -- * Creating a Request
+    ResolveComponentCandidates (..),
+    newResolveComponentCandidates,
+
+    -- * Request Lenses
+    resolveComponentCandidates_componentCandidates,
+    resolveComponentCandidates_platform,
+
+    -- * Destructuring the Response
+    ResolveComponentCandidatesResponse (..),
+    newResolveComponentCandidatesResponse,
+
+    -- * Response Lenses
+    resolveComponentCandidatesResponse_resolvedComponentVersions,
+    resolveComponentCandidatesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newResolveComponentCandidates' smart constructor.
+data ResolveComponentCandidates = ResolveComponentCandidates'
+  { -- | The list of components to resolve.
+    componentCandidates :: Prelude.Maybe [ComponentCandidate],
+    -- | The platform to use to resolve compatible components.
+    platform :: Prelude.Maybe ComponentPlatform
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResolveComponentCandidates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentCandidates', 'resolveComponentCandidates_componentCandidates' - The list of components to resolve.
+--
+-- 'platform', 'resolveComponentCandidates_platform' - The platform to use to resolve compatible components.
+newResolveComponentCandidates ::
+  ResolveComponentCandidates
+newResolveComponentCandidates =
+  ResolveComponentCandidates'
+    { componentCandidates =
+        Prelude.Nothing,
+      platform = Prelude.Nothing
+    }
+
+-- | The list of components to resolve.
+resolveComponentCandidates_componentCandidates :: Lens.Lens' ResolveComponentCandidates (Prelude.Maybe [ComponentCandidate])
+resolveComponentCandidates_componentCandidates = Lens.lens (\ResolveComponentCandidates' {componentCandidates} -> componentCandidates) (\s@ResolveComponentCandidates' {} a -> s {componentCandidates = a} :: ResolveComponentCandidates) Prelude.. Lens.mapping Lens.coerced
+
+-- | The platform to use to resolve compatible components.
+resolveComponentCandidates_platform :: Lens.Lens' ResolveComponentCandidates (Prelude.Maybe ComponentPlatform)
+resolveComponentCandidates_platform = Lens.lens (\ResolveComponentCandidates' {platform} -> platform) (\s@ResolveComponentCandidates' {} a -> s {platform = a} :: ResolveComponentCandidates)
+
+instance Core.AWSRequest ResolveComponentCandidates where
+  type
+    AWSResponse ResolveComponentCandidates =
+      ResolveComponentCandidatesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ResolveComponentCandidatesResponse'
+            Prelude.<$> ( x
+                            Data..?> "resolvedComponentVersions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ResolveComponentCandidates where
+  hashWithSalt _salt ResolveComponentCandidates' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentCandidates
+      `Prelude.hashWithSalt` platform
+
+instance Prelude.NFData ResolveComponentCandidates where
+  rnf ResolveComponentCandidates' {..} =
+    Prelude.rnf componentCandidates
+      `Prelude.seq` Prelude.rnf platform
+
+instance Data.ToHeaders ResolveComponentCandidates where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON ResolveComponentCandidates where
+  toJSON ResolveComponentCandidates' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentCandidates" Data..=)
+              Prelude.<$> componentCandidates,
+            ("platform" Data..=) Prelude.<$> platform
+          ]
+      )
+
+instance Data.ToPath ResolveComponentCandidates where
+  toPath =
+    Prelude.const
+      "/greengrass/v2/resolveComponentCandidates"
+
+instance Data.ToQuery ResolveComponentCandidates where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newResolveComponentCandidatesResponse' smart constructor.
+data ResolveComponentCandidatesResponse = ResolveComponentCandidatesResponse'
+  { -- | A list of components that meet the requirements that you specify in the
+    -- request. This list includes each component\'s recipe that you can use to
+    -- install the component.
+    resolvedComponentVersions :: Prelude.Maybe [ResolvedComponentVersion],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResolveComponentCandidatesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resolvedComponentVersions', 'resolveComponentCandidatesResponse_resolvedComponentVersions' - A list of components that meet the requirements that you specify in the
+-- request. This list includes each component\'s recipe that you can use to
+-- install the component.
+--
+-- 'httpStatus', 'resolveComponentCandidatesResponse_httpStatus' - The response's http status code.
+newResolveComponentCandidatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ResolveComponentCandidatesResponse
+newResolveComponentCandidatesResponse pHttpStatus_ =
+  ResolveComponentCandidatesResponse'
+    { resolvedComponentVersions =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of components that meet the requirements that you specify in the
+-- request. This list includes each component\'s recipe that you can use to
+-- install the component.
+resolveComponentCandidatesResponse_resolvedComponentVersions :: Lens.Lens' ResolveComponentCandidatesResponse (Prelude.Maybe [ResolvedComponentVersion])
+resolveComponentCandidatesResponse_resolvedComponentVersions = Lens.lens (\ResolveComponentCandidatesResponse' {resolvedComponentVersions} -> resolvedComponentVersions) (\s@ResolveComponentCandidatesResponse' {} a -> s {resolvedComponentVersions = a} :: ResolveComponentCandidatesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+resolveComponentCandidatesResponse_httpStatus :: Lens.Lens' ResolveComponentCandidatesResponse Prelude.Int
+resolveComponentCandidatesResponse_httpStatus = Lens.lens (\ResolveComponentCandidatesResponse' {httpStatus} -> httpStatus) (\s@ResolveComponentCandidatesResponse' {} a -> s {httpStatus = a} :: ResolveComponentCandidatesResponse)
+
+instance
+  Prelude.NFData
+    ResolveComponentCandidatesResponse
+  where
+  rnf ResolveComponentCandidatesResponse' {..} =
+    Prelude.rnf resolvedComponentVersions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/TagResource.hs b/gen/Amazonka/GreengrassV2/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/TagResource.hs
@@ -0,0 +1,171 @@
+{-# 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.GreengrassV2.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 an IoT Greengrass resource. If a tag already exists for the
+-- resource, this operation updates the tag\'s value.
+module Amazonka.GreengrassV2.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.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
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the resource to tag.
+    resourceArn :: Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    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
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to tag.
+--
+-- 'tags', 'tagResource_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to tag.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html Tag your resources>
+-- in the /IoT Greengrass V2 Developer Guide/.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/Types.hs b/gen/Amazonka/GreengrassV2/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types.hs
@@ -0,0 +1,594 @@
+{-# 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.GreengrassV2.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.GreengrassV2.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _RequestAlreadyInProgressException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * CloudComponentState
+    CloudComponentState (..),
+
+    -- * ComponentDependencyType
+    ComponentDependencyType (..),
+
+    -- * ComponentVisibilityScope
+    ComponentVisibilityScope (..),
+
+    -- * CoreDeviceStatus
+    CoreDeviceStatus (..),
+
+    -- * DeploymentComponentUpdatePolicyAction
+    DeploymentComponentUpdatePolicyAction (..),
+
+    -- * DeploymentFailureHandlingPolicy
+    DeploymentFailureHandlingPolicy (..),
+
+    -- * DeploymentHistoryFilter
+    DeploymentHistoryFilter (..),
+
+    -- * DeploymentStatus
+    DeploymentStatus (..),
+
+    -- * EffectiveDeploymentExecutionStatus
+    EffectiveDeploymentExecutionStatus (..),
+
+    -- * InstalledComponentLifecycleState
+    InstalledComponentLifecycleState (..),
+
+    -- * InstalledComponentTopologyFilter
+    InstalledComponentTopologyFilter (..),
+
+    -- * IoTJobAbortAction
+    IoTJobAbortAction (..),
+
+    -- * IoTJobExecutionFailureType
+    IoTJobExecutionFailureType (..),
+
+    -- * LambdaEventSourceType
+    LambdaEventSourceType (..),
+
+    -- * LambdaFilesystemPermission
+    LambdaFilesystemPermission (..),
+
+    -- * LambdaInputPayloadEncodingType
+    LambdaInputPayloadEncodingType (..),
+
+    -- * LambdaIsolationMode
+    LambdaIsolationMode (..),
+
+    -- * RecipeOutputFormat
+    RecipeOutputFormat (..),
+
+    -- * VendorGuidance
+    VendorGuidance (..),
+
+    -- * AssociateClientDeviceWithCoreDeviceEntry
+    AssociateClientDeviceWithCoreDeviceEntry (..),
+    newAssociateClientDeviceWithCoreDeviceEntry,
+    associateClientDeviceWithCoreDeviceEntry_thingName,
+
+    -- * AssociateClientDeviceWithCoreDeviceErrorEntry
+    AssociateClientDeviceWithCoreDeviceErrorEntry (..),
+    newAssociateClientDeviceWithCoreDeviceErrorEntry,
+    associateClientDeviceWithCoreDeviceErrorEntry_code,
+    associateClientDeviceWithCoreDeviceErrorEntry_message,
+    associateClientDeviceWithCoreDeviceErrorEntry_thingName,
+
+    -- * AssociatedClientDevice
+    AssociatedClientDevice (..),
+    newAssociatedClientDevice,
+    associatedClientDevice_associationTimestamp,
+    associatedClientDevice_thingName,
+
+    -- * CloudComponentStatus
+    CloudComponentStatus (..),
+    newCloudComponentStatus,
+    cloudComponentStatus_componentState,
+    cloudComponentStatus_errors,
+    cloudComponentStatus_message,
+    cloudComponentStatus_vendorGuidance,
+    cloudComponentStatus_vendorGuidanceMessage,
+
+    -- * Component
+    Component (..),
+    newComponent,
+    component_arn,
+    component_componentName,
+    component_latestVersion,
+
+    -- * ComponentCandidate
+    ComponentCandidate (..),
+    newComponentCandidate,
+    componentCandidate_componentName,
+    componentCandidate_componentVersion,
+    componentCandidate_versionRequirements,
+
+    -- * ComponentConfigurationUpdate
+    ComponentConfigurationUpdate (..),
+    newComponentConfigurationUpdate,
+    componentConfigurationUpdate_merge,
+    componentConfigurationUpdate_reset,
+
+    -- * ComponentDependencyRequirement
+    ComponentDependencyRequirement (..),
+    newComponentDependencyRequirement,
+    componentDependencyRequirement_dependencyType,
+    componentDependencyRequirement_versionRequirement,
+
+    -- * ComponentDeploymentSpecification
+    ComponentDeploymentSpecification (..),
+    newComponentDeploymentSpecification,
+    componentDeploymentSpecification_componentVersion,
+    componentDeploymentSpecification_configurationUpdate,
+    componentDeploymentSpecification_runWith,
+
+    -- * ComponentLatestVersion
+    ComponentLatestVersion (..),
+    newComponentLatestVersion,
+    componentLatestVersion_arn,
+    componentLatestVersion_componentVersion,
+    componentLatestVersion_creationTimestamp,
+    componentLatestVersion_description,
+    componentLatestVersion_platforms,
+    componentLatestVersion_publisher,
+
+    -- * ComponentPlatform
+    ComponentPlatform (..),
+    newComponentPlatform,
+    componentPlatform_attributes,
+    componentPlatform_name,
+
+    -- * ComponentRunWith
+    ComponentRunWith (..),
+    newComponentRunWith,
+    componentRunWith_posixUser,
+    componentRunWith_systemResourceLimits,
+    componentRunWith_windowsUser,
+
+    -- * ComponentVersionListItem
+    ComponentVersionListItem (..),
+    newComponentVersionListItem,
+    componentVersionListItem_arn,
+    componentVersionListItem_componentName,
+    componentVersionListItem_componentVersion,
+
+    -- * ConnectivityInfo
+    ConnectivityInfo (..),
+    newConnectivityInfo,
+    connectivityInfo_hostAddress,
+    connectivityInfo_id,
+    connectivityInfo_metadata,
+    connectivityInfo_portNumber,
+
+    -- * CoreDevice
+    CoreDevice (..),
+    newCoreDevice,
+    coreDevice_coreDeviceThingName,
+    coreDevice_lastStatusUpdateTimestamp,
+    coreDevice_status,
+
+    -- * Deployment
+    Deployment (..),
+    newDeployment,
+    deployment_creationTimestamp,
+    deployment_deploymentId,
+    deployment_deploymentName,
+    deployment_deploymentStatus,
+    deployment_isLatestForTarget,
+    deployment_parentTargetArn,
+    deployment_revisionId,
+    deployment_targetArn,
+
+    -- * DeploymentComponentUpdatePolicy
+    DeploymentComponentUpdatePolicy (..),
+    newDeploymentComponentUpdatePolicy,
+    deploymentComponentUpdatePolicy_action,
+    deploymentComponentUpdatePolicy_timeoutInSeconds,
+
+    -- * DeploymentConfigurationValidationPolicy
+    DeploymentConfigurationValidationPolicy (..),
+    newDeploymentConfigurationValidationPolicy,
+    deploymentConfigurationValidationPolicy_timeoutInSeconds,
+
+    -- * DeploymentIoTJobConfiguration
+    DeploymentIoTJobConfiguration (..),
+    newDeploymentIoTJobConfiguration,
+    deploymentIoTJobConfiguration_abortConfig,
+    deploymentIoTJobConfiguration_jobExecutionsRolloutConfig,
+    deploymentIoTJobConfiguration_timeoutConfig,
+
+    -- * DeploymentPolicies
+    DeploymentPolicies (..),
+    newDeploymentPolicies,
+    deploymentPolicies_componentUpdatePolicy,
+    deploymentPolicies_configurationValidationPolicy,
+    deploymentPolicies_failureHandlingPolicy,
+
+    -- * DisassociateClientDeviceFromCoreDeviceEntry
+    DisassociateClientDeviceFromCoreDeviceEntry (..),
+    newDisassociateClientDeviceFromCoreDeviceEntry,
+    disassociateClientDeviceFromCoreDeviceEntry_thingName,
+
+    -- * DisassociateClientDeviceFromCoreDeviceErrorEntry
+    DisassociateClientDeviceFromCoreDeviceErrorEntry (..),
+    newDisassociateClientDeviceFromCoreDeviceErrorEntry,
+    disassociateClientDeviceFromCoreDeviceErrorEntry_code,
+    disassociateClientDeviceFromCoreDeviceErrorEntry_message,
+    disassociateClientDeviceFromCoreDeviceErrorEntry_thingName,
+
+    -- * EffectiveDeployment
+    EffectiveDeployment (..),
+    newEffectiveDeployment,
+    effectiveDeployment_description,
+    effectiveDeployment_iotJobArn,
+    effectiveDeployment_iotJobId,
+    effectiveDeployment_reason,
+    effectiveDeployment_statusDetails,
+    effectiveDeployment_deploymentId,
+    effectiveDeployment_deploymentName,
+    effectiveDeployment_targetArn,
+    effectiveDeployment_coreDeviceExecutionStatus,
+    effectiveDeployment_creationTimestamp,
+    effectiveDeployment_modifiedTimestamp,
+
+    -- * EffectiveDeploymentStatusDetails
+    EffectiveDeploymentStatusDetails (..),
+    newEffectiveDeploymentStatusDetails,
+    effectiveDeploymentStatusDetails_errorStack,
+    effectiveDeploymentStatusDetails_errorTypes,
+
+    -- * InstalledComponent
+    InstalledComponent (..),
+    newInstalledComponent,
+    installedComponent_componentName,
+    installedComponent_componentVersion,
+    installedComponent_isRoot,
+    installedComponent_lastInstallationSource,
+    installedComponent_lastReportedTimestamp,
+    installedComponent_lastStatusChangeTimestamp,
+    installedComponent_lifecycleState,
+    installedComponent_lifecycleStateDetails,
+    installedComponent_lifecycleStatusCodes,
+
+    -- * IoTJobAbortConfig
+    IoTJobAbortConfig (..),
+    newIoTJobAbortConfig,
+    ioTJobAbortConfig_criteriaList,
+
+    -- * IoTJobAbortCriteria
+    IoTJobAbortCriteria (..),
+    newIoTJobAbortCriteria,
+    ioTJobAbortCriteria_failureType,
+    ioTJobAbortCriteria_action,
+    ioTJobAbortCriteria_thresholdPercentage,
+    ioTJobAbortCriteria_minNumberOfExecutedThings,
+
+    -- * IoTJobExecutionsRolloutConfig
+    IoTJobExecutionsRolloutConfig (..),
+    newIoTJobExecutionsRolloutConfig,
+    ioTJobExecutionsRolloutConfig_exponentialRate,
+    ioTJobExecutionsRolloutConfig_maximumPerMinute,
+
+    -- * IoTJobExponentialRolloutRate
+    IoTJobExponentialRolloutRate (..),
+    newIoTJobExponentialRolloutRate,
+    ioTJobExponentialRolloutRate_baseRatePerMinute,
+    ioTJobExponentialRolloutRate_incrementFactor,
+    ioTJobExponentialRolloutRate_rateIncreaseCriteria,
+
+    -- * IoTJobRateIncreaseCriteria
+    IoTJobRateIncreaseCriteria (..),
+    newIoTJobRateIncreaseCriteria,
+    ioTJobRateIncreaseCriteria_numberOfNotifiedThings,
+    ioTJobRateIncreaseCriteria_numberOfSucceededThings,
+
+    -- * IoTJobTimeoutConfig
+    IoTJobTimeoutConfig (..),
+    newIoTJobTimeoutConfig,
+    ioTJobTimeoutConfig_inProgressTimeoutInMinutes,
+
+    -- * LambdaContainerParams
+    LambdaContainerParams (..),
+    newLambdaContainerParams,
+    lambdaContainerParams_devices,
+    lambdaContainerParams_memorySizeInKB,
+    lambdaContainerParams_mountROSysfs,
+    lambdaContainerParams_volumes,
+
+    -- * LambdaDeviceMount
+    LambdaDeviceMount (..),
+    newLambdaDeviceMount,
+    lambdaDeviceMount_addGroupOwner,
+    lambdaDeviceMount_permission,
+    lambdaDeviceMount_path,
+
+    -- * LambdaEventSource
+    LambdaEventSource (..),
+    newLambdaEventSource,
+    lambdaEventSource_topic,
+    lambdaEventSource_type,
+
+    -- * LambdaExecutionParameters
+    LambdaExecutionParameters (..),
+    newLambdaExecutionParameters,
+    lambdaExecutionParameters_environmentVariables,
+    lambdaExecutionParameters_eventSources,
+    lambdaExecutionParameters_execArgs,
+    lambdaExecutionParameters_inputPayloadEncodingType,
+    lambdaExecutionParameters_linuxProcessParams,
+    lambdaExecutionParameters_maxIdleTimeInSeconds,
+    lambdaExecutionParameters_maxInstancesCount,
+    lambdaExecutionParameters_maxQueueSize,
+    lambdaExecutionParameters_pinned,
+    lambdaExecutionParameters_statusTimeoutInSeconds,
+    lambdaExecutionParameters_timeoutInSeconds,
+
+    -- * LambdaFunctionRecipeSource
+    LambdaFunctionRecipeSource (..),
+    newLambdaFunctionRecipeSource,
+    lambdaFunctionRecipeSource_componentDependencies,
+    lambdaFunctionRecipeSource_componentLambdaParameters,
+    lambdaFunctionRecipeSource_componentName,
+    lambdaFunctionRecipeSource_componentPlatforms,
+    lambdaFunctionRecipeSource_componentVersion,
+    lambdaFunctionRecipeSource_lambdaArn,
+
+    -- * LambdaLinuxProcessParams
+    LambdaLinuxProcessParams (..),
+    newLambdaLinuxProcessParams,
+    lambdaLinuxProcessParams_containerParams,
+    lambdaLinuxProcessParams_isolationMode,
+
+    -- * LambdaVolumeMount
+    LambdaVolumeMount (..),
+    newLambdaVolumeMount,
+    lambdaVolumeMount_addGroupOwner,
+    lambdaVolumeMount_permission,
+    lambdaVolumeMount_sourcePath,
+    lambdaVolumeMount_destinationPath,
+
+    -- * ResolvedComponentVersion
+    ResolvedComponentVersion (..),
+    newResolvedComponentVersion,
+    resolvedComponentVersion_arn,
+    resolvedComponentVersion_componentName,
+    resolvedComponentVersion_componentVersion,
+    resolvedComponentVersion_message,
+    resolvedComponentVersion_recipe,
+    resolvedComponentVersion_vendorGuidance,
+
+    -- * SystemResourceLimits
+    SystemResourceLimits (..),
+    newSystemResourceLimits,
+    systemResourceLimits_cpus,
+    systemResourceLimits_memory,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceEntry
+import Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceErrorEntry
+import Amazonka.GreengrassV2.Types.AssociatedClientDevice
+import Amazonka.GreengrassV2.Types.CloudComponentState
+import Amazonka.GreengrassV2.Types.CloudComponentStatus
+import Amazonka.GreengrassV2.Types.Component
+import Amazonka.GreengrassV2.Types.ComponentCandidate
+import Amazonka.GreengrassV2.Types.ComponentConfigurationUpdate
+import Amazonka.GreengrassV2.Types.ComponentDependencyRequirement
+import Amazonka.GreengrassV2.Types.ComponentDependencyType
+import Amazonka.GreengrassV2.Types.ComponentDeploymentSpecification
+import Amazonka.GreengrassV2.Types.ComponentLatestVersion
+import Amazonka.GreengrassV2.Types.ComponentPlatform
+import Amazonka.GreengrassV2.Types.ComponentRunWith
+import Amazonka.GreengrassV2.Types.ComponentVersionListItem
+import Amazonka.GreengrassV2.Types.ComponentVisibilityScope
+import Amazonka.GreengrassV2.Types.ConnectivityInfo
+import Amazonka.GreengrassV2.Types.CoreDevice
+import Amazonka.GreengrassV2.Types.CoreDeviceStatus
+import Amazonka.GreengrassV2.Types.Deployment
+import Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicy
+import Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicyAction
+import Amazonka.GreengrassV2.Types.DeploymentConfigurationValidationPolicy
+import Amazonka.GreengrassV2.Types.DeploymentFailureHandlingPolicy
+import Amazonka.GreengrassV2.Types.DeploymentHistoryFilter
+import Amazonka.GreengrassV2.Types.DeploymentIoTJobConfiguration
+import Amazonka.GreengrassV2.Types.DeploymentPolicies
+import Amazonka.GreengrassV2.Types.DeploymentStatus
+import Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceEntry
+import Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceErrorEntry
+import Amazonka.GreengrassV2.Types.EffectiveDeployment
+import Amazonka.GreengrassV2.Types.EffectiveDeploymentExecutionStatus
+import Amazonka.GreengrassV2.Types.EffectiveDeploymentStatusDetails
+import Amazonka.GreengrassV2.Types.InstalledComponent
+import Amazonka.GreengrassV2.Types.InstalledComponentLifecycleState
+import Amazonka.GreengrassV2.Types.InstalledComponentTopologyFilter
+import Amazonka.GreengrassV2.Types.IoTJobAbortAction
+import Amazonka.GreengrassV2.Types.IoTJobAbortConfig
+import Amazonka.GreengrassV2.Types.IoTJobAbortCriteria
+import Amazonka.GreengrassV2.Types.IoTJobExecutionFailureType
+import Amazonka.GreengrassV2.Types.IoTJobExecutionsRolloutConfig
+import Amazonka.GreengrassV2.Types.IoTJobExponentialRolloutRate
+import Amazonka.GreengrassV2.Types.IoTJobRateIncreaseCriteria
+import Amazonka.GreengrassV2.Types.IoTJobTimeoutConfig
+import Amazonka.GreengrassV2.Types.LambdaContainerParams
+import Amazonka.GreengrassV2.Types.LambdaDeviceMount
+import Amazonka.GreengrassV2.Types.LambdaEventSource
+import Amazonka.GreengrassV2.Types.LambdaEventSourceType
+import Amazonka.GreengrassV2.Types.LambdaExecutionParameters
+import Amazonka.GreengrassV2.Types.LambdaFilesystemPermission
+import Amazonka.GreengrassV2.Types.LambdaFunctionRecipeSource
+import Amazonka.GreengrassV2.Types.LambdaInputPayloadEncodingType
+import Amazonka.GreengrassV2.Types.LambdaIsolationMode
+import Amazonka.GreengrassV2.Types.LambdaLinuxProcessParams
+import Amazonka.GreengrassV2.Types.LambdaVolumeMount
+import Amazonka.GreengrassV2.Types.RecipeOutputFormat
+import Amazonka.GreengrassV2.Types.ResolvedComponentVersion
+import Amazonka.GreengrassV2.Types.SystemResourceLimits
+import Amazonka.GreengrassV2.Types.VendorGuidance
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-11-30@ of the Amazon IoT Greengrass V2 SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "GreengrassV2",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "greengrass",
+      Core.signingName = "greengrass",
+      Core.version = "2020-11-30",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "GreengrassV2",
+      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
+
+-- | You don\'t have permission to perform the action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | Your request has conflicting operations. This can occur if you\'re
+-- trying to perform more than one operation on the same resource at the
+-- same time.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | IoT Greengrass can\'t process your request right now. Try again later.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The request is already in progress. This exception occurs when you use a
+-- client token for multiple requests while IoT Greengrass is still
+-- processing an earlier request that uses the same client token.
+_RequestAlreadyInProgressException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RequestAlreadyInProgressException =
+  Core._MatchServiceError
+    defaultService
+    "RequestAlreadyInProgressException"
+    Prelude.. Core.hasStatus 400
+
+-- | The requested resource can\'t be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | Your request exceeds a service quota. For example, you might have the
+-- maximum number of components that you can create.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | Your request exceeded a request rate quota. For example, you might have
+-- exceeded the amount of times that you can retrieve device or deployment
+-- status per second.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | The request isn\'t valid. This can occur if your request contains
+-- malformed JSON or unsupported characters.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/GreengrassV2/Types/AssociateClientDeviceWithCoreDeviceEntry.hs b/gen/Amazonka/GreengrassV2/Types/AssociateClientDeviceWithCoreDeviceEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/AssociateClientDeviceWithCoreDeviceEntry.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.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceEntry 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 a request to associate a client device with a core device. The
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html BatchAssociateClientDeviceWithCoreDevice>
+-- operation consumes a list of these requests.
+--
+-- /See:/ 'newAssociateClientDeviceWithCoreDeviceEntry' smart constructor.
+data AssociateClientDeviceWithCoreDeviceEntry = AssociateClientDeviceWithCoreDeviceEntry'
+  { -- | The name of the IoT thing that represents the client device to
+    -- associate.
+    thingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateClientDeviceWithCoreDeviceEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'thingName', 'associateClientDeviceWithCoreDeviceEntry_thingName' - The name of the IoT thing that represents the client device to
+-- associate.
+newAssociateClientDeviceWithCoreDeviceEntry ::
+  -- | 'thingName'
+  Prelude.Text ->
+  AssociateClientDeviceWithCoreDeviceEntry
+newAssociateClientDeviceWithCoreDeviceEntry
+  pThingName_ =
+    AssociateClientDeviceWithCoreDeviceEntry'
+      { thingName =
+          pThingName_
+      }
+
+-- | The name of the IoT thing that represents the client device to
+-- associate.
+associateClientDeviceWithCoreDeviceEntry_thingName :: Lens.Lens' AssociateClientDeviceWithCoreDeviceEntry Prelude.Text
+associateClientDeviceWithCoreDeviceEntry_thingName = Lens.lens (\AssociateClientDeviceWithCoreDeviceEntry' {thingName} -> thingName) (\s@AssociateClientDeviceWithCoreDeviceEntry' {} a -> s {thingName = a} :: AssociateClientDeviceWithCoreDeviceEntry)
+
+instance
+  Prelude.Hashable
+    AssociateClientDeviceWithCoreDeviceEntry
+  where
+  hashWithSalt
+    _salt
+    AssociateClientDeviceWithCoreDeviceEntry' {..} =
+      _salt `Prelude.hashWithSalt` thingName
+
+instance
+  Prelude.NFData
+    AssociateClientDeviceWithCoreDeviceEntry
+  where
+  rnf AssociateClientDeviceWithCoreDeviceEntry' {..} =
+    Prelude.rnf thingName
+
+instance
+  Data.ToJSON
+    AssociateClientDeviceWithCoreDeviceEntry
+  where
+  toJSON AssociateClientDeviceWithCoreDeviceEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("thingName" Data..= thingName)]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/AssociateClientDeviceWithCoreDeviceErrorEntry.hs b/gen/Amazonka/GreengrassV2/Types/AssociateClientDeviceWithCoreDeviceErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/AssociateClientDeviceWithCoreDeviceErrorEntry.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceErrorEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.AssociateClientDeviceWithCoreDeviceErrorEntry 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 an error that occurs from a request to associate a client
+-- device with a core device. The
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html BatchAssociateClientDeviceWithCoreDevice>
+-- operation returns a list of these errors.
+--
+-- /See:/ 'newAssociateClientDeviceWithCoreDeviceErrorEntry' smart constructor.
+data AssociateClientDeviceWithCoreDeviceErrorEntry = AssociateClientDeviceWithCoreDeviceErrorEntry'
+  { -- | The error code for the request.
+    code :: Prelude.Maybe Prelude.Text,
+    -- | A message that provides additional information about the error.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The name of the IoT thing whose associate request failed.
+    thingName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateClientDeviceWithCoreDeviceErrorEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'associateClientDeviceWithCoreDeviceErrorEntry_code' - The error code for the request.
+--
+-- 'message', 'associateClientDeviceWithCoreDeviceErrorEntry_message' - A message that provides additional information about the error.
+--
+-- 'thingName', 'associateClientDeviceWithCoreDeviceErrorEntry_thingName' - The name of the IoT thing whose associate request failed.
+newAssociateClientDeviceWithCoreDeviceErrorEntry ::
+  AssociateClientDeviceWithCoreDeviceErrorEntry
+newAssociateClientDeviceWithCoreDeviceErrorEntry =
+  AssociateClientDeviceWithCoreDeviceErrorEntry'
+    { code =
+        Prelude.Nothing,
+      message = Prelude.Nothing,
+      thingName = Prelude.Nothing
+    }
+
+-- | The error code for the request.
+associateClientDeviceWithCoreDeviceErrorEntry_code :: Lens.Lens' AssociateClientDeviceWithCoreDeviceErrorEntry (Prelude.Maybe Prelude.Text)
+associateClientDeviceWithCoreDeviceErrorEntry_code = Lens.lens (\AssociateClientDeviceWithCoreDeviceErrorEntry' {code} -> code) (\s@AssociateClientDeviceWithCoreDeviceErrorEntry' {} a -> s {code = a} :: AssociateClientDeviceWithCoreDeviceErrorEntry)
+
+-- | A message that provides additional information about the error.
+associateClientDeviceWithCoreDeviceErrorEntry_message :: Lens.Lens' AssociateClientDeviceWithCoreDeviceErrorEntry (Prelude.Maybe Prelude.Text)
+associateClientDeviceWithCoreDeviceErrorEntry_message = Lens.lens (\AssociateClientDeviceWithCoreDeviceErrorEntry' {message} -> message) (\s@AssociateClientDeviceWithCoreDeviceErrorEntry' {} a -> s {message = a} :: AssociateClientDeviceWithCoreDeviceErrorEntry)
+
+-- | The name of the IoT thing whose associate request failed.
+associateClientDeviceWithCoreDeviceErrorEntry_thingName :: Lens.Lens' AssociateClientDeviceWithCoreDeviceErrorEntry (Prelude.Maybe Prelude.Text)
+associateClientDeviceWithCoreDeviceErrorEntry_thingName = Lens.lens (\AssociateClientDeviceWithCoreDeviceErrorEntry' {thingName} -> thingName) (\s@AssociateClientDeviceWithCoreDeviceErrorEntry' {} a -> s {thingName = a} :: AssociateClientDeviceWithCoreDeviceErrorEntry)
+
+instance
+  Data.FromJSON
+    AssociateClientDeviceWithCoreDeviceErrorEntry
+  where
+  parseJSON =
+    Data.withObject
+      "AssociateClientDeviceWithCoreDeviceErrorEntry"
+      ( \x ->
+          AssociateClientDeviceWithCoreDeviceErrorEntry'
+            Prelude.<$> (x Data..:? "code")
+            Prelude.<*> (x Data..:? "message")
+            Prelude.<*> (x Data..:? "thingName")
+      )
+
+instance
+  Prelude.Hashable
+    AssociateClientDeviceWithCoreDeviceErrorEntry
+  where
+  hashWithSalt
+    _salt
+    AssociateClientDeviceWithCoreDeviceErrorEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` code
+        `Prelude.hashWithSalt` message
+        `Prelude.hashWithSalt` thingName
+
+instance
+  Prelude.NFData
+    AssociateClientDeviceWithCoreDeviceErrorEntry
+  where
+  rnf
+    AssociateClientDeviceWithCoreDeviceErrorEntry' {..} =
+      Prelude.rnf code
+        `Prelude.seq` Prelude.rnf message
+        `Prelude.seq` Prelude.rnf thingName
diff --git a/gen/Amazonka/GreengrassV2/Types/AssociatedClientDevice.hs b/gen/Amazonka/GreengrassV2/Types/AssociatedClientDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/AssociatedClientDevice.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.GreengrassV2.Types.AssociatedClientDevice
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.AssociatedClientDevice 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 a client device that is associated to a core
+-- device for cloud discovery.
+--
+-- /See:/ 'newAssociatedClientDevice' smart constructor.
+data AssociatedClientDevice = AssociatedClientDevice'
+  { -- | The time that the client device was associated, expressed in ISO 8601
+    -- format.
+    associationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The name of the IoT thing that represents the associated client device.
+    thingName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociatedClientDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'associationTimestamp', 'associatedClientDevice_associationTimestamp' - The time that the client device was associated, expressed in ISO 8601
+-- format.
+--
+-- 'thingName', 'associatedClientDevice_thingName' - The name of the IoT thing that represents the associated client device.
+newAssociatedClientDevice ::
+  AssociatedClientDevice
+newAssociatedClientDevice =
+  AssociatedClientDevice'
+    { associationTimestamp =
+        Prelude.Nothing,
+      thingName = Prelude.Nothing
+    }
+
+-- | The time that the client device was associated, expressed in ISO 8601
+-- format.
+associatedClientDevice_associationTimestamp :: Lens.Lens' AssociatedClientDevice (Prelude.Maybe Prelude.UTCTime)
+associatedClientDevice_associationTimestamp = Lens.lens (\AssociatedClientDevice' {associationTimestamp} -> associationTimestamp) (\s@AssociatedClientDevice' {} a -> s {associationTimestamp = a} :: AssociatedClientDevice) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the IoT thing that represents the associated client device.
+associatedClientDevice_thingName :: Lens.Lens' AssociatedClientDevice (Prelude.Maybe Prelude.Text)
+associatedClientDevice_thingName = Lens.lens (\AssociatedClientDevice' {thingName} -> thingName) (\s@AssociatedClientDevice' {} a -> s {thingName = a} :: AssociatedClientDevice)
+
+instance Data.FromJSON AssociatedClientDevice where
+  parseJSON =
+    Data.withObject
+      "AssociatedClientDevice"
+      ( \x ->
+          AssociatedClientDevice'
+            Prelude.<$> (x Data..:? "associationTimestamp")
+            Prelude.<*> (x Data..:? "thingName")
+      )
+
+instance Prelude.Hashable AssociatedClientDevice where
+  hashWithSalt _salt AssociatedClientDevice' {..} =
+    _salt
+      `Prelude.hashWithSalt` associationTimestamp
+      `Prelude.hashWithSalt` thingName
+
+instance Prelude.NFData AssociatedClientDevice where
+  rnf AssociatedClientDevice' {..} =
+    Prelude.rnf associationTimestamp
+      `Prelude.seq` Prelude.rnf thingName
diff --git a/gen/Amazonka/GreengrassV2/Types/CloudComponentState.hs b/gen/Amazonka/GreengrassV2/Types/CloudComponentState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/CloudComponentState.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.GreengrassV2.Types.CloudComponentState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.CloudComponentState
+  ( CloudComponentState
+      ( ..,
+        CloudComponentState_DEPLOYABLE,
+        CloudComponentState_DEPRECATED,
+        CloudComponentState_FAILED,
+        CloudComponentState_INITIATED,
+        CloudComponentState_REQUESTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype CloudComponentState = CloudComponentState'
+  { fromCloudComponentState ::
+      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 CloudComponentState_DEPLOYABLE :: CloudComponentState
+pattern CloudComponentState_DEPLOYABLE = CloudComponentState' "DEPLOYABLE"
+
+pattern CloudComponentState_DEPRECATED :: CloudComponentState
+pattern CloudComponentState_DEPRECATED = CloudComponentState' "DEPRECATED"
+
+pattern CloudComponentState_FAILED :: CloudComponentState
+pattern CloudComponentState_FAILED = CloudComponentState' "FAILED"
+
+pattern CloudComponentState_INITIATED :: CloudComponentState
+pattern CloudComponentState_INITIATED = CloudComponentState' "INITIATED"
+
+pattern CloudComponentState_REQUESTED :: CloudComponentState
+pattern CloudComponentState_REQUESTED = CloudComponentState' "REQUESTED"
+
+{-# COMPLETE
+  CloudComponentState_DEPLOYABLE,
+  CloudComponentState_DEPRECATED,
+  CloudComponentState_FAILED,
+  CloudComponentState_INITIATED,
+  CloudComponentState_REQUESTED,
+  CloudComponentState'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/CloudComponentStatus.hs b/gen/Amazonka/GreengrassV2/Types/CloudComponentStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/CloudComponentStatus.hs
@@ -0,0 +1,184 @@
+{-# 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.GreengrassV2.Types.CloudComponentStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.CloudComponentStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.CloudComponentState
+import Amazonka.GreengrassV2.Types.VendorGuidance
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the status of a component version in the IoT Greengrass
+-- service.
+--
+-- /See:/ 'newCloudComponentStatus' smart constructor.
+data CloudComponentStatus = CloudComponentStatus'
+  { -- | The state of the component version.
+    componentState :: Prelude.Maybe CloudComponentState,
+    -- | A dictionary of errors that communicate why the component version is in
+    -- an error state. For example, if IoT Greengrass can\'t access an artifact
+    -- for the component version, then @errors@ contains the artifact\'s URI as
+    -- a key, and the error message as the value for that key.
+    errors :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A message that communicates details, such as errors, about the status of
+    -- the component version.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The vendor guidance state for the component version. This state
+    -- indicates whether the component version has any issues that you should
+    -- consider before you deploy it. The vendor guidance state can be:
+    --
+    -- -   @ACTIVE@ – This component version is available and recommended for
+    --     use.
+    --
+    -- -   @DISCONTINUED@ – This component version has been discontinued by its
+    --     publisher. You can deploy this component version, but we recommend
+    --     that you use a different version of this component.
+    --
+    -- -   @DELETED@ – This component version has been deleted by its
+    --     publisher, so you can\'t deploy it. If you have any existing
+    --     deployments that specify this component version, those deployments
+    --     will fail.
+    vendorGuidance :: Prelude.Maybe VendorGuidance,
+    -- | A message that communicates details about the vendor guidance state of
+    -- the component version. This message communicates why a component version
+    -- is discontinued or deleted.
+    vendorGuidanceMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CloudComponentStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentState', 'cloudComponentStatus_componentState' - The state of the component version.
+--
+-- 'errors', 'cloudComponentStatus_errors' - A dictionary of errors that communicate why the component version is in
+-- an error state. For example, if IoT Greengrass can\'t access an artifact
+-- for the component version, then @errors@ contains the artifact\'s URI as
+-- a key, and the error message as the value for that key.
+--
+-- 'message', 'cloudComponentStatus_message' - A message that communicates details, such as errors, about the status of
+-- the component version.
+--
+-- 'vendorGuidance', 'cloudComponentStatus_vendorGuidance' - The vendor guidance state for the component version. This state
+-- indicates whether the component version has any issues that you should
+-- consider before you deploy it. The vendor guidance state can be:
+--
+-- -   @ACTIVE@ – This component version is available and recommended for
+--     use.
+--
+-- -   @DISCONTINUED@ – This component version has been discontinued by its
+--     publisher. You can deploy this component version, but we recommend
+--     that you use a different version of this component.
+--
+-- -   @DELETED@ – This component version has been deleted by its
+--     publisher, so you can\'t deploy it. If you have any existing
+--     deployments that specify this component version, those deployments
+--     will fail.
+--
+-- 'vendorGuidanceMessage', 'cloudComponentStatus_vendorGuidanceMessage' - A message that communicates details about the vendor guidance state of
+-- the component version. This message communicates why a component version
+-- is discontinued or deleted.
+newCloudComponentStatus ::
+  CloudComponentStatus
+newCloudComponentStatus =
+  CloudComponentStatus'
+    { componentState =
+        Prelude.Nothing,
+      errors = Prelude.Nothing,
+      message = Prelude.Nothing,
+      vendorGuidance = Prelude.Nothing,
+      vendorGuidanceMessage = Prelude.Nothing
+    }
+
+-- | The state of the component version.
+cloudComponentStatus_componentState :: Lens.Lens' CloudComponentStatus (Prelude.Maybe CloudComponentState)
+cloudComponentStatus_componentState = Lens.lens (\CloudComponentStatus' {componentState} -> componentState) (\s@CloudComponentStatus' {} a -> s {componentState = a} :: CloudComponentStatus)
+
+-- | A dictionary of errors that communicate why the component version is in
+-- an error state. For example, if IoT Greengrass can\'t access an artifact
+-- for the component version, then @errors@ contains the artifact\'s URI as
+-- a key, and the error message as the value for that key.
+cloudComponentStatus_errors :: Lens.Lens' CloudComponentStatus (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+cloudComponentStatus_errors = Lens.lens (\CloudComponentStatus' {errors} -> errors) (\s@CloudComponentStatus' {} a -> s {errors = a} :: CloudComponentStatus) Prelude.. Lens.mapping Lens.coerced
+
+-- | A message that communicates details, such as errors, about the status of
+-- the component version.
+cloudComponentStatus_message :: Lens.Lens' CloudComponentStatus (Prelude.Maybe Prelude.Text)
+cloudComponentStatus_message = Lens.lens (\CloudComponentStatus' {message} -> message) (\s@CloudComponentStatus' {} a -> s {message = a} :: CloudComponentStatus)
+
+-- | The vendor guidance state for the component version. This state
+-- indicates whether the component version has any issues that you should
+-- consider before you deploy it. The vendor guidance state can be:
+--
+-- -   @ACTIVE@ – This component version is available and recommended for
+--     use.
+--
+-- -   @DISCONTINUED@ – This component version has been discontinued by its
+--     publisher. You can deploy this component version, but we recommend
+--     that you use a different version of this component.
+--
+-- -   @DELETED@ – This component version has been deleted by its
+--     publisher, so you can\'t deploy it. If you have any existing
+--     deployments that specify this component version, those deployments
+--     will fail.
+cloudComponentStatus_vendorGuidance :: Lens.Lens' CloudComponentStatus (Prelude.Maybe VendorGuidance)
+cloudComponentStatus_vendorGuidance = Lens.lens (\CloudComponentStatus' {vendorGuidance} -> vendorGuidance) (\s@CloudComponentStatus' {} a -> s {vendorGuidance = a} :: CloudComponentStatus)
+
+-- | A message that communicates details about the vendor guidance state of
+-- the component version. This message communicates why a component version
+-- is discontinued or deleted.
+cloudComponentStatus_vendorGuidanceMessage :: Lens.Lens' CloudComponentStatus (Prelude.Maybe Prelude.Text)
+cloudComponentStatus_vendorGuidanceMessage = Lens.lens (\CloudComponentStatus' {vendorGuidanceMessage} -> vendorGuidanceMessage) (\s@CloudComponentStatus' {} a -> s {vendorGuidanceMessage = a} :: CloudComponentStatus)
+
+instance Data.FromJSON CloudComponentStatus where
+  parseJSON =
+    Data.withObject
+      "CloudComponentStatus"
+      ( \x ->
+          CloudComponentStatus'
+            Prelude.<$> (x Data..:? "componentState")
+            Prelude.<*> (x Data..:? "errors" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "message")
+            Prelude.<*> (x Data..:? "vendorGuidance")
+            Prelude.<*> (x Data..:? "vendorGuidanceMessage")
+      )
+
+instance Prelude.Hashable CloudComponentStatus where
+  hashWithSalt _salt CloudComponentStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentState
+      `Prelude.hashWithSalt` errors
+      `Prelude.hashWithSalt` message
+      `Prelude.hashWithSalt` vendorGuidance
+      `Prelude.hashWithSalt` vendorGuidanceMessage
+
+instance Prelude.NFData CloudComponentStatus where
+  rnf CloudComponentStatus' {..} =
+    Prelude.rnf componentState
+      `Prelude.seq` Prelude.rnf errors
+      `Prelude.seq` Prelude.rnf message
+      `Prelude.seq` Prelude.rnf vendorGuidance
+      `Prelude.seq` Prelude.rnf vendorGuidanceMessage
diff --git a/gen/Amazonka/GreengrassV2/Types/Component.hs b/gen/Amazonka/GreengrassV2/Types/Component.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/Component.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.GreengrassV2.Types.Component
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.Component where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.ComponentLatestVersion
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a component.
+--
+-- /See:/ 'newComponent' smart constructor.
+data Component = Component'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The latest version of the component and its details.
+    latestVersion :: Prelude.Maybe ComponentLatestVersion
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Component' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'component_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+--
+-- 'componentName', 'component_componentName' - The name of the component.
+--
+-- 'latestVersion', 'component_latestVersion' - The latest version of the component and its details.
+newComponent ::
+  Component
+newComponent =
+  Component'
+    { arn = Prelude.Nothing,
+      componentName = Prelude.Nothing,
+      latestVersion = Prelude.Nothing
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+component_arn :: Lens.Lens' Component (Prelude.Maybe Prelude.Text)
+component_arn = Lens.lens (\Component' {arn} -> arn) (\s@Component' {} a -> s {arn = a} :: Component)
+
+-- | The name of the component.
+component_componentName :: Lens.Lens' Component (Prelude.Maybe Prelude.Text)
+component_componentName = Lens.lens (\Component' {componentName} -> componentName) (\s@Component' {} a -> s {componentName = a} :: Component)
+
+-- | The latest version of the component and its details.
+component_latestVersion :: Lens.Lens' Component (Prelude.Maybe ComponentLatestVersion)
+component_latestVersion = Lens.lens (\Component' {latestVersion} -> latestVersion) (\s@Component' {} a -> s {latestVersion = a} :: Component)
+
+instance Data.FromJSON Component where
+  parseJSON =
+    Data.withObject
+      "Component"
+      ( \x ->
+          Component'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "componentName")
+            Prelude.<*> (x Data..:? "latestVersion")
+      )
+
+instance Prelude.Hashable Component where
+  hashWithSalt _salt Component' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` latestVersion
+
+instance Prelude.NFData Component where
+  rnf Component' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf latestVersion
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentCandidate.hs b/gen/Amazonka/GreengrassV2/Types/ComponentCandidate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentCandidate.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.ComponentCandidate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentCandidate 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 a component that is a candidate to deploy to
+-- a Greengrass core device.
+--
+-- /See:/ 'newComponentCandidate' smart constructor.
+data ComponentCandidate = ComponentCandidate'
+  { -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The version requirements for the component\'s dependencies. Greengrass
+    -- core devices get the version requirements from component recipes.
+    --
+    -- IoT Greengrass V2 uses semantic version constraints. For more
+    -- information, see <https://semver.org/ Semantic Versioning>.
+    versionRequirements :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentCandidate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentName', 'componentCandidate_componentName' - The name of the component.
+--
+-- 'componentVersion', 'componentCandidate_componentVersion' - The version of the component.
+--
+-- 'versionRequirements', 'componentCandidate_versionRequirements' - The version requirements for the component\'s dependencies. Greengrass
+-- core devices get the version requirements from component recipes.
+--
+-- IoT Greengrass V2 uses semantic version constraints. For more
+-- information, see <https://semver.org/ Semantic Versioning>.
+newComponentCandidate ::
+  ComponentCandidate
+newComponentCandidate =
+  ComponentCandidate'
+    { componentName =
+        Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      versionRequirements = Prelude.Nothing
+    }
+
+-- | The name of the component.
+componentCandidate_componentName :: Lens.Lens' ComponentCandidate (Prelude.Maybe Prelude.Text)
+componentCandidate_componentName = Lens.lens (\ComponentCandidate' {componentName} -> componentName) (\s@ComponentCandidate' {} a -> s {componentName = a} :: ComponentCandidate)
+
+-- | The version of the component.
+componentCandidate_componentVersion :: Lens.Lens' ComponentCandidate (Prelude.Maybe Prelude.Text)
+componentCandidate_componentVersion = Lens.lens (\ComponentCandidate' {componentVersion} -> componentVersion) (\s@ComponentCandidate' {} a -> s {componentVersion = a} :: ComponentCandidate)
+
+-- | The version requirements for the component\'s dependencies. Greengrass
+-- core devices get the version requirements from component recipes.
+--
+-- IoT Greengrass V2 uses semantic version constraints. For more
+-- information, see <https://semver.org/ Semantic Versioning>.
+componentCandidate_versionRequirements :: Lens.Lens' ComponentCandidate (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+componentCandidate_versionRequirements = Lens.lens (\ComponentCandidate' {versionRequirements} -> versionRequirements) (\s@ComponentCandidate' {} a -> s {versionRequirements = a} :: ComponentCandidate) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable ComponentCandidate where
+  hashWithSalt _salt ComponentCandidate' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` versionRequirements
+
+instance Prelude.NFData ComponentCandidate where
+  rnf ComponentCandidate' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf versionRequirements
+
+instance Data.ToJSON ComponentCandidate where
+  toJSON ComponentCandidate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentName" Data..=) Prelude.<$> componentName,
+            ("componentVersion" Data..=)
+              Prelude.<$> componentVersion,
+            ("versionRequirements" Data..=)
+              Prelude.<$> versionRequirements
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentConfigurationUpdate.hs b/gen/Amazonka/GreengrassV2/Types/ComponentConfigurationUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentConfigurationUpdate.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.ComponentConfigurationUpdate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentConfigurationUpdate 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 a deployment\'s update to a component\'s
+-- configuration on Greengrass core devices. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html Update component configurations>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- /See:/ 'newComponentConfigurationUpdate' smart constructor.
+data ComponentConfigurationUpdate = ComponentConfigurationUpdate'
+  { -- | A serialized JSON string that contains the configuration object to merge
+    -- to target devices. The core device merges this configuration with the
+    -- component\'s existing configuration. If this is the first time a
+    -- component deploys on a device, the core device merges this configuration
+    -- with the component\'s default configuration. This means that the core
+    -- device keeps it\'s existing configuration for keys and values that you
+    -- don\'t specify in this object. For more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#merge-configuration-update Merge configuration updates>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    merge :: Prelude.Maybe Prelude.Text,
+    -- | The list of configuration nodes to reset to default values on target
+    -- devices. Use JSON pointers to specify each node to reset. JSON pointers
+    -- start with a forward slash (@\/@) and use forward slashes to separate
+    -- the key for each level in the object. For more information, see the
+    -- <https://tools.ietf.org/html/rfc6901 JSON pointer specification> and
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#reset-configuration-update Reset configuration updates>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    reset :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentConfigurationUpdate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'merge', 'componentConfigurationUpdate_merge' - A serialized JSON string that contains the configuration object to merge
+-- to target devices. The core device merges this configuration with the
+-- component\'s existing configuration. If this is the first time a
+-- component deploys on a device, the core device merges this configuration
+-- with the component\'s default configuration. This means that the core
+-- device keeps it\'s existing configuration for keys and values that you
+-- don\'t specify in this object. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#merge-configuration-update Merge configuration updates>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'reset', 'componentConfigurationUpdate_reset' - The list of configuration nodes to reset to default values on target
+-- devices. Use JSON pointers to specify each node to reset. JSON pointers
+-- start with a forward slash (@\/@) and use forward slashes to separate
+-- the key for each level in the object. For more information, see the
+-- <https://tools.ietf.org/html/rfc6901 JSON pointer specification> and
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#reset-configuration-update Reset configuration updates>
+-- in the /IoT Greengrass V2 Developer Guide/.
+newComponentConfigurationUpdate ::
+  ComponentConfigurationUpdate
+newComponentConfigurationUpdate =
+  ComponentConfigurationUpdate'
+    { merge =
+        Prelude.Nothing,
+      reset = Prelude.Nothing
+    }
+
+-- | A serialized JSON string that contains the configuration object to merge
+-- to target devices. The core device merges this configuration with the
+-- component\'s existing configuration. If this is the first time a
+-- component deploys on a device, the core device merges this configuration
+-- with the component\'s default configuration. This means that the core
+-- device keeps it\'s existing configuration for keys and values that you
+-- don\'t specify in this object. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#merge-configuration-update Merge configuration updates>
+-- in the /IoT Greengrass V2 Developer Guide/.
+componentConfigurationUpdate_merge :: Lens.Lens' ComponentConfigurationUpdate (Prelude.Maybe Prelude.Text)
+componentConfigurationUpdate_merge = Lens.lens (\ComponentConfigurationUpdate' {merge} -> merge) (\s@ComponentConfigurationUpdate' {} a -> s {merge = a} :: ComponentConfigurationUpdate)
+
+-- | The list of configuration nodes to reset to default values on target
+-- devices. Use JSON pointers to specify each node to reset. JSON pointers
+-- start with a forward slash (@\/@) and use forward slashes to separate
+-- the key for each level in the object. For more information, see the
+-- <https://tools.ietf.org/html/rfc6901 JSON pointer specification> and
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#reset-configuration-update Reset configuration updates>
+-- in the /IoT Greengrass V2 Developer Guide/.
+componentConfigurationUpdate_reset :: Lens.Lens' ComponentConfigurationUpdate (Prelude.Maybe [Prelude.Text])
+componentConfigurationUpdate_reset = Lens.lens (\ComponentConfigurationUpdate' {reset} -> reset) (\s@ComponentConfigurationUpdate' {} a -> s {reset = a} :: ComponentConfigurationUpdate) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ComponentConfigurationUpdate where
+  parseJSON =
+    Data.withObject
+      "ComponentConfigurationUpdate"
+      ( \x ->
+          ComponentConfigurationUpdate'
+            Prelude.<$> (x Data..:? "merge")
+            Prelude.<*> (x Data..:? "reset" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    ComponentConfigurationUpdate
+  where
+  hashWithSalt _salt ComponentConfigurationUpdate' {..} =
+    _salt
+      `Prelude.hashWithSalt` merge
+      `Prelude.hashWithSalt` reset
+
+instance Prelude.NFData ComponentConfigurationUpdate where
+  rnf ComponentConfigurationUpdate' {..} =
+    Prelude.rnf merge `Prelude.seq` Prelude.rnf reset
+
+instance Data.ToJSON ComponentConfigurationUpdate where
+  toJSON ComponentConfigurationUpdate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("merge" Data..=) Prelude.<$> merge,
+            ("reset" Data..=) Prelude.<$> reset
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentDependencyRequirement.hs b/gen/Amazonka/GreengrassV2/Types/ComponentDependencyRequirement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentDependencyRequirement.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.ComponentDependencyRequirement
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentDependencyRequirement where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.ComponentDependencyType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a component dependency for a Lambda function
+-- component.
+--
+-- /See:/ 'newComponentDependencyRequirement' smart constructor.
+data ComponentDependencyRequirement = ComponentDependencyRequirement'
+  { -- | The type of this dependency. Choose from the following options:
+    --
+    -- -   @SOFT@ – The component doesn\'t restart if the dependency changes
+    --     state.
+    --
+    -- -   @HARD@ – The component restarts if the dependency changes state.
+    --
+    -- Default: @HARD@
+    dependencyType :: Prelude.Maybe ComponentDependencyType,
+    -- | The component version requirement for the component dependency.
+    --
+    -- IoT Greengrass V2 uses semantic version constraints. For more
+    -- information, see <https://semver.org/ Semantic Versioning>.
+    versionRequirement :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentDependencyRequirement' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dependencyType', 'componentDependencyRequirement_dependencyType' - The type of this dependency. Choose from the following options:
+--
+-- -   @SOFT@ – The component doesn\'t restart if the dependency changes
+--     state.
+--
+-- -   @HARD@ – The component restarts if the dependency changes state.
+--
+-- Default: @HARD@
+--
+-- 'versionRequirement', 'componentDependencyRequirement_versionRequirement' - The component version requirement for the component dependency.
+--
+-- IoT Greengrass V2 uses semantic version constraints. For more
+-- information, see <https://semver.org/ Semantic Versioning>.
+newComponentDependencyRequirement ::
+  ComponentDependencyRequirement
+newComponentDependencyRequirement =
+  ComponentDependencyRequirement'
+    { dependencyType =
+        Prelude.Nothing,
+      versionRequirement = Prelude.Nothing
+    }
+
+-- | The type of this dependency. Choose from the following options:
+--
+-- -   @SOFT@ – The component doesn\'t restart if the dependency changes
+--     state.
+--
+-- -   @HARD@ – The component restarts if the dependency changes state.
+--
+-- Default: @HARD@
+componentDependencyRequirement_dependencyType :: Lens.Lens' ComponentDependencyRequirement (Prelude.Maybe ComponentDependencyType)
+componentDependencyRequirement_dependencyType = Lens.lens (\ComponentDependencyRequirement' {dependencyType} -> dependencyType) (\s@ComponentDependencyRequirement' {} a -> s {dependencyType = a} :: ComponentDependencyRequirement)
+
+-- | The component version requirement for the component dependency.
+--
+-- IoT Greengrass V2 uses semantic version constraints. For more
+-- information, see <https://semver.org/ Semantic Versioning>.
+componentDependencyRequirement_versionRequirement :: Lens.Lens' ComponentDependencyRequirement (Prelude.Maybe Prelude.Text)
+componentDependencyRequirement_versionRequirement = Lens.lens (\ComponentDependencyRequirement' {versionRequirement} -> versionRequirement) (\s@ComponentDependencyRequirement' {} a -> s {versionRequirement = a} :: ComponentDependencyRequirement)
+
+instance
+  Prelude.Hashable
+    ComponentDependencyRequirement
+  where
+  hashWithSalt
+    _salt
+    ComponentDependencyRequirement' {..} =
+      _salt
+        `Prelude.hashWithSalt` dependencyType
+        `Prelude.hashWithSalt` versionRequirement
+
+instance
+  Prelude.NFData
+    ComponentDependencyRequirement
+  where
+  rnf ComponentDependencyRequirement' {..} =
+    Prelude.rnf dependencyType
+      `Prelude.seq` Prelude.rnf versionRequirement
+
+instance Data.ToJSON ComponentDependencyRequirement where
+  toJSON ComponentDependencyRequirement' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dependencyType" Data..=)
+              Prelude.<$> dependencyType,
+            ("versionRequirement" Data..=)
+              Prelude.<$> versionRequirement
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentDependencyType.hs b/gen/Amazonka/GreengrassV2/Types/ComponentDependencyType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentDependencyType.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.GreengrassV2.Types.ComponentDependencyType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentDependencyType
+  ( ComponentDependencyType
+      ( ..,
+        ComponentDependencyType_HARD,
+        ComponentDependencyType_SOFT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ComponentDependencyType = ComponentDependencyType'
+  { fromComponentDependencyType ::
+      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 ComponentDependencyType_HARD :: ComponentDependencyType
+pattern ComponentDependencyType_HARD = ComponentDependencyType' "HARD"
+
+pattern ComponentDependencyType_SOFT :: ComponentDependencyType
+pattern ComponentDependencyType_SOFT = ComponentDependencyType' "SOFT"
+
+{-# COMPLETE
+  ComponentDependencyType_HARD,
+  ComponentDependencyType_SOFT,
+  ComponentDependencyType'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentDeploymentSpecification.hs b/gen/Amazonka/GreengrassV2/Types/ComponentDeploymentSpecification.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentDeploymentSpecification.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.ComponentDeploymentSpecification
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentDeploymentSpecification where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.ComponentConfigurationUpdate
+import Amazonka.GreengrassV2.Types.ComponentRunWith
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a component to deploy.
+--
+-- /See:/ 'newComponentDeploymentSpecification' smart constructor.
+data ComponentDeploymentSpecification = ComponentDeploymentSpecification'
+  { -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The configuration updates to deploy for the component. You can define
+    -- /reset/ updates and /merge/ updates. A reset updates the keys that you
+    -- specify to the default configuration for the component. A merge updates
+    -- the core device\'s component configuration with the keys and values that
+    -- you specify. The IoT Greengrass Core software applies reset updates
+    -- before it applies merge updates. For more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html Update component configurations>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    configurationUpdate :: Prelude.Maybe ComponentConfigurationUpdate,
+    -- | The system user and group that the IoT Greengrass Core software uses to
+    -- run component processes on the core device. If you omit this parameter,
+    -- the IoT Greengrass Core software uses the system user and group that you
+    -- configure for the core device. For more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    runWith :: Prelude.Maybe ComponentRunWith
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentDeploymentSpecification' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentVersion', 'componentDeploymentSpecification_componentVersion' - The version of the component.
+--
+-- 'configurationUpdate', 'componentDeploymentSpecification_configurationUpdate' - The configuration updates to deploy for the component. You can define
+-- /reset/ updates and /merge/ updates. A reset updates the keys that you
+-- specify to the default configuration for the component. A merge updates
+-- the core device\'s component configuration with the keys and values that
+-- you specify. The IoT Greengrass Core software applies reset updates
+-- before it applies merge updates. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html Update component configurations>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'runWith', 'componentDeploymentSpecification_runWith' - The system user and group that the IoT Greengrass Core software uses to
+-- run component processes on the core device. If you omit this parameter,
+-- the IoT Greengrass Core software uses the system user and group that you
+-- configure for the core device. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>
+-- in the /IoT Greengrass V2 Developer Guide/.
+newComponentDeploymentSpecification ::
+  ComponentDeploymentSpecification
+newComponentDeploymentSpecification =
+  ComponentDeploymentSpecification'
+    { componentVersion =
+        Prelude.Nothing,
+      configurationUpdate = Prelude.Nothing,
+      runWith = Prelude.Nothing
+    }
+
+-- | The version of the component.
+componentDeploymentSpecification_componentVersion :: Lens.Lens' ComponentDeploymentSpecification (Prelude.Maybe Prelude.Text)
+componentDeploymentSpecification_componentVersion = Lens.lens (\ComponentDeploymentSpecification' {componentVersion} -> componentVersion) (\s@ComponentDeploymentSpecification' {} a -> s {componentVersion = a} :: ComponentDeploymentSpecification)
+
+-- | The configuration updates to deploy for the component. You can define
+-- /reset/ updates and /merge/ updates. A reset updates the keys that you
+-- specify to the default configuration for the component. A merge updates
+-- the core device\'s component configuration with the keys and values that
+-- you specify. The IoT Greengrass Core software applies reset updates
+-- before it applies merge updates. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html Update component configurations>
+-- in the /IoT Greengrass V2 Developer Guide/.
+componentDeploymentSpecification_configurationUpdate :: Lens.Lens' ComponentDeploymentSpecification (Prelude.Maybe ComponentConfigurationUpdate)
+componentDeploymentSpecification_configurationUpdate = Lens.lens (\ComponentDeploymentSpecification' {configurationUpdate} -> configurationUpdate) (\s@ComponentDeploymentSpecification' {} a -> s {configurationUpdate = a} :: ComponentDeploymentSpecification)
+
+-- | The system user and group that the IoT Greengrass Core software uses to
+-- run component processes on the core device. If you omit this parameter,
+-- the IoT Greengrass Core software uses the system user and group that you
+-- configure for the core device. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>
+-- in the /IoT Greengrass V2 Developer Guide/.
+componentDeploymentSpecification_runWith :: Lens.Lens' ComponentDeploymentSpecification (Prelude.Maybe ComponentRunWith)
+componentDeploymentSpecification_runWith = Lens.lens (\ComponentDeploymentSpecification' {runWith} -> runWith) (\s@ComponentDeploymentSpecification' {} a -> s {runWith = a} :: ComponentDeploymentSpecification)
+
+instance
+  Data.FromJSON
+    ComponentDeploymentSpecification
+  where
+  parseJSON =
+    Data.withObject
+      "ComponentDeploymentSpecification"
+      ( \x ->
+          ComponentDeploymentSpecification'
+            Prelude.<$> (x Data..:? "componentVersion")
+            Prelude.<*> (x Data..:? "configurationUpdate")
+            Prelude.<*> (x Data..:? "runWith")
+      )
+
+instance
+  Prelude.Hashable
+    ComponentDeploymentSpecification
+  where
+  hashWithSalt
+    _salt
+    ComponentDeploymentSpecification' {..} =
+      _salt
+        `Prelude.hashWithSalt` componentVersion
+        `Prelude.hashWithSalt` configurationUpdate
+        `Prelude.hashWithSalt` runWith
+
+instance
+  Prelude.NFData
+    ComponentDeploymentSpecification
+  where
+  rnf ComponentDeploymentSpecification' {..} =
+    Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf configurationUpdate
+      `Prelude.seq` Prelude.rnf runWith
+
+instance Data.ToJSON ComponentDeploymentSpecification where
+  toJSON ComponentDeploymentSpecification' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentVersion" Data..=)
+              Prelude.<$> componentVersion,
+            ("configurationUpdate" Data..=)
+              Prelude.<$> configurationUpdate,
+            ("runWith" Data..=) Prelude.<$> runWith
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentLatestVersion.hs b/gen/Amazonka/GreengrassV2/Types/ComponentLatestVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentLatestVersion.hs
@@ -0,0 +1,142 @@
+{-# 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.GreengrassV2.Types.ComponentLatestVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentLatestVersion where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.ComponentPlatform
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the latest version of a component.
+--
+-- /See:/ 'newComponentLatestVersion' smart constructor.
+data ComponentLatestVersion = ComponentLatestVersion'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the component was created, expressed in ISO 8601
+    -- format.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The description of the component version.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The platforms that the component version supports.
+    platforms :: Prelude.Maybe [ComponentPlatform],
+    -- | The publisher of the component version.
+    publisher :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentLatestVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'componentLatestVersion_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+--
+-- 'componentVersion', 'componentLatestVersion_componentVersion' - The version of the component.
+--
+-- 'creationTimestamp', 'componentLatestVersion_creationTimestamp' - The time at which the component was created, expressed in ISO 8601
+-- format.
+--
+-- 'description', 'componentLatestVersion_description' - The description of the component version.
+--
+-- 'platforms', 'componentLatestVersion_platforms' - The platforms that the component version supports.
+--
+-- 'publisher', 'componentLatestVersion_publisher' - The publisher of the component version.
+newComponentLatestVersion ::
+  ComponentLatestVersion
+newComponentLatestVersion =
+  ComponentLatestVersion'
+    { arn = Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      creationTimestamp = Prelude.Nothing,
+      description = Prelude.Nothing,
+      platforms = Prelude.Nothing,
+      publisher = Prelude.Nothing
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+componentLatestVersion_arn :: Lens.Lens' ComponentLatestVersion (Prelude.Maybe Prelude.Text)
+componentLatestVersion_arn = Lens.lens (\ComponentLatestVersion' {arn} -> arn) (\s@ComponentLatestVersion' {} a -> s {arn = a} :: ComponentLatestVersion)
+
+-- | The version of the component.
+componentLatestVersion_componentVersion :: Lens.Lens' ComponentLatestVersion (Prelude.Maybe Prelude.Text)
+componentLatestVersion_componentVersion = Lens.lens (\ComponentLatestVersion' {componentVersion} -> componentVersion) (\s@ComponentLatestVersion' {} a -> s {componentVersion = a} :: ComponentLatestVersion)
+
+-- | The time at which the component was created, expressed in ISO 8601
+-- format.
+componentLatestVersion_creationTimestamp :: Lens.Lens' ComponentLatestVersion (Prelude.Maybe Prelude.UTCTime)
+componentLatestVersion_creationTimestamp = Lens.lens (\ComponentLatestVersion' {creationTimestamp} -> creationTimestamp) (\s@ComponentLatestVersion' {} a -> s {creationTimestamp = a} :: ComponentLatestVersion) Prelude.. Lens.mapping Data._Time
+
+-- | The description of the component version.
+componentLatestVersion_description :: Lens.Lens' ComponentLatestVersion (Prelude.Maybe Prelude.Text)
+componentLatestVersion_description = Lens.lens (\ComponentLatestVersion' {description} -> description) (\s@ComponentLatestVersion' {} a -> s {description = a} :: ComponentLatestVersion)
+
+-- | The platforms that the component version supports.
+componentLatestVersion_platforms :: Lens.Lens' ComponentLatestVersion (Prelude.Maybe [ComponentPlatform])
+componentLatestVersion_platforms = Lens.lens (\ComponentLatestVersion' {platforms} -> platforms) (\s@ComponentLatestVersion' {} a -> s {platforms = a} :: ComponentLatestVersion) Prelude.. Lens.mapping Lens.coerced
+
+-- | The publisher of the component version.
+componentLatestVersion_publisher :: Lens.Lens' ComponentLatestVersion (Prelude.Maybe Prelude.Text)
+componentLatestVersion_publisher = Lens.lens (\ComponentLatestVersion' {publisher} -> publisher) (\s@ComponentLatestVersion' {} a -> s {publisher = a} :: ComponentLatestVersion)
+
+instance Data.FromJSON ComponentLatestVersion where
+  parseJSON =
+    Data.withObject
+      "ComponentLatestVersion"
+      ( \x ->
+          ComponentLatestVersion'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "componentVersion")
+            Prelude.<*> (x Data..:? "creationTimestamp")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "platforms" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "publisher")
+      )
+
+instance Prelude.Hashable ComponentLatestVersion where
+  hashWithSalt _salt ComponentLatestVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` platforms
+      `Prelude.hashWithSalt` publisher
+
+instance Prelude.NFData ComponentLatestVersion where
+  rnf ComponentLatestVersion' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf platforms
+      `Prelude.seq` Prelude.rnf publisher
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentPlatform.hs b/gen/Amazonka/GreengrassV2/Types/ComponentPlatform.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentPlatform.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.GreengrassV2.Types.ComponentPlatform
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentPlatform 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 a platform that a component supports.
+--
+-- /See:/ 'newComponentPlatform' smart constructor.
+data ComponentPlatform = ComponentPlatform'
+  { -- | A dictionary of attributes for the platform. The IoT Greengrass Core
+    -- software defines the @os@ and @architecture@ by default. You can specify
+    -- additional platform attributes for a core device when you deploy the
+    -- Greengrass nucleus component. For more information, see the
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html Greengrass nucleus component>
+    -- in the /IoT Greengrass V2 Developer Guide/.
+    attributes :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The friendly name of the platform. This name helps you identify the
+    -- platform.
+    --
+    -- If you omit this parameter, IoT Greengrass creates a friendly name from
+    -- the @os@ and @architecture@ of the platform.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentPlatform' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attributes', 'componentPlatform_attributes' - A dictionary of attributes for the platform. The IoT Greengrass Core
+-- software defines the @os@ and @architecture@ by default. You can specify
+-- additional platform attributes for a core device when you deploy the
+-- Greengrass nucleus component. For more information, see the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html Greengrass nucleus component>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- 'name', 'componentPlatform_name' - The friendly name of the platform. This name helps you identify the
+-- platform.
+--
+-- If you omit this parameter, IoT Greengrass creates a friendly name from
+-- the @os@ and @architecture@ of the platform.
+newComponentPlatform ::
+  ComponentPlatform
+newComponentPlatform =
+  ComponentPlatform'
+    { attributes = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | A dictionary of attributes for the platform. The IoT Greengrass Core
+-- software defines the @os@ and @architecture@ by default. You can specify
+-- additional platform attributes for a core device when you deploy the
+-- Greengrass nucleus component. For more information, see the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html Greengrass nucleus component>
+-- in the /IoT Greengrass V2 Developer Guide/.
+componentPlatform_attributes :: Lens.Lens' ComponentPlatform (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+componentPlatform_attributes = Lens.lens (\ComponentPlatform' {attributes} -> attributes) (\s@ComponentPlatform' {} a -> s {attributes = a} :: ComponentPlatform) Prelude.. Lens.mapping Lens.coerced
+
+-- | The friendly name of the platform. This name helps you identify the
+-- platform.
+--
+-- If you omit this parameter, IoT Greengrass creates a friendly name from
+-- the @os@ and @architecture@ of the platform.
+componentPlatform_name :: Lens.Lens' ComponentPlatform (Prelude.Maybe Prelude.Text)
+componentPlatform_name = Lens.lens (\ComponentPlatform' {name} -> name) (\s@ComponentPlatform' {} a -> s {name = a} :: ComponentPlatform)
+
+instance Data.FromJSON ComponentPlatform where
+  parseJSON =
+    Data.withObject
+      "ComponentPlatform"
+      ( \x ->
+          ComponentPlatform'
+            Prelude.<$> (x Data..:? "attributes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "name")
+      )
+
+instance Prelude.Hashable ComponentPlatform where
+  hashWithSalt _salt ComponentPlatform' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributes
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ComponentPlatform where
+  rnf ComponentPlatform' {..} =
+    Prelude.rnf attributes
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON ComponentPlatform where
+  toJSON ComponentPlatform' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("attributes" Data..=) Prelude.<$> attributes,
+            ("name" Data..=) Prelude.<$> name
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentRunWith.hs b/gen/Amazonka/GreengrassV2/Types/ComponentRunWith.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentRunWith.hs
@@ -0,0 +1,187 @@
+{-# 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.GreengrassV2.Types.ComponentRunWith
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentRunWith where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.SystemResourceLimits
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information system user and group that the IoT Greengrass Core
+-- software uses to run component processes on the core device. For more
+-- information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- /See:/ 'newComponentRunWith' smart constructor.
+data ComponentRunWith = ComponentRunWith'
+  { -- | The POSIX system user and, optionally, group to use to run this
+    -- component on Linux core devices. The user, and group if specified, must
+    -- exist on each Linux core device. Specify the user and group separated by
+    -- a colon (@:@) in the following format: @user:group@. The group is
+    -- optional. If you don\'t specify a group, the IoT Greengrass Core
+    -- software uses the primary user for the group.
+    --
+    -- If you omit this parameter, the IoT Greengrass Core software uses the
+    -- default system user and group that you configure on the Greengrass
+    -- nucleus component. For more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>.
+    posixUser :: Prelude.Maybe Prelude.Text,
+    -- | The system resource limits to apply to this component\'s process on the
+    -- core device. IoT Greengrass currently supports this feature on only
+    -- Linux core devices.
+    --
+    -- If you omit this parameter, the IoT Greengrass Core software uses the
+    -- default system resource limits that you configure on the Greengrass
+    -- nucleus component. For more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-system-resource-limits Configure system resource limits for components>.
+    systemResourceLimits :: Prelude.Maybe SystemResourceLimits,
+    -- | The Windows user to use to run this component on Windows core devices.
+    -- The user must exist on each Windows core device, and its name and
+    -- password must be in the LocalSystem account\'s Credentials Manager
+    -- instance.
+    --
+    -- If you omit this parameter, the IoT Greengrass Core software uses the
+    -- default Windows user that you configure on the Greengrass nucleus
+    -- component. For more information, see
+    -- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>.
+    windowsUser :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentRunWith' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'posixUser', 'componentRunWith_posixUser' - The POSIX system user and, optionally, group to use to run this
+-- component on Linux core devices. The user, and group if specified, must
+-- exist on each Linux core device. Specify the user and group separated by
+-- a colon (@:@) in the following format: @user:group@. The group is
+-- optional. If you don\'t specify a group, the IoT Greengrass Core
+-- software uses the primary user for the group.
+--
+-- If you omit this parameter, the IoT Greengrass Core software uses the
+-- default system user and group that you configure on the Greengrass
+-- nucleus component. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>.
+--
+-- 'systemResourceLimits', 'componentRunWith_systemResourceLimits' - The system resource limits to apply to this component\'s process on the
+-- core device. IoT Greengrass currently supports this feature on only
+-- Linux core devices.
+--
+-- If you omit this parameter, the IoT Greengrass Core software uses the
+-- default system resource limits that you configure on the Greengrass
+-- nucleus component. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-system-resource-limits Configure system resource limits for components>.
+--
+-- 'windowsUser', 'componentRunWith_windowsUser' - The Windows user to use to run this component on Windows core devices.
+-- The user must exist on each Windows core device, and its name and
+-- password must be in the LocalSystem account\'s Credentials Manager
+-- instance.
+--
+-- If you omit this parameter, the IoT Greengrass Core software uses the
+-- default Windows user that you configure on the Greengrass nucleus
+-- component. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>.
+newComponentRunWith ::
+  ComponentRunWith
+newComponentRunWith =
+  ComponentRunWith'
+    { posixUser = Prelude.Nothing,
+      systemResourceLimits = Prelude.Nothing,
+      windowsUser = Prelude.Nothing
+    }
+
+-- | The POSIX system user and, optionally, group to use to run this
+-- component on Linux core devices. The user, and group if specified, must
+-- exist on each Linux core device. Specify the user and group separated by
+-- a colon (@:@) in the following format: @user:group@. The group is
+-- optional. If you don\'t specify a group, the IoT Greengrass Core
+-- software uses the primary user for the group.
+--
+-- If you omit this parameter, the IoT Greengrass Core software uses the
+-- default system user and group that you configure on the Greengrass
+-- nucleus component. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>.
+componentRunWith_posixUser :: Lens.Lens' ComponentRunWith (Prelude.Maybe Prelude.Text)
+componentRunWith_posixUser = Lens.lens (\ComponentRunWith' {posixUser} -> posixUser) (\s@ComponentRunWith' {} a -> s {posixUser = a} :: ComponentRunWith)
+
+-- | The system resource limits to apply to this component\'s process on the
+-- core device. IoT Greengrass currently supports this feature on only
+-- Linux core devices.
+--
+-- If you omit this parameter, the IoT Greengrass Core software uses the
+-- default system resource limits that you configure on the Greengrass
+-- nucleus component. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-system-resource-limits Configure system resource limits for components>.
+componentRunWith_systemResourceLimits :: Lens.Lens' ComponentRunWith (Prelude.Maybe SystemResourceLimits)
+componentRunWith_systemResourceLimits = Lens.lens (\ComponentRunWith' {systemResourceLimits} -> systemResourceLimits) (\s@ComponentRunWith' {} a -> s {systemResourceLimits = a} :: ComponentRunWith)
+
+-- | The Windows user to use to run this component on Windows core devices.
+-- The user must exist on each Windows core device, and its name and
+-- password must be in the LocalSystem account\'s Credentials Manager
+-- instance.
+--
+-- If you omit this parameter, the IoT Greengrass Core software uses the
+-- default Windows user that you configure on the Greengrass nucleus
+-- component. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user Configure the user and group that run components>.
+componentRunWith_windowsUser :: Lens.Lens' ComponentRunWith (Prelude.Maybe Prelude.Text)
+componentRunWith_windowsUser = Lens.lens (\ComponentRunWith' {windowsUser} -> windowsUser) (\s@ComponentRunWith' {} a -> s {windowsUser = a} :: ComponentRunWith)
+
+instance Data.FromJSON ComponentRunWith where
+  parseJSON =
+    Data.withObject
+      "ComponentRunWith"
+      ( \x ->
+          ComponentRunWith'
+            Prelude.<$> (x Data..:? "posixUser")
+            Prelude.<*> (x Data..:? "systemResourceLimits")
+            Prelude.<*> (x Data..:? "windowsUser")
+      )
+
+instance Prelude.Hashable ComponentRunWith where
+  hashWithSalt _salt ComponentRunWith' {..} =
+    _salt
+      `Prelude.hashWithSalt` posixUser
+      `Prelude.hashWithSalt` systemResourceLimits
+      `Prelude.hashWithSalt` windowsUser
+
+instance Prelude.NFData ComponentRunWith where
+  rnf ComponentRunWith' {..} =
+    Prelude.rnf posixUser
+      `Prelude.seq` Prelude.rnf systemResourceLimits
+      `Prelude.seq` Prelude.rnf windowsUser
+
+instance Data.ToJSON ComponentRunWith where
+  toJSON ComponentRunWith' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("posixUser" Data..=) Prelude.<$> posixUser,
+            ("systemResourceLimits" Data..=)
+              Prelude.<$> systemResourceLimits,
+            ("windowsUser" Data..=) Prelude.<$> windowsUser
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentVersionListItem.hs b/gen/Amazonka/GreengrassV2/Types/ComponentVersionListItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentVersionListItem.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.ComponentVersionListItem
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentVersionListItem 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 a component version in a list.
+--
+-- /See:/ 'newComponentVersionListItem' smart constructor.
+data ComponentVersionListItem = ComponentVersionListItem'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentVersionListItem' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'componentVersionListItem_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+--
+-- 'componentName', 'componentVersionListItem_componentName' - The name of the component.
+--
+-- 'componentVersion', 'componentVersionListItem_componentVersion' - The version of the component.
+newComponentVersionListItem ::
+  ComponentVersionListItem
+newComponentVersionListItem =
+  ComponentVersionListItem'
+    { arn = Prelude.Nothing,
+      componentName = Prelude.Nothing,
+      componentVersion = Prelude.Nothing
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+componentVersionListItem_arn :: Lens.Lens' ComponentVersionListItem (Prelude.Maybe Prelude.Text)
+componentVersionListItem_arn = Lens.lens (\ComponentVersionListItem' {arn} -> arn) (\s@ComponentVersionListItem' {} a -> s {arn = a} :: ComponentVersionListItem)
+
+-- | The name of the component.
+componentVersionListItem_componentName :: Lens.Lens' ComponentVersionListItem (Prelude.Maybe Prelude.Text)
+componentVersionListItem_componentName = Lens.lens (\ComponentVersionListItem' {componentName} -> componentName) (\s@ComponentVersionListItem' {} a -> s {componentName = a} :: ComponentVersionListItem)
+
+-- | The version of the component.
+componentVersionListItem_componentVersion :: Lens.Lens' ComponentVersionListItem (Prelude.Maybe Prelude.Text)
+componentVersionListItem_componentVersion = Lens.lens (\ComponentVersionListItem' {componentVersion} -> componentVersion) (\s@ComponentVersionListItem' {} a -> s {componentVersion = a} :: ComponentVersionListItem)
+
+instance Data.FromJSON ComponentVersionListItem where
+  parseJSON =
+    Data.withObject
+      "ComponentVersionListItem"
+      ( \x ->
+          ComponentVersionListItem'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "componentName")
+            Prelude.<*> (x Data..:? "componentVersion")
+      )
+
+instance Prelude.Hashable ComponentVersionListItem where
+  hashWithSalt _salt ComponentVersionListItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentVersion
+
+instance Prelude.NFData ComponentVersionListItem where
+  rnf ComponentVersionListItem' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
diff --git a/gen/Amazonka/GreengrassV2/Types/ComponentVisibilityScope.hs b/gen/Amazonka/GreengrassV2/Types/ComponentVisibilityScope.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ComponentVisibilityScope.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.GreengrassV2.Types.ComponentVisibilityScope
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ComponentVisibilityScope
+  ( ComponentVisibilityScope
+      ( ..,
+        ComponentVisibilityScope_PRIVATE,
+        ComponentVisibilityScope_PUBLIC
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ComponentVisibilityScope = ComponentVisibilityScope'
+  { fromComponentVisibilityScope ::
+      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 ComponentVisibilityScope_PRIVATE :: ComponentVisibilityScope
+pattern ComponentVisibilityScope_PRIVATE = ComponentVisibilityScope' "PRIVATE"
+
+pattern ComponentVisibilityScope_PUBLIC :: ComponentVisibilityScope
+pattern ComponentVisibilityScope_PUBLIC = ComponentVisibilityScope' "PUBLIC"
+
+{-# COMPLETE
+  ComponentVisibilityScope_PRIVATE,
+  ComponentVisibilityScope_PUBLIC,
+  ComponentVisibilityScope'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/ConnectivityInfo.hs b/gen/Amazonka/GreengrassV2/Types/ConnectivityInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ConnectivityInfo.hs
@@ -0,0 +1,132 @@
+{-# 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.GreengrassV2.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.GreengrassV2.Types.ConnectivityInfo 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 an endpoint and port where client devices can
+-- connect to an MQTT broker on a Greengrass core device.
+--
+-- /See:/ 'newConnectivityInfo' smart constructor.
+data ConnectivityInfo = ConnectivityInfo'
+  { -- | The IP address or DNS address where client devices can connect to an
+    -- MQTT broker on the Greengrass core device.
+    hostAddress :: Prelude.Maybe Prelude.Text,
+    -- | An ID for the connectivity information.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | Additional metadata to provide to client devices that connect to this
+    -- core device.
+    metadata :: Prelude.Maybe Prelude.Text,
+    -- | The port where the MQTT broker operates on the core device. This port is
+    -- typically 8883, which is the default port for the MQTT broker component
+    -- that runs on core devices.
+    portNumber :: Prelude.Maybe Prelude.Natural
+  }
+  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:
+--
+-- 'hostAddress', 'connectivityInfo_hostAddress' - The IP address or DNS address where client devices can connect to an
+-- MQTT broker on the Greengrass core device.
+--
+-- 'id', 'connectivityInfo_id' - An ID for the connectivity information.
+--
+-- 'metadata', 'connectivityInfo_metadata' - Additional metadata to provide to client devices that connect to this
+-- core device.
+--
+-- 'portNumber', 'connectivityInfo_portNumber' - The port where the MQTT broker operates on the core device. This port is
+-- typically 8883, which is the default port for the MQTT broker component
+-- that runs on core devices.
+newConnectivityInfo ::
+  ConnectivityInfo
+newConnectivityInfo =
+  ConnectivityInfo'
+    { hostAddress = Prelude.Nothing,
+      id = Prelude.Nothing,
+      metadata = Prelude.Nothing,
+      portNumber = Prelude.Nothing
+    }
+
+-- | The IP address or DNS address where client devices can connect to an
+-- MQTT broker on the Greengrass core device.
+connectivityInfo_hostAddress :: Lens.Lens' ConnectivityInfo (Prelude.Maybe Prelude.Text)
+connectivityInfo_hostAddress = Lens.lens (\ConnectivityInfo' {hostAddress} -> hostAddress) (\s@ConnectivityInfo' {} a -> s {hostAddress = a} :: ConnectivityInfo)
+
+-- | An ID for the connectivity information.
+connectivityInfo_id :: Lens.Lens' ConnectivityInfo (Prelude.Maybe Prelude.Text)
+connectivityInfo_id = Lens.lens (\ConnectivityInfo' {id} -> id) (\s@ConnectivityInfo' {} a -> s {id = a} :: ConnectivityInfo)
+
+-- | Additional metadata to provide to client devices that connect to this
+-- core device.
+connectivityInfo_metadata :: Lens.Lens' ConnectivityInfo (Prelude.Maybe Prelude.Text)
+connectivityInfo_metadata = Lens.lens (\ConnectivityInfo' {metadata} -> metadata) (\s@ConnectivityInfo' {} a -> s {metadata = a} :: ConnectivityInfo)
+
+-- | The port where the MQTT broker operates on the core device. This port is
+-- typically 8883, which is the default port for the MQTT broker component
+-- that runs on core devices.
+connectivityInfo_portNumber :: Lens.Lens' ConnectivityInfo (Prelude.Maybe Prelude.Natural)
+connectivityInfo_portNumber = Lens.lens (\ConnectivityInfo' {portNumber} -> portNumber) (\s@ConnectivityInfo' {} a -> s {portNumber = a} :: ConnectivityInfo)
+
+instance Data.FromJSON ConnectivityInfo where
+  parseJSON =
+    Data.withObject
+      "ConnectivityInfo"
+      ( \x ->
+          ConnectivityInfo'
+            Prelude.<$> (x Data..:? "HostAddress")
+            Prelude.<*> (x Data..:? "Id")
+            Prelude.<*> (x Data..:? "Metadata")
+            Prelude.<*> (x Data..:? "PortNumber")
+      )
+
+instance Prelude.Hashable ConnectivityInfo where
+  hashWithSalt _salt ConnectivityInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` hostAddress
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` portNumber
+
+instance Prelude.NFData ConnectivityInfo where
+  rnf ConnectivityInfo' {..} =
+    Prelude.rnf hostAddress
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf portNumber
+
+instance Data.ToJSON ConnectivityInfo where
+  toJSON ConnectivityInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("HostAddress" Data..=) Prelude.<$> hostAddress,
+            ("Id" Data..=) Prelude.<$> id,
+            ("Metadata" Data..=) Prelude.<$> metadata,
+            ("PortNumber" Data..=) Prelude.<$> portNumber
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/CoreDevice.hs b/gen/Amazonka/GreengrassV2/Types/CoreDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/CoreDevice.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.CoreDevice
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.CoreDevice where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.CoreDeviceStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a Greengrass core device, which is an IoT
+-- thing that runs the IoT Greengrass Core software.
+--
+-- /See:/ 'newCoreDevice' smart constructor.
+data CoreDevice = CoreDevice'
+  { -- | The name of the core device. This is also the name of the IoT thing.
+    coreDeviceThingName :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the core device\'s status last updated, expressed in
+    -- ISO 8601 format.
+    lastStatusUpdateTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The status of the core device. Core devices can have the following
+    -- statuses:
+    --
+    -- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+    --     on the core device without issue.
+    --
+    -- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+    --     a failed state on the core device.
+    status :: Prelude.Maybe CoreDeviceStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CoreDevice' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'coreDeviceThingName', 'coreDevice_coreDeviceThingName' - The name of the core device. This is also the name of the IoT thing.
+--
+-- 'lastStatusUpdateTimestamp', 'coreDevice_lastStatusUpdateTimestamp' - The time at which the core device\'s status last updated, expressed in
+-- ISO 8601 format.
+--
+-- 'status', 'coreDevice_status' - The status of the core device. Core devices can have the following
+-- statuses:
+--
+-- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+--     on the core device without issue.
+--
+-- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+--     a failed state on the core device.
+newCoreDevice ::
+  CoreDevice
+newCoreDevice =
+  CoreDevice'
+    { coreDeviceThingName = Prelude.Nothing,
+      lastStatusUpdateTimestamp = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The name of the core device. This is also the name of the IoT thing.
+coreDevice_coreDeviceThingName :: Lens.Lens' CoreDevice (Prelude.Maybe Prelude.Text)
+coreDevice_coreDeviceThingName = Lens.lens (\CoreDevice' {coreDeviceThingName} -> coreDeviceThingName) (\s@CoreDevice' {} a -> s {coreDeviceThingName = a} :: CoreDevice)
+
+-- | The time at which the core device\'s status last updated, expressed in
+-- ISO 8601 format.
+coreDevice_lastStatusUpdateTimestamp :: Lens.Lens' CoreDevice (Prelude.Maybe Prelude.UTCTime)
+coreDevice_lastStatusUpdateTimestamp = Lens.lens (\CoreDevice' {lastStatusUpdateTimestamp} -> lastStatusUpdateTimestamp) (\s@CoreDevice' {} a -> s {lastStatusUpdateTimestamp = a} :: CoreDevice) Prelude.. Lens.mapping Data._Time
+
+-- | The status of the core device. Core devices can have the following
+-- statuses:
+--
+-- -   @HEALTHY@ – The IoT Greengrass Core software and all components run
+--     on the core device without issue.
+--
+-- -   @UNHEALTHY@ – The IoT Greengrass Core software or a component is in
+--     a failed state on the core device.
+coreDevice_status :: Lens.Lens' CoreDevice (Prelude.Maybe CoreDeviceStatus)
+coreDevice_status = Lens.lens (\CoreDevice' {status} -> status) (\s@CoreDevice' {} a -> s {status = a} :: CoreDevice)
+
+instance Data.FromJSON CoreDevice where
+  parseJSON =
+    Data.withObject
+      "CoreDevice"
+      ( \x ->
+          CoreDevice'
+            Prelude.<$> (x Data..:? "coreDeviceThingName")
+            Prelude.<*> (x Data..:? "lastStatusUpdateTimestamp")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable CoreDevice where
+  hashWithSalt _salt CoreDevice' {..} =
+    _salt
+      `Prelude.hashWithSalt` coreDeviceThingName
+      `Prelude.hashWithSalt` lastStatusUpdateTimestamp
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData CoreDevice where
+  rnf CoreDevice' {..} =
+    Prelude.rnf coreDeviceThingName
+      `Prelude.seq` Prelude.rnf lastStatusUpdateTimestamp
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/GreengrassV2/Types/CoreDeviceStatus.hs b/gen/Amazonka/GreengrassV2/Types/CoreDeviceStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/CoreDeviceStatus.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.GreengrassV2.Types.CoreDeviceStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.CoreDeviceStatus
+  ( CoreDeviceStatus
+      ( ..,
+        CoreDeviceStatus_HEALTHY,
+        CoreDeviceStatus_UNHEALTHY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype CoreDeviceStatus = CoreDeviceStatus'
+  { fromCoreDeviceStatus ::
+      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 CoreDeviceStatus_HEALTHY :: CoreDeviceStatus
+pattern CoreDeviceStatus_HEALTHY = CoreDeviceStatus' "HEALTHY"
+
+pattern CoreDeviceStatus_UNHEALTHY :: CoreDeviceStatus
+pattern CoreDeviceStatus_UNHEALTHY = CoreDeviceStatus' "UNHEALTHY"
+
+{-# COMPLETE
+  CoreDeviceStatus_HEALTHY,
+  CoreDeviceStatus_UNHEALTHY,
+  CoreDeviceStatus'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/Deployment.hs b/gen/Amazonka/GreengrassV2/Types/Deployment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/Deployment.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.Deployment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.Deployment where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.DeploymentStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a deployment.
+--
+-- /See:/ 'newDeployment' smart constructor.
+data Deployment = Deployment'
+  { -- | The time at which the deployment was created, expressed in ISO 8601
+    -- format.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the deployment.
+    deploymentId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the deployment.
+    deploymentName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the deployment.
+    deploymentStatus :: Prelude.Maybe DeploymentStatus,
+    -- | Whether or not the deployment is the latest revision for its target.
+    isLatestForTarget :: Prelude.Maybe Prelude.Bool,
+    -- | The parent deployment\'s target
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- within a subdeployment.
+    parentTargetArn :: Prelude.Maybe Prelude.Text,
+    -- | The revision number of the deployment.
+    revisionId :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the target IoT thing or thing group. When creating a subdeployment,
+    -- the targetARN can only be a thing group.
+    targetArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Deployment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationTimestamp', 'deployment_creationTimestamp' - The time at which the deployment was created, expressed in ISO 8601
+-- format.
+--
+-- 'deploymentId', 'deployment_deploymentId' - The ID of the deployment.
+--
+-- 'deploymentName', 'deployment_deploymentName' - The name of the deployment.
+--
+-- 'deploymentStatus', 'deployment_deploymentStatus' - The status of the deployment.
+--
+-- 'isLatestForTarget', 'deployment_isLatestForTarget' - Whether or not the deployment is the latest revision for its target.
+--
+-- 'parentTargetArn', 'deployment_parentTargetArn' - The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+--
+-- 'revisionId', 'deployment_revisionId' - The revision number of the deployment.
+--
+-- 'targetArn', 'deployment_targetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group. When creating a subdeployment,
+-- the targetARN can only be a thing group.
+newDeployment ::
+  Deployment
+newDeployment =
+  Deployment'
+    { creationTimestamp = Prelude.Nothing,
+      deploymentId = Prelude.Nothing,
+      deploymentName = Prelude.Nothing,
+      deploymentStatus = Prelude.Nothing,
+      isLatestForTarget = Prelude.Nothing,
+      parentTargetArn = Prelude.Nothing,
+      revisionId = Prelude.Nothing,
+      targetArn = Prelude.Nothing
+    }
+
+-- | The time at which the deployment was created, expressed in ISO 8601
+-- format.
+deployment_creationTimestamp :: Lens.Lens' Deployment (Prelude.Maybe Prelude.UTCTime)
+deployment_creationTimestamp = Lens.lens (\Deployment' {creationTimestamp} -> creationTimestamp) (\s@Deployment' {} a -> s {creationTimestamp = a} :: Deployment) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the deployment.
+deployment_deploymentId :: Lens.Lens' Deployment (Prelude.Maybe Prelude.Text)
+deployment_deploymentId = Lens.lens (\Deployment' {deploymentId} -> deploymentId) (\s@Deployment' {} a -> s {deploymentId = a} :: Deployment)
+
+-- | The name of the deployment.
+deployment_deploymentName :: Lens.Lens' Deployment (Prelude.Maybe Prelude.Text)
+deployment_deploymentName = Lens.lens (\Deployment' {deploymentName} -> deploymentName) (\s@Deployment' {} a -> s {deploymentName = a} :: Deployment)
+
+-- | The status of the deployment.
+deployment_deploymentStatus :: Lens.Lens' Deployment (Prelude.Maybe DeploymentStatus)
+deployment_deploymentStatus = Lens.lens (\Deployment' {deploymentStatus} -> deploymentStatus) (\s@Deployment' {} a -> s {deploymentStatus = a} :: Deployment)
+
+-- | Whether or not the deployment is the latest revision for its target.
+deployment_isLatestForTarget :: Lens.Lens' Deployment (Prelude.Maybe Prelude.Bool)
+deployment_isLatestForTarget = Lens.lens (\Deployment' {isLatestForTarget} -> isLatestForTarget) (\s@Deployment' {} a -> s {isLatestForTarget = a} :: Deployment)
+
+-- | The parent deployment\'s target
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- within a subdeployment.
+deployment_parentTargetArn :: Lens.Lens' Deployment (Prelude.Maybe Prelude.Text)
+deployment_parentTargetArn = Lens.lens (\Deployment' {parentTargetArn} -> parentTargetArn) (\s@Deployment' {} a -> s {parentTargetArn = a} :: Deployment)
+
+-- | The revision number of the deployment.
+deployment_revisionId :: Lens.Lens' Deployment (Prelude.Maybe Prelude.Text)
+deployment_revisionId = Lens.lens (\Deployment' {revisionId} -> revisionId) (\s@Deployment' {} a -> s {revisionId = a} :: Deployment)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group. When creating a subdeployment,
+-- the targetARN can only be a thing group.
+deployment_targetArn :: Lens.Lens' Deployment (Prelude.Maybe Prelude.Text)
+deployment_targetArn = Lens.lens (\Deployment' {targetArn} -> targetArn) (\s@Deployment' {} a -> s {targetArn = a} :: Deployment)
+
+instance Data.FromJSON Deployment where
+  parseJSON =
+    Data.withObject
+      "Deployment"
+      ( \x ->
+          Deployment'
+            Prelude.<$> (x Data..:? "creationTimestamp")
+            Prelude.<*> (x Data..:? "deploymentId")
+            Prelude.<*> (x Data..:? "deploymentName")
+            Prelude.<*> (x Data..:? "deploymentStatus")
+            Prelude.<*> (x Data..:? "isLatestForTarget")
+            Prelude.<*> (x Data..:? "parentTargetArn")
+            Prelude.<*> (x Data..:? "revisionId")
+            Prelude.<*> (x Data..:? "targetArn")
+      )
+
+instance Prelude.Hashable Deployment where
+  hashWithSalt _salt Deployment' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` deploymentId
+      `Prelude.hashWithSalt` deploymentName
+      `Prelude.hashWithSalt` deploymentStatus
+      `Prelude.hashWithSalt` isLatestForTarget
+      `Prelude.hashWithSalt` parentTargetArn
+      `Prelude.hashWithSalt` revisionId
+      `Prelude.hashWithSalt` targetArn
+
+instance Prelude.NFData Deployment where
+  rnf Deployment' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf deploymentId
+      `Prelude.seq` Prelude.rnf deploymentName
+      `Prelude.seq` Prelude.rnf deploymentStatus
+      `Prelude.seq` Prelude.rnf isLatestForTarget
+      `Prelude.seq` Prelude.rnf parentTargetArn
+      `Prelude.seq` Prelude.rnf revisionId
+      `Prelude.seq` Prelude.rnf targetArn
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentComponentUpdatePolicy.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentComponentUpdatePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentComponentUpdatePolicy.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicy where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicyAction
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a deployment\'s policy that defines when
+-- components are safe to update.
+--
+-- Each component on a device can report whether or not it\'s ready to
+-- update. After a component and its dependencies are ready, they can apply
+-- the update in the deployment. You can configure whether or not the
+-- deployment notifies components of an update and waits for a response.
+-- You specify the amount of time each component has to respond to the
+-- update notification.
+--
+-- /See:/ 'newDeploymentComponentUpdatePolicy' smart constructor.
+data DeploymentComponentUpdatePolicy = DeploymentComponentUpdatePolicy'
+  { -- | Whether or not to notify components and wait for components to become
+    -- safe to update. Choose from the following options:
+    --
+    -- -   @NOTIFY_COMPONENTS@ – The deployment notifies each component before
+    --     it stops and updates that component. Components can use the
+    --     <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-subscribetocomponentupdates SubscribeToComponentUpdates>
+    --     IPC operation to receive these notifications. Then, components can
+    --     respond with the
+    --     <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-defercomponentupdate DeferComponentUpdate>
+    --     IPC operation. For more information, see
+    --     <https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html Create deployments>
+    --     in the /IoT Greengrass V2 Developer Guide/.
+    --
+    -- -   @SKIP_NOTIFY_COMPONENTS@ – The deployment doesn\'t notify components
+    --     or wait for them to be safe to update.
+    --
+    -- Default: @NOTIFY_COMPONENTS@
+    action :: Prelude.Maybe DeploymentComponentUpdatePolicyAction,
+    -- | The amount of time in seconds that each component on a device has to
+    -- report that it\'s safe to update. If the component waits for longer than
+    -- this timeout, then the deployment proceeds on the device.
+    --
+    -- Default: @60@
+    timeoutInSeconds :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeploymentComponentUpdatePolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'action', 'deploymentComponentUpdatePolicy_action' - Whether or not to notify components and wait for components to become
+-- safe to update. Choose from the following options:
+--
+-- -   @NOTIFY_COMPONENTS@ – The deployment notifies each component before
+--     it stops and updates that component. Components can use the
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-subscribetocomponentupdates SubscribeToComponentUpdates>
+--     IPC operation to receive these notifications. Then, components can
+--     respond with the
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-defercomponentupdate DeferComponentUpdate>
+--     IPC operation. For more information, see
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html Create deployments>
+--     in the /IoT Greengrass V2 Developer Guide/.
+--
+-- -   @SKIP_NOTIFY_COMPONENTS@ – The deployment doesn\'t notify components
+--     or wait for them to be safe to update.
+--
+-- Default: @NOTIFY_COMPONENTS@
+--
+-- 'timeoutInSeconds', 'deploymentComponentUpdatePolicy_timeoutInSeconds' - The amount of time in seconds that each component on a device has to
+-- report that it\'s safe to update. If the component waits for longer than
+-- this timeout, then the deployment proceeds on the device.
+--
+-- Default: @60@
+newDeploymentComponentUpdatePolicy ::
+  DeploymentComponentUpdatePolicy
+newDeploymentComponentUpdatePolicy =
+  DeploymentComponentUpdatePolicy'
+    { action =
+        Prelude.Nothing,
+      timeoutInSeconds = Prelude.Nothing
+    }
+
+-- | Whether or not to notify components and wait for components to become
+-- safe to update. Choose from the following options:
+--
+-- -   @NOTIFY_COMPONENTS@ – The deployment notifies each component before
+--     it stops and updates that component. Components can use the
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-subscribetocomponentupdates SubscribeToComponentUpdates>
+--     IPC operation to receive these notifications. Then, components can
+--     respond with the
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-defercomponentupdate DeferComponentUpdate>
+--     IPC operation. For more information, see
+--     <https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html Create deployments>
+--     in the /IoT Greengrass V2 Developer Guide/.
+--
+-- -   @SKIP_NOTIFY_COMPONENTS@ – The deployment doesn\'t notify components
+--     or wait for them to be safe to update.
+--
+-- Default: @NOTIFY_COMPONENTS@
+deploymentComponentUpdatePolicy_action :: Lens.Lens' DeploymentComponentUpdatePolicy (Prelude.Maybe DeploymentComponentUpdatePolicyAction)
+deploymentComponentUpdatePolicy_action = Lens.lens (\DeploymentComponentUpdatePolicy' {action} -> action) (\s@DeploymentComponentUpdatePolicy' {} a -> s {action = a} :: DeploymentComponentUpdatePolicy)
+
+-- | The amount of time in seconds that each component on a device has to
+-- report that it\'s safe to update. If the component waits for longer than
+-- this timeout, then the deployment proceeds on the device.
+--
+-- Default: @60@
+deploymentComponentUpdatePolicy_timeoutInSeconds :: Lens.Lens' DeploymentComponentUpdatePolicy (Prelude.Maybe Prelude.Int)
+deploymentComponentUpdatePolicy_timeoutInSeconds = Lens.lens (\DeploymentComponentUpdatePolicy' {timeoutInSeconds} -> timeoutInSeconds) (\s@DeploymentComponentUpdatePolicy' {} a -> s {timeoutInSeconds = a} :: DeploymentComponentUpdatePolicy)
+
+instance
+  Data.FromJSON
+    DeploymentComponentUpdatePolicy
+  where
+  parseJSON =
+    Data.withObject
+      "DeploymentComponentUpdatePolicy"
+      ( \x ->
+          DeploymentComponentUpdatePolicy'
+            Prelude.<$> (x Data..:? "action")
+            Prelude.<*> (x Data..:? "timeoutInSeconds")
+      )
+
+instance
+  Prelude.Hashable
+    DeploymentComponentUpdatePolicy
+  where
+  hashWithSalt
+    _salt
+    DeploymentComponentUpdatePolicy' {..} =
+      _salt
+        `Prelude.hashWithSalt` action
+        `Prelude.hashWithSalt` timeoutInSeconds
+
+instance
+  Prelude.NFData
+    DeploymentComponentUpdatePolicy
+  where
+  rnf DeploymentComponentUpdatePolicy' {..} =
+    Prelude.rnf action
+      `Prelude.seq` Prelude.rnf timeoutInSeconds
+
+instance Data.ToJSON DeploymentComponentUpdatePolicy where
+  toJSON DeploymentComponentUpdatePolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("action" Data..=) Prelude.<$> action,
+            ("timeoutInSeconds" Data..=)
+              Prelude.<$> timeoutInSeconds
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentComponentUpdatePolicyAction.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentComponentUpdatePolicyAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentComponentUpdatePolicyAction.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.GreengrassV2.Types.DeploymentComponentUpdatePolicyAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicyAction
+  ( DeploymentComponentUpdatePolicyAction
+      ( ..,
+        DeploymentComponentUpdatePolicyAction_NOTIFY_COMPONENTS,
+        DeploymentComponentUpdatePolicyAction_SKIP_NOTIFY_COMPONENTS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeploymentComponentUpdatePolicyAction = DeploymentComponentUpdatePolicyAction'
+  { fromDeploymentComponentUpdatePolicyAction ::
+      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 DeploymentComponentUpdatePolicyAction_NOTIFY_COMPONENTS :: DeploymentComponentUpdatePolicyAction
+pattern DeploymentComponentUpdatePolicyAction_NOTIFY_COMPONENTS = DeploymentComponentUpdatePolicyAction' "NOTIFY_COMPONENTS"
+
+pattern DeploymentComponentUpdatePolicyAction_SKIP_NOTIFY_COMPONENTS :: DeploymentComponentUpdatePolicyAction
+pattern DeploymentComponentUpdatePolicyAction_SKIP_NOTIFY_COMPONENTS = DeploymentComponentUpdatePolicyAction' "SKIP_NOTIFY_COMPONENTS"
+
+{-# COMPLETE
+  DeploymentComponentUpdatePolicyAction_NOTIFY_COMPONENTS,
+  DeploymentComponentUpdatePolicyAction_SKIP_NOTIFY_COMPONENTS,
+  DeploymentComponentUpdatePolicyAction'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentConfigurationValidationPolicy.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentConfigurationValidationPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentConfigurationValidationPolicy.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.DeploymentConfigurationValidationPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentConfigurationValidationPolicy 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 how long a component on a core device can
+-- validate its configuration updates before it times out. Components can
+-- use the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-subscribetovalidateconfigurationupdates SubscribeToValidateConfigurationUpdates>
+-- IPC operation to receive notifications when a deployment specifies a
+-- configuration update. Then, components can respond with the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-sendconfigurationvalidityreport SendConfigurationValidityReport>
+-- IPC operation. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html Create deployments>
+-- in the /IoT Greengrass V2 Developer Guide/.
+--
+-- /See:/ 'newDeploymentConfigurationValidationPolicy' smart constructor.
+data DeploymentConfigurationValidationPolicy = DeploymentConfigurationValidationPolicy'
+  { -- | The amount of time in seconds that a component can validate its
+    -- configuration updates. If the validation time exceeds this timeout, then
+    -- the deployment proceeds for the device.
+    --
+    -- Default: @30@
+    timeoutInSeconds :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeploymentConfigurationValidationPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'timeoutInSeconds', 'deploymentConfigurationValidationPolicy_timeoutInSeconds' - The amount of time in seconds that a component can validate its
+-- configuration updates. If the validation time exceeds this timeout, then
+-- the deployment proceeds for the device.
+--
+-- Default: @30@
+newDeploymentConfigurationValidationPolicy ::
+  DeploymentConfigurationValidationPolicy
+newDeploymentConfigurationValidationPolicy =
+  DeploymentConfigurationValidationPolicy'
+    { timeoutInSeconds =
+        Prelude.Nothing
+    }
+
+-- | The amount of time in seconds that a component can validate its
+-- configuration updates. If the validation time exceeds this timeout, then
+-- the deployment proceeds for the device.
+--
+-- Default: @30@
+deploymentConfigurationValidationPolicy_timeoutInSeconds :: Lens.Lens' DeploymentConfigurationValidationPolicy (Prelude.Maybe Prelude.Int)
+deploymentConfigurationValidationPolicy_timeoutInSeconds = Lens.lens (\DeploymentConfigurationValidationPolicy' {timeoutInSeconds} -> timeoutInSeconds) (\s@DeploymentConfigurationValidationPolicy' {} a -> s {timeoutInSeconds = a} :: DeploymentConfigurationValidationPolicy)
+
+instance
+  Data.FromJSON
+    DeploymentConfigurationValidationPolicy
+  where
+  parseJSON =
+    Data.withObject
+      "DeploymentConfigurationValidationPolicy"
+      ( \x ->
+          DeploymentConfigurationValidationPolicy'
+            Prelude.<$> (x Data..:? "timeoutInSeconds")
+      )
+
+instance
+  Prelude.Hashable
+    DeploymentConfigurationValidationPolicy
+  where
+  hashWithSalt
+    _salt
+    DeploymentConfigurationValidationPolicy' {..} =
+      _salt `Prelude.hashWithSalt` timeoutInSeconds
+
+instance
+  Prelude.NFData
+    DeploymentConfigurationValidationPolicy
+  where
+  rnf DeploymentConfigurationValidationPolicy' {..} =
+    Prelude.rnf timeoutInSeconds
+
+instance
+  Data.ToJSON
+    DeploymentConfigurationValidationPolicy
+  where
+  toJSON DeploymentConfigurationValidationPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("timeoutInSeconds" Data..=)
+              Prelude.<$> timeoutInSeconds
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentFailureHandlingPolicy.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentFailureHandlingPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentFailureHandlingPolicy.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.GreengrassV2.Types.DeploymentFailureHandlingPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentFailureHandlingPolicy
+  ( DeploymentFailureHandlingPolicy
+      ( ..,
+        DeploymentFailureHandlingPolicy_DO_NOTHING,
+        DeploymentFailureHandlingPolicy_ROLLBACK
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeploymentFailureHandlingPolicy = DeploymentFailureHandlingPolicy'
+  { fromDeploymentFailureHandlingPolicy ::
+      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 DeploymentFailureHandlingPolicy_DO_NOTHING :: DeploymentFailureHandlingPolicy
+pattern DeploymentFailureHandlingPolicy_DO_NOTHING = DeploymentFailureHandlingPolicy' "DO_NOTHING"
+
+pattern DeploymentFailureHandlingPolicy_ROLLBACK :: DeploymentFailureHandlingPolicy
+pattern DeploymentFailureHandlingPolicy_ROLLBACK = DeploymentFailureHandlingPolicy' "ROLLBACK"
+
+{-# COMPLETE
+  DeploymentFailureHandlingPolicy_DO_NOTHING,
+  DeploymentFailureHandlingPolicy_ROLLBACK,
+  DeploymentFailureHandlingPolicy'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentHistoryFilter.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentHistoryFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentHistoryFilter.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.GreengrassV2.Types.DeploymentHistoryFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentHistoryFilter
+  ( DeploymentHistoryFilter
+      ( ..,
+        DeploymentHistoryFilter_ALL,
+        DeploymentHistoryFilter_LATEST_ONLY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeploymentHistoryFilter = DeploymentHistoryFilter'
+  { fromDeploymentHistoryFilter ::
+      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 DeploymentHistoryFilter_ALL :: DeploymentHistoryFilter
+pattern DeploymentHistoryFilter_ALL = DeploymentHistoryFilter' "ALL"
+
+pattern DeploymentHistoryFilter_LATEST_ONLY :: DeploymentHistoryFilter
+pattern DeploymentHistoryFilter_LATEST_ONLY = DeploymentHistoryFilter' "LATEST_ONLY"
+
+{-# COMPLETE
+  DeploymentHistoryFilter_ALL,
+  DeploymentHistoryFilter_LATEST_ONLY,
+  DeploymentHistoryFilter'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentIoTJobConfiguration.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentIoTJobConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentIoTJobConfiguration.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.DeploymentIoTJobConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentIoTJobConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.IoTJobAbortConfig
+import Amazonka.GreengrassV2.Types.IoTJobExecutionsRolloutConfig
+import Amazonka.GreengrassV2.Types.IoTJobTimeoutConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an IoT job configuration.
+--
+-- /See:/ 'newDeploymentIoTJobConfiguration' smart constructor.
+data DeploymentIoTJobConfiguration = DeploymentIoTJobConfiguration'
+  { -- | The stop configuration for the job. This configuration defines when and
+    -- how to stop a job rollout.
+    abortConfig :: Prelude.Maybe IoTJobAbortConfig,
+    -- | The rollout configuration for the job. This configuration defines the
+    -- rate at which the job rolls out to the fleet of target devices.
+    jobExecutionsRolloutConfig :: Prelude.Maybe IoTJobExecutionsRolloutConfig,
+    -- | The timeout configuration for the job. This configuration defines the
+    -- amount of time each device has to complete the job.
+    timeoutConfig :: Prelude.Maybe IoTJobTimeoutConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeploymentIoTJobConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'abortConfig', 'deploymentIoTJobConfiguration_abortConfig' - The stop configuration for the job. This configuration defines when and
+-- how to stop a job rollout.
+--
+-- 'jobExecutionsRolloutConfig', 'deploymentIoTJobConfiguration_jobExecutionsRolloutConfig' - The rollout configuration for the job. This configuration defines the
+-- rate at which the job rolls out to the fleet of target devices.
+--
+-- 'timeoutConfig', 'deploymentIoTJobConfiguration_timeoutConfig' - The timeout configuration for the job. This configuration defines the
+-- amount of time each device has to complete the job.
+newDeploymentIoTJobConfiguration ::
+  DeploymentIoTJobConfiguration
+newDeploymentIoTJobConfiguration =
+  DeploymentIoTJobConfiguration'
+    { abortConfig =
+        Prelude.Nothing,
+      jobExecutionsRolloutConfig = Prelude.Nothing,
+      timeoutConfig = Prelude.Nothing
+    }
+
+-- | The stop configuration for the job. This configuration defines when and
+-- how to stop a job rollout.
+deploymentIoTJobConfiguration_abortConfig :: Lens.Lens' DeploymentIoTJobConfiguration (Prelude.Maybe IoTJobAbortConfig)
+deploymentIoTJobConfiguration_abortConfig = Lens.lens (\DeploymentIoTJobConfiguration' {abortConfig} -> abortConfig) (\s@DeploymentIoTJobConfiguration' {} a -> s {abortConfig = a} :: DeploymentIoTJobConfiguration)
+
+-- | The rollout configuration for the job. This configuration defines the
+-- rate at which the job rolls out to the fleet of target devices.
+deploymentIoTJobConfiguration_jobExecutionsRolloutConfig :: Lens.Lens' DeploymentIoTJobConfiguration (Prelude.Maybe IoTJobExecutionsRolloutConfig)
+deploymentIoTJobConfiguration_jobExecutionsRolloutConfig = Lens.lens (\DeploymentIoTJobConfiguration' {jobExecutionsRolloutConfig} -> jobExecutionsRolloutConfig) (\s@DeploymentIoTJobConfiguration' {} a -> s {jobExecutionsRolloutConfig = a} :: DeploymentIoTJobConfiguration)
+
+-- | The timeout configuration for the job. This configuration defines the
+-- amount of time each device has to complete the job.
+deploymentIoTJobConfiguration_timeoutConfig :: Lens.Lens' DeploymentIoTJobConfiguration (Prelude.Maybe IoTJobTimeoutConfig)
+deploymentIoTJobConfiguration_timeoutConfig = Lens.lens (\DeploymentIoTJobConfiguration' {timeoutConfig} -> timeoutConfig) (\s@DeploymentIoTJobConfiguration' {} a -> s {timeoutConfig = a} :: DeploymentIoTJobConfiguration)
+
+instance Data.FromJSON DeploymentIoTJobConfiguration where
+  parseJSON =
+    Data.withObject
+      "DeploymentIoTJobConfiguration"
+      ( \x ->
+          DeploymentIoTJobConfiguration'
+            Prelude.<$> (x Data..:? "abortConfig")
+            Prelude.<*> (x Data..:? "jobExecutionsRolloutConfig")
+            Prelude.<*> (x Data..:? "timeoutConfig")
+      )
+
+instance
+  Prelude.Hashable
+    DeploymentIoTJobConfiguration
+  where
+  hashWithSalt _salt DeploymentIoTJobConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` abortConfig
+      `Prelude.hashWithSalt` jobExecutionsRolloutConfig
+      `Prelude.hashWithSalt` timeoutConfig
+
+instance Prelude.NFData DeploymentIoTJobConfiguration where
+  rnf DeploymentIoTJobConfiguration' {..} =
+    Prelude.rnf abortConfig
+      `Prelude.seq` Prelude.rnf jobExecutionsRolloutConfig
+      `Prelude.seq` Prelude.rnf timeoutConfig
+
+instance Data.ToJSON DeploymentIoTJobConfiguration where
+  toJSON DeploymentIoTJobConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("abortConfig" Data..=) Prelude.<$> abortConfig,
+            ("jobExecutionsRolloutConfig" Data..=)
+              Prelude.<$> jobExecutionsRolloutConfig,
+            ("timeoutConfig" Data..=) Prelude.<$> timeoutConfig
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentPolicies.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentPolicies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentPolicies.hs
@@ -0,0 +1,132 @@
+{-# 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.GreengrassV2.Types.DeploymentPolicies
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentPolicies where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.DeploymentComponentUpdatePolicy
+import Amazonka.GreengrassV2.Types.DeploymentConfigurationValidationPolicy
+import Amazonka.GreengrassV2.Types.DeploymentFailureHandlingPolicy
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about policies that define how a deployment updates
+-- components and handles failure.
+--
+-- /See:/ 'newDeploymentPolicies' smart constructor.
+data DeploymentPolicies = DeploymentPolicies'
+  { -- | The component update policy for the configuration deployment. This
+    -- policy defines when it\'s safe to deploy the configuration to devices.
+    componentUpdatePolicy :: Prelude.Maybe DeploymentComponentUpdatePolicy,
+    -- | The configuration validation policy for the configuration deployment.
+    -- This policy defines how long each component has to validate its
+    -- configure updates.
+    configurationValidationPolicy :: Prelude.Maybe DeploymentConfigurationValidationPolicy,
+    -- | The failure handling policy for the configuration deployment. This
+    -- policy defines what to do if the deployment fails.
+    --
+    -- Default: @ROLLBACK@
+    failureHandlingPolicy :: Prelude.Maybe DeploymentFailureHandlingPolicy
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeploymentPolicies' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentUpdatePolicy', 'deploymentPolicies_componentUpdatePolicy' - The component update policy for the configuration deployment. This
+-- policy defines when it\'s safe to deploy the configuration to devices.
+--
+-- 'configurationValidationPolicy', 'deploymentPolicies_configurationValidationPolicy' - The configuration validation policy for the configuration deployment.
+-- This policy defines how long each component has to validate its
+-- configure updates.
+--
+-- 'failureHandlingPolicy', 'deploymentPolicies_failureHandlingPolicy' - The failure handling policy for the configuration deployment. This
+-- policy defines what to do if the deployment fails.
+--
+-- Default: @ROLLBACK@
+newDeploymentPolicies ::
+  DeploymentPolicies
+newDeploymentPolicies =
+  DeploymentPolicies'
+    { componentUpdatePolicy =
+        Prelude.Nothing,
+      configurationValidationPolicy = Prelude.Nothing,
+      failureHandlingPolicy = Prelude.Nothing
+    }
+
+-- | The component update policy for the configuration deployment. This
+-- policy defines when it\'s safe to deploy the configuration to devices.
+deploymentPolicies_componentUpdatePolicy :: Lens.Lens' DeploymentPolicies (Prelude.Maybe DeploymentComponentUpdatePolicy)
+deploymentPolicies_componentUpdatePolicy = Lens.lens (\DeploymentPolicies' {componentUpdatePolicy} -> componentUpdatePolicy) (\s@DeploymentPolicies' {} a -> s {componentUpdatePolicy = a} :: DeploymentPolicies)
+
+-- | The configuration validation policy for the configuration deployment.
+-- This policy defines how long each component has to validate its
+-- configure updates.
+deploymentPolicies_configurationValidationPolicy :: Lens.Lens' DeploymentPolicies (Prelude.Maybe DeploymentConfigurationValidationPolicy)
+deploymentPolicies_configurationValidationPolicy = Lens.lens (\DeploymentPolicies' {configurationValidationPolicy} -> configurationValidationPolicy) (\s@DeploymentPolicies' {} a -> s {configurationValidationPolicy = a} :: DeploymentPolicies)
+
+-- | The failure handling policy for the configuration deployment. This
+-- policy defines what to do if the deployment fails.
+--
+-- Default: @ROLLBACK@
+deploymentPolicies_failureHandlingPolicy :: Lens.Lens' DeploymentPolicies (Prelude.Maybe DeploymentFailureHandlingPolicy)
+deploymentPolicies_failureHandlingPolicy = Lens.lens (\DeploymentPolicies' {failureHandlingPolicy} -> failureHandlingPolicy) (\s@DeploymentPolicies' {} a -> s {failureHandlingPolicy = a} :: DeploymentPolicies)
+
+instance Data.FromJSON DeploymentPolicies where
+  parseJSON =
+    Data.withObject
+      "DeploymentPolicies"
+      ( \x ->
+          DeploymentPolicies'
+            Prelude.<$> (x Data..:? "componentUpdatePolicy")
+            Prelude.<*> (x Data..:? "configurationValidationPolicy")
+            Prelude.<*> (x Data..:? "failureHandlingPolicy")
+      )
+
+instance Prelude.Hashable DeploymentPolicies where
+  hashWithSalt _salt DeploymentPolicies' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentUpdatePolicy
+      `Prelude.hashWithSalt` configurationValidationPolicy
+      `Prelude.hashWithSalt` failureHandlingPolicy
+
+instance Prelude.NFData DeploymentPolicies where
+  rnf DeploymentPolicies' {..} =
+    Prelude.rnf componentUpdatePolicy
+      `Prelude.seq` Prelude.rnf configurationValidationPolicy
+      `Prelude.seq` Prelude.rnf failureHandlingPolicy
+
+instance Data.ToJSON DeploymentPolicies where
+  toJSON DeploymentPolicies' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentUpdatePolicy" Data..=)
+              Prelude.<$> componentUpdatePolicy,
+            ("configurationValidationPolicy" Data..=)
+              Prelude.<$> configurationValidationPolicy,
+            ("failureHandlingPolicy" Data..=)
+              Prelude.<$> failureHandlingPolicy
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/DeploymentStatus.hs b/gen/Amazonka/GreengrassV2/Types/DeploymentStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DeploymentStatus.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.GreengrassV2.Types.DeploymentStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DeploymentStatus
+  ( DeploymentStatus
+      ( ..,
+        DeploymentStatus_ACTIVE,
+        DeploymentStatus_CANCELED,
+        DeploymentStatus_COMPLETED,
+        DeploymentStatus_FAILED,
+        DeploymentStatus_INACTIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeploymentStatus = DeploymentStatus'
+  { fromDeploymentStatus ::
+      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 DeploymentStatus_ACTIVE :: DeploymentStatus
+pattern DeploymentStatus_ACTIVE = DeploymentStatus' "ACTIVE"
+
+pattern DeploymentStatus_CANCELED :: DeploymentStatus
+pattern DeploymentStatus_CANCELED = DeploymentStatus' "CANCELED"
+
+pattern DeploymentStatus_COMPLETED :: DeploymentStatus
+pattern DeploymentStatus_COMPLETED = DeploymentStatus' "COMPLETED"
+
+pattern DeploymentStatus_FAILED :: DeploymentStatus
+pattern DeploymentStatus_FAILED = DeploymentStatus' "FAILED"
+
+pattern DeploymentStatus_INACTIVE :: DeploymentStatus
+pattern DeploymentStatus_INACTIVE = DeploymentStatus' "INACTIVE"
+
+{-# COMPLETE
+  DeploymentStatus_ACTIVE,
+  DeploymentStatus_CANCELED,
+  DeploymentStatus_COMPLETED,
+  DeploymentStatus_FAILED,
+  DeploymentStatus_INACTIVE,
+  DeploymentStatus'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/DisassociateClientDeviceFromCoreDeviceEntry.hs b/gen/Amazonka/GreengrassV2/Types/DisassociateClientDeviceFromCoreDeviceEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DisassociateClientDeviceFromCoreDeviceEntry.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.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceEntry 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 a request to disassociate a client device from a core device.
+-- The
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchDisassociateClientDeviceWithCoreDevice.html BatchDisassociateClientDeviceWithCoreDevice>
+-- operation consumes a list of these requests.
+--
+-- /See:/ 'newDisassociateClientDeviceFromCoreDeviceEntry' smart constructor.
+data DisassociateClientDeviceFromCoreDeviceEntry = DisassociateClientDeviceFromCoreDeviceEntry'
+  { -- | The name of the IoT thing that represents the client device to
+    -- disassociate.
+    thingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateClientDeviceFromCoreDeviceEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'thingName', 'disassociateClientDeviceFromCoreDeviceEntry_thingName' - The name of the IoT thing that represents the client device to
+-- disassociate.
+newDisassociateClientDeviceFromCoreDeviceEntry ::
+  -- | 'thingName'
+  Prelude.Text ->
+  DisassociateClientDeviceFromCoreDeviceEntry
+newDisassociateClientDeviceFromCoreDeviceEntry
+  pThingName_ =
+    DisassociateClientDeviceFromCoreDeviceEntry'
+      { thingName =
+          pThingName_
+      }
+
+-- | The name of the IoT thing that represents the client device to
+-- disassociate.
+disassociateClientDeviceFromCoreDeviceEntry_thingName :: Lens.Lens' DisassociateClientDeviceFromCoreDeviceEntry Prelude.Text
+disassociateClientDeviceFromCoreDeviceEntry_thingName = Lens.lens (\DisassociateClientDeviceFromCoreDeviceEntry' {thingName} -> thingName) (\s@DisassociateClientDeviceFromCoreDeviceEntry' {} a -> s {thingName = a} :: DisassociateClientDeviceFromCoreDeviceEntry)
+
+instance
+  Prelude.Hashable
+    DisassociateClientDeviceFromCoreDeviceEntry
+  where
+  hashWithSalt
+    _salt
+    DisassociateClientDeviceFromCoreDeviceEntry' {..} =
+      _salt `Prelude.hashWithSalt` thingName
+
+instance
+  Prelude.NFData
+    DisassociateClientDeviceFromCoreDeviceEntry
+  where
+  rnf DisassociateClientDeviceFromCoreDeviceEntry' {..} =
+    Prelude.rnf thingName
+
+instance
+  Data.ToJSON
+    DisassociateClientDeviceFromCoreDeviceEntry
+  where
+  toJSON
+    DisassociateClientDeviceFromCoreDeviceEntry' {..} =
+      Data.object
+        ( Prelude.catMaybes
+            [Prelude.Just ("thingName" Data..= thingName)]
+        )
diff --git a/gen/Amazonka/GreengrassV2/Types/DisassociateClientDeviceFromCoreDeviceErrorEntry.hs b/gen/Amazonka/GreengrassV2/Types/DisassociateClientDeviceFromCoreDeviceErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/DisassociateClientDeviceFromCoreDeviceErrorEntry.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceErrorEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.DisassociateClientDeviceFromCoreDeviceErrorEntry 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 an error that occurs from a request to disassociate a client
+-- device from a core device. The
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchDisassociateClientDeviceWithCoreDevice.html BatchDisassociateClientDeviceWithCoreDevice>
+-- operation returns a list of these errors.
+--
+-- /See:/ 'newDisassociateClientDeviceFromCoreDeviceErrorEntry' smart constructor.
+data DisassociateClientDeviceFromCoreDeviceErrorEntry = DisassociateClientDeviceFromCoreDeviceErrorEntry'
+  { -- | The error code for the request.
+    code :: Prelude.Maybe Prelude.Text,
+    -- | A message that provides additional information about the error.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The name of the IoT thing whose disassociate request failed.
+    thingName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateClientDeviceFromCoreDeviceErrorEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'disassociateClientDeviceFromCoreDeviceErrorEntry_code' - The error code for the request.
+--
+-- 'message', 'disassociateClientDeviceFromCoreDeviceErrorEntry_message' - A message that provides additional information about the error.
+--
+-- 'thingName', 'disassociateClientDeviceFromCoreDeviceErrorEntry_thingName' - The name of the IoT thing whose disassociate request failed.
+newDisassociateClientDeviceFromCoreDeviceErrorEntry ::
+  DisassociateClientDeviceFromCoreDeviceErrorEntry
+newDisassociateClientDeviceFromCoreDeviceErrorEntry =
+  DisassociateClientDeviceFromCoreDeviceErrorEntry'
+    { code =
+        Prelude.Nothing,
+      message = Prelude.Nothing,
+      thingName =
+        Prelude.Nothing
+    }
+
+-- | The error code for the request.
+disassociateClientDeviceFromCoreDeviceErrorEntry_code :: Lens.Lens' DisassociateClientDeviceFromCoreDeviceErrorEntry (Prelude.Maybe Prelude.Text)
+disassociateClientDeviceFromCoreDeviceErrorEntry_code = Lens.lens (\DisassociateClientDeviceFromCoreDeviceErrorEntry' {code} -> code) (\s@DisassociateClientDeviceFromCoreDeviceErrorEntry' {} a -> s {code = a} :: DisassociateClientDeviceFromCoreDeviceErrorEntry)
+
+-- | A message that provides additional information about the error.
+disassociateClientDeviceFromCoreDeviceErrorEntry_message :: Lens.Lens' DisassociateClientDeviceFromCoreDeviceErrorEntry (Prelude.Maybe Prelude.Text)
+disassociateClientDeviceFromCoreDeviceErrorEntry_message = Lens.lens (\DisassociateClientDeviceFromCoreDeviceErrorEntry' {message} -> message) (\s@DisassociateClientDeviceFromCoreDeviceErrorEntry' {} a -> s {message = a} :: DisassociateClientDeviceFromCoreDeviceErrorEntry)
+
+-- | The name of the IoT thing whose disassociate request failed.
+disassociateClientDeviceFromCoreDeviceErrorEntry_thingName :: Lens.Lens' DisassociateClientDeviceFromCoreDeviceErrorEntry (Prelude.Maybe Prelude.Text)
+disassociateClientDeviceFromCoreDeviceErrorEntry_thingName = Lens.lens (\DisassociateClientDeviceFromCoreDeviceErrorEntry' {thingName} -> thingName) (\s@DisassociateClientDeviceFromCoreDeviceErrorEntry' {} a -> s {thingName = a} :: DisassociateClientDeviceFromCoreDeviceErrorEntry)
+
+instance
+  Data.FromJSON
+    DisassociateClientDeviceFromCoreDeviceErrorEntry
+  where
+  parseJSON =
+    Data.withObject
+      "DisassociateClientDeviceFromCoreDeviceErrorEntry"
+      ( \x ->
+          DisassociateClientDeviceFromCoreDeviceErrorEntry'
+            Prelude.<$> (x Data..:? "code")
+            Prelude.<*> (x Data..:? "message")
+            Prelude.<*> (x Data..:? "thingName")
+      )
+
+instance
+  Prelude.Hashable
+    DisassociateClientDeviceFromCoreDeviceErrorEntry
+  where
+  hashWithSalt
+    _salt
+    DisassociateClientDeviceFromCoreDeviceErrorEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` code
+        `Prelude.hashWithSalt` message
+        `Prelude.hashWithSalt` thingName
+
+instance
+  Prelude.NFData
+    DisassociateClientDeviceFromCoreDeviceErrorEntry
+  where
+  rnf
+    DisassociateClientDeviceFromCoreDeviceErrorEntry' {..} =
+      Prelude.rnf code
+        `Prelude.seq` Prelude.rnf message
+        `Prelude.seq` Prelude.rnf thingName
diff --git a/gen/Amazonka/GreengrassV2/Types/EffectiveDeployment.hs b/gen/Amazonka/GreengrassV2/Types/EffectiveDeployment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/EffectiveDeployment.hs
@@ -0,0 +1,237 @@
+{-# 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.GreengrassV2.Types.EffectiveDeployment
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.EffectiveDeployment where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.EffectiveDeploymentExecutionStatus
+import Amazonka.GreengrassV2.Types.EffectiveDeploymentStatusDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a deployment job that IoT Greengrass sends to
+-- a Greengrass core device.
+--
+-- /See:/ 'newEffectiveDeployment' smart constructor.
+data EffectiveDeployment = EffectiveDeployment'
+  { -- | The description of the deployment job.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IoT job that applies the deployment to target devices.
+    iotJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the IoT job that applies the deployment to target devices.
+    iotJobId :: Prelude.Maybe Prelude.Text,
+    -- | The reason code for the update, if the job was updated.
+    reason :: Prelude.Maybe Prelude.Text,
+    -- | The status details that explain why a deployment has an error. This
+    -- response will be null if the deployment is in a success state.
+    statusDetails :: Prelude.Maybe EffectiveDeploymentStatusDetails,
+    -- | The ID of the deployment.
+    deploymentId :: Prelude.Text,
+    -- | The name of the deployment.
+    deploymentName :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the target IoT thing or thing group.
+    targetArn :: Prelude.Text,
+    -- | The status of the deployment job on the Greengrass core device.
+    coreDeviceExecutionStatus :: EffectiveDeploymentExecutionStatus,
+    -- | The time at which the deployment was created, expressed in ISO 8601
+    -- format.
+    creationTimestamp :: Data.POSIX,
+    -- | The time at which the deployment job was last modified, expressed in ISO
+    -- 8601 format.
+    modifiedTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EffectiveDeployment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'effectiveDeployment_description' - The description of the deployment job.
+--
+-- 'iotJobArn', 'effectiveDeployment_iotJobArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT job that applies the deployment to target devices.
+--
+-- 'iotJobId', 'effectiveDeployment_iotJobId' - The ID of the IoT job that applies the deployment to target devices.
+--
+-- 'reason', 'effectiveDeployment_reason' - The reason code for the update, if the job was updated.
+--
+-- 'statusDetails', 'effectiveDeployment_statusDetails' - The status details that explain why a deployment has an error. This
+-- response will be null if the deployment is in a success state.
+--
+-- 'deploymentId', 'effectiveDeployment_deploymentId' - The ID of the deployment.
+--
+-- 'deploymentName', 'effectiveDeployment_deploymentName' - The name of the deployment.
+--
+-- 'targetArn', 'effectiveDeployment_targetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group.
+--
+-- 'coreDeviceExecutionStatus', 'effectiveDeployment_coreDeviceExecutionStatus' - The status of the deployment job on the Greengrass core device.
+--
+-- 'creationTimestamp', 'effectiveDeployment_creationTimestamp' - The time at which the deployment was created, expressed in ISO 8601
+-- format.
+--
+-- 'modifiedTimestamp', 'effectiveDeployment_modifiedTimestamp' - The time at which the deployment job was last modified, expressed in ISO
+-- 8601 format.
+newEffectiveDeployment ::
+  -- | 'deploymentId'
+  Prelude.Text ->
+  -- | 'deploymentName'
+  Prelude.Text ->
+  -- | 'targetArn'
+  Prelude.Text ->
+  -- | 'coreDeviceExecutionStatus'
+  EffectiveDeploymentExecutionStatus ->
+  -- | 'creationTimestamp'
+  Prelude.UTCTime ->
+  -- | 'modifiedTimestamp'
+  Prelude.UTCTime ->
+  EffectiveDeployment
+newEffectiveDeployment
+  pDeploymentId_
+  pDeploymentName_
+  pTargetArn_
+  pCoreDeviceExecutionStatus_
+  pCreationTimestamp_
+  pModifiedTimestamp_ =
+    EffectiveDeployment'
+      { description = Prelude.Nothing,
+        iotJobArn = Prelude.Nothing,
+        iotJobId = Prelude.Nothing,
+        reason = Prelude.Nothing,
+        statusDetails = Prelude.Nothing,
+        deploymentId = pDeploymentId_,
+        deploymentName = pDeploymentName_,
+        targetArn = pTargetArn_,
+        coreDeviceExecutionStatus =
+          pCoreDeviceExecutionStatus_,
+        creationTimestamp =
+          Data._Time Lens.# pCreationTimestamp_,
+        modifiedTimestamp =
+          Data._Time Lens.# pModifiedTimestamp_
+      }
+
+-- | The description of the deployment job.
+effectiveDeployment_description :: Lens.Lens' EffectiveDeployment (Prelude.Maybe Prelude.Text)
+effectiveDeployment_description = Lens.lens (\EffectiveDeployment' {description} -> description) (\s@EffectiveDeployment' {} a -> s {description = a} :: EffectiveDeployment)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IoT job that applies the deployment to target devices.
+effectiveDeployment_iotJobArn :: Lens.Lens' EffectiveDeployment (Prelude.Maybe Prelude.Text)
+effectiveDeployment_iotJobArn = Lens.lens (\EffectiveDeployment' {iotJobArn} -> iotJobArn) (\s@EffectiveDeployment' {} a -> s {iotJobArn = a} :: EffectiveDeployment)
+
+-- | The ID of the IoT job that applies the deployment to target devices.
+effectiveDeployment_iotJobId :: Lens.Lens' EffectiveDeployment (Prelude.Maybe Prelude.Text)
+effectiveDeployment_iotJobId = Lens.lens (\EffectiveDeployment' {iotJobId} -> iotJobId) (\s@EffectiveDeployment' {} a -> s {iotJobId = a} :: EffectiveDeployment)
+
+-- | The reason code for the update, if the job was updated.
+effectiveDeployment_reason :: Lens.Lens' EffectiveDeployment (Prelude.Maybe Prelude.Text)
+effectiveDeployment_reason = Lens.lens (\EffectiveDeployment' {reason} -> reason) (\s@EffectiveDeployment' {} a -> s {reason = a} :: EffectiveDeployment)
+
+-- | The status details that explain why a deployment has an error. This
+-- response will be null if the deployment is in a success state.
+effectiveDeployment_statusDetails :: Lens.Lens' EffectiveDeployment (Prelude.Maybe EffectiveDeploymentStatusDetails)
+effectiveDeployment_statusDetails = Lens.lens (\EffectiveDeployment' {statusDetails} -> statusDetails) (\s@EffectiveDeployment' {} a -> s {statusDetails = a} :: EffectiveDeployment)
+
+-- | The ID of the deployment.
+effectiveDeployment_deploymentId :: Lens.Lens' EffectiveDeployment Prelude.Text
+effectiveDeployment_deploymentId = Lens.lens (\EffectiveDeployment' {deploymentId} -> deploymentId) (\s@EffectiveDeployment' {} a -> s {deploymentId = a} :: EffectiveDeployment)
+
+-- | The name of the deployment.
+effectiveDeployment_deploymentName :: Lens.Lens' EffectiveDeployment Prelude.Text
+effectiveDeployment_deploymentName = Lens.lens (\EffectiveDeployment' {deploymentName} -> deploymentName) (\s@EffectiveDeployment' {} a -> s {deploymentName = a} :: EffectiveDeployment)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the target IoT thing or thing group.
+effectiveDeployment_targetArn :: Lens.Lens' EffectiveDeployment Prelude.Text
+effectiveDeployment_targetArn = Lens.lens (\EffectiveDeployment' {targetArn} -> targetArn) (\s@EffectiveDeployment' {} a -> s {targetArn = a} :: EffectiveDeployment)
+
+-- | The status of the deployment job on the Greengrass core device.
+effectiveDeployment_coreDeviceExecutionStatus :: Lens.Lens' EffectiveDeployment EffectiveDeploymentExecutionStatus
+effectiveDeployment_coreDeviceExecutionStatus = Lens.lens (\EffectiveDeployment' {coreDeviceExecutionStatus} -> coreDeviceExecutionStatus) (\s@EffectiveDeployment' {} a -> s {coreDeviceExecutionStatus = a} :: EffectiveDeployment)
+
+-- | The time at which the deployment was created, expressed in ISO 8601
+-- format.
+effectiveDeployment_creationTimestamp :: Lens.Lens' EffectiveDeployment Prelude.UTCTime
+effectiveDeployment_creationTimestamp = Lens.lens (\EffectiveDeployment' {creationTimestamp} -> creationTimestamp) (\s@EffectiveDeployment' {} a -> s {creationTimestamp = a} :: EffectiveDeployment) Prelude.. Data._Time
+
+-- | The time at which the deployment job was last modified, expressed in ISO
+-- 8601 format.
+effectiveDeployment_modifiedTimestamp :: Lens.Lens' EffectiveDeployment Prelude.UTCTime
+effectiveDeployment_modifiedTimestamp = Lens.lens (\EffectiveDeployment' {modifiedTimestamp} -> modifiedTimestamp) (\s@EffectiveDeployment' {} a -> s {modifiedTimestamp = a} :: EffectiveDeployment) Prelude.. Data._Time
+
+instance Data.FromJSON EffectiveDeployment where
+  parseJSON =
+    Data.withObject
+      "EffectiveDeployment"
+      ( \x ->
+          EffectiveDeployment'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "iotJobArn")
+            Prelude.<*> (x Data..:? "iotJobId")
+            Prelude.<*> (x Data..:? "reason")
+            Prelude.<*> (x Data..:? "statusDetails")
+            Prelude.<*> (x Data..: "deploymentId")
+            Prelude.<*> (x Data..: "deploymentName")
+            Prelude.<*> (x Data..: "targetArn")
+            Prelude.<*> (x Data..: "coreDeviceExecutionStatus")
+            Prelude.<*> (x Data..: "creationTimestamp")
+            Prelude.<*> (x Data..: "modifiedTimestamp")
+      )
+
+instance Prelude.Hashable EffectiveDeployment where
+  hashWithSalt _salt EffectiveDeployment' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` iotJobArn
+      `Prelude.hashWithSalt` iotJobId
+      `Prelude.hashWithSalt` reason
+      `Prelude.hashWithSalt` statusDetails
+      `Prelude.hashWithSalt` deploymentId
+      `Prelude.hashWithSalt` deploymentName
+      `Prelude.hashWithSalt` targetArn
+      `Prelude.hashWithSalt` coreDeviceExecutionStatus
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` modifiedTimestamp
+
+instance Prelude.NFData EffectiveDeployment where
+  rnf EffectiveDeployment' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf iotJobArn
+      `Prelude.seq` Prelude.rnf iotJobId
+      `Prelude.seq` Prelude.rnf reason
+      `Prelude.seq` Prelude.rnf statusDetails
+      `Prelude.seq` Prelude.rnf deploymentId
+      `Prelude.seq` Prelude.rnf deploymentName
+      `Prelude.seq` Prelude.rnf targetArn
+      `Prelude.seq` Prelude.rnf coreDeviceExecutionStatus
+      `Prelude.seq` Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf modifiedTimestamp
diff --git a/gen/Amazonka/GreengrassV2/Types/EffectiveDeploymentExecutionStatus.hs b/gen/Amazonka/GreengrassV2/Types/EffectiveDeploymentExecutionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/EffectiveDeploymentExecutionStatus.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.EffectiveDeploymentExecutionStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.EffectiveDeploymentExecutionStatus
+  ( EffectiveDeploymentExecutionStatus
+      ( ..,
+        EffectiveDeploymentExecutionStatus_CANCELED,
+        EffectiveDeploymentExecutionStatus_COMPLETED,
+        EffectiveDeploymentExecutionStatus_FAILED,
+        EffectiveDeploymentExecutionStatus_IN_PROGRESS,
+        EffectiveDeploymentExecutionStatus_QUEUED,
+        EffectiveDeploymentExecutionStatus_REJECTED,
+        EffectiveDeploymentExecutionStatus_TIMED_OUT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EffectiveDeploymentExecutionStatus = EffectiveDeploymentExecutionStatus'
+  { fromEffectiveDeploymentExecutionStatus ::
+      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 EffectiveDeploymentExecutionStatus_CANCELED :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_CANCELED = EffectiveDeploymentExecutionStatus' "CANCELED"
+
+pattern EffectiveDeploymentExecutionStatus_COMPLETED :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_COMPLETED = EffectiveDeploymentExecutionStatus' "COMPLETED"
+
+pattern EffectiveDeploymentExecutionStatus_FAILED :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_FAILED = EffectiveDeploymentExecutionStatus' "FAILED"
+
+pattern EffectiveDeploymentExecutionStatus_IN_PROGRESS :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_IN_PROGRESS = EffectiveDeploymentExecutionStatus' "IN_PROGRESS"
+
+pattern EffectiveDeploymentExecutionStatus_QUEUED :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_QUEUED = EffectiveDeploymentExecutionStatus' "QUEUED"
+
+pattern EffectiveDeploymentExecutionStatus_REJECTED :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_REJECTED = EffectiveDeploymentExecutionStatus' "REJECTED"
+
+pattern EffectiveDeploymentExecutionStatus_TIMED_OUT :: EffectiveDeploymentExecutionStatus
+pattern EffectiveDeploymentExecutionStatus_TIMED_OUT = EffectiveDeploymentExecutionStatus' "TIMED_OUT"
+
+{-# COMPLETE
+  EffectiveDeploymentExecutionStatus_CANCELED,
+  EffectiveDeploymentExecutionStatus_COMPLETED,
+  EffectiveDeploymentExecutionStatus_FAILED,
+  EffectiveDeploymentExecutionStatus_IN_PROGRESS,
+  EffectiveDeploymentExecutionStatus_QUEUED,
+  EffectiveDeploymentExecutionStatus_REJECTED,
+  EffectiveDeploymentExecutionStatus_TIMED_OUT,
+  EffectiveDeploymentExecutionStatus'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/EffectiveDeploymentStatusDetails.hs b/gen/Amazonka/GreengrassV2/Types/EffectiveDeploymentStatusDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/EffectiveDeploymentStatusDetails.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.EffectiveDeploymentStatusDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.EffectiveDeploymentStatusDetails 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 all error-related information for the deployment record. The
+-- status details will be null if the deployment is in a success state.
+--
+-- Greengrass nucleus v2.8.0 or later is required to get an accurate
+-- @errorStack@ and @errorTypes@ response. This field will not be returned
+-- for earlier Greengrass nucleus versions.
+--
+-- /See:/ 'newEffectiveDeploymentStatusDetails' smart constructor.
+data EffectiveDeploymentStatusDetails = EffectiveDeploymentStatusDetails'
+  { -- | Contains an ordered list of short error codes that range from the most
+    -- generic error to the most specific one. The error codes describe the
+    -- reason for failure whenever the @coreDeviceExecutionStatus@ is in a
+    -- failed state. The response will be an empty list if there is no error.
+    errorStack :: Prelude.Maybe [Prelude.Text],
+    -- | Contains tags which describe the error. You can use the error types to
+    -- classify errors to assist with remediating the failure. The response
+    -- will be an empty list if there is no error.
+    errorTypes :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EffectiveDeploymentStatusDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorStack', 'effectiveDeploymentStatusDetails_errorStack' - Contains an ordered list of short error codes that range from the most
+-- generic error to the most specific one. The error codes describe the
+-- reason for failure whenever the @coreDeviceExecutionStatus@ is in a
+-- failed state. The response will be an empty list if there is no error.
+--
+-- 'errorTypes', 'effectiveDeploymentStatusDetails_errorTypes' - Contains tags which describe the error. You can use the error types to
+-- classify errors to assist with remediating the failure. The response
+-- will be an empty list if there is no error.
+newEffectiveDeploymentStatusDetails ::
+  EffectiveDeploymentStatusDetails
+newEffectiveDeploymentStatusDetails =
+  EffectiveDeploymentStatusDetails'
+    { errorStack =
+        Prelude.Nothing,
+      errorTypes = Prelude.Nothing
+    }
+
+-- | Contains an ordered list of short error codes that range from the most
+-- generic error to the most specific one. The error codes describe the
+-- reason for failure whenever the @coreDeviceExecutionStatus@ is in a
+-- failed state. The response will be an empty list if there is no error.
+effectiveDeploymentStatusDetails_errorStack :: Lens.Lens' EffectiveDeploymentStatusDetails (Prelude.Maybe [Prelude.Text])
+effectiveDeploymentStatusDetails_errorStack = Lens.lens (\EffectiveDeploymentStatusDetails' {errorStack} -> errorStack) (\s@EffectiveDeploymentStatusDetails' {} a -> s {errorStack = a} :: EffectiveDeploymentStatusDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | Contains tags which describe the error. You can use the error types to
+-- classify errors to assist with remediating the failure. The response
+-- will be an empty list if there is no error.
+effectiveDeploymentStatusDetails_errorTypes :: Lens.Lens' EffectiveDeploymentStatusDetails (Prelude.Maybe [Prelude.Text])
+effectiveDeploymentStatusDetails_errorTypes = Lens.lens (\EffectiveDeploymentStatusDetails' {errorTypes} -> errorTypes) (\s@EffectiveDeploymentStatusDetails' {} a -> s {errorTypes = a} :: EffectiveDeploymentStatusDetails) Prelude.. Lens.mapping Lens.coerced
+
+instance
+  Data.FromJSON
+    EffectiveDeploymentStatusDetails
+  where
+  parseJSON =
+    Data.withObject
+      "EffectiveDeploymentStatusDetails"
+      ( \x ->
+          EffectiveDeploymentStatusDetails'
+            Prelude.<$> (x Data..:? "errorStack" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "errorTypes" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    EffectiveDeploymentStatusDetails
+  where
+  hashWithSalt
+    _salt
+    EffectiveDeploymentStatusDetails' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorStack
+        `Prelude.hashWithSalt` errorTypes
+
+instance
+  Prelude.NFData
+    EffectiveDeploymentStatusDetails
+  where
+  rnf EffectiveDeploymentStatusDetails' {..} =
+    Prelude.rnf errorStack
+      `Prelude.seq` Prelude.rnf errorTypes
diff --git a/gen/Amazonka/GreengrassV2/Types/InstalledComponent.hs b/gen/Amazonka/GreengrassV2/Types/InstalledComponent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/InstalledComponent.hs
@@ -0,0 +1,227 @@
+{-# 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.GreengrassV2.Types.InstalledComponent
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.InstalledComponent where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.InstalledComponentLifecycleState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a component on a Greengrass core device.
+--
+-- /See:/ 'newInstalledComponent' smart constructor.
+data InstalledComponent = InstalledComponent'
+  { -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | Whether or not the component is a root component.
+    isRoot :: Prelude.Maybe Prelude.Bool,
+    -- | The most recent deployment source that brought the component to the
+    -- Greengrass core device. For a thing group deployment or thing
+    -- deployment, the source will be the The ID of the deployment. and for
+    -- local deployments it will be @LOCAL@.
+    lastInstallationSource :: Prelude.Maybe Prelude.Text,
+    -- | The last time the Greengrass core device sent a message containing a
+    -- certain component to the Amazon Web Services Cloud.
+    --
+    -- A component does not need to see a state change for this field to
+    -- update.
+    lastReportedTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The status of how current the data is.
+    --
+    -- This response is based off of component state changes. The status
+    -- reflects component disruptions and deployments. If a component only sees
+    -- a configuration update during a deployment, it might not undergo a state
+    -- change and this status would not be updated.
+    lastStatusChangeTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The lifecycle state of the component.
+    lifecycleState :: Prelude.Maybe InstalledComponentLifecycleState,
+    -- | A detailed response about the lifecycle state of the component that
+    -- explains the reason why a component has an error or is broken.
+    lifecycleStateDetails :: Prelude.Maybe Prelude.Text,
+    -- | The status codes that indicate the reason for failure whenever the
+    -- @lifecycleState@ has an error or is in a broken state.
+    --
+    -- Greengrass nucleus v2.8.0 or later is required to get an accurate
+    -- @lifecycleStatusCodes@ response. This response can be inaccurate in
+    -- earlier Greengrass nucleus versions.
+    lifecycleStatusCodes :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InstalledComponent' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentName', 'installedComponent_componentName' - The name of the component.
+--
+-- 'componentVersion', 'installedComponent_componentVersion' - The version of the component.
+--
+-- 'isRoot', 'installedComponent_isRoot' - Whether or not the component is a root component.
+--
+-- 'lastInstallationSource', 'installedComponent_lastInstallationSource' - The most recent deployment source that brought the component to the
+-- Greengrass core device. For a thing group deployment or thing
+-- deployment, the source will be the The ID of the deployment. and for
+-- local deployments it will be @LOCAL@.
+--
+-- 'lastReportedTimestamp', 'installedComponent_lastReportedTimestamp' - The last time the Greengrass core device sent a message containing a
+-- certain component to the Amazon Web Services Cloud.
+--
+-- A component does not need to see a state change for this field to
+-- update.
+--
+-- 'lastStatusChangeTimestamp', 'installedComponent_lastStatusChangeTimestamp' - The status of how current the data is.
+--
+-- This response is based off of component state changes. The status
+-- reflects component disruptions and deployments. If a component only sees
+-- a configuration update during a deployment, it might not undergo a state
+-- change and this status would not be updated.
+--
+-- 'lifecycleState', 'installedComponent_lifecycleState' - The lifecycle state of the component.
+--
+-- 'lifecycleStateDetails', 'installedComponent_lifecycleStateDetails' - A detailed response about the lifecycle state of the component that
+-- explains the reason why a component has an error or is broken.
+--
+-- 'lifecycleStatusCodes', 'installedComponent_lifecycleStatusCodes' - The status codes that indicate the reason for failure whenever the
+-- @lifecycleState@ has an error or is in a broken state.
+--
+-- Greengrass nucleus v2.8.0 or later is required to get an accurate
+-- @lifecycleStatusCodes@ response. This response can be inaccurate in
+-- earlier Greengrass nucleus versions.
+newInstalledComponent ::
+  InstalledComponent
+newInstalledComponent =
+  InstalledComponent'
+    { componentName =
+        Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      isRoot = Prelude.Nothing,
+      lastInstallationSource = Prelude.Nothing,
+      lastReportedTimestamp = Prelude.Nothing,
+      lastStatusChangeTimestamp = Prelude.Nothing,
+      lifecycleState = Prelude.Nothing,
+      lifecycleStateDetails = Prelude.Nothing,
+      lifecycleStatusCodes = Prelude.Nothing
+    }
+
+-- | The name of the component.
+installedComponent_componentName :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.Text)
+installedComponent_componentName = Lens.lens (\InstalledComponent' {componentName} -> componentName) (\s@InstalledComponent' {} a -> s {componentName = a} :: InstalledComponent)
+
+-- | The version of the component.
+installedComponent_componentVersion :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.Text)
+installedComponent_componentVersion = Lens.lens (\InstalledComponent' {componentVersion} -> componentVersion) (\s@InstalledComponent' {} a -> s {componentVersion = a} :: InstalledComponent)
+
+-- | Whether or not the component is a root component.
+installedComponent_isRoot :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.Bool)
+installedComponent_isRoot = Lens.lens (\InstalledComponent' {isRoot} -> isRoot) (\s@InstalledComponent' {} a -> s {isRoot = a} :: InstalledComponent)
+
+-- | The most recent deployment source that brought the component to the
+-- Greengrass core device. For a thing group deployment or thing
+-- deployment, the source will be the The ID of the deployment. and for
+-- local deployments it will be @LOCAL@.
+installedComponent_lastInstallationSource :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.Text)
+installedComponent_lastInstallationSource = Lens.lens (\InstalledComponent' {lastInstallationSource} -> lastInstallationSource) (\s@InstalledComponent' {} a -> s {lastInstallationSource = a} :: InstalledComponent)
+
+-- | The last time the Greengrass core device sent a message containing a
+-- certain component to the Amazon Web Services Cloud.
+--
+-- A component does not need to see a state change for this field to
+-- update.
+installedComponent_lastReportedTimestamp :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.UTCTime)
+installedComponent_lastReportedTimestamp = Lens.lens (\InstalledComponent' {lastReportedTimestamp} -> lastReportedTimestamp) (\s@InstalledComponent' {} a -> s {lastReportedTimestamp = a} :: InstalledComponent) Prelude.. Lens.mapping Data._Time
+
+-- | The status of how current the data is.
+--
+-- This response is based off of component state changes. The status
+-- reflects component disruptions and deployments. If a component only sees
+-- a configuration update during a deployment, it might not undergo a state
+-- change and this status would not be updated.
+installedComponent_lastStatusChangeTimestamp :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.UTCTime)
+installedComponent_lastStatusChangeTimestamp = Lens.lens (\InstalledComponent' {lastStatusChangeTimestamp} -> lastStatusChangeTimestamp) (\s@InstalledComponent' {} a -> s {lastStatusChangeTimestamp = a} :: InstalledComponent) Prelude.. Lens.mapping Data._Time
+
+-- | The lifecycle state of the component.
+installedComponent_lifecycleState :: Lens.Lens' InstalledComponent (Prelude.Maybe InstalledComponentLifecycleState)
+installedComponent_lifecycleState = Lens.lens (\InstalledComponent' {lifecycleState} -> lifecycleState) (\s@InstalledComponent' {} a -> s {lifecycleState = a} :: InstalledComponent)
+
+-- | A detailed response about the lifecycle state of the component that
+-- explains the reason why a component has an error or is broken.
+installedComponent_lifecycleStateDetails :: Lens.Lens' InstalledComponent (Prelude.Maybe Prelude.Text)
+installedComponent_lifecycleStateDetails = Lens.lens (\InstalledComponent' {lifecycleStateDetails} -> lifecycleStateDetails) (\s@InstalledComponent' {} a -> s {lifecycleStateDetails = a} :: InstalledComponent)
+
+-- | The status codes that indicate the reason for failure whenever the
+-- @lifecycleState@ has an error or is in a broken state.
+--
+-- Greengrass nucleus v2.8.0 or later is required to get an accurate
+-- @lifecycleStatusCodes@ response. This response can be inaccurate in
+-- earlier Greengrass nucleus versions.
+installedComponent_lifecycleStatusCodes :: Lens.Lens' InstalledComponent (Prelude.Maybe [Prelude.Text])
+installedComponent_lifecycleStatusCodes = Lens.lens (\InstalledComponent' {lifecycleStatusCodes} -> lifecycleStatusCodes) (\s@InstalledComponent' {} a -> s {lifecycleStatusCodes = a} :: InstalledComponent) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON InstalledComponent where
+  parseJSON =
+    Data.withObject
+      "InstalledComponent"
+      ( \x ->
+          InstalledComponent'
+            Prelude.<$> (x Data..:? "componentName")
+            Prelude.<*> (x Data..:? "componentVersion")
+            Prelude.<*> (x Data..:? "isRoot")
+            Prelude.<*> (x Data..:? "lastInstallationSource")
+            Prelude.<*> (x Data..:? "lastReportedTimestamp")
+            Prelude.<*> (x Data..:? "lastStatusChangeTimestamp")
+            Prelude.<*> (x Data..:? "lifecycleState")
+            Prelude.<*> (x Data..:? "lifecycleStateDetails")
+            Prelude.<*> ( x
+                            Data..:? "lifecycleStatusCodes"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable InstalledComponent where
+  hashWithSalt _salt InstalledComponent' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` isRoot
+      `Prelude.hashWithSalt` lastInstallationSource
+      `Prelude.hashWithSalt` lastReportedTimestamp
+      `Prelude.hashWithSalt` lastStatusChangeTimestamp
+      `Prelude.hashWithSalt` lifecycleState
+      `Prelude.hashWithSalt` lifecycleStateDetails
+      `Prelude.hashWithSalt` lifecycleStatusCodes
+
+instance Prelude.NFData InstalledComponent where
+  rnf InstalledComponent' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf isRoot
+      `Prelude.seq` Prelude.rnf lastInstallationSource
+      `Prelude.seq` Prelude.rnf lastReportedTimestamp
+      `Prelude.seq` Prelude.rnf lastStatusChangeTimestamp
+      `Prelude.seq` Prelude.rnf lifecycleState
+      `Prelude.seq` Prelude.rnf lifecycleStateDetails
+      `Prelude.seq` Prelude.rnf lifecycleStatusCodes
diff --git a/gen/Amazonka/GreengrassV2/Types/InstalledComponentLifecycleState.hs b/gen/Amazonka/GreengrassV2/Types/InstalledComponentLifecycleState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/InstalledComponentLifecycleState.hs
@@ -0,0 +1,101 @@
+{-# 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.GreengrassV2.Types.InstalledComponentLifecycleState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.InstalledComponentLifecycleState
+  ( InstalledComponentLifecycleState
+      ( ..,
+        InstalledComponentLifecycleState_BROKEN,
+        InstalledComponentLifecycleState_ERRORED,
+        InstalledComponentLifecycleState_FINISHED,
+        InstalledComponentLifecycleState_INSTALLED,
+        InstalledComponentLifecycleState_NEW,
+        InstalledComponentLifecycleState_RUNNING,
+        InstalledComponentLifecycleState_STARTING,
+        InstalledComponentLifecycleState_STOPPING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype InstalledComponentLifecycleState = InstalledComponentLifecycleState'
+  { fromInstalledComponentLifecycleState ::
+      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 InstalledComponentLifecycleState_BROKEN :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_BROKEN = InstalledComponentLifecycleState' "BROKEN"
+
+pattern InstalledComponentLifecycleState_ERRORED :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_ERRORED = InstalledComponentLifecycleState' "ERRORED"
+
+pattern InstalledComponentLifecycleState_FINISHED :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_FINISHED = InstalledComponentLifecycleState' "FINISHED"
+
+pattern InstalledComponentLifecycleState_INSTALLED :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_INSTALLED = InstalledComponentLifecycleState' "INSTALLED"
+
+pattern InstalledComponentLifecycleState_NEW :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_NEW = InstalledComponentLifecycleState' "NEW"
+
+pattern InstalledComponentLifecycleState_RUNNING :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_RUNNING = InstalledComponentLifecycleState' "RUNNING"
+
+pattern InstalledComponentLifecycleState_STARTING :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_STARTING = InstalledComponentLifecycleState' "STARTING"
+
+pattern InstalledComponentLifecycleState_STOPPING :: InstalledComponentLifecycleState
+pattern InstalledComponentLifecycleState_STOPPING = InstalledComponentLifecycleState' "STOPPING"
+
+{-# COMPLETE
+  InstalledComponentLifecycleState_BROKEN,
+  InstalledComponentLifecycleState_ERRORED,
+  InstalledComponentLifecycleState_FINISHED,
+  InstalledComponentLifecycleState_INSTALLED,
+  InstalledComponentLifecycleState_NEW,
+  InstalledComponentLifecycleState_RUNNING,
+  InstalledComponentLifecycleState_STARTING,
+  InstalledComponentLifecycleState_STOPPING,
+  InstalledComponentLifecycleState'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/InstalledComponentTopologyFilter.hs b/gen/Amazonka/GreengrassV2/Types/InstalledComponentTopologyFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/InstalledComponentTopologyFilter.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.GreengrassV2.Types.InstalledComponentTopologyFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.InstalledComponentTopologyFilter
+  ( InstalledComponentTopologyFilter
+      ( ..,
+        InstalledComponentTopologyFilter_ALL,
+        InstalledComponentTopologyFilter_ROOT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype InstalledComponentTopologyFilter = InstalledComponentTopologyFilter'
+  { fromInstalledComponentTopologyFilter ::
+      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 InstalledComponentTopologyFilter_ALL :: InstalledComponentTopologyFilter
+pattern InstalledComponentTopologyFilter_ALL = InstalledComponentTopologyFilter' "ALL"
+
+pattern InstalledComponentTopologyFilter_ROOT :: InstalledComponentTopologyFilter
+pattern InstalledComponentTopologyFilter_ROOT = InstalledComponentTopologyFilter' "ROOT"
+
+{-# COMPLETE
+  InstalledComponentTopologyFilter_ALL,
+  InstalledComponentTopologyFilter_ROOT,
+  InstalledComponentTopologyFilter'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobAbortAction.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobAbortAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobAbortAction.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.IoTJobAbortAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobAbortAction
+  ( IoTJobAbortAction
+      ( ..,
+        IoTJobAbortAction_CANCEL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype IoTJobAbortAction = IoTJobAbortAction'
+  { fromIoTJobAbortAction ::
+      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 IoTJobAbortAction_CANCEL :: IoTJobAbortAction
+pattern IoTJobAbortAction_CANCEL = IoTJobAbortAction' "CANCEL"
+
+{-# COMPLETE
+  IoTJobAbortAction_CANCEL,
+  IoTJobAbortAction'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobAbortConfig.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobAbortConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobAbortConfig.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.GreengrassV2.Types.IoTJobAbortConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobAbortConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.IoTJobAbortCriteria
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a list of criteria that define when and how to cancel a
+-- configuration deployment.
+--
+-- /See:/ 'newIoTJobAbortConfig' smart constructor.
+data IoTJobAbortConfig = IoTJobAbortConfig'
+  { -- | The list of criteria that define when and how to cancel the
+    -- configuration deployment.
+    criteriaList :: Prelude.NonEmpty IoTJobAbortCriteria
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IoTJobAbortConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'criteriaList', 'ioTJobAbortConfig_criteriaList' - The list of criteria that define when and how to cancel the
+-- configuration deployment.
+newIoTJobAbortConfig ::
+  -- | 'criteriaList'
+  Prelude.NonEmpty IoTJobAbortCriteria ->
+  IoTJobAbortConfig
+newIoTJobAbortConfig pCriteriaList_ =
+  IoTJobAbortConfig'
+    { criteriaList =
+        Lens.coerced Lens.# pCriteriaList_
+    }
+
+-- | The list of criteria that define when and how to cancel the
+-- configuration deployment.
+ioTJobAbortConfig_criteriaList :: Lens.Lens' IoTJobAbortConfig (Prelude.NonEmpty IoTJobAbortCriteria)
+ioTJobAbortConfig_criteriaList = Lens.lens (\IoTJobAbortConfig' {criteriaList} -> criteriaList) (\s@IoTJobAbortConfig' {} a -> s {criteriaList = a} :: IoTJobAbortConfig) Prelude.. Lens.coerced
+
+instance Data.FromJSON IoTJobAbortConfig where
+  parseJSON =
+    Data.withObject
+      "IoTJobAbortConfig"
+      ( \x ->
+          IoTJobAbortConfig'
+            Prelude.<$> (x Data..: "criteriaList")
+      )
+
+instance Prelude.Hashable IoTJobAbortConfig where
+  hashWithSalt _salt IoTJobAbortConfig' {..} =
+    _salt `Prelude.hashWithSalt` criteriaList
+
+instance Prelude.NFData IoTJobAbortConfig where
+  rnf IoTJobAbortConfig' {..} = Prelude.rnf criteriaList
+
+instance Data.ToJSON IoTJobAbortConfig where
+  toJSON IoTJobAbortConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("criteriaList" Data..= criteriaList)]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobAbortCriteria.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobAbortCriteria.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobAbortCriteria.hs
@@ -0,0 +1,161 @@
+{-# 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.GreengrassV2.Types.IoTJobAbortCriteria
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobAbortCriteria where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.IoTJobAbortAction
+import Amazonka.GreengrassV2.Types.IoTJobExecutionFailureType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains criteria that define when and how to cancel a job.
+--
+-- The deployment stops if the following conditions are true:
+--
+-- 1.  The number of things that receive the deployment exceeds the
+--     @minNumberOfExecutedThings@.
+--
+-- 2.  The percentage of failures with type @failureType@ exceeds the
+--     @thresholdPercentage@.
+--
+-- /See:/ 'newIoTJobAbortCriteria' smart constructor.
+data IoTJobAbortCriteria = IoTJobAbortCriteria'
+  { -- | The type of job deployment failure that can cancel a job.
+    failureType :: IoTJobExecutionFailureType,
+    -- | The action to perform when the criteria are met.
+    action :: IoTJobAbortAction,
+    -- | The minimum percentage of @failureType@ failures that occur before the
+    -- job can cancel.
+    --
+    -- This parameter supports up to two digits after the decimal (for example,
+    -- you can specify @10.9@ or @10.99@, but not @10.999@).
+    thresholdPercentage :: Prelude.Double,
+    -- | The minimum number of things that receive the configuration before the
+    -- job can cancel.
+    minNumberOfExecutedThings :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IoTJobAbortCriteria' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureType', 'ioTJobAbortCriteria_failureType' - The type of job deployment failure that can cancel a job.
+--
+-- 'action', 'ioTJobAbortCriteria_action' - The action to perform when the criteria are met.
+--
+-- 'thresholdPercentage', 'ioTJobAbortCriteria_thresholdPercentage' - The minimum percentage of @failureType@ failures that occur before the
+-- job can cancel.
+--
+-- This parameter supports up to two digits after the decimal (for example,
+-- you can specify @10.9@ or @10.99@, but not @10.999@).
+--
+-- 'minNumberOfExecutedThings', 'ioTJobAbortCriteria_minNumberOfExecutedThings' - The minimum number of things that receive the configuration before the
+-- job can cancel.
+newIoTJobAbortCriteria ::
+  -- | 'failureType'
+  IoTJobExecutionFailureType ->
+  -- | 'action'
+  IoTJobAbortAction ->
+  -- | 'thresholdPercentage'
+  Prelude.Double ->
+  -- | 'minNumberOfExecutedThings'
+  Prelude.Natural ->
+  IoTJobAbortCriteria
+newIoTJobAbortCriteria
+  pFailureType_
+  pAction_
+  pThresholdPercentage_
+  pMinNumberOfExecutedThings_ =
+    IoTJobAbortCriteria'
+      { failureType = pFailureType_,
+        action = pAction_,
+        thresholdPercentage = pThresholdPercentage_,
+        minNumberOfExecutedThings =
+          pMinNumberOfExecutedThings_
+      }
+
+-- | The type of job deployment failure that can cancel a job.
+ioTJobAbortCriteria_failureType :: Lens.Lens' IoTJobAbortCriteria IoTJobExecutionFailureType
+ioTJobAbortCriteria_failureType = Lens.lens (\IoTJobAbortCriteria' {failureType} -> failureType) (\s@IoTJobAbortCriteria' {} a -> s {failureType = a} :: IoTJobAbortCriteria)
+
+-- | The action to perform when the criteria are met.
+ioTJobAbortCriteria_action :: Lens.Lens' IoTJobAbortCriteria IoTJobAbortAction
+ioTJobAbortCriteria_action = Lens.lens (\IoTJobAbortCriteria' {action} -> action) (\s@IoTJobAbortCriteria' {} a -> s {action = a} :: IoTJobAbortCriteria)
+
+-- | The minimum percentage of @failureType@ failures that occur before the
+-- job can cancel.
+--
+-- This parameter supports up to two digits after the decimal (for example,
+-- you can specify @10.9@ or @10.99@, but not @10.999@).
+ioTJobAbortCriteria_thresholdPercentage :: Lens.Lens' IoTJobAbortCriteria Prelude.Double
+ioTJobAbortCriteria_thresholdPercentage = Lens.lens (\IoTJobAbortCriteria' {thresholdPercentage} -> thresholdPercentage) (\s@IoTJobAbortCriteria' {} a -> s {thresholdPercentage = a} :: IoTJobAbortCriteria)
+
+-- | The minimum number of things that receive the configuration before the
+-- job can cancel.
+ioTJobAbortCriteria_minNumberOfExecutedThings :: Lens.Lens' IoTJobAbortCriteria Prelude.Natural
+ioTJobAbortCriteria_minNumberOfExecutedThings = Lens.lens (\IoTJobAbortCriteria' {minNumberOfExecutedThings} -> minNumberOfExecutedThings) (\s@IoTJobAbortCriteria' {} a -> s {minNumberOfExecutedThings = a} :: IoTJobAbortCriteria)
+
+instance Data.FromJSON IoTJobAbortCriteria where
+  parseJSON =
+    Data.withObject
+      "IoTJobAbortCriteria"
+      ( \x ->
+          IoTJobAbortCriteria'
+            Prelude.<$> (x Data..: "failureType")
+            Prelude.<*> (x Data..: "action")
+            Prelude.<*> (x Data..: "thresholdPercentage")
+            Prelude.<*> (x Data..: "minNumberOfExecutedThings")
+      )
+
+instance Prelude.Hashable IoTJobAbortCriteria where
+  hashWithSalt _salt IoTJobAbortCriteria' {..} =
+    _salt
+      `Prelude.hashWithSalt` failureType
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` thresholdPercentage
+      `Prelude.hashWithSalt` minNumberOfExecutedThings
+
+instance Prelude.NFData IoTJobAbortCriteria where
+  rnf IoTJobAbortCriteria' {..} =
+    Prelude.rnf failureType
+      `Prelude.seq` Prelude.rnf action
+      `Prelude.seq` Prelude.rnf thresholdPercentage
+      `Prelude.seq` Prelude.rnf minNumberOfExecutedThings
+
+instance Data.ToJSON IoTJobAbortCriteria where
+  toJSON IoTJobAbortCriteria' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("failureType" Data..= failureType),
+            Prelude.Just ("action" Data..= action),
+            Prelude.Just
+              ("thresholdPercentage" Data..= thresholdPercentage),
+            Prelude.Just
+              ( "minNumberOfExecutedThings"
+                  Data..= minNumberOfExecutedThings
+              )
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobExecutionFailureType.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobExecutionFailureType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobExecutionFailureType.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.IoTJobExecutionFailureType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobExecutionFailureType
+  ( IoTJobExecutionFailureType
+      ( ..,
+        IoTJobExecutionFailureType_ALL,
+        IoTJobExecutionFailureType_FAILED,
+        IoTJobExecutionFailureType_REJECTED,
+        IoTJobExecutionFailureType_TIMED_OUT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype IoTJobExecutionFailureType = IoTJobExecutionFailureType'
+  { fromIoTJobExecutionFailureType ::
+      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 IoTJobExecutionFailureType_ALL :: IoTJobExecutionFailureType
+pattern IoTJobExecutionFailureType_ALL = IoTJobExecutionFailureType' "ALL"
+
+pattern IoTJobExecutionFailureType_FAILED :: IoTJobExecutionFailureType
+pattern IoTJobExecutionFailureType_FAILED = IoTJobExecutionFailureType' "FAILED"
+
+pattern IoTJobExecutionFailureType_REJECTED :: IoTJobExecutionFailureType
+pattern IoTJobExecutionFailureType_REJECTED = IoTJobExecutionFailureType' "REJECTED"
+
+pattern IoTJobExecutionFailureType_TIMED_OUT :: IoTJobExecutionFailureType
+pattern IoTJobExecutionFailureType_TIMED_OUT = IoTJobExecutionFailureType' "TIMED_OUT"
+
+{-# COMPLETE
+  IoTJobExecutionFailureType_ALL,
+  IoTJobExecutionFailureType_FAILED,
+  IoTJobExecutionFailureType_REJECTED,
+  IoTJobExecutionFailureType_TIMED_OUT,
+  IoTJobExecutionFailureType'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobExecutionsRolloutConfig.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobExecutionsRolloutConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobExecutionsRolloutConfig.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.GreengrassV2.Types.IoTJobExecutionsRolloutConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobExecutionsRolloutConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.IoTJobExponentialRolloutRate
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the rollout configuration for a job. This
+-- configuration defines the rate at which the job deploys a configuration
+-- to a fleet of target devices.
+--
+-- /See:/ 'newIoTJobExecutionsRolloutConfig' smart constructor.
+data IoTJobExecutionsRolloutConfig = IoTJobExecutionsRolloutConfig'
+  { -- | The exponential rate to increase the job rollout rate.
+    exponentialRate :: Prelude.Maybe IoTJobExponentialRolloutRate,
+    -- | The maximum number of devices that receive a pending job notification,
+    -- per minute.
+    maximumPerMinute :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IoTJobExecutionsRolloutConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'exponentialRate', 'ioTJobExecutionsRolloutConfig_exponentialRate' - The exponential rate to increase the job rollout rate.
+--
+-- 'maximumPerMinute', 'ioTJobExecutionsRolloutConfig_maximumPerMinute' - The maximum number of devices that receive a pending job notification,
+-- per minute.
+newIoTJobExecutionsRolloutConfig ::
+  IoTJobExecutionsRolloutConfig
+newIoTJobExecutionsRolloutConfig =
+  IoTJobExecutionsRolloutConfig'
+    { exponentialRate =
+        Prelude.Nothing,
+      maximumPerMinute = Prelude.Nothing
+    }
+
+-- | The exponential rate to increase the job rollout rate.
+ioTJobExecutionsRolloutConfig_exponentialRate :: Lens.Lens' IoTJobExecutionsRolloutConfig (Prelude.Maybe IoTJobExponentialRolloutRate)
+ioTJobExecutionsRolloutConfig_exponentialRate = Lens.lens (\IoTJobExecutionsRolloutConfig' {exponentialRate} -> exponentialRate) (\s@IoTJobExecutionsRolloutConfig' {} a -> s {exponentialRate = a} :: IoTJobExecutionsRolloutConfig)
+
+-- | The maximum number of devices that receive a pending job notification,
+-- per minute.
+ioTJobExecutionsRolloutConfig_maximumPerMinute :: Lens.Lens' IoTJobExecutionsRolloutConfig (Prelude.Maybe Prelude.Natural)
+ioTJobExecutionsRolloutConfig_maximumPerMinute = Lens.lens (\IoTJobExecutionsRolloutConfig' {maximumPerMinute} -> maximumPerMinute) (\s@IoTJobExecutionsRolloutConfig' {} a -> s {maximumPerMinute = a} :: IoTJobExecutionsRolloutConfig)
+
+instance Data.FromJSON IoTJobExecutionsRolloutConfig where
+  parseJSON =
+    Data.withObject
+      "IoTJobExecutionsRolloutConfig"
+      ( \x ->
+          IoTJobExecutionsRolloutConfig'
+            Prelude.<$> (x Data..:? "exponentialRate")
+            Prelude.<*> (x Data..:? "maximumPerMinute")
+      )
+
+instance
+  Prelude.Hashable
+    IoTJobExecutionsRolloutConfig
+  where
+  hashWithSalt _salt IoTJobExecutionsRolloutConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` exponentialRate
+      `Prelude.hashWithSalt` maximumPerMinute
+
+instance Prelude.NFData IoTJobExecutionsRolloutConfig where
+  rnf IoTJobExecutionsRolloutConfig' {..} =
+    Prelude.rnf exponentialRate
+      `Prelude.seq` Prelude.rnf maximumPerMinute
+
+instance Data.ToJSON IoTJobExecutionsRolloutConfig where
+  toJSON IoTJobExecutionsRolloutConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("exponentialRate" Data..=)
+              Prelude.<$> exponentialRate,
+            ("maximumPerMinute" Data..=)
+              Prelude.<$> maximumPerMinute
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobExponentialRolloutRate.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobExponentialRolloutRate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobExponentialRolloutRate.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.IoTJobExponentialRolloutRate
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobExponentialRolloutRate where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.IoTJobRateIncreaseCriteria
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an exponential rollout rate for a
+-- configuration deployment job.
+--
+-- /See:/ 'newIoTJobExponentialRolloutRate' smart constructor.
+data IoTJobExponentialRolloutRate = IoTJobExponentialRolloutRate'
+  { -- | The minimum number of devices that receive a pending job notification,
+    -- per minute, when the job starts. This parameter defines the initial
+    -- rollout rate of the job.
+    baseRatePerMinute :: Prelude.Natural,
+    -- | The exponential factor to increase the rollout rate for the job.
+    --
+    -- This parameter supports up to one digit after the decimal (for example,
+    -- you can specify @1.5@, but not @1.55@).
+    incrementFactor :: Prelude.Double,
+    -- | The criteria to increase the rollout rate for the job.
+    rateIncreaseCriteria :: IoTJobRateIncreaseCriteria
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IoTJobExponentialRolloutRate' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'baseRatePerMinute', 'ioTJobExponentialRolloutRate_baseRatePerMinute' - The minimum number of devices that receive a pending job notification,
+-- per minute, when the job starts. This parameter defines the initial
+-- rollout rate of the job.
+--
+-- 'incrementFactor', 'ioTJobExponentialRolloutRate_incrementFactor' - The exponential factor to increase the rollout rate for the job.
+--
+-- This parameter supports up to one digit after the decimal (for example,
+-- you can specify @1.5@, but not @1.55@).
+--
+-- 'rateIncreaseCriteria', 'ioTJobExponentialRolloutRate_rateIncreaseCriteria' - The criteria to increase the rollout rate for the job.
+newIoTJobExponentialRolloutRate ::
+  -- | 'baseRatePerMinute'
+  Prelude.Natural ->
+  -- | 'incrementFactor'
+  Prelude.Double ->
+  -- | 'rateIncreaseCriteria'
+  IoTJobRateIncreaseCriteria ->
+  IoTJobExponentialRolloutRate
+newIoTJobExponentialRolloutRate
+  pBaseRatePerMinute_
+  pIncrementFactor_
+  pRateIncreaseCriteria_ =
+    IoTJobExponentialRolloutRate'
+      { baseRatePerMinute =
+          pBaseRatePerMinute_,
+        incrementFactor = pIncrementFactor_,
+        rateIncreaseCriteria = pRateIncreaseCriteria_
+      }
+
+-- | The minimum number of devices that receive a pending job notification,
+-- per minute, when the job starts. This parameter defines the initial
+-- rollout rate of the job.
+ioTJobExponentialRolloutRate_baseRatePerMinute :: Lens.Lens' IoTJobExponentialRolloutRate Prelude.Natural
+ioTJobExponentialRolloutRate_baseRatePerMinute = Lens.lens (\IoTJobExponentialRolloutRate' {baseRatePerMinute} -> baseRatePerMinute) (\s@IoTJobExponentialRolloutRate' {} a -> s {baseRatePerMinute = a} :: IoTJobExponentialRolloutRate)
+
+-- | The exponential factor to increase the rollout rate for the job.
+--
+-- This parameter supports up to one digit after the decimal (for example,
+-- you can specify @1.5@, but not @1.55@).
+ioTJobExponentialRolloutRate_incrementFactor :: Lens.Lens' IoTJobExponentialRolloutRate Prelude.Double
+ioTJobExponentialRolloutRate_incrementFactor = Lens.lens (\IoTJobExponentialRolloutRate' {incrementFactor} -> incrementFactor) (\s@IoTJobExponentialRolloutRate' {} a -> s {incrementFactor = a} :: IoTJobExponentialRolloutRate)
+
+-- | The criteria to increase the rollout rate for the job.
+ioTJobExponentialRolloutRate_rateIncreaseCriteria :: Lens.Lens' IoTJobExponentialRolloutRate IoTJobRateIncreaseCriteria
+ioTJobExponentialRolloutRate_rateIncreaseCriteria = Lens.lens (\IoTJobExponentialRolloutRate' {rateIncreaseCriteria} -> rateIncreaseCriteria) (\s@IoTJobExponentialRolloutRate' {} a -> s {rateIncreaseCriteria = a} :: IoTJobExponentialRolloutRate)
+
+instance Data.FromJSON IoTJobExponentialRolloutRate where
+  parseJSON =
+    Data.withObject
+      "IoTJobExponentialRolloutRate"
+      ( \x ->
+          IoTJobExponentialRolloutRate'
+            Prelude.<$> (x Data..: "baseRatePerMinute")
+            Prelude.<*> (x Data..: "incrementFactor")
+            Prelude.<*> (x Data..: "rateIncreaseCriteria")
+      )
+
+instance
+  Prelude.Hashable
+    IoTJobExponentialRolloutRate
+  where
+  hashWithSalt _salt IoTJobExponentialRolloutRate' {..} =
+    _salt
+      `Prelude.hashWithSalt` baseRatePerMinute
+      `Prelude.hashWithSalt` incrementFactor
+      `Prelude.hashWithSalt` rateIncreaseCriteria
+
+instance Prelude.NFData IoTJobExponentialRolloutRate where
+  rnf IoTJobExponentialRolloutRate' {..} =
+    Prelude.rnf baseRatePerMinute
+      `Prelude.seq` Prelude.rnf incrementFactor
+      `Prelude.seq` Prelude.rnf rateIncreaseCriteria
+
+instance Data.ToJSON IoTJobExponentialRolloutRate where
+  toJSON IoTJobExponentialRolloutRate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("baseRatePerMinute" Data..= baseRatePerMinute),
+            Prelude.Just
+              ("incrementFactor" Data..= incrementFactor),
+            Prelude.Just
+              ( "rateIncreaseCriteria"
+                  Data..= rateIncreaseCriteria
+              )
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobRateIncreaseCriteria.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobRateIncreaseCriteria.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobRateIncreaseCriteria.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.IoTJobRateIncreaseCriteria
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobRateIncreaseCriteria 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 criteria to meet before a job increases its
+-- rollout rate. Specify either @numberOfNotifiedThings@ or
+-- @numberOfSucceededThings@.
+--
+-- /See:/ 'newIoTJobRateIncreaseCriteria' smart constructor.
+data IoTJobRateIncreaseCriteria = IoTJobRateIncreaseCriteria'
+  { -- | The number of devices to receive the job notification before the rollout
+    -- rate increases.
+    numberOfNotifiedThings :: Prelude.Maybe Prelude.Natural,
+    -- | The number of devices to successfully run the configuration job before
+    -- the rollout rate increases.
+    numberOfSucceededThings :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IoTJobRateIncreaseCriteria' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'numberOfNotifiedThings', 'ioTJobRateIncreaseCriteria_numberOfNotifiedThings' - The number of devices to receive the job notification before the rollout
+-- rate increases.
+--
+-- 'numberOfSucceededThings', 'ioTJobRateIncreaseCriteria_numberOfSucceededThings' - The number of devices to successfully run the configuration job before
+-- the rollout rate increases.
+newIoTJobRateIncreaseCriteria ::
+  IoTJobRateIncreaseCriteria
+newIoTJobRateIncreaseCriteria =
+  IoTJobRateIncreaseCriteria'
+    { numberOfNotifiedThings =
+        Prelude.Nothing,
+      numberOfSucceededThings = Prelude.Nothing
+    }
+
+-- | The number of devices to receive the job notification before the rollout
+-- rate increases.
+ioTJobRateIncreaseCriteria_numberOfNotifiedThings :: Lens.Lens' IoTJobRateIncreaseCriteria (Prelude.Maybe Prelude.Natural)
+ioTJobRateIncreaseCriteria_numberOfNotifiedThings = Lens.lens (\IoTJobRateIncreaseCriteria' {numberOfNotifiedThings} -> numberOfNotifiedThings) (\s@IoTJobRateIncreaseCriteria' {} a -> s {numberOfNotifiedThings = a} :: IoTJobRateIncreaseCriteria)
+
+-- | The number of devices to successfully run the configuration job before
+-- the rollout rate increases.
+ioTJobRateIncreaseCriteria_numberOfSucceededThings :: Lens.Lens' IoTJobRateIncreaseCriteria (Prelude.Maybe Prelude.Natural)
+ioTJobRateIncreaseCriteria_numberOfSucceededThings = Lens.lens (\IoTJobRateIncreaseCriteria' {numberOfSucceededThings} -> numberOfSucceededThings) (\s@IoTJobRateIncreaseCriteria' {} a -> s {numberOfSucceededThings = a} :: IoTJobRateIncreaseCriteria)
+
+instance Data.FromJSON IoTJobRateIncreaseCriteria where
+  parseJSON =
+    Data.withObject
+      "IoTJobRateIncreaseCriteria"
+      ( \x ->
+          IoTJobRateIncreaseCriteria'
+            Prelude.<$> (x Data..:? "numberOfNotifiedThings")
+            Prelude.<*> (x Data..:? "numberOfSucceededThings")
+      )
+
+instance Prelude.Hashable IoTJobRateIncreaseCriteria where
+  hashWithSalt _salt IoTJobRateIncreaseCriteria' {..} =
+    _salt
+      `Prelude.hashWithSalt` numberOfNotifiedThings
+      `Prelude.hashWithSalt` numberOfSucceededThings
+
+instance Prelude.NFData IoTJobRateIncreaseCriteria where
+  rnf IoTJobRateIncreaseCriteria' {..} =
+    Prelude.rnf numberOfNotifiedThings
+      `Prelude.seq` Prelude.rnf numberOfSucceededThings
+
+instance Data.ToJSON IoTJobRateIncreaseCriteria where
+  toJSON IoTJobRateIncreaseCriteria' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("numberOfNotifiedThings" Data..=)
+              Prelude.<$> numberOfNotifiedThings,
+            ("numberOfSucceededThings" Data..=)
+              Prelude.<$> numberOfSucceededThings
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/IoTJobTimeoutConfig.hs b/gen/Amazonka/GreengrassV2/Types/IoTJobTimeoutConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/IoTJobTimeoutConfig.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.GreengrassV2.Types.IoTJobTimeoutConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.IoTJobTimeoutConfig 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 the timeout configuration for a job.
+--
+-- /See:/ 'newIoTJobTimeoutConfig' smart constructor.
+data IoTJobTimeoutConfig = IoTJobTimeoutConfig'
+  { -- | The amount of time, in minutes, that devices have to complete the job.
+    -- The timer starts when the job status is set to @IN_PROGRESS@. If the job
+    -- status doesn\'t change to a terminal state before the time expires, then
+    -- the job status is set to @TIMED_OUT@.
+    --
+    -- The timeout interval must be between 1 minute and 7 days (10080
+    -- minutes).
+    inProgressTimeoutInMinutes :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IoTJobTimeoutConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'inProgressTimeoutInMinutes', 'ioTJobTimeoutConfig_inProgressTimeoutInMinutes' - The amount of time, in minutes, that devices have to complete the job.
+-- The timer starts when the job status is set to @IN_PROGRESS@. If the job
+-- status doesn\'t change to a terminal state before the time expires, then
+-- the job status is set to @TIMED_OUT@.
+--
+-- The timeout interval must be between 1 minute and 7 days (10080
+-- minutes).
+newIoTJobTimeoutConfig ::
+  IoTJobTimeoutConfig
+newIoTJobTimeoutConfig =
+  IoTJobTimeoutConfig'
+    { inProgressTimeoutInMinutes =
+        Prelude.Nothing
+    }
+
+-- | The amount of time, in minutes, that devices have to complete the job.
+-- The timer starts when the job status is set to @IN_PROGRESS@. If the job
+-- status doesn\'t change to a terminal state before the time expires, then
+-- the job status is set to @TIMED_OUT@.
+--
+-- The timeout interval must be between 1 minute and 7 days (10080
+-- minutes).
+ioTJobTimeoutConfig_inProgressTimeoutInMinutes :: Lens.Lens' IoTJobTimeoutConfig (Prelude.Maybe Prelude.Integer)
+ioTJobTimeoutConfig_inProgressTimeoutInMinutes = Lens.lens (\IoTJobTimeoutConfig' {inProgressTimeoutInMinutes} -> inProgressTimeoutInMinutes) (\s@IoTJobTimeoutConfig' {} a -> s {inProgressTimeoutInMinutes = a} :: IoTJobTimeoutConfig)
+
+instance Data.FromJSON IoTJobTimeoutConfig where
+  parseJSON =
+    Data.withObject
+      "IoTJobTimeoutConfig"
+      ( \x ->
+          IoTJobTimeoutConfig'
+            Prelude.<$> (x Data..:? "inProgressTimeoutInMinutes")
+      )
+
+instance Prelude.Hashable IoTJobTimeoutConfig where
+  hashWithSalt _salt IoTJobTimeoutConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` inProgressTimeoutInMinutes
+
+instance Prelude.NFData IoTJobTimeoutConfig where
+  rnf IoTJobTimeoutConfig' {..} =
+    Prelude.rnf inProgressTimeoutInMinutes
+
+instance Data.ToJSON IoTJobTimeoutConfig where
+  toJSON IoTJobTimeoutConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("inProgressTimeoutInMinutes" Data..=)
+              Prelude.<$> inProgressTimeoutInMinutes
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaContainerParams.hs b/gen/Amazonka/GreengrassV2/Types/LambdaContainerParams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaContainerParams.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.LambdaContainerParams
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaContainerParams where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.LambdaDeviceMount
+import Amazonka.GreengrassV2.Types.LambdaVolumeMount
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a container in which Lambda functions run on
+-- Greengrass core devices.
+--
+-- /See:/ 'newLambdaContainerParams' smart constructor.
+data LambdaContainerParams = LambdaContainerParams'
+  { -- | The list of system devices that the container can access.
+    devices :: Prelude.Maybe [LambdaDeviceMount],
+    -- | The memory size of the container, expressed in kilobytes.
+    --
+    -- Default: @16384@ (16 MB)
+    memorySizeInKB :: Prelude.Maybe Prelude.Int,
+    -- | Whether or not the container can read information from the device\'s
+    -- @\/sys@ folder.
+    --
+    -- Default: @false@
+    mountROSysfs :: Prelude.Maybe Prelude.Bool,
+    -- | The list of volumes that the container can access.
+    volumes :: Prelude.Maybe [LambdaVolumeMount]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaContainerParams' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'devices', 'lambdaContainerParams_devices' - The list of system devices that the container can access.
+--
+-- 'memorySizeInKB', 'lambdaContainerParams_memorySizeInKB' - The memory size of the container, expressed in kilobytes.
+--
+-- Default: @16384@ (16 MB)
+--
+-- 'mountROSysfs', 'lambdaContainerParams_mountROSysfs' - Whether or not the container can read information from the device\'s
+-- @\/sys@ folder.
+--
+-- Default: @false@
+--
+-- 'volumes', 'lambdaContainerParams_volumes' - The list of volumes that the container can access.
+newLambdaContainerParams ::
+  LambdaContainerParams
+newLambdaContainerParams =
+  LambdaContainerParams'
+    { devices = Prelude.Nothing,
+      memorySizeInKB = Prelude.Nothing,
+      mountROSysfs = Prelude.Nothing,
+      volumes = Prelude.Nothing
+    }
+
+-- | The list of system devices that the container can access.
+lambdaContainerParams_devices :: Lens.Lens' LambdaContainerParams (Prelude.Maybe [LambdaDeviceMount])
+lambdaContainerParams_devices = Lens.lens (\LambdaContainerParams' {devices} -> devices) (\s@LambdaContainerParams' {} a -> s {devices = a} :: LambdaContainerParams) Prelude.. Lens.mapping Lens.coerced
+
+-- | The memory size of the container, expressed in kilobytes.
+--
+-- Default: @16384@ (16 MB)
+lambdaContainerParams_memorySizeInKB :: Lens.Lens' LambdaContainerParams (Prelude.Maybe Prelude.Int)
+lambdaContainerParams_memorySizeInKB = Lens.lens (\LambdaContainerParams' {memorySizeInKB} -> memorySizeInKB) (\s@LambdaContainerParams' {} a -> s {memorySizeInKB = a} :: LambdaContainerParams)
+
+-- | Whether or not the container can read information from the device\'s
+-- @\/sys@ folder.
+--
+-- Default: @false@
+lambdaContainerParams_mountROSysfs :: Lens.Lens' LambdaContainerParams (Prelude.Maybe Prelude.Bool)
+lambdaContainerParams_mountROSysfs = Lens.lens (\LambdaContainerParams' {mountROSysfs} -> mountROSysfs) (\s@LambdaContainerParams' {} a -> s {mountROSysfs = a} :: LambdaContainerParams)
+
+-- | The list of volumes that the container can access.
+lambdaContainerParams_volumes :: Lens.Lens' LambdaContainerParams (Prelude.Maybe [LambdaVolumeMount])
+lambdaContainerParams_volumes = Lens.lens (\LambdaContainerParams' {volumes} -> volumes) (\s@LambdaContainerParams' {} a -> s {volumes = a} :: LambdaContainerParams) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable LambdaContainerParams where
+  hashWithSalt _salt LambdaContainerParams' {..} =
+    _salt
+      `Prelude.hashWithSalt` devices
+      `Prelude.hashWithSalt` memorySizeInKB
+      `Prelude.hashWithSalt` mountROSysfs
+      `Prelude.hashWithSalt` volumes
+
+instance Prelude.NFData LambdaContainerParams where
+  rnf LambdaContainerParams' {..} =
+    Prelude.rnf devices
+      `Prelude.seq` Prelude.rnf memorySizeInKB
+      `Prelude.seq` Prelude.rnf mountROSysfs
+      `Prelude.seq` Prelude.rnf volumes
+
+instance Data.ToJSON LambdaContainerParams where
+  toJSON LambdaContainerParams' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("devices" Data..=) Prelude.<$> devices,
+            ("memorySizeInKB" Data..=)
+              Prelude.<$> memorySizeInKB,
+            ("mountROSysfs" Data..=) Prelude.<$> mountROSysfs,
+            ("volumes" Data..=) Prelude.<$> volumes
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaDeviceMount.hs b/gen/Amazonka/GreengrassV2/Types/LambdaDeviceMount.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaDeviceMount.hs
@@ -0,0 +1,117 @@
+{-# 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.GreengrassV2.Types.LambdaDeviceMount
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaDeviceMount where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.LambdaFilesystemPermission
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a device that Linux processes in a container
+-- can access.
+--
+-- /See:/ 'newLambdaDeviceMount' smart constructor.
+data LambdaDeviceMount = LambdaDeviceMount'
+  { -- | Whether or not to add the component\'s system user as an owner of the
+    -- device.
+    --
+    -- Default: @false@
+    addGroupOwner :: Prelude.Maybe Prelude.Bool,
+    -- | The permission to access the device: read\/only (@ro@) or read\/write
+    -- (@rw@).
+    --
+    -- Default: @ro@
+    permission :: Prelude.Maybe LambdaFilesystemPermission,
+    -- | The mount path for the device in the file system.
+    path :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaDeviceMount' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'addGroupOwner', 'lambdaDeviceMount_addGroupOwner' - Whether or not to add the component\'s system user as an owner of the
+-- device.
+--
+-- Default: @false@
+--
+-- 'permission', 'lambdaDeviceMount_permission' - The permission to access the device: read\/only (@ro@) or read\/write
+-- (@rw@).
+--
+-- Default: @ro@
+--
+-- 'path', 'lambdaDeviceMount_path' - The mount path for the device in the file system.
+newLambdaDeviceMount ::
+  -- | 'path'
+  Prelude.Text ->
+  LambdaDeviceMount
+newLambdaDeviceMount pPath_ =
+  LambdaDeviceMount'
+    { addGroupOwner = Prelude.Nothing,
+      permission = Prelude.Nothing,
+      path = pPath_
+    }
+
+-- | Whether or not to add the component\'s system user as an owner of the
+-- device.
+--
+-- Default: @false@
+lambdaDeviceMount_addGroupOwner :: Lens.Lens' LambdaDeviceMount (Prelude.Maybe Prelude.Bool)
+lambdaDeviceMount_addGroupOwner = Lens.lens (\LambdaDeviceMount' {addGroupOwner} -> addGroupOwner) (\s@LambdaDeviceMount' {} a -> s {addGroupOwner = a} :: LambdaDeviceMount)
+
+-- | The permission to access the device: read\/only (@ro@) or read\/write
+-- (@rw@).
+--
+-- Default: @ro@
+lambdaDeviceMount_permission :: Lens.Lens' LambdaDeviceMount (Prelude.Maybe LambdaFilesystemPermission)
+lambdaDeviceMount_permission = Lens.lens (\LambdaDeviceMount' {permission} -> permission) (\s@LambdaDeviceMount' {} a -> s {permission = a} :: LambdaDeviceMount)
+
+-- | The mount path for the device in the file system.
+lambdaDeviceMount_path :: Lens.Lens' LambdaDeviceMount Prelude.Text
+lambdaDeviceMount_path = Lens.lens (\LambdaDeviceMount' {path} -> path) (\s@LambdaDeviceMount' {} a -> s {path = a} :: LambdaDeviceMount)
+
+instance Prelude.Hashable LambdaDeviceMount where
+  hashWithSalt _salt LambdaDeviceMount' {..} =
+    _salt
+      `Prelude.hashWithSalt` addGroupOwner
+      `Prelude.hashWithSalt` permission
+      `Prelude.hashWithSalt` path
+
+instance Prelude.NFData LambdaDeviceMount where
+  rnf LambdaDeviceMount' {..} =
+    Prelude.rnf addGroupOwner
+      `Prelude.seq` Prelude.rnf permission
+      `Prelude.seq` Prelude.rnf path
+
+instance Data.ToJSON LambdaDeviceMount where
+  toJSON LambdaDeviceMount' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("addGroupOwner" Data..=) Prelude.<$> addGroupOwner,
+            ("permission" Data..=) Prelude.<$> permission,
+            Prelude.Just ("path" Data..= path)
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaEventSource.hs b/gen/Amazonka/GreengrassV2/Types/LambdaEventSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaEventSource.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.GreengrassV2.Types.LambdaEventSource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaEventSource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.LambdaEventSourceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an event source for an Lambda function. The
+-- event source defines the topics on which this Lambda function subscribes
+-- to receive messages that run the function.
+--
+-- /See:/ 'newLambdaEventSource' smart constructor.
+data LambdaEventSource = LambdaEventSource'
+  { -- | The topic to which to subscribe to receive event messages.
+    topic :: Prelude.Text,
+    -- | The type of event source. Choose from the following options:
+    --
+    -- -   @PUB_SUB@ – Subscribe to local publish\/subscribe messages. This
+    --     event source type doesn\'t support MQTT wildcards (@+@ and @#@) in
+    --     the event source topic.
+    --
+    -- -   @IOT_CORE@ – Subscribe to Amazon Web Services IoT Core MQTT
+    --     messages. This event source type supports MQTT wildcards (@+@ and
+    --     @#@) in the event source topic.
+    type' :: LambdaEventSourceType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaEventSource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'topic', 'lambdaEventSource_topic' - The topic to which to subscribe to receive event messages.
+--
+-- 'type'', 'lambdaEventSource_type' - The type of event source. Choose from the following options:
+--
+-- -   @PUB_SUB@ – Subscribe to local publish\/subscribe messages. This
+--     event source type doesn\'t support MQTT wildcards (@+@ and @#@) in
+--     the event source topic.
+--
+-- -   @IOT_CORE@ – Subscribe to Amazon Web Services IoT Core MQTT
+--     messages. This event source type supports MQTT wildcards (@+@ and
+--     @#@) in the event source topic.
+newLambdaEventSource ::
+  -- | 'topic'
+  Prelude.Text ->
+  -- | 'type''
+  LambdaEventSourceType ->
+  LambdaEventSource
+newLambdaEventSource pTopic_ pType_ =
+  LambdaEventSource' {topic = pTopic_, type' = pType_}
+
+-- | The topic to which to subscribe to receive event messages.
+lambdaEventSource_topic :: Lens.Lens' LambdaEventSource Prelude.Text
+lambdaEventSource_topic = Lens.lens (\LambdaEventSource' {topic} -> topic) (\s@LambdaEventSource' {} a -> s {topic = a} :: LambdaEventSource)
+
+-- | The type of event source. Choose from the following options:
+--
+-- -   @PUB_SUB@ – Subscribe to local publish\/subscribe messages. This
+--     event source type doesn\'t support MQTT wildcards (@+@ and @#@) in
+--     the event source topic.
+--
+-- -   @IOT_CORE@ – Subscribe to Amazon Web Services IoT Core MQTT
+--     messages. This event source type supports MQTT wildcards (@+@ and
+--     @#@) in the event source topic.
+lambdaEventSource_type :: Lens.Lens' LambdaEventSource LambdaEventSourceType
+lambdaEventSource_type = Lens.lens (\LambdaEventSource' {type'} -> type') (\s@LambdaEventSource' {} a -> s {type' = a} :: LambdaEventSource)
+
+instance Prelude.Hashable LambdaEventSource where
+  hashWithSalt _salt LambdaEventSource' {..} =
+    _salt
+      `Prelude.hashWithSalt` topic
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData LambdaEventSource where
+  rnf LambdaEventSource' {..} =
+    Prelude.rnf topic `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON LambdaEventSource where
+  toJSON LambdaEventSource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("topic" Data..= topic),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaEventSourceType.hs b/gen/Amazonka/GreengrassV2/Types/LambdaEventSourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaEventSourceType.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.GreengrassV2.Types.LambdaEventSourceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaEventSourceType
+  ( LambdaEventSourceType
+      ( ..,
+        LambdaEventSourceType_IOT_CORE,
+        LambdaEventSourceType_PUB_SUB
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LambdaEventSourceType = LambdaEventSourceType'
+  { fromLambdaEventSourceType ::
+      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 LambdaEventSourceType_IOT_CORE :: LambdaEventSourceType
+pattern LambdaEventSourceType_IOT_CORE = LambdaEventSourceType' "IOT_CORE"
+
+pattern LambdaEventSourceType_PUB_SUB :: LambdaEventSourceType
+pattern LambdaEventSourceType_PUB_SUB = LambdaEventSourceType' "PUB_SUB"
+
+{-# COMPLETE
+  LambdaEventSourceType_IOT_CORE,
+  LambdaEventSourceType_PUB_SUB,
+  LambdaEventSourceType'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaExecutionParameters.hs b/gen/Amazonka/GreengrassV2/Types/LambdaExecutionParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaExecutionParameters.hs
@@ -0,0 +1,274 @@
+{-# 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.GreengrassV2.Types.LambdaExecutionParameters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaExecutionParameters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.LambdaEventSource
+import Amazonka.GreengrassV2.Types.LambdaInputPayloadEncodingType
+import Amazonka.GreengrassV2.Types.LambdaLinuxProcessParams
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains parameters for a Lambda function that runs on IoT Greengrass.
+--
+-- /See:/ 'newLambdaExecutionParameters' smart constructor.
+data LambdaExecutionParameters = LambdaExecutionParameters'
+  { -- | The map of environment variables that are available to the Lambda
+    -- function when it runs.
+    environmentVariables :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The list of event sources to which to subscribe to receive work
+    -- messages. The Lambda function runs when it receives a message from an
+    -- event source. You can subscribe this function to local
+    -- publish\/subscribe messages and Amazon Web Services IoT Core MQTT
+    -- messages.
+    eventSources :: Prelude.Maybe [LambdaEventSource],
+    -- | The list of arguments to pass to the Lambda function when it runs.
+    execArgs :: Prelude.Maybe [Prelude.Text],
+    -- | The encoding type that the Lambda function supports.
+    --
+    -- Default: @json@
+    inputPayloadEncodingType :: Prelude.Maybe LambdaInputPayloadEncodingType,
+    -- | The parameters for the Linux process that contains the Lambda function.
+    linuxProcessParams :: Prelude.Maybe LambdaLinuxProcessParams,
+    -- | The maximum amount of time in seconds that a non-pinned Lambda function
+    -- can idle before the IoT Greengrass Core software stops its process.
+    maxIdleTimeInSeconds :: Prelude.Maybe Prelude.Int,
+    -- | The maximum number of instances that a non-pinned Lambda function can
+    -- run at the same time.
+    maxInstancesCount :: Prelude.Maybe Prelude.Int,
+    -- | The maximum size of the message queue for the Lambda function component.
+    -- The IoT Greengrass core stores messages in a FIFO (first-in-first-out)
+    -- queue until it can run the Lambda function to consume each message.
+    maxQueueSize :: Prelude.Maybe Prelude.Int,
+    -- | Whether or not the Lambda function is pinned, or long-lived.
+    --
+    -- -   A pinned Lambda function starts when IoT Greengrass starts and keeps
+    --     running in its own container.
+    --
+    -- -   A non-pinned Lambda function starts only when it receives a work
+    --     item and exists after it idles for @maxIdleTimeInSeconds@. If the
+    --     function has multiple work items, the IoT Greengrass Core software
+    --     creates multiple instances of the function.
+    --
+    -- Default: @true@
+    pinned :: Prelude.Maybe Prelude.Bool,
+    -- | The interval in seconds at which a pinned (also known as long-lived)
+    -- Lambda function component sends status updates to the Lambda manager
+    -- component.
+    statusTimeoutInSeconds :: Prelude.Maybe Prelude.Int,
+    -- | The maximum amount of time in seconds that the Lambda function can
+    -- process a work item.
+    timeoutInSeconds :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaExecutionParameters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'environmentVariables', 'lambdaExecutionParameters_environmentVariables' - The map of environment variables that are available to the Lambda
+-- function when it runs.
+--
+-- 'eventSources', 'lambdaExecutionParameters_eventSources' - The list of event sources to which to subscribe to receive work
+-- messages. The Lambda function runs when it receives a message from an
+-- event source. You can subscribe this function to local
+-- publish\/subscribe messages and Amazon Web Services IoT Core MQTT
+-- messages.
+--
+-- 'execArgs', 'lambdaExecutionParameters_execArgs' - The list of arguments to pass to the Lambda function when it runs.
+--
+-- 'inputPayloadEncodingType', 'lambdaExecutionParameters_inputPayloadEncodingType' - The encoding type that the Lambda function supports.
+--
+-- Default: @json@
+--
+-- 'linuxProcessParams', 'lambdaExecutionParameters_linuxProcessParams' - The parameters for the Linux process that contains the Lambda function.
+--
+-- 'maxIdleTimeInSeconds', 'lambdaExecutionParameters_maxIdleTimeInSeconds' - The maximum amount of time in seconds that a non-pinned Lambda function
+-- can idle before the IoT Greengrass Core software stops its process.
+--
+-- 'maxInstancesCount', 'lambdaExecutionParameters_maxInstancesCount' - The maximum number of instances that a non-pinned Lambda function can
+-- run at the same time.
+--
+-- 'maxQueueSize', 'lambdaExecutionParameters_maxQueueSize' - The maximum size of the message queue for the Lambda function component.
+-- The IoT Greengrass core stores messages in a FIFO (first-in-first-out)
+-- queue until it can run the Lambda function to consume each message.
+--
+-- 'pinned', 'lambdaExecutionParameters_pinned' - Whether or not the Lambda function is pinned, or long-lived.
+--
+-- -   A pinned Lambda function starts when IoT Greengrass starts and keeps
+--     running in its own container.
+--
+-- -   A non-pinned Lambda function starts only when it receives a work
+--     item and exists after it idles for @maxIdleTimeInSeconds@. If the
+--     function has multiple work items, the IoT Greengrass Core software
+--     creates multiple instances of the function.
+--
+-- Default: @true@
+--
+-- 'statusTimeoutInSeconds', 'lambdaExecutionParameters_statusTimeoutInSeconds' - The interval in seconds at which a pinned (also known as long-lived)
+-- Lambda function component sends status updates to the Lambda manager
+-- component.
+--
+-- 'timeoutInSeconds', 'lambdaExecutionParameters_timeoutInSeconds' - The maximum amount of time in seconds that the Lambda function can
+-- process a work item.
+newLambdaExecutionParameters ::
+  LambdaExecutionParameters
+newLambdaExecutionParameters =
+  LambdaExecutionParameters'
+    { environmentVariables =
+        Prelude.Nothing,
+      eventSources = Prelude.Nothing,
+      execArgs = Prelude.Nothing,
+      inputPayloadEncodingType = Prelude.Nothing,
+      linuxProcessParams = Prelude.Nothing,
+      maxIdleTimeInSeconds = Prelude.Nothing,
+      maxInstancesCount = Prelude.Nothing,
+      maxQueueSize = Prelude.Nothing,
+      pinned = Prelude.Nothing,
+      statusTimeoutInSeconds = Prelude.Nothing,
+      timeoutInSeconds = Prelude.Nothing
+    }
+
+-- | The map of environment variables that are available to the Lambda
+-- function when it runs.
+lambdaExecutionParameters_environmentVariables :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+lambdaExecutionParameters_environmentVariables = Lens.lens (\LambdaExecutionParameters' {environmentVariables} -> environmentVariables) (\s@LambdaExecutionParameters' {} a -> s {environmentVariables = a} :: LambdaExecutionParameters) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of event sources to which to subscribe to receive work
+-- messages. The Lambda function runs when it receives a message from an
+-- event source. You can subscribe this function to local
+-- publish\/subscribe messages and Amazon Web Services IoT Core MQTT
+-- messages.
+lambdaExecutionParameters_eventSources :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe [LambdaEventSource])
+lambdaExecutionParameters_eventSources = Lens.lens (\LambdaExecutionParameters' {eventSources} -> eventSources) (\s@LambdaExecutionParameters' {} a -> s {eventSources = a} :: LambdaExecutionParameters) Prelude.. Lens.mapping Lens.coerced
+
+-- | The list of arguments to pass to the Lambda function when it runs.
+lambdaExecutionParameters_execArgs :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe [Prelude.Text])
+lambdaExecutionParameters_execArgs = Lens.lens (\LambdaExecutionParameters' {execArgs} -> execArgs) (\s@LambdaExecutionParameters' {} a -> s {execArgs = a} :: LambdaExecutionParameters) Prelude.. Lens.mapping Lens.coerced
+
+-- | The encoding type that the Lambda function supports.
+--
+-- Default: @json@
+lambdaExecutionParameters_inputPayloadEncodingType :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe LambdaInputPayloadEncodingType)
+lambdaExecutionParameters_inputPayloadEncodingType = Lens.lens (\LambdaExecutionParameters' {inputPayloadEncodingType} -> inputPayloadEncodingType) (\s@LambdaExecutionParameters' {} a -> s {inputPayloadEncodingType = a} :: LambdaExecutionParameters)
+
+-- | The parameters for the Linux process that contains the Lambda function.
+lambdaExecutionParameters_linuxProcessParams :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe LambdaLinuxProcessParams)
+lambdaExecutionParameters_linuxProcessParams = Lens.lens (\LambdaExecutionParameters' {linuxProcessParams} -> linuxProcessParams) (\s@LambdaExecutionParameters' {} a -> s {linuxProcessParams = a} :: LambdaExecutionParameters)
+
+-- | The maximum amount of time in seconds that a non-pinned Lambda function
+-- can idle before the IoT Greengrass Core software stops its process.
+lambdaExecutionParameters_maxIdleTimeInSeconds :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe Prelude.Int)
+lambdaExecutionParameters_maxIdleTimeInSeconds = Lens.lens (\LambdaExecutionParameters' {maxIdleTimeInSeconds} -> maxIdleTimeInSeconds) (\s@LambdaExecutionParameters' {} a -> s {maxIdleTimeInSeconds = a} :: LambdaExecutionParameters)
+
+-- | The maximum number of instances that a non-pinned Lambda function can
+-- run at the same time.
+lambdaExecutionParameters_maxInstancesCount :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe Prelude.Int)
+lambdaExecutionParameters_maxInstancesCount = Lens.lens (\LambdaExecutionParameters' {maxInstancesCount} -> maxInstancesCount) (\s@LambdaExecutionParameters' {} a -> s {maxInstancesCount = a} :: LambdaExecutionParameters)
+
+-- | The maximum size of the message queue for the Lambda function component.
+-- The IoT Greengrass core stores messages in a FIFO (first-in-first-out)
+-- queue until it can run the Lambda function to consume each message.
+lambdaExecutionParameters_maxQueueSize :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe Prelude.Int)
+lambdaExecutionParameters_maxQueueSize = Lens.lens (\LambdaExecutionParameters' {maxQueueSize} -> maxQueueSize) (\s@LambdaExecutionParameters' {} a -> s {maxQueueSize = a} :: LambdaExecutionParameters)
+
+-- | Whether or not the Lambda function is pinned, or long-lived.
+--
+-- -   A pinned Lambda function starts when IoT Greengrass starts and keeps
+--     running in its own container.
+--
+-- -   A non-pinned Lambda function starts only when it receives a work
+--     item and exists after it idles for @maxIdleTimeInSeconds@. If the
+--     function has multiple work items, the IoT Greengrass Core software
+--     creates multiple instances of the function.
+--
+-- Default: @true@
+lambdaExecutionParameters_pinned :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe Prelude.Bool)
+lambdaExecutionParameters_pinned = Lens.lens (\LambdaExecutionParameters' {pinned} -> pinned) (\s@LambdaExecutionParameters' {} a -> s {pinned = a} :: LambdaExecutionParameters)
+
+-- | The interval in seconds at which a pinned (also known as long-lived)
+-- Lambda function component sends status updates to the Lambda manager
+-- component.
+lambdaExecutionParameters_statusTimeoutInSeconds :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe Prelude.Int)
+lambdaExecutionParameters_statusTimeoutInSeconds = Lens.lens (\LambdaExecutionParameters' {statusTimeoutInSeconds} -> statusTimeoutInSeconds) (\s@LambdaExecutionParameters' {} a -> s {statusTimeoutInSeconds = a} :: LambdaExecutionParameters)
+
+-- | The maximum amount of time in seconds that the Lambda function can
+-- process a work item.
+lambdaExecutionParameters_timeoutInSeconds :: Lens.Lens' LambdaExecutionParameters (Prelude.Maybe Prelude.Int)
+lambdaExecutionParameters_timeoutInSeconds = Lens.lens (\LambdaExecutionParameters' {timeoutInSeconds} -> timeoutInSeconds) (\s@LambdaExecutionParameters' {} a -> s {timeoutInSeconds = a} :: LambdaExecutionParameters)
+
+instance Prelude.Hashable LambdaExecutionParameters where
+  hashWithSalt _salt LambdaExecutionParameters' {..} =
+    _salt
+      `Prelude.hashWithSalt` environmentVariables
+      `Prelude.hashWithSalt` eventSources
+      `Prelude.hashWithSalt` execArgs
+      `Prelude.hashWithSalt` inputPayloadEncodingType
+      `Prelude.hashWithSalt` linuxProcessParams
+      `Prelude.hashWithSalt` maxIdleTimeInSeconds
+      `Prelude.hashWithSalt` maxInstancesCount
+      `Prelude.hashWithSalt` maxQueueSize
+      `Prelude.hashWithSalt` pinned
+      `Prelude.hashWithSalt` statusTimeoutInSeconds
+      `Prelude.hashWithSalt` timeoutInSeconds
+
+instance Prelude.NFData LambdaExecutionParameters where
+  rnf LambdaExecutionParameters' {..} =
+    Prelude.rnf environmentVariables
+      `Prelude.seq` Prelude.rnf eventSources
+      `Prelude.seq` Prelude.rnf execArgs
+      `Prelude.seq` Prelude.rnf inputPayloadEncodingType
+      `Prelude.seq` Prelude.rnf linuxProcessParams
+      `Prelude.seq` Prelude.rnf maxIdleTimeInSeconds
+      `Prelude.seq` Prelude.rnf maxInstancesCount
+      `Prelude.seq` Prelude.rnf maxQueueSize
+      `Prelude.seq` Prelude.rnf pinned
+      `Prelude.seq` Prelude.rnf statusTimeoutInSeconds
+      `Prelude.seq` Prelude.rnf timeoutInSeconds
+
+instance Data.ToJSON LambdaExecutionParameters where
+  toJSON LambdaExecutionParameters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("environmentVariables" Data..=)
+              Prelude.<$> environmentVariables,
+            ("eventSources" Data..=) Prelude.<$> eventSources,
+            ("execArgs" Data..=) Prelude.<$> execArgs,
+            ("inputPayloadEncodingType" Data..=)
+              Prelude.<$> inputPayloadEncodingType,
+            ("linuxProcessParams" Data..=)
+              Prelude.<$> linuxProcessParams,
+            ("maxIdleTimeInSeconds" Data..=)
+              Prelude.<$> maxIdleTimeInSeconds,
+            ("maxInstancesCount" Data..=)
+              Prelude.<$> maxInstancesCount,
+            ("maxQueueSize" Data..=) Prelude.<$> maxQueueSize,
+            ("pinned" Data..=) Prelude.<$> pinned,
+            ("statusTimeoutInSeconds" Data..=)
+              Prelude.<$> statusTimeoutInSeconds,
+            ("timeoutInSeconds" Data..=)
+              Prelude.<$> timeoutInSeconds
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaFilesystemPermission.hs b/gen/Amazonka/GreengrassV2/Types/LambdaFilesystemPermission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaFilesystemPermission.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.GreengrassV2.Types.LambdaFilesystemPermission
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaFilesystemPermission
+  ( LambdaFilesystemPermission
+      ( ..,
+        LambdaFilesystemPermission_Ro,
+        LambdaFilesystemPermission_Rw
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LambdaFilesystemPermission = LambdaFilesystemPermission'
+  { fromLambdaFilesystemPermission ::
+      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 LambdaFilesystemPermission_Ro :: LambdaFilesystemPermission
+pattern LambdaFilesystemPermission_Ro = LambdaFilesystemPermission' "ro"
+
+pattern LambdaFilesystemPermission_Rw :: LambdaFilesystemPermission
+pattern LambdaFilesystemPermission_Rw = LambdaFilesystemPermission' "rw"
+
+{-# COMPLETE
+  LambdaFilesystemPermission_Ro,
+  LambdaFilesystemPermission_Rw,
+  LambdaFilesystemPermission'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaFunctionRecipeSource.hs b/gen/Amazonka/GreengrassV2/Types/LambdaFunctionRecipeSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaFunctionRecipeSource.hs
@@ -0,0 +1,172 @@
+{-# 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.GreengrassV2.Types.LambdaFunctionRecipeSource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaFunctionRecipeSource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.ComponentDependencyRequirement
+import Amazonka.GreengrassV2.Types.ComponentPlatform
+import Amazonka.GreengrassV2.Types.LambdaExecutionParameters
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an Lambda function to import to create a
+-- component.
+--
+-- /See:/ 'newLambdaFunctionRecipeSource' smart constructor.
+data LambdaFunctionRecipeSource = LambdaFunctionRecipeSource'
+  { -- | The component versions on which this Lambda function component depends.
+    componentDependencies :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentDependencyRequirement),
+    -- | The system and runtime parameters for the Lambda function as it runs on
+    -- the Greengrass core device.
+    componentLambdaParameters :: Prelude.Maybe LambdaExecutionParameters,
+    -- | The name of the component.
+    --
+    -- Defaults to the name of the Lambda function.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The platforms that the component version supports.
+    componentPlatforms :: Prelude.Maybe [ComponentPlatform],
+    -- | The version of the component.
+    --
+    -- Defaults to the version of the Lambda function as a semantic version.
+    -- For example, if your function version is @3@, the component version
+    -- becomes @3.0.0@.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the Lambda function. The ARN must include the version of the function
+    -- to import. You can\'t use version aliases like @$LATEST@.
+    lambdaArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaFunctionRecipeSource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'componentDependencies', 'lambdaFunctionRecipeSource_componentDependencies' - The component versions on which this Lambda function component depends.
+--
+-- 'componentLambdaParameters', 'lambdaFunctionRecipeSource_componentLambdaParameters' - The system and runtime parameters for the Lambda function as it runs on
+-- the Greengrass core device.
+--
+-- 'componentName', 'lambdaFunctionRecipeSource_componentName' - The name of the component.
+--
+-- Defaults to the name of the Lambda function.
+--
+-- 'componentPlatforms', 'lambdaFunctionRecipeSource_componentPlatforms' - The platforms that the component version supports.
+--
+-- 'componentVersion', 'lambdaFunctionRecipeSource_componentVersion' - The version of the component.
+--
+-- Defaults to the version of the Lambda function as a semantic version.
+-- For example, if your function version is @3@, the component version
+-- becomes @3.0.0@.
+--
+-- 'lambdaArn', 'lambdaFunctionRecipeSource_lambdaArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Lambda function. The ARN must include the version of the function
+-- to import. You can\'t use version aliases like @$LATEST@.
+newLambdaFunctionRecipeSource ::
+  -- | 'lambdaArn'
+  Prelude.Text ->
+  LambdaFunctionRecipeSource
+newLambdaFunctionRecipeSource pLambdaArn_ =
+  LambdaFunctionRecipeSource'
+    { componentDependencies =
+        Prelude.Nothing,
+      componentLambdaParameters = Prelude.Nothing,
+      componentName = Prelude.Nothing,
+      componentPlatforms = Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      lambdaArn = pLambdaArn_
+    }
+
+-- | The component versions on which this Lambda function component depends.
+lambdaFunctionRecipeSource_componentDependencies :: Lens.Lens' LambdaFunctionRecipeSource (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentDependencyRequirement))
+lambdaFunctionRecipeSource_componentDependencies = Lens.lens (\LambdaFunctionRecipeSource' {componentDependencies} -> componentDependencies) (\s@LambdaFunctionRecipeSource' {} a -> s {componentDependencies = a} :: LambdaFunctionRecipeSource) Prelude.. Lens.mapping Lens.coerced
+
+-- | The system and runtime parameters for the Lambda function as it runs on
+-- the Greengrass core device.
+lambdaFunctionRecipeSource_componentLambdaParameters :: Lens.Lens' LambdaFunctionRecipeSource (Prelude.Maybe LambdaExecutionParameters)
+lambdaFunctionRecipeSource_componentLambdaParameters = Lens.lens (\LambdaFunctionRecipeSource' {componentLambdaParameters} -> componentLambdaParameters) (\s@LambdaFunctionRecipeSource' {} a -> s {componentLambdaParameters = a} :: LambdaFunctionRecipeSource)
+
+-- | The name of the component.
+--
+-- Defaults to the name of the Lambda function.
+lambdaFunctionRecipeSource_componentName :: Lens.Lens' LambdaFunctionRecipeSource (Prelude.Maybe Prelude.Text)
+lambdaFunctionRecipeSource_componentName = Lens.lens (\LambdaFunctionRecipeSource' {componentName} -> componentName) (\s@LambdaFunctionRecipeSource' {} a -> s {componentName = a} :: LambdaFunctionRecipeSource)
+
+-- | The platforms that the component version supports.
+lambdaFunctionRecipeSource_componentPlatforms :: Lens.Lens' LambdaFunctionRecipeSource (Prelude.Maybe [ComponentPlatform])
+lambdaFunctionRecipeSource_componentPlatforms = Lens.lens (\LambdaFunctionRecipeSource' {componentPlatforms} -> componentPlatforms) (\s@LambdaFunctionRecipeSource' {} a -> s {componentPlatforms = a} :: LambdaFunctionRecipeSource) Prelude.. Lens.mapping Lens.coerced
+
+-- | The version of the component.
+--
+-- Defaults to the version of the Lambda function as a semantic version.
+-- For example, if your function version is @3@, the component version
+-- becomes @3.0.0@.
+lambdaFunctionRecipeSource_componentVersion :: Lens.Lens' LambdaFunctionRecipeSource (Prelude.Maybe Prelude.Text)
+lambdaFunctionRecipeSource_componentVersion = Lens.lens (\LambdaFunctionRecipeSource' {componentVersion} -> componentVersion) (\s@LambdaFunctionRecipeSource' {} a -> s {componentVersion = a} :: LambdaFunctionRecipeSource)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Lambda function. The ARN must include the version of the function
+-- to import. You can\'t use version aliases like @$LATEST@.
+lambdaFunctionRecipeSource_lambdaArn :: Lens.Lens' LambdaFunctionRecipeSource Prelude.Text
+lambdaFunctionRecipeSource_lambdaArn = Lens.lens (\LambdaFunctionRecipeSource' {lambdaArn} -> lambdaArn) (\s@LambdaFunctionRecipeSource' {} a -> s {lambdaArn = a} :: LambdaFunctionRecipeSource)
+
+instance Prelude.Hashable LambdaFunctionRecipeSource where
+  hashWithSalt _salt LambdaFunctionRecipeSource' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentDependencies
+      `Prelude.hashWithSalt` componentLambdaParameters
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentPlatforms
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` lambdaArn
+
+instance Prelude.NFData LambdaFunctionRecipeSource where
+  rnf LambdaFunctionRecipeSource' {..} =
+    Prelude.rnf componentDependencies
+      `Prelude.seq` Prelude.rnf componentLambdaParameters
+      `Prelude.seq` Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentPlatforms
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf lambdaArn
+
+instance Data.ToJSON LambdaFunctionRecipeSource where
+  toJSON LambdaFunctionRecipeSource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentDependencies" Data..=)
+              Prelude.<$> componentDependencies,
+            ("componentLambdaParameters" Data..=)
+              Prelude.<$> componentLambdaParameters,
+            ("componentName" Data..=) Prelude.<$> componentName,
+            ("componentPlatforms" Data..=)
+              Prelude.<$> componentPlatforms,
+            ("componentVersion" Data..=)
+              Prelude.<$> componentVersion,
+            Prelude.Just ("lambdaArn" Data..= lambdaArn)
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaInputPayloadEncodingType.hs b/gen/Amazonka/GreengrassV2/Types/LambdaInputPayloadEncodingType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaInputPayloadEncodingType.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.GreengrassV2.Types.LambdaInputPayloadEncodingType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaInputPayloadEncodingType
+  ( LambdaInputPayloadEncodingType
+      ( ..,
+        LambdaInputPayloadEncodingType_Binary,
+        LambdaInputPayloadEncodingType_Json
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LambdaInputPayloadEncodingType = LambdaInputPayloadEncodingType'
+  { fromLambdaInputPayloadEncodingType ::
+      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 LambdaInputPayloadEncodingType_Binary :: LambdaInputPayloadEncodingType
+pattern LambdaInputPayloadEncodingType_Binary = LambdaInputPayloadEncodingType' "binary"
+
+pattern LambdaInputPayloadEncodingType_Json :: LambdaInputPayloadEncodingType
+pattern LambdaInputPayloadEncodingType_Json = LambdaInputPayloadEncodingType' "json"
+
+{-# COMPLETE
+  LambdaInputPayloadEncodingType_Binary,
+  LambdaInputPayloadEncodingType_Json,
+  LambdaInputPayloadEncodingType'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaIsolationMode.hs b/gen/Amazonka/GreengrassV2/Types/LambdaIsolationMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaIsolationMode.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.GreengrassV2.Types.LambdaIsolationMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaIsolationMode
+  ( LambdaIsolationMode
+      ( ..,
+        LambdaIsolationMode_GreengrassContainer,
+        LambdaIsolationMode_NoContainer
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LambdaIsolationMode = LambdaIsolationMode'
+  { fromLambdaIsolationMode ::
+      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 LambdaIsolationMode_GreengrassContainer :: LambdaIsolationMode
+pattern LambdaIsolationMode_GreengrassContainer = LambdaIsolationMode' "GreengrassContainer"
+
+pattern LambdaIsolationMode_NoContainer :: LambdaIsolationMode
+pattern LambdaIsolationMode_NoContainer = LambdaIsolationMode' "NoContainer"
+
+{-# COMPLETE
+  LambdaIsolationMode_GreengrassContainer,
+  LambdaIsolationMode_NoContainer,
+  LambdaIsolationMode'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaLinuxProcessParams.hs b/gen/Amazonka/GreengrassV2/Types/LambdaLinuxProcessParams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaLinuxProcessParams.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.GreengrassV2.Types.LambdaLinuxProcessParams
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaLinuxProcessParams where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.LambdaContainerParams
+import Amazonka.GreengrassV2.Types.LambdaIsolationMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains parameters for a Linux process that contains an Lambda
+-- function.
+--
+-- /See:/ 'newLambdaLinuxProcessParams' smart constructor.
+data LambdaLinuxProcessParams = LambdaLinuxProcessParams'
+  { -- | The parameters for the container in which the Lambda function runs.
+    containerParams :: Prelude.Maybe LambdaContainerParams,
+    -- | The isolation mode for the process that contains the Lambda function.
+    -- The process can run in an isolated runtime environment inside the IoT
+    -- Greengrass container, or as a regular process outside any container.
+    --
+    -- Default: @GreengrassContainer@
+    isolationMode :: Prelude.Maybe LambdaIsolationMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaLinuxProcessParams' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'containerParams', 'lambdaLinuxProcessParams_containerParams' - The parameters for the container in which the Lambda function runs.
+--
+-- 'isolationMode', 'lambdaLinuxProcessParams_isolationMode' - The isolation mode for the process that contains the Lambda function.
+-- The process can run in an isolated runtime environment inside the IoT
+-- Greengrass container, or as a regular process outside any container.
+--
+-- Default: @GreengrassContainer@
+newLambdaLinuxProcessParams ::
+  LambdaLinuxProcessParams
+newLambdaLinuxProcessParams =
+  LambdaLinuxProcessParams'
+    { containerParams =
+        Prelude.Nothing,
+      isolationMode = Prelude.Nothing
+    }
+
+-- | The parameters for the container in which the Lambda function runs.
+lambdaLinuxProcessParams_containerParams :: Lens.Lens' LambdaLinuxProcessParams (Prelude.Maybe LambdaContainerParams)
+lambdaLinuxProcessParams_containerParams = Lens.lens (\LambdaLinuxProcessParams' {containerParams} -> containerParams) (\s@LambdaLinuxProcessParams' {} a -> s {containerParams = a} :: LambdaLinuxProcessParams)
+
+-- | The isolation mode for the process that contains the Lambda function.
+-- The process can run in an isolated runtime environment inside the IoT
+-- Greengrass container, or as a regular process outside any container.
+--
+-- Default: @GreengrassContainer@
+lambdaLinuxProcessParams_isolationMode :: Lens.Lens' LambdaLinuxProcessParams (Prelude.Maybe LambdaIsolationMode)
+lambdaLinuxProcessParams_isolationMode = Lens.lens (\LambdaLinuxProcessParams' {isolationMode} -> isolationMode) (\s@LambdaLinuxProcessParams' {} a -> s {isolationMode = a} :: LambdaLinuxProcessParams)
+
+instance Prelude.Hashable LambdaLinuxProcessParams where
+  hashWithSalt _salt LambdaLinuxProcessParams' {..} =
+    _salt
+      `Prelude.hashWithSalt` containerParams
+      `Prelude.hashWithSalt` isolationMode
+
+instance Prelude.NFData LambdaLinuxProcessParams where
+  rnf LambdaLinuxProcessParams' {..} =
+    Prelude.rnf containerParams
+      `Prelude.seq` Prelude.rnf isolationMode
+
+instance Data.ToJSON LambdaLinuxProcessParams where
+  toJSON LambdaLinuxProcessParams' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("containerParams" Data..=)
+              Prelude.<$> containerParams,
+            ("isolationMode" Data..=) Prelude.<$> isolationMode
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/LambdaVolumeMount.hs b/gen/Amazonka/GreengrassV2/Types/LambdaVolumeMount.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/LambdaVolumeMount.hs
@@ -0,0 +1,133 @@
+{-# 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.GreengrassV2.Types.LambdaVolumeMount
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.LambdaVolumeMount where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.LambdaFilesystemPermission
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a volume that Linux processes in a container
+-- can access. When you define a volume, the IoT Greengrass Core software
+-- mounts the source files to the destination inside the container.
+--
+-- /See:/ 'newLambdaVolumeMount' smart constructor.
+data LambdaVolumeMount = LambdaVolumeMount'
+  { -- | Whether or not to add the IoT Greengrass user group as an owner of the
+    -- volume.
+    --
+    -- Default: @false@
+    addGroupOwner :: Prelude.Maybe Prelude.Bool,
+    -- | The permission to access the volume: read\/only (@ro@) or read\/write
+    -- (@rw@).
+    --
+    -- Default: @ro@
+    permission :: Prelude.Maybe LambdaFilesystemPermission,
+    -- | The path to the physical volume in the file system.
+    sourcePath :: Prelude.Text,
+    -- | The path to the logical volume in the file system.
+    destinationPath :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaVolumeMount' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'addGroupOwner', 'lambdaVolumeMount_addGroupOwner' - Whether or not to add the IoT Greengrass user group as an owner of the
+-- volume.
+--
+-- Default: @false@
+--
+-- 'permission', 'lambdaVolumeMount_permission' - The permission to access the volume: read\/only (@ro@) or read\/write
+-- (@rw@).
+--
+-- Default: @ro@
+--
+-- 'sourcePath', 'lambdaVolumeMount_sourcePath' - The path to the physical volume in the file system.
+--
+-- 'destinationPath', 'lambdaVolumeMount_destinationPath' - The path to the logical volume in the file system.
+newLambdaVolumeMount ::
+  -- | 'sourcePath'
+  Prelude.Text ->
+  -- | 'destinationPath'
+  Prelude.Text ->
+  LambdaVolumeMount
+newLambdaVolumeMount pSourcePath_ pDestinationPath_ =
+  LambdaVolumeMount'
+    { addGroupOwner = Prelude.Nothing,
+      permission = Prelude.Nothing,
+      sourcePath = pSourcePath_,
+      destinationPath = pDestinationPath_
+    }
+
+-- | Whether or not to add the IoT Greengrass user group as an owner of the
+-- volume.
+--
+-- Default: @false@
+lambdaVolumeMount_addGroupOwner :: Lens.Lens' LambdaVolumeMount (Prelude.Maybe Prelude.Bool)
+lambdaVolumeMount_addGroupOwner = Lens.lens (\LambdaVolumeMount' {addGroupOwner} -> addGroupOwner) (\s@LambdaVolumeMount' {} a -> s {addGroupOwner = a} :: LambdaVolumeMount)
+
+-- | The permission to access the volume: read\/only (@ro@) or read\/write
+-- (@rw@).
+--
+-- Default: @ro@
+lambdaVolumeMount_permission :: Lens.Lens' LambdaVolumeMount (Prelude.Maybe LambdaFilesystemPermission)
+lambdaVolumeMount_permission = Lens.lens (\LambdaVolumeMount' {permission} -> permission) (\s@LambdaVolumeMount' {} a -> s {permission = a} :: LambdaVolumeMount)
+
+-- | The path to the physical volume in the file system.
+lambdaVolumeMount_sourcePath :: Lens.Lens' LambdaVolumeMount Prelude.Text
+lambdaVolumeMount_sourcePath = Lens.lens (\LambdaVolumeMount' {sourcePath} -> sourcePath) (\s@LambdaVolumeMount' {} a -> s {sourcePath = a} :: LambdaVolumeMount)
+
+-- | The path to the logical volume in the file system.
+lambdaVolumeMount_destinationPath :: Lens.Lens' LambdaVolumeMount Prelude.Text
+lambdaVolumeMount_destinationPath = Lens.lens (\LambdaVolumeMount' {destinationPath} -> destinationPath) (\s@LambdaVolumeMount' {} a -> s {destinationPath = a} :: LambdaVolumeMount)
+
+instance Prelude.Hashable LambdaVolumeMount where
+  hashWithSalt _salt LambdaVolumeMount' {..} =
+    _salt
+      `Prelude.hashWithSalt` addGroupOwner
+      `Prelude.hashWithSalt` permission
+      `Prelude.hashWithSalt` sourcePath
+      `Prelude.hashWithSalt` destinationPath
+
+instance Prelude.NFData LambdaVolumeMount where
+  rnf LambdaVolumeMount' {..} =
+    Prelude.rnf addGroupOwner
+      `Prelude.seq` Prelude.rnf permission
+      `Prelude.seq` Prelude.rnf sourcePath
+      `Prelude.seq` Prelude.rnf destinationPath
+
+instance Data.ToJSON LambdaVolumeMount where
+  toJSON LambdaVolumeMount' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("addGroupOwner" Data..=) Prelude.<$> addGroupOwner,
+            ("permission" Data..=) Prelude.<$> permission,
+            Prelude.Just ("sourcePath" Data..= sourcePath),
+            Prelude.Just
+              ("destinationPath" Data..= destinationPath)
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/RecipeOutputFormat.hs b/gen/Amazonka/GreengrassV2/Types/RecipeOutputFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/RecipeOutputFormat.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.GreengrassV2.Types.RecipeOutputFormat
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.RecipeOutputFormat
+  ( RecipeOutputFormat
+      ( ..,
+        RecipeOutputFormat_JSON,
+        RecipeOutputFormat_YAML
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RecipeOutputFormat = RecipeOutputFormat'
+  { fromRecipeOutputFormat ::
+      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 RecipeOutputFormat_JSON :: RecipeOutputFormat
+pattern RecipeOutputFormat_JSON = RecipeOutputFormat' "JSON"
+
+pattern RecipeOutputFormat_YAML :: RecipeOutputFormat
+pattern RecipeOutputFormat_YAML = RecipeOutputFormat' "YAML"
+
+{-# COMPLETE
+  RecipeOutputFormat_JSON,
+  RecipeOutputFormat_YAML,
+  RecipeOutputFormat'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/Types/ResolvedComponentVersion.hs b/gen/Amazonka/GreengrassV2/Types/ResolvedComponentVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/ResolvedComponentVersion.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.GreengrassV2.Types.ResolvedComponentVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.ResolvedComponentVersion where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types.VendorGuidance
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a component version that is compatible to run
+-- on a Greengrass core device.
+--
+-- /See:/ 'newResolvedComponentVersion' smart constructor.
+data ResolvedComponentVersion = ResolvedComponentVersion'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the component version.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | A message that communicates details about the vendor guidance state of
+    -- the component version. This message communicates why a component version
+    -- is discontinued or deleted.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The recipe of the component version.
+    recipe :: Prelude.Maybe Data.Base64,
+    -- | The vendor guidance state for the component version. This state
+    -- indicates whether the component version has any issues that you should
+    -- consider before you deploy it. The vendor guidance state can be:
+    --
+    -- -   @ACTIVE@ – This component version is available and recommended for
+    --     use.
+    --
+    -- -   @DISCONTINUED@ – This component version has been discontinued by its
+    --     publisher. You can deploy this component version, but we recommend
+    --     that you use a different version of this component.
+    --
+    -- -   @DELETED@ – This component version has been deleted by its
+    --     publisher, so you can\'t deploy it. If you have any existing
+    --     deployments that specify this component version, those deployments
+    --     will fail.
+    vendorGuidance :: Prelude.Maybe VendorGuidance
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResolvedComponentVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'resolvedComponentVersion_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+--
+-- 'componentName', 'resolvedComponentVersion_componentName' - The name of the component.
+--
+-- 'componentVersion', 'resolvedComponentVersion_componentVersion' - The version of the component.
+--
+-- 'message', 'resolvedComponentVersion_message' - A message that communicates details about the vendor guidance state of
+-- the component version. This message communicates why a component version
+-- is discontinued or deleted.
+--
+-- 'recipe', 'resolvedComponentVersion_recipe' - The recipe of the component version.--
+-- -- /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.
+--
+-- 'vendorGuidance', 'resolvedComponentVersion_vendorGuidance' - The vendor guidance state for the component version. This state
+-- indicates whether the component version has any issues that you should
+-- consider before you deploy it. The vendor guidance state can be:
+--
+-- -   @ACTIVE@ – This component version is available and recommended for
+--     use.
+--
+-- -   @DISCONTINUED@ – This component version has been discontinued by its
+--     publisher. You can deploy this component version, but we recommend
+--     that you use a different version of this component.
+--
+-- -   @DELETED@ – This component version has been deleted by its
+--     publisher, so you can\'t deploy it. If you have any existing
+--     deployments that specify this component version, those deployments
+--     will fail.
+newResolvedComponentVersion ::
+  ResolvedComponentVersion
+newResolvedComponentVersion =
+  ResolvedComponentVersion'
+    { arn = Prelude.Nothing,
+      componentName = Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      message = Prelude.Nothing,
+      recipe = Prelude.Nothing,
+      vendorGuidance = Prelude.Nothing
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the component version.
+resolvedComponentVersion_arn :: Lens.Lens' ResolvedComponentVersion (Prelude.Maybe Prelude.Text)
+resolvedComponentVersion_arn = Lens.lens (\ResolvedComponentVersion' {arn} -> arn) (\s@ResolvedComponentVersion' {} a -> s {arn = a} :: ResolvedComponentVersion)
+
+-- | The name of the component.
+resolvedComponentVersion_componentName :: Lens.Lens' ResolvedComponentVersion (Prelude.Maybe Prelude.Text)
+resolvedComponentVersion_componentName = Lens.lens (\ResolvedComponentVersion' {componentName} -> componentName) (\s@ResolvedComponentVersion' {} a -> s {componentName = a} :: ResolvedComponentVersion)
+
+-- | The version of the component.
+resolvedComponentVersion_componentVersion :: Lens.Lens' ResolvedComponentVersion (Prelude.Maybe Prelude.Text)
+resolvedComponentVersion_componentVersion = Lens.lens (\ResolvedComponentVersion' {componentVersion} -> componentVersion) (\s@ResolvedComponentVersion' {} a -> s {componentVersion = a} :: ResolvedComponentVersion)
+
+-- | A message that communicates details about the vendor guidance state of
+-- the component version. This message communicates why a component version
+-- is discontinued or deleted.
+resolvedComponentVersion_message :: Lens.Lens' ResolvedComponentVersion (Prelude.Maybe Prelude.Text)
+resolvedComponentVersion_message = Lens.lens (\ResolvedComponentVersion' {message} -> message) (\s@ResolvedComponentVersion' {} a -> s {message = a} :: ResolvedComponentVersion)
+
+-- | The recipe of the component version.--
+-- -- /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.
+resolvedComponentVersion_recipe :: Lens.Lens' ResolvedComponentVersion (Prelude.Maybe Prelude.ByteString)
+resolvedComponentVersion_recipe = Lens.lens (\ResolvedComponentVersion' {recipe} -> recipe) (\s@ResolvedComponentVersion' {} a -> s {recipe = a} :: ResolvedComponentVersion) Prelude.. Lens.mapping Data._Base64
+
+-- | The vendor guidance state for the component version. This state
+-- indicates whether the component version has any issues that you should
+-- consider before you deploy it. The vendor guidance state can be:
+--
+-- -   @ACTIVE@ – This component version is available and recommended for
+--     use.
+--
+-- -   @DISCONTINUED@ – This component version has been discontinued by its
+--     publisher. You can deploy this component version, but we recommend
+--     that you use a different version of this component.
+--
+-- -   @DELETED@ – This component version has been deleted by its
+--     publisher, so you can\'t deploy it. If you have any existing
+--     deployments that specify this component version, those deployments
+--     will fail.
+resolvedComponentVersion_vendorGuidance :: Lens.Lens' ResolvedComponentVersion (Prelude.Maybe VendorGuidance)
+resolvedComponentVersion_vendorGuidance = Lens.lens (\ResolvedComponentVersion' {vendorGuidance} -> vendorGuidance) (\s@ResolvedComponentVersion' {} a -> s {vendorGuidance = a} :: ResolvedComponentVersion)
+
+instance Data.FromJSON ResolvedComponentVersion where
+  parseJSON =
+    Data.withObject
+      "ResolvedComponentVersion"
+      ( \x ->
+          ResolvedComponentVersion'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "componentName")
+            Prelude.<*> (x Data..:? "componentVersion")
+            Prelude.<*> (x Data..:? "message")
+            Prelude.<*> (x Data..:? "recipe")
+            Prelude.<*> (x Data..:? "vendorGuidance")
+      )
+
+instance Prelude.Hashable ResolvedComponentVersion where
+  hashWithSalt _salt ResolvedComponentVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` message
+      `Prelude.hashWithSalt` recipe
+      `Prelude.hashWithSalt` vendorGuidance
+
+instance Prelude.NFData ResolvedComponentVersion where
+  rnf ResolvedComponentVersion' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf message
+      `Prelude.seq` Prelude.rnf recipe
+      `Prelude.seq` Prelude.rnf vendorGuidance
diff --git a/gen/Amazonka/GreengrassV2/Types/SystemResourceLimits.hs b/gen/Amazonka/GreengrassV2/Types/SystemResourceLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/SystemResourceLimits.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.SystemResourceLimits
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.SystemResourceLimits 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 system resource limits that the IoT
+-- Greengrass Core software applies to a component\'s processes. For more
+-- information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-system-resource-limits Configure system resource limits for components>.
+--
+-- /See:/ 'newSystemResourceLimits' smart constructor.
+data SystemResourceLimits = SystemResourceLimits'
+  { -- | The maximum amount of CPU time that a component\'s processes can use on
+    -- the core device. A core device\'s total CPU time is equivalent to the
+    -- device\'s number of CPU cores. For example, on a core device with 4 CPU
+    -- cores, you can set this value to @2@ to limit the component\'s processes
+    -- to 50 percent usage of each CPU core. On a device with 1 CPU core, you
+    -- can set this value to @0.25@ to limit the component\'s processes to 25
+    -- percent usage of the CPU. If you set this value to a number greater than
+    -- the number of CPU cores, the IoT Greengrass Core software doesn\'t limit
+    -- the component\'s CPU usage.
+    cpus :: Prelude.Maybe Prelude.Double,
+    -- | The maximum amount of RAM, expressed in kilobytes, that a component\'s
+    -- processes can use on the core device.
+    memory :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SystemResourceLimits' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cpus', 'systemResourceLimits_cpus' - The maximum amount of CPU time that a component\'s processes can use on
+-- the core device. A core device\'s total CPU time is equivalent to the
+-- device\'s number of CPU cores. For example, on a core device with 4 CPU
+-- cores, you can set this value to @2@ to limit the component\'s processes
+-- to 50 percent usage of each CPU core. On a device with 1 CPU core, you
+-- can set this value to @0.25@ to limit the component\'s processes to 25
+-- percent usage of the CPU. If you set this value to a number greater than
+-- the number of CPU cores, the IoT Greengrass Core software doesn\'t limit
+-- the component\'s CPU usage.
+--
+-- 'memory', 'systemResourceLimits_memory' - The maximum amount of RAM, expressed in kilobytes, that a component\'s
+-- processes can use on the core device.
+newSystemResourceLimits ::
+  SystemResourceLimits
+newSystemResourceLimits =
+  SystemResourceLimits'
+    { cpus = Prelude.Nothing,
+      memory = Prelude.Nothing
+    }
+
+-- | The maximum amount of CPU time that a component\'s processes can use on
+-- the core device. A core device\'s total CPU time is equivalent to the
+-- device\'s number of CPU cores. For example, on a core device with 4 CPU
+-- cores, you can set this value to @2@ to limit the component\'s processes
+-- to 50 percent usage of each CPU core. On a device with 1 CPU core, you
+-- can set this value to @0.25@ to limit the component\'s processes to 25
+-- percent usage of the CPU. If you set this value to a number greater than
+-- the number of CPU cores, the IoT Greengrass Core software doesn\'t limit
+-- the component\'s CPU usage.
+systemResourceLimits_cpus :: Lens.Lens' SystemResourceLimits (Prelude.Maybe Prelude.Double)
+systemResourceLimits_cpus = Lens.lens (\SystemResourceLimits' {cpus} -> cpus) (\s@SystemResourceLimits' {} a -> s {cpus = a} :: SystemResourceLimits)
+
+-- | The maximum amount of RAM, expressed in kilobytes, that a component\'s
+-- processes can use on the core device.
+systemResourceLimits_memory :: Lens.Lens' SystemResourceLimits (Prelude.Maybe Prelude.Natural)
+systemResourceLimits_memory = Lens.lens (\SystemResourceLimits' {memory} -> memory) (\s@SystemResourceLimits' {} a -> s {memory = a} :: SystemResourceLimits)
+
+instance Data.FromJSON SystemResourceLimits where
+  parseJSON =
+    Data.withObject
+      "SystemResourceLimits"
+      ( \x ->
+          SystemResourceLimits'
+            Prelude.<$> (x Data..:? "cpus")
+            Prelude.<*> (x Data..:? "memory")
+      )
+
+instance Prelude.Hashable SystemResourceLimits where
+  hashWithSalt _salt SystemResourceLimits' {..} =
+    _salt
+      `Prelude.hashWithSalt` cpus
+      `Prelude.hashWithSalt` memory
+
+instance Prelude.NFData SystemResourceLimits where
+  rnf SystemResourceLimits' {..} =
+    Prelude.rnf cpus `Prelude.seq` Prelude.rnf memory
+
+instance Data.ToJSON SystemResourceLimits where
+  toJSON SystemResourceLimits' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("cpus" Data..=) Prelude.<$> cpus,
+            ("memory" Data..=) Prelude.<$> memory
+          ]
+      )
diff --git a/gen/Amazonka/GreengrassV2/Types/VendorGuidance.hs b/gen/Amazonka/GreengrassV2/Types/VendorGuidance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/Types/VendorGuidance.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.Types.VendorGuidance
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.GreengrassV2.Types.VendorGuidance
+  ( VendorGuidance
+      ( ..,
+        VendorGuidance_ACTIVE,
+        VendorGuidance_DELETED,
+        VendorGuidance_DISCONTINUED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VendorGuidance = VendorGuidance'
+  { fromVendorGuidance ::
+      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 VendorGuidance_ACTIVE :: VendorGuidance
+pattern VendorGuidance_ACTIVE = VendorGuidance' "ACTIVE"
+
+pattern VendorGuidance_DELETED :: VendorGuidance
+pattern VendorGuidance_DELETED = VendorGuidance' "DELETED"
+
+pattern VendorGuidance_DISCONTINUED :: VendorGuidance
+pattern VendorGuidance_DISCONTINUED = VendorGuidance' "DISCONTINUED"
+
+{-# COMPLETE
+  VendorGuidance_ACTIVE,
+  VendorGuidance_DELETED,
+  VendorGuidance_DISCONTINUED,
+  VendorGuidance'
+  #-}
diff --git a/gen/Amazonka/GreengrassV2/UntagResource.hs b/gen/Amazonka/GreengrassV2/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/UntagResource.hs
@@ -0,0 +1,161 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GreengrassV2.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 a tag from an IoT Greengrass resource.
+module Amazonka.GreengrassV2.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the resource to untag.
+    resourceArn :: Prelude.Text,
+    -- | A list of keys for tags to remove from the resource.
+    tagKeys :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to untag.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of keys for tags to remove from the resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tagKeys'
+  Prelude.NonEmpty Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ pTagKeys_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Lens.coerced Lens.# pTagKeys_
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to untag.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | A list of keys for tags to remove from the resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource (Prelude.NonEmpty Prelude.Text)
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/UpdateConnectivityInfo.hs b/gen/Amazonka/GreengrassV2/UpdateConnectivityInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/UpdateConnectivityInfo.hs
@@ -0,0 +1,203 @@
+{-# 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.GreengrassV2.UpdateConnectivityInfo
+-- 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 connectivity information for a Greengrass core device.
+--
+-- Connectivity information includes endpoints and ports where client
+-- devices can connect to an MQTT broker on the core device. When a client
+-- device calls the
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-discover-api.html IoT Greengrass discovery API>,
+-- IoT Greengrass returns connectivity information for all of the core
+-- devices where the client device can connect. For more information, see
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/connect-client-devices.html Connect client devices to core devices>
+-- in the /IoT Greengrass Version 2 Developer Guide/.
+module Amazonka.GreengrassV2.UpdateConnectivityInfo
+  ( -- * Creating a Request
+    UpdateConnectivityInfo (..),
+    newUpdateConnectivityInfo,
+
+    -- * Request Lenses
+    updateConnectivityInfo_thingName,
+    updateConnectivityInfo_connectivityInfo,
+
+    -- * Destructuring the Response
+    UpdateConnectivityInfoResponse (..),
+    newUpdateConnectivityInfoResponse,
+
+    -- * Response Lenses
+    updateConnectivityInfoResponse_message,
+    updateConnectivityInfoResponse_version,
+    updateConnectivityInfoResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateConnectivityInfo' smart constructor.
+data UpdateConnectivityInfo = UpdateConnectivityInfo'
+  { -- | The name of the core device. This is also the name of the IoT thing.
+    thingName :: Prelude.Text,
+    -- | The connectivity information for the core device.
+    connectivityInfo :: [ConnectivityInfo]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateConnectivityInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'thingName', 'updateConnectivityInfo_thingName' - The name of the core device. This is also the name of the IoT thing.
+--
+-- 'connectivityInfo', 'updateConnectivityInfo_connectivityInfo' - The connectivity information for the core device.
+newUpdateConnectivityInfo ::
+  -- | 'thingName'
+  Prelude.Text ->
+  UpdateConnectivityInfo
+newUpdateConnectivityInfo pThingName_ =
+  UpdateConnectivityInfo'
+    { thingName = pThingName_,
+      connectivityInfo = Prelude.mempty
+    }
+
+-- | The name of the core device. This is also the name of the IoT thing.
+updateConnectivityInfo_thingName :: Lens.Lens' UpdateConnectivityInfo Prelude.Text
+updateConnectivityInfo_thingName = Lens.lens (\UpdateConnectivityInfo' {thingName} -> thingName) (\s@UpdateConnectivityInfo' {} a -> s {thingName = a} :: UpdateConnectivityInfo)
+
+-- | The connectivity information for the core device.
+updateConnectivityInfo_connectivityInfo :: Lens.Lens' UpdateConnectivityInfo [ConnectivityInfo]
+updateConnectivityInfo_connectivityInfo = Lens.lens (\UpdateConnectivityInfo' {connectivityInfo} -> connectivityInfo) (\s@UpdateConnectivityInfo' {} a -> s {connectivityInfo = a} :: UpdateConnectivityInfo) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateConnectivityInfo where
+  type
+    AWSResponse UpdateConnectivityInfo =
+      UpdateConnectivityInfoResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateConnectivityInfoResponse'
+            Prelude.<$> (x Data..?> "Message")
+            Prelude.<*> (x Data..?> "Version")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateConnectivityInfo where
+  hashWithSalt _salt UpdateConnectivityInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` thingName
+      `Prelude.hashWithSalt` connectivityInfo
+
+instance Prelude.NFData UpdateConnectivityInfo where
+  rnf UpdateConnectivityInfo' {..} =
+    Prelude.rnf thingName
+      `Prelude.seq` Prelude.rnf connectivityInfo
+
+instance Data.ToHeaders UpdateConnectivityInfo where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToJSON UpdateConnectivityInfo where
+  toJSON UpdateConnectivityInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ConnectivityInfo" Data..= connectivityInfo)
+          ]
+      )
+
+instance Data.ToPath UpdateConnectivityInfo where
+  toPath UpdateConnectivityInfo' {..} =
+    Prelude.mconcat
+      [ "/greengrass/things/",
+        Data.toBS thingName,
+        "/connectivityInfo"
+      ]
+
+instance Data.ToQuery UpdateConnectivityInfo where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateConnectivityInfoResponse' smart constructor.
+data UpdateConnectivityInfoResponse = UpdateConnectivityInfoResponse'
+  { -- | A message about the connectivity information update request.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The new version of the connectivity information for the core device.
+    version :: 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 'UpdateConnectivityInfoResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'message', 'updateConnectivityInfoResponse_message' - A message about the connectivity information update request.
+--
+-- 'version', 'updateConnectivityInfoResponse_version' - The new version of the connectivity information for the core device.
+--
+-- 'httpStatus', 'updateConnectivityInfoResponse_httpStatus' - The response's http status code.
+newUpdateConnectivityInfoResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateConnectivityInfoResponse
+newUpdateConnectivityInfoResponse pHttpStatus_ =
+  UpdateConnectivityInfoResponse'
+    { message =
+        Prelude.Nothing,
+      version = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A message about the connectivity information update request.
+updateConnectivityInfoResponse_message :: Lens.Lens' UpdateConnectivityInfoResponse (Prelude.Maybe Prelude.Text)
+updateConnectivityInfoResponse_message = Lens.lens (\UpdateConnectivityInfoResponse' {message} -> message) (\s@UpdateConnectivityInfoResponse' {} a -> s {message = a} :: UpdateConnectivityInfoResponse)
+
+-- | The new version of the connectivity information for the core device.
+updateConnectivityInfoResponse_version :: Lens.Lens' UpdateConnectivityInfoResponse (Prelude.Maybe Prelude.Text)
+updateConnectivityInfoResponse_version = Lens.lens (\UpdateConnectivityInfoResponse' {version} -> version) (\s@UpdateConnectivityInfoResponse' {} a -> s {version = a} :: UpdateConnectivityInfoResponse)
+
+-- | The response's http status code.
+updateConnectivityInfoResponse_httpStatus :: Lens.Lens' UpdateConnectivityInfoResponse Prelude.Int
+updateConnectivityInfoResponse_httpStatus = Lens.lens (\UpdateConnectivityInfoResponse' {httpStatus} -> httpStatus) (\s@UpdateConnectivityInfoResponse' {} a -> s {httpStatus = a} :: UpdateConnectivityInfoResponse)
+
+instance
+  Prelude.NFData
+    UpdateConnectivityInfoResponse
+  where
+  rnf UpdateConnectivityInfoResponse' {..} =
+    Prelude.rnf message
+      `Prelude.seq` Prelude.rnf version
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GreengrassV2/Waiters.hs b/gen/Amazonka/GreengrassV2/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GreengrassV2/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.GreengrassV2.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.GreengrassV2.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GreengrassV2.Lens
+import Amazonka.GreengrassV2.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.GreengrassV2
+import Test.Amazonka.GreengrassV2.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "GreengrassV2"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/GreengrassV2.hs b/test/Test/Amazonka/Gen/GreengrassV2.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/GreengrassV2.hs
@@ -0,0 +1,618 @@
+{-# 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.GreengrassV2
+-- Copyright   : (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.GreengrassV2 where
+
+import Amazonka.GreengrassV2
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.GreengrassV2.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"
+--         [ requestAssociateServiceRoleToAccount $
+--             newAssociateServiceRoleToAccount
+--
+--         , requestBatchAssociateClientDeviceWithCoreDevice $
+--             newBatchAssociateClientDeviceWithCoreDevice
+--
+--         , requestBatchDisassociateClientDeviceFromCoreDevice $
+--             newBatchDisassociateClientDeviceFromCoreDevice
+--
+--         , requestCancelDeployment $
+--             newCancelDeployment
+--
+--         , requestCreateComponentVersion $
+--             newCreateComponentVersion
+--
+--         , requestCreateDeployment $
+--             newCreateDeployment
+--
+--         , requestDeleteComponent $
+--             newDeleteComponent
+--
+--         , requestDeleteCoreDevice $
+--             newDeleteCoreDevice
+--
+--         , requestDeleteDeployment $
+--             newDeleteDeployment
+--
+--         , requestDescribeComponent $
+--             newDescribeComponent
+--
+--         , requestDisassociateServiceRoleFromAccount $
+--             newDisassociateServiceRoleFromAccount
+--
+--         , requestGetComponent $
+--             newGetComponent
+--
+--         , requestGetComponentVersionArtifact $
+--             newGetComponentVersionArtifact
+--
+--         , requestGetConnectivityInfo $
+--             newGetConnectivityInfo
+--
+--         , requestGetCoreDevice $
+--             newGetCoreDevice
+--
+--         , requestGetDeployment $
+--             newGetDeployment
+--
+--         , requestGetServiceRoleForAccount $
+--             newGetServiceRoleForAccount
+--
+--         , requestListClientDevicesAssociatedWithCoreDevice $
+--             newListClientDevicesAssociatedWithCoreDevice
+--
+--         , requestListComponentVersions $
+--             newListComponentVersions
+--
+--         , requestListComponents $
+--             newListComponents
+--
+--         , requestListCoreDevices $
+--             newListCoreDevices
+--
+--         , requestListDeployments $
+--             newListDeployments
+--
+--         , requestListEffectiveDeployments $
+--             newListEffectiveDeployments
+--
+--         , requestListInstalledComponents $
+--             newListInstalledComponents
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestResolveComponentCandidates $
+--             newResolveComponentCandidates
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateConnectivityInfo $
+--             newUpdateConnectivityInfo
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAssociateServiceRoleToAccount $
+--             newAssociateServiceRoleToAccountResponse
+--
+--         , responseBatchAssociateClientDeviceWithCoreDevice $
+--             newBatchAssociateClientDeviceWithCoreDeviceResponse
+--
+--         , responseBatchDisassociateClientDeviceFromCoreDevice $
+--             newBatchDisassociateClientDeviceFromCoreDeviceResponse
+--
+--         , responseCancelDeployment $
+--             newCancelDeploymentResponse
+--
+--         , responseCreateComponentVersion $
+--             newCreateComponentVersionResponse
+--
+--         , responseCreateDeployment $
+--             newCreateDeploymentResponse
+--
+--         , responseDeleteComponent $
+--             newDeleteComponentResponse
+--
+--         , responseDeleteCoreDevice $
+--             newDeleteCoreDeviceResponse
+--
+--         , responseDeleteDeployment $
+--             newDeleteDeploymentResponse
+--
+--         , responseDescribeComponent $
+--             newDescribeComponentResponse
+--
+--         , responseDisassociateServiceRoleFromAccount $
+--             newDisassociateServiceRoleFromAccountResponse
+--
+--         , responseGetComponent $
+--             newGetComponentResponse
+--
+--         , responseGetComponentVersionArtifact $
+--             newGetComponentVersionArtifactResponse
+--
+--         , responseGetConnectivityInfo $
+--             newGetConnectivityInfoResponse
+--
+--         , responseGetCoreDevice $
+--             newGetCoreDeviceResponse
+--
+--         , responseGetDeployment $
+--             newGetDeploymentResponse
+--
+--         , responseGetServiceRoleForAccount $
+--             newGetServiceRoleForAccountResponse
+--
+--         , responseListClientDevicesAssociatedWithCoreDevice $
+--             newListClientDevicesAssociatedWithCoreDeviceResponse
+--
+--         , responseListComponentVersions $
+--             newListComponentVersionsResponse
+--
+--         , responseListComponents $
+--             newListComponentsResponse
+--
+--         , responseListCoreDevices $
+--             newListCoreDevicesResponse
+--
+--         , responseListDeployments $
+--             newListDeploymentsResponse
+--
+--         , responseListEffectiveDeployments $
+--             newListEffectiveDeploymentsResponse
+--
+--         , responseListInstalledComponents $
+--             newListInstalledComponentsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseResolveComponentCandidates $
+--             newResolveComponentCandidatesResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateConnectivityInfo $
+--             newUpdateConnectivityInfoResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAssociateServiceRoleToAccount :: AssociateServiceRoleToAccount -> TestTree
+requestAssociateServiceRoleToAccount =
+  req
+    "AssociateServiceRoleToAccount"
+    "fixture/AssociateServiceRoleToAccount.yaml"
+
+requestBatchAssociateClientDeviceWithCoreDevice :: BatchAssociateClientDeviceWithCoreDevice -> TestTree
+requestBatchAssociateClientDeviceWithCoreDevice =
+  req
+    "BatchAssociateClientDeviceWithCoreDevice"
+    "fixture/BatchAssociateClientDeviceWithCoreDevice.yaml"
+
+requestBatchDisassociateClientDeviceFromCoreDevice :: BatchDisassociateClientDeviceFromCoreDevice -> TestTree
+requestBatchDisassociateClientDeviceFromCoreDevice =
+  req
+    "BatchDisassociateClientDeviceFromCoreDevice"
+    "fixture/BatchDisassociateClientDeviceFromCoreDevice.yaml"
+
+requestCancelDeployment :: CancelDeployment -> TestTree
+requestCancelDeployment =
+  req
+    "CancelDeployment"
+    "fixture/CancelDeployment.yaml"
+
+requestCreateComponentVersion :: CreateComponentVersion -> TestTree
+requestCreateComponentVersion =
+  req
+    "CreateComponentVersion"
+    "fixture/CreateComponentVersion.yaml"
+
+requestCreateDeployment :: CreateDeployment -> TestTree
+requestCreateDeployment =
+  req
+    "CreateDeployment"
+    "fixture/CreateDeployment.yaml"
+
+requestDeleteComponent :: DeleteComponent -> TestTree
+requestDeleteComponent =
+  req
+    "DeleteComponent"
+    "fixture/DeleteComponent.yaml"
+
+requestDeleteCoreDevice :: DeleteCoreDevice -> TestTree
+requestDeleteCoreDevice =
+  req
+    "DeleteCoreDevice"
+    "fixture/DeleteCoreDevice.yaml"
+
+requestDeleteDeployment :: DeleteDeployment -> TestTree
+requestDeleteDeployment =
+  req
+    "DeleteDeployment"
+    "fixture/DeleteDeployment.yaml"
+
+requestDescribeComponent :: DescribeComponent -> TestTree
+requestDescribeComponent =
+  req
+    "DescribeComponent"
+    "fixture/DescribeComponent.yaml"
+
+requestDisassociateServiceRoleFromAccount :: DisassociateServiceRoleFromAccount -> TestTree
+requestDisassociateServiceRoleFromAccount =
+  req
+    "DisassociateServiceRoleFromAccount"
+    "fixture/DisassociateServiceRoleFromAccount.yaml"
+
+requestGetComponent :: GetComponent -> TestTree
+requestGetComponent =
+  req
+    "GetComponent"
+    "fixture/GetComponent.yaml"
+
+requestGetComponentVersionArtifact :: GetComponentVersionArtifact -> TestTree
+requestGetComponentVersionArtifact =
+  req
+    "GetComponentVersionArtifact"
+    "fixture/GetComponentVersionArtifact.yaml"
+
+requestGetConnectivityInfo :: GetConnectivityInfo -> TestTree
+requestGetConnectivityInfo =
+  req
+    "GetConnectivityInfo"
+    "fixture/GetConnectivityInfo.yaml"
+
+requestGetCoreDevice :: GetCoreDevice -> TestTree
+requestGetCoreDevice =
+  req
+    "GetCoreDevice"
+    "fixture/GetCoreDevice.yaml"
+
+requestGetDeployment :: GetDeployment -> TestTree
+requestGetDeployment =
+  req
+    "GetDeployment"
+    "fixture/GetDeployment.yaml"
+
+requestGetServiceRoleForAccount :: GetServiceRoleForAccount -> TestTree
+requestGetServiceRoleForAccount =
+  req
+    "GetServiceRoleForAccount"
+    "fixture/GetServiceRoleForAccount.yaml"
+
+requestListClientDevicesAssociatedWithCoreDevice :: ListClientDevicesAssociatedWithCoreDevice -> TestTree
+requestListClientDevicesAssociatedWithCoreDevice =
+  req
+    "ListClientDevicesAssociatedWithCoreDevice"
+    "fixture/ListClientDevicesAssociatedWithCoreDevice.yaml"
+
+requestListComponentVersions :: ListComponentVersions -> TestTree
+requestListComponentVersions =
+  req
+    "ListComponentVersions"
+    "fixture/ListComponentVersions.yaml"
+
+requestListComponents :: ListComponents -> TestTree
+requestListComponents =
+  req
+    "ListComponents"
+    "fixture/ListComponents.yaml"
+
+requestListCoreDevices :: ListCoreDevices -> TestTree
+requestListCoreDevices =
+  req
+    "ListCoreDevices"
+    "fixture/ListCoreDevices.yaml"
+
+requestListDeployments :: ListDeployments -> TestTree
+requestListDeployments =
+  req
+    "ListDeployments"
+    "fixture/ListDeployments.yaml"
+
+requestListEffectiveDeployments :: ListEffectiveDeployments -> TestTree
+requestListEffectiveDeployments =
+  req
+    "ListEffectiveDeployments"
+    "fixture/ListEffectiveDeployments.yaml"
+
+requestListInstalledComponents :: ListInstalledComponents -> TestTree
+requestListInstalledComponents =
+  req
+    "ListInstalledComponents"
+    "fixture/ListInstalledComponents.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestResolveComponentCandidates :: ResolveComponentCandidates -> TestTree
+requestResolveComponentCandidates =
+  req
+    "ResolveComponentCandidates"
+    "fixture/ResolveComponentCandidates.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateConnectivityInfo :: UpdateConnectivityInfo -> TestTree
+requestUpdateConnectivityInfo =
+  req
+    "UpdateConnectivityInfo"
+    "fixture/UpdateConnectivityInfo.yaml"
+
+-- Responses
+
+responseAssociateServiceRoleToAccount :: AssociateServiceRoleToAccountResponse -> TestTree
+responseAssociateServiceRoleToAccount =
+  res
+    "AssociateServiceRoleToAccountResponse"
+    "fixture/AssociateServiceRoleToAccountResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssociateServiceRoleToAccount)
+
+responseBatchAssociateClientDeviceWithCoreDevice :: BatchAssociateClientDeviceWithCoreDeviceResponse -> TestTree
+responseBatchAssociateClientDeviceWithCoreDevice =
+  res
+    "BatchAssociateClientDeviceWithCoreDeviceResponse"
+    "fixture/BatchAssociateClientDeviceWithCoreDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchAssociateClientDeviceWithCoreDevice)
+
+responseBatchDisassociateClientDeviceFromCoreDevice :: BatchDisassociateClientDeviceFromCoreDeviceResponse -> TestTree
+responseBatchDisassociateClientDeviceFromCoreDevice =
+  res
+    "BatchDisassociateClientDeviceFromCoreDeviceResponse"
+    "fixture/BatchDisassociateClientDeviceFromCoreDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDisassociateClientDeviceFromCoreDevice)
+
+responseCancelDeployment :: CancelDeploymentResponse -> TestTree
+responseCancelDeployment =
+  res
+    "CancelDeploymentResponse"
+    "fixture/CancelDeploymentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CancelDeployment)
+
+responseCreateComponentVersion :: CreateComponentVersionResponse -> TestTree
+responseCreateComponentVersion =
+  res
+    "CreateComponentVersionResponse"
+    "fixture/CreateComponentVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateComponentVersion)
+
+responseCreateDeployment :: CreateDeploymentResponse -> TestTree
+responseCreateDeployment =
+  res
+    "CreateDeploymentResponse"
+    "fixture/CreateDeploymentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDeployment)
+
+responseDeleteComponent :: DeleteComponentResponse -> TestTree
+responseDeleteComponent =
+  res
+    "DeleteComponentResponse"
+    "fixture/DeleteComponentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteComponent)
+
+responseDeleteCoreDevice :: DeleteCoreDeviceResponse -> TestTree
+responseDeleteCoreDevice =
+  res
+    "DeleteCoreDeviceResponse"
+    "fixture/DeleteCoreDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCoreDevice)
+
+responseDeleteDeployment :: DeleteDeploymentResponse -> TestTree
+responseDeleteDeployment =
+  res
+    "DeleteDeploymentResponse"
+    "fixture/DeleteDeploymentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDeployment)
+
+responseDescribeComponent :: DescribeComponentResponse -> TestTree
+responseDescribeComponent =
+  res
+    "DescribeComponentResponse"
+    "fixture/DescribeComponentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeComponent)
+
+responseDisassociateServiceRoleFromAccount :: DisassociateServiceRoleFromAccountResponse -> TestTree
+responseDisassociateServiceRoleFromAccount =
+  res
+    "DisassociateServiceRoleFromAccountResponse"
+    "fixture/DisassociateServiceRoleFromAccountResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DisassociateServiceRoleFromAccount)
+
+responseGetComponent :: GetComponentResponse -> TestTree
+responseGetComponent =
+  res
+    "GetComponentResponse"
+    "fixture/GetComponentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetComponent)
+
+responseGetComponentVersionArtifact :: GetComponentVersionArtifactResponse -> TestTree
+responseGetComponentVersionArtifact =
+  res
+    "GetComponentVersionArtifactResponse"
+    "fixture/GetComponentVersionArtifactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetComponentVersionArtifact)
+
+responseGetConnectivityInfo :: GetConnectivityInfoResponse -> TestTree
+responseGetConnectivityInfo =
+  res
+    "GetConnectivityInfoResponse"
+    "fixture/GetConnectivityInfoResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetConnectivityInfo)
+
+responseGetCoreDevice :: GetCoreDeviceResponse -> TestTree
+responseGetCoreDevice =
+  res
+    "GetCoreDeviceResponse"
+    "fixture/GetCoreDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetCoreDevice)
+
+responseGetDeployment :: GetDeploymentResponse -> TestTree
+responseGetDeployment =
+  res
+    "GetDeploymentResponse"
+    "fixture/GetDeploymentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDeployment)
+
+responseGetServiceRoleForAccount :: GetServiceRoleForAccountResponse -> TestTree
+responseGetServiceRoleForAccount =
+  res
+    "GetServiceRoleForAccountResponse"
+    "fixture/GetServiceRoleForAccountResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetServiceRoleForAccount)
+
+responseListClientDevicesAssociatedWithCoreDevice :: ListClientDevicesAssociatedWithCoreDeviceResponse -> TestTree
+responseListClientDevicesAssociatedWithCoreDevice =
+  res
+    "ListClientDevicesAssociatedWithCoreDeviceResponse"
+    "fixture/ListClientDevicesAssociatedWithCoreDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListClientDevicesAssociatedWithCoreDevice)
+
+responseListComponentVersions :: ListComponentVersionsResponse -> TestTree
+responseListComponentVersions =
+  res
+    "ListComponentVersionsResponse"
+    "fixture/ListComponentVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListComponentVersions)
+
+responseListComponents :: ListComponentsResponse -> TestTree
+responseListComponents =
+  res
+    "ListComponentsResponse"
+    "fixture/ListComponentsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListComponents)
+
+responseListCoreDevices :: ListCoreDevicesResponse -> TestTree
+responseListCoreDevices =
+  res
+    "ListCoreDevicesResponse"
+    "fixture/ListCoreDevicesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListCoreDevices)
+
+responseListDeployments :: ListDeploymentsResponse -> TestTree
+responseListDeployments =
+  res
+    "ListDeploymentsResponse"
+    "fixture/ListDeploymentsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDeployments)
+
+responseListEffectiveDeployments :: ListEffectiveDeploymentsResponse -> TestTree
+responseListEffectiveDeployments =
+  res
+    "ListEffectiveDeploymentsResponse"
+    "fixture/ListEffectiveDeploymentsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListEffectiveDeployments)
+
+responseListInstalledComponents :: ListInstalledComponentsResponse -> TestTree
+responseListInstalledComponents =
+  res
+    "ListInstalledComponentsResponse"
+    "fixture/ListInstalledComponentsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListInstalledComponents)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseResolveComponentCandidates :: ResolveComponentCandidatesResponse -> TestTree
+responseResolveComponentCandidates =
+  res
+    "ResolveComponentCandidatesResponse"
+    "fixture/ResolveComponentCandidatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ResolveComponentCandidates)
+
+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)
+
+responseUpdateConnectivityInfo :: UpdateConnectivityInfoResponse -> TestTree
+responseUpdateConnectivityInfo =
+  res
+    "UpdateConnectivityInfoResponse"
+    "fixture/UpdateConnectivityInfoResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateConnectivityInfo)
diff --git a/test/Test/Amazonka/GreengrassV2.hs b/test/Test/Amazonka/GreengrassV2.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/GreengrassV2.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.GreengrassV2
+-- Copyright   : (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.GreengrassV2
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/GreengrassV2/Internal.hs b/test/Test/Amazonka/GreengrassV2/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/GreengrassV2/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.GreengrassV2.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.GreengrassV2.Internal where
