konokenj.cdk-api-mcp-server 0.59.0__py3-none-any.whl → 0.61.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.
@@ -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.59.0"
4
+ __version__ = "0.61.0"
@@ -580,6 +580,54 @@ runtime.connections.allowTo(databaseSecurityGroup, ec2.Port.tcp(5432), 'Allow Po
580
580
  runtime.connections.allowToAnyIpv4(ec2.Port.tcp(443), 'Allow HTTPS outbound');
581
581
  ```
582
582
 
583
+ ### Runtime IAM Permissions
584
+
585
+ The Runtime construct provides convenient methods for granting IAM permissions to principals that need to invoke the runtime or manage its execution role.
586
+
587
+ ```typescript fixture=default
588
+ const repository = new ecr.Repository(this, "TestRepository", {
589
+ repositoryName: "test-agent-runtime",
590
+ });
591
+ const agentRuntimeArtifact = agentcore.AgentRuntimeArtifact.fromEcrRepository(repository, "v1.0.0");
592
+
593
+ // Create a runtime
594
+ const runtime = new agentcore.Runtime(this, "MyRuntime", {
595
+ runtimeName: "my_runtime",
596
+ agentRuntimeArtifact: agentRuntimeArtifact,
597
+ });
598
+
599
+ // Create a Lambda function that needs to invoke the runtime
600
+ const invokerFunction = new lambda.Function(this, "InvokerFunction", {
601
+ runtime: lambda.Runtime.PYTHON_3_12,
602
+ handler: "index.handler",
603
+ code: lambda.Code.fromInline(`
604
+ import boto3
605
+ def handler(event, context):
606
+ client = boto3.client('bedrock-agentcore')
607
+ # Invoke the runtime...
608
+ `),
609
+ });
610
+
611
+ // Grant permission to invoke the runtime directly
612
+ runtime.grantInvokeRuntime(invokerFunction);
613
+
614
+ // Grant permission to invoke the runtime on behalf of a user
615
+ // (requires X-Amzn-Bedrock-AgentCore-Runtime-User-Id header)
616
+ runtime.grantInvokeRuntimeForUser(invokerFunction);
617
+
618
+ // Grant both invoke permissions (most common use case)
619
+ runtime.grantInvoke(invokerFunction);
620
+
621
+ // Grant specific custom permissions to the runtime's execution role
622
+ runtime.grant(['bedrock:InvokeModel'], ['arn:aws:bedrock:*:*:*']);
623
+
624
+ // Add a policy statement to the runtime's execution role
625
+ runtime.addToRolePolicy(new iam.PolicyStatement({
626
+ actions: ['s3:GetObject'],
627
+ resources: ['arn:aws:s3:::my-bucket/*'],
628
+ }));
629
+ ```
630
+
583
631
  ### Other configuration
584
632
 
585
633
  #### Lifecycle configuration
@@ -36,6 +36,256 @@ 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
+ ### Image Pipeline
40
+
41
+ An image pipeline provides the automation framework for building secure AMIs and container images. The pipeline orchestrates the entire image creation process by combining an image recipe or container recipe with infrastructure configuration and distribution configuration. Pipelines can run on a schedule or be triggered manually, and they manage the build, test, and distribution phases automatically.
42
+
43
+ #### Image Pipeline Basic Usage
44
+
45
+ Create a simple AMI pipeline with just an image recipe:
46
+
47
+ ```ts
48
+ const imageRecipe = new imagebuilder.ImageRecipe(this, 'MyImageRecipe', {
49
+ baseImage: imagebuilder.BaseImage.fromSsmParameterName(
50
+ '/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64'
51
+ )
52
+ });
53
+
54
+ const imagePipeline = new imagebuilder.ImagePipeline(this, 'MyImagePipeline', {
55
+ recipe: exampleImageRecipe
56
+ });
57
+ ```
58
+
59
+ Create a simple container pipeline with just a container recipe:
60
+
61
+ ```ts
62
+ const containerRecipe = new imagebuilder.ContainerRecipe(this, 'MyContainerRecipe', {
63
+ baseImage: imagebuilder.BaseContainerImage.fromDockerHub('amazonlinux', 'latest'),
64
+ targetRepository: imagebuilder.Repository.fromEcr(
65
+ ecr.Repository.fromRepositoryName(this, 'Repository', 'my-container-repo')
66
+ )
67
+ });
68
+
69
+ const containerPipeline = new imagebuilder.ImagePipeline(this, 'MyContainerPipeline', {
70
+ recipe: exampleContainerRecipe
71
+ });
72
+ ```
73
+
74
+ #### Image Pipeline Scheduling
75
+
76
+ ##### Manual Pipeline Execution
77
+
78
+ Create a pipeline that runs only when manually triggered:
79
+
80
+ ```ts
81
+ const manualPipeline = new imagebuilder.ImagePipeline(this, 'ManualPipeline', {
82
+ imagePipelineName: 'my-manual-pipeline',
83
+ description: 'Pipeline triggered manually for production builds',
84
+ recipe: exampleImageRecipe
85
+ // No schedule property - manual execution only
86
+ });
87
+
88
+ // Grant Lambda function permission to trigger the pipeline
89
+ manualPipeline.grantStartExecution(lambdaRole);
90
+ ```
91
+
92
+ ##### Automated Pipeline Scheduling
93
+
94
+ Schedule a pipeline to run automatically using cron expressions:
95
+
96
+ ```ts
97
+ const weeklyPipeline = new imagebuilder.ImagePipeline(this, 'WeeklyPipeline', {
98
+ imagePipelineName: 'weekly-build-pipeline',
99
+ recipe: exampleImageRecipe,
100
+ schedule: {
101
+ expression: events.Schedule.cron({
102
+ minute: '0',
103
+ hour: '6',
104
+ weekDay: 'MON'
105
+ })
106
+ }
107
+ });
108
+ ```
109
+
110
+ Use rate expressions for regular intervals:
111
+
112
+ ```ts
113
+ const dailyPipeline = new imagebuilder.ImagePipeline(this, 'DailyPipeline', {
114
+ recipe: exampleContainerRecipe,
115
+ schedule: {
116
+ expression: events.Schedule.rate(Duration.days(1))
117
+ }
118
+ });
119
+ ```
120
+
121
+ ##### Pipeline Schedule Configuration
122
+
123
+ Configure advanced scheduling options:
124
+
125
+ ```ts
126
+ const advancedSchedulePipeline = new imagebuilder.ImagePipeline(this, 'AdvancedSchedulePipeline', {
127
+ recipe: exampleImageRecipe,
128
+ schedule: {
129
+ expression: events.Schedule.rate(Duration.days(7)),
130
+ // Only trigger when dependencies are updated (new base images, components, etc.)
131
+ startCondition: imagebuilder.ScheduleStartCondition.EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE,
132
+ // Automatically disable after 3 consecutive failures
133
+ autoDisableFailureCount: 3
134
+ },
135
+ // Start enabled
136
+ status: imagebuilder.ImagePipelineStatus.ENABLED
137
+ });
138
+ ```
139
+
140
+ #### Image Pipeline Configuration
141
+
142
+ ##### Infrastructure and Distribution
143
+
144
+ Configure custom infrastructure and distribution settings:
145
+
146
+ ```ts
147
+ const infrastructureConfiguration = new imagebuilder.InfrastructureConfiguration(this, 'Infrastructure', {
148
+ infrastructureConfigurationName: 'production-infrastructure',
149
+ instanceTypes: [
150
+ ec2.InstanceType.of(ec2.InstanceClass.COMPUTE7_INTEL, ec2.InstanceSize.LARGE)
151
+ ],
152
+ vpc: vpc,
153
+ subnetSelection: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }
154
+ });
155
+
156
+ const distributionConfiguration = new imagebuilder.DistributionConfiguration(this, 'Distribution');
157
+ distributionConfiguration.addAmiDistributions({
158
+ amiName: 'production-ami-{{ imagebuilder:buildDate }}',
159
+ amiTargetAccountIds: ['123456789012', '098765432109']
160
+ });
161
+
162
+ const productionPipeline = new imagebuilder.ImagePipeline(this, 'ProductionPipeline', {
163
+ recipe: exampleImageRecipe,
164
+ infrastructureConfiguration: infrastructureConfiguration,
165
+ distributionConfiguration: distributionConfiguration
166
+ });
167
+ ```
168
+
169
+ ##### Pipeline Logging Configuration
170
+
171
+ Configure custom CloudWatch log groups for pipeline and image logs:
172
+
173
+ ```ts
174
+ const pipelineLogGroup = new logs.LogGroup(this, 'PipelineLogGroup', {
175
+ logGroupName: '/custom/imagebuilder/pipeline/logs',
176
+ retention: logs.RetentionDays.ONE_MONTH
177
+ });
178
+
179
+ const imageLogGroup = new logs.LogGroup(this, 'ImageLogGroup', {
180
+ logGroupName: '/custom/imagebuilder/image/logs',
181
+ retention: logs.RetentionDays.ONE_WEEK
182
+ });
183
+
184
+ const loggedPipeline = new imagebuilder.ImagePipeline(this, 'LoggedPipeline', {
185
+ recipe: exampleImageRecipe,
186
+ imagePipelineLogGroup: pipelineLogGroup,
187
+ imageLogGroup: imageLogGroup
188
+ });
189
+ ```
190
+
191
+ ##### Workflow Integration
192
+
193
+ Use AWS-managed workflows for common pipeline phases:
194
+
195
+ ```ts
196
+ const workflowPipeline = new imagebuilder.ImagePipeline(this, 'WorkflowPipeline', {
197
+ recipe: exampleImageRecipe,
198
+ workflows: [
199
+ { workflow: imagebuilder.AwsManagedWorkflow.buildImage(this, 'BuildWorkflow') },
200
+ { workflow: imagebuilder.AwsManagedWorkflow.testImage(this, 'TestWorkflow') }
201
+ ]
202
+ });
203
+ ```
204
+
205
+ For container pipelines, use container-specific workflows:
206
+
207
+ ```ts
208
+ const containerWorkflowPipeline = new imagebuilder.ImagePipeline(this, 'ContainerWorkflowPipeline', {
209
+ recipe: exampleContainerRecipe,
210
+ workflows: [
211
+ { workflow: imagebuilder.AwsManagedWorkflow.buildContainer(this, 'BuildContainer') },
212
+ { workflow: imagebuilder.AwsManagedWorkflow.testContainer(this, 'TestContainer') },
213
+ { workflow: imagebuilder.AwsManagedWorkflow.distributeContainer(this, 'DistributeContainer') }
214
+ ]
215
+ });
216
+ ```
217
+
218
+ ##### Advanced Features
219
+
220
+ Configure image scanning for container pipelines:
221
+
222
+ ```ts
223
+ const scanningRepository = new ecr.Repository(this, 'ScanningRepo');
224
+
225
+ const scannedContainerPipeline = new imagebuilder.ImagePipeline(this, 'ScannedContainerPipeline', {
226
+ recipe: exampleContainerRecipe,
227
+ imageScanningEnabled: true,
228
+ imageScanningEcrRepository: scanningRepository,
229
+ imageScanningEcrTags: ['security-scan', 'latest']
230
+ });
231
+ ```
232
+
233
+ Control metadata collection and testing:
234
+
235
+ ```ts
236
+ const controlledPipeline = new imagebuilder.ImagePipeline(this, 'ControlledPipeline', {
237
+ recipe: exampleImageRecipe,
238
+ enhancedImageMetadataEnabled: true, // Collect detailed OS and package info
239
+ imageTestsEnabled: false // Skip testing phase for faster builds
240
+ });
241
+ ```
242
+
243
+ #### Image Pipeline Events
244
+
245
+ ##### Pipeline Event Handling
246
+
247
+ Handle specific pipeline events:
248
+
249
+ ```ts
250
+ // Monitor CVE detection
251
+ examplePipeline.onCVEDetected('CVEAlert', {
252
+ target: new targets.SnsTopic(topic)
253
+ });
254
+
255
+ // Handle pipeline auto-disable events
256
+ examplePipeline.onImagePipelineAutoDisabled('PipelineDisabledAlert', {
257
+ target: new targets.LambdaFunction(lambdaFunction)
258
+ });
259
+ ```
260
+
261
+ #### Importing Image Pipelines
262
+
263
+ Reference existing pipelines created outside CDK:
264
+
265
+ ```ts
266
+ // Import by name
267
+ const existingPipelineByName = imagebuilder.ImagePipeline.fromImagePipelineName(
268
+ this,
269
+ 'ExistingPipelineByName',
270
+ 'my-existing-pipeline'
271
+ );
272
+
273
+ // Import by ARN
274
+ const existingPipelineByArn = imagebuilder.ImagePipeline.fromImagePipelineArn(
275
+ this,
276
+ 'ExistingPipelineByArn',
277
+ 'arn:aws:imagebuilder:us-east-1:123456789012:image-pipeline/imported-pipeline'
278
+ );
279
+
280
+ // Grant permissions to imported pipelines
281
+ const automationRole = new iam.Role(this, 'AutomationRole', {
282
+ assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com')
283
+ });
284
+
285
+ existingPipelineByName.grantStartExecution(automationRole);
286
+ existingPipelineByArn.grantRead(lambdaRole);
287
+ ```
288
+
39
289
  ### Image Recipe
40
290
 
41
291
  #### Image Recipe Basic Usage
@@ -1074,3 +1324,341 @@ const testContainerWorkflow = imagebuilder.AwsManagedWorkflow.testContainer(this
1074
1324
  // Distribution workflows
1075
1325
  const distributeContainerWorkflow = imagebuilder.AwsManagedWorkflow.distributeContainer(this, 'DistributeContainer');
1076
1326
  ```
