import type { Construct } from 'constructs';
import type { IConnectable } from './connections';
import { Connections } from './connections';
import type { ILaunchTemplateRef, IPlacementGroupRef, LaunchTemplateReference } from './ec2.generated';
import type { InstanceType } from './instance-types';
import type { IKeyPair } from './key-pair';
import type { IMachineImage, OperatingSystemType } from './machine-image';
import type { ISecurityGroup } from './security-group';
import type { UserData } from './user-data';
import type { BlockDevice } from './volume';
import * as iam from '../../aws-iam';
import type { Duration, Expiration, IResource } from '../../core';
import { Resource, TagManager } from '../../core';
/**
 * Provides the options for specifying the CPU credit type for burstable EC2 instance types (T2, T3, T3a, etc).
 *
 * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-how-to.html
 */
export declare enum CpuCredits {
    /**
     * Standard bursting mode.
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-standard-mode.html
     */
    STANDARD = "standard",
    /**
     * Unlimited bursting mode.
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode.html
     */
    UNLIMITED = "unlimited"
}
/**
 * Provides the options for specifying the instance initiated shutdown behavior.
 *
 * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#Using_ChangingInstanceInitiatedShutdownBehavior
 */
export declare enum InstanceInitiatedShutdownBehavior {
    /**
     * The instance will stop when it initiates a shutdown.
     */
    STOP = "stop",
    /**
     * The instance will be terminated when it initiates a shutdown.
     */
    TERMINATE = "terminate"
}
/**
 * Interface for LaunchTemplate-like objects.
 */
export interface ILaunchTemplate extends IResource, ILaunchTemplateRef {
    /**
     * The version number of this launch template to use
     *
     * @attribute
     */
    readonly versionNumber: string;
    /**
     * The identifier of the Launch Template
     *
     * Exactly one of `launchTemplateId` and `launchTemplateName` will be set.
     *
     * @attribute
     */
    readonly launchTemplateId?: string;
    /**
     * The name of the Launch Template
     *
     * Exactly one of `launchTemplateId` and `launchTemplateName` will be set.
     *
     * @attribute
     */
    readonly launchTemplateName?: string;
}
/**
 * Provides the options for the types of interruption for spot instances.
 */
export declare enum SpotInstanceInterruption {
    /**
     * The instance will stop when interrupted.
     */
    STOP = "stop",
    /**
     * The instance will be terminated when interrupted.
     */
    TERMINATE = "terminate",
    /**
     * The instance will hibernate when interrupted.
     */
    HIBERNATE = "hibernate"
}
/**
 * The Spot Instance request type.
 *
 * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html
 */
export declare enum SpotRequestType {
    /**
     * A one-time Spot Instance request remains active until Amazon EC2 launches the Spot Instance,
     * the request expires, or you cancel the request. If the Spot price exceeds your maximum price
     * or capacity is not available, your Spot Instance is terminated and the Spot Instance request
     * is closed.
     */
    ONE_TIME = "one-time",
    /**
     * A persistent Spot Instance request remains active until it expires or you cancel it, even if
     * the request is fulfilled. If the Spot price exceeds your maximum price or capacity is not available,
     * your Spot Instance is interrupted. After your instance is interrupted, when your maximum price exceeds
     * the Spot price or capacity becomes available again, the Spot Instance is started if stopped or resumed
     * if hibernated.
     */
    PERSISTENT = "persistent"
}
/**
 * Interface for the Spot market instance options provided in a LaunchTemplate.
 */
