konokenj.cdk-api-mcp-server 0.2.3__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.
- cdk_api_mcp_server/__about__.py +1 -1
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/custom-resource-handlers/README.md +15 -78
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-dualstack.ts +3 -4
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api.ts +2 -4
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.stage.ts +7 -20
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.iam.ts +34 -38
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.sqs.ts +58 -71
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-config.ts +4 -15
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group.ts +218 -40
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts +102 -104
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-synthetics/integ.canary.ts +4 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/FEATURE_FLAGS.md +3 -3
- cdk_api_mcp_server/server.py +21 -21
- {konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/METADATA +6 -13
- {konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/RECORD +18 -18
- {konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/WHEEL +0 -0
- {konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/entry_points.txt +0 -0
- {konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/licenses/LICENSE.txt +0 -0
cdk_api_mcp_server/__about__.py
CHANGED
|
@@ -1,83 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Type definitions copied from 'aws-cdk-lib'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`aws-cdk-lib` depends on this package; but this package depends on some
|
|
4
|
+
types defined in `aws-cdk-lib`.
|
|
4
5
|
|
|
5
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
|
|
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`
|
cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-dualstack.ts
CHANGED
|
@@ -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, '
|
|
7
|
+
const stack = new cdk.Stack(app, 'DualStackWebsocketApiStack');
|
|
8
8
|
|
|
9
|
-
new apigw.
|
|
10
|
-
routeSelectionExpression: true,
|
|
9
|
+
new apigw.WebSocketApi(stack, 'WebSocketApi', {
|
|
11
10
|
ipAddressType: apigw.IpAddressType.DUAL_STACK,
|
|
12
11
|
});
|
|
13
12
|
|
|
14
|
-
new IntegTest(app, '
|
|
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.
|
|
10
|
-
routeSelectionExpression: true,
|
|
11
|
-
});
|
|
9
|
+
new apigw.WebSocketApi(stack, 'WebSocketApi');
|
|
12
10
|
|
|
13
|
-
new IntegTest(app, '
|
|
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
|
|
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-
|
|
6
|
+
const stack = new cdk.Stack(app, 'aws-cdk-aws-apigatewayv2-websocket-stage');
|
|
10
7
|
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
25
|
-
|
|
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
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
|
43
|
-
|
|
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
|
|
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
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
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
|
-
|
|
8
|
-
|
|
8
|
+
/*
|
|
9
|
+
* Stack verification steps:
|
|
10
|
+
* 1. Verify manually that the integration has type "AWS"
|
|
11
|
+
*/
|
|
9
12
|
|
|
10
|
-
const
|
|
13
|
+
const app = new App();
|
|
14
|
+
const stack = new Stack(app, 'integ-aws-websocket-sqs-integration');
|
|
11
15
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group.ts
CHANGED
|
@@ -1,62 +1,240 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
1
|
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
|
|
3
|
-
import * as
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
109
|
+
// Listeners
|
|
110
|
+
const prodListener = loadBalancer.addListener('ProdListener', {
|
|
111
|
+
port: 80, // port for production traffic
|
|
112
|
+
protocol: elbv2.ApplicationProtocol.HTTP,
|
|
30
113
|
});
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
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 {
|
|
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
|
-
*
|
|
11
|
-
*
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
98
|
+
const chain = sfn.Chain.start(startJobRunJob);
|
|
110
99
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
100
|
+
const sm = new sfn.StateMachine(stack, 'StateMachine', {
|
|
101
|
+
definition: chain,
|
|
102
|
+
timeout: cdk.Duration.seconds(1000),
|
|
103
|
+
});
|
|
115
104
|
|
|
116
|
-
|
|
117
|
-
|
|
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 | `
|
|
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
|
|
cdk_api_mcp_server/server.py
CHANGED
|
@@ -7,6 +7,7 @@ from typing import Optional
|
|
|
7
7
|
|
|
8
8
|
from fastmcp import FastMCP
|
|
9
9
|
from fastmcp.resources import TextResource
|
|
10
|
+
from mcp.shared.exceptions import ErrorData, McpError
|
|
10
11
|
from pydantic import AnyUrl
|
|
11
12
|
|
|
12
13
|
from cdk_api_mcp_server.resources import (
|
|
@@ -42,8 +43,8 @@ def create_server(provider: Optional[ResourceProvider] = None) -> FastMCP:
|
|
|
42
43
|
# 新しいサーバーインスタンスを作成
|
|
43
44
|
server: FastMCP = FastMCP()
|
|
44
45
|
|
|
45
|
-
#
|
|
46
|
-
|
|
46
|
+
# 説明はコメントで残しておく
|
|
47
|
+
# "AWS CDK API MCP Server"
|
|
47
48
|
|
|
48
49
|
# 定義済みのパッケージとして直接リソース登録
|
|
49
50
|
@server.resource("cdk-api-docs://constructs/@aws-cdk", mime_type="application/json")
|
|
@@ -86,6 +87,11 @@ def create_server(provider: Optional[ResourceProvider] = None) -> FastMCP:
|
|
|
86
87
|
)
|
|
87
88
|
def list_package_modules(package_name: str):
|
|
88
89
|
"""List all modules in the package."""
|
|
90
|
+
# パッケージが存在するか確認
|
|
91
|
+
if not resource_provider.resource_exists(f"constructs/{package_name}"):
|
|
92
|
+
error_message = f"Unknown resource: package '{package_name}' not found"
|
|
93
|
+
raise McpError(ErrorData(message=error_message, code=404))
|
|
94
|
+
|
|
89
95
|
modules = [
|
|
90
96
|
item
|
|
91
97
|
for item in resource_provider.list_resources(f"constructs/{package_name}")
|
|
@@ -111,9 +117,14 @@ def create_server(provider: Optional[ResourceProvider] = None) -> FastMCP:
|
|
|
111
117
|
)
|
|
112
118
|
def list_module_files(package_name: str, module_name: str):
|
|
113
119
|
"""List all files in the module."""
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
resource_path = f"constructs/{package_name}/{module_name}"
|
|
121
|
+
|
|
122
|
+
# モジュールが存在するか確認
|
|
123
|
+
if not resource_provider.resource_exists(resource_path):
|
|
124
|
+
error_message = f"Unknown resource: module '{resource_path}' not found"
|
|
125
|
+
raise McpError(ErrorData(message=error_message, code=404))
|
|
126
|
+
|
|
127
|
+
files = resource_provider.list_resources(resource_path)
|
|
117
128
|
content = json.dumps(files)
|
|
118
129
|
|
|
119
130
|
# JSONとしてレスポンスを返す
|
|
@@ -138,18 +149,8 @@ def create_server(provider: Optional[ResourceProvider] = None) -> FastMCP:
|
|
|
138
149
|
resource_path = f"constructs/{package_name}/{module_name}/{file_name}"
|
|
139
150
|
|
|
140
151
|
if not resource_provider.resource_exists(resource_path):
|
|
141
|
-
error_message = f"
|
|
142
|
-
|
|
143
|
-
uri=AnyUrl.build(
|
|
144
|
-
scheme="cdk-api-docs",
|
|
145
|
-
host="constructs",
|
|
146
|
-
path=f"/{package_name}/{module_name}/{file_name}",
|
|
147
|
-
),
|
|
148
|
-
name=file_name,
|
|
149
|
-
text=error_message,
|
|
150
|
-
description=f"Error: {resource_path}",
|
|
151
|
-
mime_type="text/plain",
|
|
152
|
-
)
|
|
152
|
+
error_message = f"Unknown resource: '{resource_path}' not found"
|
|
153
|
+
raise McpError(ErrorData(message=error_message, code=404))
|
|
153
154
|
|
|
154
155
|
# リソースプロバイダーからコンテンツを取得
|
|
155
156
|
content = resource_provider.get_resource_content(resource_path)
|
|
@@ -169,10 +170,9 @@ def create_server(provider: Optional[ResourceProvider] = None) -> FastMCP:
|
|
|
169
170
|
description = f"JSON file: {package_name}/{module_name}/{file_name}"
|
|
170
171
|
else:
|
|
171
172
|
# その他の場合はmimetypesモジュールで判定
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
mime_type = "text/plain"
|
|
173
|
+
mime_type_guess, _ = mimetypes.guess_type(file_name)
|
|
174
|
+
# None の場合はデフォルトのtext/plainを使用
|
|
175
|
+
mime_type = mime_type_guess if mime_type_guess is not None else "text/plain"
|
|
176
176
|
description = f"File: {package_name}/{module_name}/{file_name}"
|
|
177
177
|
|
|
178
178
|
# Create and return a TextResource
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: konokenj.cdk-api-mcp-server
|
|
3
|
-
Version: 0.
|
|
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
|
|
@@ -10,13 +10,7 @@ License-Expression: MIT
|
|
|
10
10
|
License-File: LICENSE.txt
|
|
11
11
|
Classifier: Development Status :: 4 - Beta
|
|
12
12
|
Classifier: Programming Language :: Python
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
-
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
19
|
-
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
14
|
Requires-Python: >=3.8
|
|
21
15
|
Requires-Dist: fastmcp>=2.0.0
|
|
22
16
|
Requires-Dist: pydantic>=2.10.6
|
|
@@ -33,6 +27,8 @@ Description-Content-Type: text/markdown
|
|
|
33
27
|
|
|
34
28
|
---
|
|
35
29
|
|
|
30
|
+
Provide AWS CDK API references and integration test code for sample. Can be used in offline because all documents are included in the released python artifact.
|
|
31
|
+
|
|
36
32
|
## Usage
|
|
37
33
|
|
|
38
34
|
Add to your mcp.json:
|
|
@@ -61,11 +57,8 @@ Registered as static resources. To get available modules under the package, call
|
|
|
61
57
|
|
|
62
58
|
To get available documents under the module, call `read_resource(uri)` as MCP client.
|
|
63
59
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- `cdk-api-docs://constructs/@aws-cdk/{module}/`
|
|
68
|
-
- `cdk-api-docs://constructs/aws-cdk-lib/{module}/`
|
|
60
|
+
- `cdk-api-docs://constructs/@aws-cdk/{module}`
|
|
61
|
+
- `cdk-api-docs://constructs/aws-cdk-lib/{module}`
|
|
69
62
|
|
|
70
63
|
### Resource Template: Read file contents
|
|
71
64
|
|
{konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/RECORD
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
cdk_api_mcp_server/__about__.py,sha256=
|
|
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
|
|
5
|
-
cdk_api_mcp_server/server.py,sha256=
|
|
5
|
+
cdk_api_mcp_server/server.py,sha256=uN5SE6PHpiOYY8QlNID1a0j2hLdeO61QX3kgC_oTODg,8055
|
|
6
6
|
cdk_api_mcp_server/resources/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/app-staging-synthesizer-alpha/README.md,sha256=rAatqlr_JE06sjgcBVdXszpwh3grV4aFkkb9L2s8IIU,16492
|
|
8
8
|
cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/app-staging-synthesizer-alpha/resource-names.md,sha256=oSTmVHH2AZ9cd-KiITtuS0nJMOWGC0FpVg3t7p6UPMM,1323
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
97
|
-
cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.stage.ts,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1357
|
-
konokenj_cdk_api_mcp_server-0.
|
|
1358
|
-
konokenj_cdk_api_mcp_server-0.
|
|
1359
|
-
konokenj_cdk_api_mcp_server-0.
|
|
1360
|
-
konokenj_cdk_api_mcp_server-0.
|
|
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,,
|
{konokenj_cdk_api_mcp_server-0.2.3.dist-info → konokenj_cdk_api_mcp_server-0.11.0.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|