packages/aws-cdk-lib/aws-ec2/lib/vpc-endpoint.ts (686 lines of code) (raw):
import { Construct } from 'constructs';
import { Connections, IConnectable } from './connections';
import { CfnVPCEndpoint } from './ec2.generated';
import { Peer } from './peer';
import { Port } from './port';
import { ISecurityGroup, SecurityGroup } from './security-group';
import { allRouteTableIds, flatten } from './util';
import { ISubnet, IVpc, SubnetSelection } from './vpc';
import * as iam from '../../aws-iam';
import * as cxschema from '../../cloud-assembly-schema';
import { Aws, ContextProvider, IResource, Lazy, Resource, Stack, Token, ValidationError } from '../../core';
import { addConstructMetadata } from '../../core/lib/metadata-resource';
/**
* A VPC endpoint.
*/
export interface IVpcEndpoint extends IResource {
/**
* The VPC endpoint identifier.
* @attribute
*/
readonly vpcEndpointId: string;
}
export abstract class VpcEndpoint extends Resource implements IVpcEndpoint {
public abstract readonly vpcEndpointId: string;
protected policyDocument?: iam.PolicyDocument;
/**
* Adds a statement to the policy document of the VPC endpoint. The statement
* must have a Principal.
*
* Not all interface VPC endpoints support policy. For more information
* see https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html
*
* @param statement the IAM statement to add
*/
public addToPolicy(statement: iam.PolicyStatement) {
if (!statement.hasPrincipal) {
throw new ValidationError('Statement must have a `Principal`.', this);
}
if (!this.policyDocument) {
this.policyDocument = new iam.PolicyDocument();
}
this.policyDocument.addStatements(statement);
}
}
/**
* A gateway VPC endpoint.
*/
export interface IGatewayVpcEndpoint extends IVpcEndpoint {
}
/**
* The type of VPC endpoint.
*/
export enum VpcEndpointType {
/**
* Interface
*
* An interface endpoint is an elastic network interface with a private IP
* address that serves as an entry point for traffic destined to a supported
* service.
*/
INTERFACE = 'Interface',
/**
* Gateway
*
* A gateway endpoint is a gateway that is a target for a specified route in
* your route table, used for traffic destined to a supported AWS service.
*/
GATEWAY = 'Gateway',
/**
* A Gateway Load Balancer (GWLB) endpoint is an entry/exit point in your VPC that allows traffic
* to flow between your VPC and Gateway Load Balancer appliances (like firewalls, intrusion detection systems,
* or other security appliances) deployed in a separate VPC.
*/
GATEWAYLOADBALANCER = 'GatewayLoadBalancer',
/**
* A ServiceNetwork VPC endpoint is a feature to connect your VPC to an AWS Cloud WAN (Wide Area Network)
* or Amazon VPC Lattice service.
*/
SERVICENETWORK = 'ServiceNetwork',
/**
* A Resource VPC endpoint in AWS is specifically designed to connect to AWS Resource Access Manager (RAM) service
* privately within your VPC, without requiring access through the public internet.
*/
RESOURCE = 'Resource',
}
/**
* IP address type for the endpoint.
*/
export enum VpcEndpointIpAddressType {
/**
* Assign IPv4 addresses to the endpoint network interfaces.
* This option is supported only if all selected subnets have IPv4 address ranges
* and the endpoint service accepts IPv4 requests.
*/
IPV4 = 'ipv4',
/**
* Assign IPv6 addresses to the endpoint network interfaces.
* This option is supported only if all selected subnets are IPv6 only subnets
* and the endpoint service accepts IPv6 requests.
*/
IPV6 = 'ipv6',
/**
* Assign both IPv4 and IPv6 addresses to the endpoint network interfaces.
* This option is supported only if all selected subnets have both IPv4 and IPv6
* address ranges and the endpoint service accepts both IPv4 and IPv6 requests.
*/
DUALSTACK = 'dualstack',
}
/**
* Enums for all Dns Record IP Address types.
*/
export enum VpcEndpointDnsRecordIpType {
/**
* Create A records for the private, Regional, and zonal DNS names.
* The IP address type must be IPv4 or Dualstack.
*/
IPV4 = 'ipv4',
/**
* Create AAAA records for the private, Regional, and zonal DNS names.
* The IP address type must be IPv6 or Dualstack.
*/
IPV6 = 'ipv6',
/**
* Create A and AAAA records for the private, Regional, and zonal DNS names.
* The IP address type must be Dualstack.
*/
DUALSTACK = 'dualstack',
/**
* Create A records for the private, Regional, and zonal DNS names and
* AAAA records for the Regional and zonal DNS names.
* The IP address type must be Dualstack.
*/
SERVICE_DEFINED = 'service-defined',
}
/**
* Indicates whether to enable private DNS only for inbound endpoints.
* This option is available only for services that support both gateway and interface endpoints.
* It routes traffic that originates from the VPC to the gateway endpoint and traffic that
* originates from on-premises to the interface endpoint.
*/
export enum VpcEndpointPrivateDnsOnlyForInboundResolverEndpoint {
/**
* Enable private DNS for all resolvers.
*/
ALL_RESOLVERS = 'AllResolvers',
/**
* Enable private DNS only for inbound endpoints.
*/
ONLY_INBOUND_RESOLVER = 'OnlyInboundResolver',
}
/**
* A service for a gateway VPC endpoint.
*/
export interface IGatewayVpcEndpointService {
/**
* The name of the service.
*/
readonly name: string;
}
/**
* An AWS service for a gateway VPC endpoint.
*/
export class GatewayVpcEndpointAwsService implements IGatewayVpcEndpointService {
public static readonly DYNAMODB = new GatewayVpcEndpointAwsService('dynamodb');
public static readonly S3 = new GatewayVpcEndpointAwsService('s3');
public static readonly S3_EXPRESS = new GatewayVpcEndpointAwsService('s3express');
/**
* The name of the service.
*/
public readonly name: string;
constructor(name: string, prefix?: string) {
this.name = `${prefix || 'com.amazonaws'}.${Aws.REGION}.${name}`;
}
}
/**
* Options to add a gateway endpoint to a VPC.
*/
export interface GatewayVpcEndpointOptions {
/**
* The service to use for this gateway VPC endpoint.
*/
readonly service: IGatewayVpcEndpointService;
/**
* Where to add endpoint routing.
*
* By default, this endpoint will be routable from all subnets in the VPC.
* Specify a list of subnet selection objects here to be more specific.
*
* @default - All subnets in the VPC
* @example
*
* declare const vpc: ec2.Vpc;
*
* vpc.addGatewayEndpoint('DynamoDbEndpoint', {
* service: ec2.GatewayVpcEndpointAwsService.DYNAMODB,
* // Add only to ISOLATED subnets
* subnets: [
* { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }
* ]
* });
*
*
*/
readonly subnets?: SubnetSelection[];
}
/**
* Construction properties for a GatewayVpcEndpoint.
*/
export interface GatewayVpcEndpointProps extends GatewayVpcEndpointOptions {
/**
* The VPC network in which the gateway endpoint will be used.
*/
readonly vpc: IVpc;
}
/**
* A gateway VPC endpoint.
* @resource AWS::EC2::VPCEndpoint
*/
export class GatewayVpcEndpoint extends VpcEndpoint implements IGatewayVpcEndpoint {
public static fromGatewayVpcEndpointId(scope: Construct, id: string, gatewayVpcEndpointId: string): IGatewayVpcEndpoint {
class Import extends VpcEndpoint {
public vpcEndpointId = gatewayVpcEndpointId;
}
return new Import(scope, id);
}
/**
* The gateway VPC endpoint identifier.
*/
public readonly vpcEndpointId: string;
/**
* The date and time the gateway VPC endpoint was created.
* @attribute
*/
public readonly vpcEndpointCreationTimestamp: string;
/**
* @attribute
*/
public readonly vpcEndpointNetworkInterfaceIds: string[];
/**
* @attribute
*/
public readonly vpcEndpointDnsEntries: string[];
constructor(scope: Construct, id: string, props: GatewayVpcEndpointProps) {
super(scope, id);
// Enhanced CDK Analytics Telemetry
addConstructMetadata(this, props);
const subnets: ISubnet[] = props.subnets
? flatten(props.subnets.map(s => props.vpc.selectSubnets(s).subnets))
: [...props.vpc.privateSubnets, ...props.vpc.publicSubnets, ...props.vpc.isolatedSubnets];
const routeTableIds = allRouteTableIds(subnets);
if (routeTableIds.length === 0) {
throw new ValidationError('Can\'t add a gateway endpoint to VPC; route table IDs are not available', this);
}
const endpoint = new CfnVPCEndpoint(this, 'Resource', {
policyDocument: Lazy.any({ produce: () => this.policyDocument }),
routeTableIds,
serviceName: props.service.name,
vpcEndpointType: VpcEndpointType.GATEWAY,
vpcId: props.vpc.vpcId,
});
this.vpcEndpointId = endpoint.ref;
this.vpcEndpointCreationTimestamp = endpoint.attrCreationTimestamp;
this.vpcEndpointDnsEntries = endpoint.attrDnsEntries;
this.vpcEndpointNetworkInterfaceIds = endpoint.attrNetworkInterfaceIds;
}
}
/**
* A service for an interface VPC endpoint.
*/
export interface IInterfaceVpcEndpointService {
/**
* The name of the service.
*/
readonly name: string;
/**
* The port of the service.
*/
readonly port: number;
/**
* Whether Private DNS is supported by default.
*/
readonly privateDnsDefault?: boolean;
}
/**
* A custom-hosted service for an interface VPC endpoint.
*/
export class InterfaceVpcEndpointService implements IInterfaceVpcEndpointService {
/**
* The name of the service.
*/
public readonly name: string;
/**
* The port of the service.
*/
public readonly port: number;
/**
* Whether Private DNS is supported by default.
*/
public readonly privateDnsDefault?: boolean = false;
constructor(name: string, port?: number) {
this.name = name;
this.port = port || 443;
}
}
/**
* Optional properties for the InterfaceVpcEndpointAwsService class
*/
export interface InterfaceVpcEndpointAwsServiceProps {
/**
* If true, the service is a global endpoint and
* its name will not be prefixed with the stack's region.
*
* @default false
*/
readonly global?: boolean;
}
/**
* An AWS service for an interface VPC endpoint.
*/
export class InterfaceVpcEndpointAwsService implements IInterfaceVpcEndpointService {
public static readonly ACCESS_ANALYZER = new InterfaceVpcEndpointAwsService('access-analyzer');
public static readonly ACCOUNT_MANAGEMENT = new InterfaceVpcEndpointAwsService('account');
public static readonly AIRFLOW_API = new InterfaceVpcEndpointAwsService('airflow.api');
public static readonly AIRFLOW_API_FIPS = new InterfaceVpcEndpointAwsService('airflow.api-fips');
public static readonly AIRFLOW_ENV = new InterfaceVpcEndpointAwsService('airflow.env');
public static readonly AIRFLOW_ENV_FIPS = new InterfaceVpcEndpointAwsService('airflow.env-fips');
public static readonly AIRFLOW_OPS = new InterfaceVpcEndpointAwsService('airflow.ops');
public static readonly APIGATEWAY = new InterfaceVpcEndpointAwsService('execute-api');
/** @deprecated - Use InterfaceVpcEndpointAwsService.APP_MESH_ENVOY_MANAGEMENT instead. */
public static readonly APP_MESH = new InterfaceVpcEndpointAwsService('appmesh-envoy-management');
public static readonly APP_MESH_ENVOY_MANAGEMENT = new InterfaceVpcEndpointAwsService('appmesh-envoy-management');
public static readonly APP_MESH_OPS = new InterfaceVpcEndpointAwsService('appmesh');
public static readonly APP_RUNNER = new InterfaceVpcEndpointAwsService('apprunner');
public static readonly APP_RUNNER_REQUESTS = new InterfaceVpcEndpointAwsService('apprunner.requests');
public static readonly APP_SYNC = new InterfaceVpcEndpointAwsService('appsync-api');
public static readonly APPCONFIG = new InterfaceVpcEndpointAwsService('appconfig');
public static readonly APPCONFIGDATA = new InterfaceVpcEndpointAwsService('appconfigdata');
public static readonly APPLICATION_AUTOSCALING = new InterfaceVpcEndpointAwsService('application-autoscaling');
public static readonly APPLICATION_DISCOVERY_ARSENAL = new InterfaceVpcEndpointAwsService('arsenal-discovery');
public static readonly APPLICATION_DISCOVERY_SERVICE = new InterfaceVpcEndpointAwsService('discovery');
public static readonly APPLICATION_MIGRATION_SERVICE = new InterfaceVpcEndpointAwsService('mgn');
public static readonly APPSTREAM_API = new InterfaceVpcEndpointAwsService('appstream.api');
public static readonly APPSTREAM_STREAMING = new InterfaceVpcEndpointAwsService('appstream.streaming');
public static readonly ATHENA = new InterfaceVpcEndpointAwsService('athena');
public static readonly AUDIT_MANAGER = new InterfaceVpcEndpointAwsService('auditmanager');
public static readonly AUTOSCALING = new InterfaceVpcEndpointAwsService('autoscaling');
public static readonly AUTOSCALING_PLANS = new InterfaceVpcEndpointAwsService('autoscaling-plans');
public static readonly B2B_DATA_INTERCHANGE = new InterfaceVpcEndpointAwsService('b2bi');
public static readonly BACKUP = new InterfaceVpcEndpointAwsService('backup');
public static readonly BACKUP_GATEWAY = new InterfaceVpcEndpointAwsService('backup-gateway');
public static readonly BATCH = new InterfaceVpcEndpointAwsService('batch');
public static readonly BEDROCK = new InterfaceVpcEndpointAwsService('bedrock');
public static readonly BEDROCK_AGENT = new InterfaceVpcEndpointAwsService('bedrock-agent');
public static readonly BEDROCK_AGENT_RUNTIME = new InterfaceVpcEndpointAwsService('bedrock-agent-runtime');
public static readonly BEDROCK_RUNTIME = new InterfaceVpcEndpointAwsService('bedrock-runtime');
public static readonly BEDROCK_DATA_AUTOMATION = new InterfaceVpcEndpointAwsService('bedrock-data-automation');
public static readonly BEDROCK_DATA_AUTOMATION_FIPS = new InterfaceVpcEndpointAwsService('bedrock-data-automation-fips');
public static readonly BEDROCK_DATA_AUTOMATION_RUNTIME = new InterfaceVpcEndpointAwsService('bedrock-data-automation-runtime');
public static readonly BEDROCK_DATA_AUTOMATION_RUNTIME_FIPS = new InterfaceVpcEndpointAwsService('bedrock-data-automation-runtime-fips');
public static readonly BILLING = new InterfaceVpcEndpointAwsService('billing');
public static readonly BILLING_AND_COST_MANAGEMENT_FREETIER = new InterfaceVpcEndpointAwsService('freetier', 'aws.api');
public static readonly BILLING_AND_COST_MANAGEMENT_TAX = new InterfaceVpcEndpointAwsService('tax');
public static readonly BILLING_CONDUCTOR = new InterfaceVpcEndpointAwsService('billingconductor');
public static readonly BRAKET = new InterfaceVpcEndpointAwsService('braket');
public static readonly CLEAN_ROOMS = new InterfaceVpcEndpointAwsService('cleanrooms');
public static readonly CLEAN_ROOMS_ML = new InterfaceVpcEndpointAwsService('cleanrooms-ml');
public static readonly CLOUD_CONTROL_API = new InterfaceVpcEndpointAwsService('cloudcontrolapi');
public static readonly CLOUD_CONTROL_API_FIPS = new InterfaceVpcEndpointAwsService('cloudcontrolapi-fips');
public static readonly CLOUD_DIRECTORY = new InterfaceVpcEndpointAwsService('clouddirectory');
public static readonly CLOUD_MAP_DATA_SERVICE_DISCOVERY = new InterfaceVpcEndpointAwsService('data-servicediscovery');
public static readonly CLOUD_MAP_DATA_SERVICE_DISCOVERY_FIPS = new InterfaceVpcEndpointAwsService('data-servicediscovery-fips');
public static readonly CLOUD_MAP_SERVICE_DISCOVERY = new InterfaceVpcEndpointAwsService('servicediscovery');
public static readonly CLOUD_MAP_SERVICE_DISCOVERY_FIPS = new InterfaceVpcEndpointAwsService('servicediscovery-fips');
public static readonly CLOUDFORMATION = new InterfaceVpcEndpointAwsService('cloudformation');
public static readonly CLOUDHSM = new InterfaceVpcEndpointAwsService('cloudhsmv2');
public static readonly CLOUDTRAIL = new InterfaceVpcEndpointAwsService('cloudtrail');
/** @deprecated Use InterfaceVpcEndpointAwsService.Q_DEVELOPER_CODE_WHISPERER instead.*/
public static readonly CODEWHISPERER = new InterfaceVpcEndpointAwsService('codewhisperer');
/** @deprecated - Use InterfaceVpcEndpointAwsService.CLOUDWATCH_MONITORING instead. */
public static readonly CLOUDWATCH = new InterfaceVpcEndpointAwsService('monitoring');
public static readonly CLOUDWATCH_APPLICATION_INSIGHTS = new InterfaceVpcEndpointAwsService('applicationinsights');
public static readonly CLOUDWATCH_APPLICATION_SIGNALS = new InterfaceVpcEndpointAwsService('application-signals');
/** @deprecated - Use InterfaceVpcEndpointAwsService.EVENTBRIDGE instead. */
public static readonly CLOUDWATCH_EVENTS = new InterfaceVpcEndpointAwsService('events');
public static readonly CLOUDWATCH_EVIDENTLY = new InterfaceVpcEndpointAwsService('evidently');
public static readonly CLOUDWATCH_EVIDENTLY_DATAPLANE = new InterfaceVpcEndpointAwsService('evidently-dataplane');
public static readonly CLOUDWATCH_LOGS = new InterfaceVpcEndpointAwsService('logs');
public static readonly CLOUDWATCH_MONITORING = new InterfaceVpcEndpointAwsService('monitoring');
public static readonly CLOUDWATCH_NETWORK_MONITOR = new InterfaceVpcEndpointAwsService('networkmonitor');
public static readonly CLOUDWATCH_RUM = new InterfaceVpcEndpointAwsService('rum');
public static readonly CLOUDWATCH_RUM_DATAPLANE = new InterfaceVpcEndpointAwsService('rum-dataplane');
public static readonly CLOUDWATCH_SYNTHETICS = new InterfaceVpcEndpointAwsService('synthetics');
public static readonly CLOUDWATCH_SYNTHETICS_FIPS = new InterfaceVpcEndpointAwsService('synthetics-fips');
public static readonly CODEARTIFACT_API = new InterfaceVpcEndpointAwsService('codeartifact.api');
public static readonly CODEARTIFACT_REPOSITORIES = new InterfaceVpcEndpointAwsService('codeartifact.repositories');
public static readonly CODEBUILD = new InterfaceVpcEndpointAwsService('codebuild');
public static readonly CODEBUILD_FIPS = new InterfaceVpcEndpointAwsService('codebuild-fips');
public static readonly CODECATALYST = new InterfaceVpcEndpointAwsService('codecatalyst', 'aws.api.global', undefined, { global: true });
public static readonly CODECATALYST_GIT = new InterfaceVpcEndpointAwsService('codecatalyst.git');
public static readonly CODECATALYST_PACKAGES = new InterfaceVpcEndpointAwsService('codecatalyst.packages');
public static readonly CODECOMMIT = new InterfaceVpcEndpointAwsService('codecommit');
public static readonly CODECOMMIT_FIPS = new InterfaceVpcEndpointAwsService('codecommit-fips');
public static readonly CODEDEPLOY = new InterfaceVpcEndpointAwsService('codedeploy');
public static readonly CODEDEPLOY_COMMANDS_SECURE = new InterfaceVpcEndpointAwsService('codedeploy-commands-secure');
public static readonly CODEGURU_PROFILER = new InterfaceVpcEndpointAwsService('codeguru-profiler');
public static readonly CODEGURU_REVIEWER = new InterfaceVpcEndpointAwsService('codeguru-reviewer');
public static readonly CODEPIPELINE = new InterfaceVpcEndpointAwsService('codepipeline');
public static readonly CODESTAR_CONNECTIONS = new InterfaceVpcEndpointAwsService('codestar-connections.api');
public static readonly CODE_CONNECTIONS = new InterfaceVpcEndpointAwsService('codeconnections.api');
public static readonly COMPREHEND = new InterfaceVpcEndpointAwsService('comprehend');
public static readonly COMPREHEND_MEDICAL = new InterfaceVpcEndpointAwsService('comprehendmedical');
public static readonly COMPUTE_OPTIMIZER = new InterfaceVpcEndpointAwsService('compute-optimizer');
public static readonly CONFIG = new InterfaceVpcEndpointAwsService('config');
public static readonly CONNECT_APP_INTEGRATIONS = new InterfaceVpcEndpointAwsService('app-integrations');
public static readonly CONNECT_CASES = new InterfaceVpcEndpointAwsService('cases');
public static readonly CONNECT_CONNECT_CAMPAIGNS = new InterfaceVpcEndpointAwsService('connect-campaigns');
public static readonly CONNECT_PROFILE = new InterfaceVpcEndpointAwsService('profile');
public static readonly CONNECT_VOICEID = new InterfaceVpcEndpointAwsService('voiceid');
public static readonly CONNECT_WISDOM = new InterfaceVpcEndpointAwsService('wisdom');
public static readonly CONTROL_CATALOG = new InterfaceVpcEndpointAwsService('controlcatalog');
public static readonly COST_EXPLORER = new InterfaceVpcEndpointAwsService('ce');
public static readonly COST_OPTIMIZATION_HUB = new InterfaceVpcEndpointAwsService('cost-optimization-hub');
public static readonly DATA_EXCHANGE = new InterfaceVpcEndpointAwsService('dataexchange');
public static readonly DATA_EXPORTS = new InterfaceVpcEndpointAwsService('bcm-data-exports', 'aws.api');
public static readonly DATASYNC = new InterfaceVpcEndpointAwsService('datasync');
public static readonly DATAZONE = new InterfaceVpcEndpointAwsService('datazone');
public static readonly DATABASE_MIGRATION_SERVICE = new InterfaceVpcEndpointAwsService('dms');
public static readonly DATABASE_MIGRATION_SERVICE_FIPS = new InterfaceVpcEndpointAwsService('dms-fips');
public static readonly DEADLINE_CLOUD_MANAGEMENT = new InterfaceVpcEndpointAwsService('deadline.management');
public static readonly DEADLINE_CLOUD_SCHEDULING = new InterfaceVpcEndpointAwsService('deadline.scheduling');
public static readonly DEVOPS_GURU = new InterfaceVpcEndpointAwsService('devops-guru');
public static readonly DIRECTORY_SERVICE = new InterfaceVpcEndpointAwsService('ds');
public static readonly DIRECTORY_SERVICE_DATA = new InterfaceVpcEndpointAwsService('ds-data');
public static readonly DYNAMODB = new InterfaceVpcEndpointAwsService('dynamodb');
public static readonly DYNAMODB_FIPS = new InterfaceVpcEndpointAwsService('dynamodb-fips');
public static readonly EBS_DIRECT = new InterfaceVpcEndpointAwsService('ebs');
public static readonly EC2 = new InterfaceVpcEndpointAwsService('ec2');
public static readonly EC2_MESSAGES = new InterfaceVpcEndpointAwsService('ec2messages');
public static readonly ECR = new InterfaceVpcEndpointAwsService('ecr.api');
public static readonly ECR_DOCKER = new InterfaceVpcEndpointAwsService('ecr.dkr');
public static readonly ECS = new InterfaceVpcEndpointAwsService('ecs');
public static readonly ECS_AGENT = new InterfaceVpcEndpointAwsService('ecs-agent');
public static readonly ECS_TELEMETRY = new InterfaceVpcEndpointAwsService('ecs-telemetry');
public static readonly EKS = new InterfaceVpcEndpointAwsService('eks');
public static readonly EKS_AUTH = new InterfaceVpcEndpointAwsService('eks-auth');
public static readonly ELASTIC_BEANSTALK = new InterfaceVpcEndpointAwsService('elasticbeanstalk');
public static readonly ELASTIC_BEANSTALK_HEALTH = new InterfaceVpcEndpointAwsService('elasticbeanstalk-health');
public static readonly ELASTIC_DISASTER_RECOVERY = new InterfaceVpcEndpointAwsService('drs');
public static readonly ELASTIC_FILESYSTEM = new InterfaceVpcEndpointAwsService('elasticfilesystem');
public static readonly ELASTIC_FILESYSTEM_FIPS = new InterfaceVpcEndpointAwsService('elasticfilesystem-fips');
public static readonly ELASTIC_INFERENCE_RUNTIME = new InterfaceVpcEndpointAwsService('elastic-inference.runtime');
public static readonly ELASTIC_LOAD_BALANCING = new InterfaceVpcEndpointAwsService('elasticloadbalancing');
public static readonly ELASTICACHE = new InterfaceVpcEndpointAwsService('elasticache');
public static readonly ELASTICACHE_FIPS = new InterfaceVpcEndpointAwsService('elasticache-fips');
public static readonly ELEMENTAL_MEDIACONNECT = new InterfaceVpcEndpointAwsService('mediaconnect');
public static readonly EMAIL_SMTP = new InterfaceVpcEndpointAwsService('email-smtp');
public static readonly EMR = new InterfaceVpcEndpointAwsService('elasticmapreduce');
public static readonly EMR_EKS = new InterfaceVpcEndpointAwsService('emr-containers');
public static readonly EMR_SERVERLESS = new InterfaceVpcEndpointAwsService('emr-serverless');
public static readonly EMR_SERVERLESS_LIVY = new InterfaceVpcEndpointAwsService('emr-serverless-services.livy');
public static readonly EMR_SERVERLESS_DASHBOARD = new InterfaceVpcEndpointAwsService('emr-serverless.dashboard');
public static readonly EMR_WAL = new InterfaceVpcEndpointAwsService('emrwal.prod');
public static readonly END_USER_MESSAGING_SOCIAL = new InterfaceVpcEndpointAwsService('social-messaging');
public static readonly ENTITY_RESOLUTION = new InterfaceVpcEndpointAwsService('entityresolution');
public static readonly EVENTBRIDGE = new InterfaceVpcEndpointAwsService('events');
public static readonly EVENTBRIDGE_SCHEMA_REGISTRY = new InterfaceVpcEndpointAwsService('schemas');
public static readonly FAULT_INJECTION_SIMULATOR = new InterfaceVpcEndpointAwsService('fis');
public static readonly FINSPACE = new InterfaceVpcEndpointAwsService('finspace');
public static readonly FINSPACE_API = new InterfaceVpcEndpointAwsService('finspace-api');
public static readonly FORECAST = new InterfaceVpcEndpointAwsService('forecast');
public static readonly FORECAST_QUERY = new InterfaceVpcEndpointAwsService('forecastquery');
public static readonly FORECAST_FIPS = new InterfaceVpcEndpointAwsService('forecast-fips');
public static readonly FORECAST_QUERY_FIPS = new InterfaceVpcEndpointAwsService('forecastquery-fips');
public static readonly FRAUD_DETECTOR = new InterfaceVpcEndpointAwsService('frauddetector');
public static readonly FSX = new InterfaceVpcEndpointAwsService('fsx');
public static readonly FSX_FIPS = new InterfaceVpcEndpointAwsService('fsx-fips');
public static readonly CODECOMMIT_GIT = new InterfaceVpcEndpointAwsService('git-codecommit');
public static readonly CODECOMMIT_GIT_FIPS = new InterfaceVpcEndpointAwsService('git-codecommit-fips');
public static readonly GLUE = new InterfaceVpcEndpointAwsService('glue');
public static readonly GLUE_DATABREW = new InterfaceVpcEndpointAwsService('databrew');
public static readonly GLUE_DASHBOARD = new InterfaceVpcEndpointAwsService('glue.dashboard');
public static readonly GRAFANA = new InterfaceVpcEndpointAwsService('grafana');
public static readonly GRAFANA_WORKSPACE = new InterfaceVpcEndpointAwsService('grafana-workspace');
public static readonly GROUNDSTATION = new InterfaceVpcEndpointAwsService('groundstation');
public static readonly GUARDDUTY = new InterfaceVpcEndpointAwsService('guardduty');
public static readonly GUARDDUTY_FIPS = new InterfaceVpcEndpointAwsService('guardduty-fips');
public static readonly GUARDDUTY_DATA = new InterfaceVpcEndpointAwsService('guardduty-data');
public static readonly GUARDDUTY_DATA_FIPS = new InterfaceVpcEndpointAwsService('guardduty-data-fips');
public static readonly HEALTH_IMAGING = new InterfaceVpcEndpointAwsService('medical-imaging');
public static readonly HEALTH_IMAGING_RUNTIME = new InterfaceVpcEndpointAwsService('runtime-medical-imaging');
public static readonly HEALTH_IMAGING_DICOM = new InterfaceVpcEndpointAwsService('dicom-medical-imaging');
public static readonly HEALTHLAKE = new InterfaceVpcEndpointAwsService('healthlake');
public static readonly IAM = new InterfaceVpcEndpointAwsService('iam', 'com.amazonaws', undefined, { global: true });
public static readonly IAM_IDENTITY_CENTER = new InterfaceVpcEndpointAwsService('identitystore');
public static readonly IAM_ROLES_ANYWHERE = new InterfaceVpcEndpointAwsService('rolesanywhere');
public static readonly IMAGE_BUILDER = new InterfaceVpcEndpointAwsService('imagebuilder');
public static readonly INSPECTOR = new InterfaceVpcEndpointAwsService('inspector2');
public static readonly INSPECTOR_SCAN = new InterfaceVpcEndpointAwsService('inspector-scan');
public static readonly INTERNET_MONITOR = new InterfaceVpcEndpointAwsService('internetmonitor');
public static readonly INTERNET_MONITOR_FIPS = new InterfaceVpcEndpointAwsService('internetmonitor-fips');
public static readonly INVOICING = new InterfaceVpcEndpointAwsService('invoicing');
public static readonly IOT_CORE = new InterfaceVpcEndpointAwsService('iot.data');
public static readonly IOT_CORE_CREDENTIALS = new InterfaceVpcEndpointAwsService('iot.credentials');
public static readonly IOT_CORE_DEVICE_ADVISOR = new InterfaceVpcEndpointAwsService('deviceadvisor.iot');
public static readonly IOT_CORE_FLEETHUB_API = new InterfaceVpcEndpointAwsService('iot.fleethub.api');
public static readonly IOT_CORE_FOR_LORAWAN = new InterfaceVpcEndpointAwsService('iotwireless.api');
public static readonly IOT_FLEETWISE = new InterfaceVpcEndpointAwsService('iotfleetwise');
public static readonly IOT_LORAWAN_CUPS = new InterfaceVpcEndpointAwsService('lorawan.cups');
public static readonly IOT_LORAWAN_LNS = new InterfaceVpcEndpointAwsService('lorawan.lns');
public static readonly IOT_GREENGRASS = new InterfaceVpcEndpointAwsService('greengrass');
public static readonly IOT_ROBORUNNER = new InterfaceVpcEndpointAwsService('iotroborunner');
public static readonly IOT_SITEWISE_API = new InterfaceVpcEndpointAwsService('iotsitewise.api');
public static readonly IOT_SITEWISE_DATA = new InterfaceVpcEndpointAwsService('iotsitewise.data');
public static readonly IOT_TWINMAKER_API = new InterfaceVpcEndpointAwsService('iottwinmaker.api');
public static readonly IOT_TWINMAKER_DATA = new InterfaceVpcEndpointAwsService('iottwinmaker.data');
public static readonly KAFKA = new InterfaceVpcEndpointAwsService('kafka');
public static readonly KAFKA_CONNECT = new InterfaceVpcEndpointAwsService('kafkaconnect');
public static readonly KAFKA_FIPS = new InterfaceVpcEndpointAwsService('kafka-fips');
public static readonly KENDRA = new InterfaceVpcEndpointAwsService('kendra');
public static readonly KENDRA_RANKING = new InterfaceVpcEndpointAwsService('kendra-ranking', 'aws.api');
public static readonly KEYSPACES = new InterfaceVpcEndpointAwsService('cassandra', '', 9142);
public static readonly KEYSPACES_FIPS = new InterfaceVpcEndpointAwsService('cassandra-fips', '', 9142);
public static readonly KINESIS_STREAMS = new InterfaceVpcEndpointAwsService('kinesis-streams');
public static readonly KINESIS_STREAMS_FIPS = new InterfaceVpcEndpointAwsService('kinesis-streams-fips');
public static readonly KINESIS_FIREHOSE = new InterfaceVpcEndpointAwsService('kinesis-firehose');
public static readonly KMS = new InterfaceVpcEndpointAwsService('kms');
public static readonly KMS_FIPS = new InterfaceVpcEndpointAwsService('kms-fips');
public static readonly LAKE_FORMATION = new InterfaceVpcEndpointAwsService('lakeformation');
public static readonly LAUNCH_WIZARD = new InterfaceVpcEndpointAwsService('launchwizard');
public static readonly LAMBDA = new InterfaceVpcEndpointAwsService('lambda');
public static readonly LEX_MODELS = new InterfaceVpcEndpointAwsService('models-v2-lex');
public static readonly LEX_RUNTIME = new InterfaceVpcEndpointAwsService('runtime-v2-lex');
public static readonly LICENSE_MANAGER = new InterfaceVpcEndpointAwsService('license-manager');
public static readonly LICENSE_MANAGER_FIPS = new InterfaceVpcEndpointAwsService('license-manager-fips');
public static readonly LICENSE_MANAGER_LINUX_SUBSCRIPTIONS = new InterfaceVpcEndpointAwsService('license-manager-linux-subscriptions');
public static readonly LICENSE_MANAGER_LINUX_SUBSCRIPTIONS_FIPS = new InterfaceVpcEndpointAwsService('license-manager-linux-subscriptions-fips');
public static readonly LICENSE_MANAGER_USER_SUBSCRIPTIONS = new InterfaceVpcEndpointAwsService('license-manager-user-subscriptions');
public static readonly LOCATION_SERVICE_GEOFENCING = new InterfaceVpcEndpointAwsService('geo.geofencing');
public static readonly LOCATION_SERVICE_MAPS = new InterfaceVpcEndpointAwsService('geo.maps');
public static readonly LOCATION_SERVICE_METADATA = new InterfaceVpcEndpointAwsService('geo.metadata');
public static readonly LOCATION_SERVICE_PLACES = new InterfaceVpcEndpointAwsService('geo.places');
public static readonly LOCATION_SERVICE_ROUTE = new InterfaceVpcEndpointAwsService('geo.routes');
public static readonly LOCATION_SERVICE_TRACKING = new InterfaceVpcEndpointAwsService('geo.tracking');
public static readonly LOOKOUT_EQUIPMENT = new InterfaceVpcEndpointAwsService('lookoutequipment');
public static readonly LOOKOUT_METRICS = new InterfaceVpcEndpointAwsService('lookoutmetrics');
public static readonly LOOKOUT_VISION = new InterfaceVpcEndpointAwsService('lookoutvision');
public static readonly MAILMANAGER = new InterfaceVpcEndpointAwsService('mail-manager');
public static readonly MAILMANAGER_FIPS = new InterfaceVpcEndpointAwsService('mail-manager-fips');
public static readonly MAINFRAME_MODERNIZATION = new InterfaceVpcEndpointAwsService('m2');
public static readonly MAINFRAME_MODERNIZATION_APP_TEST = new InterfaceVpcEndpointAwsService('apptest');
public static readonly MACIE = new InterfaceVpcEndpointAwsService('macie2');
public static readonly MANAGEMENT_CONSOLE = new InterfaceVpcEndpointAwsService('console');
public static readonly MANAGEMENT_CONSOLE_SIGNIN = new InterfaceVpcEndpointAwsService('signin');
public static readonly MANAGED_BLOCKCHAIN_QUERY = new InterfaceVpcEndpointAwsService('managedblockchain-query');
public static readonly MANAGED_BLOCKCHAIN_BITCOIN_MAINNET = new InterfaceVpcEndpointAwsService('managedblockchain.bitcoin.mainnet');
public static readonly MANAGED_BLOCKCHAIN_BITCOIN_TESTNET = new InterfaceVpcEndpointAwsService('managedblockchain.bitcoin.testnet');
public static readonly MEMORY_DB = new InterfaceVpcEndpointAwsService('memory-db');
public static readonly MEMORY_DB_FIPS = new InterfaceVpcEndpointAwsService('memorydb-fips');
public static readonly MIGRATIONHUB_ORCHESTRATOR = new InterfaceVpcEndpointAwsService('migrationhub-orchestrator');
public static readonly MIGRATIONHUB_REFACTOR_SPACES = new InterfaceVpcEndpointAwsService('refactor-spaces');
public static readonly MIGRATIONHUB_STRATEGY = new InterfaceVpcEndpointAwsService('migrationhub-strategy');
public static readonly MQ = new InterfaceVpcEndpointAwsService('mq');
public static readonly NEPTUNE_ANALYTICS = new InterfaceVpcEndpointAwsService('neptune-graph');
public static readonly NEPTUNE_ANALYTICS_DATA = new InterfaceVpcEndpointAwsService('neptune-graph-data');
public static readonly NEPTUNE_ANALYTICS_FIPS = new InterfaceVpcEndpointAwsService('neptune-graph-fips');
public static readonly NETWORK_FIREWALL = new InterfaceVpcEndpointAwsService('network-firewall');
public static readonly NETWORK_FIREWALL_FIPS = new InterfaceVpcEndpointAwsService('network-firewall-fips');
public static readonly NETWORK_FLOW_MONITOR = new InterfaceVpcEndpointAwsService('networkflowmonitor');
public static readonly NETWORK_FLOW_MONITOR_REPORTS = new InterfaceVpcEndpointAwsService('networkflowmonitorreports');
public static readonly NIMBLE_STUDIO = new InterfaceVpcEndpointAwsService('nimble');
public static readonly OBSERVABILITY_ADMIN = new InterfaceVpcEndpointAwsService('observabilityadmin');
public static readonly OUTPOSTS = new InterfaceVpcEndpointAwsService('outposts');
public static readonly ORGANIZATIONS = new InterfaceVpcEndpointAwsService('organizations');
public static readonly ORGANIZATIONS_FIPS = new InterfaceVpcEndpointAwsService('organizations-fips');
public static readonly OMICS_ANALYTICS = new InterfaceVpcEndpointAwsService('analytics-omics');
public static readonly OMICS_CONTROL_STORAGE = new InterfaceVpcEndpointAwsService('control-storage-omics');
public static readonly OMICS_STORAGE = new InterfaceVpcEndpointAwsService('storage-omics');
public static readonly OMICS_TAGS = new InterfaceVpcEndpointAwsService('tags-omics');
public static readonly OMICS_WORKFLOWS = new InterfaceVpcEndpointAwsService('workflows-omics');
public static readonly PANORAMA = new InterfaceVpcEndpointAwsService('panorama');
public static readonly PARALLEL_COMPUTING_SERVICE = new InterfaceVpcEndpointAwsService('pcs');
public static readonly PARALLEL_COMPUTING_SERVICE_FIPS = new InterfaceVpcEndpointAwsService('pcs-fips');
public static readonly PAYMENT_CRYPTOGRAPHY_CONTROLPLANE = new InterfaceVpcEndpointAwsService('payment-cryptography.controlplane');
/** @deprecated - Use InterfaceVpcEndpointAwsService.PAYMENT_CRYPTOGRAPHY_DATAPLANE instead. */
public static readonly PAYMENT_CRYTOGRAPHY_DATAPLANE = new InterfaceVpcEndpointAwsService('payment-cryptography.dataplane');
public static readonly PAYMENT_CRYPTOGRAPHY_DATAPLANE = new InterfaceVpcEndpointAwsService('payment-cryptography.dataplane');
public static readonly PERSONALIZE = new InterfaceVpcEndpointAwsService('personalize');
public static readonly PERSONALIZE_EVENTS = new InterfaceVpcEndpointAwsService('personalize-events');
public static readonly PERSONALIZE_RUNTIME = new InterfaceVpcEndpointAwsService('personalize-runtime');
public static readonly PINPOINT_V1 = new InterfaceVpcEndpointAwsService('pinpoint');
/** @deprecated - Use InterfaceVpcEndpointAwsService.PINPOINT_SMS_VOICE_V2 instead. */
public static readonly PINPOINT = new InterfaceVpcEndpointAwsService('pinpoint-sms-voice-v2');
public static readonly PINPOINT_SMS_VOICE_V2 = new InterfaceVpcEndpointAwsService('pinpoint-sms-voice-v2');
public static readonly PIPES = new InterfaceVpcEndpointAwsService('pipes');
public static readonly PIPES_DATA = new InterfaceVpcEndpointAwsService('pipes-data');
public static readonly PIPES_FIPS = new InterfaceVpcEndpointAwsService('pipes-fips');
public static readonly PRICE_LIST = new InterfaceVpcEndpointAwsService('pricing.api');
public static readonly PRICING_CALCULATOR = new InterfaceVpcEndpointAwsService('bcm-pricing-calculator');
public static readonly POLLY = new InterfaceVpcEndpointAwsService('polly');
public static readonly PRIVATE_5G = new InterfaceVpcEndpointAwsService('private-networks');
public static readonly PRIVATE_CERTIFICATE_AUTHORITY = new InterfaceVpcEndpointAwsService('acm-pca');
public static readonly PRIVATE_CERTIFICATE_AUTHORITY_CONNECTOR_AD = new InterfaceVpcEndpointAwsService('pca-connector-ad');
public static readonly PRIVATE_CERTIFICATE_AUTHORITY_CONNECTOR_SCEP = new InterfaceVpcEndpointAwsService('pca-connector-scep');
public static readonly PROMETHEUS = new InterfaceVpcEndpointAwsService('aps');
public static readonly PROMETHEUS_WORKSPACES = new InterfaceVpcEndpointAwsService('aps-workspaces');
public static readonly PROTON = new InterfaceVpcEndpointAwsService('proton');
public static readonly Q_BUSSINESS = new InterfaceVpcEndpointAwsService('qbusiness', 'aws.api');
public static readonly Q_DEVELOPER = new InterfaceVpcEndpointAwsService('q');
public static readonly Q_DEVELOPER_CODE_WHISPERER = new InterfaceVpcEndpointAwsService('codewhisperer');
public static readonly Q_DEVELOPER_QAPPS = new InterfaceVpcEndpointAwsService('qapps');
public static readonly Q_USER_SUBSCRIPTIONS = new InterfaceVpcEndpointAwsService('service.user-subscriptions');
public static readonly QLDB = new InterfaceVpcEndpointAwsService('qldb.session');
public static readonly QUICKSIGHT_WEBSITE = new InterfaceVpcEndpointAwsService('quicksight-website');
public static readonly RDS = new InterfaceVpcEndpointAwsService('rds');
public static readonly RDS_DATA = new InterfaceVpcEndpointAwsService('rds-data');
public static readonly RDS_PERFORMANCE_INSIGHTS = new InterfaceVpcEndpointAwsService('pi');
public static readonly RDS_PERFORMANCE_INSIGHTS_FIPS = new InterfaceVpcEndpointAwsService('pi-fips');
public static readonly REDSHIFT = new InterfaceVpcEndpointAwsService('redshift');
public static readonly REDSHIFT_FIPS = new InterfaceVpcEndpointAwsService('redshift-fips');
public static readonly REDSHIFT_DATA = new InterfaceVpcEndpointAwsService('redshift-data');
public static readonly REDSHIFT_DATA_FIPS = new InterfaceVpcEndpointAwsService('redshift-data-fips');
public static readonly REDSHIFT_SERVERLESS = new InterfaceVpcEndpointAwsService('redshift-serverless');
public static readonly REDSHIFT_SERVERLESS_FIPS = new InterfaceVpcEndpointAwsService('redshift-serverless-fips');
public static readonly REKOGNITION = new InterfaceVpcEndpointAwsService('rekognition');
public static readonly REKOGNITION_FIPS = new InterfaceVpcEndpointAwsService('rekognition-fips');
public static readonly REKOGNITION_STREAMING = new InterfaceVpcEndpointAwsService('streaming-rekognition');
public static readonly REKOGNITION_STREAMING_FIPS = new InterfaceVpcEndpointAwsService('streaming-rekognition-fips');
public static readonly REPOST_SPACE = new InterfaceVpcEndpointAwsService('repostspace');
public static readonly RESOURCE_ACCESS_MANAGER = new InterfaceVpcEndpointAwsService('ram');
public static readonly RESOURCE_GROUPS = new InterfaceVpcEndpointAwsService('resource-groups');
public static readonly RESOURCE_GROUPS_FIPS = new InterfaceVpcEndpointAwsService('resource-groups-fips');
public static readonly ROBOMAKER = new InterfaceVpcEndpointAwsService('robomaker');
public static readonly RECYCLE_BIN = new InterfaceVpcEndpointAwsService('rbin');
public static readonly S3 = new InterfaceVpcEndpointAwsService('s3');
public static readonly S3_OUTPOSTS = new InterfaceVpcEndpointAwsService('s3-outposts');
public static readonly S3_MULTI_REGION_ACCESS_POINTS = new InterfaceVpcEndpointAwsService('s3-global.accesspoint', 'com.amazonaws', undefined, { global: true });
public static readonly S3_TABLES = new InterfaceVpcEndpointAwsService('s3tables');
public static readonly SAVINGS_PLANS = new InterfaceVpcEndpointAwsService('savingsplans', 'com.amazonaws', undefined, { global: true });
public static readonly SAGEMAKER_API = new InterfaceVpcEndpointAwsService('sagemaker.api');
public static readonly SAGEMAKER_API_FIPS = new InterfaceVpcEndpointAwsService('sagemaker.api-fips');
public static readonly SAGEMAKER_DATA_SCIENCE_ASSISTANT = new InterfaceVpcEndpointAwsService('sagemaker-data-science-assistant');
public static readonly SAGEMAKER_EXPERIMENTS = new InterfaceVpcEndpointAwsService('experiments', 'aws.sagemaker');
public static readonly SAGEMAKER_FEATURESTORE_RUNTIME = new InterfaceVpcEndpointAwsService('sagemaker.featurestore-runtime');
public static readonly SAGEMAKER_GEOSPATIAL = new InterfaceVpcEndpointAwsService('sagemaker-geospatial');
public static readonly SAGEMAKER_METRICS = new InterfaceVpcEndpointAwsService('sagemaker.metrics');
public static readonly SAGEMAKER_NOTEBOOK = new InterfaceVpcEndpointAwsService('notebook', 'aws.sagemaker');
public static readonly SAGEMAKER_PARTNER_APP = new InterfaceVpcEndpointAwsService('partner-app', 'aws.sagemaker');
public static readonly SAGEMAKER_RUNTIME = new InterfaceVpcEndpointAwsService('sagemaker.runtime');
public static readonly SAGEMAKER_RUNTIME_FIPS = new InterfaceVpcEndpointAwsService('sagemaker.runtime-fips');
public static readonly SAGEMAKER_STUDIO = new InterfaceVpcEndpointAwsService('studio', 'aws.sagemaker');
public static readonly SECRETS_MANAGER = new InterfaceVpcEndpointAwsService('secretsmanager');
public static readonly SECURITYHUB = new InterfaceVpcEndpointAwsService('securityhub');
public static readonly SECURITYLAKE = new InterfaceVpcEndpointAwsService('securitylake');
public static readonly SECURITYLAKE_FIPS = new InterfaceVpcEndpointAwsService('securitylake-fips');
public static readonly SERVICE_CATALOG = new InterfaceVpcEndpointAwsService('servicecatalog');
public static readonly SERVICE_CATALOG_APPREGISTRY = new InterfaceVpcEndpointAwsService('servicecatalog-appregistry');
public static readonly SERVER_MIGRATION_SERVICE = new InterfaceVpcEndpointAwsService('sms');
public static readonly SERVER_MIGRATION_SERVICE_FIPS = new InterfaceVpcEndpointAwsService('sms-fips');
public static readonly SERVER_MIGRATION_SERVICE_AWSCONNECTOR = new InterfaceVpcEndpointAwsService('awsconnector');
public static readonly SERVERLESS_APPLICATION_REPOSITORY = new InterfaceVpcEndpointAwsService('serverlessrepo');
/** @deprecated - Use InterfaceVpcEndpointAwsService.EMAIL_SMTP instead. */
public static readonly SES = new InterfaceVpcEndpointAwsService('email-smtp');
public static readonly SIMSPACE_WEAVER = new InterfaceVpcEndpointAwsService('simspaceweaver');
public static readonly SNOW_DEVICE_MANAGEMENT = new InterfaceVpcEndpointAwsService('snow-device-management');
public static readonly SNS = new InterfaceVpcEndpointAwsService('sns');
public static readonly SQS = new InterfaceVpcEndpointAwsService('sqs');
public static readonly SSM = new InterfaceVpcEndpointAwsService('ssm');
public static readonly SSM_FIPS = new InterfaceVpcEndpointAwsService('ssm-fips');
public static readonly SSM_MESSAGES = new InterfaceVpcEndpointAwsService('ssmmessages');
public static readonly SSM_CONTACTS = new InterfaceVpcEndpointAwsService('ssm-contacts');
public static readonly SSM_INCIDENTS = new InterfaceVpcEndpointAwsService('ssm-incidents');
public static readonly SSM_QUICK_SETUP = new InterfaceVpcEndpointAwsService('ssm-quicksetup');
public static readonly STEP_FUNCTIONS = new InterfaceVpcEndpointAwsService('states');
public static readonly STEP_FUNCTIONS_SYNC = new InterfaceVpcEndpointAwsService('sync-states');
public static readonly STORAGE_GATEWAY = new InterfaceVpcEndpointAwsService('storagegateway');
public static readonly STS = new InterfaceVpcEndpointAwsService('sts');
public static readonly SUPPLY_CHAIN = new InterfaceVpcEndpointAwsService('scn');
public static readonly SWF = new InterfaceVpcEndpointAwsService('swf');
public static readonly SWF_FIPS = new InterfaceVpcEndpointAwsService('swf-fips');
public static readonly TAGGING = new InterfaceVpcEndpointAwsService('tagging');
public static readonly TELCO_NETWORK_BUILDER = new InterfaceVpcEndpointAwsService('tnb');
public static readonly TEXTRACT = new InterfaceVpcEndpointAwsService('textract');
public static readonly TEXTRACT_FIPS = new InterfaceVpcEndpointAwsService('textract-fips');
public static readonly TIMESTREAM_INFLUXDB = new InterfaceVpcEndpointAwsService('timestream-influxdb');
public static readonly TIMESTREAM_INFLUXDB_FIPS = new InterfaceVpcEndpointAwsService('timestream-influxdb-fips');
public static readonly TRANSCRIBE = new InterfaceVpcEndpointAwsService('transcribe');
public static readonly TRANSCRIBE_STREAMING = new InterfaceVpcEndpointAwsService('transcribestreaming');
public static readonly TRANSFER = new InterfaceVpcEndpointAwsService('transfer');
public static readonly TRANSFER_SERVER = new InterfaceVpcEndpointAwsService('transfer.server');
public static readonly TRANSLATE = new InterfaceVpcEndpointAwsService('translate');
public static readonly TRUSTED_ADVISOR = new InterfaceVpcEndpointAwsService('trustedadvisor');
public static readonly WAFV2 = new InterfaceVpcEndpointAwsService('wafv2');
public static readonly WAFV2_FIPS = new InterfaceVpcEndpointAwsService('wafv2-fips');
public static readonly WELL_ARCHITECTED_TOOL = new InterfaceVpcEndpointAwsService('wellarchitected');
public static readonly WORKMAIL = new InterfaceVpcEndpointAwsService('workmail');
public static readonly WORKSPACES = new InterfaceVpcEndpointAwsService('workspaces');
public static readonly WORKSPACES_THIN_CLIENT = new InterfaceVpcEndpointAwsService('thinclient.api');
public static readonly WORKSPACES_WEB = new InterfaceVpcEndpointAwsService('workspaces-web');
public static readonly WORKSPACES_WEB_FIPS = new InterfaceVpcEndpointAwsService('workspaces-web-fips');
public static readonly XRAY = new InterfaceVpcEndpointAwsService('xray');
public static readonly VERIFIED_PERMISSIONS = new InterfaceVpcEndpointAwsService('verifiedpermissions');
public static readonly VPC_LATTICE = new InterfaceVpcEndpointAwsService('vpc-lattice');
/**
* The name of the service. e.g. com.amazonaws.us-east-1.ecs
*/
public readonly name: string;
/**
* The short name of the service. e.g. ecs
*/
public readonly shortName: string;
/**
* The port of the service.
*/
public readonly port: number;
/**
* Whether Private DNS is supported by default.
*/
public readonly privateDnsDefault?: boolean = true;
constructor(
name: string,
prefix?: string,
port?: number,
props?: InterfaceVpcEndpointAwsServiceProps,
) {
const regionPrefix = props?.global ? '' : (Lazy.uncachedString({
produce: (context) => Stack.of(context.scope).region,
}) + '.');
const defaultEndpointPrefix = Lazy.uncachedString({
produce: (context) => {
const regionName = Stack.of(context.scope).region;
return this.getDefaultEndpointPrefix(name, regionName);
},
});
const defaultEndpointSuffix = Lazy.uncachedString({
produce: (context) => {
const regionName = Stack.of(context.scope).region;
return this.getDefaultEndpointSuffix(name, regionName);
},
});
this.name = `${prefix || defaultEndpointPrefix}.${regionPrefix}${name}${defaultEndpointSuffix}`;
this.shortName = name;
this.port = port || 443;
}
/**
* Get the endpoint prefix for the service in the specified region
* because the prefix for some of the services in cn-north-1 and cn-northwest-1 are different
*
* For future maintenanceļ¼ the vpc endpoint services could be fetched using AWS CLI Commmand:
* aws ec2 describe-vpc-endpoint-services
*/
private getDefaultEndpointPrefix(name: string, region: string) {
const VPC_ENDPOINT_SERVICE_EXCEPTIONS: { [region: string]: string[] } = {
'cn-north-1': ['application-autoscaling', 'appmesh-envoy-management', 'athena', 'autoscaling', 'awsconnector',
'backup', 'batch', 'cassandra', 'cloudcontrolapi', 'cloudformation', 'codedeploy-commands-secure', 'databrew', 'dms',
'ebs', 'ec2', 'ecr.api', 'ecr.dkr', 'eks', 'elasticache', 'elasticbeanstalk', 'elasticfilesystem',
'elasticfilesystem-fips', 'emr-containers', 'execute-api', 'fsx', 'imagebuilder', 'iot.data', 'iotsitewise.api',
'iotsitewise.data', 'kinesis-streams', 'lambda', 'license-manager', 'monitoring', 'rds', 'redshift', 'redshift-data',
's3', 'sagemaker.api', 'sagemaker.featurestore-runtime', 'sagemaker.runtime', 'securityhub', 'servicecatalog',
'sms', 'sqs', 'states', 'sts', 'sync-states', 'synthetics', 'transcribe', 'transcribestreaming', 'transfer', 'xray'],
'cn-northwest-1': ['account', 'application-autoscaling', 'appmesh-envoy-management', 'athena', 'autoscaling', 'awsconnector',
'backup', 'batch', 'cassandra', 'cloudcontrolapi', 'cloudformation', 'codedeploy-commands-secure', 'databrew', 'dms', 'ebs', 'ec2',
'ecr.api', 'ecr.dkr', 'eks', 'elasticache', 'elasticbeanstalk', 'elasticfilesystem', 'elasticfilesystem-fips', 'emr-containers',
'execute-api', 'fsx', 'imagebuilder', 'iot.data', 'kinesis-streams', 'lambda', 'license-manager', 'monitoring', 'polly', 'rds',
'redshift', 'redshift-data', 's3', 'sagemaker.api', 'sagemaker.featurestore-runtime', 'sagemaker.runtime', 'securityhub',
'servicecatalog', 'sms', 'sqs', 'states', 'sts', 'sync-states', 'synthetics', 'transcribe', 'transcribestreaming', 'transfer',
'workspaces', 'xray'],
};
if (VPC_ENDPOINT_SERVICE_EXCEPTIONS[region]?.includes(name)) {
return 'cn.com.amazonaws';
} else {
return 'com.amazonaws';
}
}
/**
* Get the endpoint suffix for the service in the specified region.
* In cn-north-1 and cn-northwest-1, the vpc endpoint of transcribe is:
* cn.com.amazonaws.cn-north-1.transcribe.cn
* cn.com.amazonaws.cn-northwest-1.transcribe.cn
* so suffix '.cn' should be return in these scenarios.
*
* For future maintenanceļ¼ the vpc endpoint services could be fetched using AWS CLI Commmand:
* aws ec2 describe-vpc-endpoint-services
*/
private getDefaultEndpointSuffix(name: string, region: string) {
const VPC_ENDPOINT_SERVICE_EXCEPTIONS: { [region: string]: string[] } = {
'cn-north-1': ['transcribe'],
'cn-northwest-1': ['transcribe'],
};
return VPC_ENDPOINT_SERVICE_EXCEPTIONS[region]?.includes(name) ? '.cn' : '';
}
}
/**
* Options to add an interface endpoint to a VPC.
*/
export interface InterfaceVpcEndpointOptions {
/**
* The service to use for this interface VPC endpoint.
*/
readonly service: IInterfaceVpcEndpointService;
/**
* Whether to associate a private hosted zone with the specified VPC. This
* allows you to make requests to the service using its default DNS hostname.
*
* @default set by the instance of IInterfaceVpcEndpointService, or true if
* not defined by the instance of IInterfaceVpcEndpointService
*/
readonly privateDnsEnabled?: boolean;
/**
* The subnets in which to create an endpoint network interface. At most one
* per availability zone.
*
* @default - private subnets
*/
readonly subnets?: SubnetSelection;
/**
* The security groups to associate with this interface VPC endpoint.
*
* @default - a new security group is created
*/
readonly securityGroups?: ISecurityGroup[];
/**
* Whether to automatically allow VPC traffic to the endpoint
*
* If enabled, all traffic to the endpoint from within the VPC will be
* automatically allowed. This is done based on the VPC's CIDR range.
*
* @default true
*/
readonly open?: boolean;
/**
* Limit to only those availability zones where the endpoint service can be created
*
* Setting this to 'true' requires a lookup to be performed at synthesis time. Account
* and region must be set on the containing stack for this to work.
*
* @default false
*/
readonly lookupSupportedAzs?: boolean;
/**
* The IP address type for the endpoint.
*
* @default not specified
*/
readonly ipAddressType?: VpcEndpointIpAddressType;
/**
* Type of DNS records created for the VPC endpoint.
*
* @default not specified
*/
readonly dnsRecordIpType?: VpcEndpointDnsRecordIpType;
/**
* Whether to enable private DNS only for inbound endpoints.
*
* @default not specified
*/
readonly privateDnsOnlyForInboundResolverEndpoint?: VpcEndpointPrivateDnsOnlyForInboundResolverEndpoint;
}
/**
* Construction properties for an InterfaceVpcEndpoint.
*/
export interface InterfaceVpcEndpointProps extends InterfaceVpcEndpointOptions {
/**
* The VPC network in which the interface endpoint will be used.
*/
readonly vpc: IVpc;
}
/**
* An interface VPC endpoint.
*/
export interface IInterfaceVpcEndpoint extends IVpcEndpoint, IConnectable {
}
/**
* A interface VPC endpoint.
* @resource AWS::EC2::VPCEndpoint
*/
export class InterfaceVpcEndpoint extends VpcEndpoint implements IInterfaceVpcEndpoint {
/**
* Imports an existing interface VPC endpoint.
*/
public static fromInterfaceVpcEndpointAttributes(scope: Construct, id: string, attrs: InterfaceVpcEndpointAttributes): IInterfaceVpcEndpoint {
const securityGroups = attrs.securityGroupId
? [SecurityGroup.fromSecurityGroupId(scope, 'SecurityGroup', attrs.securityGroupId)]
: attrs.securityGroups;
class Import extends Resource implements IInterfaceVpcEndpoint {
public readonly vpcEndpointId = attrs.vpcEndpointId;
public readonly connections = new Connections({
defaultPort: Port.tcp(attrs.port),
securityGroups,
});
}
return new Import(scope, id);
}
/**
* The interface VPC endpoint identifier.
*/
public readonly vpcEndpointId: string;
/**
* The date and time the interface VPC endpoint was created.
* @attribute
*/
public readonly vpcEndpointCreationTimestamp: string;
/**
* The DNS entries for the interface VPC endpoint.
* Each entry is a combination of the hosted zone ID and the DNS name.
* The entries are ordered as follows: regional public DNS, zonal public DNS, private DNS, and wildcard DNS.
* This order is not enforced for AWS Marketplace services.
*
* The following is an example. In the first entry, the hosted zone ID is Z1HUB23UULQXV
* and the DNS name is vpce-01abc23456de78f9g-12abccd3.ec2.us-east-1.vpce.amazonaws.com.
*
* ["Z1HUB23UULQXV:vpce-01abc23456de78f9g-12abccd3.ec2.us-east-1.vpce.amazonaws.com",
* "Z1HUB23UULQXV:vpce-01abc23456de78f9g-12abccd3-us-east-1a.ec2.us-east-1.vpce.amazonaws.com",
* "Z1C12344VYDITB0:ec2.us-east-1.amazonaws.com"]
*
* If you update the PrivateDnsEnabled or SubnetIds properties, the DNS entries in the list will change.
* @attribute
*/
public readonly vpcEndpointDnsEntries: string[];
/**
* One or more network interfaces for the interface VPC endpoint.
* @attribute
*/
public readonly vpcEndpointNetworkInterfaceIds: string[];
/**
* The identifier of the first security group associated with this interface
* VPC endpoint.
*
* @deprecated use the `connections` object
*/
public readonly securityGroupId: string;
/**
* Access to network connections.
*/
public readonly connections: Connections;
constructor(scope: Construct, id: string, props: InterfaceVpcEndpointProps) {
super(scope, id);
// Enhanced CDK Analytics Telemetry
addConstructMetadata(this, props);
const securityGroups = props.securityGroups || [new SecurityGroup(this, 'SecurityGroup', {
vpc: props.vpc,
})];
this.securityGroupId = securityGroups[0].securityGroupId;
this.connections = new Connections({
defaultPort: Port.tcp(props.service.port),
securityGroups,
});
if (props.open !== false) {
this.connections.allowDefaultPortFrom(Peer.ipv4(props.vpc.vpcCidrBlock));
}
// Determine which subnets to place the endpoint in
const subnetIds = this.endpointSubnets(props);
const dnsOptions = (props.dnsRecordIpType === undefined && props.privateDnsOnlyForInboundResolverEndpoint === undefined)
? undefined
: {
dnsRecordIpType: props.dnsRecordIpType,
privateDnsOnlyForInboundResolverEndpoint: props.privateDnsOnlyForInboundResolverEndpoint,
};
const endpoint = new CfnVPCEndpoint(this, 'Resource', {
privateDnsEnabled: props.privateDnsEnabled ?? props.service.privateDnsDefault ?? true,
policyDocument: Lazy.any({ produce: () => this.policyDocument }),
securityGroupIds: securityGroups.map(s => s.securityGroupId),
serviceName: props.service.name,
vpcEndpointType: VpcEndpointType.INTERFACE,
subnetIds,
vpcId: props.vpc.vpcId,
ipAddressType: props.ipAddressType,
dnsOptions,
});
this.vpcEndpointId = endpoint.ref;
this.vpcEndpointCreationTimestamp = endpoint.attrCreationTimestamp;
this.vpcEndpointDnsEntries = endpoint.attrDnsEntries;
this.vpcEndpointNetworkInterfaceIds = endpoint.attrNetworkInterfaceIds;
}
/**
* Determine which subnets to place the endpoint in. This is in its own function
* because there's a lot of code.
*/
private endpointSubnets(props: InterfaceVpcEndpointProps) {
const lookupSupportedAzs = props.lookupSupportedAzs ?? false;
const subnetSelection = props.vpc.selectSubnets({ ...props.subnets, onePerAz: true });
const subnets = subnetSelection.subnets;
// Sanity check the subnet count
if (!subnetSelection.isPendingLookup && subnetSelection.subnets.length == 0) {
throw new ValidationError('Cannot create a VPC Endpoint with no subnets', this);
}
// If we aren't going to lookup supported AZs we'll exit early, returning the subnetIds from the provided subnet selection
if (!lookupSupportedAzs) {
return subnetSelection.subnetIds;
}
// Some service names, such as AWS service name references, use Tokens to automatically fill in the region
// If it is an InterfaceVpcEndpointAwsService, then the reference will be resolvable since it only references the region
const isAwsService = Token.isUnresolved(props.service.name) && props.service instanceof InterfaceVpcEndpointAwsService;
// Determine what service name gets pass to the context provider
// If it is an AWS service it will have a REGION token
const lookupServiceName = isAwsService ? Stack.of(this).resolve(props.service.name) : props.service.name;
// Check that the lookup will work
this.validateCanLookupSupportedAzs(subnets, lookupServiceName);
// Do the actual lookup for AZs
const availableAZs = this.availableAvailabilityZones(lookupServiceName);
const filteredSubnets = subnets.filter(s => availableAZs.includes(s.availabilityZone));
// Throw an error if the lookup filtered out all subnets
// VpcEndpoints must be created with at least one AZ
if (filteredSubnets.length == 0) {
throw new ValidationError(`lookupSupportedAzs returned ${availableAZs} but subnets have AZs ${subnets.map(s => s.availabilityZone)}`, this);
}
return filteredSubnets.map(s => s.subnetId);
}
/**
* Sanity checking when looking up AZs for an endpoint service, to make sure it won't fail
*/
private validateCanLookupSupportedAzs(subnets: ISubnet[], serviceName: string) {
// Having any of these be true will cause the AZ lookup to fail at synthesis time
const agnosticAcct = Token.isUnresolved(this.env.account);
const agnosticRegion = Token.isUnresolved(this.env.region);
const agnosticService = Token.isUnresolved(serviceName);
// Having subnets with Token AZs can cause the endpoint to be created with no subnets, failing at deployment time
const agnosticSubnets = subnets.some(s => Token.isUnresolved(s.availabilityZone));
const agnosticSubnetList = Token.isUnresolved(subnets.map(s => s.availabilityZone));
// Context provider cannot make an AWS call without an account/region
if (agnosticAcct || agnosticRegion) {
throw new ValidationError('Cannot look up VPC endpoint availability zones if account/region are not specified', this);
}
// The AWS call will fail if there is a Token in the service name
if (agnosticService) {
throw new ValidationError(`Cannot lookup AZs for a service name with a Token: ${serviceName}`, this);
}
// The AWS call return strings for AZs, like us-east-1a, us-east-1b, etc
// If the subnet AZs are Tokens, a string comparison between the subnet AZs and the AZs from the AWS call
// will not match
if (agnosticSubnets || agnosticSubnetList) {
const agnostic = subnets.filter(s => Token.isUnresolved(s.availabilityZone));
throw new ValidationError(`lookupSupportedAzs cannot filter on subnets with Token AZs: ${agnostic}`, this);
}
}
private availableAvailabilityZones(serviceName: string): string[] {
// Here we check what AZs the endpoint service is available in
// If for whatever reason we can't retrieve the AZs, and no context is set,
// we will fall back to all AZs
const availableAZs = ContextProvider.getValue(this, {
provider: cxschema.ContextProvider.ENDPOINT_SERVICE_AVAILABILITY_ZONE_PROVIDER,
dummyValue: this.stack.availabilityZones,
props: { serviceName },
}).value;
if (!Array.isArray(availableAZs)) {
throw new ValidationError(`Discovered AZs for endpoint service ${serviceName} must be an array`, this);
}
return availableAZs;
}
}
/**
* Construction properties for an ImportedInterfaceVpcEndpoint.
*/
export interface InterfaceVpcEndpointAttributes {
/**
* The interface VPC endpoint identifier.
*/
readonly vpcEndpointId: string;
/**
* The identifier of the security group associated with the interface VPC endpoint.
*
* @deprecated use `securityGroups` instead
*/
readonly securityGroupId?: string;
/**
* The security groups associated with the interface VPC endpoint.
*
* If you wish to manage the network connections associated with this endpoint,
* you will need to specify its security groups.
*/
readonly securityGroups?: ISecurityGroup[];
/**
* The port of the service of the interface VPC endpoint.
*/
readonly port: number;
}