@go-to-k/cdkd 0.248.0 → 0.250.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{asg-provider-Dbl1_mwT.js → asg-provider-er3xGYRo.js} +5 -6
- package/dist/{asg-provider-Dbl1_mwT.js.map → asg-provider-er3xGYRo.js.map} +1 -1
- package/dist/cli.js +1203 -292
- package/dist/cli.js.map +1 -1
- package/dist/{deploy-engine-D6U-Cm8B.js → deploy-engine-D-gBbMiZ.js} +1491 -274
- package/dist/deploy-engine-D-gBbMiZ.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/{logger-BzO-joNR.js → logger-BYMEE-BS.js} +1 -1
- package/dist/{logger-BzO-joNR.js.map → logger-BYMEE-BS.js.map} +1 -1
- package/package.json +5 -6
- package/dist/aws-clients-B15NAPbL.js +0 -435
- package/dist/aws-clients-B15NAPbL.js.map +0 -1
- package/dist/deploy-engine-D6U-Cm8B.js.map +0 -1
- package/dist/ec2-termination-protection-q-WGWgxa.js +0 -683
- package/dist/ec2-termination-protection-q-WGWgxa.js.map +0 -1
- package/dist/expected-bucket-owner-BjEfUnkA.js +0 -87
- package/dist/expected-bucket-owner-BjEfUnkA.js.map +0 -1
- package/dist/rolldown-runtime-CjeV3_4I.js +0 -18
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { $ as getDockerCmd, A as DiffCalculator, B as buildAssetRedirectMap, C as findActionableSilentDrops, Ct as resolveBucketRegion, D as refStateLookupFromResource, E as cfnRefValueFromPhysicalId, F as rebuildClientForBucketRegion, G as BOOTSTRAP_MARKER_PREFIX, H as loadPublishableAssetManifest, I as shouldRetainResource, J as parseBootstrapMarker, K as ensureAssetStorage, L as AssetPublisher, M as TemplateParser, N as LockManager, O as WAFv2WebACLProvider, P as S3StateBackend, Q as formatDockerLoginError, R as stringifyValue, S as ProviderRegistry, T as IntrinsicFunctionResolver, U as rewriteTemplateAssetReferences, V as createAssetRedirectResolver, W as AssetModeResolver, X as validateContainerRepoName, Y as validateAssetBucketName, Z as buildDockerImage, _ as green, _t as CFN_TEMPLATE_URL_LIMIT, a as withRetry, at as synthesisStatusMessage, b as IAMRoleProvider, bt as uploadCfnTemplate, c as computeImplicitDeleteEdges, ct as resolveApp, d as isStatefulRecreateTargetSync, dt as resolveSkipPrefix, et as runDockerForeground, f as renderStatefulReason, ft as resolveStateBucketWithDefault, g as gray, gt as CFN_TEMPLATE_BODY_LIMIT, h as cyan, ht as warnDeprecatedNoPrefixCliFlag, i as withResourceDeadline, it as Synthesizer, j as DagBuilder, k as applyRoleArnIfSet, l as extractDeploymentEventError, lt as resolveAutoAssetStorage, m as bold, mt as resolveUseCdkBootstrapAssets, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as AssetManifestLoader, o as isRetryableTransientError, ot as getDefaultStateBucketName, p as formatResourceLine, pt as resolveStateBucketWithDefaultAndSource, q as getBootstrapMarkerKey, r as DeployEngine, rt as getDockerImageBySourceHash, s as IMPLICIT_DELETE_DEPENDENCIES, st as getLegacyStateBucketName, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as runDockerStreaming, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, ut as resolveCaptureObservedState, v as red, vt as MIGRATE_TMP_PREFIX, w as CloudControlProvider, x as collectInlinePolicyNamesManagedBySiblings, xt as AssemblyReader, y as yellow, yt as findLargeInlineResources, z as WorkGraph } from "./deploy-engine-D6U-Cm8B.js";
|
|
6
|
-
import { t as expectedOwnerParam } from "./expected-bucket-owner-BjEfUnkA.js";
|
|
7
|
-
import { t as ASGProvider } from "./asg-provider-Dbl1_mwT.js";
|
|
2
|
+
import { $ as ensureAssetStorage, A as WAFv2WebACLProvider, B as LockManager, Bt as LocalInvokeBuildError$1, C as findActionableSilentDrops, Ct as CFN_TEMPLATE_BODY_LIMIT, D as IntrinsicFunctionResolver, Dt as uploadCfnTemplate, E as isTerminationProtectionPropagationError, Et as findLargeInlineResources, F as assertRegionMatch, Ft as setAwsClients, G as stringifyValue, Gt as NestedStackChildDirectDestroyError, H as rebuildClientForBucketRegion, Ht as LocalStartServiceError, I as applyRoleArnIfSet, J as createAssetRedirectResolver, Jt as ResourceTimeoutError, K as WorkGraph, Kt as PartialFailureError, L as DiffCalculator, Lt as CdkdError, M as matchesCdkPath, Mt as AwsClients, N as normalizeAwsTagsToCfn, Nt as getAwsClients, O as cfnRefValueFromPhysicalId, Ot as expectedOwnerParam, P as resolveExplicitPhysicalId, Pt as resetAwsClients, Q as BOOTSTRAP_MARKER_PREFIX, R as DagBuilder, S as ProviderRegistry, St as warnDeprecatedNoPrefixCliFlag, T as disableInstanceApiTermination, Tt as MIGRATE_TMP_PREFIX, U as shouldRetainResource, V as S3StateBackend, Vt as LocalMigrateError, W as AssetPublisher, Wt as MissingCdkCliError, X as rewriteTemplateAssetReferences, Xt as StackHasActiveImportsError, Y as loadPublishableAssetManifest, Yt as ResourceUpdateNotSupportedError, Z as AssetModeResolver, Zt as StackTerminationProtectionError, _ as green, _t as resolveCaptureObservedState, a as withRetry, at as formatDockerLoginError, b as IAMRoleProvider, bt as resolveStateBucketWithDefaultAndSource, c as computeImplicitDeleteEdges, ct as runDockerStreaming, d as isStatefulRecreateTargetSync, dt as Synthesizer, et as getBootstrapMarkerKey, f as renderStatefulReason, ft as synthesisStatusMessage, g as gray, gt as resolveAutoAssetStorage, h as cyan, ht as resolveApp, i as withResourceDeadline, it as buildDockerImage, j as CDK_PATH_TAG, jt as resolveBucketRegion, k as refStateLookupFromResource, kt as AssemblyReader, l as extractDeploymentEventError, lt as AssetManifestLoader, m as bold, mt as getLegacyStateBucketName, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as normalizeAwsError, nt as validateAssetBucketName, o as isRetryableTransientError, ot as getDockerCmd, p as formatResourceLine, pt as getDefaultStateBucketName, q as buildAssetRedirectMap, qt as ProvisioningError, r as DeployEngine, rn as withErrorHandling, rt as validateContainerRepoName, s as IMPLICIT_DELETE_DEPENDENCIES, st as runDockerForeground, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as parseBootstrapMarker, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, ut as getDockerImageBySourceHash, v as red, vt as resolveSkipPrefix, w as CloudControlProvider, wt as CFN_TEMPLATE_URL_LIMIT, x as collectInlinePolicyNamesManagedBySiblings, xt as resolveUseCdkBootstrapAssets, y as yellow, yt as resolveStateBucketWithDefault, z as TemplateParser } from "./deploy-engine-D-gBbMiZ.js";
|
|
3
|
+
import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
|
|
4
|
+
import { t as ASGProvider } from "./asg-provider-er3xGYRo.js";
|
|
8
5
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
9
6
|
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
10
7
|
import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListBucketsCommand, ListDirectoryBucketsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -60,7 +57,7 @@ import { AddTagsToStreamCommand, CreateStreamCommand, DecreaseStreamRetentionPer
|
|
|
60
57
|
import { CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, ResourceNotFoundException as ResourceNotFoundException$9, SchedulerClient, UpdateScheduleCommand } from "@aws-sdk/client-scheduler";
|
|
61
58
|
import { AccessPointNotFound, CreateAccessPointCommand, CreateFileSystemCommand, CreateMountTargetCommand, DeleteAccessPointCommand, DeleteFileSystemCommand, DeleteMountTargetCommand, DescribeAccessPointsCommand, DescribeBackupPolicyCommand, DescribeFileSystemPolicyCommand, DescribeFileSystemsCommand, DescribeLifecycleConfigurationCommand, DescribeMountTargetSecurityGroupsCommand, DescribeMountTargetsCommand, EFSClient, FileSystemNotFound, ModifyMountTargetSecurityGroupsCommand, MountTargetNotFound, PutBackupPolicyCommand, PutFileSystemPolicyCommand, PutLifecycleConfigurationCommand, UpdateFileSystemCommand, UpdateFileSystemProtectionCommand } from "@aws-sdk/client-efs";
|
|
62
59
|
import { CreateFileSystemCommand as CreateFileSystemCommand$1, CreateFileSystemFromBackupCommand, DeleteFileSystemCommand as DeleteFileSystemCommand$1, DescribeFileSystemsCommand as DescribeFileSystemsCommand$1, FSxClient, FileSystemNotFound as FileSystemNotFound$1, TagResourceCommand as TagResourceCommand$18, UntagResourceCommand as UntagResourceCommand$18, UpdateFileSystemCommand as UpdateFileSystemCommand$1 } from "@aws-sdk/client-fsx";
|
|
63
|
-
import { AddTagsCommand as AddTagsCommand$1, DescribeClusterCommand, EMRClient, InvalidRequestException, ListClustersCommand as ListClustersCommand$1, ListInstanceFleetsCommand, ListInstanceGroupsCommand, ModifyClusterCommand, PutAutoTerminationPolicyCommand, PutManagedScalingPolicyCommand, RemoveAutoTerminationPolicyCommand, RemoveManagedScalingPolicyCommand, RemoveTagsCommand as RemoveTagsCommand$1, RunJobFlowCommand, SetTerminationProtectionCommand, SetVisibleToAllUsersCommand, TerminateJobFlowsCommand } from "@aws-sdk/client-emr";
|
|
60
|
+
import { AddInstanceFleetCommand, AddInstanceGroupsCommand, AddTagsCommand as AddTagsCommand$1, DescribeClusterCommand, EMRClient, InvalidRequestException, ListClustersCommand as ListClustersCommand$1, ListInstanceFleetsCommand, ListInstanceGroupsCommand, ModifyClusterCommand, ModifyInstanceFleetCommand, ModifyInstanceGroupsCommand, PutAutoScalingPolicyCommand, PutAutoTerminationPolicyCommand, PutManagedScalingPolicyCommand, RemoveAutoScalingPolicyCommand, RemoveAutoTerminationPolicyCommand, RemoveManagedScalingPolicyCommand, RemoveTagsCommand as RemoveTagsCommand$1, RunJobFlowCommand, SetTerminationProtectionCommand, SetVisibleToAllUsersCommand, TerminateJobFlowsCommand } from "@aws-sdk/client-emr";
|
|
64
61
|
import { CreateDeliveryStreamCommand, DeleteDeliveryStreamCommand, DescribeDeliveryStreamCommand, FirehoseClient, ListDeliveryStreamsCommand, ListTagsForDeliveryStreamCommand, ResourceNotFoundException as ResourceNotFoundException$10, TagDeliveryStreamCommand, UntagDeliveryStreamCommand, UpdateDestinationCommand } from "@aws-sdk/client-firehose";
|
|
65
62
|
import { AddTagsCommand as AddTagsCommand$2, CloudTrailClient, CreateTrailCommand, DeleteTrailCommand, GetEventSelectorsCommand, GetInsightSelectorsCommand, GetTrailCommand, GetTrailStatusCommand, ListTagsCommand as ListTagsCommand$1, ListTrailsCommand, PutEventSelectorsCommand, PutInsightSelectorsCommand, RemoveTagsCommand as RemoveTagsCommand$2, StartLoggingCommand, StopLoggingCommand, TrailNotFoundException, UpdateTrailCommand } from "@aws-sdk/client-cloudtrail";
|
|
66
63
|
import { BatchGetProjectsCommand, CodeBuildClient, CreateProjectCommand, DeleteProjectCommand, ListProjectsCommand, ResourceNotFoundException as ResourceNotFoundException$11, UpdateProjectCommand } from "@aws-sdk/client-codebuild";
|
|
@@ -321,7 +318,7 @@ function validateResourceTimeouts(opts) {
|
|
|
321
318
|
} else if (typeof globalWarn === "number" && globalWarn >= 18e5) throw new Error(`--resource-warn-after (${formatMs(globalWarn)}) must be less than --resource-timeout (default ${formatMs(DEFAULT_RESOURCE_TIMEOUT_MS)}). Pass --resource-timeout <duration> alongside it to raise the deadline.`);
|
|
322
319
|
const warnPerType = opts.resourceWarnAfter?.perTypeMs ?? {};
|
|
323
320
|
const timeoutPerType = timeout?.perTypeMs ?? {};
|
|
324
|
-
const types = new Set([...Object.keys(warnPerType), ...Object.keys(timeoutPerType)]);
|
|
321
|
+
const types = /* @__PURE__ */ new Set([...Object.keys(warnPerType), ...Object.keys(timeoutPerType)]);
|
|
325
322
|
for (const t of types) {
|
|
326
323
|
const explicitPerTypeWarn = warnPerType[t];
|
|
327
324
|
const explicitPerTypeTimeout = timeoutPerType[t];
|
|
@@ -1891,7 +1888,7 @@ const FLUSH_INTERVAL_MS = 2e3;
|
|
|
1891
1888
|
const FLUSH_EVENT_THRESHOLD = 50;
|
|
1892
1889
|
/** Build-time cdkd version, with a dev fallback for non-built contexts. */
|
|
1893
1890
|
function getCdkdVersion() {
|
|
1894
|
-
return "0.
|
|
1891
|
+
return "0.250.0";
|
|
1895
1892
|
}
|
|
1896
1893
|
/**
|
|
1897
1894
|
* Generate a time-sortable unique run id, e.g.
|
|
@@ -2924,7 +2921,7 @@ function collectCrossStackRefs(node, onRef) {
|
|
|
2924
2921
|
var IAMPolicyProvider = class {
|
|
2925
2922
|
iamClient;
|
|
2926
2923
|
logger = getLogger().child("IAMPolicyProvider");
|
|
2927
|
-
handledProperties = new Map([["AWS::IAM::Policy", new Set([
|
|
2924
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::IAM::Policy", /* @__PURE__ */ new Set([
|
|
2928
2925
|
"PolicyName",
|
|
2929
2926
|
"PolicyDocument",
|
|
2930
2927
|
"Roles",
|
|
@@ -3258,7 +3255,7 @@ var IAMPolicyProvider = class {
|
|
|
3258
3255
|
var IAMManagedPolicyProvider = class {
|
|
3259
3256
|
iamClient;
|
|
3260
3257
|
logger = getLogger().child("IAMManagedPolicyProvider");
|
|
3261
|
-
handledProperties = new Map([["AWS::IAM::ManagedPolicy", new Set([
|
|
3258
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::IAM::ManagedPolicy", /* @__PURE__ */ new Set([
|
|
3262
3259
|
"ManagedPolicyName",
|
|
3263
3260
|
"Description",
|
|
3264
3261
|
"Path",
|
|
@@ -3759,7 +3756,7 @@ function derivePolicyNameFromArn(arn) {
|
|
|
3759
3756
|
var IAMInstanceProfileProvider = class {
|
|
3760
3757
|
iamClient;
|
|
3761
3758
|
logger = getLogger().child("IAMInstanceProfileProvider");
|
|
3762
|
-
handledProperties = new Map([["AWS::IAM::InstanceProfile", new Set([
|
|
3759
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::IAM::InstanceProfile", /* @__PURE__ */ new Set([
|
|
3763
3760
|
"InstanceProfileName",
|
|
3764
3761
|
"Path",
|
|
3765
3762
|
"Roles"
|
|
@@ -3979,8 +3976,8 @@ var IAMInstanceProfileProvider = class {
|
|
|
3979
3976
|
var IAMUserGroupProvider = class {
|
|
3980
3977
|
iamClient;
|
|
3981
3978
|
logger = getLogger().child("IAMUserGroupProvider");
|
|
3982
|
-
handledProperties = new Map([
|
|
3983
|
-
["AWS::IAM::User", new Set([
|
|
3979
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
3980
|
+
["AWS::IAM::User", /* @__PURE__ */ new Set([
|
|
3984
3981
|
"UserName",
|
|
3985
3982
|
"Path",
|
|
3986
3983
|
"Tags",
|
|
@@ -3990,13 +3987,13 @@ var IAMUserGroupProvider = class {
|
|
|
3990
3987
|
"Policies",
|
|
3991
3988
|
"PermissionsBoundary"
|
|
3992
3989
|
])],
|
|
3993
|
-
["AWS::IAM::Group", new Set([
|
|
3990
|
+
["AWS::IAM::Group", /* @__PURE__ */ new Set([
|
|
3994
3991
|
"GroupName",
|
|
3995
3992
|
"Path",
|
|
3996
3993
|
"ManagedPolicyArns",
|
|
3997
3994
|
"Policies"
|
|
3998
3995
|
])],
|
|
3999
|
-
["AWS::IAM::UserToGroupAddition", new Set(["GroupName", "Users"])]
|
|
3996
|
+
["AWS::IAM::UserToGroupAddition", /* @__PURE__ */ new Set(["GroupName", "Users"])]
|
|
4000
3997
|
]);
|
|
4001
3998
|
constructor() {
|
|
4002
3999
|
const awsClients = getAwsClients();
|
|
@@ -4880,7 +4877,7 @@ var IAMUserGroupProvider = class {
|
|
|
4880
4877
|
var S3BucketProvider = class {
|
|
4881
4878
|
s3Client;
|
|
4882
4879
|
logger = getLogger().child("S3BucketProvider");
|
|
4883
|
-
handledProperties = new Map([["AWS::S3::Bucket", new Set([
|
|
4880
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::S3::Bucket", /* @__PURE__ */ new Set([
|
|
4884
4881
|
"BucketName",
|
|
4885
4882
|
"VersioningConfiguration",
|
|
4886
4883
|
"Tags",
|
|
@@ -4901,7 +4898,7 @@ var S3BucketProvider = class {
|
|
|
4901
4898
|
"ObjectLockConfiguration",
|
|
4902
4899
|
"ObjectLockEnabled"
|
|
4903
4900
|
])]]);
|
|
4904
|
-
unhandledByDesign = new Map([["AWS::S3::Bucket", new Map([["AccessControl", "Legacy canned ACL; AWS disables ACLs by default since 2023-04 — use BucketOwnershipControls + BucketPolicy / PublicAccessBlockConfiguration instead"]])]]);
|
|
4901
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::S3::Bucket", /* @__PURE__ */ new Map([["AccessControl", "Legacy canned ACL; AWS disables ACLs by default since 2023-04 — use BucketOwnershipControls + BucketPolicy / PublicAccessBlockConfiguration instead"]])]]);
|
|
4905
4902
|
constructor() {
|
|
4906
4903
|
const awsClients = getAwsClients();
|
|
4907
4904
|
this.s3Client = awsClients.s3;
|
|
@@ -6460,7 +6457,7 @@ function findTemplateCanonicalUser(awsStmt, templateStmts) {
|
|
|
6460
6457
|
var S3BucketPolicyProvider = class {
|
|
6461
6458
|
s3Client;
|
|
6462
6459
|
logger = getLogger().child("S3BucketPolicyProvider");
|
|
6463
|
-
handledProperties = new Map([["AWS::S3::BucketPolicy", new Set(["Bucket", "PolicyDocument"])]]);
|
|
6460
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::S3::BucketPolicy", /* @__PURE__ */ new Set(["Bucket", "PolicyDocument"])]]);
|
|
6464
6461
|
constructor() {
|
|
6465
6462
|
const awsClients = getAwsClients();
|
|
6466
6463
|
this.s3Client = awsClients.s3;
|
|
@@ -6846,7 +6843,7 @@ var SQSQueueProvider = class {
|
|
|
6846
6843
|
sqsClient;
|
|
6847
6844
|
stsClient;
|
|
6848
6845
|
logger = getLogger().child("SQSQueueProvider");
|
|
6849
|
-
handledProperties = new Map([["AWS::SQS::Queue", new Set([
|
|
6846
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SQS::Queue", /* @__PURE__ */ new Set([
|
|
6850
6847
|
"QueueName",
|
|
6851
6848
|
"VisibilityTimeout",
|
|
6852
6849
|
"MaximumMessageSize",
|
|
@@ -7189,7 +7186,7 @@ var SQSQueueProvider = class {
|
|
|
7189
7186
|
var SQSQueuePolicyProvider = class {
|
|
7190
7187
|
sqsClient;
|
|
7191
7188
|
logger = getLogger().child("SQSQueuePolicyProvider");
|
|
7192
|
-
handledProperties = new Map([["AWS::SQS::QueuePolicy", new Set(["Queues", "PolicyDocument"])]]);
|
|
7189
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SQS::QueuePolicy", /* @__PURE__ */ new Set(["Queues", "PolicyDocument"])]]);
|
|
7193
7190
|
constructor() {
|
|
7194
7191
|
const awsClients = getAwsClients();
|
|
7195
7192
|
this.sqsClient = awsClients.sqs;
|
|
@@ -7396,7 +7393,7 @@ function isSqsQueueUrl(value) {
|
|
|
7396
7393
|
var SNSTopicProvider = class {
|
|
7397
7394
|
snsClient;
|
|
7398
7395
|
logger = getLogger().child("SNSTopicProvider");
|
|
7399
|
-
handledProperties = new Map([["AWS::SNS::Topic", new Set([
|
|
7396
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SNS::Topic", /* @__PURE__ */ new Set([
|
|
7400
7397
|
"TopicName",
|
|
7401
7398
|
"FifoTopic",
|
|
7402
7399
|
"ContentBasedDeduplication",
|
|
@@ -8029,7 +8026,7 @@ function mapDeliveryStatusLogging(attrs, stateCaseMap = /* @__PURE__ */ new Map(
|
|
|
8029
8026
|
var SNSSubscriptionProvider = class {
|
|
8030
8027
|
snsClient;
|
|
8031
8028
|
logger = getLogger().child("SNSSubscriptionProvider");
|
|
8032
|
-
handledProperties = new Map([["AWS::SNS::Subscription", new Set([
|
|
8029
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SNS::Subscription", /* @__PURE__ */ new Set([
|
|
8033
8030
|
"TopicArn",
|
|
8034
8031
|
"Protocol",
|
|
8035
8032
|
"Endpoint",
|
|
@@ -8041,7 +8038,7 @@ var SNSSubscriptionProvider = class {
|
|
|
8041
8038
|
"ReplayPolicy",
|
|
8042
8039
|
"SubscriptionRoleArn"
|
|
8043
8040
|
])]]);
|
|
8044
|
-
unhandledByDesign = new Map([["AWS::SNS::Subscription", new Map([["Region", "CFn-only cross-region subscription hint; cdkd uses the SDK client region directly and has no per-resource region override"]])]]);
|
|
8041
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::SNS::Subscription", /* @__PURE__ */ new Map([["Region", "CFn-only cross-region subscription hint; cdkd uses the SDK client region directly and has no per-resource region override"]])]]);
|
|
8045
8042
|
constructor() {
|
|
8046
8043
|
const awsClients = getAwsClients();
|
|
8047
8044
|
this.snsClient = awsClients.sns;
|
|
@@ -8210,7 +8207,7 @@ var SNSSubscriptionProvider = class {
|
|
|
8210
8207
|
*/
|
|
8211
8208
|
var SNSTopicPolicyProvider = class {
|
|
8212
8209
|
logger = getLogger().child("SNSTopicPolicyProvider");
|
|
8213
|
-
handledProperties = new Map([["AWS::SNS::TopicPolicy", new Set(["Topics", "PolicyDocument"])]]);
|
|
8210
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SNS::TopicPolicy", /* @__PURE__ */ new Set(["Topics", "PolicyDocument"])]]);
|
|
8214
8211
|
/**
|
|
8215
8212
|
* Create an SNS topic policy
|
|
8216
8213
|
*
|
|
@@ -8446,7 +8443,7 @@ var LambdaFunctionProvider = class {
|
|
|
8446
8443
|
lambdaClient;
|
|
8447
8444
|
ec2Client;
|
|
8448
8445
|
logger = getLogger().child("LambdaFunctionProvider");
|
|
8449
|
-
handledProperties = new Map([["AWS::Lambda::Function", new Set([
|
|
8446
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::Function", /* @__PURE__ */ new Set([
|
|
8450
8447
|
"FunctionName",
|
|
8451
8448
|
"Code",
|
|
8452
8449
|
"Role",
|
|
@@ -9284,7 +9281,7 @@ var LambdaFunctionProvider = class {
|
|
|
9284
9281
|
var LambdaPermissionProvider = class {
|
|
9285
9282
|
lambdaClient;
|
|
9286
9283
|
logger = getLogger().child("LambdaPermissionProvider");
|
|
9287
|
-
handledProperties = new Map([["AWS::Lambda::Permission", new Set([
|
|
9284
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::Permission", /* @__PURE__ */ new Set([
|
|
9288
9285
|
"FunctionName",
|
|
9289
9286
|
"Action",
|
|
9290
9287
|
"Principal",
|
|
@@ -9506,7 +9503,7 @@ var LambdaPermissionProvider = class {
|
|
|
9506
9503
|
var LambdaUrlProvider = class {
|
|
9507
9504
|
lambdaClient;
|
|
9508
9505
|
logger = getLogger().child("LambdaUrlProvider");
|
|
9509
|
-
handledProperties = new Map([["AWS::Lambda::Url", new Set([
|
|
9506
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::Url", /* @__PURE__ */ new Set([
|
|
9510
9507
|
"TargetFunctionArn",
|
|
9511
9508
|
"AuthType",
|
|
9512
9509
|
"Qualifier",
|
|
@@ -9757,12 +9754,12 @@ function classifyEventSourceFromProperties(properties) {
|
|
|
9757
9754
|
DocumentDBEventSourceConfig: properties["DocumentDBEventSourceConfig"]
|
|
9758
9755
|
});
|
|
9759
9756
|
}
|
|
9760
|
-
const KINDS_WITH_FUNCTION_RESPONSE_TYPES = new Set([
|
|
9757
|
+
const KINDS_WITH_FUNCTION_RESPONSE_TYPES = /* @__PURE__ */ new Set([
|
|
9761
9758
|
"sqs",
|
|
9762
9759
|
"kinesis",
|
|
9763
9760
|
"dynamodb"
|
|
9764
9761
|
]);
|
|
9765
|
-
const KINDS_WITH_SOURCE_ACCESS_CONFIGURATIONS = new Set([
|
|
9762
|
+
const KINDS_WITH_SOURCE_ACCESS_CONFIGURATIONS = /* @__PURE__ */ new Set([
|
|
9766
9763
|
"kafka",
|
|
9767
9764
|
"mq",
|
|
9768
9765
|
"documentdb"
|
|
@@ -9775,7 +9772,7 @@ const KINDS_WITH_SOURCE_ACCESS_CONFIGURATIONS = new Set([
|
|
|
9775
9772
|
* so the removal-on-UPDATE path only restores `0` for these kinds — see the
|
|
9776
9773
|
* comment at the `MaximumBatchingWindowInSeconds` clear in `update()`.
|
|
9777
9774
|
*/
|
|
9778
|
-
const KINDS_WITH_ZERO_BATCHING_WINDOW_DEFAULT = new Set([
|
|
9775
|
+
const KINDS_WITH_ZERO_BATCHING_WINDOW_DEFAULT = /* @__PURE__ */ new Set([
|
|
9779
9776
|
"sqs",
|
|
9780
9777
|
"kinesis",
|
|
9781
9778
|
"dynamodb"
|
|
@@ -9788,7 +9785,7 @@ const KINDS_WITH_ZERO_BATCHING_WINDOW_DEFAULT = new Set([
|
|
|
9788
9785
|
* removal-on-UPDATE default-restore path is gated on this set (see the numeric
|
|
9789
9786
|
* restores in `update()`).
|
|
9790
9787
|
*/
|
|
9791
|
-
const KINDS_WITH_STREAM_NUMERICS = new Set(["kinesis", "dynamodb"]);
|
|
9788
|
+
const KINDS_WITH_STREAM_NUMERICS = /* @__PURE__ */ new Set(["kinesis", "dynamodb"]);
|
|
9792
9789
|
/**
|
|
9793
9790
|
* AWS Lambda Event Source Mapping Provider
|
|
9794
9791
|
*
|
|
@@ -9799,7 +9796,7 @@ const KINDS_WITH_STREAM_NUMERICS = new Set(["kinesis", "dynamodb"]);
|
|
|
9799
9796
|
var LambdaEventSourceMappingProvider = class {
|
|
9800
9797
|
lambdaClient;
|
|
9801
9798
|
logger = getLogger().child("LambdaEventSourceMappingProvider");
|
|
9802
|
-
handledProperties = new Map([["AWS::Lambda::EventSourceMapping", new Set([
|
|
9799
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::EventSourceMapping", /* @__PURE__ */ new Set([
|
|
9803
9800
|
"FunctionName",
|
|
9804
9801
|
"EventSourceArn",
|
|
9805
9802
|
"BatchSize",
|
|
@@ -10124,7 +10121,7 @@ var LambdaEventSourceMappingProvider = class {
|
|
|
10124
10121
|
var LambdaLayerVersionProvider = class {
|
|
10125
10122
|
lambdaClient;
|
|
10126
10123
|
logger = getLogger().child("LambdaLayerVersionProvider");
|
|
10127
|
-
handledProperties = new Map([["AWS::Lambda::LayerVersion", new Set([
|
|
10124
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::LayerVersion", /* @__PURE__ */ new Set([
|
|
10128
10125
|
"LayerName",
|
|
10129
10126
|
"Content",
|
|
10130
10127
|
"CompatibleRuntimes",
|
|
@@ -10357,7 +10354,7 @@ var LambdaLayerVersionProvider = class {
|
|
|
10357
10354
|
var LambdaEventInvokeConfigProvider = class {
|
|
10358
10355
|
lambdaClient;
|
|
10359
10356
|
logger = getLogger().child("LambdaEventInvokeConfigProvider");
|
|
10360
|
-
handledProperties = new Map([["AWS::Lambda::EventInvokeConfig", new Set([
|
|
10357
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::EventInvokeConfig", /* @__PURE__ */ new Set([
|
|
10361
10358
|
"FunctionName",
|
|
10362
10359
|
"Qualifier",
|
|
10363
10360
|
"MaximumEventAgeInSeconds",
|
|
@@ -10569,7 +10566,7 @@ function mapSSESpecification(raw) {
|
|
|
10569
10566
|
var DynamoDBTableProvider = class {
|
|
10570
10567
|
dynamoDBClient;
|
|
10571
10568
|
logger = getLogger().child("DynamoDBTableProvider");
|
|
10572
|
-
handledProperties = new Map([["AWS::DynamoDB::Table", new Set([
|
|
10569
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::DynamoDB::Table", /* @__PURE__ */ new Set([
|
|
10573
10570
|
"TableName",
|
|
10574
10571
|
"KeySchema",
|
|
10575
10572
|
"AttributeDefinitions",
|
|
@@ -10590,7 +10587,7 @@ var DynamoDBTableProvider = class {
|
|
|
10590
10587
|
"KinesisStreamSpecification",
|
|
10591
10588
|
"ContributorInsightsSpecification"
|
|
10592
10589
|
])]]);
|
|
10593
|
-
unhandledByDesign = new Map([["AWS::DynamoDB::Table", new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]])]]);
|
|
10590
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::DynamoDB::Table", /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]])]]);
|
|
10594
10591
|
constructor() {
|
|
10595
10592
|
const awsClients = getAwsClients();
|
|
10596
10593
|
this.dynamoDBClient = awsClients.dynamoDB;
|
|
@@ -11510,7 +11507,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
11510
11507
|
* UpdateTable success.
|
|
11511
11508
|
*/
|
|
11512
11509
|
attributeCache = /* @__PURE__ */ new Map();
|
|
11513
|
-
handledProperties = new Map([["AWS::DynamoDB::GlobalTable", new Set([
|
|
11510
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::DynamoDB::GlobalTable", /* @__PURE__ */ new Set([
|
|
11514
11511
|
"TableName",
|
|
11515
11512
|
"KeySchema",
|
|
11516
11513
|
"AttributeDefinitions",
|
|
@@ -12842,7 +12839,7 @@ var LogsLogGroupProvider = class {
|
|
|
12842
12839
|
logsClient;
|
|
12843
12840
|
stsClient;
|
|
12844
12841
|
logger = getLogger().child("LogsLogGroupProvider");
|
|
12845
|
-
handledProperties = new Map([["AWS::Logs::LogGroup", new Set([
|
|
12842
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Logs::LogGroup", /* @__PURE__ */ new Set([
|
|
12846
12843
|
"LogGroupName",
|
|
12847
12844
|
"KmsKeyId",
|
|
12848
12845
|
"RetentionInDays",
|
|
@@ -13234,7 +13231,7 @@ var LogsLogGroupProvider = class {
|
|
|
13234
13231
|
var CloudWatchAlarmProvider = class {
|
|
13235
13232
|
cloudWatchClient;
|
|
13236
13233
|
logger = getLogger().child("CloudWatchAlarmProvider");
|
|
13237
|
-
handledProperties = new Map([["AWS::CloudWatch::Alarm", new Set([
|
|
13234
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CloudWatch::Alarm", /* @__PURE__ */ new Set([
|
|
13238
13235
|
"AlarmName",
|
|
13239
13236
|
"ComparisonOperator",
|
|
13240
13237
|
"EvaluationPeriods",
|
|
@@ -13272,7 +13269,7 @@ var CloudWatchAlarmProvider = class {
|
|
|
13272
13269
|
* SDK create input OR the CDK L1 is not backfillable), they are classified
|
|
13273
13270
|
* unhandled-by-design rather than left as a "not yet implemented" TODO.
|
|
13274
13271
|
*/
|
|
13275
|
-
unhandledByDesign = new Map([["AWS::CloudWatch::Alarm", new Map([["EvaluationCriteria", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."], ["EvaluationInterval", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."]])]]);
|
|
13272
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::CloudWatch::Alarm", /* @__PURE__ */ new Map([["EvaluationCriteria", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."], ["EvaluationInterval", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."]])]]);
|
|
13276
13273
|
constructor() {
|
|
13277
13274
|
const awsClients = getAwsClients();
|
|
13278
13275
|
this.cloudWatchClient = awsClients.cloudWatch;
|
|
@@ -13576,7 +13573,7 @@ var CloudWatchAlarmProvider = class {
|
|
|
13576
13573
|
var SecretsManagerSecretProvider = class {
|
|
13577
13574
|
smClient;
|
|
13578
13575
|
logger = getLogger().child("SecretsManagerSecretProvider");
|
|
13579
|
-
handledProperties = new Map([["AWS::SecretsManager::Secret", new Set([
|
|
13576
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SecretsManager::Secret", /* @__PURE__ */ new Set([
|
|
13580
13577
|
"Name",
|
|
13581
13578
|
"GenerateSecretString",
|
|
13582
13579
|
"SecretString",
|
|
@@ -13858,7 +13855,7 @@ var SecretsManagerSecretProvider = class {
|
|
|
13858
13855
|
var SSMParameterProvider = class {
|
|
13859
13856
|
ssmClient;
|
|
13860
13857
|
logger = getLogger().child("SSMParameterProvider");
|
|
13861
|
-
handledProperties = new Map([["AWS::SSM::Parameter", new Set([
|
|
13858
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::SSM::Parameter", /* @__PURE__ */ new Set([
|
|
13862
13859
|
"Name",
|
|
13863
13860
|
"Type",
|
|
13864
13861
|
"Value",
|
|
@@ -14169,7 +14166,7 @@ var SSMParameterProvider = class {
|
|
|
14169
14166
|
var EventBridgeRuleProvider = class {
|
|
14170
14167
|
eventBridgeClient;
|
|
14171
14168
|
logger = getLogger().child("EventBridgeRuleProvider");
|
|
14172
|
-
handledProperties = new Map([["AWS::Events::Rule", new Set([
|
|
14169
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Events::Rule", /* @__PURE__ */ new Set([
|
|
14173
14170
|
"Name",
|
|
14174
14171
|
"Description",
|
|
14175
14172
|
"EventBusName",
|
|
@@ -14564,7 +14561,7 @@ function sanitizeDeadLetterConfig(value) {
|
|
|
14564
14561
|
var EventBridgeBusProvider = class {
|
|
14565
14562
|
eventBridgeClient;
|
|
14566
14563
|
logger = getLogger().child("EventBridgeBusProvider");
|
|
14567
|
-
handledProperties = new Map([["AWS::Events::EventBus", new Set([
|
|
14564
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Events::EventBus", /* @__PURE__ */ new Set([
|
|
14568
14565
|
"Name",
|
|
14569
14566
|
"Tags",
|
|
14570
14567
|
"EventSourceName",
|
|
@@ -14817,24 +14814,24 @@ var EventBridgeBusProvider = class {
|
|
|
14817
14814
|
var EC2Provider = class {
|
|
14818
14815
|
ec2Client;
|
|
14819
14816
|
logger = getLogger().child("EC2Provider");
|
|
14820
|
-
handledProperties = new Map([
|
|
14821
|
-
["AWS::EC2::VPC", new Set([
|
|
14817
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
14818
|
+
["AWS::EC2::VPC", /* @__PURE__ */ new Set([
|
|
14822
14819
|
"CidrBlock",
|
|
14823
14820
|
"InstanceTenancy",
|
|
14824
14821
|
"EnableDnsHostnames",
|
|
14825
14822
|
"EnableDnsSupport",
|
|
14826
14823
|
"Tags"
|
|
14827
14824
|
])],
|
|
14828
|
-
["AWS::EC2::Subnet", new Set([
|
|
14825
|
+
["AWS::EC2::Subnet", /* @__PURE__ */ new Set([
|
|
14829
14826
|
"VpcId",
|
|
14830
14827
|
"CidrBlock",
|
|
14831
14828
|
"AvailabilityZone",
|
|
14832
14829
|
"MapPublicIpOnLaunch",
|
|
14833
14830
|
"Tags"
|
|
14834
14831
|
])],
|
|
14835
|
-
["AWS::EC2::InternetGateway", new Set(["Tags"])],
|
|
14836
|
-
["AWS::EC2::VPCGatewayAttachment", new Set(["VpcId", "InternetGatewayId"])],
|
|
14837
|
-
["AWS::EC2::NatGateway", new Set([
|
|
14832
|
+
["AWS::EC2::InternetGateway", /* @__PURE__ */ new Set(["Tags"])],
|
|
14833
|
+
["AWS::EC2::VPCGatewayAttachment", /* @__PURE__ */ new Set(["VpcId", "InternetGatewayId"])],
|
|
14834
|
+
["AWS::EC2::NatGateway", /* @__PURE__ */ new Set([
|
|
14838
14835
|
"AllocationId",
|
|
14839
14836
|
"SubnetId",
|
|
14840
14837
|
"ConnectivityType",
|
|
@@ -14845,8 +14842,8 @@ var EC2Provider = class {
|
|
|
14845
14842
|
"MaxDrainDurationSeconds",
|
|
14846
14843
|
"Tags"
|
|
14847
14844
|
])],
|
|
14848
|
-
["AWS::EC2::RouteTable", new Set(["VpcId", "Tags"])],
|
|
14849
|
-
["AWS::EC2::Route", new Set([
|
|
14845
|
+
["AWS::EC2::RouteTable", /* @__PURE__ */ new Set(["VpcId", "Tags"])],
|
|
14846
|
+
["AWS::EC2::Route", /* @__PURE__ */ new Set([
|
|
14850
14847
|
"RouteTableId",
|
|
14851
14848
|
"DestinationCidrBlock",
|
|
14852
14849
|
"DestinationIpv6CidrBlock",
|
|
@@ -14857,8 +14854,8 @@ var EC2Provider = class {
|
|
|
14857
14854
|
"NetworkInterfaceId",
|
|
14858
14855
|
"VpcPeeringConnectionId"
|
|
14859
14856
|
])],
|
|
14860
|
-
["AWS::EC2::SubnetRouteTableAssociation", new Set(["SubnetId", "RouteTableId"])],
|
|
14861
|
-
["AWS::EC2::SecurityGroup", new Set([
|
|
14857
|
+
["AWS::EC2::SubnetRouteTableAssociation", /* @__PURE__ */ new Set(["SubnetId", "RouteTableId"])],
|
|
14858
|
+
["AWS::EC2::SecurityGroup", /* @__PURE__ */ new Set([
|
|
14862
14859
|
"GroupDescription",
|
|
14863
14860
|
"GroupName",
|
|
14864
14861
|
"VpcId",
|
|
@@ -14866,7 +14863,7 @@ var EC2Provider = class {
|
|
|
14866
14863
|
"SecurityGroupEgress",
|
|
14867
14864
|
"Tags"
|
|
14868
14865
|
])],
|
|
14869
|
-
["AWS::EC2::SecurityGroupIngress", new Set([
|
|
14866
|
+
["AWS::EC2::SecurityGroupIngress", /* @__PURE__ */ new Set([
|
|
14870
14867
|
"GroupId",
|
|
14871
14868
|
"IpProtocol",
|
|
14872
14869
|
"FromPort",
|
|
@@ -14878,7 +14875,7 @@ var EC2Provider = class {
|
|
|
14878
14875
|
"SourceSecurityGroupOwnerId",
|
|
14879
14876
|
"SourcePrefixListId"
|
|
14880
14877
|
])],
|
|
14881
|
-
["AWS::EC2::Instance", new Set([
|
|
14878
|
+
["AWS::EC2::Instance", /* @__PURE__ */ new Set([
|
|
14882
14879
|
"ImageId",
|
|
14883
14880
|
"InstanceType",
|
|
14884
14881
|
"KeyName",
|
|
@@ -14895,8 +14892,8 @@ var EC2Provider = class {
|
|
|
14895
14892
|
"EbsOptimized",
|
|
14896
14893
|
"CreditSpecification"
|
|
14897
14894
|
])],
|
|
14898
|
-
["AWS::EC2::NetworkAcl", new Set(["VpcId", "Tags"])],
|
|
14899
|
-
["AWS::EC2::NetworkAclEntry", new Set([
|
|
14895
|
+
["AWS::EC2::NetworkAcl", /* @__PURE__ */ new Set(["VpcId", "Tags"])],
|
|
14896
|
+
["AWS::EC2::NetworkAclEntry", /* @__PURE__ */ new Set([
|
|
14900
14897
|
"NetworkAclId",
|
|
14901
14898
|
"RuleNumber",
|
|
14902
14899
|
"Protocol",
|
|
@@ -14907,12 +14904,12 @@ var EC2Provider = class {
|
|
|
14907
14904
|
"PortRange",
|
|
14908
14905
|
"Icmp"
|
|
14909
14906
|
])],
|
|
14910
|
-
["AWS::EC2::SubnetNetworkAclAssociation", new Set(["SubnetId", "NetworkAclId"])]
|
|
14907
|
+
["AWS::EC2::SubnetNetworkAclAssociation", /* @__PURE__ */ new Set(["SubnetId", "NetworkAclId"])]
|
|
14911
14908
|
]);
|
|
14912
|
-
unhandledByDesign = new Map([
|
|
14913
|
-
["AWS::EC2::Instance", new Map([["ElasticGpuSpecifications", "AWS Elastic GPU end-of-life (announced 2023-11); no replacement API"], ["ElasticInferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])],
|
|
14914
|
-
["AWS::EC2::SecurityGroupIngress", new Map([["GroupName", "EC2-Classic-only — use GroupId for VPC security groups (EC2-Classic retired 2022-08-15)"], ["SourceSecurityGroupName", "EC2-Classic-only — use SourceSecurityGroupId for VPC peer security groups (EC2-Classic retired 2022-08-15)"]])],
|
|
14915
|
-
["AWS::EC2::NatGateway", new Map([["VpcId", "AWS derives the VPC from SubnetId; the ec2:CreateNatGateway API has no VpcId parameter"]])]
|
|
14909
|
+
unhandledByDesign = /* @__PURE__ */ new Map([
|
|
14910
|
+
["AWS::EC2::Instance", /* @__PURE__ */ new Map([["ElasticGpuSpecifications", "AWS Elastic GPU end-of-life (announced 2023-11); no replacement API"], ["ElasticInferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])],
|
|
14911
|
+
["AWS::EC2::SecurityGroupIngress", /* @__PURE__ */ new Map([["GroupName", "EC2-Classic-only — use GroupId for VPC security groups (EC2-Classic retired 2022-08-15)"], ["SourceSecurityGroupName", "EC2-Classic-only — use SourceSecurityGroupId for VPC peer security groups (EC2-Classic retired 2022-08-15)"]])],
|
|
14912
|
+
["AWS::EC2::NatGateway", /* @__PURE__ */ new Map([["VpcId", "AWS derives the VPC from SubnetId; the ec2:CreateNatGateway API has no VpcId parameter"]])]
|
|
14916
14913
|
]);
|
|
14917
14914
|
constructor() {
|
|
14918
14915
|
const awsClients = getAwsClients();
|
|
@@ -17283,9 +17280,9 @@ function isDefaultEgressRule(rule) {
|
|
|
17283
17280
|
var ApiGatewayProvider = class ApiGatewayProvider {
|
|
17284
17281
|
apiGatewayClient;
|
|
17285
17282
|
logger = getLogger().child("ApiGatewayProvider");
|
|
17286
|
-
handledProperties = new Map([
|
|
17287
|
-
["AWS::ApiGateway::Account", new Set(["CloudWatchRoleArn"])],
|
|
17288
|
-
["AWS::ApiGateway::Authorizer", new Set([
|
|
17283
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
17284
|
+
["AWS::ApiGateway::Account", /* @__PURE__ */ new Set(["CloudWatchRoleArn"])],
|
|
17285
|
+
["AWS::ApiGateway::Authorizer", /* @__PURE__ */ new Set([
|
|
17289
17286
|
"RestApiId",
|
|
17290
17287
|
"Name",
|
|
17291
17288
|
"Type",
|
|
@@ -17297,13 +17294,13 @@ var ApiGatewayProvider = class ApiGatewayProvider {
|
|
|
17297
17294
|
"IdentityValidationExpression",
|
|
17298
17295
|
"AuthorizerResultTtlInSeconds"
|
|
17299
17296
|
])],
|
|
17300
|
-
["AWS::ApiGateway::Resource", new Set([
|
|
17297
|
+
["AWS::ApiGateway::Resource", /* @__PURE__ */ new Set([
|
|
17301
17298
|
"RestApiId",
|
|
17302
17299
|
"ParentId",
|
|
17303
17300
|
"PathPart"
|
|
17304
17301
|
])],
|
|
17305
|
-
["AWS::ApiGateway::Deployment", new Set(["RestApiId", "Description"])],
|
|
17306
|
-
["AWS::ApiGateway::Stage", new Set([
|
|
17302
|
+
["AWS::ApiGateway::Deployment", /* @__PURE__ */ new Set(["RestApiId", "Description"])],
|
|
17303
|
+
["AWS::ApiGateway::Stage", /* @__PURE__ */ new Set([
|
|
17307
17304
|
"RestApiId",
|
|
17308
17305
|
"StageName",
|
|
17309
17306
|
"DeploymentId",
|
|
@@ -17313,7 +17310,7 @@ var ApiGatewayProvider = class ApiGatewayProvider {
|
|
|
17313
17310
|
"Variables",
|
|
17314
17311
|
"MethodSettings"
|
|
17315
17312
|
])],
|
|
17316
|
-
["AWS::ApiGateway::Method", new Set([
|
|
17313
|
+
["AWS::ApiGateway::Method", /* @__PURE__ */ new Set([
|
|
17317
17314
|
"RestApiId",
|
|
17318
17315
|
"ResourceId",
|
|
17319
17316
|
"HttpMethod",
|
|
@@ -17329,7 +17326,7 @@ var ApiGatewayProvider = class ApiGatewayProvider {
|
|
|
17329
17326
|
"MethodResponses"
|
|
17330
17327
|
])]
|
|
17331
17328
|
]);
|
|
17332
|
-
unhandledByDesign = new Map([["AWS::ApiGateway::Deployment", new Map([["StageName", "CFn-only convenience for inline-creating a Stage from a Deployment; declare AWS::ApiGateway::Stage explicitly to attach to this Deployment"], ["StageDescription", "CFn-only convenience for inline-creating a Stage; declare AWS::ApiGateway::Stage with the Description property instead"]])]]);
|
|
17329
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ApiGateway::Deployment", /* @__PURE__ */ new Map([["StageName", "CFn-only convenience for inline-creating a Stage from a Deployment; declare AWS::ApiGateway::Stage explicitly to attach to this Deployment"], ["StageDescription", "CFn-only convenience for inline-creating a Stage; declare AWS::ApiGateway::Stage with the Description property instead"]])]]);
|
|
17333
17330
|
/** Maximum number of retries for IAM propagation delays */
|
|
17334
17331
|
static MAX_IAM_RETRIES = 3;
|
|
17335
17332
|
/** Delay between IAM propagation retries (ms) - exponential backoff */
|
|
@@ -18623,8 +18620,8 @@ var ApiGatewayV2Provider = class {
|
|
|
18623
18620
|
client;
|
|
18624
18621
|
providerRegion = process.env["AWS_REGION"];
|
|
18625
18622
|
logger = getLogger().child("ApiGatewayV2Provider");
|
|
18626
|
-
handledProperties = new Map([
|
|
18627
|
-
["AWS::ApiGatewayV2::Api", new Set([
|
|
18623
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
18624
|
+
["AWS::ApiGatewayV2::Api", /* @__PURE__ */ new Set([
|
|
18628
18625
|
"Name",
|
|
18629
18626
|
"ProtocolType",
|
|
18630
18627
|
"Description",
|
|
@@ -18636,7 +18633,7 @@ var ApiGatewayV2Provider = class {
|
|
|
18636
18633
|
"ApiKeySelectionExpression",
|
|
18637
18634
|
"IpAddressType"
|
|
18638
18635
|
])],
|
|
18639
|
-
["AWS::ApiGatewayV2::Stage", new Set([
|
|
18636
|
+
["AWS::ApiGatewayV2::Stage", /* @__PURE__ */ new Set([
|
|
18640
18637
|
"ApiId",
|
|
18641
18638
|
"StageName",
|
|
18642
18639
|
"AutoDeploy",
|
|
@@ -18645,7 +18642,7 @@ var ApiGatewayV2Provider = class {
|
|
|
18645
18642
|
"StageVariables",
|
|
18646
18643
|
"DefaultRouteSettings"
|
|
18647
18644
|
])],
|
|
18648
|
-
["AWS::ApiGatewayV2::Integration", new Set([
|
|
18645
|
+
["AWS::ApiGatewayV2::Integration", /* @__PURE__ */ new Set([
|
|
18649
18646
|
"ApiId",
|
|
18650
18647
|
"IntegrationType",
|
|
18651
18648
|
"IntegrationUri",
|
|
@@ -18655,7 +18652,7 @@ var ApiGatewayV2Provider = class {
|
|
|
18655
18652
|
"RequestParameters",
|
|
18656
18653
|
"Description"
|
|
18657
18654
|
])],
|
|
18658
|
-
["AWS::ApiGatewayV2::Route", new Set([
|
|
18655
|
+
["AWS::ApiGatewayV2::Route", /* @__PURE__ */ new Set([
|
|
18659
18656
|
"ApiId",
|
|
18660
18657
|
"RouteKey",
|
|
18661
18658
|
"Target",
|
|
@@ -18664,7 +18661,7 @@ var ApiGatewayV2Provider = class {
|
|
|
18664
18661
|
"AuthorizationScopes",
|
|
18665
18662
|
"OperationName"
|
|
18666
18663
|
])],
|
|
18667
|
-
["AWS::ApiGatewayV2::Authorizer", new Set([
|
|
18664
|
+
["AWS::ApiGatewayV2::Authorizer", /* @__PURE__ */ new Set([
|
|
18668
18665
|
"ApiId",
|
|
18669
18666
|
"AuthorizerType",
|
|
18670
18667
|
"Name",
|
|
@@ -18690,7 +18687,7 @@ var ApiGatewayV2Provider = class {
|
|
|
18690
18687
|
* Wiring them would require parsing OpenAPI semantics + a different
|
|
18691
18688
|
* mutation surface and is out of scope for the SDK-Provider safety net.
|
|
18692
18689
|
*/
|
|
18693
|
-
unhandledByDesign = new Map([["AWS::ApiGatewayV2::Api", new Map([
|
|
18690
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ApiGatewayV2::Api", /* @__PURE__ */ new Map([
|
|
18694
18691
|
["Body", "OpenAPI/Swagger inline spec; routed through ImportApi, not the field-by-field CreateApi path."],
|
|
18695
18692
|
["BodyS3Location", "OpenAPI/Swagger spec on S3; routed through ImportApi, not the field-by-field CreateApi path."],
|
|
18696
18693
|
["FailOnWarnings", "OpenAPI-import-only flag; meaningful only on the ImportApi code path."],
|
|
@@ -19536,7 +19533,7 @@ var ApiGatewayV2Provider = class {
|
|
|
19536
19533
|
var CloudFrontOAIProvider = class {
|
|
19537
19534
|
cloudFrontClient;
|
|
19538
19535
|
logger = getLogger().child("CloudFrontOAIProvider");
|
|
19539
|
-
handledProperties = new Map([["AWS::CloudFront::CloudFrontOriginAccessIdentity", new Set(["CloudFrontOriginAccessIdentityConfig"])]]);
|
|
19536
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFront::CloudFrontOriginAccessIdentity", /* @__PURE__ */ new Set(["CloudFrontOriginAccessIdentityConfig"])]]);
|
|
19540
19537
|
constructor() {
|
|
19541
19538
|
const awsClients = getAwsClients();
|
|
19542
19539
|
this.cloudFrontClient = awsClients.cloudFront;
|
|
@@ -19760,7 +19757,7 @@ const CACHE_BEHAVIOR_QUANTITY_FIELDS = [
|
|
|
19760
19757
|
var CloudFrontDistributionProvider = class {
|
|
19761
19758
|
cloudFrontClient;
|
|
19762
19759
|
logger = getLogger().child("CloudFrontDistributionProvider");
|
|
19763
|
-
handledProperties = new Map([["AWS::CloudFront::Distribution", new Set(["DistributionConfig", "Tags"])]]);
|
|
19760
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFront::Distribution", /* @__PURE__ */ new Set(["DistributionConfig", "Tags"])]]);
|
|
19764
19761
|
constructor() {
|
|
19765
19762
|
const awsClients = getAwsClients();
|
|
19766
19763
|
this.cloudFrontClient = awsClients.cloudFront;
|
|
@@ -20460,7 +20457,7 @@ function camelToPascalCaseKeys(value, preserveKeys) {
|
|
|
20460
20457
|
var AgentCoreRuntimeProvider = class {
|
|
20461
20458
|
client;
|
|
20462
20459
|
logger = getLogger().child("AgentCoreRuntimeProvider");
|
|
20463
|
-
handledProperties = new Map([["AWS::BedrockAgentCore::Runtime", new Set([
|
|
20460
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::Runtime", /* @__PURE__ */ new Set([
|
|
20464
20461
|
"AgentRuntimeName",
|
|
20465
20462
|
"RoleArn",
|
|
20466
20463
|
"AgentRuntimeArtifact",
|
|
@@ -20695,7 +20692,7 @@ const DEFAULT_BROWSER_ID = "aws.browser.v1";
|
|
|
20695
20692
|
var AgentCoreBrowserProvider = class {
|
|
20696
20693
|
client;
|
|
20697
20694
|
logger = getLogger().child("AgentCoreBrowserProvider");
|
|
20698
|
-
handledProperties = new Map([["AWS::BedrockAgentCore::Browser", /* @__PURE__ */ new Set([])]]);
|
|
20695
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::Browser", /* @__PURE__ */ new Set([])]]);
|
|
20699
20696
|
constructor() {
|
|
20700
20697
|
const awsClients = getAwsClients();
|
|
20701
20698
|
this.client = awsClients.bedrockAgentCoreControl;
|
|
@@ -20810,7 +20807,7 @@ const DEFAULT_CODE_INTERPRETER_ID = "aws.codeinterpreter.v1";
|
|
|
20810
20807
|
var AgentCoreCodeInterpreterProvider = class {
|
|
20811
20808
|
client;
|
|
20812
20809
|
logger = getLogger().child("AgentCoreCodeInterpreterProvider");
|
|
20813
|
-
handledProperties = new Map([["AWS::BedrockAgentCore::CodeInterpreter", /* @__PURE__ */ new Set([])]]);
|
|
20810
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::CodeInterpreter", /* @__PURE__ */ new Set([])]]);
|
|
20814
20811
|
constructor() {
|
|
20815
20812
|
const awsClients = getAwsClients();
|
|
20816
20813
|
this.client = awsClients.bedrockAgentCoreControl;
|
|
@@ -20928,8 +20925,8 @@ var AgentCoreCodeInterpreterProvider = class {
|
|
|
20928
20925
|
* The `EvaluatorConfig` subtree keys whose values are free-form JSON
|
|
20929
20926
|
* documents (user/model-defined keys) that must NOT be case-converted.
|
|
20930
20927
|
*/
|
|
20931
|
-
const CFN_PRESERVE_KEYS = new Set(["AdditionalModelRequestFields"]);
|
|
20932
|
-
const SDK_PRESERVE_KEYS = new Set(["additionalModelRequestFields"]);
|
|
20928
|
+
const CFN_PRESERVE_KEYS = /* @__PURE__ */ new Set(["AdditionalModelRequestFields"]);
|
|
20929
|
+
const SDK_PRESERVE_KEYS = /* @__PURE__ */ new Set(["additionalModelRequestFields"]);
|
|
20933
20930
|
/**
|
|
20934
20931
|
* Extract the evaluator ID from an evaluator ARN
|
|
20935
20932
|
* (`arn:...:evaluator/<id>` → `<id>`). Falls back to the input verbatim
|
|
@@ -20960,7 +20957,7 @@ function tagMapToCfnList(tags) {
|
|
|
20960
20957
|
var AgentCoreEvaluatorProvider = class {
|
|
20961
20958
|
client;
|
|
20962
20959
|
logger = getLogger().child("AgentCoreEvaluatorProvider");
|
|
20963
|
-
handledProperties = new Map([["AWS::BedrockAgentCore::Evaluator", new Set([
|
|
20960
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::Evaluator", /* @__PURE__ */ new Set([
|
|
20964
20961
|
"EvaluatorName",
|
|
20965
20962
|
"Description",
|
|
20966
20963
|
"EvaluatorConfig",
|
|
@@ -21171,7 +21168,7 @@ var StepFunctionsProvider = class {
|
|
|
21171
21168
|
s3Client;
|
|
21172
21169
|
providerRegion = process.env["AWS_REGION"];
|
|
21173
21170
|
logger = getLogger().child("StepFunctionsProvider");
|
|
21174
|
-
handledProperties = new Map([["AWS::StepFunctions::StateMachine", new Set([
|
|
21171
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::StepFunctions::StateMachine", /* @__PURE__ */ new Set([
|
|
21175
21172
|
"StateMachineName",
|
|
21176
21173
|
"RoleArn",
|
|
21177
21174
|
"StateMachineType",
|
|
@@ -21653,8 +21650,8 @@ var ECSProvider = class {
|
|
|
21653
21650
|
ecsClient;
|
|
21654
21651
|
providerRegion = process.env["AWS_REGION"];
|
|
21655
21652
|
logger = getLogger().child("ECSProvider");
|
|
21656
|
-
handledProperties = new Map([
|
|
21657
|
-
["AWS::ECS::Cluster", new Set([
|
|
21653
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
21654
|
+
["AWS::ECS::Cluster", /* @__PURE__ */ new Set([
|
|
21658
21655
|
"ClusterName",
|
|
21659
21656
|
"CapacityProviders",
|
|
21660
21657
|
"DefaultCapacityProviderStrategy",
|
|
@@ -21663,7 +21660,7 @@ var ECSProvider = class {
|
|
|
21663
21660
|
"ServiceConnectDefaults",
|
|
21664
21661
|
"Tags"
|
|
21665
21662
|
])],
|
|
21666
|
-
["AWS::ECS::TaskDefinition", new Set([
|
|
21663
|
+
["AWS::ECS::TaskDefinition", /* @__PURE__ */ new Set([
|
|
21667
21664
|
"Family",
|
|
21668
21665
|
"ContainerDefinitions",
|
|
21669
21666
|
"Cpu",
|
|
@@ -21682,7 +21679,7 @@ var ECSProvider = class {
|
|
|
21682
21679
|
"EnableFaultInjection",
|
|
21683
21680
|
"Tags"
|
|
21684
21681
|
])],
|
|
21685
|
-
["AWS::ECS::Service", new Set([
|
|
21682
|
+
["AWS::ECS::Service", /* @__PURE__ */ new Set([
|
|
21686
21683
|
"Cluster",
|
|
21687
21684
|
"ServiceName",
|
|
21688
21685
|
"TaskDefinition",
|
|
@@ -21704,7 +21701,7 @@ var ECSProvider = class {
|
|
|
21704
21701
|
"Tags"
|
|
21705
21702
|
])]
|
|
21706
21703
|
]);
|
|
21707
|
-
unhandledByDesign = new Map([["AWS::ECS::Service", new Map([["Role", "Legacy classic-ELB service-linked-role override; AWS uses the AWSServiceRoleForECS service-linked role automatically since 2017"]])], ["AWS::ECS::TaskDefinition", new Map([["InferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])]]);
|
|
21704
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ECS::Service", /* @__PURE__ */ new Map([["Role", "Legacy classic-ELB service-linked-role override; AWS uses the AWSServiceRoleForECS service-linked role automatically since 2017"]])], ["AWS::ECS::TaskDefinition", /* @__PURE__ */ new Map([["InferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])]]);
|
|
21708
21705
|
getClient() {
|
|
21709
21706
|
if (!this.ecsClient) this.ecsClient = new ECSClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
21710
21707
|
return this.ecsClient;
|
|
@@ -22704,8 +22701,8 @@ var ELBv2Provider = class {
|
|
|
22704
22701
|
elbv2Client;
|
|
22705
22702
|
providerRegion = process.env["AWS_REGION"];
|
|
22706
22703
|
logger = getLogger().child("ELBv2Provider");
|
|
22707
|
-
handledProperties = new Map([
|
|
22708
|
-
["AWS::ElasticLoadBalancingV2::LoadBalancer", new Set([
|
|
22704
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
22705
|
+
["AWS::ElasticLoadBalancingV2::LoadBalancer", /* @__PURE__ */ new Set([
|
|
22709
22706
|
"Name",
|
|
22710
22707
|
"Subnets",
|
|
22711
22708
|
"SubnetMappings",
|
|
@@ -22716,7 +22713,7 @@ var ELBv2Provider = class {
|
|
|
22716
22713
|
"LoadBalancerAttributes",
|
|
22717
22714
|
"Tags"
|
|
22718
22715
|
])],
|
|
22719
|
-
["AWS::ElasticLoadBalancingV2::TargetGroup", new Set([
|
|
22716
|
+
["AWS::ElasticLoadBalancingV2::TargetGroup", /* @__PURE__ */ new Set([
|
|
22720
22717
|
"Protocol",
|
|
22721
22718
|
"Port",
|
|
22722
22719
|
"VpcId",
|
|
@@ -22734,7 +22731,7 @@ var ELBv2Provider = class {
|
|
|
22734
22731
|
"Name",
|
|
22735
22732
|
"Tags"
|
|
22736
22733
|
])],
|
|
22737
|
-
["AWS::ElasticLoadBalancingV2::Listener", new Set([
|
|
22734
|
+
["AWS::ElasticLoadBalancingV2::Listener", /* @__PURE__ */ new Set([
|
|
22738
22735
|
"LoadBalancerArn",
|
|
22739
22736
|
"Certificates",
|
|
22740
22737
|
"DefaultActions",
|
|
@@ -22829,7 +22826,7 @@ var ELBv2Provider = class {
|
|
|
22829
22826
|
}
|
|
22830
22827
|
}
|
|
22831
22828
|
async updateLoadBalancer(logicalId, physicalId, _resourceType, properties, previousProperties) {
|
|
22832
|
-
const handledKeys = new Set([
|
|
22829
|
+
const handledKeys = /* @__PURE__ */ new Set([
|
|
22833
22830
|
"LoadBalancerAttributes",
|
|
22834
22831
|
"Subnets",
|
|
22835
22832
|
"SubnetMappings",
|
|
@@ -23463,14 +23460,14 @@ var RDSProvider = class {
|
|
|
23463
23460
|
rdsClient;
|
|
23464
23461
|
providerRegion = process.env["AWS_REGION"];
|
|
23465
23462
|
logger = getLogger().child("RDSProvider");
|
|
23466
|
-
handledProperties = new Map([
|
|
23467
|
-
["AWS::RDS::DBSubnetGroup", new Set([
|
|
23463
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
23464
|
+
["AWS::RDS::DBSubnetGroup", /* @__PURE__ */ new Set([
|
|
23468
23465
|
"DBSubnetGroupName",
|
|
23469
23466
|
"DBSubnetGroupDescription",
|
|
23470
23467
|
"SubnetIds",
|
|
23471
23468
|
"Tags"
|
|
23472
23469
|
])],
|
|
23473
|
-
["AWS::RDS::DBCluster", new Set([
|
|
23470
|
+
["AWS::RDS::DBCluster", /* @__PURE__ */ new Set([
|
|
23474
23471
|
"DBClusterIdentifier",
|
|
23475
23472
|
"Engine",
|
|
23476
23473
|
"EngineVersion",
|
|
@@ -23493,7 +23490,7 @@ var RDSProvider = class {
|
|
|
23493
23490
|
"EnableIAMDatabaseAuthentication",
|
|
23494
23491
|
"PubliclyAccessible"
|
|
23495
23492
|
])],
|
|
23496
|
-
["AWS::RDS::DBInstance", new Set([
|
|
23493
|
+
["AWS::RDS::DBInstance", /* @__PURE__ */ new Set([
|
|
23497
23494
|
"DBInstanceIdentifier",
|
|
23498
23495
|
"DBInstanceClass",
|
|
23499
23496
|
"Engine",
|
|
@@ -23517,7 +23514,7 @@ var RDSProvider = class {
|
|
|
23517
23514
|
"EnableIAMDatabaseAuthentication"
|
|
23518
23515
|
])]
|
|
23519
23516
|
]);
|
|
23520
|
-
unhandledByDesign = new Map([["AWS::RDS::DBCluster", new Map([["DeleteAutomatedBackups", "cdkd hardcodes SkipFinalSnapshot=true on destroy; this CFn lifecycle flag has no equivalent on the runtime path"]])], ["AWS::RDS::DBInstance", new Map([
|
|
23517
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::RDS::DBCluster", /* @__PURE__ */ new Map([["DeleteAutomatedBackups", "cdkd hardcodes SkipFinalSnapshot=true on destroy; this CFn lifecycle flag has no equivalent on the runtime path"]])], ["AWS::RDS::DBInstance", /* @__PURE__ */ new Map([
|
|
23521
23518
|
["DBSecurityGroups", "EC2-Classic-only feature retired by AWS (2022-08-15); new accounts cannot use this — use VPCSecurityGroups instead"],
|
|
23522
23519
|
["ApplyImmediately", "cdkd always applies modifications immediately (rds:ModifyDBInstance.ApplyImmediately=true is hardcoded); users wanting maintenance-window deferral should run aws rds modify-db-instance directly"],
|
|
23523
23520
|
["DeleteAutomatedBackups", "cdkd hardcodes SkipFinalSnapshot=true on destroy; this CFn lifecycle flag has no equivalent on the runtime path"]
|
|
@@ -24282,7 +24279,7 @@ var RDSDBProxyProvider = class {
|
|
|
24282
24279
|
providerRegion = process.env["AWS_REGION"];
|
|
24283
24280
|
logger = getLogger().child("RDSDBProxyProvider");
|
|
24284
24281
|
attributeCache = /* @__PURE__ */ new Map();
|
|
24285
|
-
handledProperties = new Map([["AWS::RDS::DBProxy", new Set([
|
|
24282
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::RDS::DBProxy", /* @__PURE__ */ new Set([
|
|
24286
24283
|
"DBProxyName",
|
|
24287
24284
|
"EngineFamily",
|
|
24288
24285
|
"Auth",
|
|
@@ -24639,7 +24636,7 @@ var RDSDBProxyEndpointProvider = class {
|
|
|
24639
24636
|
providerRegion = process.env["AWS_REGION"];
|
|
24640
24637
|
logger = getLogger().child("RDSDBProxyEndpointProvider");
|
|
24641
24638
|
attributeCache = /* @__PURE__ */ new Map();
|
|
24642
|
-
handledProperties = new Map([["AWS::RDS::DBProxyEndpoint", new Set([
|
|
24639
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::RDS::DBProxyEndpoint", /* @__PURE__ */ new Set([
|
|
24643
24640
|
"DBProxyEndpointName",
|
|
24644
24641
|
"DBProxyName",
|
|
24645
24642
|
"VpcSubnetIds",
|
|
@@ -24968,7 +24965,7 @@ var RDSDBProxyTargetGroupProvider = class {
|
|
|
24968
24965
|
rdsClient;
|
|
24969
24966
|
providerRegion = process.env["AWS_REGION"];
|
|
24970
24967
|
logger = getLogger().child("RDSDBProxyTargetGroupProvider");
|
|
24971
|
-
handledProperties = new Map([["AWS::RDS::DBProxyTargetGroup", new Set([
|
|
24968
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::RDS::DBProxyTargetGroup", /* @__PURE__ */ new Set([
|
|
24972
24969
|
"DBProxyName",
|
|
24973
24970
|
"TargetGroupName",
|
|
24974
24971
|
"DBClusterIdentifiers",
|
|
@@ -25252,14 +25249,14 @@ var DocDBProvider = class {
|
|
|
25252
25249
|
docdbClient;
|
|
25253
25250
|
providerRegion = process.env["AWS_REGION"];
|
|
25254
25251
|
logger = getLogger().child("DocDBProvider");
|
|
25255
|
-
handledProperties = new Map([
|
|
25256
|
-
["AWS::DocDB::DBSubnetGroup", new Set([
|
|
25252
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
25253
|
+
["AWS::DocDB::DBSubnetGroup", /* @__PURE__ */ new Set([
|
|
25257
25254
|
"DBSubnetGroupName",
|
|
25258
25255
|
"DBSubnetGroupDescription",
|
|
25259
25256
|
"SubnetIds",
|
|
25260
25257
|
"Tags"
|
|
25261
25258
|
])],
|
|
25262
|
-
["AWS::DocDB::DBCluster", new Set([
|
|
25259
|
+
["AWS::DocDB::DBCluster", /* @__PURE__ */ new Set([
|
|
25263
25260
|
"DBClusterIdentifier",
|
|
25264
25261
|
"EngineVersion",
|
|
25265
25262
|
"MasterUsername",
|
|
@@ -25276,7 +25273,7 @@ var DocDBProvider = class {
|
|
|
25276
25273
|
"DeletionProtection",
|
|
25277
25274
|
"Tags"
|
|
25278
25275
|
])],
|
|
25279
|
-
["AWS::DocDB::DBInstance", new Set([
|
|
25276
|
+
["AWS::DocDB::DBInstance", /* @__PURE__ */ new Set([
|
|
25280
25277
|
"DBInstanceIdentifier",
|
|
25281
25278
|
"DBInstanceClass",
|
|
25282
25279
|
"DBClusterIdentifier",
|
|
@@ -25914,14 +25911,14 @@ var NeptuneProvider = class {
|
|
|
25914
25911
|
neptuneClient;
|
|
25915
25912
|
providerRegion = process.env["AWS_REGION"];
|
|
25916
25913
|
logger = getLogger().child("NeptuneProvider");
|
|
25917
|
-
handledProperties = new Map([
|
|
25918
|
-
["AWS::Neptune::DBSubnetGroup", new Set([
|
|
25914
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
25915
|
+
["AWS::Neptune::DBSubnetGroup", /* @__PURE__ */ new Set([
|
|
25919
25916
|
"DBSubnetGroupName",
|
|
25920
25917
|
"DBSubnetGroupDescription",
|
|
25921
25918
|
"SubnetIds",
|
|
25922
25919
|
"Tags"
|
|
25923
25920
|
])],
|
|
25924
|
-
["AWS::Neptune::DBCluster", new Set([
|
|
25921
|
+
["AWS::Neptune::DBCluster", /* @__PURE__ */ new Set([
|
|
25925
25922
|
"DBClusterIdentifier",
|
|
25926
25923
|
"EngineVersion",
|
|
25927
25924
|
"DBPort",
|
|
@@ -25938,7 +25935,7 @@ var NeptuneProvider = class {
|
|
|
25938
25935
|
"DeletionProtection",
|
|
25939
25936
|
"Tags"
|
|
25940
25937
|
])],
|
|
25941
|
-
["AWS::Neptune::DBInstance", new Set([
|
|
25938
|
+
["AWS::Neptune::DBInstance", /* @__PURE__ */ new Set([
|
|
25942
25939
|
"DBInstanceIdentifier",
|
|
25943
25940
|
"DBInstanceClass",
|
|
25944
25941
|
"DBClusterIdentifier",
|
|
@@ -26572,14 +26569,14 @@ var Route53Provider = class {
|
|
|
26572
26569
|
route53Client;
|
|
26573
26570
|
providerRegion = process.env["AWS_REGION"];
|
|
26574
26571
|
logger = getLogger().child("Route53Provider");
|
|
26575
|
-
handledProperties = new Map([["AWS::Route53::HostedZone", new Set([
|
|
26572
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Route53::HostedZone", /* @__PURE__ */ new Set([
|
|
26576
26573
|
"Name",
|
|
26577
26574
|
"HostedZoneConfig",
|
|
26578
26575
|
"HostedZoneTags",
|
|
26579
26576
|
"VPCs",
|
|
26580
26577
|
"QueryLoggingConfig",
|
|
26581
26578
|
"HostedZoneFeatures"
|
|
26582
|
-
])], ["AWS::Route53::RecordSet", new Set([
|
|
26579
|
+
])], ["AWS::Route53::RecordSet", /* @__PURE__ */ new Set([
|
|
26583
26580
|
"HostedZoneId",
|
|
26584
26581
|
"HostedZoneName",
|
|
26585
26582
|
"Name",
|
|
@@ -26790,7 +26787,7 @@ var Route53Provider = class {
|
|
|
26790
26787
|
}
|
|
26791
26788
|
};
|
|
26792
26789
|
const deadline = Date.now() + timeoutMs;
|
|
26793
|
-
const TERMINAL_FAILED = new Set(["ENABLE_FAILED", "DISABLE_FAILED"]);
|
|
26790
|
+
const TERMINAL_FAILED = /* @__PURE__ */ new Set(["ENABLE_FAILED", "DISABLE_FAILED"]);
|
|
26794
26791
|
const waitFor = async (targets, label) => {
|
|
26795
26792
|
while (Date.now() < deadline) {
|
|
26796
26793
|
const status = await readStatus();
|
|
@@ -26811,7 +26808,7 @@ var Route53Provider = class {
|
|
|
26811
26808
|
if (TERMINAL_FAILED.has(current)) throw new ProvisioningError(`Cannot delete hosted zone ${logicalId} (${physicalId}): AcceleratedRecoveryStatus is '${current}' — operator must resolve before destroy can proceed`, "AWS::Route53::HostedZone", logicalId, physicalId);
|
|
26812
26809
|
if (current === "ENABLING" || current === "ENABLING_HOSTED_ZONE_LOCKED") {
|
|
26813
26810
|
this.logger.debug(`Hosted zone ${physicalId} is ${current} (an enabling phase); waiting for it to settle before issuing disable`);
|
|
26814
|
-
current = await waitFor(new Set(["ENABLED", "DISABLED"]), "ENABLED or DISABLED");
|
|
26811
|
+
current = await waitFor(/* @__PURE__ */ new Set(["ENABLED", "DISABLED"]), "ENABLED or DISABLED");
|
|
26815
26812
|
if (current === void 0 || current === "DISABLED") return;
|
|
26816
26813
|
}
|
|
26817
26814
|
if (current === "ENABLED") {
|
|
@@ -26821,7 +26818,7 @@ var Route53Provider = class {
|
|
|
26821
26818
|
EnableAcceleratedRecovery: false
|
|
26822
26819
|
}));
|
|
26823
26820
|
} else if (current === "DISABLING" || current === "DISABLING_HOSTED_ZONE_LOCKED") this.logger.debug(`Hosted zone ${physicalId} AcceleratedRecovery is already ${current} (a disabling phase); waiting for settle`);
|
|
26824
|
-
const settled = await waitFor(new Set(["DISABLED"]), "DISABLED");
|
|
26821
|
+
const settled = await waitFor(/* @__PURE__ */ new Set(["DISABLED"]), "DISABLED");
|
|
26825
26822
|
this.logger.debug(`Hosted zone ${physicalId} AcceleratedRecoveryStatus settled to ${settled ?? "undefined (zone gone)"}`);
|
|
26826
26823
|
}
|
|
26827
26824
|
async getHostedZoneAttribute(physicalId, attributeName) {
|
|
@@ -27328,7 +27325,7 @@ var Route53Provider = class {
|
|
|
27328
27325
|
* error (surfaced as a ProvisioningError, never a silent drop), so the failure
|
|
27329
27326
|
* is loud and the fix is to append the new name here.
|
|
27330
27327
|
*/
|
|
27331
|
-
const STANDARD_USER_POOL_ATTRIBUTES = new Set([
|
|
27328
|
+
const STANDARD_USER_POOL_ATTRIBUTES = /* @__PURE__ */ new Set([
|
|
27332
27329
|
"address",
|
|
27333
27330
|
"birthdate",
|
|
27334
27331
|
"email",
|
|
@@ -27464,7 +27461,7 @@ var CognitoUserPoolProvider = class {
|
|
|
27464
27461
|
cognitoClient;
|
|
27465
27462
|
providerRegion = process.env["AWS_REGION"];
|
|
27466
27463
|
logger = getLogger().child("CognitoUserPoolProvider");
|
|
27467
|
-
handledProperties = new Map([["AWS::Cognito::UserPool", new Set([
|
|
27464
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Cognito::UserPool", /* @__PURE__ */ new Set([
|
|
27468
27465
|
"UserPoolName",
|
|
27469
27466
|
"AutoVerifiedAttributes",
|
|
27470
27467
|
"UsernameAttributes",
|
|
@@ -27495,7 +27492,7 @@ var CognitoUserPoolProvider = class {
|
|
|
27495
27492
|
"WebAuthnRelyingPartyID",
|
|
27496
27493
|
"WebAuthnUserVerification"
|
|
27497
27494
|
])]]);
|
|
27498
|
-
unhandledByDesign = new Map([["AWS::Cognito::UserPool", new Map([["WebAuthnFactorConfiguration", "No SDK wire path: @aws-sdk/client-cognito-identity-provider has no field accepting SINGLE_FACTOR | MULTI_FACTOR_WITH_USER_VERIFICATION (not on CreateUserPool/UpdateUserPool, nor SetUserPoolMfaConfig.WebAuthnConfiguration which only carries RelyingPartyId/UserVerification); CC-API-registry-only property"]])]]);
|
|
27495
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::Cognito::UserPool", /* @__PURE__ */ new Map([["WebAuthnFactorConfiguration", "No SDK wire path: @aws-sdk/client-cognito-identity-provider has no field accepting SINGLE_FACTOR | MULTI_FACTOR_WITH_USER_VERIFICATION (not on CreateUserPool/UpdateUserPool, nor SetUserPoolMfaConfig.WebAuthnConfiguration which only carries RelyingPartyId/UserVerification); CC-API-registry-only property"]])]]);
|
|
27499
27496
|
getClient() {
|
|
27500
27497
|
if (!this.cognitoClient) this.cognitoClient = new CognitoIdentityProviderClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
27501
27498
|
return this.cognitoClient;
|
|
@@ -27900,13 +27897,13 @@ var ElastiCacheProvider = class {
|
|
|
27900
27897
|
cachedAccountId;
|
|
27901
27898
|
providerRegion = process.env["AWS_REGION"];
|
|
27902
27899
|
logger = getLogger().child("ElastiCacheProvider");
|
|
27903
|
-
handledProperties = new Map([["AWS::ElastiCache::SubnetGroup", new Set([
|
|
27900
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::ElastiCache::SubnetGroup", /* @__PURE__ */ new Set([
|
|
27904
27901
|
"CacheSubnetGroupName",
|
|
27905
27902
|
"CacheSubnetGroupDescription",
|
|
27906
27903
|
"Description",
|
|
27907
27904
|
"SubnetIds",
|
|
27908
27905
|
"Tags"
|
|
27909
|
-
])], ["AWS::ElastiCache::CacheCluster", new Set([
|
|
27906
|
+
])], ["AWS::ElastiCache::CacheCluster", /* @__PURE__ */ new Set([
|
|
27910
27907
|
"ClusterName",
|
|
27911
27908
|
"Engine",
|
|
27912
27909
|
"CacheNodeType",
|
|
@@ -27931,7 +27928,7 @@ var ElastiCacheProvider = class {
|
|
|
27931
27928
|
"IpDiscovery",
|
|
27932
27929
|
"TransitEncryptionEnabled"
|
|
27933
27930
|
])]]);
|
|
27934
|
-
unhandledByDesign = new Map([["AWS::ElastiCache::CacheCluster", new Map([["CacheSecurityGroupNames", "EC2-Classic-only — use VpcSecurityGroupIds for VPC-deployed clusters (EC2-Classic retired 2022-08-15)"]])]]);
|
|
27931
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ElastiCache::CacheCluster", /* @__PURE__ */ new Map([["CacheSecurityGroupNames", "EC2-Classic-only — use VpcSecurityGroupIds for VPC-deployed clusters (EC2-Classic retired 2022-08-15)"]])]]);
|
|
27935
27932
|
getClient() {
|
|
27936
27933
|
if (!this.client) this.client = new ElastiCacheClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
27937
27934
|
return this.client;
|
|
@@ -28430,26 +28427,26 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
|
|
|
28430
28427
|
stsClient;
|
|
28431
28428
|
providerRegion = process.env["AWS_REGION"];
|
|
28432
28429
|
logger = getLogger().child("ServiceDiscoveryProvider");
|
|
28433
|
-
handledProperties = new Map([
|
|
28434
|
-
["AWS::ServiceDiscovery::PrivateDnsNamespace", new Set([
|
|
28430
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
28431
|
+
["AWS::ServiceDiscovery::PrivateDnsNamespace", /* @__PURE__ */ new Set([
|
|
28435
28432
|
"Name",
|
|
28436
28433
|
"Vpc",
|
|
28437
28434
|
"Description",
|
|
28438
28435
|
"Tags",
|
|
28439
28436
|
"Properties"
|
|
28440
28437
|
])],
|
|
28441
|
-
["AWS::ServiceDiscovery::HttpNamespace", new Set([
|
|
28438
|
+
["AWS::ServiceDiscovery::HttpNamespace", /* @__PURE__ */ new Set([
|
|
28442
28439
|
"Name",
|
|
28443
28440
|
"Description",
|
|
28444
28441
|
"Tags"
|
|
28445
28442
|
])],
|
|
28446
|
-
["AWS::ServiceDiscovery::PublicDnsNamespace", new Set([
|
|
28443
|
+
["AWS::ServiceDiscovery::PublicDnsNamespace", /* @__PURE__ */ new Set([
|
|
28447
28444
|
"Name",
|
|
28448
28445
|
"Description",
|
|
28449
28446
|
"Tags",
|
|
28450
28447
|
"Properties"
|
|
28451
28448
|
])],
|
|
28452
|
-
["AWS::ServiceDiscovery::Service", new Set([
|
|
28449
|
+
["AWS::ServiceDiscovery::Service", /* @__PURE__ */ new Set([
|
|
28453
28450
|
"Name",
|
|
28454
28451
|
"NamespaceId",
|
|
28455
28452
|
"DnsConfig",
|
|
@@ -29264,20 +29261,20 @@ var AppSyncProvider = class {
|
|
|
29264
29261
|
* and the old entry simply becomes unreachable.
|
|
29265
29262
|
*/
|
|
29266
29263
|
arnCache = /* @__PURE__ */ new Map();
|
|
29267
|
-
handledProperties = new Map([
|
|
29268
|
-
["AWS::AppSync::GraphQLApi", new Set([
|
|
29264
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
29265
|
+
["AWS::AppSync::GraphQLApi", /* @__PURE__ */ new Set([
|
|
29269
29266
|
"Name",
|
|
29270
29267
|
"AuthenticationType",
|
|
29271
29268
|
"XrayEnabled",
|
|
29272
29269
|
"LogConfig",
|
|
29273
29270
|
"Tags"
|
|
29274
29271
|
])],
|
|
29275
|
-
["AWS::AppSync::GraphQLSchema", new Set([
|
|
29272
|
+
["AWS::AppSync::GraphQLSchema", /* @__PURE__ */ new Set([
|
|
29276
29273
|
"ApiId",
|
|
29277
29274
|
"Definition",
|
|
29278
29275
|
"DefinitionS3Location"
|
|
29279
29276
|
])],
|
|
29280
|
-
["AWS::AppSync::DataSource", new Set([
|
|
29277
|
+
["AWS::AppSync::DataSource", /* @__PURE__ */ new Set([
|
|
29281
29278
|
"ApiId",
|
|
29282
29279
|
"Name",
|
|
29283
29280
|
"Type",
|
|
@@ -29287,7 +29284,7 @@ var AppSyncProvider = class {
|
|
|
29287
29284
|
"LambdaConfig",
|
|
29288
29285
|
"HttpConfig"
|
|
29289
29286
|
])],
|
|
29290
|
-
["AWS::AppSync::Resolver", new Set([
|
|
29287
|
+
["AWS::AppSync::Resolver", /* @__PURE__ */ new Set([
|
|
29291
29288
|
"ApiId",
|
|
29292
29289
|
"TypeName",
|
|
29293
29290
|
"FieldName",
|
|
@@ -29299,13 +29296,13 @@ var AppSyncProvider = class {
|
|
|
29299
29296
|
"Runtime",
|
|
29300
29297
|
"Code"
|
|
29301
29298
|
])],
|
|
29302
|
-
["AWS::AppSync::ApiKey", new Set([
|
|
29299
|
+
["AWS::AppSync::ApiKey", /* @__PURE__ */ new Set([
|
|
29303
29300
|
"ApiId",
|
|
29304
29301
|
"Description",
|
|
29305
29302
|
"Expires"
|
|
29306
29303
|
])]
|
|
29307
29304
|
]);
|
|
29308
|
-
unhandledByDesign = new Map([["AWS::AppSync::DataSource", new Map([["ElasticsearchConfig", "Legacy Elasticsearch alias; use OpenSearchServiceConfig (AppSync deprecated the Elasticsearch DataSource type in favor of OpenSearch)"]])]]);
|
|
29305
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::AppSync::DataSource", /* @__PURE__ */ new Map([["ElasticsearchConfig", "Legacy Elasticsearch alias; use OpenSearchServiceConfig (AppSync deprecated the Elasticsearch DataSource type in favor of OpenSearch)"]])]]);
|
|
29309
29306
|
getClient() {
|
|
29310
29307
|
if (!this.client) this.client = new AppSyncClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
29311
29308
|
return this.client;
|
|
@@ -30171,11 +30168,11 @@ var GlueProvider = class {
|
|
|
30171
30168
|
cachedAccountId;
|
|
30172
30169
|
providerRegion = process.env["AWS_REGION"];
|
|
30173
30170
|
logger = getLogger().child("GlueProvider");
|
|
30174
|
-
handledProperties = new Map([["AWS::Glue::Database", new Set([
|
|
30171
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Database", /* @__PURE__ */ new Set([
|
|
30175
30172
|
"DatabaseInput",
|
|
30176
30173
|
"DatabaseName",
|
|
30177
30174
|
"CatalogId"
|
|
30178
|
-
])], ["AWS::Glue::Table", new Set([
|
|
30175
|
+
])], ["AWS::Glue::Table", /* @__PURE__ */ new Set([
|
|
30179
30176
|
"DatabaseName",
|
|
30180
30177
|
"TableInput",
|
|
30181
30178
|
"Name",
|
|
@@ -30665,7 +30662,7 @@ var GlueWorkflowProvider = class {
|
|
|
30665
30662
|
cachedAccountId;
|
|
30666
30663
|
providerRegion = process.env["AWS_REGION"];
|
|
30667
30664
|
logger = getLogger().child("GlueWorkflowProvider");
|
|
30668
|
-
handledProperties = new Map([["AWS::Glue::Workflow", new Set([
|
|
30665
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Workflow", /* @__PURE__ */ new Set([
|
|
30669
30666
|
"Name",
|
|
30670
30667
|
"Description",
|
|
30671
30668
|
"DefaultRunProperties",
|
|
@@ -30843,7 +30840,7 @@ var GlueSecurityConfigurationProvider = class {
|
|
|
30843
30840
|
client;
|
|
30844
30841
|
providerRegion = process.env["AWS_REGION"];
|
|
30845
30842
|
logger = getLogger().child("GlueSecurityConfigurationProvider");
|
|
30846
|
-
handledProperties = new Map([["AWS::Glue::SecurityConfiguration", new Set(["Name", "EncryptionConfiguration"])]]);
|
|
30843
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::SecurityConfiguration", /* @__PURE__ */ new Set(["Name", "EncryptionConfiguration"])]]);
|
|
30847
30844
|
getClient() {
|
|
30848
30845
|
if (!this.client) this.client = new GlueClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
30849
30846
|
return this.client;
|
|
@@ -31066,7 +31063,7 @@ var GlueJobProvider = class {
|
|
|
31066
31063
|
cachedAccountId;
|
|
31067
31064
|
providerRegion = process.env["AWS_REGION"];
|
|
31068
31065
|
logger = getLogger().child("GlueJobProvider");
|
|
31069
|
-
handledProperties = new Map([["AWS::Glue::Job", new Set([
|
|
31066
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Job", /* @__PURE__ */ new Set([
|
|
31070
31067
|
"Name",
|
|
31071
31068
|
"Role",
|
|
31072
31069
|
"Command",
|
|
@@ -31372,7 +31369,7 @@ var GlueCrawlerProvider = class {
|
|
|
31372
31369
|
cachedAccountId;
|
|
31373
31370
|
providerRegion = process.env["AWS_REGION"];
|
|
31374
31371
|
logger = getLogger().child("GlueCrawlerProvider");
|
|
31375
|
-
handledProperties = new Map([["AWS::Glue::Crawler", new Set([
|
|
31372
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Crawler", /* @__PURE__ */ new Set([
|
|
31376
31373
|
"Name",
|
|
31377
31374
|
"Role",
|
|
31378
31375
|
"Targets",
|
|
@@ -31609,7 +31606,7 @@ var GlueConnectionProvider = class {
|
|
|
31609
31606
|
client;
|
|
31610
31607
|
providerRegion = process.env["AWS_REGION"];
|
|
31611
31608
|
logger = getLogger().child("GlueConnectionProvider");
|
|
31612
|
-
handledProperties = new Map([["AWS::Glue::Connection", new Set(["ConnectionInput", "CatalogId"])]]);
|
|
31609
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Connection", /* @__PURE__ */ new Set(["ConnectionInput", "CatalogId"])]]);
|
|
31613
31610
|
getClient() {
|
|
31614
31611
|
if (!this.client) this.client = new GlueClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
31615
31612
|
return this.client;
|
|
@@ -31759,7 +31756,7 @@ var GlueTriggerProvider = class {
|
|
|
31759
31756
|
cachedAccountId;
|
|
31760
31757
|
providerRegion = process.env["AWS_REGION"];
|
|
31761
31758
|
logger = getLogger().child("GlueTriggerProvider");
|
|
31762
|
-
handledProperties = new Map([["AWS::Glue::Trigger", new Set([
|
|
31759
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Trigger", /* @__PURE__ */ new Set([
|
|
31763
31760
|
"Name",
|
|
31764
31761
|
"Type",
|
|
31765
31762
|
"Schedule",
|
|
@@ -31975,7 +31972,7 @@ var KMSProvider = class {
|
|
|
31975
31972
|
client;
|
|
31976
31973
|
providerRegion = process.env["AWS_REGION"];
|
|
31977
31974
|
logger = getLogger().child("KMSProvider");
|
|
31978
|
-
handledProperties = new Map([["AWS::KMS::Key", new Set([
|
|
31975
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::KMS::Key", /* @__PURE__ */ new Set([
|
|
31979
31976
|
"Description",
|
|
31980
31977
|
"KeyPolicy",
|
|
31981
31978
|
"KeySpec",
|
|
@@ -31988,7 +31985,7 @@ var KMSProvider = class {
|
|
|
31988
31985
|
"RotationPeriodInDays",
|
|
31989
31986
|
"Origin",
|
|
31990
31987
|
"BypassPolicyLockoutSafetyCheck"
|
|
31991
|
-
])], ["AWS::KMS::Alias", new Set(["AliasName", "TargetKeyId"])]]);
|
|
31988
|
+
])], ["AWS::KMS::Alias", /* @__PURE__ */ new Set(["AliasName", "TargetKeyId"])]]);
|
|
31992
31989
|
getClient() {
|
|
31993
31990
|
if (!this.client) this.client = new KMSClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
31994
31991
|
return this.client;
|
|
@@ -32442,7 +32439,7 @@ var BudgetsBudgetProvider = class {
|
|
|
32442
32439
|
providerRegion = process.env["AWS_REGION"];
|
|
32443
32440
|
logger = getLogger().child("BudgetsBudgetProvider");
|
|
32444
32441
|
accountIdPromise;
|
|
32445
|
-
handledProperties = new Map([["AWS::Budgets::Budget", new Set([
|
|
32442
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Budgets::Budget", /* @__PURE__ */ new Set([
|
|
32446
32443
|
"Budget",
|
|
32447
32444
|
"NotificationsWithSubscribers",
|
|
32448
32445
|
"ResourceTags"
|
|
@@ -32916,7 +32913,7 @@ var KinesisStreamProvider = class {
|
|
|
32916
32913
|
client;
|
|
32917
32914
|
providerRegion = process.env["AWS_REGION"];
|
|
32918
32915
|
logger = getLogger().child("KinesisProvider");
|
|
32919
|
-
handledProperties = new Map([["AWS::Kinesis::Stream", new Set([
|
|
32916
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Kinesis::Stream", /* @__PURE__ */ new Set([
|
|
32920
32917
|
"Name",
|
|
32921
32918
|
"StreamModeDetails",
|
|
32922
32919
|
"ShardCount",
|
|
@@ -33288,7 +33285,7 @@ var KinesisStreamConsumerProvider = class {
|
|
|
33288
33285
|
client;
|
|
33289
33286
|
providerRegion = process.env["AWS_REGION"];
|
|
33290
33287
|
logger = getLogger().child("KinesisStreamConsumerProvider");
|
|
33291
|
-
handledProperties = new Map([["AWS::Kinesis::StreamConsumer", new Set([
|
|
33288
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Kinesis::StreamConsumer", /* @__PURE__ */ new Set([
|
|
33292
33289
|
"ConsumerName",
|
|
33293
33290
|
"StreamARN",
|
|
33294
33291
|
"Tags"
|
|
@@ -33555,7 +33552,7 @@ var SchedulerScheduleProvider = class {
|
|
|
33555
33552
|
client;
|
|
33556
33553
|
providerRegion = process.env["AWS_REGION"];
|
|
33557
33554
|
logger = getLogger().child("SchedulerScheduleProvider");
|
|
33558
|
-
handledProperties = new Map([["AWS::Scheduler::Schedule", new Set([
|
|
33555
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::Scheduler::Schedule", /* @__PURE__ */ new Set([
|
|
33559
33556
|
"Name",
|
|
33560
33557
|
"GroupName",
|
|
33561
33558
|
"Description",
|
|
@@ -33750,8 +33747,8 @@ var EFSProvider = class {
|
|
|
33750
33747
|
client;
|
|
33751
33748
|
providerRegion = process.env["AWS_REGION"];
|
|
33752
33749
|
logger = getLogger().child("EFSProvider");
|
|
33753
|
-
handledProperties = new Map([
|
|
33754
|
-
["AWS::EFS::FileSystem", new Set([
|
|
33750
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
33751
|
+
["AWS::EFS::FileSystem", /* @__PURE__ */ new Set([
|
|
33755
33752
|
"FileSystemTags",
|
|
33756
33753
|
"Encrypted",
|
|
33757
33754
|
"KmsKeyId",
|
|
@@ -33765,19 +33762,19 @@ var EFSProvider = class {
|
|
|
33765
33762
|
"BypassPolicyLockoutSafetyCheck",
|
|
33766
33763
|
"FileSystemProtection"
|
|
33767
33764
|
])],
|
|
33768
|
-
["AWS::EFS::MountTarget", new Set([
|
|
33765
|
+
["AWS::EFS::MountTarget", /* @__PURE__ */ new Set([
|
|
33769
33766
|
"FileSystemId",
|
|
33770
33767
|
"SubnetId",
|
|
33771
33768
|
"SecurityGroups"
|
|
33772
33769
|
])],
|
|
33773
|
-
["AWS::EFS::AccessPoint", new Set([
|
|
33770
|
+
["AWS::EFS::AccessPoint", /* @__PURE__ */ new Set([
|
|
33774
33771
|
"FileSystemId",
|
|
33775
33772
|
"PosixUser",
|
|
33776
33773
|
"RootDirectory",
|
|
33777
33774
|
"AccessPointTags"
|
|
33778
33775
|
])]
|
|
33779
33776
|
]);
|
|
33780
|
-
unhandledByDesign = new Map([["AWS::EFS::FileSystem", new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider. Tracked as a follow-up to issue #609."]])], ["AWS::EFS::AccessPoint", new Map([["ClientToken", "AWS SDK manages this idempotency token internally on CreateAccessPoint; no user-supplied value is honored"]])]]);
|
|
33777
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::EFS::FileSystem", /* @__PURE__ */ new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider. Tracked as a follow-up to issue #609."]])], ["AWS::EFS::AccessPoint", /* @__PURE__ */ new Map([["ClientToken", "AWS SDK manages this idempotency token internally on CreateAccessPoint; no user-supplied value is honored"]])]]);
|
|
33781
33778
|
getClient() {
|
|
33782
33779
|
if (!this.client) this.client = new EFSClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
33783
33780
|
return this.client;
|
|
@@ -34413,14 +34410,14 @@ var EFSProvider = class {
|
|
|
34413
34410
|
* storage-capacity growth and deletes can take substantially longer —
|
|
34414
34411
|
* mirror the Custom Resource provider's 1-hour ceiling.
|
|
34415
34412
|
*/
|
|
34416
|
-
const DEFAULT_MAX_WAIT_MS$
|
|
34417
|
-
const DEFAULT_POLL_INTERVAL_MS$
|
|
34413
|
+
const DEFAULT_MAX_WAIT_MS$3 = 3600 * 1e3;
|
|
34414
|
+
const DEFAULT_POLL_INTERVAL_MS$3 = 15e3;
|
|
34418
34415
|
/**
|
|
34419
34416
|
* Lustre sub-properties that `UpdateFileSystem` accepts (the mutable
|
|
34420
34417
|
* subset of the CFn `LustreConfiguration` block). Everything else in the
|
|
34421
34418
|
* block is fixed at creation — FSx has no API to change it in place.
|
|
34422
34419
|
*/
|
|
34423
|
-
const LUSTRE_MUTABLE_SUBPROPS = new Set([
|
|
34420
|
+
const LUSTRE_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
|
|
34424
34421
|
"WeeklyMaintenanceStartTime",
|
|
34425
34422
|
"DailyAutomaticBackupStartTime",
|
|
34426
34423
|
"AutomaticBackupRetentionDays",
|
|
@@ -34432,6 +34429,94 @@ const LUSTRE_MUTABLE_SUBPROPS = new Set([
|
|
|
34432
34429
|
"DataReadCacheConfiguration"
|
|
34433
34430
|
]);
|
|
34434
34431
|
/**
|
|
34432
|
+
* `WindowsConfiguration` sub-properties `UpdateFileSystem` accepts (the
|
|
34433
|
+
* mutable subset — mirrors `UpdateFileSystemWindowsConfiguration`).
|
|
34434
|
+
* Everything else in the CFn block (ActiveDirectoryId, DeploymentType,
|
|
34435
|
+
* PreferredSubnetId, Aliases, ...) is fixed at creation, so a change on one
|
|
34436
|
+
* is rejected by update() with a `--replace` pointer.
|
|
34437
|
+
*/
|
|
34438
|
+
const WINDOWS_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
|
|
34439
|
+
"WeeklyMaintenanceStartTime",
|
|
34440
|
+
"DailyAutomaticBackupStartTime",
|
|
34441
|
+
"AutomaticBackupRetentionDays",
|
|
34442
|
+
"ThroughputCapacity",
|
|
34443
|
+
"SelfManagedActiveDirectoryConfiguration",
|
|
34444
|
+
"AuditLogConfiguration",
|
|
34445
|
+
"DiskIopsConfiguration",
|
|
34446
|
+
"FsrmConfiguration"
|
|
34447
|
+
]);
|
|
34448
|
+
/**
|
|
34449
|
+
* `OntapConfiguration` sub-properties `UpdateFileSystem` accepts (mirrors
|
|
34450
|
+
* `UpdateFileSystemOntapConfiguration`). `RouteTableIds` is mutable but the
|
|
34451
|
+
* API expresses the change as Add/Remove deltas, computed in
|
|
34452
|
+
* {@link FSxFileSystemProvider.applyOntapUpdateField}.
|
|
34453
|
+
*/
|
|
34454
|
+
const ONTAP_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
|
|
34455
|
+
"AutomaticBackupRetentionDays",
|
|
34456
|
+
"DailyAutomaticBackupStartTime",
|
|
34457
|
+
"FsxAdminPassword",
|
|
34458
|
+
"WeeklyMaintenanceStartTime",
|
|
34459
|
+
"DiskIopsConfiguration",
|
|
34460
|
+
"ThroughputCapacity",
|
|
34461
|
+
"ThroughputCapacityPerHAPair",
|
|
34462
|
+
"HAPairs",
|
|
34463
|
+
"RouteTableIds",
|
|
34464
|
+
"EndpointIpv6AddressRange"
|
|
34465
|
+
]);
|
|
34466
|
+
/**
|
|
34467
|
+
* `OpenZFSConfiguration` sub-properties `UpdateFileSystem` accepts (mirrors
|
|
34468
|
+
* `UpdateFileSystemOpenZFSConfiguration`). `RouteTableIds` is mutable via
|
|
34469
|
+
* Add/Remove deltas (see {@link FSxFileSystemProvider.applyOpenZFSUpdateField}).
|
|
34470
|
+
* `RootVolumeConfiguration` is NOT here — its fields change through the root
|
|
34471
|
+
* volume's own `UpdateVolume` API, which `UpdateFileSystem` cannot express,
|
|
34472
|
+
* so a change is rejected with a `--replace` pointer.
|
|
34473
|
+
*/
|
|
34474
|
+
const OPENZFS_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
|
|
34475
|
+
"AutomaticBackupRetentionDays",
|
|
34476
|
+
"CopyTagsToBackups",
|
|
34477
|
+
"CopyTagsToVolumes",
|
|
34478
|
+
"DailyAutomaticBackupStartTime",
|
|
34479
|
+
"ThroughputCapacity",
|
|
34480
|
+
"WeeklyMaintenanceStartTime",
|
|
34481
|
+
"DiskIopsConfiguration",
|
|
34482
|
+
"RouteTableIds",
|
|
34483
|
+
"ReadCacheConfiguration",
|
|
34484
|
+
"EndpointIpv6AddressRange"
|
|
34485
|
+
]);
|
|
34486
|
+
/**
|
|
34487
|
+
* The four `FileSystemType` values → their CFn variant-config property name.
|
|
34488
|
+
* Each `CreateFileSystem`/`UpdateFileSystem` call carries at most one of
|
|
34489
|
+
* these blocks (the one matching the file system's type).
|
|
34490
|
+
*/
|
|
34491
|
+
const VARIANT_CONFIG_KEY = {
|
|
34492
|
+
LUSTRE: "LustreConfiguration",
|
|
34493
|
+
WINDOWS: "WindowsConfiguration",
|
|
34494
|
+
ONTAP: "OntapConfiguration",
|
|
34495
|
+
OPENZFS: "OpenZFSConfiguration"
|
|
34496
|
+
};
|
|
34497
|
+
const VARIANT_MUTABLE_SUBPROPS = {
|
|
34498
|
+
LustreConfiguration: LUSTRE_MUTABLE_SUBPROPS,
|
|
34499
|
+
WindowsConfiguration: WINDOWS_MUTABLE_SUBPROPS,
|
|
34500
|
+
OntapConfiguration: ONTAP_MUTABLE_SUBPROPS,
|
|
34501
|
+
OpenZFSConfiguration: OPENZFS_MUTABLE_SUBPROPS
|
|
34502
|
+
};
|
|
34503
|
+
/**
|
|
34504
|
+
* Compute the Add/Remove route-table-id deltas an ONTAP / OpenZFS
|
|
34505
|
+
* `UpdateFileSystem` needs from the previous vs. next `RouteTableIds` list.
|
|
34506
|
+
* Route table membership is an unordered set, so a pure reorder yields no
|
|
34507
|
+
* delta.
|
|
34508
|
+
*/
|
|
34509
|
+
const routeTableDelta = (next, prev) => {
|
|
34510
|
+
const nextIds = new Set(next ?? []);
|
|
34511
|
+
const prevIds = new Set(prev ?? []);
|
|
34512
|
+
const add = [...nextIds].filter((id) => !prevIds.has(id));
|
|
34513
|
+
const remove = [...prevIds].filter((id) => !nextIds.has(id));
|
|
34514
|
+
return {
|
|
34515
|
+
...add.length > 0 && { add },
|
|
34516
|
+
...remove.length > 0 && { remove }
|
|
34517
|
+
};
|
|
34518
|
+
};
|
|
34519
|
+
/**
|
|
34435
34520
|
* Top-level properties that are create-only per the CFn registry schema
|
|
34436
34521
|
* (`createOnlyProperties`). A change on any of these is routed through
|
|
34437
34522
|
* DELETE+CREATE by the replacement-detection layer; if a diff somehow
|
|
@@ -34445,7 +34530,7 @@ const TOP_LEVEL_IMMUTABLE_PROPS = [
|
|
|
34445
34530
|
"KmsKeyId",
|
|
34446
34531
|
"BackupId"
|
|
34447
34532
|
];
|
|
34448
|
-
const toNumber$
|
|
34533
|
+
const toNumber$3 = (v) => v === void 0 ? void 0 : Number(v);
|
|
34449
34534
|
const toBoolean$1 = (v) => {
|
|
34450
34535
|
if (v === void 0) return void 0;
|
|
34451
34536
|
if (typeof v === "string") return v === "true";
|
|
@@ -34457,12 +34542,11 @@ const toBoolean$1 = (v) => {
|
|
|
34457
34542
|
* The type is `ProvisioningType: NON_PROVISIONABLE` in the CFn registry,
|
|
34458
34543
|
* so cdkd's Cloud Control fallback cannot handle it (issue #1042).
|
|
34459
34544
|
*
|
|
34460
|
-
*
|
|
34461
|
-
*
|
|
34462
|
-
*
|
|
34463
|
-
*
|
|
34464
|
-
* the
|
|
34465
|
-
* variant block, so no non-Lustre template can slip past the pre-flight).
|
|
34545
|
+
* Supported variants: **Lustre** (the CDK L2 `aws-fsx.LustreFileSystem`),
|
|
34546
|
+
* **Windows** (FSx for Windows File Server), **ONTAP** (FSx for NetApp
|
|
34547
|
+
* ONTAP), and **OpenZFS** (FSx for OpenZFS) — each carries its own
|
|
34548
|
+
* `<Variant>Configuration` block, mapped per-variant on create and diffed
|
|
34549
|
+
* against the `UpdateFileSystem` mutable surface on update (issue #1068).
|
|
34466
34550
|
*
|
|
34467
34551
|
* Lifecycle handling — every mutation is async on AWS:
|
|
34468
34552
|
* - `create` → `CreateFileSystem` (or `CreateFileSystemFromBackup` when
|
|
@@ -34497,27 +34581,26 @@ var FSxFileSystemProvider = class {
|
|
|
34497
34581
|
pollIntervalMs;
|
|
34498
34582
|
maxWaitMs;
|
|
34499
34583
|
constructor(options) {
|
|
34500
|
-
this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$
|
|
34501
|
-
this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$
|
|
34584
|
+
this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$3;
|
|
34585
|
+
this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$3;
|
|
34502
34586
|
}
|
|
34503
|
-
handledProperties = new Map([["AWS::FSx::FileSystem", new Set([
|
|
34587
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::FSx::FileSystem", /* @__PURE__ */ new Set([
|
|
34504
34588
|
"BackupId",
|
|
34505
34589
|
"FileSystemType",
|
|
34506
34590
|
"FileSystemTypeVersion",
|
|
34507
34591
|
"KmsKeyId",
|
|
34508
34592
|
"LustreConfiguration",
|
|
34509
34593
|
"NetworkType",
|
|
34594
|
+
"OntapConfiguration",
|
|
34595
|
+
"OpenZFSConfiguration",
|
|
34510
34596
|
"SecurityGroupIds",
|
|
34511
34597
|
"StorageCapacity",
|
|
34512
34598
|
"StorageType",
|
|
34513
34599
|
"SubnetIds",
|
|
34514
|
-
"Tags"
|
|
34515
|
-
|
|
34516
|
-
unhandledByDesign = new Map([["AWS::FSx::FileSystem", new Map([
|
|
34517
|
-
["WindowsConfiguration", "FSx for Windows File Server variant — requires Active Directory wiring and Windows-specific update/delete semantics (final backups, throughput tiers) that v1 does not implement; only the Lustre variant (the CDK L2) is supported. Follow-up to issue #1042."],
|
|
34518
|
-
["OntapConfiguration", "FSx for NetApp ONTAP variant — the file system is only a container for SVMs/volumes (separate AWS::FSx::StorageVirtualMachine / AWS::FSx::Volume types, both still unsupported), so shipping it alone would be misleading; only the Lustre variant is supported in v1. Follow-up to issue #1042."],
|
|
34519
|
-
["OpenZFSConfiguration", "FSx for OpenZFS variant — root-volume semantics (RootVolumeId, child AWS::FSx::Volume trees) are not implemented in v1; only the Lustre variant is supported. Follow-up to issue #1042."]
|
|
34600
|
+
"Tags",
|
|
34601
|
+
"WindowsConfiguration"
|
|
34520
34602
|
])]]);
|
|
34603
|
+
unhandledByDesign = /* @__PURE__ */ new Map();
|
|
34521
34604
|
getClient() {
|
|
34522
34605
|
if (!this.client) this.client = new FSxClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
34523
34606
|
return this.client;
|
|
@@ -34535,7 +34618,7 @@ var FSxFileSystemProvider = class {
|
|
|
34535
34618
|
if (resourceType !== "AWS::FSx::FileSystem") throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
|
|
34536
34619
|
const backupId = properties["BackupId"];
|
|
34537
34620
|
const fileSystemType = properties["FileSystemType"];
|
|
34538
|
-
if (backupId === void 0 && fileSystemType !==
|
|
34621
|
+
if (backupId === void 0 && !(fileSystemType !== void 0 && fileSystemType in VARIANT_CONFIG_KEY)) throw new ProvisioningError(`AWS::FSx::FileSystem: FileSystemType '${fileSystemType ?? "(unset)"}' is not supported by cdkd — expected one of ${Object.keys(VARIANT_CONFIG_KEY).join(" / ")}.`, resourceType, logicalId);
|
|
34539
34622
|
this.logger.debug(`Creating FSx FileSystem ${logicalId}`);
|
|
34540
34623
|
const tokenHash = createHash("sha256").update([
|
|
34541
34624
|
properties["FileSystemType"],
|
|
@@ -34552,10 +34635,13 @@ var FSxFileSystemProvider = class {
|
|
|
34552
34635
|
SecurityGroupIds: properties["SecurityGroupIds"],
|
|
34553
34636
|
KmsKeyId: properties["KmsKeyId"],
|
|
34554
34637
|
StorageType: properties["StorageType"],
|
|
34555
|
-
StorageCapacity: toNumber$
|
|
34638
|
+
StorageCapacity: toNumber$3(properties["StorageCapacity"]),
|
|
34556
34639
|
FileSystemTypeVersion: properties["FileSystemTypeVersion"],
|
|
34557
34640
|
NetworkType: properties["NetworkType"],
|
|
34558
34641
|
LustreConfiguration: this.toCreateLustreConfiguration(properties["LustreConfiguration"]),
|
|
34642
|
+
WindowsConfiguration: this.toCreateWindowsConfiguration(properties["WindowsConfiguration"]),
|
|
34643
|
+
OntapConfiguration: this.toCreateOntapConfiguration(properties["OntapConfiguration"]),
|
|
34644
|
+
OpenZFSConfiguration: this.toCreateOpenZFSConfiguration(properties["OpenZFSConfiguration"]),
|
|
34559
34645
|
Tags: tags?.map((t) => ({
|
|
34560
34646
|
Key: t.Key,
|
|
34561
34647
|
Value: t.Value
|
|
@@ -34605,27 +34691,158 @@ var FSxFileSystemProvider = class {
|
|
|
34605
34691
|
WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
|
|
34606
34692
|
ImportPath: config["ImportPath"],
|
|
34607
34693
|
ExportPath: config["ExportPath"],
|
|
34608
|
-
ImportedFileChunkSize: toNumber$
|
|
34694
|
+
ImportedFileChunkSize: toNumber$3(config["ImportedFileChunkSize"]),
|
|
34609
34695
|
DeploymentType: config["DeploymentType"],
|
|
34610
34696
|
AutoImportPolicy: config["AutoImportPolicy"],
|
|
34611
|
-
PerUnitStorageThroughput: toNumber$
|
|
34697
|
+
PerUnitStorageThroughput: toNumber$3(config["PerUnitStorageThroughput"]),
|
|
34612
34698
|
DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
|
|
34613
|
-
AutomaticBackupRetentionDays: toNumber$
|
|
34699
|
+
AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
|
|
34614
34700
|
CopyTagsToBackups: toBoolean$1(config["CopyTagsToBackups"]),
|
|
34615
34701
|
DriveCacheType: config["DriveCacheType"],
|
|
34616
34702
|
DataCompressionType: config["DataCompressionType"],
|
|
34617
34703
|
EfaEnabled: toBoolean$1(config["EfaEnabled"]),
|
|
34618
|
-
ThroughputCapacity: toNumber$
|
|
34704
|
+
ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
|
|
34619
34705
|
MetadataConfiguration: metadata ? {
|
|
34620
34706
|
Mode: metadata["Mode"],
|
|
34621
|
-
Iops: toNumber$
|
|
34707
|
+
Iops: toNumber$3(metadata["Iops"])
|
|
34622
34708
|
} : void 0,
|
|
34623
34709
|
DataReadCacheConfiguration: readCache ? {
|
|
34624
34710
|
SizingMode: readCache["SizingMode"],
|
|
34625
|
-
SizeGiB: toNumber$
|
|
34711
|
+
SizeGiB: toNumber$3(readCache["SizeGiB"])
|
|
34626
34712
|
} : void 0
|
|
34627
34713
|
};
|
|
34628
34714
|
}
|
|
34715
|
+
/** Map the CFn `WindowsConfiguration` block to the SDK create shape. */
|
|
34716
|
+
toCreateWindowsConfiguration(config) {
|
|
34717
|
+
if (!config) return void 0;
|
|
34718
|
+
return {
|
|
34719
|
+
ActiveDirectoryId: config["ActiveDirectoryId"],
|
|
34720
|
+
SelfManagedActiveDirectoryConfiguration: this.toSelfManagedAdConfiguration(config["SelfManagedActiveDirectoryConfiguration"]),
|
|
34721
|
+
DeploymentType: config["DeploymentType"],
|
|
34722
|
+
PreferredSubnetId: config["PreferredSubnetId"],
|
|
34723
|
+
ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
|
|
34724
|
+
WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
|
|
34725
|
+
DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
|
|
34726
|
+
AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
|
|
34727
|
+
CopyTagsToBackups: toBoolean$1(config["CopyTagsToBackups"]),
|
|
34728
|
+
Aliases: config["Aliases"],
|
|
34729
|
+
AuditLogConfiguration: this.toWindowsAuditLogConfiguration(config["AuditLogConfiguration"]),
|
|
34730
|
+
DiskIopsConfiguration: this.toDiskIopsConfiguration(config["DiskIopsConfiguration"]),
|
|
34731
|
+
FsrmConfiguration: this.toWindowsFsrmConfiguration(config["FsrmConfiguration"])
|
|
34732
|
+
};
|
|
34733
|
+
}
|
|
34734
|
+
/** Map the CFn `OntapConfiguration` block to the SDK create shape. */
|
|
34735
|
+
toCreateOntapConfiguration(config) {
|
|
34736
|
+
if (!config) return void 0;
|
|
34737
|
+
return {
|
|
34738
|
+
AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
|
|
34739
|
+
DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
|
|
34740
|
+
DeploymentType: config["DeploymentType"],
|
|
34741
|
+
EndpointIpAddressRange: config["EndpointIpAddressRange"],
|
|
34742
|
+
FsxAdminPassword: config["FsxAdminPassword"],
|
|
34743
|
+
DiskIopsConfiguration: this.toDiskIopsConfiguration(config["DiskIopsConfiguration"]),
|
|
34744
|
+
PreferredSubnetId: config["PreferredSubnetId"],
|
|
34745
|
+
RouteTableIds: config["RouteTableIds"],
|
|
34746
|
+
ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
|
|
34747
|
+
WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
|
|
34748
|
+
HAPairs: toNumber$3(config["HAPairs"]),
|
|
34749
|
+
ThroughputCapacityPerHAPair: toNumber$3(config["ThroughputCapacityPerHAPair"]),
|
|
34750
|
+
EndpointIpv6AddressRange: config["EndpointIpv6AddressRange"]
|
|
34751
|
+
};
|
|
34752
|
+
}
|
|
34753
|
+
/** Map the CFn `OpenZFSConfiguration` block to the SDK create shape. */
|
|
34754
|
+
toCreateOpenZFSConfiguration(config) {
|
|
34755
|
+
if (!config) return void 0;
|
|
34756
|
+
return {
|
|
34757
|
+
AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
|
|
34758
|
+
CopyTagsToBackups: toBoolean$1(config["CopyTagsToBackups"]),
|
|
34759
|
+
CopyTagsToVolumes: toBoolean$1(config["CopyTagsToVolumes"]),
|
|
34760
|
+
DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
|
|
34761
|
+
DeploymentType: config["DeploymentType"],
|
|
34762
|
+
ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
|
|
34763
|
+
WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
|
|
34764
|
+
DiskIopsConfiguration: this.toDiskIopsConfiguration(config["DiskIopsConfiguration"]),
|
|
34765
|
+
RootVolumeConfiguration: this.toOpenZFSRootVolumeConfiguration(config["RootVolumeConfiguration"]),
|
|
34766
|
+
PreferredSubnetId: config["PreferredSubnetId"],
|
|
34767
|
+
EndpointIpAddressRange: config["EndpointIpAddressRange"],
|
|
34768
|
+
EndpointIpv6AddressRange: config["EndpointIpv6AddressRange"],
|
|
34769
|
+
RouteTableIds: config["RouteTableIds"],
|
|
34770
|
+
ReadCacheConfiguration: this.toOpenZFSReadCacheConfiguration(config["ReadCacheConfiguration"])
|
|
34771
|
+
};
|
|
34772
|
+
}
|
|
34773
|
+
toDiskIopsConfiguration(config) {
|
|
34774
|
+
if (!config) return void 0;
|
|
34775
|
+
return {
|
|
34776
|
+
Mode: config["Mode"],
|
|
34777
|
+
Iops: toNumber$3(config["Iops"])
|
|
34778
|
+
};
|
|
34779
|
+
}
|
|
34780
|
+
toSelfManagedAdConfiguration(config) {
|
|
34781
|
+
if (!config) return void 0;
|
|
34782
|
+
return {
|
|
34783
|
+
DomainName: config["DomainName"],
|
|
34784
|
+
OrganizationalUnitDistinguishedName: config["OrganizationalUnitDistinguishedName"],
|
|
34785
|
+
FileSystemAdministratorsGroup: config["FileSystemAdministratorsGroup"],
|
|
34786
|
+
UserName: config["UserName"],
|
|
34787
|
+
Password: config["Password"],
|
|
34788
|
+
DnsIps: config["DnsIps"],
|
|
34789
|
+
DomainJoinServiceAccountSecret: config["DomainJoinServiceAccountSecret"]
|
|
34790
|
+
};
|
|
34791
|
+
}
|
|
34792
|
+
toSelfManagedAdConfigurationUpdates(config) {
|
|
34793
|
+
if (!config) return void 0;
|
|
34794
|
+
return {
|
|
34795
|
+
UserName: config["UserName"],
|
|
34796
|
+
Password: config["Password"],
|
|
34797
|
+
DnsIps: config["DnsIps"],
|
|
34798
|
+
DomainName: config["DomainName"],
|
|
34799
|
+
OrganizationalUnitDistinguishedName: config["OrganizationalUnitDistinguishedName"],
|
|
34800
|
+
FileSystemAdministratorsGroup: config["FileSystemAdministratorsGroup"],
|
|
34801
|
+
DomainJoinServiceAccountSecret: config["DomainJoinServiceAccountSecret"]
|
|
34802
|
+
};
|
|
34803
|
+
}
|
|
34804
|
+
toWindowsAuditLogConfiguration(config) {
|
|
34805
|
+
if (!config) return void 0;
|
|
34806
|
+
return {
|
|
34807
|
+
FileAccessAuditLogLevel: config["FileAccessAuditLogLevel"],
|
|
34808
|
+
FileShareAccessAuditLogLevel: config["FileShareAccessAuditLogLevel"],
|
|
34809
|
+
AuditLogDestination: config["AuditLogDestination"]
|
|
34810
|
+
};
|
|
34811
|
+
}
|
|
34812
|
+
toWindowsFsrmConfiguration(config) {
|
|
34813
|
+
if (!config) return void 0;
|
|
34814
|
+
return {
|
|
34815
|
+
FsrmServiceEnabled: toBoolean$1(config["FsrmServiceEnabled"]),
|
|
34816
|
+
EventLogDestination: config["EventLogDestination"]
|
|
34817
|
+
};
|
|
34818
|
+
}
|
|
34819
|
+
toOpenZFSRootVolumeConfiguration(config) {
|
|
34820
|
+
if (!config) return void 0;
|
|
34821
|
+
const nfsExports = config["NfsExports"];
|
|
34822
|
+
const quotas = config["UserAndGroupQuotas"];
|
|
34823
|
+
return {
|
|
34824
|
+
RecordSizeKiB: toNumber$3(config["RecordSizeKiB"]),
|
|
34825
|
+
DataCompressionType: config["DataCompressionType"],
|
|
34826
|
+
NfsExports: nfsExports?.map((exp) => ({ ClientConfigurations: (exp["ClientConfigurations"] ?? []).map((cc) => ({
|
|
34827
|
+
Clients: cc["Clients"],
|
|
34828
|
+
Options: cc["Options"]
|
|
34829
|
+
})) })),
|
|
34830
|
+
UserAndGroupQuotas: quotas?.map((q) => ({
|
|
34831
|
+
Type: q["Type"],
|
|
34832
|
+
Id: toNumber$3(q["Id"]),
|
|
34833
|
+
StorageCapacityQuotaGiB: toNumber$3(q["StorageCapacityQuotaGiB"])
|
|
34834
|
+
})),
|
|
34835
|
+
CopyTagsToSnapshots: toBoolean$1(config["CopyTagsToSnapshots"]),
|
|
34836
|
+
ReadOnly: toBoolean$1(config["ReadOnly"])
|
|
34837
|
+
};
|
|
34838
|
+
}
|
|
34839
|
+
toOpenZFSReadCacheConfiguration(config) {
|
|
34840
|
+
if (!config) return void 0;
|
|
34841
|
+
return {
|
|
34842
|
+
SizingMode: config["SizingMode"],
|
|
34843
|
+
SizeGiB: toNumber$3(config["SizeGiB"])
|
|
34844
|
+
};
|
|
34845
|
+
}
|
|
34629
34846
|
async update(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
34630
34847
|
const changed = (key) => JSON.stringify(properties[key]) !== JSON.stringify(previousProperties[key]);
|
|
34631
34848
|
for (const key of TOP_LEVEL_IMMUTABLE_PROPS) {
|
|
@@ -34633,55 +34850,17 @@ var FSxFileSystemProvider = class {
|
|
|
34633
34850
|
const prev = previousProperties[key];
|
|
34634
34851
|
if (JSON.stringify(next ?? null) !== JSON.stringify(prev ?? null)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS FSx FileSystem ${key} is immutable on AWS — UpdateFileSystem does not accept ${key}; the property is fixed at creation. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
|
|
34635
34852
|
}
|
|
34636
|
-
const
|
|
34637
|
-
const
|
|
34638
|
-
|
|
34639
|
-
|
|
34640
|
-
|
|
34641
|
-
for (const key of lustreKeys) {
|
|
34642
|
-
const next = nextLustre[key];
|
|
34643
|
-
const prev = prevLustre[key];
|
|
34644
|
-
if (JSON.stringify(next) === JSON.stringify(prev)) continue;
|
|
34645
|
-
if (!LUSTRE_MUTABLE_SUBPROPS.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS FSx FileSystem LustreConfiguration.${key} is immutable on AWS — UpdateFileSystem cannot change it after creation. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
|
|
34646
|
-
lustreHasMutableDiff = true;
|
|
34647
|
-
switch (key) {
|
|
34648
|
-
case "WeeklyMaintenanceStartTime":
|
|
34649
|
-
case "DailyAutomaticBackupStartTime":
|
|
34650
|
-
lustreMutableDiff[key] = next;
|
|
34651
|
-
break;
|
|
34652
|
-
case "AutomaticBackupRetentionDays":
|
|
34653
|
-
case "PerUnitStorageThroughput":
|
|
34654
|
-
case "ThroughputCapacity":
|
|
34655
|
-
lustreMutableDiff[key] = toNumber$1(next);
|
|
34656
|
-
break;
|
|
34657
|
-
case "AutoImportPolicy":
|
|
34658
|
-
case "DataCompressionType":
|
|
34659
|
-
lustreMutableDiff[key] = next;
|
|
34660
|
-
break;
|
|
34661
|
-
case "MetadataConfiguration": {
|
|
34662
|
-
const metadata = next;
|
|
34663
|
-
lustreMutableDiff.MetadataConfiguration = metadata ? {
|
|
34664
|
-
Mode: metadata["Mode"],
|
|
34665
|
-
Iops: toNumber$1(metadata["Iops"])
|
|
34666
|
-
} : void 0;
|
|
34667
|
-
break;
|
|
34668
|
-
}
|
|
34669
|
-
case "DataReadCacheConfiguration": {
|
|
34670
|
-
const readCache = next;
|
|
34671
|
-
lustreMutableDiff.DataReadCacheConfiguration = readCache ? {
|
|
34672
|
-
SizingMode: readCache["SizingMode"],
|
|
34673
|
-
SizeGiB: toNumber$1(readCache["SizeGiB"])
|
|
34674
|
-
} : void 0;
|
|
34675
|
-
break;
|
|
34676
|
-
}
|
|
34677
|
-
}
|
|
34678
|
-
}
|
|
34853
|
+
const variantConfigKey = this.detectVariantConfigKey(properties, previousProperties);
|
|
34854
|
+
const { diff: variantDiff, hasMutableDiff: variantHasMutableDiff } = variantConfigKey ? this.computeVariantConfigDiff(resourceType, logicalId, variantConfigKey, properties[variantConfigKey] ?? {}, previousProperties[variantConfigKey] ?? {}) : {
|
|
34855
|
+
diff: {},
|
|
34856
|
+
hasMutableDiff: false
|
|
34857
|
+
};
|
|
34679
34858
|
const storageCapacityChanged = changed("StorageCapacity");
|
|
34680
34859
|
const storageTypeChanged = changed("StorageType");
|
|
34681
34860
|
const typeVersionChanged = changed("FileSystemTypeVersion");
|
|
34682
34861
|
const networkTypeChanged = changed("NetworkType");
|
|
34683
34862
|
const tagsChanged = changed("Tags");
|
|
34684
|
-
if (!
|
|
34863
|
+
if (!variantHasMutableDiff && !storageCapacityChanged && !storageTypeChanged && !typeVersionChanged && !networkTypeChanged && !tagsChanged) {
|
|
34685
34864
|
this.logger.debug(`No mutable diff for FSx FileSystem ${logicalId}, skipping update`);
|
|
34686
34865
|
return {
|
|
34687
34866
|
physicalId,
|
|
@@ -34690,17 +34869,17 @@ var FSxFileSystemProvider = class {
|
|
|
34690
34869
|
}
|
|
34691
34870
|
this.logger.debug(`Updating FSx FileSystem ${logicalId}: ${physicalId}`);
|
|
34692
34871
|
try {
|
|
34693
|
-
const needsUpdateCall =
|
|
34872
|
+
const needsUpdateCall = variantHasMutableDiff || storageCapacityChanged || storageTypeChanged || typeVersionChanged || networkTypeChanged;
|
|
34694
34873
|
let updatedFs;
|
|
34695
34874
|
if (needsUpdateCall) {
|
|
34696
34875
|
const callTimeMs = Date.now();
|
|
34697
34876
|
const respPendingActions = ((await this.getClient().send(new UpdateFileSystemCommand$1({
|
|
34698
34877
|
FileSystemId: physicalId,
|
|
34699
|
-
...storageCapacityChanged && { StorageCapacity: toNumber$
|
|
34878
|
+
...storageCapacityChanged && { StorageCapacity: toNumber$3(properties["StorageCapacity"]) },
|
|
34700
34879
|
...storageTypeChanged && { StorageType: properties["StorageType"] },
|
|
34701
34880
|
...typeVersionChanged && { FileSystemTypeVersion: properties["FileSystemTypeVersion"] },
|
|
34702
34881
|
...networkTypeChanged && { NetworkType: properties["NetworkType"] },
|
|
34703
|
-
...
|
|
34882
|
+
...variantHasMutableDiff && variantConfigKey ? { [variantConfigKey]: variantDiff } : {}
|
|
34704
34883
|
}))).FileSystem?.AdministrativeActions ?? []).filter((a) => a.AdministrativeActionType === "FILE_SYSTEM_UPDATE" && (a.Status === "PENDING" || a.Status === "IN_PROGRESS"));
|
|
34705
34884
|
const requestTimes = respPendingActions.map((a) => a.RequestTime?.getTime()).filter((t) => t !== void 0);
|
|
34706
34885
|
const actionThresholdMs = requestTimes.length > 0 ? Math.min(...requestTimes) : callTimeMs - 6e4;
|
|
@@ -34725,6 +34904,156 @@ var FSxFileSystemProvider = class {
|
|
|
34725
34904
|
}
|
|
34726
34905
|
}
|
|
34727
34906
|
/**
|
|
34907
|
+
* Which `<Variant>Configuration` block (if any) is present on either side
|
|
34908
|
+
* of the update. At most one is expected — the file system's type never
|
|
34909
|
+
* changes (FileSystemType is registry-createOnly, guarded above).
|
|
34910
|
+
*/
|
|
34911
|
+
detectVariantConfigKey(properties, previousProperties) {
|
|
34912
|
+
for (const key of Object.values(VARIANT_CONFIG_KEY)) if (properties[key] !== void 0 || previousProperties[key] !== void 0) return key;
|
|
34913
|
+
}
|
|
34914
|
+
/**
|
|
34915
|
+
* Diff a variant config block's sub-properties into the SDK
|
|
34916
|
+
* `UpdateFileSystem<Variant>Configuration` shape. A changed sub-field that
|
|
34917
|
+
* is NOT in the variant's mutable set is rejected with a `--replace`
|
|
34918
|
+
* pointer (UpdateFileSystem cannot express it).
|
|
34919
|
+
*/
|
|
34920
|
+
computeVariantConfigDiff(resourceType, logicalId, configKey, next, prev) {
|
|
34921
|
+
const mutable = VARIANT_MUTABLE_SUBPROPS[configKey] ?? /* @__PURE__ */ new Set();
|
|
34922
|
+
const keys = /* @__PURE__ */ new Set([...Object.keys(next), ...Object.keys(prev)]);
|
|
34923
|
+
const diff = {};
|
|
34924
|
+
let hasMutableDiff = false;
|
|
34925
|
+
for (const key of keys) {
|
|
34926
|
+
const nextVal = next[key];
|
|
34927
|
+
const prevVal = prev[key];
|
|
34928
|
+
if (JSON.stringify(nextVal) === JSON.stringify(prevVal)) continue;
|
|
34929
|
+
if (!mutable.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS FSx FileSystem ${configKey}.${key} is immutable on AWS — UpdateFileSystem cannot change it after creation. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
|
|
34930
|
+
if (configKey === "LustreConfiguration" ? this.applyLustreUpdateField(key, nextVal, diff) : configKey === "WindowsConfiguration" ? this.applyWindowsUpdateField(key, nextVal, diff) : configKey === "OntapConfiguration" ? this.applyOntapUpdateField(key, nextVal, prevVal, diff) : this.applyOpenZFSUpdateField(key, nextVal, prevVal, diff)) hasMutableDiff = true;
|
|
34931
|
+
}
|
|
34932
|
+
return {
|
|
34933
|
+
diff,
|
|
34934
|
+
hasMutableDiff
|
|
34935
|
+
};
|
|
34936
|
+
}
|
|
34937
|
+
applyLustreUpdateField(key, next, diff) {
|
|
34938
|
+
const out = diff;
|
|
34939
|
+
switch (key) {
|
|
34940
|
+
case "WeeklyMaintenanceStartTime":
|
|
34941
|
+
case "DailyAutomaticBackupStartTime":
|
|
34942
|
+
diff[key] = next;
|
|
34943
|
+
break;
|
|
34944
|
+
case "AutomaticBackupRetentionDays":
|
|
34945
|
+
case "PerUnitStorageThroughput":
|
|
34946
|
+
case "ThroughputCapacity":
|
|
34947
|
+
diff[key] = toNumber$3(next);
|
|
34948
|
+
break;
|
|
34949
|
+
case "AutoImportPolicy":
|
|
34950
|
+
case "DataCompressionType":
|
|
34951
|
+
diff[key] = next;
|
|
34952
|
+
break;
|
|
34953
|
+
case "MetadataConfiguration": {
|
|
34954
|
+
const metadata = next;
|
|
34955
|
+
out.MetadataConfiguration = metadata ? {
|
|
34956
|
+
Mode: metadata["Mode"],
|
|
34957
|
+
Iops: toNumber$3(metadata["Iops"])
|
|
34958
|
+
} : void 0;
|
|
34959
|
+
break;
|
|
34960
|
+
}
|
|
34961
|
+
case "DataReadCacheConfiguration": {
|
|
34962
|
+
const readCache = next;
|
|
34963
|
+
out.DataReadCacheConfiguration = readCache ? {
|
|
34964
|
+
SizingMode: readCache["SizingMode"],
|
|
34965
|
+
SizeGiB: toNumber$3(readCache["SizeGiB"])
|
|
34966
|
+
} : void 0;
|
|
34967
|
+
break;
|
|
34968
|
+
}
|
|
34969
|
+
}
|
|
34970
|
+
return true;
|
|
34971
|
+
}
|
|
34972
|
+
applyWindowsUpdateField(key, next, diff) {
|
|
34973
|
+
const out = diff;
|
|
34974
|
+
switch (key) {
|
|
34975
|
+
case "WeeklyMaintenanceStartTime":
|
|
34976
|
+
case "DailyAutomaticBackupStartTime":
|
|
34977
|
+
diff[key] = next;
|
|
34978
|
+
break;
|
|
34979
|
+
case "AutomaticBackupRetentionDays":
|
|
34980
|
+
case "ThroughputCapacity":
|
|
34981
|
+
diff[key] = toNumber$3(next);
|
|
34982
|
+
break;
|
|
34983
|
+
case "SelfManagedActiveDirectoryConfiguration":
|
|
34984
|
+
out.SelfManagedActiveDirectoryConfiguration = this.toSelfManagedAdConfigurationUpdates(next);
|
|
34985
|
+
break;
|
|
34986
|
+
case "AuditLogConfiguration":
|
|
34987
|
+
out.AuditLogConfiguration = this.toWindowsAuditLogConfiguration(next);
|
|
34988
|
+
break;
|
|
34989
|
+
case "DiskIopsConfiguration":
|
|
34990
|
+
out.DiskIopsConfiguration = this.toDiskIopsConfiguration(next);
|
|
34991
|
+
break;
|
|
34992
|
+
case "FsrmConfiguration":
|
|
34993
|
+
out.FsrmConfiguration = this.toWindowsFsrmConfiguration(next);
|
|
34994
|
+
break;
|
|
34995
|
+
}
|
|
34996
|
+
return true;
|
|
34997
|
+
}
|
|
34998
|
+
applyOntapUpdateField(key, next, prev, diff) {
|
|
34999
|
+
const out = diff;
|
|
35000
|
+
switch (key) {
|
|
35001
|
+
case "DailyAutomaticBackupStartTime":
|
|
35002
|
+
case "WeeklyMaintenanceStartTime":
|
|
35003
|
+
case "FsxAdminPassword":
|
|
35004
|
+
case "EndpointIpv6AddressRange":
|
|
35005
|
+
diff[key] = next;
|
|
35006
|
+
break;
|
|
35007
|
+
case "AutomaticBackupRetentionDays":
|
|
35008
|
+
case "ThroughputCapacity":
|
|
35009
|
+
case "ThroughputCapacityPerHAPair":
|
|
35010
|
+
case "HAPairs":
|
|
35011
|
+
diff[key] = toNumber$3(next);
|
|
35012
|
+
break;
|
|
35013
|
+
case "DiskIopsConfiguration":
|
|
35014
|
+
out.DiskIopsConfiguration = this.toDiskIopsConfiguration(next);
|
|
35015
|
+
break;
|
|
35016
|
+
case "RouteTableIds": {
|
|
35017
|
+
const { add, remove } = routeTableDelta(next, prev);
|
|
35018
|
+
if (add) out.AddRouteTableIds = add;
|
|
35019
|
+
if (remove) out.RemoveRouteTableIds = remove;
|
|
35020
|
+
return add !== void 0 || remove !== void 0;
|
|
35021
|
+
}
|
|
35022
|
+
}
|
|
35023
|
+
return true;
|
|
35024
|
+
}
|
|
35025
|
+
applyOpenZFSUpdateField(key, next, prev, diff) {
|
|
35026
|
+
const out = diff;
|
|
35027
|
+
switch (key) {
|
|
35028
|
+
case "DailyAutomaticBackupStartTime":
|
|
35029
|
+
case "WeeklyMaintenanceStartTime":
|
|
35030
|
+
case "EndpointIpv6AddressRange":
|
|
35031
|
+
diff[key] = next;
|
|
35032
|
+
break;
|
|
35033
|
+
case "CopyTagsToBackups":
|
|
35034
|
+
case "CopyTagsToVolumes":
|
|
35035
|
+
diff[key] = toBoolean$1(next);
|
|
35036
|
+
break;
|
|
35037
|
+
case "AutomaticBackupRetentionDays":
|
|
35038
|
+
case "ThroughputCapacity":
|
|
35039
|
+
diff[key] = toNumber$3(next);
|
|
35040
|
+
break;
|
|
35041
|
+
case "DiskIopsConfiguration":
|
|
35042
|
+
out.DiskIopsConfiguration = this.toDiskIopsConfiguration(next);
|
|
35043
|
+
break;
|
|
35044
|
+
case "ReadCacheConfiguration":
|
|
35045
|
+
out.ReadCacheConfiguration = this.toOpenZFSReadCacheConfiguration(next);
|
|
35046
|
+
break;
|
|
35047
|
+
case "RouteTableIds": {
|
|
35048
|
+
const { add, remove } = routeTableDelta(next, prev);
|
|
35049
|
+
if (add) out.AddRouteTableIds = add;
|
|
35050
|
+
if (remove) out.RemoveRouteTableIds = remove;
|
|
35051
|
+
return add !== void 0 || remove !== void 0;
|
|
35052
|
+
}
|
|
35053
|
+
}
|
|
35054
|
+
return true;
|
|
35055
|
+
}
|
|
35056
|
+
/**
|
|
34728
35057
|
* Apply a `Tags` diff via `TagResource` / `UntagResource` (the FSx
|
|
34729
35058
|
* `UpdateFileSystem` API does not accept tags). Needs the ARN — resolve
|
|
34730
35059
|
* it from `DescribeFileSystems`.
|
|
@@ -34878,6 +35207,7 @@ var FSxFileSystemProvider = class {
|
|
|
34878
35207
|
if (fs.ResourceARN !== void 0) attributes["ResourceARN"] = fs.ResourceARN;
|
|
34879
35208
|
if (fs.DNSName !== void 0) attributes["DNSName"] = fs.DNSName;
|
|
34880
35209
|
if (fs.LustreConfiguration?.MountName !== void 0) attributes["LustreMountName"] = fs.LustreConfiguration.MountName;
|
|
35210
|
+
if (fs.OpenZFSConfiguration?.RootVolumeId !== void 0) attributes["RootVolumeId"] = fs.OpenZFSConfiguration.RootVolumeId;
|
|
34881
35211
|
if (fs.FileSystemId !== void 0) attributes["FileSystemId"] = fs.FileSystemId;
|
|
34882
35212
|
return attributes;
|
|
34883
35213
|
}
|
|
@@ -34899,10 +35229,23 @@ var FSxFileSystemProvider = class {
|
|
|
34899
35229
|
* interface ids, never the original security group list.
|
|
34900
35230
|
* - `BackupId` — creation-source input, not surfaced on the deployed
|
|
34901
35231
|
* file system.
|
|
35232
|
+
* - `WindowsConfiguration` / `OntapConfiguration` / `OpenZFSConfiguration`
|
|
35233
|
+
* — `readCurrentState` maps only the Lustre block back to CFn shape
|
|
35234
|
+
* today, so drift on the non-Lustre variant blocks is not yet computed;
|
|
35235
|
+
* marking them unknown avoids a guaranteed false positive on every run
|
|
35236
|
+
* (variant-config drift is a follow-up). Only the block matching the
|
|
35237
|
+
* file system's type is ever present in state, so listing all three is
|
|
35238
|
+
* harmless.
|
|
34902
35239
|
*/
|
|
34903
35240
|
getDriftUnknownPaths(resourceType) {
|
|
34904
35241
|
if (resourceType !== "AWS::FSx::FileSystem") return [];
|
|
34905
|
-
return [
|
|
35242
|
+
return [
|
|
35243
|
+
"SecurityGroupIds",
|
|
35244
|
+
"BackupId",
|
|
35245
|
+
"WindowsConfiguration",
|
|
35246
|
+
"OntapConfiguration",
|
|
35247
|
+
"OpenZFSConfiguration"
|
|
35248
|
+
];
|
|
34906
35249
|
}
|
|
34907
35250
|
/**
|
|
34908
35251
|
* Read the AWS-current file system configuration in CFn-property shape
|
|
@@ -35010,16 +35353,16 @@ var FSxFileSystemProvider = class {
|
|
|
35010
35353
|
* FSx providers' 1-hour ceiling so the slowest realistic create/terminate
|
|
35011
35354
|
* still fits inside the per-resource deadline.
|
|
35012
35355
|
*/
|
|
35013
|
-
const DEFAULT_MAX_WAIT_MS = 3600 * 1e3;
|
|
35014
|
-
const DEFAULT_POLL_INTERVAL_MS = 15e3;
|
|
35356
|
+
const DEFAULT_MAX_WAIT_MS$2 = 3600 * 1e3;
|
|
35357
|
+
const DEFAULT_POLL_INTERVAL_MS$2 = 15e3;
|
|
35015
35358
|
/** Cluster states that mean "create succeeded, the cluster is up". */
|
|
35016
|
-
const CREATE_READY_STATES = new Set(["WAITING", "RUNNING"]);
|
|
35359
|
+
const CREATE_READY_STATES = /* @__PURE__ */ new Set(["WAITING", "RUNNING"]);
|
|
35017
35360
|
/**
|
|
35018
35361
|
* Cluster states that mean "the cluster is gone" (for delete polling and
|
|
35019
35362
|
* delete idempotency). `TERMINATED_WITH_ERRORS` still counts as gone — the
|
|
35020
35363
|
* cluster no longer bills — but is logged so a failed terminate is visible.
|
|
35021
35364
|
*/
|
|
35022
|
-
const TERMINAL_STATES = new Set(["TERMINATED", "TERMINATED_WITH_ERRORS"]);
|
|
35365
|
+
const TERMINAL_STATES = /* @__PURE__ */ new Set(["TERMINATED", "TERMINATED_WITH_ERRORS"]);
|
|
35023
35366
|
/**
|
|
35024
35367
|
* Cluster states that mean "the cluster is alive" — the `ListClusters` filter
|
|
35025
35368
|
* used by `import()` discovery so a long-gone `TERMINATED*` cluster is never
|
|
@@ -35038,14 +35381,14 @@ const NON_TERMINATED_STATES = [
|
|
|
35038
35381
|
* replacement-detection layer) or lives inside the `Instances` block (handled
|
|
35039
35382
|
* specially in `update()` — only `TerminationProtected` is mutable there).
|
|
35040
35383
|
*/
|
|
35041
|
-
const MUTABLE_TOP_LEVEL_PROPS = new Set([
|
|
35384
|
+
const MUTABLE_TOP_LEVEL_PROPS = /* @__PURE__ */ new Set([
|
|
35042
35385
|
"Tags",
|
|
35043
35386
|
"VisibleToAllUsers",
|
|
35044
35387
|
"StepConcurrencyLevel",
|
|
35045
35388
|
"ManagedScalingPolicy",
|
|
35046
35389
|
"AutoTerminationPolicy"
|
|
35047
35390
|
]);
|
|
35048
|
-
const toNumber = (v) => {
|
|
35391
|
+
const toNumber$2 = (v) => {
|
|
35049
35392
|
if (v === void 0) return void 0;
|
|
35050
35393
|
const n = Number(v);
|
|
35051
35394
|
return Number.isNaN(n) ? void 0 : n;
|
|
@@ -35055,7 +35398,7 @@ const toBoolean = (v) => {
|
|
|
35055
35398
|
if (typeof v === "string") return v === "true";
|
|
35056
35399
|
return Boolean(v);
|
|
35057
35400
|
};
|
|
35058
|
-
const jsonEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
35401
|
+
const jsonEqual$2 = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
35059
35402
|
/**
|
|
35060
35403
|
* SDK Provider for `AWS::EMR::Cluster` (EMR on EC2).
|
|
35061
35404
|
*
|
|
@@ -35101,10 +35444,10 @@ var EMRClusterProvider = class {
|
|
|
35101
35444
|
pollIntervalMs;
|
|
35102
35445
|
maxWaitMs;
|
|
35103
35446
|
constructor(options) {
|
|
35104
|
-
this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
35105
|
-
this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;
|
|
35447
|
+
this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$2;
|
|
35448
|
+
this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$2;
|
|
35106
35449
|
}
|
|
35107
|
-
handledProperties = new Map([["AWS::EMR::Cluster", new Set([
|
|
35450
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::EMR::Cluster", /* @__PURE__ */ new Set([
|
|
35108
35451
|
"AdditionalInfo",
|
|
35109
35452
|
"Applications",
|
|
35110
35453
|
"AutoScalingRole",
|
|
@@ -35174,10 +35517,10 @@ var EMRClusterProvider = class {
|
|
|
35174
35517
|
CustomAmiId: properties["CustomAmiId"],
|
|
35175
35518
|
OSReleaseLabel: properties["OSReleaseLabel"],
|
|
35176
35519
|
SecurityConfiguration: properties["SecurityConfiguration"],
|
|
35177
|
-
EbsRootVolumeSize: toNumber(properties["EbsRootVolumeSize"]),
|
|
35178
|
-
EbsRootVolumeIops: toNumber(properties["EbsRootVolumeIops"]),
|
|
35179
|
-
EbsRootVolumeThroughput: toNumber(properties["EbsRootVolumeThroughput"]),
|
|
35180
|
-
StepConcurrencyLevel: toNumber(properties["StepConcurrencyLevel"]),
|
|
35520
|
+
EbsRootVolumeSize: toNumber$2(properties["EbsRootVolumeSize"]),
|
|
35521
|
+
EbsRootVolumeIops: toNumber$2(properties["EbsRootVolumeIops"]),
|
|
35522
|
+
EbsRootVolumeThroughput: toNumber$2(properties["EbsRootVolumeThroughput"]),
|
|
35523
|
+
StepConcurrencyLevel: toNumber$2(properties["StepConcurrencyLevel"]),
|
|
35181
35524
|
VisibleToAllUsers: toBoolean(properties["VisibleToAllUsers"]),
|
|
35182
35525
|
Applications: properties["Applications"],
|
|
35183
35526
|
Configurations: properties["Configurations"],
|
|
@@ -35266,7 +35609,7 @@ var EMRClusterProvider = class {
|
|
|
35266
35609
|
return {
|
|
35267
35610
|
InstanceRole: role,
|
|
35268
35611
|
InstanceType: raw["InstanceType"],
|
|
35269
|
-
InstanceCount: toNumber(raw["InstanceCount"]),
|
|
35612
|
+
InstanceCount: toNumber$2(raw["InstanceCount"]),
|
|
35270
35613
|
Name: raw["Name"],
|
|
35271
35614
|
Market: raw["Market"],
|
|
35272
35615
|
BidPrice: raw["BidPrice"],
|
|
@@ -35280,8 +35623,8 @@ var EMRClusterProvider = class {
|
|
|
35280
35623
|
return {
|
|
35281
35624
|
InstanceFleetType: type,
|
|
35282
35625
|
Name: raw["Name"],
|
|
35283
|
-
TargetOnDemandCapacity: toNumber(raw["TargetOnDemandCapacity"]),
|
|
35284
|
-
TargetSpotCapacity: toNumber(raw["TargetSpotCapacity"]),
|
|
35626
|
+
TargetOnDemandCapacity: toNumber$2(raw["TargetOnDemandCapacity"]),
|
|
35627
|
+
TargetSpotCapacity: toNumber$2(raw["TargetSpotCapacity"]),
|
|
35285
35628
|
InstanceTypeConfigs: raw["InstanceTypeConfigs"],
|
|
35286
35629
|
LaunchSpecifications: raw["LaunchSpecifications"],
|
|
35287
35630
|
ResizeSpecifications: raw["ResizeSpecifications"]
|
|
@@ -35294,28 +35637,28 @@ var EMRClusterProvider = class {
|
|
|
35294
35637
|
return {
|
|
35295
35638
|
ComputeLimits: {
|
|
35296
35639
|
UnitType: limits["UnitType"],
|
|
35297
|
-
MinimumCapacityUnits: toNumber(limits["MinimumCapacityUnits"]),
|
|
35298
|
-
MaximumCapacityUnits: toNumber(limits["MaximumCapacityUnits"]),
|
|
35299
|
-
MaximumOnDemandCapacityUnits: toNumber(limits["MaximumOnDemandCapacityUnits"]),
|
|
35300
|
-
MaximumCoreCapacityUnits: toNumber(limits["MaximumCoreCapacityUnits"])
|
|
35640
|
+
MinimumCapacityUnits: toNumber$2(limits["MinimumCapacityUnits"]),
|
|
35641
|
+
MaximumCapacityUnits: toNumber$2(limits["MaximumCapacityUnits"]),
|
|
35642
|
+
MaximumOnDemandCapacityUnits: toNumber$2(limits["MaximumOnDemandCapacityUnits"]),
|
|
35643
|
+
MaximumCoreCapacityUnits: toNumber$2(limits["MaximumCoreCapacityUnits"])
|
|
35301
35644
|
},
|
|
35302
|
-
UtilizationPerformanceIndex: toNumber(config["UtilizationPerformanceIndex"]),
|
|
35645
|
+
UtilizationPerformanceIndex: toNumber$2(config["UtilizationPerformanceIndex"]),
|
|
35303
35646
|
ScalingStrategy: config["ScalingStrategy"]
|
|
35304
35647
|
};
|
|
35305
35648
|
}
|
|
35306
35649
|
toAutoTerminationPolicy(config) {
|
|
35307
35650
|
if (!config) return void 0;
|
|
35308
|
-
return { IdleTimeout: toNumber(config["IdleTimeout"]) };
|
|
35651
|
+
return { IdleTimeout: toNumber$2(config["IdleTimeout"]) };
|
|
35309
35652
|
}
|
|
35310
35653
|
async update(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
35311
|
-
const changed = (key) => !jsonEqual(properties[key], previousProperties[key]);
|
|
35654
|
+
const changed = (key) => !jsonEqual$2(properties[key], previousProperties[key]);
|
|
35312
35655
|
const nextInstances = properties["Instances"] ?? {};
|
|
35313
35656
|
const prevInstances = previousProperties["Instances"] ?? {};
|
|
35314
35657
|
let terminationProtectedChanged = false;
|
|
35315
35658
|
if (changed("Instances")) {
|
|
35316
|
-
const instanceKeys = new Set([...Object.keys(nextInstances), ...Object.keys(prevInstances)]);
|
|
35659
|
+
const instanceKeys = /* @__PURE__ */ new Set([...Object.keys(nextInstances), ...Object.keys(prevInstances)]);
|
|
35317
35660
|
for (const key of instanceKeys) {
|
|
35318
|
-
if (jsonEqual(nextInstances[key], prevInstances[key])) continue;
|
|
35661
|
+
if (jsonEqual$2(nextInstances[key], prevInstances[key])) continue;
|
|
35319
35662
|
if (key === "TerminationProtected") {
|
|
35320
35663
|
terminationProtectedChanged = true;
|
|
35321
35664
|
continue;
|
|
@@ -35355,7 +35698,7 @@ var EMRClusterProvider = class {
|
|
|
35355
35698
|
}));
|
|
35356
35699
|
if (stepConcurrencyChanged) await this.getClient().send(new ModifyClusterCommand({
|
|
35357
35700
|
ClusterId: physicalId,
|
|
35358
|
-
StepConcurrencyLevel: toNumber(properties["StepConcurrencyLevel"])
|
|
35701
|
+
StepConcurrencyLevel: toNumber$2(properties["StepConcurrencyLevel"])
|
|
35359
35702
|
}));
|
|
35360
35703
|
if (managedScalingChanged) {
|
|
35361
35704
|
const next = this.toManagedScalingPolicy(properties["ManagedScalingPolicy"]);
|
|
@@ -35807,6 +36150,570 @@ var EMRClusterProvider = class {
|
|
|
35807
36150
|
}
|
|
35808
36151
|
};
|
|
35809
36152
|
|
|
36153
|
+
//#endregion
|
|
36154
|
+
//#region src/provisioning/providers/emr-instance-group-config-provider.ts
|
|
36155
|
+
/**
|
|
36156
|
+
* Default polling budget for an instance group reaching RUNNING. Adding a
|
|
36157
|
+
* group to an already-WAITING cluster provisions + bootstraps its EC2
|
|
36158
|
+
* instances (typically 2-6 minutes); a resize settles faster. Reuse the
|
|
36159
|
+
* EMR Cluster provider's 1-hour ceiling so the slowest realistic add still
|
|
36160
|
+
* fits inside the per-resource deadline.
|
|
36161
|
+
*/
|
|
36162
|
+
const DEFAULT_MAX_WAIT_MS$1 = 3600 * 1e3;
|
|
36163
|
+
const DEFAULT_POLL_INTERVAL_MS$1 = 15e3;
|
|
36164
|
+
/** Instance-group state that means "the group is up and idle/serving". */
|
|
36165
|
+
const READY_STATES$1 = /* @__PURE__ */ new Set(["RUNNING"]);
|
|
36166
|
+
/**
|
|
36167
|
+
* Instance-group states that mean "the group is gone / failed" — a hard
|
|
36168
|
+
* error during a create/resize wait (an ARRESTED group failed to provision;
|
|
36169
|
+
* TERMINATED/ENDED mean it will never reach RUNNING).
|
|
36170
|
+
*/
|
|
36171
|
+
const FAILED_STATES$1 = /* @__PURE__ */ new Set([
|
|
36172
|
+
"ARRESTED",
|
|
36173
|
+
"TERMINATED",
|
|
36174
|
+
"ENDED"
|
|
36175
|
+
]);
|
|
36176
|
+
const toNumber$1 = (v) => {
|
|
36177
|
+
if (v === void 0) return void 0;
|
|
36178
|
+
const n = Number(v);
|
|
36179
|
+
return Number.isNaN(n) ? void 0 : n;
|
|
36180
|
+
};
|
|
36181
|
+
const jsonEqual$1 = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
36182
|
+
/**
|
|
36183
|
+
* SDK Provider for `AWS::EMR::InstanceGroupConfig` (issue #1070).
|
|
36184
|
+
*
|
|
36185
|
+
* This type adds a standalone instance group (MASTER / CORE / TASK) to an
|
|
36186
|
+
* EXISTING EMR cluster (referenced by `JobFlowId`), rather than declaring the
|
|
36187
|
+
* group inline in `AWS::EMR::Cluster.Instances`. It is
|
|
36188
|
+
* `ProvisioningType: NON_PROVISIONABLE` in the CFn registry, so Cloud Control
|
|
36189
|
+
* cannot handle it — pre-flight would otherwise reject it via
|
|
36190
|
+
* `unsupported-types.generated.ts`.
|
|
36191
|
+
*
|
|
36192
|
+
* Lifecycle:
|
|
36193
|
+
* - `create` → `AddInstanceGroups` (one group per call) + poll
|
|
36194
|
+
* `ListInstanceGroups` until the new group is `RUNNING`. A failed terminal
|
|
36195
|
+
* (`ARRESTED` / `TERMINATED` / `ENDED`) during the wait is a hard error.
|
|
36196
|
+
* - `update` → only the two AWS-mutable properties: `InstanceCount`
|
|
36197
|
+
* (`ModifyInstanceGroups`, resize; polled until settled) and
|
|
36198
|
+
* `AutoScalingPolicy` (`PutAutoScalingPolicy` / `RemoveAutoScalingPolicy`).
|
|
36199
|
+
* Every other property is registry-createOnly → routed through
|
|
36200
|
+
* DELETE+CREATE by the replacement-detection layer; a createOnly change
|
|
36201
|
+
* that reaches `update()` anyway is refused with a `--replace` pointer.
|
|
36202
|
+
* - `delete` → **no standalone AWS API exists.** EMR cannot remove an
|
|
36203
|
+
* instance group from a running cluster; a group's only lifecycle end is
|
|
36204
|
+
* cluster termination. In the normal `cdkd destroy` the parent
|
|
36205
|
+
* `AWS::EMR::Cluster` is terminated in the same run (its `TerminateJobFlows`
|
|
36206
|
+
* releases every group + its EC2 instances), so this delete is a no-op that
|
|
36207
|
+
* just drops cdkd state — leaving ZERO orphans. As a best effort for the
|
|
36208
|
+
* less common "delete only the group, keep the cluster" case, a TASK group
|
|
36209
|
+
* is scaled to 0 instances (`ModifyInstanceGroups InstanceCount: 0`) to
|
|
36210
|
+
* release its instances; MASTER/CORE groups cannot be scaled to 0 and are a
|
|
36211
|
+
* pure no-op. Never blocks the destroy (warn-and-continue).
|
|
36212
|
+
*
|
|
36213
|
+
* `getMinResourceTimeoutMs()` lifts the deploy engine's per-resource deadline
|
|
36214
|
+
* to the polling ceiling (mirrors `EMRClusterProvider`) so a slow add/resize
|
|
36215
|
+
* does not require `--resource-timeout`.
|
|
36216
|
+
*/
|
|
36217
|
+
var EMRInstanceGroupConfigProvider = class {
|
|
36218
|
+
/**
|
|
36219
|
+
* Cloud Control has NO handlers for this type
|
|
36220
|
+
* (`ProvisioningType: NON_PROVISIONABLE`), so the deploy engine's #614
|
|
36221
|
+
* silent-drop auto-route MUST NOT send an unhandled-property template to CC
|
|
36222
|
+
* — it would fail at provisioning time with an opaque
|
|
36223
|
+
* UnsupportedActionException. With this opt-out the ProviderRegistry rejects
|
|
36224
|
+
* such templates pre-flight with a clear error instead.
|
|
36225
|
+
*/
|
|
36226
|
+
disableCcApiFallback = true;
|
|
36227
|
+
client;
|
|
36228
|
+
providerRegion = process.env["AWS_REGION"];
|
|
36229
|
+
logger = getLogger().child("EMRInstanceGroupConfigProvider");
|
|
36230
|
+
pollIntervalMs;
|
|
36231
|
+
maxWaitMs;
|
|
36232
|
+
constructor(options) {
|
|
36233
|
+
this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$1;
|
|
36234
|
+
this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$1;
|
|
36235
|
+
}
|
|
36236
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::EMR::InstanceGroupConfig", /* @__PURE__ */ new Set([
|
|
36237
|
+
"AutoScalingPolicy",
|
|
36238
|
+
"BidPrice",
|
|
36239
|
+
"Configurations",
|
|
36240
|
+
"CustomAmiId",
|
|
36241
|
+
"EbsConfiguration",
|
|
36242
|
+
"InstanceCount",
|
|
36243
|
+
"InstanceRole",
|
|
36244
|
+
"InstanceType",
|
|
36245
|
+
"JobFlowId",
|
|
36246
|
+
"Market",
|
|
36247
|
+
"Name"
|
|
36248
|
+
])]]);
|
|
36249
|
+
getClient() {
|
|
36250
|
+
if (!this.client) this.client = new EMRClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
36251
|
+
return this.client;
|
|
36252
|
+
}
|
|
36253
|
+
getMinResourceTimeoutMs() {
|
|
36254
|
+
return this.maxWaitMs + this.pollIntervalMs;
|
|
36255
|
+
}
|
|
36256
|
+
async create(logicalId, resourceType, properties) {
|
|
36257
|
+
if (resourceType !== "AWS::EMR::InstanceGroupConfig") throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
|
|
36258
|
+
const jobFlowId = properties["JobFlowId"];
|
|
36259
|
+
if (!jobFlowId) throw new ProvisioningError(`EMR InstanceGroupConfig ${logicalId} is missing JobFlowId (the parent cluster id)`, resourceType, logicalId);
|
|
36260
|
+
this.logger.debug(`Adding EMR instance group ${logicalId} to cluster ${jobFlowId}`);
|
|
36261
|
+
try {
|
|
36262
|
+
const group = this.toInstanceGroupConfig(properties);
|
|
36263
|
+
const groupId = (await this.getClient().send(new AddInstanceGroupsCommand({
|
|
36264
|
+
JobFlowId: jobFlowId,
|
|
36265
|
+
InstanceGroups: [group]
|
|
36266
|
+
}))).InstanceGroupIds?.[0];
|
|
36267
|
+
if (!groupId) throw new ProvisioningError(`EMR AddInstanceGroups for ${logicalId} returned no instance group id`, resourceType, logicalId);
|
|
36268
|
+
await this.waitForGroupReady(jobFlowId, groupId, logicalId, resourceType, toNumber$1(properties["InstanceCount"]) ?? 0);
|
|
36269
|
+
this.logger.debug(`Successfully added EMR instance group ${logicalId}: ${groupId}`);
|
|
36270
|
+
return {
|
|
36271
|
+
physicalId: groupId,
|
|
36272
|
+
attributes: { Id: groupId }
|
|
36273
|
+
};
|
|
36274
|
+
} catch (error) {
|
|
36275
|
+
if (error instanceof ProvisioningError) throw error;
|
|
36276
|
+
const cause = error instanceof Error ? error : void 0;
|
|
36277
|
+
throw new ProvisioningError(`Failed to add EMR instance group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
|
|
36278
|
+
}
|
|
36279
|
+
}
|
|
36280
|
+
toInstanceGroupConfig(properties) {
|
|
36281
|
+
return {
|
|
36282
|
+
InstanceRole: properties["InstanceRole"],
|
|
36283
|
+
InstanceType: properties["InstanceType"],
|
|
36284
|
+
InstanceCount: toNumber$1(properties["InstanceCount"]),
|
|
36285
|
+
Name: properties["Name"],
|
|
36286
|
+
Market: properties["Market"],
|
|
36287
|
+
BidPrice: properties["BidPrice"],
|
|
36288
|
+
Configurations: properties["Configurations"],
|
|
36289
|
+
EbsConfiguration: properties["EbsConfiguration"],
|
|
36290
|
+
AutoScalingPolicy: properties["AutoScalingPolicy"],
|
|
36291
|
+
CustomAmiId: properties["CustomAmiId"]
|
|
36292
|
+
};
|
|
36293
|
+
}
|
|
36294
|
+
async update(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
36295
|
+
const changed = (key) => !jsonEqual$1(properties[key], previousProperties[key]);
|
|
36296
|
+
const MUTABLE = /* @__PURE__ */ new Set(["InstanceCount", "AutoScalingPolicy"]);
|
|
36297
|
+
for (const key of Object.keys({
|
|
36298
|
+
...properties,
|
|
36299
|
+
...previousProperties
|
|
36300
|
+
})) {
|
|
36301
|
+
if (!changed(key)) continue;
|
|
36302
|
+
if (!MUTABLE.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS EMR InstanceGroupConfig ${key} is immutable on AWS — it is fixed when the instance group is created. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
|
|
36303
|
+
}
|
|
36304
|
+
const instanceCountChanged = changed("InstanceCount");
|
|
36305
|
+
const autoScalingChanged = changed("AutoScalingPolicy");
|
|
36306
|
+
if (!instanceCountChanged && !autoScalingChanged) {
|
|
36307
|
+
this.logger.debug(`No mutable diff for EMR instance group ${logicalId}, skipping update`);
|
|
36308
|
+
return {
|
|
36309
|
+
physicalId,
|
|
36310
|
+
wasReplaced: false
|
|
36311
|
+
};
|
|
36312
|
+
}
|
|
36313
|
+
const jobFlowId = properties["JobFlowId"];
|
|
36314
|
+
this.logger.debug(`Updating EMR instance group ${logicalId}: ${physicalId}`);
|
|
36315
|
+
try {
|
|
36316
|
+
if (instanceCountChanged) {
|
|
36317
|
+
await this.getClient().send(new ModifyInstanceGroupsCommand({
|
|
36318
|
+
...jobFlowId && { ClusterId: jobFlowId },
|
|
36319
|
+
InstanceGroups: [{
|
|
36320
|
+
InstanceGroupId: physicalId,
|
|
36321
|
+
InstanceCount: toNumber$1(properties["InstanceCount"])
|
|
36322
|
+
}]
|
|
36323
|
+
}));
|
|
36324
|
+
if (jobFlowId) await this.waitForGroupReady(jobFlowId, physicalId, logicalId, resourceType, toNumber$1(properties["InstanceCount"]) ?? 0);
|
|
36325
|
+
}
|
|
36326
|
+
if (autoScalingChanged) {
|
|
36327
|
+
if (!jobFlowId) throw new ProvisioningError(`EMR InstanceGroupConfig ${logicalId} AutoScalingPolicy update needs JobFlowId (the cluster id), which is absent`, resourceType, logicalId, physicalId);
|
|
36328
|
+
const policy = properties["AutoScalingPolicy"];
|
|
36329
|
+
if (policy) await this.getClient().send(new PutAutoScalingPolicyCommand({
|
|
36330
|
+
ClusterId: jobFlowId,
|
|
36331
|
+
InstanceGroupId: physicalId,
|
|
36332
|
+
AutoScalingPolicy: policy
|
|
36333
|
+
}));
|
|
36334
|
+
else await this.getClient().send(new RemoveAutoScalingPolicyCommand({
|
|
36335
|
+
ClusterId: jobFlowId,
|
|
36336
|
+
InstanceGroupId: physicalId
|
|
36337
|
+
}));
|
|
36338
|
+
}
|
|
36339
|
+
this.logger.debug(`Successfully updated EMR instance group ${logicalId}`);
|
|
36340
|
+
return {
|
|
36341
|
+
physicalId,
|
|
36342
|
+
wasReplaced: false,
|
|
36343
|
+
attributes: { Id: physicalId }
|
|
36344
|
+
};
|
|
36345
|
+
} catch (error) {
|
|
36346
|
+
if (error instanceof ProvisioningError || error instanceof ResourceUpdateNotSupportedError) throw error;
|
|
36347
|
+
const cause = error instanceof Error ? error : void 0;
|
|
36348
|
+
throw new ProvisioningError(`Failed to update EMR instance group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
36349
|
+
}
|
|
36350
|
+
}
|
|
36351
|
+
async delete(logicalId, physicalId, resourceType, properties, context) {
|
|
36352
|
+
const role = properties?.["InstanceRole"];
|
|
36353
|
+
const jobFlowId = properties?.["JobFlowId"];
|
|
36354
|
+
if (role === "TASK" && jobFlowId) {
|
|
36355
|
+
try {
|
|
36356
|
+
await this.getClient().send(new ModifyInstanceGroupsCommand({
|
|
36357
|
+
ClusterId: jobFlowId,
|
|
36358
|
+
InstanceGroups: [{
|
|
36359
|
+
InstanceGroupId: physicalId,
|
|
36360
|
+
InstanceCount: 0
|
|
36361
|
+
}]
|
|
36362
|
+
}));
|
|
36363
|
+
this.logger.debug(`Scaled EMR TASK instance group ${physicalId} to 0 to release its instances (no standalone delete API exists)`);
|
|
36364
|
+
} catch (error) {
|
|
36365
|
+
if (error instanceof InvalidRequestException) {
|
|
36366
|
+
assertRegionMatch(await this.getClient().config.region(), context?.expectedRegion, resourceType, logicalId, physicalId);
|
|
36367
|
+
this.logger.debug(`EMR instance group ${physicalId} scale-to-0 skipped (cluster/group gone): ${error.message}`);
|
|
36368
|
+
} else this.logger.warn(`Best-effort scale-to-0 of EMR instance group ${physicalId} failed: ${error instanceof Error ? error.message : String(error)} — its instances are released when the parent cluster terminates`);
|
|
36369
|
+
}
|
|
36370
|
+
return;
|
|
36371
|
+
}
|
|
36372
|
+
this.logger.debug(`EMR instance group ${physicalId} (role ${role ?? "unknown"}) has no standalone delete API; its instances are released when the parent cluster terminates. Removing cdkd state only.`);
|
|
36373
|
+
}
|
|
36374
|
+
async getAttribute(physicalId, _resourceType, attributeName) {
|
|
36375
|
+
if (attributeName === "Id") return physicalId;
|
|
36376
|
+
}
|
|
36377
|
+
/**
|
|
36378
|
+
* Poll until the group is `RUNNING` AND its `RunningInstanceCount` equals
|
|
36379
|
+
* `expectedCount`. The count check is load-bearing on a resize: right after
|
|
36380
|
+
* `ModifyInstanceGroups` the group is still in the PRE-resize `RUNNING`
|
|
36381
|
+
* state (EMR has not flipped it to `RESIZING` yet), so a State-only wait
|
|
36382
|
+
* would return before the resize even starts. Waiting on the running count
|
|
36383
|
+
* reaching the requested target settles both create (0 -> N provisioning)
|
|
36384
|
+
* and resize (M -> N add/remove) correctly.
|
|
36385
|
+
*/
|
|
36386
|
+
async waitForGroupReady(clusterId, groupId, logicalId, resourceType, expectedCount) {
|
|
36387
|
+
const startTime = Date.now();
|
|
36388
|
+
const transientState = { count: 0 };
|
|
36389
|
+
while (Date.now() - startTime < this.maxWaitMs) {
|
|
36390
|
+
const group = await this.findGroupForPoll(clusterId, groupId, transientState);
|
|
36391
|
+
const state = group?.Status?.State;
|
|
36392
|
+
if (state && READY_STATES$1.has(state) && group?.RunningInstanceCount === expectedCount) return;
|
|
36393
|
+
if (state && FAILED_STATES$1.has(state)) throw new ProvisioningError(`EMR instance group ${groupId} entered failed state ${state}: ${group?.Status?.StateChangeReason?.Message ?? "no state-change reason reported"}`, resourceType, logicalId, groupId);
|
|
36394
|
+
this.logger.debug(`EMR instance group ${groupId} state: ${state ?? "unknown"}, running ${group?.RunningInstanceCount ?? "?"}/${expectedCount}, waiting...`);
|
|
36395
|
+
await new Promise((resolve) => setTimeout(resolve, this.pollIntervalMs));
|
|
36396
|
+
}
|
|
36397
|
+
throw new ProvisioningError(`Timed out waiting for EMR instance group ${groupId} to reach RUNNING with ${expectedCount} instance(s) (${Math.round(this.maxWaitMs / 6e4)} min)`, resourceType, logicalId, groupId);
|
|
36398
|
+
}
|
|
36399
|
+
/**
|
|
36400
|
+
* `ListInstanceGroups` (paginated) for the cluster, returning the single
|
|
36401
|
+
* group whose `Id` matches. Absorbs up to `maxConsecutiveTransient`
|
|
36402
|
+
* consecutive transient errors (throttle / 5xx / reset) so a single blip
|
|
36403
|
+
* during a 10-minute poll does not spuriously fail the create.
|
|
36404
|
+
*/
|
|
36405
|
+
async findGroupForPoll(clusterId, groupId, transientState, maxConsecutiveTransient = 5) {
|
|
36406
|
+
try {
|
|
36407
|
+
let marker;
|
|
36408
|
+
do {
|
|
36409
|
+
const resp = await this.getClient().send(new ListInstanceGroupsCommand({
|
|
36410
|
+
ClusterId: clusterId,
|
|
36411
|
+
...marker && { Marker: marker }
|
|
36412
|
+
}));
|
|
36413
|
+
const found = (resp.InstanceGroups ?? []).find((g) => g.Id === groupId);
|
|
36414
|
+
if (found) {
|
|
36415
|
+
transientState.count = 0;
|
|
36416
|
+
return found;
|
|
36417
|
+
}
|
|
36418
|
+
marker = resp.Marker;
|
|
36419
|
+
} while (marker);
|
|
36420
|
+
transientState.count = 0;
|
|
36421
|
+
return;
|
|
36422
|
+
} catch (error) {
|
|
36423
|
+
const name = error instanceof Error ? error.name : "";
|
|
36424
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
36425
|
+
if ((name === "ThrottlingException" || name === "InternalServerException" || name === "InternalServerError" || name === "TimeoutError" || /rate exceeded|too many requests|throttl|timed? ?out|ECONNRESET|EPIPE|socket hang up/i.test(msg)) && transientState.count < maxConsecutiveTransient) {
|
|
36426
|
+
transientState.count += 1;
|
|
36427
|
+
this.logger.debug(`Transient ListInstanceGroups error while polling ${groupId} (${transientState.count}/${maxConsecutiveTransient}): ${msg} — retrying`);
|
|
36428
|
+
return;
|
|
36429
|
+
}
|
|
36430
|
+
throw error;
|
|
36431
|
+
}
|
|
36432
|
+
}
|
|
36433
|
+
};
|
|
36434
|
+
|
|
36435
|
+
//#endregion
|
|
36436
|
+
//#region src/provisioning/providers/emr-instance-fleet-config-provider.ts
|
|
36437
|
+
/**
|
|
36438
|
+
* Default polling budget for an instance fleet reaching RUNNING. Adding a
|
|
36439
|
+
* fleet to an already-WAITING cluster provisions + bootstraps its EC2
|
|
36440
|
+
* instances (typically 2-6 minutes); a resize settles faster. Reuse the
|
|
36441
|
+
* EMR Cluster provider's 1-hour ceiling so the slowest realistic add still
|
|
36442
|
+
* fits inside the per-resource deadline.
|
|
36443
|
+
*/
|
|
36444
|
+
const DEFAULT_MAX_WAIT_MS = 3600 * 1e3;
|
|
36445
|
+
const DEFAULT_POLL_INTERVAL_MS = 15e3;
|
|
36446
|
+
/** Instance-fleet state that means "the fleet is up and idle/serving". */
|
|
36447
|
+
const READY_STATES = /* @__PURE__ */ new Set(["RUNNING"]);
|
|
36448
|
+
/**
|
|
36449
|
+
* Instance-fleet states that mean "the fleet is gone" — a hard error during a
|
|
36450
|
+
* create/resize wait (it will never reach RUNNING).
|
|
36451
|
+
*/
|
|
36452
|
+
const FAILED_STATES = /* @__PURE__ */ new Set(["TERMINATED"]);
|
|
36453
|
+
const toNumber = (v) => {
|
|
36454
|
+
if (v === void 0) return void 0;
|
|
36455
|
+
const n = Number(v);
|
|
36456
|
+
return Number.isNaN(n) ? void 0 : n;
|
|
36457
|
+
};
|
|
36458
|
+
const jsonEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
36459
|
+
/**
|
|
36460
|
+
* SDK Provider for `AWS::EMR::InstanceFleetConfig` (issue #1070).
|
|
36461
|
+
*
|
|
36462
|
+
* This type adds a standalone instance fleet (MASTER / CORE / TASK) to an
|
|
36463
|
+
* EXISTING EMR cluster (referenced by `ClusterId`), rather than declaring the
|
|
36464
|
+
* fleet inline in `AWS::EMR::Cluster.Instances`. It is
|
|
36465
|
+
* `ProvisioningType: NON_PROVISIONABLE` in the CFn registry, so Cloud Control
|
|
36466
|
+
* cannot handle it — pre-flight would otherwise reject it via
|
|
36467
|
+
* `unsupported-types.generated.ts`.
|
|
36468
|
+
*
|
|
36469
|
+
* Lifecycle:
|
|
36470
|
+
* - `create` → `AddInstanceFleet` + poll `ListInstanceFleets` until the new
|
|
36471
|
+
* fleet is `RUNNING`. A `TERMINATED` terminal during the wait is a hard
|
|
36472
|
+
* error.
|
|
36473
|
+
* - `update` → only the AWS-mutable properties: `TargetOnDemandCapacity`,
|
|
36474
|
+
* `TargetSpotCapacity`, `ResizeSpecifications`, and `InstanceTypeConfigs`
|
|
36475
|
+
* (all via `ModifyInstanceFleet`; the resize is polled until settled).
|
|
36476
|
+
* `Name` / `LaunchSpecifications` / `InstanceFleetType` are
|
|
36477
|
+
* registry-createOnly → routed through DELETE+CREATE by the
|
|
36478
|
+
* replacement-detection layer; a createOnly change that reaches `update()`
|
|
36479
|
+
* anyway is refused with a `--replace` pointer.
|
|
36480
|
+
* - `delete` → **no standalone AWS API exists.** EMR cannot remove an
|
|
36481
|
+
* instance fleet from a running cluster; a fleet's only lifecycle end is
|
|
36482
|
+
* cluster termination. In the normal `cdkd destroy` the parent
|
|
36483
|
+
* `AWS::EMR::Cluster` is terminated in the same run (its `TerminateJobFlows`
|
|
36484
|
+
* releases every fleet + its EC2 instances), so this delete is a no-op that
|
|
36485
|
+
* just drops cdkd state — leaving ZERO orphans. As a best effort for the
|
|
36486
|
+
* less common "delete only the fleet, keep the cluster" case, a TASK fleet
|
|
36487
|
+
* is scaled to 0 target capacity (`ModifyInstanceFleet`) to release its
|
|
36488
|
+
* instances; MASTER/CORE fleets cannot be scaled to 0 and are a pure no-op.
|
|
36489
|
+
* Never blocks the destroy (warn-and-continue).
|
|
36490
|
+
*
|
|
36491
|
+
* `getMinResourceTimeoutMs()` lifts the deploy engine's per-resource deadline
|
|
36492
|
+
* to the polling ceiling (mirrors `EMRClusterProvider`) so a slow add/resize
|
|
36493
|
+
* does not require `--resource-timeout`.
|
|
36494
|
+
*/
|
|
36495
|
+
var EMRInstanceFleetConfigProvider = class {
|
|
36496
|
+
/**
|
|
36497
|
+
* Cloud Control has NO handlers for this type
|
|
36498
|
+
* (`ProvisioningType: NON_PROVISIONABLE`), so the deploy engine's #614
|
|
36499
|
+
* silent-drop auto-route MUST NOT send an unhandled-property template to CC
|
|
36500
|
+
* — it would fail at provisioning time with an opaque
|
|
36501
|
+
* UnsupportedActionException. With this opt-out the ProviderRegistry rejects
|
|
36502
|
+
* such templates pre-flight with a clear error instead.
|
|
36503
|
+
*/
|
|
36504
|
+
disableCcApiFallback = true;
|
|
36505
|
+
client;
|
|
36506
|
+
providerRegion = process.env["AWS_REGION"];
|
|
36507
|
+
logger = getLogger().child("EMRInstanceFleetConfigProvider");
|
|
36508
|
+
pollIntervalMs;
|
|
36509
|
+
maxWaitMs;
|
|
36510
|
+
constructor(options) {
|
|
36511
|
+
this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
36512
|
+
this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;
|
|
36513
|
+
}
|
|
36514
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::EMR::InstanceFleetConfig", /* @__PURE__ */ new Set([
|
|
36515
|
+
"ClusterId",
|
|
36516
|
+
"InstanceFleetType",
|
|
36517
|
+
"InstanceTypeConfigs",
|
|
36518
|
+
"LaunchSpecifications",
|
|
36519
|
+
"Name",
|
|
36520
|
+
"ResizeSpecifications",
|
|
36521
|
+
"TargetOnDemandCapacity",
|
|
36522
|
+
"TargetSpotCapacity"
|
|
36523
|
+
])]]);
|
|
36524
|
+
getClient() {
|
|
36525
|
+
if (!this.client) this.client = new EMRClient(this.providerRegion ? { region: this.providerRegion } : {});
|
|
36526
|
+
return this.client;
|
|
36527
|
+
}
|
|
36528
|
+
getMinResourceTimeoutMs() {
|
|
36529
|
+
return this.maxWaitMs + this.pollIntervalMs;
|
|
36530
|
+
}
|
|
36531
|
+
async create(logicalId, resourceType, properties) {
|
|
36532
|
+
if (resourceType !== "AWS::EMR::InstanceFleetConfig") throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
|
|
36533
|
+
const clusterId = properties["ClusterId"];
|
|
36534
|
+
if (!clusterId) throw new ProvisioningError(`EMR InstanceFleetConfig ${logicalId} is missing ClusterId (the parent cluster id)`, resourceType, logicalId);
|
|
36535
|
+
this.logger.debug(`Adding EMR instance fleet ${logicalId} to cluster ${clusterId}`);
|
|
36536
|
+
try {
|
|
36537
|
+
const fleet = this.toInstanceFleetConfig(properties);
|
|
36538
|
+
const fleetId = (await this.getClient().send(new AddInstanceFleetCommand({
|
|
36539
|
+
ClusterId: clusterId,
|
|
36540
|
+
InstanceFleet: fleet
|
|
36541
|
+
}))).InstanceFleetId;
|
|
36542
|
+
if (!fleetId) throw new ProvisioningError(`EMR AddInstanceFleet for ${logicalId} returned no instance fleet id`, resourceType, logicalId);
|
|
36543
|
+
await this.waitForFleetReady(clusterId, fleetId, logicalId, resourceType, this.targetCapacity(properties), true);
|
|
36544
|
+
this.logger.debug(`Successfully added EMR instance fleet ${logicalId}: ${fleetId}`);
|
|
36545
|
+
return {
|
|
36546
|
+
physicalId: fleetId,
|
|
36547
|
+
attributes: { Id: fleetId }
|
|
36548
|
+
};
|
|
36549
|
+
} catch (error) {
|
|
36550
|
+
if (error instanceof ProvisioningError) throw error;
|
|
36551
|
+
const cause = error instanceof Error ? error : void 0;
|
|
36552
|
+
throw new ProvisioningError(`Failed to add EMR instance fleet ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
|
|
36553
|
+
}
|
|
36554
|
+
}
|
|
36555
|
+
toInstanceFleetConfig(properties) {
|
|
36556
|
+
return {
|
|
36557
|
+
InstanceFleetType: properties["InstanceFleetType"],
|
|
36558
|
+
Name: properties["Name"],
|
|
36559
|
+
TargetOnDemandCapacity: toNumber(properties["TargetOnDemandCapacity"]),
|
|
36560
|
+
TargetSpotCapacity: toNumber(properties["TargetSpotCapacity"]),
|
|
36561
|
+
InstanceTypeConfigs: properties["InstanceTypeConfigs"],
|
|
36562
|
+
LaunchSpecifications: properties["LaunchSpecifications"],
|
|
36563
|
+
ResizeSpecifications: properties["ResizeSpecifications"]
|
|
36564
|
+
};
|
|
36565
|
+
}
|
|
36566
|
+
async update(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
36567
|
+
const changed = (key) => !jsonEqual(properties[key], previousProperties[key]);
|
|
36568
|
+
const MUTABLE = /* @__PURE__ */ new Set([
|
|
36569
|
+
"TargetOnDemandCapacity",
|
|
36570
|
+
"TargetSpotCapacity",
|
|
36571
|
+
"ResizeSpecifications",
|
|
36572
|
+
"InstanceTypeConfigs"
|
|
36573
|
+
]);
|
|
36574
|
+
for (const key of Object.keys({
|
|
36575
|
+
...properties,
|
|
36576
|
+
...previousProperties
|
|
36577
|
+
})) {
|
|
36578
|
+
if (!changed(key)) continue;
|
|
36579
|
+
if (!MUTABLE.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS EMR InstanceFleetConfig ${key} is immutable on AWS — it is fixed when the instance fleet is created. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
|
|
36580
|
+
}
|
|
36581
|
+
if (![...MUTABLE].some((k) => changed(k))) {
|
|
36582
|
+
this.logger.debug(`No mutable diff for EMR instance fleet ${logicalId}, skipping update`);
|
|
36583
|
+
return {
|
|
36584
|
+
physicalId,
|
|
36585
|
+
wasReplaced: false
|
|
36586
|
+
};
|
|
36587
|
+
}
|
|
36588
|
+
const clusterId = properties["ClusterId"];
|
|
36589
|
+
if (!clusterId) throw new ProvisioningError(`EMR InstanceFleetConfig ${logicalId} update needs ClusterId (the cluster id), which is absent`, resourceType, logicalId, physicalId);
|
|
36590
|
+
this.logger.debug(`Updating EMR instance fleet ${logicalId}: ${physicalId}`);
|
|
36591
|
+
try {
|
|
36592
|
+
const modify = {
|
|
36593
|
+
InstanceFleetId: physicalId,
|
|
36594
|
+
TargetOnDemandCapacity: toNumber(properties["TargetOnDemandCapacity"]),
|
|
36595
|
+
TargetSpotCapacity: toNumber(properties["TargetSpotCapacity"]),
|
|
36596
|
+
ResizeSpecifications: properties["ResizeSpecifications"],
|
|
36597
|
+
InstanceTypeConfigs: properties["InstanceTypeConfigs"]
|
|
36598
|
+
};
|
|
36599
|
+
await this.getClient().send(new ModifyInstanceFleetCommand({
|
|
36600
|
+
ClusterId: clusterId,
|
|
36601
|
+
InstanceFleet: modify
|
|
36602
|
+
}));
|
|
36603
|
+
const newTarget = this.targetCapacity(properties);
|
|
36604
|
+
const prevTarget = this.targetCapacity(previousProperties);
|
|
36605
|
+
await this.waitForFleetReady(clusterId, physicalId, logicalId, resourceType, newTarget, newTarget >= prevTarget);
|
|
36606
|
+
this.logger.debug(`Successfully updated EMR instance fleet ${logicalId}`);
|
|
36607
|
+
return {
|
|
36608
|
+
physicalId,
|
|
36609
|
+
wasReplaced: false,
|
|
36610
|
+
attributes: { Id: physicalId }
|
|
36611
|
+
};
|
|
36612
|
+
} catch (error) {
|
|
36613
|
+
if (error instanceof ProvisioningError || error instanceof ResourceUpdateNotSupportedError) throw error;
|
|
36614
|
+
const cause = error instanceof Error ? error : void 0;
|
|
36615
|
+
throw new ProvisioningError(`Failed to update EMR instance fleet ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
36616
|
+
}
|
|
36617
|
+
}
|
|
36618
|
+
async delete(logicalId, physicalId, resourceType, properties, context) {
|
|
36619
|
+
const fleetType = properties?.["InstanceFleetType"];
|
|
36620
|
+
const clusterId = properties?.["ClusterId"];
|
|
36621
|
+
if (fleetType === "TASK" && clusterId) {
|
|
36622
|
+
try {
|
|
36623
|
+
await this.getClient().send(new ModifyInstanceFleetCommand({
|
|
36624
|
+
ClusterId: clusterId,
|
|
36625
|
+
InstanceFleet: {
|
|
36626
|
+
InstanceFleetId: physicalId,
|
|
36627
|
+
TargetOnDemandCapacity: 0,
|
|
36628
|
+
TargetSpotCapacity: 0
|
|
36629
|
+
}
|
|
36630
|
+
}));
|
|
36631
|
+
this.logger.debug(`Scaled EMR TASK instance fleet ${physicalId} to 0 to release its instances (no standalone delete API exists)`);
|
|
36632
|
+
} catch (error) {
|
|
36633
|
+
if (error instanceof InvalidRequestException) {
|
|
36634
|
+
assertRegionMatch(await this.getClient().config.region(), context?.expectedRegion, resourceType, logicalId, physicalId);
|
|
36635
|
+
this.logger.debug(`EMR instance fleet ${physicalId} scale-to-0 skipped (cluster/fleet gone): ${error.message}`);
|
|
36636
|
+
} else this.logger.warn(`Best-effort scale-to-0 of EMR instance fleet ${physicalId} failed: ${error instanceof Error ? error.message : String(error)} — its instances are released when the parent cluster terminates`);
|
|
36637
|
+
}
|
|
36638
|
+
return;
|
|
36639
|
+
}
|
|
36640
|
+
this.logger.debug(`EMR instance fleet ${physicalId} (type ${fleetType ?? "unknown"}) has no standalone delete API; its instances are released when the parent cluster terminates. Removing cdkd state only.`);
|
|
36641
|
+
}
|
|
36642
|
+
async getAttribute(physicalId, _resourceType, attributeName) {
|
|
36643
|
+
if (attributeName === "Id") return physicalId;
|
|
36644
|
+
}
|
|
36645
|
+
/** Total target capacity (On-Demand + Spot) requested for the fleet. */
|
|
36646
|
+
targetCapacity(properties) {
|
|
36647
|
+
return (toNumber(properties["TargetOnDemandCapacity"]) ?? 0) + (toNumber(properties["TargetSpotCapacity"]) ?? 0);
|
|
36648
|
+
}
|
|
36649
|
+
/**
|
|
36650
|
+
* Poll until the fleet is `RUNNING` AND its provisioned capacity
|
|
36651
|
+
* (On-Demand + Spot) has settled at `targetCapacity`. The capacity check is
|
|
36652
|
+
* load-bearing on a resize: right after `ModifyInstanceFleet` the fleet is
|
|
36653
|
+
* still in the PRE-resize `RUNNING` state, so a State-only wait would return
|
|
36654
|
+
* before the resize even starts.
|
|
36655
|
+
*
|
|
36656
|
+
* `atLeast` selects the settle direction:
|
|
36657
|
+
* - `true` (create / scale-UP): ready when `provisioned >= targetCapacity`
|
|
36658
|
+
* (`>=`, not `==`, because a weighted-capacity allocation may overshoot).
|
|
36659
|
+
* - `false` (scale-DOWN): ready when `provisioned <= targetCapacity` — the
|
|
36660
|
+
* stale pre-resize provisioned capacity is ABOVE the new lower target, so
|
|
36661
|
+
* an `>=` check would return instantly before instances drain.
|
|
36662
|
+
*
|
|
36663
|
+
* A `targetCapacity` of 0 on the up path (never valid for a real create —
|
|
36664
|
+
* at least one target must be > 0) degrades to a State-only wait.
|
|
36665
|
+
*/
|
|
36666
|
+
async waitForFleetReady(clusterId, fleetId, logicalId, resourceType, targetCapacity, atLeast) {
|
|
36667
|
+
const startTime = Date.now();
|
|
36668
|
+
const transientState = { count: 0 };
|
|
36669
|
+
while (Date.now() - startTime < this.maxWaitMs) {
|
|
36670
|
+
const fleet = await this.findFleetForPoll(clusterId, fleetId, transientState);
|
|
36671
|
+
const state = fleet?.Status?.State;
|
|
36672
|
+
const provisioned = (fleet?.ProvisionedOnDemandCapacity ?? 0) + (fleet?.ProvisionedSpotCapacity ?? 0);
|
|
36673
|
+
const capacityReady = atLeast ? provisioned >= targetCapacity : provisioned <= targetCapacity;
|
|
36674
|
+
if (state && READY_STATES.has(state) && capacityReady) return;
|
|
36675
|
+
if (state && FAILED_STATES.has(state)) throw new ProvisioningError(`EMR instance fleet ${fleetId} entered failed state ${state}: ${fleet?.Status?.StateChangeReason?.Message ?? "no state-change reason reported"}`, resourceType, logicalId, fleetId);
|
|
36676
|
+
this.logger.debug(`EMR instance fleet ${fleetId} state: ${state ?? "unknown"}, provisioned ${provisioned}/${targetCapacity}, waiting...`);
|
|
36677
|
+
await new Promise((resolve) => setTimeout(resolve, this.pollIntervalMs));
|
|
36678
|
+
}
|
|
36679
|
+
throw new ProvisioningError(`Timed out waiting for EMR instance fleet ${fleetId} to reach RUNNING with capacity ${targetCapacity} (${Math.round(this.maxWaitMs / 6e4)} min)`, resourceType, logicalId, fleetId);
|
|
36680
|
+
}
|
|
36681
|
+
/**
|
|
36682
|
+
* `ListInstanceFleets` (paginated) for the cluster, returning the single
|
|
36683
|
+
* fleet whose `Id` matches. Absorbs up to `maxConsecutiveTransient`
|
|
36684
|
+
* consecutive transient errors (throttle / 5xx / reset) so a single blip
|
|
36685
|
+
* during a 10-minute poll does not spuriously fail the create.
|
|
36686
|
+
*/
|
|
36687
|
+
async findFleetForPoll(clusterId, fleetId, transientState, maxConsecutiveTransient = 5) {
|
|
36688
|
+
try {
|
|
36689
|
+
let marker;
|
|
36690
|
+
do {
|
|
36691
|
+
const resp = await this.getClient().send(new ListInstanceFleetsCommand({
|
|
36692
|
+
ClusterId: clusterId,
|
|
36693
|
+
...marker && { Marker: marker }
|
|
36694
|
+
}));
|
|
36695
|
+
const found = (resp.InstanceFleets ?? []).find((f) => f.Id === fleetId);
|
|
36696
|
+
if (found) {
|
|
36697
|
+
transientState.count = 0;
|
|
36698
|
+
return found;
|
|
36699
|
+
}
|
|
36700
|
+
marker = resp.Marker;
|
|
36701
|
+
} while (marker);
|
|
36702
|
+
transientState.count = 0;
|
|
36703
|
+
return;
|
|
36704
|
+
} catch (error) {
|
|
36705
|
+
const name = error instanceof Error ? error.name : "";
|
|
36706
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
36707
|
+
if ((name === "ThrottlingException" || name === "InternalServerException" || name === "InternalServerError" || name === "TimeoutError" || /rate exceeded|too many requests|throttl|timed? ?out|ECONNRESET|EPIPE|socket hang up/i.test(msg)) && transientState.count < maxConsecutiveTransient) {
|
|
36708
|
+
transientState.count += 1;
|
|
36709
|
+
this.logger.debug(`Transient ListInstanceFleets error while polling ${fleetId} (${transientState.count}/${maxConsecutiveTransient}): ${msg} — retrying`);
|
|
36710
|
+
return;
|
|
36711
|
+
}
|
|
36712
|
+
throw error;
|
|
36713
|
+
}
|
|
36714
|
+
}
|
|
36715
|
+
};
|
|
36716
|
+
|
|
35810
36717
|
//#endregion
|
|
35811
36718
|
//#region src/provisioning/providers/firehose-provider.ts
|
|
35812
36719
|
/**
|
|
@@ -35818,7 +36725,7 @@ var EMRClusterProvider = class {
|
|
|
35818
36725
|
* Membership grows as each follow-up PR lands. Keep alphabetical
|
|
35819
36726
|
* to minimize merge conflicts when multiple follow-ups race.
|
|
35820
36727
|
*/
|
|
35821
|
-
const SUPPORTED_UPDATE_DESTINATIONS = new Set([
|
|
36728
|
+
const SUPPORTED_UPDATE_DESTINATIONS = /* @__PURE__ */ new Set([
|
|
35822
36729
|
"AmazonOpenSearchServerlessDestinationConfiguration",
|
|
35823
36730
|
"AmazonopensearchserviceDestinationConfiguration",
|
|
35824
36731
|
"ElasticsearchDestinationConfiguration",
|
|
@@ -35842,7 +36749,7 @@ var FirehoseProvider = class {
|
|
|
35842
36749
|
client;
|
|
35843
36750
|
providerRegion = process.env["AWS_REGION"];
|
|
35844
36751
|
logger = getLogger().child("FirehoseProvider");
|
|
35845
|
-
handledProperties = new Map([["AWS::KinesisFirehose::DeliveryStream", new Set([
|
|
36752
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::KinesisFirehose::DeliveryStream", /* @__PURE__ */ new Set([
|
|
35846
36753
|
"DeliveryStreamName",
|
|
35847
36754
|
"DeliveryStreamType",
|
|
35848
36755
|
"S3DestinationConfiguration",
|
|
@@ -37088,7 +37995,7 @@ var CloudTrailProvider = class {
|
|
|
37088
37995
|
client;
|
|
37089
37996
|
providerRegion = process.env["AWS_REGION"];
|
|
37090
37997
|
logger = getLogger().child("CloudTrailProvider");
|
|
37091
|
-
handledProperties = new Map([["AWS::CloudTrail::Trail", new Set([
|
|
37998
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CloudTrail::Trail", /* @__PURE__ */ new Set([
|
|
37092
37999
|
"S3BucketName",
|
|
37093
38000
|
"TrailName",
|
|
37094
38001
|
"S3KeyPrefix",
|
|
@@ -37431,7 +38338,7 @@ var CodeBuildProvider = class {
|
|
|
37431
38338
|
client;
|
|
37432
38339
|
providerRegion = process.env["AWS_REGION"];
|
|
37433
38340
|
logger = getLogger().child("CodeBuildProvider");
|
|
37434
|
-
handledProperties = new Map([["AWS::CodeBuild::Project", new Set([
|
|
38341
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CodeBuild::Project", /* @__PURE__ */ new Set([
|
|
37435
38342
|
"Name",
|
|
37436
38343
|
"Source",
|
|
37437
38344
|
"Environment",
|
|
@@ -37963,7 +38870,7 @@ var CodeCommitRepositoryProvider = class {
|
|
|
37963
38870
|
s3Client;
|
|
37964
38871
|
providerRegion = process.env["AWS_REGION"];
|
|
37965
38872
|
logger = getLogger().child("CodeCommitRepositoryProvider");
|
|
37966
|
-
handledProperties = new Map([["AWS::CodeCommit::Repository", new Set([
|
|
38873
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CodeCommit::Repository", /* @__PURE__ */ new Set([
|
|
37967
38874
|
"RepositoryName",
|
|
37968
38875
|
"RepositoryDescription",
|
|
37969
38876
|
"KmsKeyId",
|
|
@@ -38415,7 +39322,7 @@ var DLMLifecyclePolicyProvider = class {
|
|
|
38415
39322
|
client;
|
|
38416
39323
|
providerRegion = process.env["AWS_REGION"];
|
|
38417
39324
|
logger = getLogger().child("DLMLifecyclePolicyProvider");
|
|
38418
|
-
handledProperties = new Map([["AWS::DLM::LifecyclePolicy", new Set([
|
|
39325
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::DLM::LifecyclePolicy", /* @__PURE__ */ new Set([
|
|
38419
39326
|
"Description",
|
|
38420
39327
|
"ExecutionRoleArn",
|
|
38421
39328
|
"State",
|
|
@@ -38665,7 +39572,7 @@ var S3VectorsProvider = class {
|
|
|
38665
39572
|
client;
|
|
38666
39573
|
providerRegion = process.env["AWS_REGION"];
|
|
38667
39574
|
logger = getLogger().child("S3VectorsProvider");
|
|
38668
|
-
handledProperties = new Map([["AWS::S3Vectors::VectorBucket", new Set([
|
|
39575
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::S3Vectors::VectorBucket", /* @__PURE__ */ new Set([
|
|
38669
39576
|
"VectorBucketName",
|
|
38670
39577
|
"EncryptionConfiguration",
|
|
38671
39578
|
"Tags"
|
|
@@ -38926,7 +39833,7 @@ var S3DirectoryBucketProvider = class {
|
|
|
38926
39833
|
s3Client;
|
|
38927
39834
|
stsClient;
|
|
38928
39835
|
logger = getLogger().child("S3DirectoryBucketProvider");
|
|
38929
|
-
handledProperties = new Map([["AWS::S3Express::DirectoryBucket", new Set([
|
|
39836
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::S3Express::DirectoryBucket", /* @__PURE__ */ new Set([
|
|
38930
39837
|
"DataRedundancy",
|
|
38931
39838
|
"LocationName",
|
|
38932
39839
|
"BucketName"
|
|
@@ -39173,10 +40080,10 @@ var S3TablesProvider = class {
|
|
|
39173
40080
|
client;
|
|
39174
40081
|
providerRegion = process.env["AWS_REGION"];
|
|
39175
40082
|
logger = getLogger().child("S3TablesProvider");
|
|
39176
|
-
handledProperties = new Map([
|
|
39177
|
-
["AWS::S3Tables::TableBucket", new Set(["TableBucketName", "Tags"])],
|
|
39178
|
-
["AWS::S3Tables::Namespace", new Set(["TableBucketARN", "Namespace"])],
|
|
39179
|
-
["AWS::S3Tables::Table", new Set([
|
|
40083
|
+
handledProperties = /* @__PURE__ */ new Map([
|
|
40084
|
+
["AWS::S3Tables::TableBucket", /* @__PURE__ */ new Set(["TableBucketName", "Tags"])],
|
|
40085
|
+
["AWS::S3Tables::Namespace", /* @__PURE__ */ new Set(["TableBucketARN", "Namespace"])],
|
|
40086
|
+
["AWS::S3Tables::Table", /* @__PURE__ */ new Set([
|
|
39180
40087
|
"TableBucketARN",
|
|
39181
40088
|
"Namespace",
|
|
39182
40089
|
"TableName",
|
|
@@ -39793,7 +40700,7 @@ var ECRProvider = class {
|
|
|
39793
40700
|
client;
|
|
39794
40701
|
providerRegion = process.env["AWS_REGION"];
|
|
39795
40702
|
logger = getLogger().child("ECRProvider");
|
|
39796
|
-
handledProperties = new Map([["AWS::ECR::Repository", new Set([
|
|
40703
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::ECR::Repository", /* @__PURE__ */ new Set([
|
|
39797
40704
|
"RepositoryName",
|
|
39798
40705
|
"ImageScanningConfiguration",
|
|
39799
40706
|
"ImageTagMutability",
|
|
@@ -40140,8 +41047,8 @@ const PROTECTION_PROPERTY_BY_TYPE = {
|
|
|
40140
41047
|
* (boolean `true`).
|
|
40141
41048
|
*/
|
|
40142
41049
|
const PROTECTION_ACTIVE_VALUES_BY_TYPE = {
|
|
40143
|
-
"AWS::Cognito::UserPool": new Set(["ACTIVE"]),
|
|
40144
|
-
"AWS::AutoScaling::AutoScalingGroup": new Set(["prevent-force-deletion", "prevent-all-deletion"])
|
|
41050
|
+
"AWS::Cognito::UserPool": /* @__PURE__ */ new Set(["ACTIVE"]),
|
|
41051
|
+
"AWS::AutoScaling::AutoScalingGroup": /* @__PURE__ */ new Set(["prevent-force-deletion", "prevent-all-deletion"])
|
|
40145
41052
|
};
|
|
40146
41053
|
/**
|
|
40147
41054
|
* Count how many resources in a stack's recorded state appear to have
|
|
@@ -40675,7 +41582,7 @@ var NestedStackProvider = class {
|
|
|
40675
41582
|
* parameter map forwarded as `DeployEngineOptions.parameters` to the
|
|
40676
41583
|
* child engine.
|
|
40677
41584
|
*/
|
|
40678
|
-
handledProperties = new Map([["AWS::CloudFormation::Stack", new Set(["TemplateURL", "Parameters"])]]);
|
|
41585
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFormation::Stack", /* @__PURE__ */ new Set(["TemplateURL", "Parameters"])]]);
|
|
40679
41586
|
/**
|
|
40680
41587
|
* Every other property on `AWS::CloudFormation::Stack` is intentionally
|
|
40681
41588
|
* not threaded through — cdkd does not go through CloudFormation, so
|
|
@@ -40687,7 +41594,7 @@ var NestedStackProvider = class {
|
|
|
40687
41594
|
* `<parent>~<logicalId>` key per design §3, and `TemplateBody` is
|
|
40688
41595
|
* superseded by the local `Metadata['aws:asset:path']` lookup.
|
|
40689
41596
|
*/
|
|
40690
|
-
unhandledByDesign = new Map([["AWS::CloudFormation::Stack", new Map([
|
|
41597
|
+
unhandledByDesign = /* @__PURE__ */ new Map([["AWS::CloudFormation::Stack", /* @__PURE__ */ new Map([
|
|
40691
41598
|
["TemplateBody", "CFn-only inline template — cdkd reads the child template from the synth output via Metadata['aws:asset:path'] instead of accepting it inline"],
|
|
40692
41599
|
["Capabilities", "CFn-only IAM capability declaration — cdkd does not go through CloudFormation so capabilities have no equivalent"],
|
|
40693
41600
|
["Description", "CFn-only informational — no semantic effect on the recursive deploy"],
|
|
@@ -40880,7 +41787,7 @@ var NestedStackProvider = class {
|
|
|
40880
41787
|
*/
|
|
40881
41788
|
var WaitConditionHandleProvider = class {
|
|
40882
41789
|
logger = getLogger().child("WaitConditionHandleProvider");
|
|
40883
|
-
handledProperties = new Map([["AWS::CloudFormation::WaitConditionHandle", /* @__PURE__ */ new Set([])]]);
|
|
41790
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFormation::WaitConditionHandle", /* @__PURE__ */ new Set([])]]);
|
|
40884
41791
|
/**
|
|
40885
41792
|
* "Create" the handle: synthesize a unique placeholder physical id.
|
|
40886
41793
|
* `Ref` on the handle resolves to this id. It is deliberately NOT
|
|
@@ -40976,7 +41883,7 @@ var ACMCertificateProvider = class {
|
|
|
40976
41883
|
constructor() {
|
|
40977
41884
|
this.acmClient = getAwsClients().acm;
|
|
40978
41885
|
}
|
|
40979
|
-
handledProperties = new Map([["AWS::CertificateManager::Certificate", new Set([
|
|
41886
|
+
handledProperties = /* @__PURE__ */ new Map([["AWS::CertificateManager::Certificate", /* @__PURE__ */ new Set([
|
|
40980
41887
|
"DomainName",
|
|
40981
41888
|
"ValidationMethod",
|
|
40982
41889
|
"SubjectAlternativeNames",
|
|
@@ -41419,6 +42326,8 @@ function registerAllProviders(registry) {
|
|
|
41419
42326
|
registry.register("AWS::EFS::AccessPoint", efsProvider);
|
|
41420
42327
|
registry.register("AWS::FSx::FileSystem", new FSxFileSystemProvider());
|
|
41421
42328
|
registry.register("AWS::EMR::Cluster", new EMRClusterProvider());
|
|
42329
|
+
registry.register("AWS::EMR::InstanceGroupConfig", new EMRInstanceGroupConfigProvider());
|
|
42330
|
+
registry.register("AWS::EMR::InstanceFleetConfig", new EMRInstanceFleetConfigProvider());
|
|
41422
42331
|
registry.register("AWS::KinesisFirehose::DeliveryStream", new FirehoseProvider());
|
|
41423
42332
|
registry.register("AWS::CloudTrail::Trail", new CloudTrailProvider());
|
|
41424
42333
|
registry.register("AWS::CodeBuild::Project", new CodeBuildProvider());
|
|
@@ -41954,7 +42863,7 @@ function createDeployCommand() {
|
|
|
41954
42863
|
* `cdkd import --migrate-from-cloudformation` retirement flow
|
|
41955
42864
|
* (`src/cli/commands/retire-cfn-stack.ts`).
|
|
41956
42865
|
*/
|
|
41957
|
-
const STABLE_TERMINAL_STATUSES = new Set([
|
|
42866
|
+
const STABLE_TERMINAL_STATUSES = /* @__PURE__ */ new Set([
|
|
41958
42867
|
"CREATE_COMPLETE",
|
|
41959
42868
|
"UPDATE_COMPLETE",
|
|
41960
42869
|
"UPDATE_ROLLBACK_COMPLETE",
|
|
@@ -43084,7 +43993,7 @@ function diffTreeToJson(node) {
|
|
|
43084
43993
|
children: node.children.map(diffTreeToJson)
|
|
43085
43994
|
};
|
|
43086
43995
|
}
|
|
43087
|
-
const INTRINSIC_KEYS = new Set([
|
|
43996
|
+
const INTRINSIC_KEYS = /* @__PURE__ */ new Set([
|
|
43088
43997
|
"Ref",
|
|
43089
43998
|
"Fn::Sub",
|
|
43090
43999
|
"Fn::GetAtt",
|
|
@@ -43494,7 +44403,7 @@ function isIgnoredPath(path, ignorePaths) {
|
|
|
43494
44403
|
function diffAt(path, stateValue, awsValue, out, ignorePaths, unionWalkObjects) {
|
|
43495
44404
|
if (deepEqual(stateValue, awsValue)) return;
|
|
43496
44405
|
if (isPlainObject(stateValue) && isPlainObject(awsValue) && !Array.isArray(stateValue) && !Array.isArray(awsValue)) {
|
|
43497
|
-
const keys = unionWalkObjects ? new Set([...Object.keys(stateValue), ...Object.keys(awsValue)]) : Object.keys(stateValue);
|
|
44406
|
+
const keys = unionWalkObjects ? /* @__PURE__ */ new Set([...Object.keys(stateValue), ...Object.keys(awsValue)]) : Object.keys(stateValue);
|
|
43498
44407
|
for (const key of keys) {
|
|
43499
44408
|
const childPath = `${path}.${key}`;
|
|
43500
44409
|
if (isIgnoredPath(childPath, ignorePaths)) continue;
|
|
@@ -43624,7 +44533,7 @@ const CC_API_FALLBACK_DENY_LIST = {
|
|
|
43624
44533
|
* managed field — the deny-list catches per-type structural divergence;
|
|
43625
44534
|
* this helper catches generic noise.
|
|
43626
44535
|
*/
|
|
43627
|
-
const ALWAYS_STRIPPED_FIELDS = new Set([
|
|
44536
|
+
const ALWAYS_STRIPPED_FIELDS = /* @__PURE__ */ new Set([
|
|
43628
44537
|
"CreationDate",
|
|
43629
44538
|
"CreationTime",
|
|
43630
44539
|
"CreatedTime",
|
|
@@ -46736,7 +47645,7 @@ function stackTreeToJson(roots) {
|
|
|
46736
47645
|
* support for import are surfaced as errors by the CreateChangeSet call
|
|
46737
47646
|
* itself; we do not try to maintain a closed allowlist here.
|
|
46738
47647
|
*/
|
|
46739
|
-
const NEVER_IMPORTABLE_TYPES = new Set(["AWS::CDK::Metadata"]);
|
|
47648
|
+
const NEVER_IMPORTABLE_TYPES = /* @__PURE__ */ new Set(["AWS::CDK::Metadata"]);
|
|
46740
47649
|
/**
|
|
46741
47650
|
* Per-non-root-child lock-acquisition retry budget for the nested-stack
|
|
46742
47651
|
* export loop (`runPerStackImportLoop`). `acquireLockWithRetry` retries
|
|
@@ -46887,7 +47796,7 @@ function readStringProperty(properties, key, resourceType) {
|
|
|
46887
47796
|
* (no `read` / `list` — inline policy attachments have no first-class
|
|
46888
47797
|
* AWS resource id). See the per-entry comment for each addition.
|
|
46889
47798
|
*/
|
|
46890
|
-
const IMPORT_UNSUPPORTED_RECREATABLE_TYPES = new Set(["AWS::ApiGatewayV2::Stage", "AWS::IAM::Policy"]);
|
|
47799
|
+
const IMPORT_UNSUPPORTED_RECREATABLE_TYPES = /* @__PURE__ */ new Set(["AWS::ApiGatewayV2::Stage", "AWS::IAM::Policy"]);
|
|
46891
47800
|
const PRE_DELETE_HANDLERS = {
|
|
46892
47801
|
"AWS::ApiGatewayV2::Stage": async (entry) => {
|
|
46893
47802
|
const { ApiGatewayV2Client, DeleteStageCommand, NotFoundException } = await import("@aws-sdk/client-apigatewayv2");
|
|
@@ -53054,7 +53963,7 @@ async function runDetached(opts) {
|
|
|
53054
53963
|
const ro = mount.readOnly ? ":ro" : "";
|
|
53055
53964
|
args.push("-v", `${mount.hostPath}:${mount.containerPath}${ro}`);
|
|
53056
53965
|
}
|
|
53057
|
-
const sensitiveKeys = opts.sensitiveEnvKeys && opts.sensitiveEnvKeys.size > 0 ? new Set([...SENSITIVE_ENV_KEYS, ...opts.sensitiveEnvKeys]) : SENSITIVE_ENV_KEYS;
|
|
53966
|
+
const sensitiveKeys = opts.sensitiveEnvKeys && opts.sensitiveEnvKeys.size > 0 ? /* @__PURE__ */ new Set([...SENSITIVE_ENV_KEYS, ...opts.sensitiveEnvKeys]) : SENSITIVE_ENV_KEYS;
|
|
53058
53967
|
const passthroughEnv = {};
|
|
53059
53968
|
for (const [k, v] of Object.entries(opts.env)) if (sensitiveKeys.has(k)) {
|
|
53060
53969
|
args.push("-e", k);
|
|
@@ -53178,7 +54087,7 @@ function pickFreePort() {
|
|
|
53178
54087
|
* into stdout / log files. Only the matching `-e <KEY>=<value>` pair is
|
|
53179
54088
|
* redacted; non-credential `-e KEY=val` entries pass through unchanged.
|
|
53180
54089
|
*/
|
|
53181
|
-
const REDACTED_ENV_KEYS = new Set([
|
|
54090
|
+
const REDACTED_ENV_KEYS = /* @__PURE__ */ new Set([
|
|
53182
54091
|
"AWS_ACCESS_KEY_ID",
|
|
53183
54092
|
"AWS_SECRET_ACCESS_KEY",
|
|
53184
54093
|
"AWS_SESSION_TOKEN"
|
|
@@ -53194,7 +54103,7 @@ const REDACTED_ENV_KEYS = new Set([
|
|
|
53194
54103
|
* AgentCore local-invoke path to keep decrypted `--from-cfn-stack`
|
|
53195
54104
|
* SecureString SSM values off the argv).
|
|
53196
54105
|
*/
|
|
53197
|
-
const SENSITIVE_ENV_KEYS = new Set([
|
|
54106
|
+
const SENSITIVE_ENV_KEYS = /* @__PURE__ */ new Set([
|
|
53198
54107
|
"AWS_ACCESS_KEY_ID",
|
|
53199
54108
|
"AWS_SECRET_ACCESS_KEY",
|
|
53200
54109
|
"AWS_SESSION_TOKEN"
|
|
@@ -56838,7 +57747,7 @@ function buildDockerRunArgs(opts) {
|
|
|
56838
57747
|
args.push("--network", network);
|
|
56839
57748
|
args.push("--network-alias", container.name);
|
|
56840
57749
|
if (opts.networkAliases && opts.networkAliases.length > 0) {
|
|
56841
|
-
const seen = new Set([container.name]);
|
|
57750
|
+
const seen = /* @__PURE__ */ new Set([container.name]);
|
|
56842
57751
|
for (const a of opts.networkAliases) if (!seen.has(a)) {
|
|
56843
57752
|
args.push("--network-alias", a);
|
|
56844
57753
|
seen.add(a);
|
|
@@ -59661,7 +60570,7 @@ function compareSemver(a, b) {
|
|
|
59661
60570
|
* - `Custom::*` — any user-defined Custom Resource type prefix.
|
|
59662
60571
|
* Same rationale as `AWS::CloudFormation::CustomResource`.
|
|
59663
60572
|
*/
|
|
59664
|
-
const HARD_REJECT_RESOURCE_TYPES = new Set(["AWS::CloudFormation::CustomResource", "AWS::CloudFormation::Stack"]);
|
|
60573
|
+
const HARD_REJECT_RESOURCE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", "AWS::CloudFormation::Stack"]);
|
|
59665
60574
|
/**
|
|
59666
60575
|
* Fetch the source CFn stack's current state + resources + transform
|
|
59667
60576
|
* info. Issues 3 read-only AWS API calls (`DescribeStacks`,
|
|
@@ -59862,7 +60771,8 @@ async function spawnCdkMigrate(opts) {
|
|
|
59862
60771
|
]
|
|
59863
60772
|
});
|
|
59864
60773
|
} catch (err) {
|
|
59865
|
-
|
|
60774
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
60775
|
+
rejectPromise(new LocalMigrateError(`Failed to spawn '${cdkBin} migrate': ${detail}`, err instanceof Error ? err : void 0));
|
|
59866
60776
|
return;
|
|
59867
60777
|
}
|
|
59868
60778
|
child.stdout?.on("data", (chunk) => {
|
|
@@ -59889,7 +60799,8 @@ async function spawnCdkMigrate(opts) {
|
|
|
59889
60799
|
});
|
|
59890
60800
|
return;
|
|
59891
60801
|
}
|
|
59892
|
-
|
|
60802
|
+
const exitDetail = signal !== null ? `killed by signal ${signal}` : code !== null ? `exited with code ${code}` : "process closed without a code or signal";
|
|
60803
|
+
rejectPromise(new LocalMigrateError(`'${cdkBin} migrate' ${exitDetail}.\n--- stdout ---\n${stdout || "(empty)"}\n--- stderr ---\n${stderr || "(empty)"}\n`));
|
|
59893
60804
|
});
|
|
59894
60805
|
});
|
|
59895
60806
|
}
|
|
@@ -60655,7 +61566,7 @@ function installPipeCloseHandler(streams = [process.stdout, process.stderr], exi
|
|
|
60655
61566
|
|
|
60656
61567
|
//#endregion
|
|
60657
61568
|
//#region src/cli/index.ts
|
|
60658
|
-
const SUBCOMMANDS = new Set([
|
|
61569
|
+
const SUBCOMMANDS = /* @__PURE__ */ new Set([
|
|
60659
61570
|
"bootstrap",
|
|
60660
61571
|
"synth",
|
|
60661
61572
|
"list",
|
|
@@ -60697,7 +61608,7 @@ function reorderArgs(argv) {
|
|
|
60697
61608
|
async function main() {
|
|
60698
61609
|
installPipeCloseHandler();
|
|
60699
61610
|
const program = new Command();
|
|
60700
|
-
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.
|
|
61611
|
+
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.250.0");
|
|
60701
61612
|
program.addCommand(createBootstrapCommand());
|
|
60702
61613
|
program.addCommand(createSynthCommand());
|
|
60703
61614
|
program.addCommand(createListCommand());
|