1327
+
1328
+ ### Lifecycle Policy
1329
+
1330
+ Lifecycle policies help you manage the retention and cleanup of Image Builder resources automatically. These policies define rules for deprecating or deleting old image versions, managing AMI snapshots, and controlling resource costs by removing unused images based on age, count, or other criteria.
1331
+
1332
+ #### Lifecycle Policy Basic Usage
1333
+
1334
+ Create a lifecycle policy to automatically delete old AMI images after 30 days:
1335
+
1336
+ ```ts
1337
+ const lifecyclePolicy = new imagebuilder.LifecyclePolicy(this, 'MyLifecyclePolicy', {
1338
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1339
+ details: [
1340
+ {
1341
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1342
+ filter: { ageFilter: { age: Duration.days(30) } }
1343
+ }
1344
+ ],
1345
+ resourceSelection: {
1346
+ tags: { Environment: 'development' }
1347
+ }
1348
+ });
1349
+ ```
1350
+
1351
+ Create a lifecycle policy to keep only the 10 most recent container images:
1352
+
1353
+ ```ts
1354
+ const containerLifecyclePolicy = new imagebuilder.LifecyclePolicy(this, 'ContainerLifecyclePolicy', {
1355
+ resourceType: imagebuilder.LifecyclePolicyResourceType.CONTAINER_IMAGE,
1356
+ details: [
1357
+ {
1358
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1359
+ filter: { countFilter: { count: 10 } }
1360
+ }
1361
+ ],
1362
+ resourceSelection: {
1363
+ tags: { Application: 'web-app' }
1364
+ }
1365
+ });
1366
+ ```
1367
+
1368
+ #### Lifecycle Policy Resource Selection
1369
+
1370
+ ##### Tag-Based Resource Selection
1371
+
1372
+ Apply lifecycle policies to images with specific tags:
1373
+
1374
+ ```ts
1375
+ const tagBasedPolicy = new imagebuilder.LifecyclePolicy(this, 'TagBasedPolicy', {
1376
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1377
+ details: [
1378
+ {
1379
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1380
+ filter: { ageFilter: { age: Duration.days(90) } }
1381
+ }
1382
+ ],
1383
+ resourceSelection: {
1384
+ tags: {
1385
+ Environment: 'staging',
1386
+ Team: 'backend'
1387
+ }
1388
+ }
1389
+ });
1390
+ ```
1391
+
1392
+ ##### Recipe-Based Resource Selection
1393
+
1394
+ Apply lifecycle policies to specific image or container recipes:
1395
+
1396
+ ```ts
1397
+ const imageRecipe = new imagebuilder.ImageRecipe(this, 'MyImageRecipe', {
1398
+ baseImage: imagebuilder.BaseImage.fromSsmParameterName(
1399
+ '/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64'
1400
+ )
1401
+ });
1402
+
1403
+ const containerRecipe = new imagebuilder.ContainerRecipe(this, 'MyContainerRecipe', {
1404
+ baseImage: imagebuilder.BaseContainerImage.fromDockerHub('amazonlinux', 'latest'),
1405
+ targetRepository: imagebuilder.Repository.fromEcr(
1406
+ ecr.Repository.fromRepositoryName(this, 'Repository', 'my-container-repo')
1407
+ )
1408
+ });
1409
+
1410
+ const recipeBasedPolicy = new imagebuilder.LifecyclePolicy(this, 'RecipeBasedPolicy', {
1411
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1412
+ details: [
1413
+ {
1414
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1415
+ filter: { countFilter: { count: 5 } }
1416
+ }
1417
+ ],
1418
+ resourceSelection: {
1419
+ recipes: [imageRecipe, containerRecipe]
1420
+ }
1421
+ });
1422
+ ```
1423
+
1424
+ #### Lifecycle Policy Rules
1425
+
1426
+ ##### Age-Based Rules
1427
+
1428
+ Delete images older than a specific time period:
1429
+
1430
+ ```ts
1431
+ const ageBasedPolicy = new imagebuilder.LifecyclePolicy(this, 'AgeBasedPolicy', {
1432
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1433
+ details: [
1434
+ {
1435
+ action: {
1436
+ type: imagebuilder.LifecyclePolicyActionType.DELETE,
1437
+ includeAmis: true,
1438
+ includeSnapshots: true
1439
+ },
1440
+ filter: {
1441
+ ageFilter: {
1442
+ age: Duration.days(60),
1443
+ retainAtLeast: 3 // Always keep at least 3 images
1444
+ }
1445
+ }
1446
+ }
1447
+ ],
1448
+ resourceSelection: {
1449
+ tags: { Environment: 'testing' }
1450
+ }
1451
+ });
1452
+ ```
1453
+
1454
+ ##### Count-Based Rules
1455
+
1456
+ Keep only a specific number of the most recent images:
1457
+
1458
+ ```ts
1459
+ const countBasedPolicy = new imagebuilder.LifecyclePolicy(this, 'CountBasedPolicy', {
1460
+ resourceType: imagebuilder.LifecyclePolicyResourceType.CONTAINER_IMAGE,
1461
+ details: [
1462
+ {
1463
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1464
+ filter: { countFilter: { count: 15 } } // Keep only the 15 most recent images
1465
+ }
1466
+ ],
1467
+ resourceSelection: {
1468
+ tags: { Application: 'microservice' }
1469
+ }
1470
+ });
1471
+ ```
1472
+
1473
+ ##### Multiple Lifecycle Rules
1474
+
1475
+ Implement a graduated approach with multiple actions:
1476
+
1477
+ ```ts
1478
+ const graduatedPolicy = new imagebuilder.LifecyclePolicy(this, 'GraduatedPolicy', {
1479
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1480
+ details: [
1481
+ {
1482
+ // First: Deprecate images after 30 days
1483
+ action: {
1484
+ type: imagebuilder.LifecyclePolicyActionType.DEPRECATE,
1485
+ includeAmis: true
1486
+ },
1487
+ filter: {
1488
+ ageFilter: {
1489
+ age: Duration.days(30),
1490
+ retainAtLeast: 5
1491
+ }
1492
+ }
1493
+ },
1494
+ {
1495
+ // Second: Disable images after 60 days
1496
+ action: {
1497
+ type: imagebuilder.LifecyclePolicyActionType.DISABLE,
1498
+ includeAmis: true
1499
+ },
1500
+ filter: {
1501
+ ageFilter: {
1502
+ age: Duration.days(60),
1503
+ retainAtLeast: 3
1504
+ }
1505
+ }
1506
+ },
1507
+ {
1508
+ // Finally: Delete images after 90 days
1509
+ action: {
1510
+ type: imagebuilder.LifecyclePolicyActionType.DELETE,
1511
+ includeAmis: true,
1512
+ includeSnapshots: true
1513
+ },
1514
+ filter: {
1515
+ ageFilter: {
1516
+ age: Duration.days(90),
1517
+ retainAtLeast: 1
1518
+ }
1519
+ }
1520
+ }
1521
+ ],
1522
+ resourceSelection: {
1523
+ tags: { Environment: 'production' }
1524
+ }
1525
+ });
1526
+ ```
1527
+
1528
+ #### Lifecycle Policy Exclusion Rules
1529
+
1530
+ ##### AMI Exclusion Rules
1531
+
1532
+ Exclude specific AMIs from lifecycle actions based on various criteria:
1533
+
1534
+ ```ts
1535
+ const excludeAmisPolicy = new imagebuilder.LifecyclePolicy(this, 'ExcludeAmisPolicy', {
1536
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1537
+ details: [
1538
+ {
1539
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1540
+ filter: { ageFilter: { age: Duration.days(30) } },
1541
+ exclusionRules: {
1542
+ amiExclusionRules: {
1543
+ isPublic: true, // Exclude public AMIs
1544
+ lastLaunched: Duration.days(7), // Exclude AMIs launched in last 7 days
1545
+ regions: ['us-west-2', 'eu-west-1'], // Exclude AMIs in specific regions
1546
+ sharedAccounts: ['123456789012'], // Exclude AMIs shared with specific accounts
1547
+ tags: {
1548
+ Protected: 'true',
1549
+ Environment: 'production'
1550
+ }
1551
+ }
1552
+ }
1553
+ }
1554
+ ],
1555
+ resourceSelection: {
1556
+ tags: { Team: 'infrastructure' }
1557
+ }
1558
+ });
1559
+ ```
1560
+
1561
+ ##### Image Exclusion Rules
1562
+
1563
+ Exclude Image Builder images with protective tags:
1564
+
1565
+ ```ts
1566
+ const excludeImagesPolicy = new imagebuilder.LifecyclePolicy(this, 'ExcludeImagesPolicy', {
1567
+ resourceType: imagebuilder.LifecyclePolicyResourceType.CONTAINER_IMAGE,
1568
+ details: [
1569
+ {
1570
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1571
+ filter: { countFilter: { count: 20 } },
1572
+ exclusionRules: {
1573
+ imageExclusionRules: {
1574
+ tags: {
1575
+ DoNotDelete: 'true',
1576
+ Critical: 'baseline'
1577
+ }
1578
+ }
1579
+ }
1580
+ }
1581
+ ],
1582
+ resourceSelection: {
1583
+ tags: { Application: 'frontend' }
1584
+ }
1585
+ });
1586
+ ```
1587
+
1588
+ #### Advanced Lifecycle Configuration
1589
+
1590
+ ##### Custom Execution Roles
1591
+
1592
+ Provide your own IAM execution role with specific permissions:
1593
+
1594
+ ```ts
1595
+ const executionRole = new iam.Role(this, 'LifecycleExecutionRole', {
1596
+ assumedBy: new iam.ServicePrincipal('imagebuilder.amazonaws.com'),
1597
+ managedPolicies: [
1598
+ iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/EC2ImageBuilderLifecycleExecutionPolicy')
1599
+ ]
1600
+ });
1601
+
1602
+ const customRolePolicy = new imagebuilder.LifecyclePolicy(this, 'CustomRolePolicy', {
1603
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1604
+ executionRole: executionRole,
1605
+ details: [
1606
+ {
1607
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1608
+ filter: { ageFilter: { age: Duration.days(45) } }
1609
+ }
1610
+ ],
1611
+ resourceSelection: {
1612
+ tags: { Environment: 'development' }
1613
+ }
1614
+ });
1615
+ ```
1616
+
1617
+ ##### Lifecycle Policy Status
1618
+
1619
+ Control whether the lifecycle policy is active:
1620
+
1621
+ ```ts
1622
+ const disabledPolicy = new imagebuilder.LifecyclePolicy(this, 'DisabledPolicy', {
1623
+ lifecyclePolicyName: 'my-disabled-policy',
1624
+ description: 'A lifecycle policy that is temporarily disabled',
1625
+ status: imagebuilder.LifecyclePolicyStatus.DISABLED,
1626
+ resourceType: imagebuilder.LifecyclePolicyResourceType.AMI_IMAGE,
1627
+ details: [
1628
+ {
1629
+ action: { type: imagebuilder.LifecyclePolicyActionType.DELETE },
1630
+ filter: { ageFilter: { age: Duration.days(30) } }
1631
+ }
1632
+ ],
1633
+ resourceSelection: {
1634
+ tags: { Environment: 'testing' }
1635
+ },
1636
+ tags: {
1637
+ Owner: 'DevOps',
1638
+ CostCenter: 'Engineering'
1639
+ }
1640
+ });
1641
+ ```
1642
+
1643
+ ##### Importing Lifecycle Policies
1644
+
1645
+ Reference lifecycle policies created outside of CDK:
1646
+
1647
+ ```ts
1648
+ // Import by name
1649
+ const importedByName = imagebuilder.LifecyclePolicy.fromLifecyclePolicyName(
1650
+ this,
1651
+ 'ImportedByName',
1652
+ 'existing-lifecycle-policy'
1653
+ );
1654
+
1655
+ // Import by ARN
1656
+ const importedByArn = imagebuilder.LifecyclePolicy.fromLifecyclePolicyArn(
1657
+ this,
1658
+ 'ImportedByArn',
1659
+ 'arn:aws:imagebuilder:us-east-1:123456789012:lifecycle-policy/my-policy'
1660
+ );
1661
+
1662
+ importedByName.grantRead(lambdaRole);
1663
+ importedByArn.grant(lambdaRole, 'imagebuilder:PutLifecyclePolicy');
1664
+ ```
@@ -15,17 +15,26 @@
15
15
 