export interface LaunchTemplateSpotOptions {
    /**
     * Spot Instances with a defined duration (also known as Spot blocks) are designed not to be interrupted and will run continuously for the duration you select.
     * You can use a duration of 1, 2, 3, 4, 5, or 6 hours.
     *
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html#fixed-duration-spot-instances
     *
     * @default Requested spot instances do not have a pre-defined duration.
     */
    readonly blockDuration?: Duration;
    /**
     * The behavior when a Spot Instance is interrupted.
     *
     * @default Spot instances will terminate when interrupted.
     */
    readonly interruptionBehavior?: SpotInstanceInterruption;
    /**
     * Maximum hourly price you're willing to pay for each Spot instance. The value is given
     * in dollars. ex: 0.01 for 1 cent per hour, or 0.001 for one-tenth of a cent per hour.
     *
     * @default Maximum hourly price will default to the on-demand price for the instance type.
     */
    readonly maxPrice?: number;
    /**
     * The Spot Instance request type.
     *
     * If you are using Spot Instances with an Auto Scaling group, use one-time requests, as the
     * Amazon EC2 Auto Scaling service handles requesting new Spot Instances whenever the group is
     * below its desired capacity.
     *
     * @default One-time spot request.
     */
    readonly requestType?: SpotRequestType;
    /**
     * The end date of the request. For a one-time request, the request remains active until all instances
     * launch, the request is canceled, or this date is reached. If the request is persistent, it remains
     * active until it is canceled or this date and time is reached.
     *
     * @default The default end date is 7 days from the current date.
     */
    readonly validUntil?: Expiration;
}
/**
 * The state of token usage for your instance metadata requests.
 *
 * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-metadataoptions.html#cfn-ec2-instance-metadataoptions-httptokens
 * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httptokens
 */
export declare enum LaunchTemplateHttpTokens {
    /**
     * If the state is optional, you can choose to retrieve instance metadata with or without a signed token header on your request.
     */
    OPTIONAL = "optional",
    /**
     * If the state is required, you must send a signed token header with any instance metadata retrieval requests. In this state,
     * retrieving the IAM role credentials always returns the version 2.0 credentials; the version 1.0 credentials are not available.
     */
    REQUIRED = "required"
}
/**
 * Properties of a LaunchTemplate.
 */
