konokenj.cdk-api-mcp-server 0.54.0__py3-none-any.whl → 0.55.0__py3-none-any.whl

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.
Files changed (19) hide show
  1. cdk_api_mcp_server/__about__.py +1 -1
  2. cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-imagebuilder-alpha/README.md +204 -0
  3. cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/mixins-preview/README.md +16 -0
  4. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cognito/README.md +2 -2
  5. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.ebs.ts +1 -1
  6. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/README.md +1 -1
  7. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-cloudwatch-logs-exports.ts +56 -0
  8. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/README.md +32 -31
  9. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.zone-delegation-iam-stack.ts +66 -0
  10. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-big-response.ts +4 -0
  11. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-data.ts +15 -0
  12. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-large-file.ts +3 -0
  13. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/README.md +56 -0
  14. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.external-id.ts +80 -0
  15. {konokenj_cdk_api_mcp_server-0.54.0.dist-info → konokenj_cdk_api_mcp_server-0.55.0.dist-info}/METADATA +2 -2
  16. {konokenj_cdk_api_mcp_server-0.54.0.dist-info → konokenj_cdk_api_mcp_server-0.55.0.dist-info}/RECORD +19 -16
  17. {konokenj_cdk_api_mcp_server-0.54.0.dist-info → konokenj_cdk_api_mcp_server-0.55.0.dist-info}/WHEEL +0 -0
  18. {konokenj_cdk_api_mcp_server-0.54.0.dist-info → konokenj_cdk_api_mcp_server-0.55.0.dist-info}/entry_points.txt +0 -0
  19. {konokenj_cdk_api_mcp_server-0.54.0.dist-info → konokenj_cdk_api_mcp_server-0.55.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Kenji Kono <konoken@amazon.co.jp>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.54.0"
4
+ __version__ = "0.55.0"
@@ -36,6 +36,210 @@ EC2 Image Builder supports AWS-managed components for common tasks, AWS Marketpl
36
36
  that you create. Components run during specific workflow phases: build and validate phases during the build stage, and
37
37
  test phase during the test stage.
38
38
 
39
+ ### Component
40
+
41
+ A component defines the sequence of steps required to customize an instance during image creation (build component) or
42
+ test an instance launched from the created image (test component). Components are created from declarative YAML or JSON
43
+ documents that describe runtime configuration for building, validating, or testing instances. Components are included
44
+ when added to the image recipe or container recipe for an image build.
45
+
46
+ EC2 Image Builder supports AWS-managed components for common tasks, AWS Marketplace components, and custom components
47
+ that you create. Components run during specific workflow phases: build and validate phases during the build stage, and
48
+ test phase during the test stage.
49
+
50
+ #### Basic Usage
51
+
52
+ Create a component with the required properties: platform and component data.
53
+
54
+ ```ts
55
+ const component = new imagebuilder.Component(this, 'MyComponent', {
56
+ platform: imagebuilder.Platform.LINUX,
57
+ data: imagebuilder.ComponentData.fromJsonObject({
58
+ schemaVersion: imagebuilder.ComponentSchemaVersion.V1_0,
59
+ phases: [
60
+ {
61
+ name: imagebuilder.ComponentPhaseName.BUILD,
62
+ steps: [
63
+ {
64
+ name: 'install-app',
65
+ action: imagebuilder.ComponentAction.EXECUTE_BASH,
66
+ inputs: {
67
+ commands: ['echo "Installing my application..."', 'yum update -y'],
68
+ },
69
+ },
70
+ ],
71
+ },
72
+ ],
73
+ }),
74
+ });
75
+ ```
76
+
77
+ #### Component Data Sources
78
+
79
+ ##### Inline Component Data
80
+
81
+ Use `ComponentData.fromInline()` for existing YAML/JSON definitions:
82
+
83
+ ```ts
84
+ const component = new imagebuilder.Component(this, 'InlineComponent', {
85
+ platform: imagebuilder.Platform.LINUX,
86
+ data: imagebuilder.ComponentData.fromInline(`
87
+ name: my-component
88
+ schemaVersion: 1.0
89
+ phases:
90
+ - name: build
91
+ steps:
92
+ - name: update-os
93
+ action: ExecuteBash
94
+ inputs:
95
+ commands: ['yum update -y']
96
+ `)
97
+ });
98
+ ```
99
+
100
+ ##### JSON Object Component Data
101
+
102
+ Most developer-friendly approach using objects:
103
+
104
+ ```ts
105
+ const component = new imagebuilder.Component(this, 'JsonComponent', {
106
+ platform: imagebuilder.Platform.LINUX,
107
+ data: imagebuilder.ComponentData.fromJsonObject({
108
+ schemaVersion: imagebuilder.ComponentSchemaVersion.V1_0,
109
+ phases: [
110
+ {
111
+ name: imagebuilder.ComponentPhaseName.BUILD,
112
+ steps: [
113
+ {
114
+ name: 'configure-app',
115
+ action: imagebuilder.ComponentAction.CREATE_FILE,
116
+ inputs: {
117
+ path: '/etc/myapp/config.json',
118
+ content: '{"env": "production"}',
119
+ },
120
+ },
121
+ ],
122
+ },
123
+ ],
124
+ }),
125
+ });
126
+ ```
127
+
128
+ ##### Structured Component Document
129
+
130
+ For type-safe, CDK-native definitions with enhanced properties like `timeout` and `onFailure`:
131
+
132
+ ```ts
133
+ const component = new imagebuilder.Component(this, 'StructuredComponent', {
134
+ platform: imagebuilder.Platform.LINUX,
135
+ data: imagebuilder.ComponentData.fromComponentDocumentJsonObject({
136
+ schemaVersion: imagebuilder.ComponentSchemaVersion.V1_0,
137
+ phases: [
138
+ {
139
+ name: imagebuilder.ComponentPhaseName.BUILD,
140
+ steps: [
141
+ {
142
+ name: 'install-with-timeout',
143
+ action: imagebuilder.ComponentAction.EXECUTE_BASH,
144
+ timeout: Duration.minutes(10),
145
+ onFailure: imagebuilder.ComponentOnFailure.CONTINUE,
146
+ inputs: {
147
+ commands: ['./install-script.sh'],
148
+ },
149
+ },
150
+ ],
151
+ },
152
+ ],
153
+ }),
154
+ });
155
+ ```
156
+
157
+ ##### S3 Component Data
158
+
159
+ For those components you want to upload or have uploaded to S3:
160
+
161
+ ```ts
162
+ // Upload a local file
163
+ const componentFromAsset = new imagebuilder.Component(this, 'AssetComponent', {
164
+ platform: imagebuilder.Platform.LINUX,
165
+ data: imagebuilder.ComponentData.fromAsset(this, 'ComponentAsset', './my-component.yml'),
166
+ });
167
+
168
+ // Reference an existing S3 object
169
+ const bucket = s3.Bucket.fromBucketName(this, 'ComponentBucket', 'my-components-bucket');
170
+ const componentFromS3 = new imagebuilder.Component(this, 'S3Component', {
171
+ platform: imagebuilder.Platform.LINUX,
172
+ data: imagebuilder.ComponentData.fromS3(bucket, 'components/my-component.yml'),
173
+ });
174
+ ```
175
+
176
+ #### Encrypt component data with a KMS key
177
+
178
+ You can encrypt component data with a KMS key, so that only principals with access to decrypt with the key are able to
179
+ access the component data.
180
+
181
+ ```ts
182
+ const component = new imagebuilder.Component(this, 'EncryptedComponent', {
183
+ platform: imagebuilder.Platform.LINUX,
184
+ kmsKey: new kms.Key(this, 'ComponentKey'),
185
+ data: imagebuilder.ComponentData.fromJsonObject({
186
+ schemaVersion: imagebuilder.ComponentSchemaVersion.V1_0,
187
+ phases: [
188
+ {
189
+ name: imagebuilder.ComponentPhaseName.BUILD,
190
+ steps: [
191
+ {
192
+ name: 'secure-setup',
193
+ action: imagebuilder.ComponentAction.EXECUTE_BASH,
194
+ inputs: {
195
+ commands: ['echo "This component data is encrypted with KMS"'],
196
+ },
197
+ },
198
+ ],
199
+ },
200
+ ],
201
+ }),
202
+ });
203
+ ```
204
+
205
+ #### AWS-Managed Components
206
+
207
+ AWS provides a collection of managed components for common tasks:
208
+
209
+ ```ts
210
+ // Install AWS CLI v2
211
+ const awsCliComponent = imagebuilder.AwsManagedComponent.awsCliV2(this, 'AwsCli', {
212
+ platform: imagebuilder.Platform.LINUX
213
+ });
214
+
215
+ // Update the operating system
216
+ const updateComponent = imagebuilder.AwsManagedComponent.updateOS(this, 'UpdateOS', {
217
+ platform: imagebuilder.Platform.LINUX
218
+ });
219
+
220
+ // Reference any AWS-managed component by name
221
+ const customAwsComponent = imagebuilder.AwsManagedComponent.fromAwsManagedComponentName(
222
+ this,
223
+ 'CloudWatchAgent',
224
+ 'amazon-cloudwatch-agent-linux'
225
+ );
226
+ ```
227
+
228
+ #### AWS Marketplace Components
229
+
230
+ You can reference AWS Marketplace components using the marketplace component name and its product ID:
231
+
232
+ ```ts
233
+ const marketplaceComponent = imagebuilder.AwsMarketplaceComponent.fromAwsMarketplaceComponentAttributes(
234
+ this,
235
+ 'MarketplaceComponent',
236
+ {
237
+ componentName: 'my-marketplace-component',
238
+ marketplaceProductId: 'prod-1234567890abcdef0',
239
+ }
240
+ );
241
+ ```
242
+
39
243
  ### Infrastructure Configuration
40
244
 
41
245
  Infrastructure configuration defines the compute resources and environment settings used during the image building
@@ -37,6 +37,22 @@ Mixins.of(bucket)
37
37
  .apply(new AutoDeleteObjects());
38
38
  ```
39
39
 
40
+ ### Fluent Syntax with `.with()`
41
+
42
+ For convenience, you can use the `.with()` method for a more fluent syntax:
43
+
44
+ ```typescript
45
+ import '@aws-cdk/mixins-preview/with';
46
+
47
+ const bucket = new s3.CfnBucket(scope, "MyBucket")
48
+ .with(new EnableVersioning())
49
+ .with(new AutoDeleteObjects());
50
+ ```
51
+
52
+ The `.with()` method is available after importing `@aws-cdk/mixins-preview/with`, which augments all constructs with this method. It provides the same functionality as `Mixins.of().apply()` but with a more chainable API.
53
+
54
+ > **Note**: The `.with()` fluent syntax is only available in JavaScript and TypeScript. Other jsii languages (Python, Java, C#, and Go) should use the `Mixins.of(...).mustApply()` syntax instead. The import requirement is temporary during the preview phase. Once the API is stable, the `.with()` method will be available by default on all constructs and in all languages.
55
+
40
56
  ## Creating Custom Mixins
41
57
 
42
58
  Mixins are simple classes that implement the `IMixin` interface:
@@ -480,13 +480,13 @@ new cognito.UserPool(this, 'myuserpool', {
480
480
 
481
481
  ### Threat Protection
482
482
 
483
- This feature is only available if your Feature Plan is set to PLUS.
484
-
485
483
  Threat Protection can be set to configure enforcement levels and automatic responses for users in password-based and custom-challenge authentication flows.
486
484
  For configuration, there are 2 options for standard authentication and custom authentication.
487
485
  These are represented with properties `standardThreatProtectionMode` and `customThreatProtectionMode`.
488
486
  See the [documentation on Threat Protection](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-settings-threat-protection.html)
489
487
 
488
+ **Note**: Threat Protection requires the PLUS feature plan for new user pools. CDK allows you to configure threat protection settings at synthesis time, and CloudFormation will validate feature plan requirements at deployment time. Existing user pools that are grandfathered on LITE plans with threat protection enabled will continue to work.
489
+
490
490
 
491
491
  ### Emails
492
492
 
@@ -7,7 +7,7 @@ class TestStack extends Stack {
7
7
  constructor(scope: Construct, id: string, props?: StackProps) {
8
8
  super(scope, id, props);
9
9
 
10
- const instanceTypes = ['i4g.large.search', 'i4i.xlarge.search', 'r7gd.xlarge.search'];
10
+ const instanceTypes = ['i4g.large.search', 'i4i.xlarge.search', 'r7gd.xlarge.search', 'r8gd.medium.search'];
11
11
 
12
12
  instanceTypes.forEach((instanceType, index) => {
13
13
  new opensearch.Domain(this, `Domain${index + 1}`, {
@@ -1204,7 +1204,7 @@ const cluster = new rds.DatabaseCluster(this, 'Database', {
1204
1204
  }),
1205
1205
  writer: rds.ClusterInstance.provisioned('writer'),
1206
1206
  vpc,
1207
- cloudwatchLogsExports: ['error', 'general', 'slowquery', 'audit'], // Export all available MySQL-based logs
1207
+ cloudwatchLogsExports: ['error', 'general', 'slowquery', 'audit', 'instance', 'iam-db-auth-error'], // Export all available MySQL-based logs
1208
1208
  cloudwatchLogsRetention: logs.RetentionDays.THREE_MONTHS, // Optional - default is to never expire logs
1209
1209
  cloudwatchLogsRetentionRole: myLogsPublishingRole, // Optional - a role will be created if not provided
1210
1210
  // ...
@@ -0,0 +1,56 @@
1
+ import * as cdk from 'aws-cdk-lib/core';
2
+ import { ExpectedResult, IntegTest } from '@aws-cdk/integ-tests-alpha';
3
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
4
+ import * as rds from 'aws-cdk-lib/aws-rds';
5
+
6
+ const app = new cdk.App();
7
+
8
+ const stack = new cdk.Stack(app, 'CloudWatchLogsExportsStack');
9
+ const vpc = new ec2.Vpc(stack, 'VPC');
10
+
11
+ const mysql = new rds.DatabaseCluster(stack, 'DatabaseClusterMysql', {
12
+ engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_3_09_0 }),
13
+ writer: rds.ClusterInstance.serverlessV2('writerInstance'),
14
+ vpc,
15
+ cloudwatchLogsExports: ['error', 'general', 'slowquery', 'audit', 'instance', 'iam-db-auth-error'],
16
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
17
+ });
18
+
19
+ const postgresql = new rds.DatabaseCluster(stack, 'DatabaseClusterPostgresql', {
20
+ engine: rds.DatabaseClusterEngine.auroraPostgres({ version: rds.AuroraPostgresEngineVersion.VER_16_4 }),
21
+ writer: rds.ClusterInstance.serverlessV2('writerInstance'),
22
+ vpc,
23
+ cloudwatchLogsExports: ['postgresql', 'iam-db-auth-error', 'instance'],
24
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
25
+ });
26
+
27
+ const integ = new IntegTest(app, 'CloudWatchLogsExportsStackInteg', {
28
+ testCases: [stack],
29
+ });
30
+
31
+ integ.assertions.awsApiCall('RDS', 'describeDBClusters', {
32
+ DBClusterIdentifier: mysql.clusterIdentifier,
33
+ }).expect(ExpectedResult.objectLike({
34
+ DBClusters: [{
35
+ EnabledCloudwatchLogsExports: [
36
+ 'audit',
37
+ 'error',
38
+ 'general',
39
+ 'iam-db-auth-error',
40
+ 'instance',
41
+ 'slowquery',
42
+ ],
43
+ }],
44
+ }));
45
+
46
+ integ.assertions.awsApiCall('RDS', 'describeDBClusters', {
47
+ DBClusterIdentifier: postgresql.clusterIdentifier,
48
+ }).expect(ExpectedResult.objectLike({
49
+ DBClusters: [{
50
+ EnabledCloudwatchLogsExports: [
51
+ 'iam-db-auth-error',
52
+ 'instance',
53
+ 'postgresql',
54
+ ],
55
+ }],
56
+ }));
@@ -367,40 +367,40 @@ const crossAccountRole = new iam.Role(this, 'CrossAccountRole', {
367
367
  roleName: 'MyDelegationRole',
368
368
  // The other account
369
369
  assumedBy: new iam.AccountPrincipal('12345678901'),
370
- // You can scope down this role policy to be least privileged.
371
- // If you want the other account to be able to manage specific records,
372
- // you can scope down by resource and/or normalized record names
373
- inlinePolicies: {
374
- crossAccountPolicy: new iam.PolicyDocument({
375
- statements: [
376
- new iam.PolicyStatement({
377
- sid: 'ListHostedZonesByName',
378
- effect: iam.Effect.ALLOW,
379
- actions: ['route53:ListHostedZonesByName'],
380
- resources: ['*'],
381
- }),
382
- new iam.PolicyStatement({
383
- sid: 'GetHostedZoneAndChangeResourceRecordSets',
384
- effect: iam.Effect.ALLOW,
385
- actions: ['route53:GetHostedZone', 'route53:ChangeResourceRecordSets'],
386
- // This example assumes the RecordSet subdomain.somexample.com
387
- // is contained in the HostedZone
388
- resources: ['arn:aws:route53:::hostedzone/HZID00000000000000000'],
389
- conditions: {
390
- 'ForAllValues:StringLike': {
391
- 'route53:ChangeResourceRecordSetsNormalizedRecordNames': [
392
- 'subdomain.someexample.com',
393
- ],
394
- },
395
- },
396
- }),
397
- ],
398
- }),
399
- },
400
370
  });
401
371
  parentZone.grantDelegation(crossAccountRole);
402
372
  ```
403
373
 
374
+ To restrict the records that can be created with the delegation IAM role, use the optional `delegatedZoneNames` property in the delegation options,
375
+ which enforces the `route53:ChangeResourceRecordSetsNormalizedRecordNames` condition key for record names that match those hosted zone names.
376
+ The `delegatedZoneNames` list may only consist of hosted zones names that are subzones of the parent hosted zone.
377
+
378
+ If the delegated zone name contains an unresolved token,
379
+ it must resolve to a zone name that satisfies the requirements according to the documentation:
380
+ https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/specifying-conditions-route53.html#route53_rrset_conditionkeys_normalization
381
+
382
+ > All letters must be lowercase.
383
+ > The DNS name must be without the trailing dot.
384
+ > Characters other than a–z, 0–9, - (hyphen), _ (underscore), and . (period, as a delimiter between labels) must use escape codes in the format \three-digit octal code. For example, \052 is the octal code for character *.
385
+
386
+ This feature allows you to better follow the minimum permissions privilege principle:
387
+
388
+ ```ts
389
+ const parentZone = new route53.PublicHostedZone(this, 'HostedZone', {
390
+ zoneName: 'someexample.com',
391
+ });
392
+
393
+ declare const betaCrossAccountRole: iam.Role;
394
+ parentZone.grantDelegation(betaCrossAccountRole, {
395
+ delegatedZoneNames: ['beta.someexample.com'],
396
+ });
397
+
398
+ declare const prodCrossAccountRole: iam.Role;
399
+ parentZone.grantDelegation(prodCrossAccountRole, {
400
+ delegatedZoneNames: ['prod.someexample.com'],
401
+ });
402
+ ```
403
+
404
404
  In the account containing the child zone to be delegated:
405
405
 
406
406
  ```ts
@@ -540,7 +540,8 @@ const zone = route53.HostedZone.fromHostedZoneAttributes(this, 'MyZone', {
540
540
  ```
541
541
 
542
542
  Alternatively, use the `HostedZone.fromHostedZoneId` to import hosted zones if
543
- you know the ID and the retrieval for the `zoneName` is undesirable.
543
+ you know the ID and the retrieval for the `zoneName` is undesirable.
544
+ Note that any records created with a hosted zone obtained this way must have their name be fully qualified
544
545
 
545
546
  ```ts
546
547
  const zone = route53.HostedZone.fromHostedZoneId(this, 'MyZone', 'ZOJJZC49E0EPZ');
@@ -0,0 +1,66 @@
1
+ import * as iam from 'aws-cdk-lib/aws-iam';
2
+ import * as cdk from 'aws-cdk-lib';
3
+ import * as route53 from 'aws-cdk-lib/aws-route53';
4
+ import { Construct } from 'constructs';
5
+ import { IntegTest } from '@aws-cdk/integ-tests-alpha';
6
+
7
+ class ZoneDelegationIamStack extends cdk.Stack {
8
+ constructor(scope: Construct, id: string) {
9
+ super(scope, id);
10
+
11
+ const parentZone = new route53.PublicHostedZone(this, 'ParentZone', {
12
+ zoneName: 'uniqueexample.com',
13
+ });
14
+
15
+ const trusteeRoleArns = this.formatArn({
16
+ service: 'iam',
17
+ region: '',
18
+ resource: 'role',
19
+ resourceName: 'ZoneDelegationStack-*',
20
+ });
21
+
22
+ const delegationRole = new iam.Role(this, 'ZoneDelegationRole', {
23
+ roleName: 'ExampleDelegationRole',
24
+ assumedBy: new iam.AccountRootPrincipal().withConditions({
25
+ ArnLike: {
26
+ 'aws:PrincipalArn': trusteeRoleArns,
27
+ },
28
+ }),
29
+ });
30
+
31
+ const delegationGrant = parentZone.grantDelegation(delegationRole, {
32
+ delegatedZoneNames: [
33
+ 'sub1.uniqueexample.com',
34
+ 'sub2_*$.uniqueexample.com', // should result in octal codes in iam condition
35
+ ],
36
+ });
37
+
38
+ const subZone = new route53.PublicHostedZone(this, 'SubZone', {
39
+ zoneName: 'sub1.uniqueexample.com',
40
+ });
41
+
42
+ new route53.CrossAccountZoneDelegationRecord(subZone, 'ZoneDelegation', {
43
+ delegatedZone: subZone,
44
+ parentHostedZoneName: parentZone.zoneName,
45
+ delegationRole: delegationRole,
46
+ }).node.addDependency(delegationGrant);
47
+
48
+ const subZoneWithSpecialChars = new route53.PublicHostedZone(this, 'SubZoneSpecialChars', {
49
+ zoneName: 'sub2_*$.uniqueexample.com',
50
+ });
51
+
52
+ new route53.CrossAccountZoneDelegationRecord(subZoneWithSpecialChars, 'ZoneDelegation', {
53
+ delegatedZone: subZoneWithSpecialChars,
54
+ parentHostedZoneName: parentZone.zoneName,
55
+ delegationRole: delegationRole,
56
+ }).node.addDependency(delegationGrant);
57
+ }
58
+ }
59
+
60
+ const app = new cdk.App();
61
+
62
+ const stack = new ZoneDelegationIamStack(app, 'ZoneDelegationStack');
63
+
64
+ new IntegTest(app, 'ZoneDelegationIam', {
65
+ testCases: [stack],
66
+ });
@@ -31,6 +31,10 @@ class TestBucketDeployment extends cdk.Stack {
31
31
  const sources = [];
32
32
  for (let i = 0; i < numFiles; i++) {
33
33
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tmpcdk'));
34
+ process.on('exit', () => {
35
+ fs.rmSync(tempDir, { force: true, recursive: true });
36
+ });
37
+
34
38
  fs.mkdirSync(tempDir, { recursive: true });
35
39
  const fileName = `${i+1}.txt`;
36
40
  const filePath = path.join(tempDir, fileName);
@@ -64,6 +64,9 @@ class TestBucketDeploymentData extends Stack {
64
64
  // Test empty string handling
65
65
  const file8 = Source.data('file8.txt', '');
66
66
 
67
+ // Test null JSON data value
68
+ const file9 = Source.jsonData('my-json/config-with-null.json', { hello: 'there', goodbye: null });
69
+
67
70
  const deployment = new BucketDeployment(this, 'DeployWithDataSources', {
68
71
  destinationBucket: this.bucket,
69
72
  sources: [file1, file2],
@@ -77,6 +80,7 @@ class TestBucketDeploymentData extends Stack {
77
80
  deployment.addSource(file6);
78
81
  deployment.addSource(file7);
79
82
  deployment.addSource(file8);
83
+ deployment.addSource(file9);
80
84
 
81
85
  new CfnOutput(this, 'BucketName', { value: this.bucket.bucketName });
82
86
  }
@@ -105,6 +109,17 @@ assertionProvider.expect(ExpectedResult.objectLike({
105
109
  Body: '{"secret_value":"test\\"with\\"quotes"}',
106
110
  }));
107
111
 
112
+ // Assert that JSON data with a null value is represented properly
113
+ const jsonNullAssertionProvider = integTest.assertions.awsApiCall('S3', 'getObject', {
114
+ Bucket: testCase.bucket.bucketName,
115
+ Key: path.join('deploy/here', 'my-json/config-with-null.json'),
116
+ });
117
+
118
+ // Verify the content is valid JSON and both null and non-null fields are present
119
+ jsonNullAssertionProvider.expect(ExpectedResult.objectLike({
120
+ Body: '{"hello":"there","goodbye":null}',
121
+ }));
122
+
108
123
  // Add assertions to verify the YAML file
109
124
  const yamlAssertionProvider = integTest.assertions.awsApiCall('S3', 'getObject', {
110
125
  Bucket: testCase.bucket.bucketName,
@@ -30,6 +30,9 @@ const bucket = new Bucket(stack, 'Bucket', {
30
30
 
31
31
  // Create a temporary directory for our large files
32
32
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-large-files-'));
33
+ process.on('exit', () => {
34
+ fs.rmSync(tempDir, { force: true, recursive: true });
35
+ });
33
36
 
34
37
  // Generate a large JSON file (10MB) programmatically
35
38
  const largeJsonFilePath = path.join(tempDir, 'large-file.json');
@@ -831,6 +831,62 @@ new cr.AwsCustomResource(this, 'CrossAccount', {
831
831
  });
832
832
  ```
833
833
 
834
+ #### Using External IDs for Enhanced Security
835
+
836
+ When assuming cross-account roles, you can specify an external ID to prevent the "confused deputy" problem. The external ID is a unique identifier provided by the third-party service that helps ensure the service is acting on behalf of the correct customer:
837
+
838
+ ```ts
839
+ const crossAccountRoleArn = 'arn:aws:iam::OTHERACCOUNT:role/CrossAccountRoleName';
840
+ const serviceExternalId = 'unique-secret-value-12345'; // External ID provided by the third party service. This value should be unique among the third-party service's customers.
841
+
842
+
843
+ new cr.AwsCustomResource(this, 'SecureCrossAccount', {
844
+ onCreate: {
845
+ assumedRoleArn: crossAccountRoleArn,
846
+ externalId: serviceExternalId, // Prevents confused deputy attacks
847
+ service: 'sts',
848
+ action: 'GetCallerIdentity',
849
+ physicalResourceId: cr.PhysicalResourceId.of('id'),
850
+ },
851
+ policy: cr.AwsCustomResourcePolicy.fromStatements([iam.PolicyStatement.fromJson({
852
+ Effect: "Allow",
853
+ Action: "sts:AssumeRole",
854
+ Resource: crossAccountRoleArn,
855
+ })]),
856
+ });
857
+ ```
858
+
859
+ The external ID can also be different for each lifecycle operation:
860
+
861
+ ```ts
862
+ declare const createRoleArn: string;
863
+ declare const updateRoleArn: string;
864
+
865
+ new cr.AwsCustomResource(this, 'MultiRoleSecure', {
866
+ onCreate: {
867
+ assumedRoleArn: createRoleArn,
868
+ externalId: 'create-secret-123',
869
+ service: 'ec2',
870
+ action: 'DescribeInstances',
871
+ physicalResourceId: cr.PhysicalResourceId.of('id'),
872
+ },
873
+ onUpdate: {
874
+ assumedRoleArn: updateRoleArn,
875
+ externalId: 'update-secret-456',
876
+ service: 'ec2',
877
+ action: 'DescribeInstances',
878
+ },
879
+ policy: cr.AwsCustomResourcePolicy.fromStatements([
880
+ new iam.PolicyStatement({
881
+ actions: ['sts:AssumeRole'],
882
+ resources: [createRoleArn, updateRoleArn],
883
+ }),
884
+ ]),
885
+ });
886
+ ```
887
+
888
+ For more information on external IDs and preventing confused deputy attacks, see the [AWS IAM User Guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html).
889
+
834
890
  #### Custom Resource Config
835
891
 
836
892
  **This feature is currently experimental**
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import * as iam from 'aws-cdk-lib/aws-iam';
3
+ import * as cdk from 'aws-cdk-lib';
4
+ import { IntegTest } from '@aws-cdk/integ-tests-alpha';
5
+ import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId } from 'aws-cdk-lib/custom-resources';
6
+
7
+ /**
8
+ * Integration test for AwsCustomResource External ID support.
9
+ *
10
+ * This test demonstrates the use of external IDs when assuming roles
11
+ * in cross-account scenarios to prevent "confused deputy" attacks.
12
+ *
13
+ * Note: This test may introduce destructive changes to CDK metadata
14
+ * and Lambda function assets due to CDK version updates. These changes
15
+ * are expected and safe for integration testing purposes.
16
+ */
17
+
18
+ const app = new cdk.App({
19
+ postCliContext: {
20
+ // Disable CDK managed log groups to prevent Lambda changes
21
+ '@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
22
+ // Disable version reporting to prevent CDK metadata changes
23
+ '@aws-cdk/core:disableVersionReporting': true,
24
+ // Disable new style synthesis to maintain compatibility
25
+ '@aws-cdk/core:newStyleStackSynthesis': false,
26
+ // Use legacy asset bundling to prevent asset hash changes
27
+ '@aws-cdk/core:enableLegacyV2AssetKeys': true,
28
+ // Disable stack name validation to prevent naming conflicts
29
+ '@aws-cdk/core:stackRelativeExports': false,
30
+ },
31
+ });
32
+
33
+ const stack = new cdk.Stack(app, 'aws-custom-resource-external-id-test');
34
+
35
+ // Create a role that requires an external ID
36
+ const externalId = 'test-external-id-12345';
37
+ const roleWithExternalId = new iam.Role(stack, 'RoleWithExternalId', {
38
+ // Use a principal that can be used in integration tests
39
+ assumedBy: new iam.AccountPrincipal(cdk.Stack.of(stack).account),
40
+ externalIds: [externalId],
41
+ });
42
+
43
+ // Add the necessary permissions as managed policies to reduce template variability
44
+ roleWithExternalId.addToPolicy(
45
+ new iam.PolicyStatement({
46
+ actions: ['sts:GetCallerIdentity'],
47
+ resources: ['*'],
48
+ }),
49
+ );
50
+
51
+ // Test basic external ID usage
52
+ new AwsCustomResource(stack, 'ExternalIdTest', {
53
+ installLatestAwsSdk: false,
54
+ onCreate: {
55
+ assumedRoleArn: roleWithExternalId.roleArn,
56
+ externalId: externalId,
57
+ service: 'STS',
58
+ action: 'GetCallerIdentity',
59
+ physicalResourceId: PhysicalResourceId.of('external-id-test'),
60
+ },
61
+ policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: [] }),
62
+ });
63
+
64
+ new IntegTest(app, 'AwsCustomResourceTest', {
65
+ testCases: [stack],
66
+ diffAssets: true,
67
+ allowDestroy: ['AWS::CDK::Metadata'],
68
+ cdkCommandOptions: {
69
+ deploy: {
70
+ args: {
71
+ rollback: false,
72
+ },
73
+ },
74
+ destroy: {
75
+ args: {
76
+ force: true,
77
+ },
78
+ },
79
+ },
80
+ });
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: konokenj.cdk-api-mcp-server
3
- Version: 0.54.0
3
+ Version: 0.55.0
4
4
  Summary: An MCP server provides AWS CDK API Reference
