diff --git a/enhanced_integ_test.ts b/enhanced_integ_test.ts new file mode 100644 index 0000000000000..0d021901e34f1 --- /dev/null +++ b/enhanced_integ_test.ts @@ -0,0 +1,131 @@ +import * as path from 'path'; +import * as ec2 from 'aws-cdk-lib/aws-ec2'; +import * as cdk from 'aws-cdk-lib'; +import { IntegTest } from '@aws-cdk/integ-tests-alpha'; +import * as sagemaker from '../lib'; + +/* + * Stack verification steps: + * aws sagemaker describe-endpoint-config --endpoint-config-name + * + * For instance-based endpoint config, the above command will result in the following output: + * { + * "EndpointConfigName": "EndpointConfig...", + * "EndpointConfigArn": "arn:aws:sagemaker:...", + * "ProductionVariants": [ + * { + * "VariantName": "firstVariant", + * "ModelName": "ModelWithArtifactAndVpcModel...", + * "InitialInstanceCount": 1, + * "InstanceType": "ml.m5.large", + * "InitialVariantWeight": 1.0 + * }, + * { + * "VariantName": "secondVariant", + * "ModelName": "ModelWithArtifactAndVpcModel...", + * "InitialInstanceCount": 1, + * "InstanceType": "ml.t2.medium", + * "InitialVariantWeight": 1.0 + * }, + * { + * "VariantName": "thirdVariant", + * "ModelName": "ModelWithoutArtifactAndVpcModel...", + * "InitialInstanceCount": 1, + * "InstanceType": "ml.t2.medium", + * "InitialVariantWeight": 2.0 + * } + * ], + * "CreationTime": "..." + * } + * + * For serverless endpoint config, the command will show: + * { + * "EndpointConfigName": "ServerlessEndpointConfig...", + * "EndpointConfigArn": "arn:aws:sagemaker:...", + * "ProductionVariants": [ + * { + * "VariantName": "serverlessVariant", + * "ModelName": "ModelWithoutArtifactAndVpcModel...", + * "InitialVariantWeight": 1.0, + * "ServerlessConfig": { + * "MaxConcurrency": 10, + * "MemorySizeInMB": 2048, + * "ProvisionedConcurrency": 5 + * } + * } + * ], + * "CreationTime": "..." + * } + */ + +const app = new cdk.App(); +const stack = new cdk.Stack(app, 'aws-cdk-sagemaker-endpointconfig'); + +const image = sagemaker.ContainerImage.fromAsset(path.join(__dirname, 'test-image')); +const modelData = sagemaker.ModelData.fromAsset(path.join(__dirname, 'test-artifacts', 'valid-artifact.tar.gz')); + +const modelWithArtifactAndVpc = new sagemaker.Model(stack, 'ModelWithArtifactAndVpc', { + containers: [{ image, modelData }], + vpc: new ec2.Vpc(stack, 'VPC', { restrictDefaultSecurityGroup: false }), +}); +const modelWithoutArtifactAndVpc = new sagemaker.Model(stack, 'ModelWithoutArtifactAndVpc', { + containers: [{ image }], +}); + +// Test instance-based endpoint configuration +const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig', { + instanceProductionVariants: [ + { + model: modelWithArtifactAndVpc, + variantName: 'firstVariant', + instanceType: sagemaker.InstanceType.M5_LARGE, + }, + { + model: modelWithArtifactAndVpc, + variantName: 'secondVariant', + }, + ], +}); +endpointConfig.addInstanceProductionVariant({ + model: modelWithoutArtifactAndVpc, + variantName: 'thirdVariant', + initialVariantWeight: 2.0, +}); + +// Test serverless endpoint configuration with all properties +new sagemaker.EndpointConfig(stack, 'ServerlessEndpointConfig', { + serverlessProductionVariant: { + model: modelWithoutArtifactAndVpc, + variantName: 'serverlessVariant', + maxConcurrency: 10, + memorySizeInMB: 2048, + provisionedConcurrency: 5, + initialVariantWeight: 1.0, + }, +}); + +// Test serverless endpoint configuration with minimal properties +new sagemaker.EndpointConfig(stack, 'MinimalServerlessEndpointConfig', { + serverlessProductionVariant: { + model: modelWithoutArtifactAndVpc, + variantName: 'minimalServerlessVariant', + maxConcurrency: 1, + memorySizeInMB: 1024, + // No provisionedConcurrency - testing optional property + }, +}); + +// Test serverless endpoint configuration with boundary values +new sagemaker.EndpointConfig(stack, 'BoundaryServerlessEndpointConfig', { + serverlessProductionVariant: { + model: modelWithoutArtifactAndVpc, + variantName: 'boundaryServerlessVariant', + maxConcurrency: 200, // Maximum allowed + memorySizeInMB: 6144, // Maximum allowed + provisionedConcurrency: 200, // Maximum allowed (equal to maxConcurrency) + }, +}); + +new IntegTest(app, 'integtest-endpointconfig', { + testCases: [stack], +}); \ No newline at end of file diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/README.md b/packages/@aws-cdk/aws-sagemaker-alpha/README.md index f4798faf19036..006ab05b0c68a 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/README.md +++ b/packages/@aws-cdk/aws-sagemaker-alpha/README.md @@ -214,6 +214,38 @@ const endpointConfig = new sagemaker.EndpointConfig(this, 'EndpointConfig', { }); ``` +### Serverless Inference + +Amazon SageMaker Serverless Inference is a purpose-built inference option that makes it easy for you to deploy and scale ML models. Serverless endpoints automatically launch compute resources and scale them in and out depending on traffic, eliminating the need to choose instance types or manage scaling policies. + +To create a serverless endpoint configuration, use the `serverlessProductionVariant` property: + +```typescript +import * as sagemaker from '@aws-cdk/aws-sagemaker-alpha'; + +declare const model: sagemaker.Model; + +const endpointConfig = new sagemaker.EndpointConfig(this, 'ServerlessEndpointConfig', { + serverlessProductionVariant: { + model: model, + variantName: 'serverlessVariant', + maxConcurrency: 10, + memorySizeInMB: 2048, + provisionedConcurrency: 5, // optional + }, +}); +``` + +Serverless inference is ideal for workloads with intermittent or unpredictable traffic patterns. You can configure: + +- `maxConcurrency`: Maximum concurrent invocations (1-200) +- `memorySizeInMB`: Memory allocation in 1GB increments (1024, 2048, 3072, 4096, 5120, or 6144 MB) +- `provisionedConcurrency`: Optional pre-warmed capacity to reduce cold starts + +**Note**: Provisioned concurrency incurs charges even when the endpoint is not processing requests. Use it only when you need to minimize cold start latency. + +You cannot mix serverless and instance-based variants in the same endpoint configuration. + ### Endpoint When you create an endpoint from an `EndpointConfig`, Amazon SageMaker launches the ML compute diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/lib/endpoint-config.ts b/packages/@aws-cdk/aws-sagemaker-alpha/lib/endpoint-config.ts index cd7c0c1bcfba1..aa55766631904 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/lib/endpoint-config.ts +++ b/packages/@aws-cdk/aws-sagemaker-alpha/lib/endpoint-config.ts @@ -75,6 +75,31 @@ export interface InstanceProductionVariantProps extends ProductionVariantProps { readonly instanceType?: InstanceType; } +/** + * Construction properties for a serverless production variant. + */ +export interface ServerlessProductionVariantProps extends ProductionVariantProps { + /** + * The maximum number of concurrent invocations your serverless endpoint can process. + * + * Valid range: 1-200 + */ + readonly maxConcurrency: number; + /** + * The memory size of your serverless endpoint. Valid values are in 1 GB increments: + * 1024 MB, 2048 MB, 3072 MB, 4096 MB, 5120 MB, or 6144 MB. + */ + readonly memorySizeInMB: number; + /** + * The number of concurrent invocations that are provisioned and ready to respond to your endpoint. + * + * Valid range: 1-200, must be less than or equal to maxConcurrency. + * + * @default - none + */ + readonly provisionedConcurrency?: number; +} + /** * Represents common attributes of all production variant types (e.g., instance, serverless) once * associated to an EndpointConfig. @@ -119,6 +144,26 @@ export interface InstanceProductionVariant extends ProductionVariant { readonly instanceType: InstanceType; } +/** + * Represents a serverless production variant that has been associated with an EndpointConfig. + * + * @internal + */ +interface ServerlessProductionVariant extends ProductionVariant { + /** + * The maximum number of concurrent invocations your serverless endpoint can process. + */ + readonly maxConcurrency: number; + /** + * The memory size of your serverless endpoint. + */ + readonly memorySizeInMB: number; + /** + * The number of concurrent invocations that are provisioned and ready to respond to your endpoint. + */ + readonly provisionedConcurrency?: number; +} + /** * Construction properties for a SageMaker EndpointConfig. */ @@ -142,9 +187,21 @@ export interface EndpointConfigProps { * A list of instance production variants. You can always add more variants later by calling * `EndpointConfig#addInstanceProductionVariant`. * + * Cannot be specified if `serverlessProductionVariant` is specified. + * * @default - none */ readonly instanceProductionVariants?: InstanceProductionVariantProps[]; + + /** + * A serverless production variant. Serverless endpoints automatically launch compute resources + * and scale them in and out depending on traffic. + * + * Cannot be specified if `instanceProductionVariants` is specified. + * + * @default - none + */ + readonly serverlessProductionVariant?: ServerlessProductionVariantProps; } /** @@ -207,6 +264,7 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { public readonly endpointConfigName: string; private readonly instanceProductionVariantsByName: { [key: string]: InstanceProductionVariant } = {}; + private serverlessProductionVariant?: ServerlessProductionVariant; constructor(scope: Construct, id: string, props: EndpointConfigProps = {}) { super(scope, id, { @@ -215,13 +273,22 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { // Enhanced CDK Analytics Telemetry addConstructMetadata(this, props); + // Validate mutual exclusivity + if (props.instanceProductionVariants && props.serverlessProductionVariant) { + throw new Error('Cannot specify both instanceProductionVariants and serverlessProductionVariant. Choose one variant type.'); + } + (props.instanceProductionVariants || []).map(p => this.addInstanceProductionVariant(p)); + if (props.serverlessProductionVariant) { + this.addServerlessProductionVariant(props.serverlessProductionVariant); + } + // create the endpoint configuration resource const endpointConfig = new CfnEndpointConfig(this, 'EndpointConfig', { kmsKeyId: (props.encryptionKey) ? props.encryptionKey.keyRef.keyArn : undefined, endpointConfigName: this.physicalName, - productionVariants: cdk.Lazy.any({ produce: () => this.renderInstanceProductionVariants() }), + productionVariants: cdk.Lazy.any({ produce: () => this.renderProductionVariants() }), }); this.endpointConfigName = this.getResourceNameAttribute(endpointConfig.attrEndpointConfigName); this.endpointConfigArn = this.getResourceArnAttribute(endpointConfig.ref, { @@ -238,6 +305,9 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { */ @MethodMetadata() public addInstanceProductionVariant(props: InstanceProductionVariantProps): void { + if (this.serverlessProductionVariant) { + throw new Error('Cannot add instance production variant when serverless production variant is already configured'); + } if (props.variantName in this.instanceProductionVariantsByName) { throw new Error(`There is already a Production Variant with name '${props.variantName}'`); } @@ -252,6 +322,30 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { }; } + /** + * Add serverless production variant to the endpoint configuration. + * + * @param props The properties of a serverless production variant to add. + */ + @MethodMetadata() + public addServerlessProductionVariant(props: ServerlessProductionVariantProps): void { + if (Object.keys(this.instanceProductionVariantsByName).length > 0) { + throw new Error('Cannot add serverless production variant when instance production variants are already configured'); + } + if (this.serverlessProductionVariant) { + throw new Error('Cannot add more than one serverless production variant per endpoint configuration'); + } + this.validateServerlessProductionVariantProps(props); + this.serverlessProductionVariant = { + initialVariantWeight: props.initialVariantWeight || 1.0, + maxConcurrency: props.maxConcurrency, + memorySizeInMB: props.memorySizeInMB, + modelName: props.model.modelName, + provisionedConcurrency: props.provisionedConcurrency, + variantName: props.variantName, + }; + } + /** * Get instance production variants associated with endpoint configuration. * @@ -276,10 +370,21 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { } private validateProductionVariants(): void { - // validate number of production variants - if (this._instanceProductionVariants.length < 1) { + const hasInstanceVariants = this._instanceProductionVariants.length > 0; + const hasServerlessVariant = this.serverlessProductionVariant !== undefined; + + // validate at least one production variant + if (!hasInstanceVariants && !hasServerlessVariant) { throw new Error('Must configure at least 1 production variant'); - } else if (this._instanceProductionVariants.length > 10) { + } + + // validate mutual exclusivity + if (hasInstanceVariants && hasServerlessVariant) { + throw new Error('Cannot configure both instance and serverless production variants'); + } + + // validate instance variant limits + if (hasInstanceVariants && this._instanceProductionVariants.length > 10) { throw new Error('Can\'t have more than 10 production variants'); } } @@ -310,11 +415,65 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { } } + private validateServerlessProductionVariantProps(props: ServerlessProductionVariantProps): void { + const errors: string[] = []; + + // check variant weight is not negative + if (props.initialVariantWeight && props.initialVariantWeight < 0) { + errors.push('Cannot have negative variant weight'); + } + + // check maxConcurrency range + if (props.maxConcurrency < 1 || props.maxConcurrency > 200) { + errors.push('maxConcurrency must be between 1 and 200'); + } + + // check memorySizeInMB valid values (1GB increments from 1024 to 6144) + const validMemorySizes = [1024, 2048, 3072, 4096, 5120, 6144]; + if (!validMemorySizes.includes(props.memorySizeInMB)) { + errors.push(`memorySizeInMB must be one of: ${validMemorySizes.join(', ')} MB`); + } + + // check provisionedConcurrency range and relationship to maxConcurrency + if (props.provisionedConcurrency !== undefined) { + if (props.provisionedConcurrency < 1 || props.provisionedConcurrency > 200) { + errors.push('provisionedConcurrency must be between 1 and 200'); + } + if (props.provisionedConcurrency > props.maxConcurrency) { + errors.push('provisionedConcurrency cannot be greater than maxConcurrency'); + } + } + + // check environment compatibility with model + const model = props.model; + if (!sameEnv(model.env.account, this.env.account)) { + errors.push(`Cannot use model in account ${model.env.account} for endpoint configuration in account ${this.env.account}`); + } else if (!sameEnv(model.env.region, this.env.region)) { + errors.push(`Cannot use model in region ${model.env.region} for endpoint configuration in region ${this.env.region}`); + } + + if (errors.length > 0) { + throw new Error(`Invalid Serverless Production Variant Props: ${errors.join(EOL)}`); + } + } + + /** + * Render the list of production variants (instance or serverless). + */ + private renderProductionVariants(): CfnEndpointConfig.ProductionVariantProperty[] { + this.validateProductionVariants(); + + if (this.serverlessProductionVariant) { + return this.renderServerlessProductionVariant(); + } else { + return this.renderInstanceProductionVariants(); + } + } + /** * Render the list of instance production variants. */ private renderInstanceProductionVariants(): CfnEndpointConfig.ProductionVariantProperty[] { - this.validateProductionVariants(); return this._instanceProductionVariants.map( v => ({ acceleratorType: v.acceleratorType?.toString(), initialInstanceCount: v.initialInstanceCount, @@ -324,4 +483,25 @@ export class EndpointConfig extends cdk.Resource implements IEndpointConfig { variantName: v.variantName, }) ); } + + /** + * Render the serverless production variant. + */ + private renderServerlessProductionVariant(): CfnEndpointConfig.ProductionVariantProperty[] { + if (!this.serverlessProductionVariant) { + return []; + } + + const variant = this.serverlessProductionVariant; + return [{ + initialVariantWeight: variant.initialVariantWeight, + modelName: variant.modelName, + variantName: variant.variantName, + serverlessConfig: { + maxConcurrency: variant.maxConcurrency, + memorySizeInMb: variant.memorySizeInMB, + provisionedConcurrency: variant.provisionedConcurrency, + }, + }]; + } } diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/endpoint-config.test.ts b/packages/@aws-cdk/aws-sagemaker-alpha/test/endpoint-config.test.ts index 81c130b79068a..22b75b00505b4 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/endpoint-config.test.ts +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/endpoint-config.test.ts @@ -37,6 +37,69 @@ describe('When synthesizing a stack containing an EndpointConfig', () => { // THEN expect(when).toThrow(/Must configure at least 1 production variant/); }); + + test('with both instance and serverless variants in constructor, an exception is thrown', () => { + // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + + // WHEN + const when = () => new sagemaker.EndpointConfig(stack, 'EndpointConfig', { + instanceProductionVariants: [{ + variantName: 'instance-variant', + model, + }], + serverlessProductionVariant: { + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 1024, + }, + }); + + // THEN + expect(when).toThrow(/Cannot specify both instanceProductionVariants and serverlessProductionVariant/); + }); + + test('with serverless variant, synthesizes correctly', () => { + // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + new sagemaker.EndpointConfig(stack, 'EndpointConfig', { + serverlessProductionVariant: { + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 2048, + provisionedConcurrency: 5, + }, + }); + + // WHEN + const template = app.synth().getStackByName(stack.stackName).template; + + // THEN + const endpointConfigResource = Object.values(template.Resources).find((resource: any) => + resource.Type === 'AWS::SageMaker::EndpointConfig', + ); + expect(endpointConfigResource).toEqual({ + Type: 'AWS::SageMaker::EndpointConfig', + Properties: { + ProductionVariants: [{ + InitialVariantWeight: 1, + ModelName: 'model', + VariantName: 'serverless-variant', + ServerlessConfig: { + MaxConcurrency: 10, + MemorySizeInMB: 2048, + ProvisionedConcurrency: 5, + }, + }], + }, + }); + }); }); describe('When adding a production variant to an EndpointConfig', () => { @@ -88,6 +151,173 @@ describe('When adding a production variant to an EndpointConfig', () => { // THEN expect(when).toThrow(/There is already a Production Variant with name 'variant'/); }); + + test('instance variant when serverless variant exists, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig', { + serverlessProductionVariant: { + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 1024, + }, + }); + + // WHEN + const when = () => endpointConfig.addInstanceProductionVariant({ variantName: 'instance-variant', model }); + + // THEN + expect(when).toThrow(/Cannot add instance production variant when serverless production variant is already configured/); + }); +}); + +describe('When adding a serverless production variant to an EndpointConfig', () => { + test('with invalid maxConcurrency, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig'); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'serverless-variant', + model, + maxConcurrency: 0, + memorySizeInMB: 1024, + }); + + // THEN + expect(when).toThrow(/Invalid Serverless Production Variant Props: maxConcurrency must be between 1 and 200/); + }); + + test('with invalid memorySizeInMB, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig'); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 1500, + }); + + // THEN + expect(when).toThrow(/Invalid Serverless Production Variant Props: memorySizeInMB must be one of: 1024, 2048, 3072, 4096, 5120, 6144 MB/); + }); + + test('with provisionedConcurrency greater than maxConcurrency, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig'); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 1024, + provisionedConcurrency: 15, + }); + + // THEN + expect(when).toThrow(/Invalid Serverless Production Variant Props: provisionedConcurrency cannot be greater than maxConcurrency/); + }); + + test('with negative variant weight, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig'); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 1024, + initialVariantWeight: -1, + }); + + // THEN + expect(when).toThrow(/Invalid Serverless Production Variant Props: Cannot have negative variant weight/); + }); + + test('when instance variants exist, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig', { + instanceProductionVariants: [{ variantName: 'instance-variant', model }], + }); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 1024, + }); + + // THEN + expect(when).toThrow(/Cannot add serverless production variant when instance production variants are already configured/); + }); + + test('when serverless variant already exists, an exception is thrown', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig', { + serverlessProductionVariant: { + variantName: 'first-serverless', + model, + maxConcurrency: 10, + memorySizeInMB: 1024, + }, + }); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'second-serverless', + model, + maxConcurrency: 5, + memorySizeInMB: 2048, + }); + + // THEN + expect(when).toThrow(/Cannot add more than one serverless production variant per endpoint configuration/); + }); + + test('with valid properties, succeeds', () => { + // GIVEN + const stack = new cdk.Stack(); + const model = sagemaker.Model.fromModelName(stack, 'Model', 'model'); + const endpointConfig = new sagemaker.EndpointConfig(stack, 'EndpointConfig'); + + // WHEN + const when = () => + endpointConfig.addServerlessProductionVariant({ + variantName: 'serverless-variant', + model, + maxConcurrency: 10, + memorySizeInMB: 2048, + provisionedConcurrency: 5, + }); + + // THEN + expect(when).not.toThrow(); + }); }); describe('When searching an EndpointConfig for a production variant', () => { diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/Dockerfile b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/Dockerfile similarity index 90% rename from packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/Dockerfile rename to packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/Dockerfile index 797ae133a4a3e..823218c1a3d01 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/Dockerfile +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 python:3 +FROM --platform=linux/amd64 public.ecr.aws/docker/library/python:3 # The following label allows this image to deployed within an inference pipeline LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/index.html b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/index.html similarity index 100% rename from packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/index.html rename to packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/index.html diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/index.py b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/index.py similarity index 100% rename from packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a/index.py rename to packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd/index.py diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.assets.json b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.assets.json index e9910a9e829fe..4005a32989eb6 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.assets.json +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.assets.json @@ -1,42 +1,45 @@ { - "version": "21.0.0", + "version": "48.0.0", "files": { "126d48fa0e32fbef5078b9d88658b35ad29d4291eb86675a64c75fa4f1338916": { + "displayName": "ModelWithArtifactAndVpc/ModelData3a5d8a5c26d90a81d20fad7f530f24e2", "source": { "path": "asset.126d48fa0e32fbef5078b9d88658b35ad29d4291eb86675a64c75fa4f1338916.tar.gz", "packaging": "file" }, "destinations": { - "current_account-current_region": { + "current_account-current_region-ba5389d6": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", "objectKey": "126d48fa0e32fbef5078b9d88658b35ad29d4291eb86675a64c75fa4f1338916.gz", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "16ab84c598574688eb95944b09c42d17b927d3f0a4725f9a9ccafcce2aefdf53": { + "41917d944a0cbc261b42ff261bf561288f84dca1d1401a2d07999bda9cbed993": { + "displayName": "aws-cdk-sagemaker-endpointconfig Template", "source": { "path": "aws-cdk-sagemaker-endpointconfig.template.json", "packaging": "file" }, "destinations": { - "current_account-current_region": { + "current_account-current_region-56d209b7": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "16ab84c598574688eb95944b09c42d17b927d3f0a4725f9a9ccafcce2aefdf53.json", + "objectKey": "41917d944a0cbc261b42ff261bf561288f84dca1d1401a2d07999bda9cbed993.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } } }, "dockerImages": { - "442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a": { + "98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd": { + "displayName": "ModelWithArtifactAndVpc/ModelImage70e881962cb181ccd50da9c12b3370f1", "source": { - "directory": "asset.442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a" + "directory": "asset.98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd" }, "destinations": { - "current_account-current_region": { + "current_account-current_region-cfb74927": { "repositoryName": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}", - "imageTag": "442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a", + "imageTag": "98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-image-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.template.json b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.template.json index f4258769bc2b2..9f7633cef57ed 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.template.json +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/aws-cdk-sagemaker-endpointconfig.template.json @@ -18,9 +18,6 @@ "VPCPublicSubnet1SubnetB4246D30": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "AvailabilityZone": { "Fn::Select": [ 0, @@ -44,21 +41,24 @@ "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPublicSubnet1RouteTableFEE4B781": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "Tags": [ { "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPublicSubnet1RouteTableAssociation0B0896DC": { @@ -75,12 +75,12 @@ "VPCPublicSubnet1DefaultRoute91CEF279": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VPCPublicSubnet1RouteTableFEE4B781" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VPCIGWB7E252D3" + }, + "RouteTableId": { + "Ref": "VPCPublicSubnet1RouteTableFEE4B781" } }, "DependsOn": [ @@ -102,15 +102,15 @@ "VPCPublicSubnet1NATGatewayE0556630": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VPCPublicSubnet1SubnetB4246D30" - }, "AllocationId": { "Fn::GetAtt": [ "VPCPublicSubnet1EIP6AD938E8", "AllocationId" ] }, + "SubnetId": { + "Ref": "VPCPublicSubnet1SubnetB4246D30" + }, "Tags": [ { "Key": "Name", @@ -126,9 +126,6 @@ "VPCPublicSubnet2Subnet74179F39": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "AvailabilityZone": { "Fn::Select": [ 1, @@ -152,21 +149,24 @@ "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPublicSubnet2RouteTable6F1A15F1": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "Tags": [ { "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPublicSubnet2RouteTableAssociation5A808732": { @@ -183,12 +183,12 @@ "VPCPublicSubnet2DefaultRouteB7481BBA": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VPCPublicSubnet2RouteTable6F1A15F1" - }, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "VPCIGWB7E252D3" + }, + "RouteTableId": { + "Ref": "VPCPublicSubnet2RouteTable6F1A15F1" } }, "DependsOn": [ @@ -210,15 +210,15 @@ "VPCPublicSubnet2NATGateway3C070193": { "Type": "AWS::EC2::NatGateway", "Properties": { - "SubnetId": { - "Ref": "VPCPublicSubnet2Subnet74179F39" - }, "AllocationId": { "Fn::GetAtt": [ "VPCPublicSubnet2EIP4947BC00", "AllocationId" ] }, + "SubnetId": { + "Ref": "VPCPublicSubnet2Subnet74179F39" + }, "Tags": [ { "Key": "Name", @@ -234,9 +234,6 @@ "VPCPrivateSubnet1Subnet8BCA10E0": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "AvailabilityZone": { "Fn::Select": [ 0, @@ -260,21 +257,24 @@ "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPrivateSubnet1RouteTableBE8A6027": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "Tags": [ { "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPrivateSubnet1RouteTableAssociation347902D1": { @@ -291,21 +291,18 @@ "VPCPrivateSubnet1DefaultRouteAE1D6490": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VPCPrivateSubnet1RouteTableBE8A6027" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VPCPublicSubnet1NATGatewayE0556630" + }, + "RouteTableId": { + "Ref": "VPCPrivateSubnet1RouteTableBE8A6027" } } }, "VPCPrivateSubnet2SubnetCFCDAA7A": { "Type": "AWS::EC2::Subnet", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "AvailabilityZone": { "Fn::Select": [ 1, @@ -329,21 +326,24 @@ "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPrivateSubnet2RouteTable0A19E10E": { "Type": "AWS::EC2::RouteTable", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "Tags": [ { "Key": "Name", "Value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2" } - ] + ], + "VpcId": { + "Ref": "VPCB9E5F0B4" + } } }, "VPCPrivateSubnet2RouteTableAssociation0C73D413": { @@ -360,12 +360,12 @@ "VPCPrivateSubnet2DefaultRouteF4F5CFD2": { "Type": "AWS::EC2::Route", "Properties": { - "RouteTableId": { - "Ref": "VPCPrivateSubnet2RouteTable0A19E10E" - }, "DestinationCidrBlock": "0.0.0.0/0", "NatGatewayId": { "Ref": "VPCPublicSubnet2NATGateway3C070193" + }, + "RouteTableId": { + "Ref": "VPCPrivateSubnet2RouteTable0A19E10E" } } }, @@ -383,11 +383,11 @@ "VPCVPCGW99B986DC": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { - "VpcId": { - "Ref": "VPCB9E5F0B4" - }, "InternetGatewayId": { "Ref": "VPCIGWB7E252D3" + }, + "VpcId": { + "Ref": "VPCB9E5F0B4" } } }, @@ -542,7 +542,7 @@ }, "PrimaryContainer": { "Image": { - "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a" + "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd" }, "ModelDataUrl": { "Fn::Sub": "https://s3.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/126d48fa0e32fbef5078b9d88658b35ad29d4291eb86675a64c75fa4f1338916.gz" @@ -666,7 +666,7 @@ }, "PrimaryContainer": { "Image": { - "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a" + "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd" } } }, @@ -717,6 +717,28 @@ } ] } + }, + "ServerlessEndpointConfig0EF1560E": { + "Type": "AWS::SageMaker::EndpointConfig", + "Properties": { + "ProductionVariants": [ + { + "InitialVariantWeight": 1, + "ModelName": { + "Fn::GetAtt": [ + "ModelWithoutArtifactAndVpcModel9A8AD144", + "ModelName" + ] + }, + "ServerlessConfig": { + "MaxConcurrency": 10, + "MemorySizeInMB": 2048, + "ProvisionedConcurrency": 5 + }, + "VariantName": "serverlessVariant" + } + ] + } } }, "Parameters": { diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/cdk.out b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/cdk.out index 8ecc185e9dbee..523a9aac37cbf 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/cdk.out +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"21.0.0"} \ No newline at end of file +{"version":"48.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integ.json b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integ.json index db28d51fce499..6807a0db0cf98 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integ.json +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "48.0.0", "testCases": { "integtest-endpointconfig/DefaultTest": { "stacks": [ @@ -8,5 +8,6 @@ "assertionStack": "integtest-endpointconfig/DefaultTest/DeployAssert", "assertionStackName": "integtestendpointconfigDefaultTestDeployAssert8D52A281" } - } + }, + "minimumCliVersion": "2.1027.0" } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integtestendpointconfigDefaultTestDeployAssert8D52A281.assets.json b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integtestendpointconfigDefaultTestDeployAssert8D52A281.assets.json index f590921ea8acf..3183603a2a32f 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integtestendpointconfigDefaultTestDeployAssert8D52A281.assets.json +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/integtestendpointconfigDefaultTestDeployAssert8D52A281.assets.json @@ -1,13 +1,14 @@ { - "version": "21.0.0", + "version": "48.0.0", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "displayName": "integtestendpointconfigDefaultTestDeployAssert8D52A281 Template", "source": { "path": "integtestendpointconfigDefaultTestDeployAssert8D52A281.template.json", "packaging": "file" }, "destinations": { - "current_account-current_region": { + "current_account-current_region-d8d86b35": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/manifest.json b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/manifest.json index 21793dce5cc2a..4985656b83d5b 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/manifest.json +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "21.0.0", + "version": "48.0.0", "artifacts": { "aws-cdk-sagemaker-endpointconfig.assets": { "type": "cdk:asset-manifest", @@ -14,10 +14,11 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "aws-cdk-sagemaker-endpointconfig.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/16ab84c598574688eb95944b09c42d17b927d3f0a4725f9a9ccafcce2aefdf53.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/41917d944a0cbc261b42ff261bf561288f84dca1d1401a2d07999bda9cbed993.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -33,12 +34,56 @@ "aws-cdk-sagemaker-endpointconfig.assets" ], "metadata": { + "/aws-cdk-sagemaker-endpointconfig/VPC": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "restrictDefaultSecurityGroup": false + } + } + ], "/aws-cdk-sagemaker-endpointconfig/VPC/Resource": [ { "type": "aws:cdk:logicalId", "data": "VPCB9E5F0B4" } ], + "/aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addNatGateway": [ + "*" + ] + } + } + ], "/aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/Subnet": [ { "type": "aws:cdk:logicalId", @@ -75,6 +120,42 @@ "data": "VPCPublicSubnet1NATGatewayE0556630" } ], + "/aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": true, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addNatGateway": [ + "*" + ] + } + } + ], "/aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/Subnet": [ { "type": "aws:cdk:logicalId", @@ -111,6 +192,34 @@ "data": "VPCPublicSubnet2NATGateway3C070193" } ], + "/aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + } + ], "/aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/Subnet": [ { "type": "aws:cdk:logicalId", @@ -135,6 +244,34 @@ "data": "VPCPrivateSubnet1DefaultRouteAE1D6490" } ], + "/aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:construct", + "data": { + "availabilityZone": "*", + "vpcId": "*", + "cidrBlock": "*", + "mapPublicIpOnLaunch": false, + "ipv6CidrBlock": "*", + "assignIpv6AddressOnCreation": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": {} + } + ], "/aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/Subnet": [ { "type": "aws:cdk:logicalId", @@ -171,18 +308,150 @@ "data": "VPCVPCGW99B986DC" } ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "vpc": "*", + "allowAllOutbound": "*" + } + } + ], "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup/Resource": [ { "type": "aws:cdk:logicalId", "data": "ModelWithArtifactAndVpcSecurityGroupB499C626" } ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + } + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addManagedPolicy": [ + { + "managedPolicyArn": "*" + } + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + } + ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/ImportRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/Resource": [ { "type": "aws:cdk:logicalId", "data": "ModelWithArtifactAndVpcRole6BA49FD3" } ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/DefaultPolicy": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + } + ], "/aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/DefaultPolicy/Resource": [ { "type": "aws:cdk:logicalId", @@ -195,12 +464,119 @@ "data": "ModelWithArtifactAndVpcModel30604F15" } ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + } + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addManagedPolicy": [ + { + "managedPolicyArn": "*" + } + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachInlinePolicy": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addToPrincipalPolicy": [ + {} + ] + } + } + ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/ImportRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/Resource": [ { "type": "aws:cdk:logicalId", "data": "ModelWithoutArtifactAndVpcRole10D89F15" } ], + "/aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/DefaultPolicy": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "attachToRole": [ + "*" + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addStatements": [ + {} + ] + } + } + ], "/aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/DefaultPolicy/Resource": [ { "type": "aws:cdk:logicalId", @@ -213,12 +589,46 @@ "data": "ModelWithoutArtifactAndVpcModel9A8AD144" } ], + "/aws-cdk-sagemaker-endpointconfig/EndpointConfig": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], "/aws-cdk-sagemaker-endpointconfig/EndpointConfig/EndpointConfig": [ { "type": "aws:cdk:logicalId", "data": "EndpointConfigFD7B6F91" } ], + "/aws-cdk-sagemaker-endpointconfig/ServerlessEndpointConfig": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + }, + { + "type": "aws:cdk:analytics:method", + "data": "*" + } + ], + "/aws-cdk-sagemaker-endpointconfig/ServerlessEndpointConfig/EndpointConfig": [ + { + "type": "aws:cdk:logicalId", + "data": "ServerlessEndpointConfig0EF1560E" + } + ], "/aws-cdk-sagemaker-endpointconfig/BootstrapVersion": [ { "type": "aws:cdk:logicalId", @@ -247,6 +657,7 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "integtestendpointconfigDefaultTestDeployAssert8D52A281.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", @@ -286,6 +697,485 @@ "properties": { "file": "tree.json" } + }, + "aws-cdk-lib/feature-flag-report": { + "type": "cdk:feature-flag-report", + "properties": { + "module": "aws-cdk-lib", + "flags": { + "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": { + "recommendedValue": true, + "explanation": "Pass signingProfileName to CfnSigningProfile" + }, + "@aws-cdk/core:newStyleStackSynthesis": { + "recommendedValue": true, + "explanation": "Switch to new stack synthesis method which enables CI/CD", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/core:stackRelativeExports": { + "recommendedValue": true, + "explanation": "Name exports based on the construct paths relative to the stack, rather than the global construct path", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-ecs-patterns:secGroupsDisablesImplicitOpenListener": { + "recommendedValue": true, + "explanation": "Disable implicit openListener when custom security groups are provided" + }, + "@aws-cdk/aws-rds:lowercaseDbIdentifier": { + "recommendedValue": true, + "explanation": "Force lowercasing of RDS Cluster names in CDK", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": { + "recommendedValue": true, + "explanation": "Allow adding/removing multiple UsagePlanKeys independently", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-lambda:recognizeVersionProps": { + "recommendedValue": true, + "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`.", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-lambda:recognizeLayerVersion": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable this feature flag to opt in to the updated logical id calculation for Lambda Version created using the `fn.currentVersion`." + }, + "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": { + "recommendedValue": true, + "explanation": "Enable this feature flag to have cloudfront distributions use the security policy TLSv1.2_2021 by default.", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/core:checkSecretUsage": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable this flag to make it impossible to accidentally use SecretValues in unsafe locations" + }, + "@aws-cdk/core:target-partitions": { + "recommendedValue": [ + "aws", + "aws-cn" + ], + "explanation": "What regions to include in lookup tables of environment agnostic stacks" + }, + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": { + "userValue": true, + "recommendedValue": true, + "explanation": "ECS extensions will automatically add an `awslogs` driver if no logging is specified" + }, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable this feature flag to have Launch Templates generated by the `InstanceRequireImdsv2Aspect` use unique names." + }, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": { + "userValue": true, + "recommendedValue": true, + "explanation": "ARN format used by ECS. In the new ARN format, the cluster name is part of the resource ID." + }, + "@aws-cdk/aws-iam:minimizePolicies": { + "userValue": true, + "recommendedValue": true, + "explanation": "Minimize IAM policies by combining Statements" + }, + "@aws-cdk/core:validateSnapshotRemovalPolicy": { + "userValue": true, + "recommendedValue": true, + "explanation": "Error on snapshot removal policies on resources that do not support it." + }, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": { + "userValue": true, + "recommendedValue": true, + "explanation": "Generate key aliases that include the stack name" + }, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable this feature flag to create an S3 bucket policy by default in cases where an AWS service would automatically create the Policy if one does not exist." + }, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": { + "userValue": true, + "recommendedValue": true, + "explanation": "Restrict KMS key policy for encrypted Queues a bit more" + }, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": { + "userValue": true, + "recommendedValue": true, + "explanation": "Make default CloudWatch Role behavior safe for multiple API Gateways in one environment" + }, + "@aws-cdk/core:enablePartitionLiterals": { + "userValue": true, + "recommendedValue": true, + "explanation": "Make ARNs concrete if AWS partition is known" + }, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": { + "userValue": true, + "recommendedValue": true, + "explanation": "Event Rules may only push to encrypted SQS queues in the same account" + }, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": { + "userValue": true, + "recommendedValue": true, + "explanation": "Avoid setting the \"ECS\" deployment controller when adding a circuit breaker" + }, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable this feature to by default create default policy names for imported roles that depend on the stack the role is in." + }, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": { + "userValue": true, + "recommendedValue": true, + "explanation": "Use S3 Bucket Policy instead of ACLs for Server Access Logging" + }, + "@aws-cdk/aws-route53-patters:useCertificate": { + "userValue": true, + "recommendedValue": true, + "explanation": "Use the official `Certificate` resource instead of `DnsValidatedCertificate`" + }, + "@aws-cdk/customresources:installLatestAwsSdkDefault": { + "userValue": false, + "recommendedValue": false, + "explanation": "Whether to install the latest SDK by default in AwsCustomResource" + }, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": { + "userValue": true, + "recommendedValue": true, + "explanation": "Use unique resource name for Database Proxy" + }, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": { + "userValue": true, + "recommendedValue": true, + "explanation": "Remove CloudWatch alarms from deployment group" + }, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": { + "userValue": true, + "recommendedValue": true, + "explanation": "Include authorizer configuration in the calculation of the API deployment logical ID." + }, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": { + "userValue": true, + "recommendedValue": true, + "explanation": "Define user data for a launch template by default when a machine image is provided." + }, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": { + "userValue": true, + "recommendedValue": true, + "explanation": "SecretTargetAttachments uses the ResourcePolicy of the attached Secret." + }, + "@aws-cdk/aws-redshift:columnId": { + "userValue": true, + "recommendedValue": true, + "explanation": "Whether to use an ID to track Redshift column changes" + }, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable AmazonEMRServicePolicy_v2 managed policies" + }, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": { + "userValue": true, + "recommendedValue": true, + "explanation": "Restrict access to the VPC default security group" + }, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": { + "userValue": true, + "recommendedValue": true, + "explanation": "Generate a unique id for each RequestValidator added to a method" + }, + "@aws-cdk/aws-kms:aliasNameRef": { + "userValue": true, + "recommendedValue": true, + "explanation": "KMS Alias name and keyArn will have implicit reference to KMS Key" + }, + "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enable grant methods on Aliases imported by name to use kms:ResourceAliases condition" + }, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": { + "userValue": true, + "recommendedValue": true, + "explanation": "Generate a launch template when creating an AutoScalingGroup" + }, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": { + "userValue": true, + "recommendedValue": true, + "explanation": "Include the stack prefix in the stack name generation process" + }, + "@aws-cdk/aws-efs:denyAnonymousAccess": { + "userValue": true, + "recommendedValue": true, + "explanation": "EFS denies anonymous clients accesses" + }, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enables support for Multi-AZ with Standby deployment for opensearch domains" + }, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enables aws-lambda-nodejs.Function to use the latest available NodeJs runtime as the default" + }, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, mount targets will have a stable logicalId that is linked to the associated subnet." + }, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, a scope of InstanceParameterGroup for AuroraClusterInstance with each parameters will change." + }, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, will always use the arn for identifiers for CfnSourceApiAssociation in the GraphqlApi construct rather than id." + }, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, creating an RDS database cluster from a snapshot will only render credentials for snapshot credentials." + }, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the CodeCommit source action is using the default branch name 'main'." + }, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the logical ID of a Lambda permission for a Lambda action includes an alarm ID." + }, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enables Pipeline to set the default value for crossAccountKeys to false." + }, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": { + "userValue": true, + "recommendedValue": true, + "explanation": "Enables Pipeline to set the default pipeline type to V2." + }, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, IAM Policy created from KMS key grant will reduce the resource scope to this key only." + }, + "@aws-cdk/pipelines:reduceAssetRoleTrustScope": { + "recommendedValue": true, + "explanation": "Remove the root account principal from PipelineAssetsFileRole trust policy", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-eks:nodegroupNameAttribute": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, nodegroupName attribute of the provisioned EKS NodeGroup will not have the cluster name prefix." + }, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the default volume type of the EBS volume will be GP3" + }, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, remove default deployment alarm settings" + }, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": { + "userValue": false, + "recommendedValue": false, + "explanation": "When enabled, the custom resource used for `AwsCustomResource` will configure the `logApiResponseData` property as true by default" + }, + "@aws-cdk/aws-s3:keepNotificationInImportedBucket": { + "userValue": false, + "recommendedValue": false, + "explanation": "When enabled, Adding notifications to a bucket in the current stack will not remove notification from imported stack." + }, + "@aws-cdk/aws-stepfunctions-tasks:useNewS3UriParametersForBedrockInvokeModelTask": { + "recommendedValue": true, + "explanation": "When enabled, use new props for S3 URI field in task definition of state machine for bedrock invoke model.", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/core:explicitStackTags": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, stack tags need to be assigned explicitly on a Stack." + }, + "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": { + "userValue": false, + "recommendedValue": false, + "explanation": "When set to true along with canContainersAccessInstanceRole=false in ECS cluster, new updated commands will be added to UserData to block container accessing IMDS. **Applicable to Linux only. IMPORTANT: See [details.](#aws-cdkaws-ecsenableImdsBlockingDeprecatedFeature)**" + }, + "@aws-cdk/aws-ecs:disableEcsImdsBlocking": { + "userValue": true, + "recommendedValue": true, + "explanation": "When set to true, CDK synth will throw exception if canContainersAccessInstanceRole is false. **IMPORTANT: See [details.](#aws-cdkaws-ecsdisableEcsImdsBlocking)**" + }, + "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, we will only grant the necessary permissions when users specify cloudwatch log group through logConfiguration" + }, + "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled will allow you to specify a resource policy per replica, and not copy the source table policy to all replicas" + }, + "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, initOptions.timeout and resourceSignalTimeout values will be summed together." + }, + "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, a Lambda authorizer Permission created when using GraphqlApi will be properly scoped with a SourceArn." + }, + "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the value of property `instanceResourceId` in construct `DatabaseInstanceReadReplica` will be set to the correct value which is `DbiResourceId` instead of currently `DbInstanceArn`" + }, + "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, CFN templates added with `cfn-include` will error if the template contains Resource Update or Create policies with CFN Intrinsics that include non-primitive values." + }, + "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, both `@aws-sdk` and `@smithy` packages will be excluded from the Lambda Node.js 18.x runtime to prevent version mismatches in bundled applications." + }, + "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the resource of IAM Run Ecs policy generated by SFN EcsRunTask will reference the definition, instead of constructing ARN." + }, + "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the BastionHost construct will use the latest Amazon Linux 2023 AMI, instead of Amazon Linux 2." + }, + "@aws-cdk/core:aspectStabilization": { + "recommendedValue": true, + "explanation": "When enabled, a stabilization loop will be run when invoking Aspects during synthesis.", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, use a new method for DNS Name of user pool domain target without creating a custom resource." + }, + "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the default security group ingress rules will allow IPv6 ingress from anywhere" + }, + "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the default behaviour of OIDC provider will reject unauthorized connections" + }, + "@aws-cdk/core:enableAdditionalMetadataCollection": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, CDK will expand the scope of usage data collected to better inform CDK development and improve communication for security concerns and emerging issues." + }, + "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": { + "userValue": false, + "recommendedValue": false, + "explanation": "[Deprecated] When enabled, Lambda will create new inline policies with AddToRolePolicy instead of adding to the Default Policy Statement" + }, + "@aws-cdk/aws-s3:setUniqueReplicationRoleName": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, CDK will automatically generate a unique role name that is used for s3 object replication." + }, + "@aws-cdk/pipelines:reduceStageRoleTrustScope": { + "recommendedValue": true, + "explanation": "Remove the root account principal from Stage addActions trust policy", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-events:requireEventBusPolicySid": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, grantPutEventsTo() will use resource policies with Statement IDs for service principals." + }, + "@aws-cdk/core:aspectPrioritiesMutating": { + "userValue": true, + "recommendedValue": true, + "explanation": "When set to true, Aspects added by the construct library on your behalf will be given a priority of MUTATING." + }, + "@aws-cdk/aws-dynamodb:retainTableReplica": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, table replica will be default to the removal policy of source table unless specified otherwise." + }, + "@aws-cdk/cognito:logUserPoolClientSecretValue": { + "recommendedValue": false, + "explanation": "When disabled, the value of the user pool client secret will not be logged in the custom resource lambda function logs." + }, + "@aws-cdk/pipelines:reduceCrossAccountActionRoleTrustScope": { + "recommendedValue": true, + "explanation": "When enabled, scopes down the trust policy for the cross-account action role", + "unconfiguredBehavesLike": { + "v2": true + } + }, + "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the resultWriterV2 property of DistributedMap will be used insted of resultWriter" + }, + "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": { + "userValue": true, + "recommendedValue": true, + "explanation": "Add an S3 trust policy to a KMS key resource policy for SNS subscriptions." + }, + "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, the EgressOnlyGateway resource is only created if private subnets are defined in the dual-stack VPC." + }, + "@aws-cdk/aws-ec2-alpha:useResourceIdForVpcV2Migration": { + "recommendedValue": false, + "explanation": "When enabled, use resource IDs for VPC V2 migration" + }, + "@aws-cdk/aws-s3:publicAccessBlockedByDefault": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, setting any combination of options for BlockPublicAccess will automatically set true for any options not defined." + }, + "@aws-cdk/aws-lambda:useCdkManagedLogGroup": { + "userValue": true, + "recommendedValue": true, + "explanation": "When enabled, CDK creates and manages loggroup for the lambda function" + } + } + } } - } + }, + "minimumCliVersion": "2.1027.0" } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/tree.json b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/tree.json index 7dd71dcb0e6e4..0e5dd73222481 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/tree.json +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.js.snapshot/tree.json @@ -1,1259 +1 @@ -{ - "version": "tree-0.1", - "tree": { - "id": "App", - "path": "", - "children": { - "aws-cdk-sagemaker-endpointconfig": { - "id": "aws-cdk-sagemaker-endpointconfig", - "path": "aws-cdk-sagemaker-endpointconfig", - "children": { - "VPC": { - "id": "VPC", - "path": "aws-cdk-sagemaker-endpointconfig/VPC", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::VPC", - "aws:cdk:cloudformation:props": { - "cidrBlock": "10.0.0.0/16", - "enableDnsHostnames": true, - "enableDnsSupport": true, - "instanceTenancy": "default", - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnVPC", - "version": "0.0.0" - } - }, - "PublicSubnet1": { - "id": "PublicSubnet1", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1", - "children": { - "Subnet": { - "id": "Subnet", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/Subnet", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Subnet", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "availabilityZone": { - "Fn::Select": [ - 0, - { - "Fn::GetAZs": "" - } - ] - }, - "cidrBlock": "10.0.0.0/18", - "mapPublicIpOnLaunch": true, - "tags": [ - { - "key": "aws-cdk:subnet-name", - "value": "Public" - }, - { - "key": "aws-cdk:subnet-type", - "value": "Public" - }, - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnet", - "version": "0.0.0" - } - }, - "Acl": { - "id": "Acl", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/Acl", - "constructInfo": { - "fqn": "@aws-cdk/core.Resource", - "version": "0.0.0" - } - }, - "RouteTable": { - "id": "RouteTable", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/RouteTable", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRouteTable", - "version": "0.0.0" - } - }, - "RouteTableAssociation": { - "id": "RouteTableAssociation", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/RouteTableAssociation", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPublicSubnet1RouteTableFEE4B781" - }, - "subnetId": { - "Ref": "VPCPublicSubnet1SubnetB4246D30" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnetRouteTableAssociation", - "version": "0.0.0" - } - }, - "DefaultRoute": { - "id": "DefaultRoute", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/DefaultRoute", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Route", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPublicSubnet1RouteTableFEE4B781" - }, - "destinationCidrBlock": "0.0.0.0/0", - "gatewayId": { - "Ref": "VPCIGWB7E252D3" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRoute", - "version": "0.0.0" - } - }, - "EIP": { - "id": "EIP", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/EIP", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::EIP", - "aws:cdk:cloudformation:props": { - "domain": "vpc", - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnEIP", - "version": "0.0.0" - } - }, - "NATGateway": { - "id": "NATGateway", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/NATGateway", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway", - "aws:cdk:cloudformation:props": { - "subnetId": { - "Ref": "VPCPublicSubnet1SubnetB4246D30" - }, - "allocationId": { - "Fn::GetAtt": [ - "VPCPublicSubnet1EIP6AD938E8", - "AllocationId" - ] - }, - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnNatGateway", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.PublicSubnet", - "version": "0.0.0" - } - }, - "PublicSubnet2": { - "id": "PublicSubnet2", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2", - "children": { - "Subnet": { - "id": "Subnet", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/Subnet", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Subnet", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "availabilityZone": { - "Fn::Select": [ - 1, - { - "Fn::GetAZs": "" - } - ] - }, - "cidrBlock": "10.0.64.0/18", - "mapPublicIpOnLaunch": true, - "tags": [ - { - "key": "aws-cdk:subnet-name", - "value": "Public" - }, - { - "key": "aws-cdk:subnet-type", - "value": "Public" - }, - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnet", - "version": "0.0.0" - } - }, - "Acl": { - "id": "Acl", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/Acl", - "constructInfo": { - "fqn": "@aws-cdk/core.Resource", - "version": "0.0.0" - } - }, - "RouteTable": { - "id": "RouteTable", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/RouteTable", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRouteTable", - "version": "0.0.0" - } - }, - "RouteTableAssociation": { - "id": "RouteTableAssociation", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/RouteTableAssociation", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPublicSubnet2RouteTable6F1A15F1" - }, - "subnetId": { - "Ref": "VPCPublicSubnet2Subnet74179F39" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnetRouteTableAssociation", - "version": "0.0.0" - } - }, - "DefaultRoute": { - "id": "DefaultRoute", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/DefaultRoute", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Route", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPublicSubnet2RouteTable6F1A15F1" - }, - "destinationCidrBlock": "0.0.0.0/0", - "gatewayId": { - "Ref": "VPCIGWB7E252D3" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRoute", - "version": "0.0.0" - } - }, - "EIP": { - "id": "EIP", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/EIP", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::EIP", - "aws:cdk:cloudformation:props": { - "domain": "vpc", - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnEIP", - "version": "0.0.0" - } - }, - "NATGateway": { - "id": "NATGateway", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/NATGateway", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway", - "aws:cdk:cloudformation:props": { - "subnetId": { - "Ref": "VPCPublicSubnet2Subnet74179F39" - }, - "allocationId": { - "Fn::GetAtt": [ - "VPCPublicSubnet2EIP4947BC00", - "AllocationId" - ] - }, - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnNatGateway", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.PublicSubnet", - "version": "0.0.0" - } - }, - "PrivateSubnet1": { - "id": "PrivateSubnet1", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1", - "children": { - "Subnet": { - "id": "Subnet", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/Subnet", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Subnet", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "availabilityZone": { - "Fn::Select": [ - 0, - { - "Fn::GetAZs": "" - } - ] - }, - "cidrBlock": "10.0.128.0/18", - "mapPublicIpOnLaunch": false, - "tags": [ - { - "key": "aws-cdk:subnet-name", - "value": "Private" - }, - { - "key": "aws-cdk:subnet-type", - "value": "Private" - }, - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnet", - "version": "0.0.0" - } - }, - "Acl": { - "id": "Acl", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/Acl", - "constructInfo": { - "fqn": "@aws-cdk/core.Resource", - "version": "0.0.0" - } - }, - "RouteTable": { - "id": "RouteTable", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/RouteTable", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRouteTable", - "version": "0.0.0" - } - }, - "RouteTableAssociation": { - "id": "RouteTableAssociation", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/RouteTableAssociation", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPrivateSubnet1RouteTableBE8A6027" - }, - "subnetId": { - "Ref": "VPCPrivateSubnet1Subnet8BCA10E0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnetRouteTableAssociation", - "version": "0.0.0" - } - }, - "DefaultRoute": { - "id": "DefaultRoute", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/DefaultRoute", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Route", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPrivateSubnet1RouteTableBE8A6027" - }, - "destinationCidrBlock": "0.0.0.0/0", - "natGatewayId": { - "Ref": "VPCPublicSubnet1NATGatewayE0556630" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRoute", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.PrivateSubnet", - "version": "0.0.0" - } - }, - "PrivateSubnet2": { - "id": "PrivateSubnet2", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2", - "children": { - "Subnet": { - "id": "Subnet", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/Subnet", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Subnet", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "availabilityZone": { - "Fn::Select": [ - 1, - { - "Fn::GetAZs": "" - } - ] - }, - "cidrBlock": "10.0.192.0/18", - "mapPublicIpOnLaunch": false, - "tags": [ - { - "key": "aws-cdk:subnet-name", - "value": "Private" - }, - { - "key": "aws-cdk:subnet-type", - "value": "Private" - }, - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnet", - "version": "0.0.0" - } - }, - "Acl": { - "id": "Acl", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/Acl", - "constructInfo": { - "fqn": "@aws-cdk/core.Resource", - "version": "0.0.0" - } - }, - "RouteTable": { - "id": "RouteTable", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/RouteTable", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRouteTable", - "version": "0.0.0" - } - }, - "RouteTableAssociation": { - "id": "RouteTableAssociation", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/RouteTableAssociation", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPrivateSubnet2RouteTable0A19E10E" - }, - "subnetId": { - "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSubnetRouteTableAssociation", - "version": "0.0.0" - } - }, - "DefaultRoute": { - "id": "DefaultRoute", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/DefaultRoute", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::Route", - "aws:cdk:cloudformation:props": { - "routeTableId": { - "Ref": "VPCPrivateSubnet2RouteTable0A19E10E" - }, - "destinationCidrBlock": "0.0.0.0/0", - "natGatewayId": { - "Ref": "VPCPublicSubnet2NATGateway3C070193" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnRoute", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.PrivateSubnet", - "version": "0.0.0" - } - }, - "IGW": { - "id": "IGW", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/IGW", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway", - "aws:cdk:cloudformation:props": { - "tags": [ - { - "key": "Name", - "value": "aws-cdk-sagemaker-endpointconfig/VPC" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnInternetGateway", - "version": "0.0.0" - } - }, - "VPCGW": { - "id": "VPCGW", - "path": "aws-cdk-sagemaker-endpointconfig/VPC/VPCGW", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment", - "aws:cdk:cloudformation:props": { - "vpcId": { - "Ref": "VPCB9E5F0B4" - }, - "internetGatewayId": { - "Ref": "VPCIGWB7E252D3" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnVPCGatewayAttachment", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.Vpc", - "version": "0.0.0" - } - }, - "ModelWithArtifactAndVpc": { - "id": "ModelWithArtifactAndVpc", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc", - "children": { - "SecurityGroup": { - "id": "SecurityGroup", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup", - "aws:cdk:cloudformation:props": { - "groupDescription": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup", - "securityGroupEgress": [ - { - "cidrIp": "0.0.0.0/0", - "description": "Allow all outbound traffic by default", - "ipProtocol": "-1" - } - ], - "vpcId": { - "Ref": "VPCB9E5F0B4" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.CfnSecurityGroup", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ec2.SecurityGroup", - "version": "0.0.0" - } - }, - "Role": { - "id": "Role", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::IAM::Role", - "aws:cdk:cloudformation:props": { - "assumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "sagemaker.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "managedPolicyArns": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::aws:policy/AmazonSageMakerFullAccess" - ] - ] - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnRole", - "version": "0.0.0" - } - }, - "DefaultPolicy": { - "id": "DefaultPolicy", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/DefaultPolicy", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/DefaultPolicy/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::IAM::Policy", - "aws:cdk:cloudformation:props": { - "policyDocument": { - "Statement": [ - { - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:BatchGetImage", - "ecr:GetDownloadUrlForLayer" - ], - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":ecr:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":repository/", - { - "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}" - } - ] - ] - } - }, - { - "Action": "ecr:GetAuthorizationToken", - "Effect": "Allow", - "Resource": "*" - }, - { - "Action": [ - "s3:GetBucket*", - "s3:GetObject*", - "s3:List*" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":s3:::", - { - "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" - }, - "/*" - ] - ] - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":s3:::", - { - "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" - } - ] - ] - } - ] - } - ], - "Version": "2012-10-17" - }, - "policyName": "ModelWithArtifactAndVpcRoleDefaultPolicyC77E2AFA", - "roles": [ - { - "Ref": "ModelWithArtifactAndVpcRole6BA49FD3" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnPolicy", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Policy", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Role", - "version": "0.0.0" - } - }, - "ModelImage7ffa8020b99fe9d130a903251c36866d": { - "id": "ModelImage7ffa8020b99fe9d130a903251c36866d", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelImage7ffa8020b99fe9d130a903251c36866d", - "children": { - "Staging": { - "id": "Staging", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelImage7ffa8020b99fe9d130a903251c36866d/Staging", - "constructInfo": { - "fqn": "@aws-cdk/core.AssetStaging", - "version": "0.0.0" - } - }, - "Repository": { - "id": "Repository", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelImage7ffa8020b99fe9d130a903251c36866d/Repository", - "constructInfo": { - "fqn": "@aws-cdk/aws-ecr.RepositoryBase", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-ecr-assets.DockerImageAsset", - "version": "0.0.0" - } - }, - "ModelData412d61f9c984d1aff5ee358daf994d58": { - "id": "ModelData412d61f9c984d1aff5ee358daf994d58", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelData412d61f9c984d1aff5ee358daf994d58", - "children": { - "Stage": { - "id": "Stage", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelData412d61f9c984d1aff5ee358daf994d58/Stage", - "constructInfo": { - "fqn": "@aws-cdk/core.AssetStaging", - "version": "0.0.0" - } - }, - "AssetBucket": { - "id": "AssetBucket", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelData412d61f9c984d1aff5ee358daf994d58/AssetBucket", - "constructInfo": { - "fqn": "@aws-cdk/aws-s3.BucketBase", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-s3-assets.Asset", - "version": "0.0.0" - } - }, - "Model": { - "id": "Model", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Model", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::SageMaker::Model", - "aws:cdk:cloudformation:props": { - "executionRoleArn": { - "Fn::GetAtt": [ - "ModelWithArtifactAndVpcRole6BA49FD3", - "Arn" - ] - }, - "primaryContainer": { - "image": { - "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a" - }, - "modelDataUrl": { - "Fn::Sub": "https://s3.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/126d48fa0e32fbef5078b9d88658b35ad29d4291eb86675a64c75fa4f1338916.gz" - } - }, - "vpcConfig": { - "subnets": [ - { - "Ref": "VPCPrivateSubnet1Subnet8BCA10E0" - }, - { - "Ref": "VPCPrivateSubnet2SubnetCFCDAA7A" - } - ], - "securityGroupIds": [ - { - "Fn::GetAtt": [ - "ModelWithArtifactAndVpcSecurityGroupB499C626", - "GroupId" - ] - } - ] - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-sagemaker.CfnModel", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-sagemaker.Model", - "version": "0.0.0" - } - }, - "ModelWithoutArtifactAndVpc": { - "id": "ModelWithoutArtifactAndVpc", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc", - "children": { - "Role": { - "id": "Role", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::IAM::Role", - "aws:cdk:cloudformation:props": { - "assumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "sagemaker.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "managedPolicyArns": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::aws:policy/AmazonSageMakerFullAccess" - ] - ] - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnRole", - "version": "0.0.0" - } - }, - "DefaultPolicy": { - "id": "DefaultPolicy", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/DefaultPolicy", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/DefaultPolicy/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::IAM::Policy", - "aws:cdk:cloudformation:props": { - "policyDocument": { - "Statement": [ - { - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:BatchGetImage", - "ecr:GetDownloadUrlForLayer" - ], - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":ecr:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":repository/", - { - "Fn::Sub": "cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}" - } - ] - ] - } - }, - { - "Action": "ecr:GetAuthorizationToken", - "Effect": "Allow", - "Resource": "*" - } - ], - "Version": "2012-10-17" - }, - "policyName": "ModelWithoutArtifactAndVpcRoleDefaultPolicy88BAF094", - "roles": [ - { - "Ref": "ModelWithoutArtifactAndVpcRole10D89F15" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnPolicy", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Policy", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Role", - "version": "0.0.0" - } - }, - "Model": { - "id": "Model", - "path": "aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Model", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::SageMaker::Model", - "aws:cdk:cloudformation:props": { - "executionRoleArn": { - "Fn::GetAtt": [ - "ModelWithoutArtifactAndVpcRole10D89F15", - "Arn" - ] - }, - "primaryContainer": { - "image": { - "Fn::Sub": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:442a71de95281cb26bd41da567c79060206108b97bdde93cb4ce5f213f50013a" - } - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-sagemaker.CfnModel", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-sagemaker.Model", - "version": "0.0.0" - } - }, - "EndpointConfig": { - "id": "EndpointConfig", - "path": "aws-cdk-sagemaker-endpointconfig/EndpointConfig", - "children": { - "EndpointConfig": { - "id": "EndpointConfig", - "path": "aws-cdk-sagemaker-endpointconfig/EndpointConfig/EndpointConfig", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::SageMaker::EndpointConfig", - "aws:cdk:cloudformation:props": { - "productionVariants": [ - { - "initialInstanceCount": 1, - "initialVariantWeight": 1, - "instanceType": "ml.m5.large", - "modelName": { - "Fn::GetAtt": [ - "ModelWithArtifactAndVpcModel30604F15", - "ModelName" - ] - }, - "variantName": "firstVariant" - }, - { - "initialInstanceCount": 1, - "initialVariantWeight": 1, - "instanceType": "ml.t2.medium", - "modelName": { - "Fn::GetAtt": [ - "ModelWithArtifactAndVpcModel30604F15", - "ModelName" - ] - }, - "variantName": "secondVariant" - }, - { - "initialInstanceCount": 1, - "initialVariantWeight": 2, - "instanceType": "ml.t2.medium", - "modelName": { - "Fn::GetAtt": [ - "ModelWithoutArtifactAndVpcModel9A8AD144", - "ModelName" - ] - }, - "variantName": "thirdVariant" - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-sagemaker.CfnEndpointConfig", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-sagemaker.EndpointConfig", - "version": "0.0.0" - } - }, - "BootstrapVersion": { - "id": "BootstrapVersion", - "path": "aws-cdk-sagemaker-endpointconfig/BootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnParameter", - "version": "0.0.0" - } - }, - "CheckBootstrapVersion": { - "id": "CheckBootstrapVersion", - "path": "aws-cdk-sagemaker-endpointconfig/CheckBootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnRule", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.Stack", - "version": "0.0.0" - } - }, - "integtest-endpointconfig": { - "id": "integtest-endpointconfig", - "path": "integtest-endpointconfig", - "children": { - "DefaultTest": { - "id": "DefaultTest", - "path": "integtest-endpointconfig/DefaultTest", - "children": { - "Default": { - "id": "Default", - "path": "integtest-endpointconfig/DefaultTest/Default", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.140" - } - }, - "DeployAssert": { - "id": "DeployAssert", - "path": "integtest-endpointconfig/DefaultTest/DeployAssert", - "children": { - "BootstrapVersion": { - "id": "BootstrapVersion", - "path": "integtest-endpointconfig/DefaultTest/DeployAssert/BootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnParameter", - "version": "0.0.0" - } - }, - "CheckBootstrapVersion": { - "id": "CheckBootstrapVersion", - "path": "integtest-endpointconfig/DefaultTest/DeployAssert/CheckBootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnRule", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.Stack", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.IntegTestCase", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.IntegTest", - "version": "0.0.0" - } - }, - "Tree": { - "id": "Tree", - "path": "Tree", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.140" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.App", - "version": "0.0.0" - } - } -} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"aws-cdk-sagemaker-endpointconfig":{"id":"aws-cdk-sagemaker-endpointconfig","path":"aws-cdk-sagemaker-endpointconfig","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"VPC":{"id":"VPC","path":"aws-cdk-sagemaker-endpointconfig/VPC","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.Vpc","version":"0.0.0","metadata":[{"restrictDefaultSecurityGroup":false}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-sagemaker-endpointconfig/VPC/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPC","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPC","aws:cdk:cloudformation:props":{"cidrBlock":"10.0.0.0/16","enableDnsHostnames":true,"enableDnsSupport":true,"instanceTenancy":"default","tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC"}]}}},"PublicSubnet1":{"id":"PublicSubnet1","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.0.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet1RouteTableFEE4B781"}}}},"EIP":{"id":"EIP","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet1EIP6AD938E8","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet1SubnetB4246D30"},"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet1"}]}}}}},"PublicSubnet2":{"id":"PublicSubnet2","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PublicSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":true,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{},{"addNatGateway":["*"]}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.64.0/18","mapPublicIpOnLaunch":true,"tags":[{"key":"aws-cdk:subnet-name","value":"Public"},{"key":"aws-cdk:subnet-type","value":"Public"},{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","gatewayId":{"Ref":"VPCIGWB7E252D3"},"routeTableId":{"Ref":"VPCPublicSubnet2RouteTable6F1A15F1"}}}},"EIP":{"id":"EIP","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/EIP","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnEIP","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::EIP","aws:cdk:cloudformation:props":{"domain":"vpc","tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2"}]}}},"NATGateway":{"id":"NATGateway","path":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2/NATGateway","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnNatGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::NatGateway","aws:cdk:cloudformation:props":{"allocationId":{"Fn::GetAtt":["VPCPublicSubnet2EIP4947BC00","AllocationId"]},"subnetId":{"Ref":"VPCPublicSubnet2Subnet74179F39"},"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PublicSubnet2"}]}}}}},"PrivateSubnet1":{"id":"PrivateSubnet1","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[0,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.128.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"},"subnetId":{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet1/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet1NATGatewayE0556630"},"routeTableId":{"Ref":"VPCPrivateSubnet1RouteTableBE8A6027"}}}}}},"PrivateSubnet2":{"id":"PrivateSubnet2","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.PrivateSubnet","version":"0.0.0","metadata":[{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{"availabilityZone":"*","vpcId":"*","cidrBlock":"*","mapPublicIpOnLaunch":false,"ipv6CidrBlock":"*","assignIpv6AddressOnCreation":"*"},{}]},"children":{"Subnet":{"id":"Subnet","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/Subnet","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Subnet","aws:cdk:cloudformation:props":{"availabilityZone":{"Fn::Select":[1,{"Fn::GetAZs":""}]},"cidrBlock":"10.0.192.0/18","mapPublicIpOnLaunch":false,"tags":[{"key":"aws-cdk:subnet-name","value":"Private"},{"key":"aws-cdk:subnet-type","value":"Private"},{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"Acl":{"id":"Acl","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/Acl","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":[]}},"RouteTable":{"id":"RouteTable","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/RouteTable","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRouteTable","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::RouteTable","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}},"RouteTableAssociation":{"id":"RouteTableAssociation","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/RouteTableAssociation","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SubnetRouteTableAssociation","aws:cdk:cloudformation:props":{"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"},"subnetId":{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}}}},"DefaultRoute":{"id":"DefaultRoute","path":"aws-cdk-sagemaker-endpointconfig/VPC/PrivateSubnet2/DefaultRoute","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnRoute","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::Route","aws:cdk:cloudformation:props":{"destinationCidrBlock":"0.0.0.0/0","natGatewayId":{"Ref":"VPCPublicSubnet2NATGateway3C070193"},"routeTableId":{"Ref":"VPCPrivateSubnet2RouteTable0A19E10E"}}}}}},"IGW":{"id":"IGW","path":"aws-cdk-sagemaker-endpointconfig/VPC/IGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnInternetGateway","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::InternetGateway","aws:cdk:cloudformation:props":{"tags":[{"key":"Name","value":"aws-cdk-sagemaker-endpointconfig/VPC"}]}}},"VPCGW":{"id":"VPCGW","path":"aws-cdk-sagemaker-endpointconfig/VPC/VPCGW","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::VPCGatewayAttachment","aws:cdk:cloudformation:props":{"internetGatewayId":{"Ref":"VPCIGWB7E252D3"},"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"ModelWithArtifactAndVpc":{"id":"ModelWithArtifactAndVpc","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc","constructInfo":{"fqn":"@aws-cdk/aws-sagemaker-alpha.Model","version":"0.0.0","metadata":["*","*"]},"children":{"SecurityGroup":{"id":"SecurityGroup","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.SecurityGroup","version":"0.0.0","metadata":[{"vpc":"*","allowAllOutbound":"*"}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_ec2.CfnSecurityGroup","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::EC2::SecurityGroup","aws:cdk:cloudformation:props":{"groupDescription":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/SecurityGroup","securityGroupEgress":[{"cidrIp":"0.0.0.0/0","description":"Allow all outbound traffic by default","ipProtocol":"-1"}],"vpcId":{"Ref":"VPCB9E5F0B4"}}}}}},"Role":{"id":"Role","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"sagemaker.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSageMakerFullAccess"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"},{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"},"/*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":s3:::",{"Fn::Sub":"cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"}]]}]}],"Version":"2012-10-17"},"policyName":"ModelWithArtifactAndVpcRoleDefaultPolicyC77E2AFA","roles":[{"Ref":"ModelWithArtifactAndVpcRole6BA49FD3"}]}}}}}}},"ModelImage70e881962cb181ccd50da9c12b3370f1":{"id":"ModelImage70e881962cb181ccd50da9c12b3370f1","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelImage70e881962cb181ccd50da9c12b3370f1","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr_assets.DockerImageAsset","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelImage70e881962cb181ccd50da9c12b3370f1/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Repository":{"id":"Repository","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelImage70e881962cb181ccd50da9c12b3370f1/Repository","constructInfo":{"fqn":"aws-cdk-lib.aws_ecr.RepositoryBase","version":"0.0.0","metadata":[]}}}},"ModelData3a5d8a5c26d90a81d20fad7f530f24e2":{"id":"ModelData3a5d8a5c26d90a81d20fad7f530f24e2","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelData3a5d8a5c26d90a81d20fad7f530f24e2","constructInfo":{"fqn":"aws-cdk-lib.aws_s3_assets.Asset","version":"0.0.0"},"children":{"Stage":{"id":"Stage","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelData3a5d8a5c26d90a81d20fad7f530f24e2/Stage","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"AssetBucket":{"id":"AssetBucket","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/ModelData3a5d8a5c26d90a81d20fad7f530f24e2/AssetBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketBase","version":"0.0.0","metadata":[]}}}},"Model":{"id":"Model","path":"aws-cdk-sagemaker-endpointconfig/ModelWithArtifactAndVpc/Model","constructInfo":{"fqn":"aws-cdk-lib.aws_sagemaker.CfnModel","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SageMaker::Model","aws:cdk:cloudformation:props":{"executionRoleArn":{"Fn::GetAtt":["ModelWithArtifactAndVpcRole6BA49FD3","Arn"]},"primaryContainer":{"image":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd"},"modelDataUrl":{"Fn::Sub":"https://s3.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/126d48fa0e32fbef5078b9d88658b35ad29d4291eb86675a64c75fa4f1338916.gz"}},"vpcConfig":{"subnets":[{"Ref":"VPCPrivateSubnet1Subnet8BCA10E0"},{"Ref":"VPCPrivateSubnet2SubnetCFCDAA7A"}],"securityGroupIds":[{"Fn::GetAtt":["ModelWithArtifactAndVpcSecurityGroupB499C626","GroupId"]}]}}}}}},"ModelWithoutArtifactAndVpc":{"id":"ModelWithoutArtifactAndVpc","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc","constructInfo":{"fqn":"@aws-cdk/aws-sagemaker-alpha.Model","version":"0.0.0","metadata":["*","*"]},"children":{"Role":{"id":"Role","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"sagemaker.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/AmazonSageMakerFullAccess"]]}]}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["ecr:BatchCheckLayerAvailability","ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":ecr:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":repository/",{"Fn::Sub":"cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}"}]]}},{"Action":"ecr:GetAuthorizationToken","Effect":"Allow","Resource":"*"}],"Version":"2012-10-17"},"policyName":"ModelWithoutArtifactAndVpcRoleDefaultPolicy88BAF094","roles":[{"Ref":"ModelWithoutArtifactAndVpcRole10D89F15"}]}}}}}}},"Model":{"id":"Model","path":"aws-cdk-sagemaker-endpointconfig/ModelWithoutArtifactAndVpc/Model","constructInfo":{"fqn":"aws-cdk-lib.aws_sagemaker.CfnModel","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SageMaker::Model","aws:cdk:cloudformation:props":{"executionRoleArn":{"Fn::GetAtt":["ModelWithoutArtifactAndVpcRole10D89F15","Arn"]},"primaryContainer":{"image":{"Fn::Sub":"${AWS::AccountId}.dkr.ecr.${AWS::Region}.${AWS::URLSuffix}/cdk-hnb659fds-container-assets-${AWS::AccountId}-${AWS::Region}:98e27853307092de1d03c86e89a5ead7aab9f8ea8f6722e4f113f04f34a329fd"}}}}}}},"EndpointConfig":{"id":"EndpointConfig","path":"aws-cdk-sagemaker-endpointconfig/EndpointConfig","constructInfo":{"fqn":"@aws-cdk/aws-sagemaker-alpha.EndpointConfig","version":"0.0.0","metadata":["*","*","*","*"]},"children":{"EndpointConfig":{"id":"EndpointConfig","path":"aws-cdk-sagemaker-endpointconfig/EndpointConfig/EndpointConfig","constructInfo":{"fqn":"aws-cdk-lib.aws_sagemaker.CfnEndpointConfig","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SageMaker::EndpointConfig","aws:cdk:cloudformation:props":{"productionVariants":[{"initialInstanceCount":1,"initialVariantWeight":1,"instanceType":"ml.m5.large","modelName":{"Fn::GetAtt":["ModelWithArtifactAndVpcModel30604F15","ModelName"]},"variantName":"firstVariant"},{"initialInstanceCount":1,"initialVariantWeight":1,"instanceType":"ml.t2.medium","modelName":{"Fn::GetAtt":["ModelWithArtifactAndVpcModel30604F15","ModelName"]},"variantName":"secondVariant"},{"initialInstanceCount":1,"initialVariantWeight":2,"instanceType":"ml.t2.medium","modelName":{"Fn::GetAtt":["ModelWithoutArtifactAndVpcModel9A8AD144","ModelName"]},"variantName":"thirdVariant"}]}}}}},"ServerlessEndpointConfig":{"id":"ServerlessEndpointConfig","path":"aws-cdk-sagemaker-endpointconfig/ServerlessEndpointConfig","constructInfo":{"fqn":"@aws-cdk/aws-sagemaker-alpha.EndpointConfig","version":"0.0.0","metadata":["*","*"]},"children":{"EndpointConfig":{"id":"EndpointConfig","path":"aws-cdk-sagemaker-endpointconfig/ServerlessEndpointConfig/EndpointConfig","constructInfo":{"fqn":"aws-cdk-lib.aws_sagemaker.CfnEndpointConfig","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::SageMaker::EndpointConfig","aws:cdk:cloudformation:props":{"productionVariants":[{"initialVariantWeight":1,"modelName":{"Fn::GetAtt":["ModelWithoutArtifactAndVpcModel9A8AD144","ModelName"]},"variantName":"serverlessVariant","serverlessConfig":{"maxConcurrency":10,"memorySizeInMb":2048,"provisionedConcurrency":5}}]}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"aws-cdk-sagemaker-endpointconfig/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"aws-cdk-sagemaker-endpointconfig/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"integtest-endpointconfig":{"id":"integtest-endpointconfig","path":"integtest-endpointconfig","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"integtest-endpointconfig/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"integtest-endpointconfig/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"integtest-endpointconfig/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"integtest-endpointconfig/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"integtest-endpointconfig/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.ts b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.ts index e5cc110991c0c..f138c1f7e5e7b 100644 --- a/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.ts +++ b/packages/@aws-cdk/aws-sagemaker-alpha/test/integ.endpoint-config.ts @@ -8,8 +8,7 @@ import * as sagemaker from '../lib'; * Stack verification steps: * aws sagemaker describe-endpoint-config --endpoint-config-name * - * The above command will result in the following output. - * + * For instance-based endpoint config, the above command will result in the following output: * { * "EndpointConfigName": "EndpointConfig...", * "EndpointConfigArn": "arn:aws:sagemaker:...", @@ -38,6 +37,25 @@ import * as sagemaker from '../lib'; * ], * "CreationTime": "..." * } + * + * For serverless endpoint config, the command will show: + * { + * "EndpointConfigName": "ServerlessEndpointConfig...", + * "EndpointConfigArn": "arn:aws:sagemaker:...", + * "ProductionVariants": [ + * { + * "VariantName": "serverlessVariant", + * "ModelName": "ModelWithoutArtifactAndVpcModel...", + * "InitialVariantWeight": 1.0, + * "ServerlessConfig": { + * "MaxConcurrency": 10, + * "MemorySizeInMB": 2048, + * "ProvisionedConcurrency": 5 + * } + * } + * ], + * "CreationTime": "..." + * } */ const app = new cdk.App(); @@ -73,6 +91,22 @@ endpointConfig.addInstanceProductionVariant({ initialVariantWeight: 2.0, }); +// Test serverless endpoint configuration +const serverlessEndpointConfig = new sagemaker.EndpointConfig(stack, 'ServerlessEndpointConfig', { + serverlessProductionVariant: { + model: modelWithoutArtifactAndVpc, + variantName: 'serverlessVariant', + maxConcurrency: 10, + memorySizeInMB: 2048, + provisionedConcurrency: 5, + }, +}); + +// Ensure serverless endpoint config is used +serverlessEndpointConfig.node.addValidation({ + validate: () => [], +}); + new IntegTest(app, 'integtest-endpointconfig', { testCases: [stack], }); diff --git a/readme_serverless_section.md b/readme_serverless_section.md new file mode 100644 index 0000000000000..3f51388a1d979 --- /dev/null +++ b/readme_serverless_section.md @@ -0,0 +1,31 @@ +### Serverless Inference + +Amazon SageMaker Serverless Inference is a purpose-built inference option that makes it easy for you to deploy and scale ML models. Serverless endpoints automatically launch compute resources and scale them in and out depending on traffic, eliminating the need to choose instance types or manage scaling policies. + +To create a serverless endpoint configuration, use the `serverlessProductionVariant` property: + +```typescript +import * as sagemaker from '@aws-cdk/aws-sagemaker-alpha'; + +declare const model: sagemaker.Model; + +const endpointConfig = new sagemaker.EndpointConfig(this, 'ServerlessEndpointConfig', { + serverlessProductionVariant: { + model: model, + variantName: 'serverlessVariant', + maxConcurrency: 10, + memorySizeInMB: 2048, + provisionedConcurrency: 5, // optional + }, +}); +``` + +Serverless inference is ideal for workloads with intermittent or unpredictable traffic patterns. You can configure: + +- `maxConcurrency`: Maximum concurrent invocations (1-200) +- `memorySizeInMB`: Memory allocation in 1GB increments (1024, 2048, 3072, 4096, 5120, or 6144 MB) +- `provisionedConcurrency`: Optional pre-warmed capacity to reduce cold starts + +**Note**: Provisioned concurrency incurs charges even when the endpoint is not processing requests. Use it only when you need to minimize cold start latency. + +You cannot mix serverless and instance-based variants in the same endpoint configuration. \ No newline at end of file