export interface LaunchTemplateProps {
    /**
     * Name for this launch template.
     *
     * @default Automatically generated name
     */
    readonly launchTemplateName?: string;
    /**
     * A description for the first version of the launch template.
     *
     * The version description must be maximum 255 characters long.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-versiondescription
     *
     * @default - No description
     */
    readonly versionDescription?: string;
    /**
     * Type of instance to launch.
     *
     * @default - This Launch Template does not specify a default Instance Type.
     */
    readonly instanceType?: InstanceType;
    /**
     * The AMI that will be used by instances.
     *
     * @default - This Launch Template does not specify a default AMI.
     */
    readonly machineImage?: IMachineImage;
    /**
     * The user data to make available to the instance.
     *
     * @default - This Launch Template creates a UserData based on the type of provided
     * machineImage; no UserData is created if a machineImage is not provided
     */
    readonly userData?: UserData;
    /**
     * An IAM role to associate with the instance profile that is used by instances.
     *
     * The role must be assumable by the service principal `ec2.amazonaws.com`.
     * Note: You can provide an instanceProfile or a role, but not both.
     *
     * @example
     * const role = new iam.Role(this, 'MyRole', {
     *   assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com')
     * });
     *
     * @default - No new role is created.
     */
    readonly role?: iam.IRole;
    /**
     * Specifies how block devices are exposed to the instance. You can specify virtual devices and EBS volumes.
     *
     * Each instance that is launched has an associated root device volume,
     * either an Amazon EBS volume or an instance store volume.
     * You can use block device mappings to specify additional EBS volumes or
     * instance store volumes to attach to an instance when it is launched.
     *
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html
     *
     * @default - Uses the block device mapping of the AMI
     */
    readonly blockDevices?: BlockDevice[];
    /**
     * CPU credit type for burstable EC2 instance types.
     *
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html
     *
     * @default - No credit type is specified in the Launch Template.
     */
    readonly cpuCredits?: CpuCredits;
    /**
     * If you set this parameter to true, you cannot terminate the instances launched with this launch template
     * using the Amazon EC2 console, CLI, or API; otherwise, you can.
     *
     * @default - The API termination setting is not specified in the Launch Template.
     */
    readonly disableApiTermination?: boolean;
    /**
     * Indicates whether the instances are optimized for Amazon EBS I/O. This optimization provides dedicated throughput
     * to Amazon EBS and an optimized configuration stack to provide optimal Amazon EBS I/O performance. This optimization
     * isn't available with all instance types. Additional usage charges apply when using an EBS-optimized instance.
     *
     * @default - EBS optimization is not specified in the launch template.
     */
    readonly ebsOptimized?: boolean;
    /**
     * If this parameter is set to true, the instance is enabled for AWS Nitro Enclaves; otherwise, it is not enabled for AWS Nitro Enclaves.
     *
     * @default - Enablement of Nitro enclaves is not specified in the launch template; defaulting to false.
     */
    readonly nitroEnclaveEnabled?: boolean;
    /**
     * If you set this parameter to true, the instance is enabled for hibernation.
     *
     * @default - Hibernation configuration is not specified in the launch template; defaulting to false.
     */
    readonly hibernationConfigured?: boolean;
    /**
     * Indicates whether an instance stops or terminates when you initiate shutdown from the instance (using the operating system command for system shutdown).
     *
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#Using_ChangingInstanceInitiatedShutdownBehavior
     *
     * @default - Shutdown behavior is not specified in the launch template; defaults to STOP.
     */
    readonly instanceInitiatedShutdownBehavior?: InstanceInitiatedShutdownBehavior;
    /**
     * If this property is defined, then the Launch Template's InstanceMarketOptions will be
     * set to use Spot instances, and the options for the Spot instances will be as defined.
     *
     * @default - Instance launched with this template will not be spot instances.
     */
    readonly spotOptions?: LaunchTemplateSpotOptions;
    /**
     * Name of SSH keypair to grant access to instance
     *
     * @default - No SSH access will be possible.
     * @deprecated - Use `keyPair` instead - https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html#using-an-existing-ec2-key-pair
     */
    readonly keyName?: string;
    /**
     * The SSH keypair to grant access to the instance.
     *
     * @default - No SSH access will be possible.
     */
    readonly keyPair?: IKeyPair;
    /**
     * If set to true, then detailed monitoring will be enabled on instances created with this
     * launch template.
     *
     * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html
     *
     * @default False - Detailed monitoring is disabled.
     */
    readonly detailedMonitoring?: boolean;
    /**
     * Security group to assign to instances created with the launch template.
     *
     * @default No security group is assigned.
     */
    readonly securityGroup?: ISecurityGroup;
    /**
     * Whether IMDSv2 should be required on launched instances.
     *
     * @default - false
     */
    readonly requireImdsv2?: boolean;
    /**
     * Enables or disables the HTTP metadata endpoint on your instances.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpendpoint
     *
     * @default true
     */
    readonly httpEndpoint?: boolean;
    /**
     * Enables or disables the IPv6 endpoint for the instance metadata service.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpprotocolipv6
     *
     * @default true
     */
    readonly httpProtocolIpv6?: boolean;
    /**
     * The desired HTTP PUT response hop limit for instance metadata requests. The larger the number, the further instance metadata requests can travel.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpputresponsehoplimit
     *
     * @default 1
     */
    readonly httpPutResponseHopLimit?: number;
    /**
     * The state of token usage for your instance metadata requests.  The default state is `optional` if not specified. However,
     * if requireImdsv2 is true, the state must be `required`.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httptokens
     *
     * @default LaunchTemplateHttpTokens.OPTIONAL
     */
    readonly httpTokens?: LaunchTemplateHttpTokens;
    /**
     * Set to enabled to allow access to instance tags from the instance metadata. Set to disabled to turn off access to instance tags from the instance metadata.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-instancemetadatatags
     *
     * @default false
     */
    readonly instanceMetadataTags?: boolean;
    /**
     * Whether instances should have a public IP addresses associated with them.
     *
     * @default - Use subnet settings
     */
    readonly associatePublicIpAddress?: boolean;
    /**
     * The instance profile used to pass role information to EC2 instances.
     *
     * Note: You can provide an instanceProfile or a role, but not both.
     *
     * @default - No instance profile
     */
    readonly instanceProfile?: iam.IInstanceProfile;
    /**
     * The placement group that you want to launch the instance into.
     *
     * @default - no placement group will be used for this launch template.
     */
    readonly placementGroup?: IPlacementGroupRef;
}
/**
 * A class that provides convenient access to special version tokens for LaunchTemplate
 * versions.
 */
