@go-to-k/cdkd 0.230.0 → 0.230.2
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/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { A as withErrorHandling, B as generateResourceName, C as StackHasActiveImportsError, F as getLiveRenderer, H as withSkipPrefix, I as PATTERN_B_NAME_OPTIONS, L as PATTERN_B_NAME_PROPERTIES, M as getLogger, P as runStackBuffered, R as PATTERN_B_RESOURCE_TYPES, S as ResourceUpdateNotSupportedError, U as withStackName, V as generateResourceNameWithFallback, _ as MissingCdkCliError, a as assertRegionMatch, b as ProvisioningError, f as LocalInvokeBuildError$1, i as resolveExplicitPhysicalId, k as normalizeAwsError, l as CdkdError, m as LocalStartServiceError, n as matchesCdkPath, o as disableInstanceApiTermination, p as LocalMigrateError, r as normalizeAwsTagsToCfn, s as isTerminationProtectionPropagationError, t as CDK_PATH_TAG, v as NestedStackChildDirectDestroyError, w as StackTerminationProtectionError, x as ResourceTimeoutError, y as PartialFailureError } from "./import-helpers-DayvBD4T.js";
|
|
3
3
|
import { a as setAwsClients, i as resetAwsClients, r as getAwsClients, t as AwsClients } from "./aws-clients-pjPwZz1r.js";
|
|
4
|
-
import { $ as CFN_TEMPLATE_BODY_LIMIT, A as LockManager, B as runDockerForeground, C as findActionableSilentDrops, D as DiffCalculator, E as applyRoleArnIfSet, F as stringifyValue, G as getDefaultStateBucketName, H as AssetManifestLoader, I as WorkGraph, J as resolveCaptureObservedState, K as getLegacyStateBucketName, L as buildDockerImage, M as rebuildClientForBucketRegion, N as shouldRetainResource, O as DagBuilder, P as AssetPublisher, Q as warnDeprecatedNoPrefixCliFlag, R as formatDockerLoginError, S as ProviderRegistry, T as IntrinsicFunctionResolver, U as getDockerImageBySourceHash, V as runDockerStreaming, W as Synthesizer, X as resolveStateBucketWithDefault, Y as resolveSkipPrefix, Z as resolveStateBucketWithDefaultAndSource, _ as green, a as withRetry, b as IAMRoleProvider, c as computeImplicitDeleteEdges, d as isStatefulRecreateTargetSync, et as CFN_TEMPLATE_URL_LIMIT, f as renderStatefulReason, g as gray, h as cyan, i as withResourceDeadline, it as AssemblyReader, j as S3StateBackend, k as TemplateParser, l as extractDeploymentEventError, m as bold, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as findLargeInlineResources, o as isRetryableTransientError, ot as resolveBucketRegion, p as formatResourceLine, q as resolveApp, r as DeployEngine, rt as uploadCfnTemplate, s as IMPLICIT_DELETE_DEPENDENCIES, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as MIGRATE_TMP_PREFIX, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, v as red, w as CloudControlProvider, x as collectInlinePolicyNamesManagedBySiblings, y as yellow, z as getDockerCmd } from "./deploy-engine-
|
|
4
|
+
import { $ as CFN_TEMPLATE_BODY_LIMIT, A as LockManager, B as runDockerForeground, C as findActionableSilentDrops, D as DiffCalculator, E as applyRoleArnIfSet, F as stringifyValue, G as getDefaultStateBucketName, H as AssetManifestLoader, I as WorkGraph, J as resolveCaptureObservedState, K as getLegacyStateBucketName, L as buildDockerImage, M as rebuildClientForBucketRegion, N as shouldRetainResource, O as DagBuilder, P as AssetPublisher, Q as warnDeprecatedNoPrefixCliFlag, R as formatDockerLoginError, S as ProviderRegistry, T as IntrinsicFunctionResolver, U as getDockerImageBySourceHash, V as runDockerStreaming, W as Synthesizer, X as resolveStateBucketWithDefault, Y as resolveSkipPrefix, Z as resolveStateBucketWithDefaultAndSource, _ as green, a as withRetry, b as IAMRoleProvider, c as computeImplicitDeleteEdges, d as isStatefulRecreateTargetSync, et as CFN_TEMPLATE_URL_LIMIT, f as renderStatefulReason, g as gray, h as cyan, i as withResourceDeadline, it as AssemblyReader, j as S3StateBackend, k as TemplateParser, l as extractDeploymentEventError, m as bold, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as findLargeInlineResources, o as isRetryableTransientError, ot as resolveBucketRegion, p as formatResourceLine, q as resolveApp, r as DeployEngine, rt as uploadCfnTemplate, s as IMPLICIT_DELETE_DEPENDENCIES, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as MIGRATE_TMP_PREFIX, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, v as red, w as CloudControlProvider, x as collectInlinePolicyNamesManagedBySiblings, y as yellow, z as getDockerCmd } from "./deploy-engine-BHGrlCLe.js";
|
|
5
5
|
import { t as ASGProvider } from "./asg-provider-Dgj3loIG.js";
|
|
6
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
7
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
@@ -9,7 +9,7 @@ import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurat
|
|
|
9
9
|
import { AddRoleToInstanceProfileCommand, AddUserToGroupCommand, AttachGroupPolicyCommand, AttachRolePolicyCommand, AttachUserPolicyCommand, CreateGroupCommand, CreateInstanceProfileCommand, CreateLoginProfileCommand, CreatePolicyCommand, CreatePolicyVersionCommand, CreateUserCommand, DeleteAccessKeyCommand, DeleteGroupCommand, DeleteGroupPolicyCommand, DeleteInstanceProfileCommand, DeleteLoginProfileCommand, DeletePolicyCommand, DeletePolicyVersionCommand, DeleteRolePolicyCommand, DeleteUserCommand, DeleteUserPermissionsBoundaryCommand, DeleteUserPolicyCommand, DetachGroupPolicyCommand, DetachRolePolicyCommand, DetachUserPolicyCommand, GetGroupCommand, GetGroupPolicyCommand, GetInstanceProfileCommand, GetPolicyCommand, GetPolicyVersionCommand, GetRolePolicyCommand, GetUserCommand, GetUserPolicyCommand, IAMClient, ListAccessKeysCommand, ListAttachedGroupPoliciesCommand, ListAttachedUserPoliciesCommand, ListEntitiesForPolicyCommand, ListGroupPoliciesCommand, ListGroupsForUserCommand, ListInstanceProfilesCommand, ListPoliciesCommand, ListPolicyTagsCommand, ListPolicyVersionsCommand, ListUserPoliciesCommand, ListUserTagsCommand, ListUsersCommand, NoSuchEntityException, PutGroupPolicyCommand, PutRolePolicyCommand, PutUserPermissionsBoundaryCommand, PutUserPolicyCommand, RemoveRoleFromInstanceProfileCommand, RemoveUserFromGroupCommand, TagPolicyCommand, TagUserCommand, UntagPolicyCommand, UntagUserCommand, UpdateLoginProfileCommand } from "@aws-sdk/client-iam";
|
|
10
10
|
import { CreateQueueCommand, DeleteQueueCommand, GetQueueAttributesCommand, GetQueueUrlCommand, ListQueueTagsCommand, ListQueuesCommand, QueueDoesNotExist, SQSClient, SetQueueAttributesCommand, TagQueueCommand, UntagQueueCommand } from "@aws-sdk/client-sqs";
|
|
11
11
|
import { CreateTopicCommand, DeleteTopicCommand, GetSubscriptionAttributesCommand, GetTopicAttributesCommand, ListTagsForResourceCommand, ListTopicsCommand, NotFoundException, SNSClient, SetTopicAttributesCommand, SubscribeCommand, TagResourceCommand, UnsubscribeCommand, UntagResourceCommand } from "@aws-sdk/client-sns";
|
|
12
|
-
import { AddPermissionCommand, CreateEventSourceMappingCommand, CreateFunctionCommand, CreateFunctionUrlConfigCommand, DeleteEventSourceMappingCommand, DeleteFunctionCommand, DeleteFunctionConcurrencyCommand, DeleteFunctionUrlConfigCommand, DeleteLayerVersionCommand, GetEventSourceMappingCommand, GetFunctionCommand, GetFunctionConcurrencyCommand, GetFunctionRecursionConfigCommand, GetFunctionUrlConfigCommand, GetLayerVersionByArnCommand, GetPolicyCommand as GetPolicyCommand$1, LambdaClient, ListFunctionsCommand, ListLayersCommand, ListTagsCommand, PublishLayerVersionCommand, PutFunctionConcurrencyCommand, PutFunctionRecursionConfigCommand, RemovePermissionCommand, ResourceNotFoundException, TagResourceCommand as TagResourceCommand$1, UntagResourceCommand as UntagResourceCommand$1, UpdateEventSourceMappingCommand, UpdateFunctionCodeCommand, UpdateFunctionConfigurationCommand, UpdateFunctionUrlConfigCommand, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
|
|
12
|
+
import { AddPermissionCommand, CreateEventSourceMappingCommand, CreateFunctionCommand, CreateFunctionUrlConfigCommand, DeleteEventSourceMappingCommand, DeleteFunctionCommand, DeleteFunctionConcurrencyCommand, DeleteFunctionEventInvokeConfigCommand, DeleteFunctionUrlConfigCommand, DeleteLayerVersionCommand, GetEventSourceMappingCommand, GetFunctionCommand, GetFunctionConcurrencyCommand, GetFunctionEventInvokeConfigCommand, GetFunctionRecursionConfigCommand, GetFunctionUrlConfigCommand, GetLayerVersionByArnCommand, GetPolicyCommand as GetPolicyCommand$1, LambdaClient, ListFunctionsCommand, ListLayersCommand, ListTagsCommand, PublishLayerVersionCommand, PutFunctionConcurrencyCommand, PutFunctionEventInvokeConfigCommand, PutFunctionRecursionConfigCommand, RemovePermissionCommand, ResourceNotFoundException, TagResourceCommand as TagResourceCommand$1, UntagResourceCommand as UntagResourceCommand$1, UpdateEventSourceMappingCommand, UpdateFunctionCodeCommand, UpdateFunctionConfigurationCommand, UpdateFunctionUrlConfigCommand, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
|
|
13
13
|
import { AssumeRoleCommand, GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
|
|
14
14
|
import { AssociateIamInstanceProfileCommand, AssociateRouteTableCommand, AttachInternetGatewayCommand, AuthorizeSecurityGroupEgressCommand, AuthorizeSecurityGroupIngressCommand, CreateInternetGatewayCommand, CreateNatGatewayCommand, CreateNetworkAclCommand, CreateNetworkAclEntryCommand, CreateRouteCommand, CreateRouteTableCommand, CreateSecurityGroupCommand, CreateSubnetCommand, CreateTagsCommand, CreateVpcCommand, DeleteInternetGatewayCommand, DeleteNatGatewayCommand, DeleteNetworkAclCommand, DeleteNetworkAclEntryCommand, DeleteNetworkInterfaceCommand, DeleteRouteCommand, DeleteRouteTableCommand, DeleteSecurityGroupCommand, DeleteSubnetCommand, DeleteTagsCommand, DeleteVpcCommand, DescribeAvailabilityZonesCommand, DescribeIamInstanceProfileAssociationsCommand, DescribeInstanceAttributeCommand, DescribeInstanceCreditSpecificationsCommand, DescribeInstancesCommand, DescribeInternetGatewaysCommand, DescribeNatGatewaysCommand, DescribeNetworkAclsCommand, DescribeNetworkInterfacesCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSubnetsCommand, DescribeVolumesCommand, DescribeVpcAttributeCommand, DescribeVpcsCommand, DetachInternetGatewayCommand, DisassociateRouteTableCommand, EC2Client, ModifyInstanceAttributeCommand, ModifyInstanceCreditSpecificationCommand, ModifyInstanceMetadataOptionsCommand, ModifySubnetAttributeCommand, ModifyVpcAttributeCommand, MonitorInstancesCommand, ReplaceNetworkAclAssociationCommand, RevokeSecurityGroupEgressCommand, RevokeSecurityGroupIngressCommand, RunInstancesCommand, TerminateInstancesCommand, UnmonitorInstancesCommand, waitUntilInstanceRunning, waitUntilInstanceTerminated, waitUntilNatGatewayAvailable, waitUntilNatGatewayDeleted } from "@aws-sdk/client-ec2";
|
|
15
15
|
import { CreateTableCommand, DeleteResourcePolicyCommand, DeleteTableCommand, DescribeContinuousBackupsCommand, DescribeContributorInsightsCommand, DescribeKinesisStreamingDestinationCommand, DescribeTableCommand, DescribeTimeToLiveCommand, DisableKinesisStreamingDestinationCommand, DynamoDBClient, EnableKinesisStreamingDestinationCommand, GetResourcePolicyCommand, ListTablesCommand, ListTagsOfResourceCommand, PutResourcePolicyCommand, ResourceNotFoundException as ResourceNotFoundException$1, TagResourceCommand as TagResourceCommand$2, UntagResourceCommand as UntagResourceCommand$2, UpdateContinuousBackupsCommand, UpdateContributorInsightsCommand, UpdateTableCommand, UpdateTimeToLiveCommand } from "@aws-sdk/client-dynamodb";
|
|
@@ -1445,7 +1445,7 @@ const FLUSH_INTERVAL_MS = 2e3;
|
|
|
1445
1445
|
const FLUSH_EVENT_THRESHOLD = 50;
|
|
1446
1446
|
/** Build-time cdkd version, with a dev fallback for non-built contexts. */
|
|
1447
1447
|
function getCdkdVersion() {
|
|
1448
|
-
return "0.230.
|
|
1448
|
+
return "0.230.2";
|
|
1449
1449
|
}
|
|
1450
1450
|
/**
|
|
1451
1451
|
* Generate a time-sortable unique run id, e.g.
|
|
@@ -9661,6 +9661,210 @@ var LambdaLayerVersionProvider = class {
|
|
|
9661
9661
|
}
|
|
9662
9662
|
};
|
|
9663
9663
|
|
|
9664
|
+
//#endregion
|
|
9665
|
+
//#region src/provisioning/providers/lambda-event-invoke-config-provider.ts
|
|
9666
|
+
/**
|
|
9667
|
+
* AWS Lambda EventInvokeConfig Provider
|
|
9668
|
+
*
|
|
9669
|
+
* Implements provisioning for AWS::Lambda::EventInvokeConfig (the async-invoke
|
|
9670
|
+
* configuration CDK synthesizes whenever a Function sets `maxEventAge`,
|
|
9671
|
+
* `retryAttempts`, or `onFailure` / `onSuccess` destinations).
|
|
9672
|
+
*
|
|
9673
|
+
* WHY an SDK provider instead of the Cloud Control fallback:
|
|
9674
|
+
* `PutFunctionEventInvokeConfig` is a synchronous **full-replace** write —
|
|
9675
|
+
* exactly what CloudFormation uses for this type. The Cloud Control UPDATE
|
|
9676
|
+
* path instead applies a JSON-patch read-modify-write, and Lambda's
|
|
9677
|
+
* EventInvokeConfig read handler returns an AWS-injected empty
|
|
9678
|
+
* `DestinationConfig.OnSuccess: {}` even when only `OnFailure` was configured.
|
|
9679
|
+
* That empty object then fails Cloud Control model validation on every UPDATE
|
|
9680
|
+
* (`#/DestinationConfig/OnSuccess: required key [Destination] not found`), so a
|
|
9681
|
+
* common daily pattern — an async Lambda with `onFailure` whose `maxEventAge`
|
|
9682
|
+
* or `retryAttempts` is later changed — was undeployable via the CC route.
|
|
9683
|
+
* The full-replace SDK call sends exactly the template's DestinationConfig and
|
|
9684
|
+
* sidesteps the merge entirely.
|
|
9685
|
+
*
|
|
9686
|
+
* The physical id is the Cloud Control primaryIdentifier shape
|
|
9687
|
+
* `<FunctionName>|<Qualifier>` so import / migration stays consistent with the
|
|
9688
|
+
* prior CC-routed behavior.
|
|
9689
|
+
*/
|
|
9690
|
+
var LambdaEventInvokeConfigProvider = class {
|
|
9691
|
+
lambdaClient;
|
|
9692
|
+
logger = getLogger().child("LambdaEventInvokeConfigProvider");
|
|
9693
|
+
handledProperties = new Map([["AWS::Lambda::EventInvokeConfig", new Set([
|
|
9694
|
+
"FunctionName",
|
|
9695
|
+
"Qualifier",
|
|
9696
|
+
"MaximumEventAgeInSeconds",
|
|
9697
|
+
"MaximumRetryAttempts",
|
|
9698
|
+
"DestinationConfig"
|
|
9699
|
+
])]]);
|
|
9700
|
+
constructor() {
|
|
9701
|
+
const awsClients = getAwsClients();
|
|
9702
|
+
this.lambdaClient = awsClients.lambda;
|
|
9703
|
+
}
|
|
9704
|
+
/**
|
|
9705
|
+
* Compose the Cloud-Control-compatible compound physical id.
|
|
9706
|
+
*/
|
|
9707
|
+
buildPhysicalId(functionName, qualifier) {
|
|
9708
|
+
return `${functionName}|${qualifier}`;
|
|
9709
|
+
}
|
|
9710
|
+
/**
|
|
9711
|
+
* Split a `<FunctionName>|<Qualifier>` physical id back into its parts.
|
|
9712
|
+
* Tolerates a bare function name (defaults the qualifier to `$LATEST`).
|
|
9713
|
+
* Splits on the FIRST `|`, which is unambiguous: a Lambda function name is
|
|
9714
|
+
* `[a-zA-Z0-9-_]+` and a function ARN contains no `|`, so the separator can
|
|
9715
|
+
* never appear inside the FunctionName segment.
|
|
9716
|
+
*/
|
|
9717
|
+
parsePhysicalId(physicalId) {
|
|
9718
|
+
const sep = physicalId.indexOf("|");
|
|
9719
|
+
if (sep === -1) return {
|
|
9720
|
+
functionName: physicalId,
|
|
9721
|
+
qualifier: "$LATEST"
|
|
9722
|
+
};
|
|
9723
|
+
return {
|
|
9724
|
+
functionName: physicalId.slice(0, sep),
|
|
9725
|
+
qualifier: physicalId.slice(sep + 1)
|
|
9726
|
+
};
|
|
9727
|
+
}
|
|
9728
|
+
/**
|
|
9729
|
+
* Build the SDK DestinationConfig from CFn properties.
|
|
9730
|
+
*
|
|
9731
|
+
* Only emit a sub-key (`OnSuccess` / `OnFailure`) when the template actually
|
|
9732
|
+
* carries a `Destination` for it — never send an empty `{}`, which is the
|
|
9733
|
+
* exact shape that fails the type's model validation.
|
|
9734
|
+
*/
|
|
9735
|
+
buildDestinationConfig(raw) {
|
|
9736
|
+
if (!raw) return void 0;
|
|
9737
|
+
const config = {};
|
|
9738
|
+
const onSuccess = raw["OnSuccess"];
|
|
9739
|
+
if (onSuccess && typeof onSuccess["Destination"] === "string") config.OnSuccess = { Destination: onSuccess["Destination"] };
|
|
9740
|
+
const onFailure = raw["OnFailure"];
|
|
9741
|
+
if (onFailure && typeof onFailure["Destination"] === "string") config.OnFailure = { Destination: onFailure["Destination"] };
|
|
9742
|
+
return Object.keys(config).length > 0 ? config : void 0;
|
|
9743
|
+
}
|
|
9744
|
+
buildPutInput(properties) {
|
|
9745
|
+
const functionName = properties["FunctionName"];
|
|
9746
|
+
const qualifier = properties["Qualifier"] ?? "$LATEST";
|
|
9747
|
+
const input = { FunctionName: functionName };
|
|
9748
|
+
if (qualifier !== "$LATEST") input.Qualifier = qualifier;
|
|
9749
|
+
if (properties["MaximumEventAgeInSeconds"] !== void 0) input.MaximumEventAgeInSeconds = Number(properties["MaximumEventAgeInSeconds"]);
|
|
9750
|
+
if (properties["MaximumRetryAttempts"] !== void 0) input.MaximumRetryAttempts = Number(properties["MaximumRetryAttempts"]);
|
|
9751
|
+
const dest = this.buildDestinationConfig(properties["DestinationConfig"]);
|
|
9752
|
+
if (dest) input.DestinationConfig = dest;
|
|
9753
|
+
return input;
|
|
9754
|
+
}
|
|
9755
|
+
async create(logicalId, resourceType, properties) {
|
|
9756
|
+
this.logger.debug(`Creating Lambda EventInvokeConfig ${logicalId}`);
|
|
9757
|
+
const functionName = properties["FunctionName"];
|
|
9758
|
+
if (!functionName) throw new ProvisioningError(`FunctionName is required for Lambda EventInvokeConfig ${logicalId}`, resourceType, logicalId);
|
|
9759
|
+
const qualifier = properties["Qualifier"] ?? "$LATEST";
|
|
9760
|
+
try {
|
|
9761
|
+
await this.lambdaClient.send(new PutFunctionEventInvokeConfigCommand(this.buildPutInput(properties)));
|
|
9762
|
+
const physicalId = this.buildPhysicalId(functionName, qualifier);
|
|
9763
|
+
this.logger.debug(`Successfully created Lambda EventInvokeConfig ${logicalId}: ${physicalId}`);
|
|
9764
|
+
return {
|
|
9765
|
+
physicalId,
|
|
9766
|
+
attributes: {}
|
|
9767
|
+
};
|
|
9768
|
+
} catch (error) {
|
|
9769
|
+
const cause = error instanceof Error ? error : void 0;
|
|
9770
|
+
throw new ProvisioningError(`Failed to create Lambda EventInvokeConfig ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, functionName, cause);
|
|
9771
|
+
}
|
|
9772
|
+
}
|
|
9773
|
+
async update(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
9774
|
+
this.logger.debug(`Updating Lambda EventInvokeConfig ${logicalId}: ${physicalId}`);
|
|
9775
|
+
const handled = this.handledProperties.get("AWS::Lambda::EventInvokeConfig") ?? /* @__PURE__ */ new Set();
|
|
9776
|
+
let changed = false;
|
|
9777
|
+
for (const key of handled) if (JSON.stringify(properties[key] ?? null) !== JSON.stringify(previousProperties[key] ?? null)) {
|
|
9778
|
+
changed = true;
|
|
9779
|
+
break;
|
|
9780
|
+
}
|
|
9781
|
+
if (!changed) return {
|
|
9782
|
+
physicalId,
|
|
9783
|
+
wasReplaced: false,
|
|
9784
|
+
attributes: {}
|
|
9785
|
+
};
|
|
9786
|
+
try {
|
|
9787
|
+
await this.lambdaClient.send(new PutFunctionEventInvokeConfigCommand(this.buildPutInput(properties)));
|
|
9788
|
+
this.logger.debug(`Successfully updated Lambda EventInvokeConfig ${logicalId}`);
|
|
9789
|
+
return {
|
|
9790
|
+
physicalId,
|
|
9791
|
+
wasReplaced: false,
|
|
9792
|
+
attributes: {}
|
|
9793
|
+
};
|
|
9794
|
+
} catch (error) {
|
|
9795
|
+
const cause = error instanceof Error ? error : void 0;
|
|
9796
|
+
throw new ProvisioningError(`Failed to update Lambda EventInvokeConfig ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
9797
|
+
}
|
|
9798
|
+
}
|
|
9799
|
+
async delete(logicalId, physicalId, resourceType, _properties, context) {
|
|
9800
|
+
this.logger.debug(`Deleting Lambda EventInvokeConfig ${logicalId}: ${physicalId}`);
|
|
9801
|
+
const { functionName, qualifier } = this.parsePhysicalId(physicalId);
|
|
9802
|
+
const deleteInput = { FunctionName: functionName };
|
|
9803
|
+
if (qualifier !== "$LATEST") deleteInput.Qualifier = qualifier;
|
|
9804
|
+
try {
|
|
9805
|
+
await this.lambdaClient.send(new DeleteFunctionEventInvokeConfigCommand(deleteInput));
|
|
9806
|
+
this.logger.debug(`Successfully deleted Lambda EventInvokeConfig ${logicalId}`);
|
|
9807
|
+
} catch (error) {
|
|
9808
|
+
if (error instanceof ResourceNotFoundException) {
|
|
9809
|
+
assertRegionMatch(await this.lambdaClient.config.region(), context?.expectedRegion, resourceType, logicalId, physicalId);
|
|
9810
|
+
this.logger.debug(`Lambda EventInvokeConfig ${physicalId} does not exist, skipping deletion`);
|
|
9811
|
+
return;
|
|
9812
|
+
}
|
|
9813
|
+
const cause = error instanceof Error ? error : void 0;
|
|
9814
|
+
throw new ProvisioningError(`Failed to delete Lambda EventInvokeConfig ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
|
|
9815
|
+
}
|
|
9816
|
+
}
|
|
9817
|
+
/**
|
|
9818
|
+
* AWS::Lambda::EventInvokeConfig exposes no `Fn::GetAtt` return values, so
|
|
9819
|
+
* there is nothing to resolve. Present for interface completeness / orphan
|
|
9820
|
+
* rewrites.
|
|
9821
|
+
*/
|
|
9822
|
+
async getAttribute(_physicalId, _resourceType, _attributeName) {}
|
|
9823
|
+
/**
|
|
9824
|
+
* Read the AWS-current async-invoke configuration in CFn-property shape for
|
|
9825
|
+
* `cdkd drift`. Surfaces only the keys cdkd writes; the AWS-injected empty
|
|
9826
|
+
* `DestinationConfig.OnSuccess: {}` is dropped so a config set with only
|
|
9827
|
+
* `OnFailure` does not show phantom drift.
|
|
9828
|
+
*/
|
|
9829
|
+
async readCurrentState(physicalId, _logicalId, _resourceType) {
|
|
9830
|
+
const { functionName, qualifier } = this.parsePhysicalId(physicalId);
|
|
9831
|
+
let resp;
|
|
9832
|
+
try {
|
|
9833
|
+
const input = { FunctionName: functionName };
|
|
9834
|
+
if (qualifier !== "$LATEST") input.Qualifier = qualifier;
|
|
9835
|
+
resp = await this.lambdaClient.send(new GetFunctionEventInvokeConfigCommand(input));
|
|
9836
|
+
} catch (err) {
|
|
9837
|
+
if (err instanceof ResourceNotFoundException) return void 0;
|
|
9838
|
+
throw err;
|
|
9839
|
+
}
|
|
9840
|
+
const result = {
|
|
9841
|
+
FunctionName: functionName,
|
|
9842
|
+
Qualifier: qualifier
|
|
9843
|
+
};
|
|
9844
|
+
if (resp.MaximumEventAgeInSeconds !== void 0) result["MaximumEventAgeInSeconds"] = resp.MaximumEventAgeInSeconds;
|
|
9845
|
+
if (resp.MaximumRetryAttempts !== void 0) result["MaximumRetryAttempts"] = resp.MaximumRetryAttempts;
|
|
9846
|
+
const dest = {};
|
|
9847
|
+
if (resp.DestinationConfig?.OnSuccess?.Destination) dest["OnSuccess"] = { Destination: resp.DestinationConfig.OnSuccess.Destination };
|
|
9848
|
+
if (resp.DestinationConfig?.OnFailure?.Destination) dest["OnFailure"] = { Destination: resp.DestinationConfig.OnFailure.Destination };
|
|
9849
|
+
if (Object.keys(dest).length > 0) result["DestinationConfig"] = dest;
|
|
9850
|
+
return result;
|
|
9851
|
+
}
|
|
9852
|
+
/**
|
|
9853
|
+
* Adopt an existing EventInvokeConfig into cdkd state.
|
|
9854
|
+
*
|
|
9855
|
+
* **Explicit override only.** The config attaches to a function/qualifier and
|
|
9856
|
+
* has no standalone identity or `aws:cdk:path` tag to look up. Users pass
|
|
9857
|
+
* `--resource <logicalId>=<FunctionName>|<Qualifier>`.
|
|
9858
|
+
*/
|
|
9859
|
+
async import(input) {
|
|
9860
|
+
if (input.knownPhysicalId) return {
|
|
9861
|
+
physicalId: input.knownPhysicalId,
|
|
9862
|
+
attributes: {}
|
|
9863
|
+
};
|
|
9864
|
+
return null;
|
|
9865
|
+
}
|
|
9866
|
+
};
|
|
9867
|
+
|
|
9664
9868
|
//#endregion
|
|
9665
9869
|
//#region src/provisioning/providers/dynamodb-table-provider.ts
|
|
9666
9870
|
/**
|
|
@@ -35093,6 +35297,32 @@ var ECRProvider = class {
|
|
|
35093
35297
|
return this.client;
|
|
35094
35298
|
}
|
|
35095
35299
|
/**
|
|
35300
|
+
* Map CFn `ImageScanningConfiguration` (PascalCase `{ ScanOnPush }`) to the
|
|
35301
|
+
* SDK shape (camelCase `{ scanOnPush }`). The SDK input keys are camelCase;
|
|
35302
|
+
* forwarding the CFn-cased object verbatim makes the SDK ignore the unknown
|
|
35303
|
+
* `ScanOnPush` key and silently default `scanOnPush` to `false` — so
|
|
35304
|
+
* `imageScanOnPush: true` never reached AWS. Returns `undefined` for an
|
|
35305
|
+
* absent config so the caller can omit the field.
|
|
35306
|
+
*/
|
|
35307
|
+
toSdkScanningConfig(cfn) {
|
|
35308
|
+
if (!cfn) return void 0;
|
|
35309
|
+
return { scanOnPush: Boolean(cfn["ScanOnPush"]) };
|
|
35310
|
+
}
|
|
35311
|
+
/**
|
|
35312
|
+
* Map CFn `EncryptionConfiguration` (PascalCase `{ EncryptionType, KmsKey }`)
|
|
35313
|
+
* to the SDK shape (camelCase `{ encryptionType, kmsKey }`). Same casing trap
|
|
35314
|
+
* as scanning config — a KMS repo's `KmsKey` would be silently dropped (and
|
|
35315
|
+
* the type would fall back to AES256) without this mapping.
|
|
35316
|
+
*/
|
|
35317
|
+
toSdkEncryptionConfig(cfn) {
|
|
35318
|
+
if (!cfn) return void 0;
|
|
35319
|
+
const encryptionType = cfn["EncryptionType"];
|
|
35320
|
+
if (!encryptionType) return void 0;
|
|
35321
|
+
const out = { encryptionType };
|
|
35322
|
+
if (encryptionType === "KMS" && cfn["KmsKey"]) out.kmsKey = cfn["KmsKey"];
|
|
35323
|
+
return out;
|
|
35324
|
+
}
|
|
35325
|
+
/**
|
|
35096
35326
|
* Create an ECR Repository
|
|
35097
35327
|
*/
|
|
35098
35328
|
async create(logicalId, resourceType, properties) {
|
|
@@ -35100,11 +35330,13 @@ var ECRProvider = class {
|
|
|
35100
35330
|
const repositoryName = properties["RepositoryName"] || generateResourceName(logicalId, { maxLength: 256 }).toLowerCase();
|
|
35101
35331
|
try {
|
|
35102
35332
|
const tags = properties["Tags"];
|
|
35333
|
+
const scanningConfig = this.toSdkScanningConfig(properties["ImageScanningConfiguration"]);
|
|
35334
|
+
const encryptionConfig = this.toSdkEncryptionConfig(properties["EncryptionConfiguration"]);
|
|
35103
35335
|
const repo = (await this.getClient().send(new CreateRepositoryCommand({
|
|
35104
35336
|
repositoryName,
|
|
35105
|
-
...
|
|
35337
|
+
...scanningConfig ? { imageScanningConfiguration: scanningConfig } : {},
|
|
35106
35338
|
...properties["ImageTagMutability"] ? { imageTagMutability: properties["ImageTagMutability"] } : {},
|
|
35107
|
-
...
|
|
35339
|
+
...encryptionConfig ? { encryptionConfiguration: encryptionConfig } : {},
|
|
35108
35340
|
...tags ? { tags } : {}
|
|
35109
35341
|
}))).repository;
|
|
35110
35342
|
if (!repo?.repositoryName) throw new Error("CreateRepository did not return repository name");
|
|
@@ -35155,7 +35387,7 @@ var ECRProvider = class {
|
|
|
35155
35387
|
if (JSON.stringify(newScanConfig) !== JSON.stringify(oldScanConfig)) {
|
|
35156
35388
|
await this.getClient().send(new PutImageScanningConfigurationCommand({
|
|
35157
35389
|
repositoryName: physicalId,
|
|
35158
|
-
imageScanningConfiguration: newScanConfig ?? { scanOnPush: false }
|
|
35390
|
+
imageScanningConfiguration: this.toSdkScanningConfig(newScanConfig) ?? { scanOnPush: false }
|
|
35159
35391
|
}));
|
|
35160
35392
|
this.logger.debug(`Updated image scanning configuration for ${physicalId}`);
|
|
35161
35393
|
}
|
|
@@ -36475,6 +36707,7 @@ function registerAllProviders(registry) {
|
|
|
36475
36707
|
registry.register("AWS::Lambda::Url", new LambdaUrlProvider());
|
|
36476
36708
|
registry.register("AWS::Lambda::EventSourceMapping", new LambdaEventSourceMappingProvider());
|
|
36477
36709
|
registry.register("AWS::Lambda::LayerVersion", new LambdaLayerVersionProvider());
|
|
36710
|
+
registry.register("AWS::Lambda::EventInvokeConfig", new LambdaEventInvokeConfigProvider());
|
|
36478
36711
|
registry.register("AWS::DynamoDB::Table", new DynamoDBTableProvider());
|
|
36479
36712
|
registry.register("AWS::DynamoDB::GlobalTable", new DynamoDBGlobalTableProvider());
|
|
36480
36713
|
registry.register("AWS::Logs::LogGroup", new LogsLogGroupProvider());
|
|
@@ -54962,7 +55195,7 @@ function reorderArgs(argv) {
|
|
|
54962
55195
|
async function main() {
|
|
54963
55196
|
installPipeCloseHandler();
|
|
54964
55197
|
const program = new Command();
|
|
54965
|
-
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.230.
|
|
55198
|
+
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.230.2");
|
|
54966
55199
|
program.addCommand(createBootstrapCommand());
|
|
54967
55200
|
program.addCommand(createSynthCommand());
|
|
54968
55201
|
program.addCommand(createListCommand());
|