16
16
  <!--END STABILITY BANNER-->
17
17
 
18
+ This package provides two main features:
19
+
20
+ 1. **Mixins** - Composable abstractions for adding functionality to constructs
21
+ 2. **EventBridge Event Patterns** - Type-safe event patterns for AWS resources
22
+
23
+ ---
24
+
25
+ ## CDK Mixins
26
+
18
27
  CDK Mixins provide a new, advanced way to add functionality through composable abstractions.
19
28
  Unlike traditional L2 constructs that bundle all features together, Mixins allow you to pick and choose exactly the capabilities you need for constructs.
20
29
 
21
- ## Key Benefits
30
+ ### Key Benefits
22
31
 
23
32
  * **Universal Compatibility**: Apply the same abstractions to L1 constructs, L2 constructs, or custom constructs
24
33
  * **Composable Design**: Mix and match features without being locked into specific implementations
25
34
  * **Cross-Service Abstractions**: Use common patterns like encryption across different AWS services
26
35
  * **Escape Hatch Freedom**: Customize resources in a safe, typed way while keeping the abstractions you want
27
36
 
28
- ## Basic Usage
37
+ ### Basic Usage
29
38
 
30
39
  Mixins use `Mixins.of()` as the fundamental API for applying abstractions to constructs:
31
40
 