export declare class LaunchTemplateSpecialVersions {
    /**
     * The special value that denotes that users of a Launch Template should
     * reference the LATEST version of the template.
     */
    static readonly LATEST_VERSION: string;
    /**
     * The special value that denotes that users of a Launch Template should
     * reference the DEFAULT version of the template.
     */
    static readonly DEFAULT_VERSION: string;
}
/**
 * Attributes for an imported LaunchTemplate.
 */
export interface LaunchTemplateAttributes {
    /**
     * The version number of this launch template to use
     *
     * @default Version: "$Default"
     */
    readonly versionNumber?: string;
    /**
     * The identifier of the Launch Template
     *
     * Exactly one of `launchTemplateId` and `launchTemplateName` may be set.
     *
     * @default None
     */
    readonly launchTemplateId?: string;
    /**
     * The name of the Launch Template
     *
     * Exactly one of `launchTemplateId` and `launchTemplateName` may be set.
     *
     * @default None
     */
    readonly launchTemplateName?: string;
}
/**
 * This represents an EC2 LaunchTemplate.
 *
 * @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html
 */
export declare class LaunchTemplate extends Resource implements ILaunchTemplate, iam.IGrantable, IConnectable {
    /**
     * Uniquely identifies this class.
     */
    static readonly PROPERTY_INJECTION_ID: string;
    /**
     * Import an existing LaunchTemplate.
     */
    static fromLaunchTemplateAttributes(scope: Construct, id: string, attrs: LaunchTemplateAttributes): ILaunchTemplate;
    readonly launchTemplateId?: string;
    readonly launchTemplateName?: string;
    /**
     * The default version for the launch template.
     *
     * @attribute
     */
    readonly defaultVersionNumber: string;
    /**
     * The latest version of the launch template.
     *
     * @attribute
     */
    readonly latestVersionNumber: string;
    /**
     * The type of OS the instance is running.
     *
     * @attribute
     */
    readonly osType?: OperatingSystemType;
    /**
     * The AMI ID of the image to use
     *
     * @attribute
     */
    readonly imageId?: string;
    /**
     * IAM Role assumed by instances that are launched from this template.
     *
     * @attribute
     */
    readonly role?: iam.IRole;
    /**
     * UserData executed by instances that are launched from this template.
     *
     * @attribute
     */
    readonly userData?: UserData;
    /**
     * Type of instance to launch.
     *
     * @attribute
     */
    readonly instanceType?: InstanceType;
    /**
     * Principal to grant permissions to.
     * @internal
     */
    protected readonly _grantPrincipal?: iam.IPrincipal;
    /**
     * Allows specifying security group connections for the instance.
     * @internal
     */
    protected readonly _connections?: Connections;
    /**
     * TagManager for tagging support.
     */
    protected readonly tags: TagManager;
    private resource?;
    constructor(scope: Construct, id: string, props?: LaunchTemplateProps);
    get versionNumber(): string;
    get launchTemplateRef(): LaunchTemplateReference;
    private renderMetadataOptions;
    /**
     * Add the security group to the instance.
     *
     * @param securityGroup: The security group to add
     */
    addSecurityGroup(securityGroup: ISecurityGroup): void;
    /**
     * Allows specifying security group connections for the instance.
     *
     * @note Only available if you provide a securityGroup when constructing the LaunchTemplate.
     */
    get connections(): Connections;
    /**
     * Principal to grant permissions to.
     *
     * @note Only available if you provide a role when constructing the LaunchTemplate.
     */
    get grantPrincipal(): iam.IPrincipal;
}
