// Code generated by smithy-go-codegen DO NOT EDIT.

package rds

import (
	"context"
	"fmt"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	presignedurlcust "github.com/aws/aws-sdk-go-v2/service/internal/presigned-url"
	"github.com/aws/aws-sdk-go-v2/service/rds/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// Creates a new Amazon Aurora DB cluster or Multi-AZ DB cluster.
//
// If you create an Aurora DB cluster, the request creates an empty cluster. You
// must explicitly create the writer instance for your DB cluster using the [CreateDBInstance]
// operation. If you create a Multi-AZ DB cluster, the request creates a writer and
// two reader DB instances for you, each in a different Availability Zone.
//
// You can use the ReplicationSourceIdentifier parameter to create an Amazon
// Aurora DB cluster as a read replica of another DB cluster or Amazon RDS for
// MySQL or PostgreSQL DB instance. For more information about Amazon Aurora, see [What is Amazon Aurora?]
// in the Amazon Aurora User Guide.
//
// You can also use the ReplicationSourceIdentifier parameter to create a Multi-AZ
// DB cluster read replica with an RDS for MySQL or PostgreSQL DB instance as the
// source. For more information about Multi-AZ DB clusters, see [Multi-AZ DB cluster deployments]in the Amazon RDS
// User Guide.
//
// You can use the WithExpressConfiguration parameter to create an Aurora DB
// Cluster with express configuration and create cluster in seconds. Express
// configuration provides a cluster with a writer instance and feature specific
// values set to all other input parameters of this API.
//
// [CreateDBInstance]: https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html
// [What is Amazon Aurora?]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html
// [Multi-AZ DB cluster deployments]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html
func (c *Client) CreateDBCluster(ctx context.Context, params *CreateDBClusterInput, optFns ...func(*Options)) (*CreateDBClusterOutput, error) {
	if params == nil {
		params = &CreateDBClusterInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "CreateDBCluster", params, optFns, c.addOperationCreateDBClusterMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*CreateDBClusterOutput)
	out.ResultMetadata = metadata
	return out, nil
}

type CreateDBClusterInput struct {

	// The identifier for this DB cluster. This parameter is stored as a lowercase
	// string.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Constraints:
	//
	//   - Must contain from 1 to 63 (for Aurora DB clusters) or 1 to 52 (for Multi-AZ
	//   DB clusters) letters, numbers, or hyphens.
	//
	//   - First character must be a letter.
	//
	//   - Can't end with a hyphen or contain two consecutive hyphens.
	//
	// Example: my-cluster1
	//
	// This member is required.
	DBClusterIdentifier *string

	// The database engine to use for this DB cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Valid Values:
	//
	//   - aurora-mysql
	//
	//   - aurora-postgresql
	//
	//   - mysql
	//
	//   - postgres
	//
	//   - neptune - For information about using Amazon Neptune, see the [Amazon Neptune User Guide].
	//
	// [Amazon Neptune User Guide]: https://docs.aws.amazon.com/neptune/latest/userguide/intro.html
	//
	// This member is required.
	Engine *string

	// The amount of storage in gibibytes (GiB) to allocate to each DB instance in the
	// Multi-AZ DB cluster.
	//
	// Valid for Cluster Type: Multi-AZ DB clusters only
	//
	// This setting is required to create a Multi-AZ DB cluster.
	AllocatedStorage *int32

	// Specifies whether minor engine upgrades are applied automatically to the DB
	// cluster during the maintenance window. By default, minor engine upgrades are
	// applied automatically.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB cluster.
	//
	// For more information about automatic minor version upgrades, see [Automatically upgrading the minor engine version].
	//
	// [Automatically upgrading the minor engine version]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Upgrading.html#USER_UpgradeDBInstance.Upgrading.AutoMinorVersionUpgrades
	AutoMinorVersionUpgrade *bool

	// A list of Availability Zones (AZs) where you specifically want to create DB
	// instances in the DB cluster.
	//
	// For the first three DB instances that you create, RDS distributes each DB
	// instance to a different AZ that you specify. For additional DB instances that
	// you create, RDS randomly distributes them to the AZs that you specified. For
	// example, if you create a DB cluster with one writer instance and three reader
	// instances, RDS might distribute the writer instance to AZ 1, the first reader
	// instance to AZ 2, the second reader instance to AZ 3, and the third reader
	// instance to either AZ 1, AZ 2, or AZ 3.
	//
	// For more information, see [Availability Zones] and [High availability for Aurora DB instances] in the Amazon Aurora User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	//
	// Constraints:
	//
	//   - Can't specify more than three AZs.
	//
	// [High availability for Aurora DB instances]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraHighAvailability.html#Concepts.AuroraHighAvailability.Instances
	// [Availability Zones]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.RegionsAndAvailabilityZones.html#Concepts.RegionsAndAvailabilityZones.AvailabilityZones
	AvailabilityZones []string

	// The target backtrack window, in seconds. To disable backtracking, set this
	// value to 0 .
	//
	// Valid for Cluster Type: Aurora MySQL DB clusters only
	//
	// Default: 0
	//
	// Constraints:
	//
	//   - If specified, this value must be set to a number from 0 to 259,200 (72
	//   hours).
	BacktrackWindow *int64

	// The number of days for which automated backups are retained.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Default: 1
	//
	// Constraints:
	//
	//   - Must be a value from 1 to 35.
	BackupRetentionPeriod *int32

	// The CA certificate identifier to use for the DB cluster's server certificate.
	//
	// For more information, see [Using SSL/TLS to encrypt a connection to a DB instance] in the Amazon RDS User Guide.
	//
	// Valid for Cluster Type: Multi-AZ DB clusters
	//
	// [Using SSL/TLS to encrypt a connection to a DB instance]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html
	CACertificateIdentifier *string

	// The name of the character set ( CharacterSet ) to associate the DB cluster with.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	CharacterSetName *string

	// Specifies the scalability mode of the Aurora DB cluster. When set to limitless ,
	// the cluster operates as an Aurora Limitless Database. When set to standard (the
	// default), the cluster uses normal DB instance creation.
	//
	// Valid for: Aurora DB clusters only
	//
	// You can't modify this setting after you create the DB cluster.
	ClusterScalabilityType types.ClusterScalabilityType

	// Specifies whether to copy all tags from the DB cluster to snapshots of the DB
	// cluster. The default is not to copy them.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	CopyTagsToSnapshot *bool

	// The compute and memory capacity of each DB instance in the Multi-AZ DB cluster,
	// for example db.m6gd.xlarge . Not all DB instance classes are available in all
	// Amazon Web Services Regions, or for all database engines.
	//
	// For the full list of DB instance classes and availability for your engine, see [DB instance class]
	// in the Amazon RDS User Guide.
	//
	// This setting is required to create a Multi-AZ DB cluster.
	//
	// Valid for Cluster Type: Multi-AZ DB clusters only
	//
	// [DB instance class]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html
	DBClusterInstanceClass *string

	// The name of the DB cluster parameter group to associate with this DB cluster.
	// If you don't specify a value, then the default DB cluster parameter group for
	// the specified DB engine and version is used.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Constraints:
	//
	//   - If supplied, must match the name of an existing DB cluster parameter group.
	DBClusterParameterGroupName *string

	// A DB subnet group to associate with this DB cluster.
	//
	// This setting is required to create a Multi-AZ DB cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Constraints:
	//
	//   - Must match the name of an existing DB subnet group.
	//
	// Example: mydbsubnetgroup
	DBSubnetGroupName *string

	// Reserved for future use.
	DBSystemId *string

	// The mode of Database Insights to enable for the DB cluster.
	//
	// If you set this value to advanced , you must also set the
	// PerformanceInsightsEnabled parameter to true and the
	// PerformanceInsightsRetentionPeriod parameter to 465.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	DatabaseInsightsMode types.DatabaseInsightsMode

	// The name for your database of up to 64 alphanumeric characters. A database
	// named postgres is always created. If this parameter is specified, an additional
	// database with this name is created.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	DatabaseName *string

	// Specifies whether the DB cluster has deletion protection enabled. The database
	// can't be deleted when deletion protection is enabled. By default, deletion
	// protection isn't enabled.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	DeletionProtection *bool

	// The Active Directory directory ID to create the DB cluster in.
	//
	// For Amazon Aurora DB clusters, Amazon RDS can use Kerberos authentication to
	// authenticate users that connect to the DB cluster.
	//
	// For more information, see [Kerberos authentication] in the Amazon Aurora User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	//
	// [Kerberos authentication]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/kerberos-authentication.html
	Domain *string

	// The name of the IAM role to use when making API calls to the Directory Service.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	DomainIAMRoleName *string

	// The list of log types that need to be enabled for exporting to CloudWatch Logs.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// The following values are valid for each DB engine:
	//
	//   - Aurora MySQL - audit | error | general | instance | slowquery |
	//   iam-db-auth-error
	//
	//   - Aurora PostgreSQL - instance | postgresql | iam-db-auth-error
	//
	//   - RDS for MySQL - error | general | slowquery | iam-db-auth-error
	//
	//   - RDS for PostgreSQL - postgresql | upgrade | iam-db-auth-error
	//
	// For more information about exporting CloudWatch Logs for Amazon RDS, see [Publishing Database Logs to Amazon CloudWatch Logs] in
	// the Amazon RDS User Guide.
	//
	// For more information about exporting CloudWatch Logs for Amazon Aurora, see [Publishing Database Logs to Amazon CloudWatch Logs] in
	// the Amazon Aurora User Guide.
	//
	// [Publishing Database Logs to Amazon CloudWatch Logs]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html#USER_LogAccess.Procedural.UploadtoCloudWatch
	EnableCloudwatchLogsExports []string

	// Specifies whether to enable this DB cluster to forward write operations to the
	// primary cluster of a global cluster (Aurora global database). By default, write
	// operations are not allowed on Aurora DB clusters that are secondary clusters in
	// an Aurora global database.
	//
	// You can set this value only on Aurora DB clusters that are members of an Aurora
	// global database. With this parameter enabled, a secondary cluster can forward
	// writes to the current primary cluster, and the resulting changes are replicated
	// back to this cluster. For the primary DB cluster of an Aurora global database,
	// this value is used immediately if the primary is demoted by a global cluster API
	// operation, but it does nothing until then.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	EnableGlobalWriteForwarding *bool

	// Specifies whether to enable the HTTP endpoint for the DB cluster. By default,
	// the HTTP endpoint isn't enabled.
	//
	// When enabled, the HTTP endpoint provides a connectionless web service API (RDS
	// Data API) for running SQL queries on the DB cluster. You can also query your
	// database from inside the RDS console with the RDS query editor.
	//
	// For more information, see [Using RDS Data API] in the Amazon Aurora User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	//
	// [Using RDS Data API]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html
	EnableHttpEndpoint *bool

	// Specifies whether to enable mapping of Amazon Web Services Identity and Access
	// Management (IAM) accounts to database accounts. By default, mapping isn't
	// enabled.
	//
	// For more information, see [IAM Database Authentication] in the Amazon Aurora User Guide or [IAM database authentication for MariaDB, MySQL, and PostgreSQL] in the Amazon
	// RDS User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// [IAM Database Authentication]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.html
	// [IAM database authentication for MariaDB, MySQL, and PostgreSQL]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
	EnableIAMDatabaseAuthentication *bool

	// Specifies whether to enable Aurora Limitless Database. You must enable Aurora
	// Limitless Database to create a DB shard group.
	//
	// Valid for: Aurora DB clusters only
	//
	// This setting is no longer used. Instead use the ClusterScalabilityType setting.
	EnableLimitlessDatabase *bool

	// Specifies whether read replicas can forward write operations to the writer DB
	// instance in the DB cluster. By default, write operations aren't allowed on
	// reader DB instances.
	//
	// Valid for: Aurora DB clusters only
	EnableLocalWriteForwarding *bool

	// Specifies whether to turn on Performance Insights for the DB cluster.
	//
	// For more information, see [Using Amazon Performance Insights] in the Amazon RDS User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// [Using Amazon Performance Insights]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html
	EnablePerformanceInsights *bool

	// The life cycle type for this DB cluster.
	//
	// By default, this value is set to open-source-rds-extended-support , which
	// enrolls your DB cluster into Amazon RDS Extended Support. At the end of standard
	// support, you can avoid charges for Extended Support by setting the value to
	// open-source-rds-extended-support-disabled . In this case, creating the DB
	// cluster will fail if the DB major version is past its end of standard support
	// date.
	//
	// You can use this setting to enroll your DB cluster into Amazon RDS Extended
	// Support. With RDS Extended Support, you can run the selected major engine
	// version on your DB cluster past the end of standard support for that engine
	// version. For more information, see the following sections:
	//
	//   - Amazon Aurora - [Amazon RDS Extended Support with Amazon Aurora]in the Amazon Aurora User Guide
	//
	//   - Amazon RDS - [Amazon RDS Extended Support with Amazon RDS]in the Amazon RDS User Guide
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Valid Values: open-source-rds-extended-support |
	// open-source-rds-extended-support-disabled
	//
	// Default: open-source-rds-extended-support
	//
	// [Amazon RDS Extended Support with Amazon RDS]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/extended-support.html
	// [Amazon RDS Extended Support with Amazon Aurora]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/extended-support.html
	EngineLifecycleSupport *string

	// The DB engine mode of the DB cluster, either provisioned or serverless .
	//
	// The serverless engine mode only applies for Aurora Serverless v1 DB clusters.
	// Aurora Serverless v2 DB clusters use the provisioned engine mode.
	//
	// For information about limitations and requirements for Serverless DB clusters,
	// see the following sections in the Amazon Aurora User Guide:
	//
	// [Limitations of Aurora Serverless v1]
	//
	// [Requirements for Aurora Serverless v2]
	//
	// Valid for Cluster Type: Aurora DB clusters only
	//
	// [Limitations of Aurora Serverless v1]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html#aurora-serverless.limitations
	// [Requirements for Aurora Serverless v2]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.requirements.html
	EngineMode *string

	// The version number of the database engine to use.
	//
	// To list all of the available engine versions for Aurora MySQL version 2
	// (5.7-compatible) and version 3 (MySQL 8.0-compatible), use the following
	// command:
	//
	//     aws rds describe-db-engine-versions --engine aurora-mysql --query
	//     "DBEngineVersions[].EngineVersion"
	//
	// You can supply either 5.7 or 8.0 to use the default engine version for Aurora
	// MySQL version 2 or version 3, respectively.
	//
	// To list all of the available engine versions for Aurora PostgreSQL, use the
	// following command:
	//
	//     aws rds describe-db-engine-versions --engine aurora-postgresql --query
	//     "DBEngineVersions[].EngineVersion"
	//
	// To list all of the available engine versions for RDS for MySQL, use the
	// following command:
	//
	//     aws rds describe-db-engine-versions --engine mysql --query
	//     "DBEngineVersions[].EngineVersion"
	//
	// To list all of the available engine versions for RDS for PostgreSQL, use the
	// following command:
	//
	//     aws rds describe-db-engine-versions --engine postgres --query
	//     "DBEngineVersions[].EngineVersion"
	//
	// For information about a specific engine, see the following topics:
	//
	//   - Aurora MySQL - see [Database engine updates for Amazon Aurora MySQL]in the Amazon Aurora User Guide.
	//
	//   - Aurora PostgreSQL - see [Amazon Aurora PostgreSQL releases and engine versions]in the Amazon Aurora User Guide.
	//
	//   - RDS for MySQL - see [Amazon RDS for MySQL]in the Amazon RDS User Guide.
	//
	//   - RDS for PostgreSQL - see [Amazon RDS for PostgreSQL]in the Amazon RDS User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// [Database engine updates for Amazon Aurora MySQL]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.html
	// [Amazon RDS for PostgreSQL]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts
	// [Amazon RDS for MySQL]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.VersionMgmt
	// [Amazon Aurora PostgreSQL releases and engine versions]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.20180305.html
	EngineVersion *string

	// The global cluster ID of an Aurora cluster that becomes the primary cluster in
	// the new global database cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	GlobalClusterIdentifier *string

	// The amount of Provisioned IOPS (input/output operations per second) to be
	// initially allocated for each DB instance in the Multi-AZ DB cluster.
	//
	// For information about valid IOPS values, see [Provisioned IOPS storage] in the Amazon RDS User Guide.
	//
	// This setting is required to create a Multi-AZ DB cluster.
	//
	// Valid for Cluster Type: Multi-AZ DB clusters only
	//
	// Constraints:
	//
	//   - Must be a multiple between .5 and 50 of the storage amount for the DB
	//   cluster.
	//
	// [Provisioned IOPS storage]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html#USER_PIOPS
	Iops *int32

	// The Amazon Web Services KMS key identifier for an encrypted DB cluster.
	//
	// The Amazon Web Services KMS key identifier is the key ARN, key ID, alias ARN,
	// or alias name for the KMS key. To use a KMS key in a different Amazon Web
	// Services account, specify the key ARN or alias ARN.
	//
	// When a KMS key isn't specified in KmsKeyId :
	//
	//   - If ReplicationSourceIdentifier identifies an encrypted source, then Amazon
	//   RDS uses the KMS key used to encrypt the source. Otherwise, Amazon RDS uses your
	//   default KMS key.
	//
	//   - If the StorageEncrypted parameter is enabled and ReplicationSourceIdentifier
	//   isn't specified, then Amazon RDS uses your default KMS key.
	//
	// There is a default KMS key for your Amazon Web Services account. Your Amazon
	// Web Services account has a different default KMS key for each Amazon Web
	// Services Region.
	//
	// If you create a read replica of an encrypted DB cluster in another Amazon Web
	// Services Region, make sure to set KmsKeyId to a KMS key identifier that is
	// valid in the destination Amazon Web Services Region. This KMS key is used to
	// encrypt the read replica in that Amazon Web Services Region.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	KmsKeyId *string

	// Specifies whether to manage the master user password with Amazon Web Services
	// Secrets Manager.
	//
	// For more information, see [Password management with Amazon Web Services Secrets Manager] in the Amazon RDS User Guide and [Password management with Amazon Web Services Secrets Manager] in the Amazon
	// Aurora User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Constraints:
	//
	//   - Can't manage the master user password with Amazon Web Services Secrets
	//   Manager if MasterUserPassword is specified.
	//
	// [Password management with Amazon Web Services Secrets Manager]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html
	ManageMasterUserPassword *bool

	// Specifies the authentication type for the master user. With IAM master user
	// authentication, you can configure the master DB user with IAM database
	// authentication when you create a DB cluster.
	//
	// You can specify one of the following values:
	//
	//   - password - Use standard database authentication with a password.
	//
	//   - iam-db-auth - Use IAM database authentication for the master user.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// This option is only valid for RDS for PostgreSQL and Aurora PostgreSQL engines.
	MasterUserAuthenticationType types.MasterUserAuthenticationType

	// The password for the master database user.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Constraints:
	//
	//   - Must contain from 8 to 41 characters.
	//
	//   - Can contain any printable ASCII character except "/", """, or "@".
	//
	//   - Can't be specified if ManageMasterUserPassword is turned on.
	MasterUserPassword *string

	// The Amazon Web Services KMS key identifier to encrypt a secret that is
	// automatically generated and managed in Amazon Web Services Secrets Manager.
	//
	// This setting is valid only if the master user password is managed by RDS in
	// Amazon Web Services Secrets Manager for the DB cluster.
	//
	// The Amazon Web Services KMS key identifier is the key ARN, key ID, alias ARN,
	// or alias name for the KMS key. To use a KMS key in a different Amazon Web
	// Services account, specify the key ARN or alias ARN.
	//
	// If you don't specify MasterUserSecretKmsKeyId , then the aws/secretsmanager KMS
	// key is used to encrypt the secret. If the secret is in a different Amazon Web
	// Services account, then you can't use the aws/secretsmanager KMS key to encrypt
	// the secret, and you must use a customer managed KMS key.
	//
	// There is a default KMS key for your Amazon Web Services account. Your Amazon
	// Web Services account has a different default KMS key for each Amazon Web
	// Services Region.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	MasterUserSecretKmsKeyId *string

	// The name of the master user for the DB cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Constraints:
	//
	//   - Must be 1 to 16 letters or numbers.
	//
	//   - First character must be a letter.
	//
	//   - Can't be a reserved word for the chosen database engine.
	MasterUsername *string

	// The interval, in seconds, between points when Enhanced Monitoring metrics are
	// collected for the DB cluster. To turn off collecting Enhanced Monitoring
	// metrics, specify 0 .
	//
	// If MonitoringRoleArn is specified, also set MonitoringInterval to a value other
	// than 0 .
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Valid Values: 0 | 1 | 5 | 10 | 15 | 30 | 60
	//
	// Default: 0
	MonitoringInterval *int32

	// The Amazon Resource Name (ARN) for the IAM role that permits RDS to send
	// Enhanced Monitoring metrics to Amazon CloudWatch Logs. An example is
	// arn:aws:iam:123456789012:role/emaccess . For information on creating a
	// monitoring role, see [Setting up and enabling Enhanced Monitoring]in the Amazon RDS User Guide.
	//
	// If MonitoringInterval is set to a value other than 0 , supply a
	// MonitoringRoleArn value.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// [Setting up and enabling Enhanced Monitoring]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html#USER_Monitoring.OS.Enabling
	MonitoringRoleArn *string

	// The network type of the DB cluster.
	//
	// The network type is determined by the DBSubnetGroup specified for the DB
	// cluster. A DBSubnetGroup can support only the IPv4 protocol or the IPv4 and the
	// IPv6 protocols ( DUAL ).
	//
	// For more information, see [Working with a DB instance in a VPC] in the Amazon Aurora User Guide.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	//
	// Valid Values: IPV4 | DUAL
	//
	// [Working with a DB instance in a VPC]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html
	NetworkType *string

	// The option group to associate the DB cluster with.
	//
	// DB clusters are associated with a default option group that can't be modified.
	OptionGroupName *string

	// The Amazon Web Services KMS key identifier for encryption of Performance
	// Insights data.
	//
	// The Amazon Web Services KMS key identifier is the key ARN, key ID, alias ARN,
	// or alias name for the KMS key.
	//
	// If you don't specify a value for PerformanceInsightsKMSKeyId , then Amazon RDS
	// uses your default KMS key. There is a default KMS key for your Amazon Web
	// Services account. Your Amazon Web Services account has a different default KMS
	// key for each Amazon Web Services Region.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	PerformanceInsightsKMSKeyId *string

	// The number of days to retain Performance Insights data.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Valid Values:
	//
	//   - 7
	//
	//   - month * 31, where month is a number of months from 1-23. Examples: 93 (3
	//   months * 31), 341 (11 months * 31), 589 (19 months * 31)
	//
	//   - 731
	//
	// Default: 7 days
	//
	// If you specify a retention period that isn't valid, such as 94 , Amazon RDS
	// issues an error.
	PerformanceInsightsRetentionPeriod *int32

	// The port number on which the instances in the DB cluster accept connections.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Valid Values: 1150-65535
	//
	// Default:
	//
	//   - RDS for MySQL and Aurora MySQL - 3306
	//
	//   - RDS for PostgreSQL and Aurora PostgreSQL - 5432
	Port *int32

	// When you are replicating a DB cluster from one Amazon Web Services GovCloud
	// (US) Region to another, an URL that contains a Signature Version 4 signed
	// request for the CreateDBCluster operation to be called in the source Amazon Web
	// Services Region where the DB cluster is replicated from. Specify PreSignedUrl
	// only when you are performing cross-Region replication from an encrypted DB
	// cluster.
	//
	// The presigned URL must be a valid request for the CreateDBCluster API operation
	// that can run in the source Amazon Web Services Region that contains the
	// encrypted DB cluster to copy.
	//
	// The presigned URL request must contain the following parameter values:
	//
	//   - KmsKeyId - The KMS key identifier for the KMS key to use to encrypt the copy
	//   of the DB cluster in the destination Amazon Web Services Region. This should
	//   refer to the same KMS key for both the CreateDBCluster operation that is
	//   called in the destination Amazon Web Services Region, and the operation
	//   contained in the presigned URL.
	//
	//   - DestinationRegion - The name of the Amazon Web Services Region that Aurora
	//   read replica will be created in.
	//
	//   - ReplicationSourceIdentifier - The DB cluster identifier for the encrypted DB
	//   cluster to be copied. This identifier must be in the Amazon Resource Name (ARN)
	//   format for the source Amazon Web Services Region. For example, if you are
	//   copying an encrypted DB cluster from the us-west-2 Amazon Web Services Region,
	//   then your ReplicationSourceIdentifier would look like Example:
	//   arn:aws:rds:us-west-2:123456789012:cluster:aurora-cluster1 .
	//
	// To learn how to generate a Signature Version 4 signed request, see [Authenticating Requests: Using Query Parameters (Amazon Web Services Signature Version 4)] and [Signature Version 4 Signing Process].
	//
	// If you are using an Amazon Web Services SDK tool or the CLI, you can specify
	// SourceRegion (or --source-region for the CLI) instead of specifying PreSignedUrl
	// manually. Specifying SourceRegion autogenerates a presigned URL that is a valid
	// request for the operation that can run in the source Amazon Web Services Region.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	//
	// [Authenticating Requests: Using Query Parameters (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
	// [Signature Version 4 Signing Process]: https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html
	PreSignedUrl *string

	// The daily time range during which automated backups are created if automated
	// backups are enabled using the BackupRetentionPeriod parameter.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// The default is a 30-minute window selected at random from an 8-hour block of
	// time for each Amazon Web Services Region. To view the time blocks available, see
	// [Backup window]in the Amazon Aurora User Guide.
	//
	// Constraints:
	//
	//   - Must be in the format hh24:mi-hh24:mi .
	//
	//   - Must be in Universal Coordinated Time (UTC).
	//
	//   - Must not conflict with the preferred maintenance window.
	//
	//   - Must be at least 30 minutes.
	//
	// [Backup window]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Backups.html#Aurora.Managing.Backups.BackupWindow
	PreferredBackupWindow *string

	// The weekly time range during which system maintenance can occur.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// The default is a 30-minute window selected at random from an 8-hour block of
	// time for each Amazon Web Services Region, occurring on a random day of the week.
	// To see the time blocks available, see [Adjusting the Preferred DB Cluster Maintenance Window]in the Amazon Aurora User Guide.
	//
	// Constraints:
	//
	//   - Must be in the format ddd:hh24:mi-ddd:hh24:mi .
	//
	//   - Days must be one of Mon | Tue | Wed | Thu | Fri | Sat | Sun .
	//
	//   - Must be in Universal Coordinated Time (UTC).
	//
	//   - Must be at least 30 minutes.
	//
	// [Adjusting the Preferred DB Cluster Maintenance Window]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.Maintenance.html#AdjustingTheMaintenanceWindow.Aurora
	PreferredMaintenanceWindow *string

	// Specifies whether the DB cluster is publicly accessible.
	//
	// Valid for Cluster Type: Multi-AZ DB clusters only
	//
	// When the DB cluster is publicly accessible and you connect from outside of the
	// DB cluster's virtual private cloud (VPC), its domain name system (DNS) endpoint
	// resolves to the public IP address. When you connect from within the same VPC as
	// the DB cluster, the endpoint resolves to the private IP address. Access to the
	// DB cluster is controlled by its security group settings.
	//
	// When the DB cluster isn't publicly accessible, it is an internal DB cluster
	// with a DNS name that resolves to a private IP address.
	//
	// The default behavior when PubliclyAccessible is not specified depends on
	// whether a DBSubnetGroup is specified.
	//
	// If DBSubnetGroup isn't specified, PubliclyAccessible defaults to true .
	//
	// If DBSubnetGroup is specified, PubliclyAccessible defaults to false unless the
	// value of DBSubnetGroup is default , in which case PubliclyAccessible defaults
	// to true .
	//
	// If PubliclyAccessible is true and the VPC that the DBSubnetGroup is in doesn't
	// have an internet gateway attached to it, Amazon RDS returns an error.
	PubliclyAccessible *bool

	// Reserved for future use.
	RdsCustomClusterConfiguration *types.RdsCustomClusterConfiguration

	// The Amazon Resource Name (ARN) of the source DB instance or DB cluster if this
	// DB cluster is created as a read replica.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	ReplicationSourceIdentifier *string

	// For DB clusters in serverless DB engine mode, the scaling properties of the DB
	// cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters only
	ScalingConfiguration *types.ScalingConfiguration

	// Contains the scaling configuration of an Aurora Serverless v2 DB cluster.
	//
	// For more information, see [Using Amazon Aurora Serverless v2] in the Amazon Aurora User Guide.
	//
	// [Using Amazon Aurora Serverless v2]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html
	ServerlessV2ScalingConfiguration *types.ServerlessV2ScalingConfiguration

	// The AWS region the resource is in. The presigned URL will be created with this
	// region, if the PresignURL member is empty set.
	SourceRegion *string

	// Specifies whether the DB cluster is encrypted.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	StorageEncrypted *bool

	// The storage type to associate with the DB cluster.
	//
	// For information on storage types for Aurora DB clusters, see [Storage configurations for Amazon Aurora DB clusters]. For information
	// on storage types for Multi-AZ DB clusters, see [Settings for creating Multi-AZ DB clusters].
	//
	// This setting is required to create a Multi-AZ DB cluster.
	//
	// When specified for a Multi-AZ DB cluster, a value for the Iops parameter is
	// required.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	//
	// Valid Values:
	//
	//   - Aurora DB clusters - aurora | aurora-iopt1
	//
	//   - Multi-AZ DB clusters - io1 | io2 | gp3
	//
	// Default:
	//
	//   - Aurora DB clusters - aurora
	//
	//   - Multi-AZ DB clusters - io1
	//
	// When you create an Aurora DB cluster with the storage type set to aurora-iopt1 ,
	// the storage type is returned in the response. The storage type isn't returned
	// when you set it to aurora .
	//
	// [Storage configurations for Amazon Aurora DB clusters]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.StorageReliability.html#aurora-storage-type
	// [Settings for creating Multi-AZ DB clusters]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/create-multi-az-db-cluster.html#create-multi-az-db-cluster-settings
	StorageType *string

	// Tags to assign to resources associated with the DB cluster.
	//
	// Valid Values:
	//
	//   - cluster-auto-backup - The DB cluster's automated backup.
	TagSpecifications []types.TagSpecification

	// Tags to assign to the DB cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	Tags []types.Tag

	// A list of EC2 VPC security groups to associate with this DB cluster.
	//
	// Valid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters
	VpcSecurityGroupIds []string

	// Specifies to create an Aurora DB Cluster with express configuration in seconds.
	// Express configuration provides a cluster with a writer instance and feature
	// specific values set to all other input parameters of this API.
	//
	// Valid for Cluster Type: Aurora DB clusters
	WithExpressConfiguration *bool

	// Used by the SDK's PresignURL autofill customization to specify the region the
	// of the client's request.
	destinationRegion *string

	noSmithyDocumentSerde
}

type CreateDBClusterOutput struct {

	// Contains the details of an Amazon Aurora DB cluster or Multi-AZ DB cluster.
	//
	// For an Amazon Aurora DB cluster, this data type is used as a response element
	// in the operations CreateDBCluster , DeleteDBCluster , DescribeDBClusters ,
	// FailoverDBCluster , ModifyDBCluster , PromoteReadReplicaDBCluster ,
	// RestoreDBClusterFromS3 , RestoreDBClusterFromSnapshot ,
	// RestoreDBClusterToPointInTime , StartDBCluster , and StopDBCluster .
	//
	// For a Multi-AZ DB cluster, this data type is used as a response element in the
	// operations CreateDBCluster , DeleteDBCluster , DescribeDBClusters ,
	// FailoverDBCluster , ModifyDBCluster , RebootDBCluster ,
	// RestoreDBClusterFromSnapshot , and RestoreDBClusterToPointInTime .
	//
	// For more information on Amazon Aurora DB clusters, see [What is Amazon Aurora?] in the Amazon Aurora
	// User Guide.
	//
	// For more information on Multi-AZ DB clusters, see [Multi-AZ deployments with two readable standby DB instances] in the Amazon RDS User
	// Guide.
	//
	// [Multi-AZ deployments with two readable standby DB instances]: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html
	// [What is Amazon Aurora?]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html
	DBCluster *types.DBCluster

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationCreateDBClusterMiddlewares(stack *middleware.Stack, options Options) (err error) {
	if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {
		return err
	}
	err = stack.Serialize.Add(&awsAwsquery_serializeOpCreateDBCluster{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsquery_deserializeOpCreateDBCluster{}, middleware.After)
	if err != nil {
		return err
	}
	if err := addProtocolFinalizerMiddlewares(stack, options, "CreateDBCluster"); err != nil {
		return fmt.Errorf("add protocol finalizers: %v", err)
	}

	if err = addlegacyEndpointContextSetter(stack, options); err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = addClientRequestID(stack); err != nil {
		return err
	}
	if err = addComputeContentLength(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = addComputePayloadSHA256(stack); err != nil {
		return err
	}
	if err = addRetry(stack, options, c); err != nil {
		return err
	}
	if err = addRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = addRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addSpanRetryLoop(stack, options); err != nil {
		return err
	}
	if err = addClientUserAgent(stack, options); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addCreateDBClusterPresignURLMiddleware(stack, options); err != nil {
		return err
	}
	if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {
		return err
	}
	if err = addUserAgentRetryMode(stack, options); err != nil {
		return err
	}
	if err = addCredentialSource(stack, options); err != nil {
		return err
	}
	if err = addOpCreateDBClusterValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateDBCluster(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRecursionDetection(stack); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	if err = addDisableHTTPSMiddleware(stack, options); err != nil {
		return err
	}
	if err = addInterceptBeforeRetryLoop(stack, options); err != nil {
		return err
	}
	if err = addInterceptAttempt(stack, options); err != nil {
		return err
	}
	if err = addInterceptors(stack, options); err != nil {
		return err
	}
	return nil
}

func copyCreateDBClusterInputForPresign(params interface{}) (interface{}, error) {
	input, ok := params.(*CreateDBClusterInput)
	if !ok {
		return nil, fmt.Errorf("expect *CreateDBClusterInput type, got %T", params)
	}
	cpy := *input
	return &cpy, nil
}
func getCreateDBClusterPreSignedUrl(params interface{}) (string, bool, error) {
	input, ok := params.(*CreateDBClusterInput)
	if !ok {
		return ``, false, fmt.Errorf("expect *CreateDBClusterInput type, got %T", params)
	}
	if input.PreSignedUrl == nil || len(*input.PreSignedUrl) == 0 {
		return ``, false, nil
	}
	return *input.PreSignedUrl, true, nil
}
func getCreateDBClusterSourceRegion(params interface{}) (string, bool, error) {
	input, ok := params.(*CreateDBClusterInput)
	if !ok {
		return ``, false, fmt.Errorf("expect *CreateDBClusterInput type, got %T", params)
	}
	if input.SourceRegion == nil || len(*input.SourceRegion) == 0 {
		return ``, false, nil
	}
	return *input.SourceRegion, true, nil
}
func setCreateDBClusterPreSignedUrl(params interface{}, value string) error {
	input, ok := params.(*CreateDBClusterInput)
	if !ok {
		return fmt.Errorf("expect *CreateDBClusterInput type, got %T", params)
	}
	input.PreSignedUrl = &value
	return nil
}
func setCreateDBClusterdestinationRegion(params interface{}, value string) error {
	input, ok := params.(*CreateDBClusterInput)
	if !ok {
		return fmt.Errorf("expect *CreateDBClusterInput type, got %T", params)
	}
	input.destinationRegion = &value
	return nil
}
func addCreateDBClusterPresignURLMiddleware(stack *middleware.Stack, options Options) error {
	return presignedurlcust.AddMiddleware(stack, presignedurlcust.Options{
		Accessor: presignedurlcust.ParameterAccessor{
			GetPresignedURL: getCreateDBClusterPreSignedUrl,

			GetSourceRegion: getCreateDBClusterSourceRegion,

			CopyInput: copyCreateDBClusterInputForPresign,

			SetDestinationRegion: setCreateDBClusterdestinationRegion,

			SetPresignedURL: setCreateDBClusterPreSignedUrl,
		},
		Presigner: &presignAutoFillCreateDBClusterClient{client: NewPresignClient(New(options))},
	})
}

type presignAutoFillCreateDBClusterClient struct {
	client *PresignClient
}

// PresignURL is a middleware accessor that satisfies URLPresigner interface.
func (c *presignAutoFillCreateDBClusterClient) PresignURL(ctx context.Context, srcRegion string, params interface{}) (*v4.PresignedHTTPRequest, error) {
	input, ok := params.(*CreateDBClusterInput)
	if !ok {
		return nil, fmt.Errorf("expect *CreateDBClusterInput type, got %T", params)
	}
	optFn := func(o *Options) {
		o.Region = srcRegion
		o.APIOptions = append(o.APIOptions, presignedurlcust.RemoveMiddleware)
	}
	presignOptFn := WithPresignClientFromClientOptions(optFn)
	return c.client.PresignCreateDBCluster(ctx, input, presignOptFn)
}

func newServiceMetadataMiddleware_opCreateDBCluster(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		OperationName: "CreateDBCluster",
	}
}

// PresignCreateDBCluster is used to generate a presigned HTTP Request which
// contains presigned URL, signed headers and HTTP method used.
func (c *PresignClient) PresignCreateDBCluster(ctx context.Context, params *CreateDBClusterInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {
	if params == nil {
		params = &CreateDBClusterInput{}
	}
	options := c.options.copy()
	for _, fn := range optFns {
		fn(&options)
	}
	clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)

	result, _, err := c.client.invokeOperation(ctx, "CreateDBCluster", params, clientOptFns,
		c.client.addOperationCreateDBClusterMiddlewares,
		presignConverter(options).convertToPresignMiddleware,
	)
	if err != nil {
		return nil, err
	}

	out := result.(*v4.PresignedHTTPRequest)
	return out, nil
}