@@ -37,7 +46,7 @@ Mixins.of(bucket)
37
46
  .apply(new AutoDeleteObjects());
38
47
  ```
39
48
 
40
- ### Fluent Syntax with `.with()`
49
+ #### Fluent Syntax with `.with()`
41
50
 
42
51
  For convenience, you can use the `.with()` method for a more fluent syntax:
43
52
 
@@ -53,7 +62,7 @@ The `.with()` method is available after importing `@aws-cdk/mixins-preview/with`
53
62
 
54
63
  > **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
64
 
56
- ## Creating Custom Mixins
65
+ ### Creating Custom Mixins
57
66
 
58
67
  Mixins are simple classes that implement the `IMixin` interface (usually by extending the abstract `Mixin` class:
59
68
 
@@ -77,7 +86,7 @@ const bucket = new s3.CfnBucket(scope, "MyBucket");
77
86
  Mixins.of(bucket).apply(new CustomVersioningMixin());
78
87
  ```
79
88
 
80
- ## Construct Selection
89
+ ### Construct Selection
81
90
 
82
91
  Mixins operate on construct trees and can be applied selectively:
83
92
 
@@ -94,9 +103,9 @@ Mixins.of(scope, ConstructSelector.byId(/.*-prod-.*/))
94
103
  .apply(new ProductionSecurityMixin());