5
5
  Project-URL: Documentation, https://github.com/konokenj/cdk-api-mcp-server#readme
6
6
  Project-URL: Issues, https://github.com/konokenj/cdk-api-mcp-server/issues
@@ -26,7 +26,7 @@ Description-Content-Type: text/markdown
26
26
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/konokenj.cdk-api-mcp-server.svg)](https://pypi.org/project/konokenj.cdk-api-mcp-server)
27
27
 
28
28
  <!-- DEP-VERSIONS-START -->
29
- [![aws-cdk](https://img.shields.io/badge/aws%20cdk-v2.223.0-blue.svg)](https://github.com/konokenj/cdk-api-mcp-server/blob/main/current-versions/aws-cdk.txt)
29
+ [![aws-cdk](https://img.shields.io/badge/aws%20cdk-v2.224.0-blue.svg)](https://github.com/konokenj/cdk-api-mcp-server/blob/main/current-versions/aws-cdk.txt)
30
30
  <!-- DEP-VERSIONS-END -->
31
31
 
32
32
  ---
@@ -1,4 +1,4 @@
1
- cdk_api_mcp_server/__about__.py,sha256=bNBPwUeVNHI6UbPon1VbIfmQlnoBr6_-kE_lqomIBz0,129
1
+ cdk_api_mcp_server/__about__.py,sha256=rA_SHXJOQTCGZdHPj9gp46MhwCXP96bj4dKeLEuguBc,129
2
2
  cdk_api_mcp_server/__init__.py,sha256=yJA6yIEhJviC-qNlB-nC6UR1JblQci_d84i-viHZkc0,187
3
3
  cdk_api_mcp_server/models.py,sha256=cMS1Hi29M41YjuBxqqrzNrNvyG3MgnUBb1SqYpMCJ30,692
4
4
  cdk_api_mcp_server/resources.py,sha256=R7LVwn29I4BJzU5XAwKbX8j6uy-3ZxcB1b0HzZ_Z2PI,6689
@@ -20,7 +20,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-eks-v2-alpha/README
20
20
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-elasticache-alpha/README.md,sha256=5rwHuZ0rekBgrFzF1ig9rAxqufypWy8XN8-7y3De0dA,15152
21
21
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-gamelift-alpha/README.md,sha256=pZqlGXpIekT05CmRYo99QPI-7S1iGtKoNESGryLQFxQ,28324
22
22
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-glue-alpha/README.md,sha256=BCr7YEJ6Ht3oYR21NMCH3t1N738QjQ9Sh_dL_DUhECQ,32235
23
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-imagebuilder-alpha/README.md,sha256=-JaOItlsARgLeiiltnl0877PphgZVEeoDEH6rDFtiTs,4775
23
+ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-imagebuilder-alpha/README.md,sha256=RjhHAlOg1RUErPo2wkaI29D_kqz1YRasa8d9bJXzkgU,10750
24
24
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-iot-actions-alpha/README.md,sha256=R6vkGxu-JjfB1IfGVquiD6Gcn4RQQpgbGo36njBdJe4,11947
25
25
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-iot-alpha/README.md,sha256=18MkQScFBUO_qZnfYj9wfsdY_vRvvEyar2OT_QbO_N4,6909
26
26
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-iotevents-actions-alpha/README.md,sha256=0Al2K5gHcEce_cH07YM1GuFFrJ0mrr85ZWGVrj2cs9s,4477
@@ -46,7 +46,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/cfnspec/README.md,sha25
46
46
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/custom-resource-handlers/README.md,sha256=QctOoyGt6AqVWeFhRwpkCSxHZ1XFWj_nCKlkJHDFock,965
47
47
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/example-construct-library/README.md,sha256=vnVXyvtN9ICph68sw2y6gkdD_gmas0PiUa9TkwNckWQ,4501
48
48
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/integ-tests-alpha/README.md,sha256=VifKLrR404_yLVT0E3ai8f3R5K0h22VNwQplpSUSZqc,17489
49
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/mixins-preview/README.md,sha256=cyC3bs0dIm2aj6BVm_wXzdewY02K0DSHoCEdV1D5z9E,4902
49
+ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/mixins-preview/README.md,sha256=9m_qHS9WuTACB2_CN1hfV9AFmUb2aTp1QB2vzbs6VMI,5784
50
50
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/README.md/README.md,sha256=fDaQqPonfLmfQpukU4aAJcjQI5xHI40D3Li0I056Q7s,76468
51
51
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/assertions/MIGRATING.md,sha256=SYGX8QNB1Pm_rVYDBp4QRWkqwnxOb3CHzeFglUy_53k,3347
52
52
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/assertions/README.md,sha256=3yo3D05n5explTIgnuF-vkk01MTYeAYe7_3rcsD2baE,18299
@@ -434,7 +434,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codepipeline-act
434
434
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codepipeline-actions/integ.source-bucket-events-cross-stack-same-env.ts,sha256=b_AcKifo3CayD0tBQAY9-K8tbovRAi9hC2IPyTvJCog,1523
435
435
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codepipeline-actions/integ.stacksets.ts,sha256=rYAvLm18SRN5_RZDalrForjDUHg9AHeTebjeO1jpN1Y,2798
436
436
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codestarnotifications/README.md,sha256=xwJqDar7SxOR64CS3jzD1FBmmAnsPAytUXU-BSKdibI,2764
437
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cognito/README.md,sha256=Vi8YO2fcFq7nZHJVygSusZR6KGs3IEtt-9bRliVk1kU,54734
437
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cognito/README.md,sha256=nK1O9BVuzdu1R54DbvOfvAzsEN86cPerx6yAwlAChic,55008
438
438
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cognito/integ.user-pool-client-analytics.ts,sha256=VwK8uk4g8qasvEF-_fJC-T1Edmat_dmtj4e_am6evLY,3282
439
439
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cognito/integ.user-pool-client-default-redirect-uri.ts,sha256=4psUGceGMURoSYg4rvK19bnuXMSH6bZrhLjUcap49og,678
440
440
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cognito/integ.user-pool-client-enable-propagate-additional-data.ts,sha256=wDQU5Wi-dxBbl_ZUnmcVoOaRWZAmGZuCqO1YuIEoub4,775
@@ -1001,7 +1001,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservic
1001
1001
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.coldstorage.ts,sha256=uxEm9-kis9KgYLpv7A9lZmg_NZ3TJ14EmkrAAQBLbtI,873
1002
1002
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.custom-kms-key.ts,sha256=k66WCNgg3RBOrbUWt1KjZsbuj_K3-G-Q-nMYddtFKcg,2463
1003
1003
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.disable-logging.ts,sha256=xdMUI1YRuJgxOQ8aB_rftnMWu9gkSUkXiGuZQhsyYQQ,857
1004
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.ebs.ts,sha256=8L8V89cRaPurY22H5rc1FoSeSEimHqbcxJFjPLXL2jk,1155
1004
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.ebs.ts,sha256=6Ev38M-IkYa4fX8E7a-Pb_tN-oZDE5B058BvMbFnw_0,1177
1005
1005
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.gp3.ts,sha256=_YsIdlEllL1v_1YZzpXrwxHMttphlJe_xf11f1_4z3s,1526
1006
1006
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.https.ts,sha256=enL7r3ppaN_yxoRYse_nCmRrC9qdIcbqMoC_bCRdSLM,1655
1007
1007
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.ip-address-type.ts,sha256=OeLFqyLYl38FltS_earKPmZ9loassPKmMErTopMwlvE,1136
@@ -1013,10 +1013,11 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservic
1013
1013
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.unsignedbasicauth.ts,sha256=B13diAjHunM-L1w1FHgpDRup-j4Xnnb-rpn171bbjpw,925
1014
1014
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.vpc.ts,sha256=92FvTQd0U190KN53A8UU4eV3ggwm1GeVn4f3nRE56T0,1400
1015
1015
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-opensearchservice/integ.opensearch.without-logs-resource-policy.ts,sha256=CTj7BjTXc_Q4J_NnK8C62vXGl3ZIWMbmcuPHjvW01vU,1971
1016
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/README.md,sha256=rqBg1xfmVlFm9Y8cQTFquBImwL7-fcbabF73ngCvgUY,68030
1016
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/README.md,sha256=tPoPoDO9EBGny6j-ls4jiVmfhC5AAQyVIxk19S48O6c,68063
1017
1017
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/aurora-serverless-v2.md,sha256=D4_EKB6d62nNN0LwL3XGX0YFjwdSBXE8namaBUqU9qw,10484
1018
1018
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-applyimmediately.ts,sha256=UB7bdVX6UD63SYroZRXs5V493f1lUX_3lD5W7EeU5AQ,1135
1019
1019
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-availability-zone.ts,sha256=59DvW_-fFQ2NPddJdbayEu7V-NVBAPvm3A05IvbBOAA,1765
1020
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-cloudwatch-logs-exports.ts,sha256=LBpt-jb8BjdyepO6r8hD02GjJF8gDAcZdTT2y5ngh9g,1819
1020
1021
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-data-api-to-imported-cluster.ts,sha256=rdPkQRXAX0G9AoT_wWj0haykPIGgH0wVkN9bCbvDbD4,1287
1021
1022
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-data-api.ts,sha256=zscIQL1yE27efz_qs5lWrBOT2fwnQZbu7mm6UqLDJ4A,1056
1022
1023
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-database-insights.ts,sha256=fOZAejrOKhLiODQ3R9cFimS73nvvY45dhlYGY2bkUiQ,1214
@@ -1074,7 +1075,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.server
1074
1075
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.serverless-cluster-secret-rotation-custom-names.ts,sha256=qEeZja4_8GHkk_wEolcgpMXx8gIjyhYxQgtHj-QR90c,1182
1075
1076
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.serverless-cluster-secret-rotation.ts,sha256=dQh8mE1sGqXoh1oNLTHVGkxqJo1DUF9xFGRtpUMTtwM,1131
1076
1077
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.serverless-cluster.ts,sha256=QRk6RSL7MjT-Z0Wa5IqAGw6e4D9d1eD-_FF9JNPqaDc,1491
1077
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/README.md,sha256=CRlLU2bEgeVQMBA8Z-alkhNcJ4VUT6QjQJiO0LHgxxM,21343
1078
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/README.md,sha256=EL7oChCie9H9OhNQs1u9xJTaZvBlk1FQVq8T2vCieqc,21794
1078
1079
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.cidr-routing-config.ts,sha256=s00XKe_4ev7V2QdrsMz1hTQdD7NG_DEvMKQO-qo2pOw,1820
1079
1080
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.cross-account-zone-delegation.ts,sha256=_rpT4PhjPn4zzQJkbCVdNuf_2PxCVAMBFh_sbI9Ipbc,4723
1080
1081
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.delete-existing-record-set.ts,sha256=S1DuUvrdXqsQO1-tBOrrZmLxbAtjLuYCbtVVULjCcQo,1177
@@ -1089,6 +1090,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.re
1089
1090
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.route53.ts,sha256=Tq-9AddKPw_XL9OpbSbAxcHUvNie_aNwUgxc_qc--t8,4191
1090
1091
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.vpc-endpoint-service-domain-name.ts,sha256=30BelZf3n-5NlELN0Zb3wbCs4apkN1xkJZdRx7JaQaw,2287
1091
1092
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.weighted-record.ts,sha256=TuVcPmhLeJWBn0zjTy1mQIF5mY68-sYJqvAyO4fj-l0,1089
1093
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53/integ.zone-delegation-iam-stack.ts,sha256=evRLvNcSIgCi0A-HtWB3UIe0zYMbb59f9BVA73KTKcQ,2095
1092
1094
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53-patterns/README.md,sha256=wagFrV44B0Rqy9rYXVpAQMGscGiEy9qRj54qfzfXNKk,3028
1093
1095
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53-patterns/integ.hosted-redirect-same-region.ts,sha256=v_OrIYemAnBSiihPJVnfwB8pc-MA39CSC8Xp6PtGTWc,1730
1094
1096
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-route53-patterns/integ.hosted-redirect.ts,sha256=UpMbsM6FmD0tu73gzQOBNRtG_snaAuo3vzau2T7c2gY,1866
@@ -1147,14 +1149,14 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-assets/integ.
1147
1149
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-assets/integ.assets.refs.lit.ts,sha256=9ZTHP6IuXClpHX3wpRoQYowHWac19H-UfgO8iQFgrFY,923
1148
1150
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-assets/integ.multi-assets.ts,sha256=JFM0G2TQ6VKoSpQSwOpvp6gKRI9YCkLH7Cy2RSEYRQs,803
1149
1151
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/README.md,sha256=4EEQtncu13inobBbdyZOHP4eYOBlcMRj0psaKsFCKCM,26579
1150
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-big-response.ts,sha256=qmAdC_Rvdyb1fQUBwGLKGAeuBGvSoho42_BtTPYZ03k,3301
1152
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-big-response.ts,sha256=mAa1EQ6rWR_HZBNOMnhouneZdVX1HBvRCTClpJrdxeI,3407
1151
1153
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-cloudfront.ts,sha256=W9f12El_8J9rf8pbbUtDlTAevyOQoZAIlmy0r76tLpI,1842
1152
1154
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-cross-nested-stack-source.ts,sha256=bbiS-CfQNfifpRMZSJxndiGFHOqNDOgb59xmZ0KZwMU,2406
1153
1155
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-cross-stack-source.ts,sha256=rbKJcMmMw5HMvRJIHytWpqeZH8Lp55kTtAQO1xf-Onk,1643
1154
1156
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-cross-stack-ssm-source.ts,sha256=YGWEmN80ScMvVUy2x3dVSnIoaU_emb2dp0GMkrA83A4,3169
1155
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-data.ts,sha256=3KlUbO3SycB0F3UHmMpw03BXoSWwtfFeVIVa6fWXsZk,4598
1157
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-data.ts,sha256=TK1WpIeIZeODF5Wo1VhgtD6kRKpu2h7Sqs6XuvknACE,5224
1156
1158
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-deployed-bucket.ts,sha256=YZFXyyGJWyxGVZSUOduoKZHBtfNAyaKEqOFUPdjcnqY,1658
1157
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-large-file.ts,sha256=uzYA_Je-BohcZgbQVbyK7GbisW5I3q-2b0H9O8DcFyE,9169
1159
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-large-file.ts,sha256=bdERyqOdUhHEM_HgbKvNZyMOwEyEXbvigQtC6Y13bmI,9256
1158
1160
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-loggroup.ts,sha256=U7Yne11_oFBj0MakeTg3HBPSdT7wFSqCBTwbOqrdqPo,1574
1159
1161
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-security-groups-efs.ts,sha256=WwFIBt9BqOKOvwJotMxTmbWQ3qem0vGgFYYOCsvTLNM,2633
1160
1162
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-deployment/integ.bucket-deployment-security-groups-empty.ts,sha256=_8S5PvnwwPy3aRamhAC1z5N6U4tpimclUPYFGVnEaLM,2362
@@ -1401,7 +1403,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/core/integ.prop-inje
1401
1403
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/core/integ.removal-policies.ts,sha256=b6ePZkMn5IyTizPV2VnxSR2X8RP2Obh8i7P1b7-S68o,1541
1402
1404
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/core/integ.stack.ts,sha256=xf24TLT1li9lQtn7LMTd0hPfiWPpBym8OMYD4cTiw-o,666
1403
1405
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/core/integ.token-aware-stringify-logical-ids.ts,sha256=Nb1IrrTzMyuhwAmcZyHLVmLjpC0qM2JrTnw392f3C64,1122
1404
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/README.md,sha256=yd8jCCwHI7up_t7g1E0x1FazXxjI6bmKpdUeXEYocHM,45244
1406
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/README.md,sha256=2k0u1AWNRcC9sTWbSAlp4U9Ux6REDvEZCkpGI0kKThE,47239
1405
1407
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.aws-custom-resource-assumeRole.ts,sha256=McBeN37e6mNkmcHPb5kgdsTRPMY9pxzH8SwHmdDaRHA,1436
1406
1408
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.aws-custom-resource-athena.ts,sha256=sv7NmgJ-7rzxZIqVJdQXdAiuFLaa3Te_c3z-VwJ_lQo,5120
1407
1409
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.aws-custom-resource-cloudwatch.ts,sha256=vunS7eZnfupDnwKACQVccX1WxhwoATaNOxYdG20lWgc,1393
@@ -1419,6 +1421,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/int
1419
1421
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.custom-resource-config-logRetention.ts,sha256=c1yoH2d8ZLpZ9jaL3koM3pyhrYU3RDUqGxc_R2LTZ1Y,896
1420
1422
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.custom-resource-config-removalPolicy.ts,sha256=sGAZF5yx_ugeGrqCldd3Cr0nN9v23b_5j3hswgnsYQo,917
1421
1423
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.custom-resource-config-undefined-log.ts,sha256=-iWtDpya4WyL02t4GTBRZKT3jWrvXXNNfifPMAfaEvo,940
1424
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.external-id.ts,sha256=d1wLd-Wovzy4bJ9r6a-Jxgs46WbJp748RxXnLwQtmGc,2623
1422
1425
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.invoke-function-payload.ts,sha256=s9pxAQTzw7bl_qDX_vwC0nrbgI8uOk-3H7Ny49hS5As,1345
1423
1426
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.provider-no-echo.ts,sha256=vS4E0VbqE6h97GlCJKUv7RBEE5_GVVe3sQxNUYjXBbU,1930
1424
1427
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.provider-with-waiter-state-machine-custom-role.ts,sha256=60mjzf_2NI9zO30B2Guye5sA7kxIl4yrLMXUEWIDO9I,2401
@@ -1456,8 +1459,8 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/integ.pipe
1456
1459
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/region-info/README.md,sha256=vewWkV3ds9o9iyyYaJBNTkaKJ2XA6K2yF17tAxUnujg,2718
1457
1460
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/triggers/README.md,sha256=hYIx7DbG_7p4LYLUfxDwgIQjw9UNdz1GLrqDe8_Dbko,4132
1458
1461
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/triggers/integ.triggers.ts,sha256=4OHplMoBOgHGkktAzoU-TuNmJQS5wGAUvBfj5bGSe_Y,2807
1459
- konokenj_cdk_api_mcp_server-0.54.0.dist-info/METADATA,sha256=awAc48J3yOHnpBFm1RxJJJfTdh_ohz2MUIwpECH41Wg,2646
1460
- konokenj_cdk_api_mcp_server-0.54.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1461
- konokenj_cdk_api_mcp_server-0.54.0.dist-info/entry_points.txt,sha256=bVDhMdyCC1WNMPOMbmB82jvWII2CIrwTZDygdCf0cYQ,79
1462
- konokenj_cdk_api_mcp_server-0.54.0.dist-info/licenses/LICENSE.txt,sha256=5OIAASeg1HM22mVZ1enz9bgZ7TlsGfWXnj02P9OgFyk,1098
1463
- konokenj_cdk_api_mcp_server-0.54.0.dist-info/RECORD,,
1462
+ konokenj_cdk_api_mcp_server-0.55.0.dist-info/METADATA,sha256=-P57FweXWtkqL6onQZrvxY1bjsou2Z_f_ACxvqFeIXk,2646
1463
+ konokenj_cdk_api_mcp_server-0.55.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1464
+ konokenj_cdk_api_mcp_server-0.55.0.dist-info/entry_points.txt,sha256=bVDhMdyCC1WNMPOMbmB82jvWII2CIrwTZDygdCf0cYQ,79
1465
+ konokenj_cdk_api_mcp_server-0.55.0.dist-info/licenses/LICENSE.txt,sha256=5OIAASeg1HM22mVZ1enz9bgZ7TlsGfWXnj02P9OgFyk,1098
1466
+ konokenj_cdk_api_mcp_server-0.55.0.dist-info/RECORD,,