konokenj.cdk-api-mcp-server 0.60.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.
- cdk_api_mcp_server/__about__.py +1 -1
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-bedrock-agentcore-alpha/README.md +48 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-imagebuilder-alpha/README.md +588 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/mixins-preview/README.md +129 -10
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/README.md +16 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi-stream.ts +51 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs-patterns/integ.alb-fargate-service-public-private-switch.ts +6 -1
- {konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/METADATA +2 -2
- {konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/RECORD +12 -11
- {konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/WHEEL +0 -0
- {konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/entry_points.txt +0 -0
- {konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/licenses/LICENSE.txt +0 -0
cdk_api_mcp_server/__about__.py
CHANGED
cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-bedrock-agentcore-alpha/README.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
+
### Built-in Mixins
|
|
98
107
|
|
|
99
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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.
|
cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ.restapi-stream.ts
ADDED
|
@@ -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.
|
|
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
|
[](https://pypi.org/project/konokenj.cdk-api-mcp-server)
|
|
27
27
|
|
|
28
28
|
<!-- DEP-VERSIONS-START -->
|
|
29
|
-
[](https://github.com/konokenj/cdk-api-mcp-server/blob/main/current-versions/aws-cdk.txt)
|
|
30
30
|
<!-- DEP-VERSIONS-END -->
|
|
31
31
|
|
|
32
32
|
---
|
{konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/RECORD
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
cdk_api_mcp_server/__about__.py,sha256=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1469
|
-
konokenj_cdk_api_mcp_server-0.
|
|
1470
|
-
konokenj_cdk_api_mcp_server-0.
|
|
1471
|
-
konokenj_cdk_api_mcp_server-0.
|
|
1472
|
-
konokenj_cdk_api_mcp_server-0.
|
|
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,,
|
{konokenj_cdk_api_mcp_server-0.60.0.dist-info → konokenj_cdk_api_mcp_server-0.61.0.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|