95
104
  ```
96
105
 
97
- ## Built-in Mixins
106
+ ### Built-in Mixins
98
107
 
99
- ### Cross-Service Mixins
108
+ #### Cross-Service Mixins
100
109
 
101
110
  **EncryptionAtRest**: Applies encryption to supported AWS resources
102
111
 
@@ -109,7 +118,7 @@ const logGroup = new logs.CfnLogGroup(scope, "LogGroup");
109
118
  Mixins.of(logGroup).apply(new EncryptionAtRest());
110
119
  ```
111
120
 
112
- ### S3-Specific Mixins
121
+ #### S3-Specific Mixins
113
122
 
114
123
  **AutoDeleteObjects**: Configures automatic object deletion for S3 buckets
115
124
 
@@ -125,6 +134,30 @@ const bucket = new s3.CfnBucket(scope, "Bucket");
125
134
  Mixins.of(bucket).apply(new EnableVersioning());
126
135
  ```
127
136
 
137
+ ### Logs Delivery
138
+
139
+ Configures vended logs delivery for supported resources to various destinations:
140
+
141
+ ```typescript
142
+ import '@aws-cdk/mixins-preview/with';
143
+ import * as cloudfrontMixins from '@aws-cdk/mixins-preview/aws_cloudfront/mixins';
144
+
145
+ // Create CloudFront distribution
146
+ declare const bucket: s3.Bucket;
147
+ const distribution = new cloudfront.Distribution(scope, 'Distribution', {
148
+ defaultBehavior: {
149
+ origin: origins.S3BucketOrigin.withOriginAccessControl(bucket),
150
+ },
151
+ });
152
+
153
+ // Create log destination
154
+ const logGroup = new logs.LogGroup(scope, 'DeliveryLogGroup');
155
+
156
+ // Configure log delivery using the mixin
157
+ distribution
158
+ .with(cloudfrontMixins.CfnDistributionLogsMixin.CONNECTION_LOGS.toLogGroup(logGroup));
159
+ ```
160
+
128
161
  ### L1 Property Mixins
129
162
 
130
163
  For every CloudFormation resource, CDK Mixins automatically generates type-safe property mixins. These allow you to apply L1 properties with full TypeScript support:
@@ -154,7 +187,7 @@ Mixins.of(bucket).apply(new CfnBucketPropsMixin(
154
187
  { strategy: PropertyMergeStrategy.MERGE }
155
188
  ));
156
189
 
157
- // OVERWRITE: Replaces existing property values
190
+ // OVERRIDE: Replaces existing property values
158
191
  Mixins.of(bucket).apply(new CfnBucketPropsMixin(
159
192
  { versioningConfiguration: { status: "Enabled" } },
160
193
  { strategy: PropertyMergeStrategy.OVERRIDE }
@@ -169,7 +202,7 @@ import { CfnFunctionPropsMixin } from '@aws-cdk/mixins-preview/aws_lambda/mixins
169
202
  import { CfnTablePropsMixin } from '@aws-cdk/mixins-preview/aws_dynamodb/mixins';
170
203
  ```
