konokenj.cdk-api-mcp-server 0.2.4__py3-none-any.whl → 0.11.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.

Potentially problematic release.


This version of konokenj.cdk-api-mcp-server might be problematic. Click here for more details.

Files changed (17) hide show
  1. cdk_api_mcp_server/__about__.py +1 -1
  2. cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/custom-resource-handlers/README.md +15 -78
  3. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-dualstack.ts +3 -4
  4. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api.ts +2 -4
  5. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.stage.ts +7 -20
  6. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.iam.ts +34 -38
  7. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.sqs.ts +58 -71
  8. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-config.ts +4 -15
  9. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group.ts +218 -40
  10. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts +102 -104
  11. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary.ts +4 -0
  12. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/FEATURE_FLAGS.md +3 -3
  13. {konokenj_cdk_api_mcp_server-0.2.4.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/METADATA +1 -1
  14. {konokenj_cdk_api_mcp_server-0.2.4.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/RECORD +17 -17
  15. {konokenj_cdk_api_mcp_server-0.2.4.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/WHEEL +0 -0
  16. {konokenj_cdk_api_mcp_server-0.2.4.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/entry_points.txt +0 -0
  17. {konokenj_cdk_api_mcp_server-0.2.4.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2025-present Kenji Kono <konoken@amazon.co.jp>
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.2.4"
4
+ __version__ = "0.11.0"
@@ -1,83 +1,20 @@
1
- # CDK Handler Framework
1
+ # Type definitions copied from 'aws-cdk-lib'
2
2
 
3
- The CDK handler framework is an internal framework used to code generate constructs that extend a lambda `Function`, lambda `SingletonFunction`, or core `CustomResourceProvider` construct and prohibit the user from directly configuring the `handler`, `runtime`, `code`, and `codeDirectory` properties. In doing this, we are able to establish best practices, runtime enforcement, and consistency across all handlers we build and vend within the aws-cdk.
3
+ `aws-cdk-lib` depends on this package; but this package depends on some
4
+ types defined in `aws-cdk-lib`.
4
5
 
5
- ## CDK Handler Framework Concepts
6
+ This cyclic dependency leads to a non-executable build graph. In order to
7
+ break the cycle, we're just copying some types over from `aws-cdk-lib`.
6
8
 
7
- This framework allows for the creation of three component types:
8
- 1. `ComponentType.FUNCTION` - This is a wrapper around the lambda `Function` construct. It offers the same behavior and performance as a lambda `Function`, but it restricts the consumer from configuring the `handler`, `runtime`, and `code` properties.
9
- 2. `ComponentType.SINGLETON_FUNCTION` - This is a wrapper around the lambda `SingletonFunction` construct. It offers the same behavior and performance as a lambda `SingletonFunction`, but it restricts the consumer from configuring the `handler`, `runtime`, and `code` properties.
10
- 3. `ComponentType.CUSTOM_RESOURCE_PROVIDER` - This is a wrapper around the core `CustomResourceProvider` construct. It offers the same behavior and performance as a `CustomResourceProvider` and can be instantiated via the `getOrCreate` or `getOrCreateProvider` methods. This component restricts the consumer from configuring the `runtime` and `codeDirectory` properties.
9
+ I readily admit this is not a great long-term solution, but those types have
10
+ been stable for years and are unlikely to change. The correct solution would
11
+ probably be to externalize them into a separate package, but even the most
12
+ simple solution of that accord would require bundling the types into
13
+ `aws-cdk-lib` with `bundledDependencies` and that requires us writing a
14
+ replacement for `npm pack`, because by default NPM will refuse to bundle
15
+ `bundledDependencies` that have been symlinked into a local workspace (in fact,
16
+ it will silently ignore them).
11
17
 
12
- Code generating one of these three component types requires adding the component properties to the [config](./config.ts) file by providing `ComponentProps`. The `ComponentProps` are responsible for code generating the specified `ComponentType` with the `handler`, `runtime`, `code`, and `codeDirectory` properties set internally. `ComponentProps` includes the following properties:
13
- - `type` - the framework component type to generate.
14
- - `sourceCode` - the source code that will be excuted by the framework component.
15
- - `runtime` - the runtime that is compatible with the framework component's source code. This is an optional property with a default node runtime that will be the latest available node runtime in the `Stack` deployment region. In general, you should not configure this property unless a `runtime` override is absolutely necessary.
16
- - `handler` - the name of the method with the source code that the framework component will call. This is an optional property and the default is `index.handler`.
17
- - `minifyAndBundle` - whether the source code should be minified and bundled. This an optional property and the default is `true`. This should only be set to `false` for python files or for typescript/javascript files with a require import.
18
+ We can build our own replacement for `npm pack`, or we can do a little
19
+ copy/paste. I'm opting for the latter.
18
20
 
19
- The [config](./config.ts) file is structured with the top level mapping to an aws-cdk module, i.e., aws-s3, aws-dynamodb, etc. Each service can contain one or more component modules. Component modules are containers for handler framework components and will be rendered as a code generated file. Each component module can contain one or more `ComponentProps` objects. The following example shows a more structural breakdown of how the [config](./config.ts) file is configured:
20
-
21
- ```ts
22
- const config = {
23
- 'aws-s3': { // the aws-cdk-lib module
24
- 'replica-provider': [ // the component module
25
- // handler framework component defined as a `ComponentProps` object
26
- {
27
- // the handler framework component type
28
- type: ComponentType.FUNCTION,
29
- // the source code that the component will use
30
- sourceCode: path.resolve(__dirname, '..', 'aws-dynamodb', 'replica-handler', 'index.ts'),
31
- // the handler in the source code that the component will execute
32
- handler: 'index.onEventHandler',
33
- },
34
- ],
35
- },
36
- 'aws-stepfunctions-tasks': {
37
- // contains multiple component modules
38
- 'eval-nodejs-provider': [
39
- {
40
- type: ComponentType.SINGLETON_FUNCTION,
41
- sourceCode: path.resolve(__dirname, '..', 'aws-stepfunctions-tasks', 'eval-nodejs-handler', 'index.ts'),
42
- },
43
- ],
44
- 'role-policy-provider': [
45
- {
46
- type: ComponentType.SINGLETON_FUNCTION,
47
- sourceCode: path.resolve(__dirname, '..', 'aws-stepfunctions-tasks', 'role-policy-handler', 'index.py'),
48
- runtime: Runtime.PYTHON_3_9,
49
- // prevent minify and bundle since the source code is a python file
50
- minifyAndBundle: false,
51
- },
52
- ],
53
- },
54
- };
55
- ```
56
-
57
- Code generation for the component modules is triggered when this package - `@aws-cdk/custom-resource-handlers` - is built. Importantly, this framework is also responsible for minifying and bundling the custom resource providers' source code and dependencies. A flag named `minifyAndBundle` can be configured as part of the `ComponentProps` to prevent minifying and bundling the source code for a specific provider. This flag is only needed for python files or for typescript/javascript files containing require imports.
58
-
59
- Once built, all generated code and bundled source code will be written to `@aws-cdk/custom-resource-handlers/dist`. The top level field in the [config](./config.ts) file defining individual aws-cdk modules will be used to create specific directories within `@aws-cdk/custom-resource-handlers/dist` and each component module will be a separate code generated file within these directories named `<component-module>.generated.ts`. As an example, the sample [config](./config.ts) file above would create the following file structure:
60
-
61
- |--- @aws-cdk
62
- | |--- custom-resource-handlers
63
- | | |--- dist
64
- | | | |--- aws-s3
65
- | | | | |--- replica-handler
66
- | | | | | |--- index.js
67
- | | | | |--- replica-provider.generated.ts
68
- | | | |--- aws-stepfunctions-tasks
69
- | | | | |--- eval-nodejs-handler
70
- | | | | | |--- index.js
71
- | | | | |--- role-policy-handler
72
- | | | | | |--- index.py
73
- | | | | |--- eval-nodejs-provider.generated.ts
74
- | | | | |--- role-policy-provider.generated.ts
75
-
76
- The code generated handler framework components are consumable from `aws-cdk-lib/custom-resource-handlers/dist` once `aws-cdk-lib` is built. The file structure of `aws-cdk-lib/custom-resource-handlers/dist` will have the same structure as `@aws-cdk/custom-resource-handlers/dist` with the exception of `core`. To prevent circular dependencies, all handler framework components defined in `core`and any associated source code will be consumable from `aws-cdk-lib/core/dist/core`.
77
-
78
- ## Creating a Handler Framework Component
79
-
80
- Creating a new handler framework component involves three steps:
81
- 1. Add the source code to `@aws-cdk/custom-resource-handlers/lib/<aws-cdk-lib-module>`
82
- 2. Update the [config](./config.ts) file by specifying all required `ComponentProps`.
83
- 3. At this point you can directly build `@aws-cdk/custom-resource-handlers` with `yarn build` to view the generated component in `@aws-cdk/custom-resource-handlers/dist`. Alternatively, you can build `aws-cdk-lib` with `npx lerna run build --scope=aws-cdk-lib --skip-nx-cache` to make the generated component available for use within `aws-cdk-lib`
@@ -4,14 +4,13 @@ import * as cdk from 'aws-cdk-lib';
4
4
  import * as apigw from 'aws-cdk-lib/aws-apigatewayv2';
5
5
 
6
6
  const app = new cdk.App();
7
- const stack = new cdk.Stack(app, 'DualStackHttpApiStack');
7
+ const stack = new cdk.Stack(app, 'DualStackWebsocketApiStack');
8
8
 
9
- new apigw.HttpApi(stack, 'HttpApi', {
10
- routeSelectionExpression: true,
9
+ new apigw.WebSocketApi(stack, 'WebSocketApi', {
11
10
  ipAddressType: apigw.IpAddressType.DUAL_STACK,
12
11
  });
13
12
 
14
- new IntegTest(app, 'DualStackHttpApiInteg', {
13
+ new IntegTest(app, 'DualStackWebsocketApiInteg', {
15
14
  testCases: [stack],
16
15
  });
17
16
 
@@ -6,11 +6,9 @@ import * as apigw from 'aws-cdk-lib/aws-apigatewayv2';
6
6
  const app = new cdk.App();
7
7
  const stack = new cdk.Stack(app, 'aws-cdk-aws-apigatewayv2');
8
8
 
9
- new apigw.HttpApi(stack, 'HttpApi', {
10
- routeSelectionExpression: true,
11
- });
9
+ new apigw.WebSocketApi(stack, 'WebSocketApi');
12
10
 
13
- new IntegTest(app, 'http-api', {
11
+ new IntegTest(app, 'web-socket-api', {
14
12
  testCases: [stack],
15
13
  });
16
14
 
@@ -1,33 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import { IntegTest } from '@aws-cdk/integ-tests-alpha';
3
2
  import * as cdk from 'aws-cdk-lib';
4
- import * as apigwv2 from 'aws-cdk-lib/aws-apigatewayv2';
5
- import * as apigw from 'aws-cdk-lib/aws-apigateway';
6
- import * as logs from 'aws-cdk-lib/aws-logs';
3
+ import * as apigw from 'aws-cdk-lib/aws-apigatewayv2';
7
4
 
8
5
  const app = new cdk.App();
9
- const stack = new cdk.Stack(app, 'aws-cdk-aws-apigatewayv2-http-stage');
6
+ const stack = new cdk.Stack(app, 'aws-cdk-aws-apigatewayv2-websocket-stage');
10
7
 
11
- const testLogGroup = new logs.LogGroup(stack, 'MyLogGroup');
12
-
13
- const httpApi = new apigwv2.HttpApi(stack, 'HttpApi', { createDefaultStage: false });
14
- new apigwv2.HttpStage(stack, 'HttpStageWithProperties', {
15
- httpApi,
8
+ const webSocketApi = new apigw.WebSocketApi(stack, 'WebSocketApi');
9
+ new apigw.WebSocketStage(stack, 'WebSocketStage', {
10
+ webSocketApi,
11
+ stageName: 'dev',
16
12
  throttle: {
17
13
  rateLimit: 1000,
18
14
  burstLimit: 1000,
19
15
  },
20
16
  detailedMetricsEnabled: true,
21
17
  description: 'My Stage',
22
- accessLogSettings: {
23
- destination: new apigwv2.LogGroupLogDestination(testLogGroup),
24
- format: apigw.AccessLogFormat.custom(JSON.stringify({
25
- extendedRequestId: apigw.AccessLogField.contextExtendedRequestId(),
26
- requestTime: apigw.AccessLogField.contextRequestTime(),
27
- })),
28
- },
29
18
  });
30
19
 
31
- new IntegTest(app, 'aws-cdk-aws-apigatewayv2-http-stage-test', {
32
- testCases: [stack],
33
- });
20
+ app.synth();
@@ -1,46 +1,53 @@
1
1
  import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
2
+ import { WebSocketLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
2
3
  import * as iam from 'aws-cdk-lib/aws-iam';
4
+ import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
3
5
  import * as cdk from 'aws-cdk-lib';
4
- import { HttpIamAuthorizer } from 'aws-cdk-lib/aws-apigatewayv2-authorizers';
6
+ import { Stack } from 'aws-cdk-lib';
7
+ import * as integ from '@aws-cdk/integ-tests-alpha';
8
+ import { WebSocketIamAuthorizer } from 'aws-cdk-lib/aws-apigatewayv2-authorizers';
5
9
 
6
- class ExampleComIntegration extends apigatewayv2.HttpRouteIntegration {
7
- public bind(): apigatewayv2.HttpRouteIntegrationConfig {
8
- return {
9
- type: apigatewayv2.HttpIntegrationType.HTTP_PROXY,
10
- payloadFormatVersion: apigatewayv2.PayloadFormatVersion.VERSION_1_0,
11
- method: apigatewayv2.HttpMethod.GET,
12
- uri: 'https://www.example.com/',
13
- };
14
- }
15
- }
16
-
17
- const app = new cdk.App();
10
+ const app = new cdk.App({
11
+ postCliContext: {
12
+ '@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
13
+ },
14
+ });
18
15
  const stack = new cdk.Stack(app, 'IntegApiGatewayV2Iam');
19
16
  const user = new iam.User(stack, 'User');
20
17
  const userAccessKey = new iam.AccessKey(stack, 'UserAccess', {
21
18
  user,
22
19
  });
23
20
 
24
- const httpApi = new apigatewayv2.HttpApi(stack, 'HttpApi', {
25
- defaultAuthorizer: new HttpIamAuthorizer(),
21
+ const handler = new Function(stack, 'auth-function', {
22
+ runtime: Runtime.NODEJS_18_X,
23
+ code: Code.fromInline('exports.handler = () => {return true}'),
24
+ handler: 'index.handler',
26
25
  });
27
26
 
28
- const [fooRoute] = httpApi.addRoutes({
29
- integration: new ExampleComIntegration('examplecom'),
30
- path: '/foo',
27
+ const webSocketApi = new apigatewayv2.WebSocketApi(stack, 'WebSocketApi', {
28
+ connectRouteOptions: {
29
+ integration: new WebSocketLambdaIntegration('WebSocketLambdaIntegration', handler),
30
+ authorizer: new WebSocketIamAuthorizer(),
31
+ },
31
32
  });
32
33
 
33
- fooRoute.grantInvoke(user);
34
-
35
- const [booksRoute] = httpApi.addRoutes({
36
- integration: new ExampleComIntegration('examplecom'),
37
- path: '/books/{book}',
34
+ const arn = Stack.of(stack).formatArn({
35
+ service: 'execute-api',
36
+ resource: webSocketApi.apiId,
38
37
  });
39
38
 
40
- booksRoute.grantInvoke(user);
39
+ user.attachInlinePolicy(new iam.Policy(stack, 'AllowInvoke', {
40
+ statements: [
41
+ new iam.PolicyStatement({
42
+ actions: ['execute-api:Invoke'],
43
+ effect: iam.Effect.ALLOW,
44
+ resources: [arn],
45
+ }),
46
+ ],
47
+ }));
41
48
 
42
- new cdk.CfnOutput(stack, 'API', {
43
- value: httpApi.url!,
49
+ new integ.IntegTest(app, 'ApiGatewayV2WebSocketIamTest', {
50
+ testCases: [stack],
44
51
  });
45
52
 
46
53
  new cdk.CfnOutput(stack, 'TESTACCESSKEYID', {
@@ -55,15 +62,4 @@ new cdk.CfnOutput(stack, 'TESTREGION', {
55
62
  value: stack.region,
56
63
  });
57
64
 
58
- /*
59
- * Stack verification steps:
60
- * * Get cURL version 7.75.0 or later so you can use the --aws-sigv4 option
61
- * * Curl <url>/foo without sigv4 and expect a 403
62
- * * Curl <url>/books/something without sigv4 and expect a 403
63
- * * Curl <url>/foo with sigv4 from the authorized user and expect 200
64
- * * Curl <url>/books/something with sigv4 from the authorized user and expect 200
65
- *
66
- * Reference:
67
- * * Using cURL 7.75.0 or later via the official docker image: docker run --rm curlimages/curl -s -o/dev/null -w"%{http_code}" <url>
68
- * * Args to enable sigv4 with authorized credentials: --user "$TESTACCESSKEYID:$TESTSECRETACCESSKEY" --aws-sigv4 "aws:amz:$TESTREGION:execute-api"
69
- */
65
+ app.synth();
@@ -1,85 +1,72 @@
1
- import * as apigwv2 from 'aws-cdk-lib/aws-apigatewayv2';
1
+ import { HttpMethod, PassthroughBehavior, WebSocketApi, WebSocketStage } from 'aws-cdk-lib/aws-apigatewayv2';
2
2
  import * as sqs from 'aws-cdk-lib/aws-sqs';
3
- import { App, Stack } from 'aws-cdk-lib';
4
- import { HttpSqsIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
5
- import * as integ from '@aws-cdk/integ-tests-alpha';
3
+ import * as iam from 'aws-cdk-lib/aws-iam';
4
+ import { App, Stack, Aws } from 'aws-cdk-lib';
5
+ import { WebSocketAwsIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
6
+ import { IntegTest } from '@aws-cdk/integ-tests-alpha';
6
7
 
7
- const app = new App();
8
- const stack = new Stack(app, 'sqs-integration');
8
+ /*
9
+ * Stack verification steps:
10
+ * 1. Verify manually that the integration has type "AWS"
11
+ */
9
12
 
10
- const queue = new sqs.Queue(stack, 'Queue');
13
+ const app = new App();
14
+ const stack = new Stack(app, 'integ-aws-websocket-sqs-integration');
11
15
 
12
- const httpApi = new apigwv2.HttpApi(stack, 'Api');
13
- httpApi.addRoutes({
14
- path: '/default',
15
- methods: [apigwv2.HttpMethod.POST],
16
- integration: new HttpSqsIntegration('defaultIntegration', {
17
- queue,
18
- }),
19
- });
20
- httpApi.addRoutes({
21
- path: '/send-message',
22
- methods: [apigwv2.HttpMethod.POST],
23
- integration: new HttpSqsIntegration('sendMessageIntegration', {
24
- queue,
25
- subtype: apigwv2.HttpIntegrationSubtype.SQS_SEND_MESSAGE,
26
- }),
27
- });
28
- httpApi.addRoutes({
29
- path: '/receive-message',
30
- methods: [apigwv2.HttpMethod.POST],
31
- integration: new HttpSqsIntegration('receiveMessageIntegration', {
32
- queue,
33
- subtype: apigwv2.HttpIntegrationSubtype.SQS_RECEIVE_MESSAGE,
34
- }),
35
- });
36
- httpApi.addRoutes({
37
- path: '/delete-message',
38
- methods: [apigwv2.HttpMethod.POST],
39
- integration: new HttpSqsIntegration('deleteMessageIntegration', {
40
- queue,
41
- subtype: apigwv2.HttpIntegrationSubtype.SQS_DELETE_MESSAGE,
42
- }),
16
+ const sqsMessageQueue = new sqs.Queue(stack, 'MessageSQSQueue', {
17
+ fifo: true,
18
+ queueName: 'MessageSQSQueue.fifo',
43
19
  });
44
- httpApi.addRoutes({
45
- path: '/purge-queue',
46
- methods: [apigwv2.HttpMethod.POST],
47
- integration: new HttpSqsIntegration('purgeQueueIntegration', {
48
- queue,
49
- subtype: apigwv2.HttpIntegrationSubtype.SQS_PURGE_QUEUE,
50
- }),
20
+
21
+ // API Gateway WebSocket API
22
+ const webSocketApi = new WebSocketApi(stack, 'webSocketApi', {
23
+ description: 'Send websocket data to SQS which is then processed by a Lambda 2',
24
+ routeSelectionExpression: '$request.body.action',
51
25
  });
52
26
 
53
- const integTest = new integ.IntegTest(app, 'SqsIntegrationIntegTest', {
54
- testCases: [stack],
27
+ // Optionally, create a WebSocket stage
28
+ new WebSocketStage(stack, 'DevStage', {
29
+ webSocketApi: webSocketApi,
30
+ stageName: 'dev',
31
+ autoDeploy: true,
55
32
  });
56
33
 
57
- const defaultAssertion = integTest.assertions.httpApiCall(
58
- `${httpApi.apiEndpoint}/default`, {
59
- body: JSON.stringify({ MessageBody: 'Hello World!' }),
60
- method: 'POST',
61
- },
62
- );
63
- defaultAssertion.expect(integ.ExpectedResult.objectLike({ status: 200, statusText: 'OK' }));
34
+ // IAM Role for API Gateway
35
+ const webSocketApiRole = new iam.Role(stack, 'webSocketApiRole', {
36
+ assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'),
37
+ });
64
38
 
65
- const sendMessageAssertion = integTest.assertions.httpApiCall(
66
- `${httpApi.apiEndpoint}/send-message`, {
67
- body: JSON.stringify({ MessageBody: 'Hello World!' }),
68
- method: 'POST',
69
- },
39
+ webSocketApiRole.addToPolicy(
40
+ new iam.PolicyStatement({
41
+ actions: ['sqs:SendMessage'],
42
+ effect: iam.Effect.ALLOW,
43
+ resources: [sqsMessageQueue.queueArn],
44
+ }),
70
45
  );
71
- sendMessageAssertion.expect(integ.ExpectedResult.objectLike({ status: 200, statusText: 'OK' }));
72
46
 
73
- const receiveMessageAssertion = integTest.assertions.httpApiCall(
74
- `${httpApi.apiEndpoint}/receive-message`, {
75
- method: 'POST',
76
- },
77
- );
78
- receiveMessageAssertion.expect(integ.ExpectedResult.objectLike({ status: 200, statusText: 'OK' }));
47
+ webSocketApi.addRoute('$default', {
48
+ integration: new WebSocketAwsIntegration('SQSSendMessage', {
49
+ integrationUri: `arn:aws:apigateway:${Aws.REGION}:sqs:path/${Aws.ACCOUNT_ID}/${sqsMessageQueue.queueName}`,
50
+ integrationMethod: HttpMethod.POST,
51
+ credentialsRole: webSocketApiRole,
52
+ passthroughBehavior: PassthroughBehavior.NEVER,
53
+ templateSelectionExpression: '\\$default',
54
+ requestTemplates: {
55
+ $default: 'Action=SendMessage&MessageGroupId=$input.path(\'$.MessageGroupId\')&MessageDeduplicationId=$context.requestId&MessageAttribute.1.Name=connectionId&MessageAttribute.1.Value.StringValue=$context.connectionId&MessageAttribute.1.Value.DataType=String&MessageAttribute.2.Name=requestId&MessageAttribute.2.Value.StringValue=$context.requestId&MessageAttribute.2.Value.DataType=String&MessageBody=$input.json(\'$\')',
56
+ },
57
+ requestParameters: {
58
+ 'integration.request.header.Content-Type': '\'application/x-www-form-urlencoded\'',
59
+ },
60
+ }),
61
+ });
79
62
 
80
- const purgeQueueAssertion = integTest.assertions.httpApiCall(
81
- `${httpApi.apiEndpoint}/purge-queue`, {
82
- method: 'POST',
63
+ new IntegTest(app, 'apigatewayv2-aws-integration-sqs-integ-test', {
64
+ testCases: [stack],
65
+ cdkCommandOptions: {
66
+ deploy: {
67
+ args: {
68
+ rollback: true,
69
+ },
70
+ },
83
71
  },
84
- );
85
- purgeQueueAssertion.expect(integ.ExpectedResult.objectLike({ status: 200, statusText: 'OK' }));
72
+ });
@@ -2,28 +2,17 @@ import * as cdk from 'aws-cdk-lib';
2
2
  import * as integ from '@aws-cdk/integ-tests-alpha';
3
3
  import * as codedeploy from 'aws-cdk-lib/aws-codedeploy';
4
4
 
5
- const app = new cdk.App({
6
- postCliContext: {
7
- '@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
8
- },
9
- });
10
- const stack = new cdk.Stack(app, 'aws-cdk-codedeploy-lambda-config');
5
+ const app = new cdk.App();
6
+ const stack = new cdk.Stack(app, 'aws-cdk-codedeploy-ecs-config');
11
7
 
12
- new codedeploy.LambdaDeploymentConfig(stack, 'LinearConfig', {
8
+ new codedeploy.EcsDeploymentConfig(stack, 'LinearConfig', {
13
9
  trafficRouting: codedeploy.TrafficRouting.timeBasedLinear({
14
10
  interval: cdk.Duration.minutes(1),
15
11
  percentage: 5,
16
12
  }),
17
13
  });
18
14
 
19
- new codedeploy.CustomLambdaDeploymentConfig(stack, 'CustomConfig', {
20
- interval: cdk.Duration.minutes(1),
21
- percentage: 5,
22
- type: cdk.aws_codedeploy.CustomLambdaDeploymentConfigType.LINEAR,
23
- deploymentConfigName: 'hello',
24
- });
25
-
26
- new integ.IntegTest(app, 'LambdaDeploymentConfigTest', {
15
+ new integ.IntegTest(app, 'EcsDeploymentConfigTest', {
27
16
  testCases: [stack],
28
17
  });
29
18
 
@@ -1,62 +1,240 @@
1
- import * as path from 'path';
2
1
  import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
3
- import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
3
+ import * as ecs from 'aws-cdk-lib/aws-ecs';
4
+ import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
4
5
  import * as cdk from 'aws-cdk-lib';
6
+ import * as integ from '@aws-cdk/integ-tests-alpha';
5
7
  import * as codedeploy from 'aws-cdk-lib/aws-codedeploy';
6
- import { STANDARD_NODEJS_RUNTIME } from '../../../config';
7
8
 
8
- const app = new cdk.App({
9
- postCliContext: {
10
- '@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
9
+ /**
10
+ * Follow these instructions to manually test running a CodeDeploy deployment with the resources provisioned in this stack:
11
+ *
12
+ * 1. Deploy the stack:
13
+ ```
14
+ $ cdk deploy --app 'node integ.deployment-group.js' aws-cdk-codedeploy-ecs-dg
15
+ ```
16
+ *
17
+ * 2. Create a file called `appspec.json` with the following contents, replacing the placeholders with output values from the deployed stack:
18
+ ```
19
+ {
20
+ "version": 0.0,
21
+ "Resources": [
22
+ {
23
+ "TargetService": {
24
+ "Type": "AWS::ECS::Service",
25
+ "Properties": {
26
+ "TaskDefinition": "<PLACEHOLDER - NEW TASK DEFINITION>",
27
+ "LoadBalancerInfo": {
28
+ "ContainerName": "Container",
29
+ "ContainerPort": 80
30
+ },
31
+ "PlatformVersion": "LATEST",
32
+ "NetworkConfiguration": {
33
+ "awsvpcConfiguration": {
34
+ "subnets": [
35
+ "<PLACEHOLDER - SUBNET 1 ID>",
36
+ "<PLACEHOLDER - SUBNET 2 ID>",
37
+ ],
38
+ "securityGroups": [
39
+ "<PLACEHOLDER - SECURITY GROUP ID>"
40
+ ],
41
+ "assignPublicIp": "DISABLED"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ]
48
+ }
49
+ ```
50
+ *
51
+ * 3. Start the deployment:
52
+ ```
53
+ $ appspec=$(jq -R -s '.' < appspec.json | sed 's/\\n//g')
54
+ $ aws deploy create-deployment \
55
+ --application-name <PLACEHOLDER - CODEDEPLOY APPLICATION NAME> \
56
+ --deployment-group-name <PLACEHOLDER - CODEDEPLOY DEPLOYMENT GROUP NAME> \
57
+ --description "AWS CDK integ test" \
58
+ --revision revisionType=AppSpecContent,appSpecContent={content="$appspec"}
59
+ ```
60
+ *
61
+ * 4. Wait for the deployment to complete successfully, providing the deployment ID from the previous step:
62
+ ```
63
+ $ aws deploy wait deployment-successful --deployment-id <PLACEHOLDER - DEPLOYMENT ID>
64
+ ```
65
+ *
66
+ * 5. Destroy the stack:
67
+ ```
68
+ $ cdk destroy --app 'node integ.deployment-group.js' aws-cdk-codedeploy-ecs-dg
69
+ ```
70
+ */
71
+
72
+ const app = new cdk.App();
73
+ const stack = new cdk.Stack(app, 'aws-cdk-codedeploy-ecs-dg');
74
+
75
+ // Network infrastructure
76
+ const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2, restrictDefaultSecurityGroup: false });
77
+
78
+ // ECS service
79
+ const cluster = new ecs.Cluster(stack, 'EcsCluster', {
80
+ vpc,
81
+ });
82
+ const taskDefinition = new ecs.FargateTaskDefinition(stack, 'TaskDef');
83
+ taskDefinition.addContainer('Container', {
84
+ image: ecs.ContainerImage.fromRegistry('public.ecr.aws/ecs-sample-image/amazon-ecs-sample:latest'),
85
+ portMappings: [{ containerPort: 80 }],
86
+ });
87
+ const service = new ecs.FargateService(stack, 'FargateService', {
88
+ cluster,
89
+ taskDefinition,
90
+ deploymentController: {
91
+ type: ecs.DeploymentControllerType.CODE_DEPLOY,
11
92
  },
12
93
  });
13
- const stack = new cdk.Stack(app, 'aws-cdk-codedeploy-lambda');
14
94
 
15
- const handler = new lambda.Function(stack, 'Handler', {
16
- code: lambda.Code.fromAsset(path.join(__dirname, 'handler')),
17
- handler: 'index.handler',
18
- runtime: STANDARD_NODEJS_RUNTIME,
95
+ // A second task definition for testing a CodeDeploy deployment of the ECS service to a new task definition
96
+ const taskDefinition2 = new ecs.FargateTaskDefinition(stack, 'TaskDef2');
97
+ taskDefinition2.addContainer('Container', {
98
+ image: ecs.ContainerImage.fromRegistry('public.ecr.aws/ecs-sample-image/amazon-ecs-sample:latest'),
99
+ portMappings: [{ containerPort: 80 }],
19
100
  });
20
- const version = handler.currentVersion;
21
- const blueGreenAlias = new lambda.Alias(stack, 'Alias', {
22
- aliasName: 'alias',
23
- version,
101
+ service.node.addDependency(taskDefinition2);
102
+
103
+ // Load balancer
104
+ const loadBalancer = new elbv2.ApplicationLoadBalancer(stack, 'ServiceLB', {
105
+ vpc,
106
+ internetFacing: false,
24
107
  });
25
108
 
26
- const preHook = new lambda.Function(stack, 'PreHook', {
27
- code: lambda.Code.fromAsset(path.join(__dirname, 'preHook')),
28
- handler: 'index.handler',
29
- runtime: STANDARD_NODEJS_RUNTIME,
109
+ // Listeners
110
+ const prodListener = loadBalancer.addListener('ProdListener', {
111
+ port: 80, // port for production traffic
112
+ protocol: elbv2.ApplicationProtocol.HTTP,
30
113
  });
31
- const postHook = new lambda.Function(stack, 'PostHook', {
32
- code: lambda.Code.fromAsset(path.join(__dirname, 'postHook')),
33
- handler: 'index.handler',
34
- runtime: STANDARD_NODEJS_RUNTIME,
114
+ const testListener = loadBalancer.addListener('TestListener', {
115
+ port: 9002, // port for testing
116
+ protocol: elbv2.ApplicationProtocol.HTTP,
35
117
  });
36
118
 
37
- new codedeploy.LambdaDeploymentGroup(stack, 'BlueGreenDeployment', {
38
- alias: blueGreenAlias,
39
- deploymentConfig: codedeploy.LambdaDeploymentConfig.LINEAR_10PERCENT_EVERY_1MINUTE,
40
- alarms: [
41
- new cloudwatch.Alarm(stack, 'BlueGreenErrors', {
42
- comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
43
- threshold: 1,
44
- evaluationPeriods: 1,
45
- metric: blueGreenAlias.metricErrors(),
119
+ // Target groups
120
+ const blueTG = prodListener.addTargets('BlueTG', {
121
+ port: 80,
122
+ protocol: elbv2.ApplicationProtocol.HTTP,
123
+ targets: [
124
+ service.loadBalancerTarget({
125
+ containerName: 'Container',
126
+ containerPort: 80,
46
127
  }),
47
128
  ],
48
- preHook,
49
- postHook,
129
+ deregistrationDelay: cdk.Duration.seconds(30),
130
+ healthCheck: {
131
+ interval: cdk.Duration.seconds(5),
132
+ healthyHttpCodes: '200',
133
+ healthyThresholdCount: 2,
134
+ unhealthyThresholdCount: 3,
135
+ timeout: cdk.Duration.seconds(4),
136
+ },
50
137
  });
51
138
 
52
- const secondAlias = new lambda.Alias(stack, 'SecondAlias', {
53
- aliasName: 'secondAlias',
54
- version,
139
+ const greenTG = new elbv2.ApplicationTargetGroup(stack, 'GreenTG', {
140
+ vpc,
141
+ port: 80,
142
+ protocol: elbv2.ApplicationProtocol.HTTP,
143
+ targetType: elbv2.TargetType.IP,
144
+ deregistrationDelay: cdk.Duration.seconds(30),
145
+ healthCheck: {
146
+ interval: cdk.Duration.seconds(5),
147
+ healthyHttpCodes: '200',
148
+ healthyThresholdCount: 2,
149
+ unhealthyThresholdCount: 3,
150
+ timeout: cdk.Duration.seconds(4),
151
+ },
152
+ });
153
+
154
+ testListener.addTargetGroups('GreenTGTest', {
155
+ targetGroups: [greenTG],
55
156
  });
56
157
 
57
- new codedeploy.LambdaDeploymentGroup(stack, 'SecondDeployment', {
58
- alias: secondAlias,
59
- deploymentConfig: codedeploy.LambdaDeploymentConfig.CANARY_10PERCENT_5MINUTES,
158
+ prodListener.node.addDependency(greenTG);
159
+ testListener.node.addDependency(blueTG);
160
+ service.node.addDependency(testListener);
161
+ service.node.addDependency(greenTG);
162
+
163
+ // Alarms: monitor 500s and unhealthy hosts on target groups
164
+ const blueUnhealthyHosts = new cloudwatch.Alarm(stack, 'BlueUnhealthyHosts', {
165
+ alarmName: stack.stackName + '-Unhealthy-Hosts-Blue',
166
+ metric: blueTG.metricUnhealthyHostCount(),
167
+ threshold: 1,
168
+ evaluationPeriods: 2,
169
+ });
170
+
171
+ const blueApiFailure = new cloudwatch.Alarm(stack, 'Blue5xx', {
172
+ alarmName: stack.stackName + '-Http-500-Blue',
173
+ metric: blueTG.metricHttpCodeTarget(
174
+ elbv2.HttpCodeTarget.TARGET_5XX_COUNT,
175
+ { period: cdk.Duration.minutes(1) },
176
+ ),
177
+ threshold: 1,
178
+ evaluationPeriods: 1,
179
+ });
180
+
181
+ const greenUnhealthyHosts = new cloudwatch.Alarm(stack, 'GreenUnhealthyHosts', {
182
+ alarmName: stack.stackName + '-Unhealthy-Hosts-Green',
183
+ metric: greenTG.metricUnhealthyHostCount(),
184
+ threshold: 1,
185
+ evaluationPeriods: 2,
186
+ });
187
+
188
+ const greenApiFailure = new cloudwatch.Alarm(stack, 'Green5xx', {
189
+ alarmName: stack.stackName + '-Http-500-Green',
190
+ metric: greenTG.metricHttpCodeTarget(
191
+ elbv2.HttpCodeTarget.TARGET_5XX_COUNT,
192
+ { period: cdk.Duration.minutes(1) },
193
+ ),
194
+ threshold: 1,
195
+ evaluationPeriods: 1,
196
+ });
197
+
198
+ // Deployment group
199
+ const deploymentConfig = new codedeploy.EcsDeploymentConfig(stack, 'CanaryConfig', {
200
+ trafficRouting: codedeploy.TrafficRouting.timeBasedCanary({
201
+ interval: cdk.Duration.minutes(1),
202
+ percentage: 20,
203
+ }),
204
+ });
205
+
206
+ const dg = new codedeploy.EcsDeploymentGroup(stack, 'BlueGreenDG', {
207
+ alarms: [
208
+ blueUnhealthyHosts,
209
+ blueApiFailure,
210
+ greenUnhealthyHosts,
211
+ greenApiFailure,
212
+ ],
213
+ service,
214
+ blueGreenDeploymentConfig: {
215
+ blueTargetGroup: blueTG,
216
+ greenTargetGroup: greenTG,
217
+ listener: prodListener,
218
+ testListener,
219
+ terminationWaitTime: cdk.Duration.minutes(1),
220
+ },
221
+ deploymentConfig,
222
+ autoRollback: {
223
+ stoppedDeployment: true,
224
+ },
225
+ ignoreAlarmConfiguration: true,
226
+ });
227
+
228
+ // Outputs to use for manual testing
229
+ new cdk.CfnOutput(stack, 'NewTaskDefinition', { value: taskDefinition2.taskDefinitionArn });
230
+ new cdk.CfnOutput(stack, 'Subnet1Id', { value: vpc.privateSubnets[0].subnetId });
231
+ new cdk.CfnOutput(stack, 'Subnet2Id', { value: vpc.privateSubnets[1].subnetId });
232
+ new cdk.CfnOutput(stack, 'SecurityGroupId', { value: service.connections.securityGroups[0].securityGroupId });
233
+ new cdk.CfnOutput(stack, 'CodeDeployApplicationName', { value: dg.application.applicationName });
234
+ new cdk.CfnOutput(stack, 'CodeDeployDeploymentGroupName', { value: dg.deploymentGroupName });
235
+
236
+ new integ.IntegTest(app, 'EcsDeploymentGroupTest', {
237
+ testCases: [stack],
60
238
  });
61
239
 
62
240
  app.synth();
@@ -1,124 +1,122 @@
1
- import * as databrew from 'aws-cdk-lib/aws-databrew';
1
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
2
+ import * as eks from 'aws-cdk-lib/aws-eks';
3
+ import { AwsAuthMapping } from 'aws-cdk-lib/aws-eks';
2
4
  import * as iam from 'aws-cdk-lib/aws-iam';
3
- import * as s3 from 'aws-cdk-lib/aws-s3';
4
5
  import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
5
6
  import * as cdk from 'aws-cdk-lib';
6
- import { GlueDataBrewStartJobRun } from 'aws-cdk-lib/aws-stepfunctions-tasks';
7
+ import { Aws } from 'aws-cdk-lib';
8
+ import * as integ from '@aws-cdk/integ-tests-alpha';
9
+ import { KubectlV31Layer } from '@aws-cdk/lambda-layer-kubectl-v31';
10
+ import { EmrContainersStartJobRun, ReleaseLabel, VirtualClusterInput } from 'aws-cdk-lib/aws-stepfunctions-tasks';
11
+ import { EC2_RESTRICT_DEFAULT_SECURITY_GROUP } from 'aws-cdk-lib/cx-api';
7
12
 
8
- /*
13
+ /**
9
14
  * Stack verification steps:
10
- * * aws stepfunctions start-execution --state-machine-arn <deployed state machine arn> : should return execution arn
11
- * * aws stepfunctions describe-execution --execution-arn <exection-arn generated before> : should return status as SUCCEEDED
15
+ * Everything in the link below must be setup before running the state machine.
16
+ * @see https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-enable-IAM.html
17
+ * aws stepfunctions start-execution --state-machine-arn <deployed state machine arn> : should return execution arn
18
+ * aws stepfunctions describe-execution --execution-arn <exection-arn generated before> : should return status as SUCCEEDED
12
19
  */
13
20
 
14
- class GlueDataBrewJobStack extends cdk.Stack {
15
- constructor(scope: cdk.App, id: string, props: cdk.StackProps = {}) {
16
- super(scope, id, props);
21
+ const app = new cdk.App({
22
+ postCliContext: {
23
+ '@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
24
+ '@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy': false,
25
+ },
26
+ });
27
+ const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-emr-containers-start-job-run');
28
+ stack.node.setContext(EC2_RESTRICT_DEFAULT_SECURITY_GROUP, false);
17
29
 
18
- const region = this.region;
30
+ const eksCluster = new eks.Cluster(stack, 'integration-test-eks-cluster', {
31
+ version: eks.KubernetesVersion.V1_30,
32
+ defaultCapacity: 3,
33
+ defaultCapacityInstance: ec2.InstanceType.of(ec2.InstanceClass.M5, ec2.InstanceSize.XLARGE),
34
+ kubectlLayer: new KubectlV31Layer(stack, 'KubectlLayer'),
35
+ });
19
36
 
20
- const outputBucket = new s3.Bucket(this, 'JobOutputBucket', {
21
- removalPolicy: cdk.RemovalPolicy.DESTROY,
22
- });
23
-
24
- const role = new iam.Role(this, 'DataBrew Role', {
25
- managedPolicies: [{
26
- managedPolicyArn: 'arn:aws:iam::aws:policy/service-role/AWSGlueDataBrewServiceRole',
27
- }],
28
- path: '/',
29
- assumedBy: new iam.ServicePrincipal('databrew.amazonaws.com'),
30
- inlinePolicies: {
31
- DataBrewPolicy: iam.PolicyDocument.fromJson({
32
- Statement: [{
33
- Effect: 'Allow',
34
- Action: [
35
- 's3:GetObject',
36
- 's3:PutObject',
37
- 's3:DeleteObject',
38
- 's3:ListBucket',
39
- ],
40
- Resource: [
41
- `arn:aws:s3:::databrew-public-datasets-${region}/*`,
42
- `arn:aws:s3:::databrew-public-datasets-${region}`,
43
- `${outputBucket.bucketArn}/*`,
44
- `${outputBucket.bucketArn}`,
45
- ],
46
- }],
47
- }),
37
+ const virtualCluster = new cdk.CfnResource(stack, 'Virtual Cluster', {
38
+ type: 'AWS::EMRContainers::VirtualCluster',
39
+ properties: {
40
+ ContainerProvider: {
41
+ Id: eksCluster.clusterName,
42
+ Info: {
43
+ EksInfo: {
44
+ Namespace: 'default',
45
+ },
48
46
  },
49
- });
47
+ Type: 'EKS',
48
+ },
49
+ Name: 'Virtual-Cluster-Name',
50
+ },
51
+ });
50
52
 
51
- const recipe = new databrew.CfnRecipe(this, 'DataBrew Recipe', {
52
- name: 'recipe-1',
53
- steps: [
54
- {
55
- action: {
56
- operation: 'UPPER_CASE',
57
- parameters: {
58
- sourceColumn: 'description',
59
- },
60
- },
61
- },
62
- {
63
- action: {
64
- operation: 'DELETE',
65
- parameters: {
66
- sourceColumn: 'doc_id',
67
- },
68
- },
69
- },
70
- ],
71
- });
53
+ const emrRole = eksCluster.addManifest('emrRole', {
54
+ apiVersion: 'rbac.authorization.k8s.io/v1',
55
+ kind: 'Role',
56
+ metadata: { name: 'emr-containers', namespace: 'default' },
57
+ rules: [
58
+ { apiGroups: [''], resources: ['namespaces'], verbs: ['get'] },
59
+ { apiGroups: [''], resources: ['serviceaccounts', 'services', 'configmaps', 'events', 'pods', 'pods/log'], verbs: ['get', 'list', 'watch', 'describe', 'create', 'edit', 'delete', 'deletecollection', 'annotate', 'patch', 'label'] },
60
+ { apiGroups: [''], resources: ['secrets'], verbs: ['create', 'patch', 'delete', 'watch'] },
61
+ { apiGroups: ['apps'], resources: ['statefulsets', 'deployments'], verbs: ['get', 'list', 'watch', 'describe', 'create', 'edit', 'delete', 'annotate', 'patch', 'label'] },
62
+ { apiGroups: ['batch'], resources: ['jobs'], verbs: ['get', 'list', 'watch', 'describe', 'create', 'edit', 'delete', 'annotate', 'patch', 'label'] },
63
+ { apiGroups: ['extensions'], resources: ['ingresses'], verbs: ['get', 'list', 'watch', 'describe', 'create', 'edit', 'delete', 'annotate', 'patch', 'label'] },
64
+ { apiGroups: ['rbac.authorization.k8s.io'], resources: ['roles', 'rolebindings'], verbs: ['get', 'list', 'watch', 'describe', 'create', 'edit', 'delete', 'deletecollection', 'annotate', 'patch', 'label'] },
65
+ ],
66
+ });
72
67
 
73
- const dataset = new databrew.CfnDataset(this, 'DataBrew Dataset', {
74
- input: {
75
- s3InputDefinition: {
76
- bucket: `databrew-public-datasets-${region}`,
77
- key: 'votes.csv',
78
- },
79
- },
80
- name: 'dataset-1',
81
- });
68
+ const emrRoleBind = eksCluster.addManifest('emrRoleBind', {
69
+ apiVersion: 'rbac.authorization.k8s.io/v1',
70
+ kind: 'RoleBinding',
71
+ metadata: { name: 'emr-containers', namespace: 'default' },
72
+ subjects: [{ kind: 'User', name: 'emr-containers', apiGroup: 'rbac.authorization.k8s.io' }],
73
+ roleRef: { kind: 'Role', name: 'emr-containers', apiGroup: 'rbac.authorization.k8s.io' },
74
+ });
82
75
 
83
- const project = new databrew.CfnProject(this, 'DataBrew Project', {
84
- name: 'project-1',
85
- roleArn: role.roleArn,
86
- datasetName: dataset.name,
87
- recipeName: recipe.name,
88
- });
89
- project.addDependency(dataset);
90
- project.addDependency(recipe);
76
+ emrRoleBind.node.addDependency(emrRole);
91
77
 
92
- const job = new databrew.CfnJob(this, 'DataBrew Job', {
93
- name: 'job-1',
94
- type: 'RECIPE',
95
- projectName: project.name,
96
- roleArn: role.roleArn,
97
- outputs: [{
98
- location: {
99
- bucket: outputBucket.bucketName,
100
- },
101
- }],
102
- });
103
- job.addDependency(project);
78
+ const emrServiceRole = iam.Role.fromRoleArn(stack, 'emrServiceRole', 'arn:aws:iam::'+Aws.ACCOUNT_ID+':role/AWSServiceRoleForAmazonEMRContainers');
79
+ const authMapping: AwsAuthMapping = { groups: [], username: 'emr-containers' };
80
+ eksCluster.awsAuth.addRoleMapping(emrServiceRole, authMapping);
81
+
82
+ virtualCluster.node.addDependency(emrRoleBind);
83
+ virtualCluster.node.addDependency(eksCluster.awsAuth);
104
84
 
105
- const startGlueDataBrewJob = new GlueDataBrewStartJobRun(this, 'Start DataBrew Job run', {
106
- name: job.name,
107
- });
85
+ const startJobRunJob = new EmrContainersStartJobRun(stack, 'Start a Job Run', {
86
+ virtualCluster: VirtualClusterInput.fromVirtualClusterId(virtualCluster.getAtt('Id').toString()),
87
+ releaseLabel: ReleaseLabel.EMR_6_2_0,
88
+ jobName: 'EMR-Containers-Job',
89
+ jobDriver: {
90
+ sparkSubmitJobDriver: {
91
+ entryPoint: sfn.TaskInput.fromText('local:///usr/lib/spark/examples/src/main/python/pi.py'),
92
+ entryPointArguments: sfn.TaskInput.fromObject(['2']),
93
+ sparkSubmitParameters: '--conf spark.driver.memory=512M --conf spark.kubernetes.driver.request.cores=0.2 --conf spark.kubernetes.executor.request.cores=0.2 --conf spark.sql.shuffle.partitions=60 --conf spark.dynamicAllocation.enabled=false',
94
+ },
95
+ },
96
+ });
108
97
 
109
- const chain = sfn.Chain.start(startGlueDataBrewJob);
98
+ const chain = sfn.Chain.start(startJobRunJob);
110
99
 
111
- const sm = new sfn.StateMachine(this, 'StateMachine', {
112
- definition: chain,
113
- timeout: cdk.Duration.seconds(30),
114
- });
100
+ const sm = new sfn.StateMachine(stack, 'StateMachine', {
101
+ definition: chain,
102
+ timeout: cdk.Duration.seconds(1000),
103
+ });
115
104
 
116
- new cdk.CfnOutput(this, 'stateMachineArn', {
117
- value: sm.stateMachineArn,
118
- });
119
- }
120
- }
105
+ new cdk.CfnOutput(stack, 'stateMachineArn', {
106
+ value: sm.stateMachineArn,
107
+ });
108
+
109
+ new integ.IntegTest(app, 'aws-stepfunctions-tasks-emr-containers-start-job-run-integ', {
110
+ testCases: [stack],
111
+ // Test includes assets that are updated weekly. If not disabled, the upgrade PR will fail.
112
+ diffAssets: false,
113
+ cdkCommandOptions: {
114
+ deploy: {
115
+ args: {
116
+ rollback: true,
117
+ },
118
+ },
119
+ },
120
+ });
121
121
 
122
- const app = new cdk.App();
123
- new GlueDataBrewJobStack(app, 'aws-stepfunctions-tasks-databrew-start-job-run-integ');
124
122
  app.synth();
@@ -104,6 +104,8 @@ const puppeteer90 = createCanaryByRuntimes(Runtime.SYNTHETICS_NODEJS_PUPPETEER_9
104
104
  const puppeteer91 = createCanaryByRuntimes(Runtime.SYNTHETICS_NODEJS_PUPPETEER_9_1);
105
105
  const playwright10 = createCanaryByRuntimes(Runtime.SYNTHETICS_NODEJS_PLAYWRIGHT_1_0);
106
106
  const playwright10_with_handler_name = createCanaryByRuntimes(Runtime.SYNTHETICS_NODEJS_PLAYWRIGHT_1_0, 'playwright/canary.handler');
107
+ const playwright20 = createCanaryByRuntimes(Runtime.SYNTHETICS_NODEJS_PLAYWRIGHT_2_0);
108
+ const playwright20_with_handler_name = createCanaryByRuntimes(Runtime.SYNTHETICS_NODEJS_PLAYWRIGHT_2_0, 'playwright/canary.handler');
107
109
 
108
110
  const selenium21 = createCanaryByRuntimes(Runtime.SYNTHETICS_PYTHON_SELENIUM_2_1);
109
111
  const selenium30 = createCanaryByRuntimes(Runtime.SYNTHETICS_PYTHON_SELENIUM_3_0);
@@ -130,6 +132,8 @@ const test = new IntegTest(app, 'IntegCanaryTest', {
130
132
  puppeteer91,
131
133
  playwright10,
132
134
  playwright10_with_handler_name,
135
+ playwright20,
136
+ playwright20_with_handler_name,
133
137
  selenium21,
134
138
  selenium30,
135
139
  selenium40,
@@ -188,7 +188,8 @@ The following json shows the current recommended set of flags, as `cdk init` wou
188
188
  "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": true,
189
189
  "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": true,
190
190
  "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": true,
191
- "@aws-cdk/aws-s3:publicAccessBlockedByDefault": true
191
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": true,
192
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": true
192
193
  }
193
194
  }
194
195
  ```
@@ -225,7 +226,6 @@ are migrating a v1 CDK project to v2, explicitly set any of these flags which do
225
226
 
226
227
  | Flag | Summary | Type | Since | v1 default | v2 default |
227
228
  | ----- | ----- | ----- | ----- | ----- | ----- |
228
- | [@aws-cdk/aws-lambda:useCdkManagedLogGroup](#aws-cdkaws-lambdausecdkmanagedloggroup) | When enabled, CDK creates and manages loggroup for the lambda function | new default | | `false` | `true` |
229
229
  | [@aws-cdk/core:newStyleStackSynthesis](#aws-cdkcorenewstylestacksynthesis) | Switch to new stack synthesis method which enables CI/CD | fix | 1.39.0 | `false` | `true` |
230
230
  | [@aws-cdk/core:stackRelativeExports](#aws-cdkcorestackrelativeexports) | Name exports based on the construct paths relative to the stack, rather than the global construct path | fix | 1.58.0 | `false` | `true` |
231
231
  | [@aws-cdk/aws-rds:lowercaseDbIdentifier](#aws-cdkaws-rdslowercasedbidentifier) | Force lowercasing of RDS Cluster names in CDK | fix | 1.97.0 | `false` | `true` |
@@ -485,7 +485,7 @@ Refer aws-lambda/README.md for more details on Customizing Log Group creation.
485
485
  | Since | Default | Recommended |
486
486
  | ----- | ----- | ----- |
487
487
  | (not in v1) | | |
488
- | V2_NEXT | `true` | `true` |
488
+ | V2_NEXT | `false` | `true` |
489
489
 
490
490
  **Compatibility with old behavior:** Disable the feature flag to let lambda service create logGroup or specify logGroup or logRetention
491
491
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: konokenj.cdk-api-mcp-server
3
- Version: 0.2.4
3
+ Version: 0.11.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
@@ -1,4 +1,4 @@
1
- cdk_api_mcp_server/__about__.py,sha256=0szfKEU5ZuacFMdiLx41G7WJUoec_X8zt8q0OlzSGR4,128
1
+ cdk_api_mcp_server/__about__.py,sha256=2KyZ8E8mATEVC5ziWVSqwGzJlIXuhtG1qGriAUjicX8,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
@@ -39,7 +39,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-s3tables-alpha/READ
39
39
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-sagemaker-alpha/README.md,sha256=BQdCUpvxYNtLdbaHqcZ1RXwFGv3iN8TQcBcPRRuYXKA,9936
40
40
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-servicecatalogappregistry-alpha/README.md,sha256=HmOM14_-P6x_e0UoI1HQ1IbY375T1Pj-xS4rEL1zmdg,13655
41
41
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/cfnspec/README.md,sha256=nnoF99zdHuBLVTMCVB9k3-eLiqjS6XTETxnIi5hW0Y8,164
42
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/custom-resource-handlers/README.md,sha256=uLnfhdbh8Ct0Vt9KAvaKgpC6ikbed0WigW4GR5NevdA,7123
42
+ cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/custom-resource-handlers/README.md,sha256=QctOoyGt6AqVWeFhRwpkCSxHZ1XFWj_nCKlkJHDFock,965
43
43
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/example-construct-library/README.md,sha256=vnVXyvtN9ICph68sw2y6gkdD_gmas0PiUa9TkwNckWQ,4501
44
44
  cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/integ-tests-alpha/README.md,sha256=Y5CjbYjAEwqFEyPbbm4hkluN9X9hScg4Q2h4X1MV864,17485
45
45
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/README.md/README.md,sha256=--qULBmqJB9AEPhZvZePzgS6c14VtlAclTtgSYWMPNQ,62385
@@ -91,12 +91,12 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigateway/integ
91
91
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/README.md,sha256=1-OkB_ogxg6zGBEpyTZsLRYIVaDsqX5PWmZtP5gplnc,23389
92
92
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-apikey.ts,sha256=_hI2T1TIom2UmrXqX9oWSkFLb0QNPAuIb3d-wR2YmpY,370
93
93
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-domain-name.ts,sha256=il_sIMzx1KgsYstJrcxz2XYVq8DlpTj8oViQX_PLiDk,1960
94
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-dualstack.ts,sha256=Pt49E3MBe-893LLwAi3GZGtG8FzWZCljuNPBBf4dJF4,454
94
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-dualstack.ts,sha256=BFbAzMWIdS5w4Bcp30Ow9YSRo8qJWhL18w9PQo4U6rU,440
95
95
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-grant-invoke.ts,sha256=oleJiGqC5-cJWoEIIJlvpqnIc3_QsKZ5JP3GbIYuTDI,996
96
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api.ts,sha256=yi628XnzVnYQM9SJDRcOkW3YgTg6hOF-G30MalCEcG4,395
97
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.stage.ts,sha256=58YP1S7MBucXq3IxXhApBHSYIc5lPPI3gHvz5CAbLLc,1102
96
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api.ts,sha256=FmeK1cJiFYTvmQsAbVX5OhA_Qx6m_EwgGuKCC5NCevA,372
97
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.stage.ts,sha256=g3YJqt3ZJ2EG7XsDZk6IXZWkH8sbUyYOoDyU4RPzma8,513
98
98
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/README.md,sha256=O5FyfQtU2qhYokDH9MZbgFejKz7zD6UTwSeX1pcLky4,13049
99
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.iam.ts,sha256=scXuEL2ClFuCskKTqOGhfGREf3vbWIHHhESMYB2k9PA,2217
99
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.iam.ts,sha256=xFwDRQ4h4Ain70zCeaCfytNqNnSvUDCmFK-RjCwNYqk,1879
100
100
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.lambda.ts,sha256=JgNyEtPvA4xmDIv14LU_oBJTenHaY800y79W1CUrwvs,2553
101
101
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.user-pool.ts,sha256=7uDcNz_PCl7lPvWpmUmu4VeMZX6vOmA0SRU3MPDySc0,2243
102
102
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/README.md,sha256=RrE48rDPzYDTllskAB9347bOYGZ1ifK8PRD5AdouQC8,16726
@@ -111,7 +111,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-int
111
111
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.nlb.ts,sha256=juUi3sFAz45kj7C45R75mrO4raoDxo84igSSlBZU43I,1531
112
112
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.route-response.ts,sha256=szSOJ7wrIWSmkyBureOgNIiItQOzndpGal0bcgzvH_w,587
113
113
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.service-discovery.ts,sha256=lxpOqF2wMXTlOYuDdH1NyzI_KwQ5JGGMCL3X6DqxEPM,970
114
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.sqs.ts,sha256=dvl_g1DeGQU68tLlau_AaQp1yQHSACKxrFQEfPst92E,2686
114
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.sqs.ts,sha256=JTGT2kWVU2JYQjcuYngUZ9fSDuRaFoeJxFtzSdlhiyg,2597
115
115
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.stepfunctions.ts,sha256=OqIwDUGJ_R8yGeKkGJ3ekE2XCjFkJu9QZ_0lBdDV2x4,1872
116
116
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-appconfig/README.md,sha256=kOqEwd5fUvXfiPQie3mJFifTpkrSTRYXeqDir_hf50Q,24067
117
117
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-appconfig/integ.application.ts,sha256=Jjf2pgocptCbVVU-47bW_cukjr36zn3-lusj5qwdMak,782
@@ -359,10 +359,10 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codecommit/integ
359
359
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codecommit/integ.repository-notification.ts,sha256=zyZlZYC5LNd4Iz8iI3cs4n2p8EA9b1MRA_KmwCx_Jro,584
360
360
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codecommit/test.md,sha256=2LjLvsHtFaZnllCuVhsSfch5NA07a7IQX8aNOXSJzV4,6
361
361
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/README.md,sha256=UPAuRpA3r6Gp-I21SItBuDBGEVmTsU4SGLGZQ7oo37s,28780
362
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-config.ts,sha256=6sq2RkWOxDJcbBBjhsUiE2ZyHKlCHHpxq56nx-3azxE,850
362
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-config.ts,sha256=GYAJmSQewkq8t4l2XKiMYEZyNILAU9-bs4VTUPRcWCk,528
363
363
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group-multiple-load-balancers.ts,sha256=bvpCWCbiU37SrchCxhqNCYAg4n5iMB1YD8nonC8PFM4,1789
364
364
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group-zonal-config.ts,sha256=zBjlWssD0Nw747xZbD5DopZGuzKI0RdFF2ix8jsthCQ,1870
365
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group.ts,sha256=VJk8wM2rIu4C40K8879_mXpnlHRplQBprkSfqTRbbGk,1922
365
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group.ts,sha256=jb8dA2JWi35ALk9ijdfGYMiSIpYjwieooSkBMpz2-wo,7486
366
366
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codeguruprofiler/README.md,sha256=C142GNHzGQEHSYbQF2IAHxS1rLQVfqOpAcEWkWu4nVk,1304
367
367
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codeguruprofiler/integ.profiler-group-import-functions.ts,sha256=3USRDp0TZCaWPHTgzFStQmQn7xVU_R4CugDcZYxBZgE,3090
368
368
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codeguruprofiler/integ.profiler-group.ts,sha256=KyoL5cUg7WXf1W1Z9zu1lPVvk2cbqchGRQX-YXqr4xY,950
@@ -1269,7 +1269,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-ta
1269
1269
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run-dynamic-worker-type.ts,sha256=IU_m9oi1kEpnaw4Cmd1HP_uEiZ5VAZtFgUHnvfgrYCM,3394
1270
1270
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run-execution-class.ts,sha256=HaeRjJ8puloRjs8UoK3TdPQqKpxRB_hI5mNvYIhy78c,3043
1271
1271
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run-worker.ts,sha256=7Ozu9ZxWbMd3zDlfwUBYqost-r7EjtyrNGlNaMPJX6A,3074
1272
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts,sha256=J3FaL1Pe4t_xYfidRx76gVQ0tJk_D4Yfd64EOYNfi1Y,3603
1272
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts,sha256=NkBLWXR17j-Ed_eNfxzTaD3hn_3RDx2p7aACXro8PkA,5501
1273
1273
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-query-execution-result-reuse-configuration.ts,sha256=aKbW1fcwi8KXDmRVWOsGKtyM4LV61lw1_-9zRP6lfKU,2169
1274
1274
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-query-execution.ts,sha256=JG39ZHRFJJtUEbaB0jJq0zORPquZaeeL_JWjUBLdmKU,1494
1275
1275
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.stop-query-execution.ts,sha256=Ye5pPBF2mRdhauo8SLmLHXb_5RobRw8L58qdZXPPP90,1588
@@ -1282,7 +1282,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ
1282
1282
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary-auto-delete-lambda.ts,sha256=epAsfPC1zL0Kb0RKv9msG2gkCvV83ka6Lvpj1nupd84,2360
1283
1283
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary-provisioned-resource-cleanup.ts,sha256=6Y6sDsl88gyAJItkXlye8mjTN9n1tU61LqWusp_K0lo,1892
1284
1284
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary-run-config.ts,sha256=i12uJ6csuikhj12WPeEmhbMXXhE1h-oCVtKUzmVDkOU,1037
1285
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary.ts,sha256=1-um05CoQfw6jCctEkq0GhljpzbdNxjxR3yn1cXD9W0,4801
1285
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary.ts,sha256=zSg1PySIfhP61dOFDNHzB4FzCWMV9ljMswBjVwOnjFA,5072
1286
1286
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.vpc.ts,sha256=SQ6nTKnZVGTdW74COWLoGrbP63SvfQwejjOFEND5kgM,848
1287
1287
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cloud-assembly-schema/README.md,sha256=Z2oUXaazqWdn3UQYUAm7uNYB_rJRHS_sec1FrPaIJ2Q,2911
1288
1288
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cloudformation-include/README.md,sha256=M6z0g5zdijeQ19po3rnOBV0iObKgUd5uVGag7WW2wxM,15949
@@ -1324,7 +1324,7 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/int
1324
1324
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.provider-with-waiter-state-machine-custom-role.ts,sha256=60mjzf_2NI9zO30B2Guye5sA7kxIl4yrLMXUEWIDO9I,2401
1325
1325
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.provider-with-waiter-state-machine.ts,sha256=6Ci2_ABcu5azSj1f0EzY1VD4lQUg9KI5l1Q7ieejI-0,2058
1326
1326
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/custom-resources/integ.provider.ts,sha256=u_YVV0YZk6hyIxo5JOOSwwUORbqS3BVbJU6DIAwxuk0,1814
1327
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/FEATURE_FLAGS.md,sha256=95kAIlD3FlE5ik1ZMFk7naIipjzUzHt5mp8Hzmut6u0,102077
1327
+ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/FEATURE_FLAGS.md,sha256=HaV3_1Dgij9sXwao0J84al-didzMr01n1n9QknksydY,101935
1328
1328
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/NESTED_ASSEMBLIES.md,sha256=P8PNyr4hIC_i-9aUxa301-5-N4tLcoHYnELBp3C6SQQ,4949
1329
1329
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/README.md,sha256=OixPEelzx6OwknIs-O5rH11835n4Pns-Zf46MYLX55k,25160
1330
1330
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/lambda-layer-awscli/README.md,sha256=kMrrptXZcAiK_TXRQD4XcaNRa3RXaIoIUQRZYi29b30,681
@@ -1353,8 +1353,8 @@ cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/integ.pipe
1353
1353
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/region-info/README.md,sha256=vewWkV3ds9o9iyyYaJBNTkaKJ2XA6K2yF17tAxUnujg,2718
1354
1354
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/triggers/README.md,sha256=hYIx7DbG_7p4LYLUfxDwgIQjw9UNdz1GLrqDe8_Dbko,4132
1355
1355
  cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/triggers/integ.triggers.ts,sha256=4OHplMoBOgHGkktAzoU-TuNmJQS5wGAUvBfj5bGSe_Y,2807
1356
- konokenj_cdk_api_mcp_server-0.2.4.dist-info/METADATA,sha256=TXqvU9TIp7zaPDFHV8p56E4NcJPEf-C8kGLiV9HZEPY,2432
1357
- konokenj_cdk_api_mcp_server-0.2.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1358
- konokenj_cdk_api_mcp_server-0.2.4.dist-info/entry_points.txt,sha256=bVDhMdyCC1WNMPOMbmB82jvWII2CIrwTZDygdCf0cYQ,79
1359
- konokenj_cdk_api_mcp_server-0.2.4.dist-info/licenses/LICENSE.txt,sha256=5OIAASeg1HM22mVZ1enz9bgZ7TlsGfWXnj02P9OgFyk,1098
1360
- konokenj_cdk_api_mcp_server-0.2.4.dist-info/RECORD,,
1356
+ konokenj_cdk_api_mcp_server-0.11.0.dist-info/METADATA,sha256=z7pWTsPnoWAp6O2f4YC1DQWLwkIZsU9Bl_Y6ewClUZg,2433
1357
+ konokenj_cdk_api_mcp_server-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1358
+ konokenj_cdk_api_mcp_server-0.11.0.dist-info/entry_points.txt,sha256=bVDhMdyCC1WNMPOMbmB82jvWII2CIrwTZDygdCf0cYQ,79
1359
+ konokenj_cdk_api_mcp_server-0.11.0.dist-info/licenses/LICENSE.txt,sha256=5OIAASeg1HM22mVZ1enz9bgZ7TlsGfWXnj02P9OgFyk,1098
1360
+ konokenj_cdk_api_mcp_server-0.11.0.dist-info/RECORD,,