171
204
 
172
- ## Error Handling
205
+ ### Error Handling
173
206
 
174
207
  Mixins provide comprehensive error handling:
175
208
 
@@ -182,3 +215,89 @@ Mixins.of(scope)
182
215
  Mixins.of(scope)
183
216
  .mustApply(new EncryptionAtRest()); // Throws if no constructs support the mixin
184
217
  ```
218
+
219
+ ---
220
+
221
+ ## EventBridge Event Patterns
222
+
223
+ CDK Mixins automatically generates typed EventBridge event patterns for AWS resources. These patterns work with both L1 and L2 constructs, providing a consistent interface for creating EventBridge rules.
224
+
225
+ ### Event Patterns Basic Usage
226
+
227
+ ```typescript
228
+ import { BucketEvents } from '@aws-cdk/mixins-preview/aws_s3/events';
229
+ import * as events from 'aws-cdk-lib/aws-events';
230
+ import * as targets from 'aws-cdk-lib/aws-events-targets';
231
+
232
+ // Works with L2 constructs
233
+ const bucket = new s3.Bucket(scope, 'Bucket');
234
+ const bucketEvents = BucketEvents.fromBucket(bucket);
235
+ declare const fn: lambda.Function;
236
+
237
+ new events.Rule(scope, 'Rule', {
238
+ eventPattern: bucketEvents.objectCreatedPattern({
239
+ object: { key: ['uploads/*'] }
240
+ }),
241
+ targets: [new targets.LambdaFunction(fn)]
242
+ });
243
+
244
+ // Also works with L1 constructs
245
+ const cfnBucket = new s3.CfnBucket(scope, 'CfnBucket');
246
+ const cfnBucketEvents = BucketEvents.fromBucket(cfnBucket);
247
+
248
+ new events.CfnRule(scope, 'CfnRule', {
249
+ state: 'ENABLED',
250
+ eventPattern: cfnBucketEvents.objectCreatedPattern({
251
+ object: { key: ['uploads/*'] }
252
+ }),
253
+ targets: [{ arn: fn.functionArn, id: 'L1' }]
254
+ });
255
+ ```
256
+
257
+ ### Event Pattern Features
258
+
259
+ **Automatic Resource Injection**: Resource identifiers are automatically included in patterns
260
+
261
+ ```typescript
262
+ import { BucketEvents } from '@aws-cdk/mixins-preview/aws_s3/events';
263
+
264
+ declare const bucket: s3.Bucket;
265
+ const bucketEvents = BucketEvents.fromBucket(bucket);
266
+
267
+ // Bucket name is automatically injected from the bucket reference
268
+ const pattern = bucketEvents.objectCreatedPattern();
269
+ // pattern.detail.bucket.name === bucket.bucketName
270
+ ```
271
+
272
+ **Event Metadata Support**: Control EventBridge pattern metadata
273
+
274
+ ```typescript
275
+ import { BucketEvents } from '@aws-cdk/mixins-preview/aws_s3/events';
276
+
277
+ declare const bucket: s3.Bucket;
278
+ const bucketEvents = BucketEvents.fromBucket(bucket);
279
+
280
+ const pattern = bucketEvents.objectCreatedPattern({
281
+ eventMetadata: {
282
+ region: ['us-east-1', 'us-west-2'],
283
+ version: ['0']
284
+ }
285
+ });
286
+ ```
287
+
288
+ ### Available Events
289
+
290
+ Event patterns are generated for EventBridge events available in the AWS Event Schema Registry. Common examples:
291
+
292
+ **S3 Events**:
293
+
294
+ * `objectCreatedPattern()` - Object creation events
295
+ * `objectDeletedPattern()` - Object deletion events
296
+ * `objectTagsAddedPattern()` - Object tagging events
297
+ * `awsAPICallViaCloudTrailPattern()` - CloudTrail API calls
298
+
299
+ Import events from service-specific modules:
300
+
301
+ ```typescript
302
+ import { BucketEvents } from '@aws-cdk/mixins-preview/aws_s3/events';
303
+ ```
@@ -16,6 +16,8 @@ running on AWS Lambda, or any web application.
16
16
  - [AWS Lambda-backed APIs](#aws-lambda-backed-apis)
17
17
  - [AWS StepFunctions backed APIs](#aws-stepfunctions-backed-apis)
18
18
  - [Integration Targets](#integration-targets)
19
+ - [Response Streaming](#response-streaming)
20
+ - [Lambda Integration Permissions](#lambda-integration-permissions)
19
21
  - [Usage Plan \& API Keys](#usage-plan--api-keys)
20
22
  - [Adding an API Key to an imported RestApi](#adding-an-api-key-to-an-imported-restapi)
21
23
  - [⚠️ Multiple API Keys](#️-multiple-api-keys)
@@ -334,6 +336,20 @@ const getMessageIntegration = new apigateway.AwsIntegration({
334
336
  });
335
337
  ```
336
338
 
339
+ ### Response Streaming
340
+
341
+ Integrations support response streaming, which allows responses to be streamed back to clients.
342
+ This is useful for large payloads or when you want to start sending data before the entire response is ready.
343
+
344
+ To enable response streaming, set `ResponseTransferMode.STREAM` to the `responseTransferMode` option:
345
+
346
+ ```ts
347
+ declare const handler: lambda.Function;
348
+ new apigateway.LambdaIntegration(handler, {
349
+ responseTransferMode: apigateway.ResponseTransferMode.STREAM,
350
+ });
351
+ ```
352
+
337
353
  ### Lambda Integration Permissions
338
354
 
339
355
  By default, creating a `LambdaIntegration` will add a permission for API Gateway to invoke your AWS Lambda function, scoped to the specific method which uses the integration.
@@ -0,0 +1,51 @@
1
+ import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
2
+ import { App, Stack } from 'aws-cdk-lib';
3
+ import { ExpectedResult, IntegTest } from '@aws-cdk/integ-tests-alpha';
4
+ import { Construct } from 'constructs';
5
+ import { LambdaIntegration, ResponseTransferMode, RestApi } from 'aws-cdk-lib/aws-apigateway';
6
+
7
+ class RestApiStreamStack extends Stack {
8
+ public readonly api: RestApi;
9
+ constructor(scope: Construct) {
10
+ super(scope, 'RestApiStreamStack');
11
+
12
+ const fn = new Function(this, 'myfn', {
13
+ code: Code.fromInline(`exports.handler = awslambda.streamifyResponse(async (event, responseStream, context) => {
14
+ const metadata = {
15
+ statusCode: 200,
16
+ headers: { 'Content-Type': 'text/plain' }
17
+ };
18
+ responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
19
+ responseStream.write('Hello, ');
20
+ await new Promise(resolve => setTimeout(resolve, 100));
21
+ responseStream.write('streaming ');
22
+ await new Promise(resolve => setTimeout(resolve, 100));
23
+ responseStream.write('world!');
24
+ responseStream.end();
25
+ });`),
26
+ runtime: Runtime.NODEJS_24_X,
27
+ handler: 'index.handler',
28
+ });
29
+
30
+ this.api = new RestApi(this, 'Api');
31
+ this.api.root.addMethod('POST', new LambdaIntegration(fn, { responseTransferMode: ResponseTransferMode.STREAM }));
32
+ }
33
+ }
34
+
35
+ const app = new App({
36
+ postCliContext: {
37
+ '@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
38
+ },
39
+ });
40
+ const testCase = new RestApiStreamStack(app);
41
+ const integ = new IntegTest(app, 'rest-api-stream', {
42
+ testCases: [testCase],
43
+ });
44
+
45
+ const call = integ.assertions.httpApiCall(testCase.api.deploymentStage.urlForPath('/'), {
46
+ method: 'POST',
47
+ });
48
+ call.expect(ExpectedResult.objectLike({
49
+ status: 200,
50
+ body: 'Hello, streaming world!',
51
+ }));
@@ -3,8 +3,13 @@ import * as ecs from 'aws-cdk-lib/aws-ecs';
3
3
  import * as cdk from 'aws-cdk-lib';
4
4
  import * as integ from '@aws-cdk/integ-tests-alpha';
5
5
  import * as ecsPatterns from 'aws-cdk-lib/aws-ecs-patterns';
6
+ import { ECS_PATTERNS_UNIQUE_TARGET_GROUP_ID } from 'aws-cdk-lib/cx-api';
6
7
 
7
- const app = new cdk.App();
8
+ const app = new cdk.App({
9
+ postCliContext: {
10
+ [ECS_PATTERNS_UNIQUE_TARGET_GROUP_ID]: true,
11
+ },
12
+ });
8
13
  const stack = new cdk.Stack(app, 'aws-ecs-integ-alb-fargate-public-private-switch');
9
14
 
10
15
  const vpc = new ec2.Vpc(stack, 'Vpc', { maxAzs: 2, restrictDefaultSecurityGroup: false });
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: konokenj.cdk-api-mcp-server
3
- Version: 0.59.0
3
+ Version: 0.61.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.228.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.229.1-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=6tAVjUoxyJ1sl_ooRw_IAkmmUSZme7of4ivq8gy7e4s,129
1
+ cdk_api_mcp_server/__about__.py,sha256=K0yl0BYcoJjpNacBBbmXpqgvDl9_hRNyLXsRo6FPirs,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
@@ -9,7 +9,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/app-staging-synthesizer
9
9
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-amplify-alpha/README.md,sha256=OIdszebPa0EqMIaHhqWgH6A64AcwQioIKC-NHDyZKrI,12636
10
10
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-applicationsignals-alpha/README.md,sha256=6nqc-WbHB1iFE3vXDr6hyQs8tYS6wwnWutXePY4EF4w,10873
11
11
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-apprunner-alpha/README.md,sha256=Jtm3RbnP4jQy8BYXwHvaRbMKizUjr4SqvimVMYhu6WQ,11982
12
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-bedrock-agentcore-alpha/README.md,sha256=mOoV0VbrH4MvgA5eEuPjvcExkIrtCAvjGR997jCUyxg,94169
12
+ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-bedrock-agentcore-alpha/README.md,sha256=-oEUT46pHphAMDs-gPnouXwQXFg4mLGzKaKs3h84f1I,95809
13
13
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-bedrock-alpha/README.md,sha256=ZFThRraeK0rx1CF2foaEDzKsWxL1Qb9yqpCFM8eKvIo,65269
14
14
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-cloud9-alpha/README.md,sha256=0N8kldvHAKsNQHKtsj8PaQywiDUVrd6rEwVNQV0equY,7718
15
15
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-codestar-alpha/README.md,sha256=J-c-thqWwZFQT3Exjr_AY95BBgTA14Wb9aJ32gmEizQ,1509
@@ -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=4d9nvPey6Pnfk-_Z7b0hETPYgYOqyrpLUHkKw5rhI90,34028
23
+ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-imagebuilder-alpha/README.md,sha256=9W9RsI0MNRbd4S0WTQxnrBGxxlRLP4mR18TppIEQITQ,50697
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,13 +46,13 @@ 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=kOR3lr1nRgQvZotnLYt3DUfcUzC0PJM6TNTwxy3ouCQ,6110
49
+ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/mixins-preview/README.md,sha256=bhNnfP2bBS2AuPQfIsPlvVmqn3wOz5DDI3yVBz_1rkI,9584
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
53
53
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/assets/README.md,sha256=kL56RlfxBa5LwV0cRseybeKIRKHhEXPjUo0HWPZqdO8,53
54
54
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-acmpca/README.md,sha256=RGFU8j3ndIVE6TFClCB6CqXGZsRuQihPUV63ZpxfrnY,1770
55
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/README.md,sha256=JGK3dV0CAyCnMYpDiZGpnHQuQzJpuFavR892W6g4s7A,66325
55
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/README.md,sha256=S3ELghCoO5BJDiX7qlfzonswpYPPg0zIuFdeTE6pHXQ,66942
56
56
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.api-definition.asset.ts,sha256=boLnVIGcaOjg2TGEhOC0mLldISYkj7NwahqhjUxU-jM,1258
57
57
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.api-definition.inline.ts,sha256=NjNlh_yI_yYJ0jsdT0Swp2JwhvYIzwC4g_2YK1LChgU,1722
58
58
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.api-with-authorizer-and-method.ts,sha256=eQRXMq81lE36q-LInjICbtM0yuHQGCzWNySr0IlCs08,1093
@@ -76,6 +76,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ
76
76
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi-import.lit.ts,sha256=PWe7_kQhUoUk_5c5XySAuHNqaRY4TjVYfFw90ZDm-XQ,3896
77
77
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi-ip-address-type.ts,sha256=T2rhIMaYQICvq30EC3LuJSCgORxOjU2ynB7l4BdO7J0,1969
78
78
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi-metrics.ts,sha256=v-WGRXnX0PorSfrzTeGkXXgigi905Rg49azGE2wg-SI,907
79
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi-stream.ts,sha256=DmNYPwv-zFiLTnoPGJ0bLlnqNdP0cqAlv9psdFA5QTE,1814
79
80
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi.access-log-firehose.ts,sha256=TGo5hdUGf08kAn2Aua7_7grFHqb096XGjeWWdDYKtT4,2602
80
81
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi.access-log.ts,sha256=BJgvho6pl6SwOULrlHKTUYShYtkhqglfXg-kTd4I3Qs,1935
81
82
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi.books.ts,sha256=lJVCckdTlcx4mlfwP-Mf8mZKwSValB9ysMB-4u5mYJc,2309
@@ -670,7 +671,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/int
670
671
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-https.ts,sha256=3dktKjKxT-C6UnR8iAzLGpuglqdWkCxBMcfrWcQzB_o,1359
671
672
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-idle-timeout.ts,sha256=1nDG3rd-hm3RnQ4xiFT4pdAR9Z3T88OoR7sB5oWIwJw,994
672
673
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-ipv6.ts,sha256=KHu8xfWrNhROvDbiQHKS01FxRO_rNf1Flp3V0qI5D10,1195
673
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-public-private-switch.ts,sha256=sBJogVNG4upIS1EpHCwpkakBFxdA8Ayz8tavEaghP1M,1592
674
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-public-private-switch.ts,sha256=ofEzzKJHAauq1_6dpg63icbnH_bjwfuh1beZ0WVYeCQ,1743
674
675
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-smart-defaults.ts,sha256=pH9NWZes2NeQdYMQwL6T4de8OC2nlWSmJswxyKrGluY,5606
675
676
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.application-load-balanced-ecs-service.ts,sha256=AW0TxIUs43BjiGhpHZHCjqtFXC_8mZ-FjfXOQWDew6o,2581
676
677
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.asset-image.ts,sha256=dVWEvGZC44OoqkcskIJxWaw5dUacsxBRAnlNZD5xxEw,1117
@@ -1465,8 +1466,8 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/integ.pipe
1465
1466
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/region-info/README.md,sha256=vewWkV3ds9o9iyyYaJBNTkaKJ2XA6K2yF17tAxUnujg,2718
1466
1467
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/triggers/README.md,sha256=hYIx7DbG_7p4LYLUfxDwgIQjw9UNdz1GLrqDe8_Dbko,4132
1467
1468
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/triggers/integ.triggers.ts,sha256=LfeVru_CggiFXKPVa8vwt6Uv43SV3oAioDGmd8PyMHc,2859
1468
- konokenj_cdk_api_mcp_server-0.59.0.dist-info/METADATA,sha256=WJvhP1DDG-9-aXQVRVMgIuPpIRJzuxEqyIwVnxj8PuA,2646
1469
- konokenj_cdk_api_mcp_server-0.59.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1470
- konokenj_cdk_api_mcp_server-0.59.0.dist-info/entry_points.txt,sha256=bVDhMdyCC1WNMPOMbmB82jvWII2CIrwTZDygdCf0cYQ,79
1471
- konokenj_cdk_api_mcp_server-0.59.0.dist-info/licenses/LICENSE.txt,sha256=5OIAASeg1HM22mVZ1enz9bgZ7TlsGfWXnj02P9OgFyk,1098
1472
- konokenj_cdk_api_mcp_server-0.59.0.dist-info/RECORD,,
1469
+ konokenj_cdk_api_mcp_server-0.61.0.dist-info/METADATA,sha256=P0XyRaSLgudxEXVnyfbU22YT8l1RxwgVv-5aZ9lm5Lo,2646
1470
+ konokenj_cdk_api_mcp_server-0.61.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1471
+ konokenj_cdk_api_mcp_server-0.61.0.dist-info/entry_points.txt,sha256=bVDhMdyCC1WNMPOMbmB82jvWII2CIrwTZDygdCf0cYQ,79
1472
+ konokenj_cdk_api_mcp_server-0.61.0.dist-info/licenses/LICENSE.txt,sha256=5OIAASeg1HM22mVZ1enz9bgZ7TlsGfWXnj02P9OgFyk,1098
1473
+ konokenj_cdk_api_mcp_server-0.61.0.dist-info/RECORD,,