konokenj.cdk-api-mcp-server 0.45.0__py3-none-any.whl → 0.47.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/aws-elasticache-alpha/README.md +421 -0
- 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-cloudfront-origins/README.md +14 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cloudfront-origins/integ.http-origin.ts +5 -2
- 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-docdb/README.md +24 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-docdb/integ.cluster-serverless.ts +34 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.availability-zone-rebalancing.ts +14 -4
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.enable-execute-command.ts +35 -29
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.exec-command.ts +16 -22
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.lb-awsvpc-nw.ts +26 -16
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.pseudo-terminal.ts +18 -8
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.invoke-jsonata.ts +80 -87
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.invoke.ts +69 -87
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts +43 -96
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/README.md +4 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/integ.newpipeline-reduce-stagerole-scope.ts +4 -1
- {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/METADATA +2 -2
- {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/RECORD +24 -22
- {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/WHEEL +0 -0
- {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/entry_points.txt +0 -0
- {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -1,119 +1,112 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
3
|
-
import * as cdk from 'aws-cdk-lib';
|
|
4
|
-
import { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
1
|
+
import * as path from 'path';
|
|
5
2
|
import { IntegTest, ExpectedResult } from '@aws-cdk/integ-tests-alpha';
|
|
6
|
-
import
|
|
3
|
+
import * as cdk from 'aws-cdk-lib';
|
|
4
|
+
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
|
|
5
|
+
import * as events from 'aws-cdk-lib/aws-events';
|
|
6
|
+
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
7
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
8
|
+
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
9
|
+
import { password, username } from './my-lambda-handler';
|
|
7
10
|
|
|
8
11
|
/*
|
|
9
|
-
* Creates
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Stack verification steps:
|
|
14
|
-
* The generated State Machine can be executed from the CLI (or Step Functions console)
|
|
15
|
-
* and runs with an execution status of `Succeeded`.
|
|
12
|
+
* Creates an API Gateway instance with a GET method and mock integration,
|
|
13
|
+
* secured with basic auth. It then creates a matching Connection and uses it
|
|
14
|
+
* in a state machine with a task state to invoke the endpoint.
|
|
16
15
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Stack verification steps :
|
|
17
|
+
* * aws stepfunctions start-execution --state-machine-arn <deployed state machine arn> : should return execution arn
|
|
18
|
+
* * aws stepfunctions describe-execution --execution-arn <execution-arn generated before> : should return status as SUCCEEDED
|
|
19
19
|
*/
|
|
20
20
|
const app = new cdk.App({
|
|
21
21
|
postCliContext: {
|
|
22
22
|
'@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
|
-
const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-
|
|
25
|
+
const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-http-invoke-integ');
|
|
26
26
|
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
statusCode: '200',
|
|
31
|
-
body: 'hello, world!',
|
|
32
|
-
...event,
|
|
33
|
-
};
|
|
34
|
-
};`),
|
|
35
|
-
runtime: STANDARD_NODEJS_RUNTIME,
|
|
36
|
-
handler: 'index.handler',
|
|
27
|
+
const authorizerHandler = new lambda.NodejsFunction(stack, 'AuthorizerHandler', {
|
|
28
|
+
entry: path.resolve(__dirname, 'my-lambda-handler', 'index.ts'),
|
|
29
|
+
handler: 'handler',
|
|
37
30
|
});
|
|
38
31
|
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
execInput: '{% $states.context.Execution.Input %}',
|
|
44
|
-
execName: '{% $states.context.Execution.Name %}',
|
|
45
|
-
execRoleArn: '{% $states.context.Execution.RoleArn %}',
|
|
46
|
-
execStartTime: '{% $states.context.Execution.StartTime %}',
|
|
47
|
-
stateEnteredTime: '{% $states.context.State.EnteredTime %}',
|
|
48
|
-
stateName: '{% $states.context.State.Name %}',
|
|
49
|
-
stateRetryCount: '{% $states.context.State.RetryCount %}',
|
|
50
|
-
stateMachineId: '{% $states.context.StateMachine.Id %}',
|
|
51
|
-
stateMachineName: '{% $states.context.StateMachine.Name %}',
|
|
52
|
-
}),
|
|
53
|
-
outputs: '{% $states.result.Payload %}',
|
|
32
|
+
const authorizer = new apigateway.TokenAuthorizer(stack, 'Authorizer', {
|
|
33
|
+
handler: authorizerHandler,
|
|
34
|
+
identitySource: 'method.request.header.Authorization',
|
|
35
|
+
resultsCacheTtl: cdk.Duration.seconds(0),
|
|
54
36
|
});
|
|
55
37
|
|
|
56
|
-
const
|
|
57
|
-
code: Code.fromInline(`exports.handler = async function(event, context) {
|
|
58
|
-
const expectedFields = [
|
|
59
|
-
'execId', 'execInput', 'execName', 'execRoleArn',
|
|
60
|
-
'execStartTime', 'stateEnteredTime', 'stateName',
|
|
61
|
-
'stateRetryCount', 'stateMachineId', 'stateMachineName',
|
|
62
|
-
];
|
|
63
|
-
const fieldsAreSet = expectedFields.every(field => event[field] !== undefined);
|
|
64
|
-
return {
|
|
65
|
-
status: event.statusCode === '200' && fieldsAreSet ? 'SUCCEEDED' : 'FAILED'
|
|
66
|
-
};
|
|
67
|
-
};`),
|
|
68
|
-
runtime: STANDARD_NODEJS_RUNTIME,
|
|
69
|
-
handler: 'index.handler',
|
|
70
|
-
});
|
|
38
|
+
const api = new apigateway.RestApi(stack, 'IntegRestApi');
|
|
71
39
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
40
|
+
api.root.addResource('test').addMethod(
|
|
41
|
+
'GET',
|
|
42
|
+
new apigateway.MockIntegration({
|
|
43
|
+
integrationResponses: [
|
|
44
|
+
{
|
|
45
|
+
statusCode: '200',
|
|
46
|
+
responseTemplates: {
|
|
47
|
+
'application/json': JSON.stringify({ message: 'Hello, tester!' }),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
passthroughBehavior: apigateway.PassthroughBehavior.NEVER,
|
|
52
|
+
requestTemplates: {
|
|
53
|
+
'application/json': '{ "statusCode": 200 }',
|
|
54
|
+
},
|
|
55
|
+
}),
|
|
56
|
+
{
|
|
57
|
+
authorizer,
|
|
58
|
+
methodResponses: [
|
|
59
|
+
{
|
|
60
|
+
statusCode: '200',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
76
63
|
},
|
|
77
|
-
|
|
64
|
+
);
|
|
78
65
|
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
cause: 'Job Failed',
|
|
82
|
-
error: 'Received a status that was not 200',
|
|
66
|
+
const connection = new events.Connection(stack, 'Connection', {
|
|
67
|
+
authorization: events.Authorization.basic(username, cdk.SecretValue.unsafePlainText(password)),
|
|
83
68
|
});
|
|
84
|
-
const finalStatus = sfn.Pass.jsonata(stack, 'Final step');
|
|
85
69
|
|
|
86
|
-
const
|
|
87
|
-
.
|
|
88
|
-
.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
70
|
+
const httpInvokeTask = tasks.HttpInvoke.jsonata(stack, 'Invoke HTTP Endpoint', {
|
|
71
|
+
apiRoot: api.urlForPath('/'),
|
|
72
|
+
apiEndpoint: sfn.TaskInput.fromText('{% $states.input.apiEndpoint %}'),
|
|
73
|
+
connection,
|
|
74
|
+
method: sfn.TaskInput.fromText('GET'),
|
|
75
|
+
outputs: {
|
|
76
|
+
ResponseBody: '{% $states.result.ResponseBody %}',
|
|
77
|
+
},
|
|
78
|
+
});
|
|
93
79
|
|
|
94
80
|
const sm = new sfn.StateMachine(stack, 'StateMachine', {
|
|
95
|
-
definition:
|
|
81
|
+
definition: httpInvokeTask,
|
|
96
82
|
timeout: cdk.Duration.seconds(30),
|
|
97
83
|
});
|
|
98
84
|
|
|
99
|
-
new
|
|
100
|
-
value: sm.stateMachineArn,
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
const integ = new IntegTest(app, 'IntegTest', {
|
|
85
|
+
const testCase = new IntegTest(app, 'HttpInvokeTest', {
|
|
104
86
|
testCases: [stack],
|
|
105
87
|
});
|
|
106
|
-
|
|
88
|
+
|
|
89
|
+
// Start an execution
|
|
90
|
+
const start = testCase.assertions.awsApiCall('@aws-sdk/client-sfn', 'StartExecution', {
|
|
107
91
|
stateMachineArn: sm.stateMachineArn,
|
|
92
|
+
input: JSON.stringify({
|
|
93
|
+
apiEndpoint: '/test',
|
|
94
|
+
}),
|
|
108
95
|
});
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
status: 'SUCCEEDED',
|
|
114
|
-
})).waitForAssertions({
|
|
115
|
-
totalTimeout: cdk.Duration.seconds(10),
|
|
116
|
-
interval: cdk.Duration.seconds(3),
|
|
96
|
+
|
|
97
|
+
// describe the results of the execution
|
|
98
|
+
const describe = testCase.assertions.awsApiCall('@aws-sdk/client-sfn', 'DescribeExecution', {
|
|
99
|
+
executionArn: start.getAttString('executionArn'),
|
|
117
100
|
});
|
|
118
101
|
|
|
102
|
+
// assert the results
|
|
103
|
+
describe.expect(ExpectedResult.objectLike({
|
|
104
|
+
status: 'SUCCEEDED',
|
|
105
|
+
output: JSON.stringify({
|
|
106
|
+
ResponseBody: {
|
|
107
|
+
message: 'Hello, tester!',
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
}));
|
|
111
|
+
|
|
119
112
|
app.synth();
|
cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.invoke.ts
CHANGED
|
@@ -1,119 +1,101 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
3
|
-
import * as cdk from 'aws-cdk-lib';
|
|
4
|
-
import { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
1
|
+
import * as path from 'path';
|
|
5
2
|
import { IntegTest, ExpectedResult } from '@aws-cdk/integ-tests-alpha';
|
|
6
|
-
import
|
|
3
|
+
import * as cdk from 'aws-cdk-lib';
|
|
4
|
+
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
|
|
5
|
+
import * as events from 'aws-cdk-lib/aws-events';
|
|
6
|
+
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
7
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
8
|
+
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
9
|
+
import { password, username } from './my-lambda-handler';
|
|
7
10
|
|
|
8
11
|
/*
|
|
9
|
-
* Creates
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Stack verification steps:
|
|
14
|
-
* The generated State Machine can be executed from the CLI (or Step Functions console)
|
|
15
|
-
* and runs with an execution status of `Succeeded`.
|
|
12
|
+
* Creates an API Gateway instance with a GET method and mock integration,
|
|
13
|
+
* secured with basic auth. It then creates a matching Connection and uses it
|
|
14
|
+
* in a state machine with a task state to invoke the endpoint.
|
|
16
15
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Stack verification steps :
|
|
17
|
+
* * aws stepfunctions start-execution --state-machine-arn <deployed state machine arn> : should return execution arn
|
|
18
|
+
* * aws stepfunctions describe-execution --execution-arn <execution-arn generated before> : should return status as SUCCEEDED
|
|
19
19
|
*/
|
|
20
20
|
const app = new cdk.App({
|
|
21
21
|
postCliContext: {
|
|
22
22
|
'@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
|
-
const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-
|
|
25
|
+
const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-http-invoke-integ');
|
|
26
26
|
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
statusCode: '200',
|
|
31
|
-
body: 'hello, world!',
|
|
32
|
-
...event,
|
|
33
|
-
};
|
|
34
|
-
};`),
|
|
35
|
-
runtime: STANDARD_NODEJS_RUNTIME,
|
|
36
|
-
handler: 'index.handler',
|
|
27
|
+
const authorizerHandler = new lambda.NodejsFunction(stack, 'AuthorizerHandler', {
|
|
28
|
+
entry: path.resolve(__dirname, 'my-lambda-handler', 'index.ts'),
|
|
29
|
+
handler: 'handler',
|
|
37
30
|
});
|
|
38
31
|
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
execInput: sfn.JsonPath.executionInput,
|
|
44
|
-
execName: sfn.JsonPath.executionName,
|
|
45
|
-
execRoleArn: sfn.JsonPath.executionRoleArn,
|
|
46
|
-
execStartTime: sfn.JsonPath.executionStartTime,
|
|
47
|
-
stateEnteredTime: sfn.JsonPath.stateEnteredTime,
|
|
48
|
-
stateName: sfn.JsonPath.stateName,
|
|
49
|
-
stateRetryCount: sfn.JsonPath.stateRetryCount,
|
|
50
|
-
stateMachineId: sfn.JsonPath.stateMachineId,
|
|
51
|
-
stateMachineName: sfn.JsonPath.stateMachineName,
|
|
52
|
-
}),
|
|
53
|
-
outputPath: '$.Payload',
|
|
32
|
+
const authorizer = new apigateway.TokenAuthorizer(stack, 'Authorizer', {
|
|
33
|
+
handler: authorizerHandler,
|
|
34
|
+
identitySource: 'method.request.header.Authorization',
|
|
35
|
+
resultsCacheTtl: cdk.Duration.seconds(0),
|
|
54
36
|
});
|
|
55
37
|
|
|
56
|
-
const
|
|
57
|
-
code: Code.fromInline(`exports.handler = async function(event, context) {
|
|
58
|
-
const expectedFields = [
|
|
59
|
-
'execId', 'execInput', 'execName', 'execRoleArn',
|
|
60
|
-
'execStartTime', 'stateEnteredTime', 'stateName',
|
|
61
|
-
'stateRetryCount', 'stateMachineId', 'stateMachineName',
|
|
62
|
-
];
|
|
63
|
-
const fieldsAreSet = expectedFields.every(field => event[field] !== undefined);
|
|
64
|
-
return {
|
|
65
|
-
status: event.statusCode === '200' && fieldsAreSet ? 'SUCCEEDED' : 'FAILED'
|
|
66
|
-
};
|
|
67
|
-
};`),
|
|
68
|
-
runtime: STANDARD_NODEJS_RUNTIME,
|
|
69
|
-
handler: 'index.handler',
|
|
70
|
-
});
|
|
38
|
+
const api = new apigateway.RestApi(stack, 'IntegRestApi');
|
|
71
39
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
40
|
+
api.root.addResource('test').addMethod(
|
|
41
|
+
'GET',
|
|
42
|
+
new apigateway.MockIntegration({
|
|
43
|
+
integrationResponses: [
|
|
44
|
+
{
|
|
45
|
+
statusCode: '200',
|
|
46
|
+
responseTemplates: {
|
|
47
|
+
'application/json': JSON.stringify({ message: 'Hello, tester!' }),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
passthroughBehavior: apigateway.PassthroughBehavior.NEVER,
|
|
52
|
+
requestTemplates: {
|
|
53
|
+
'application/json': '{ "statusCode": 200 }',
|
|
54
|
+
},
|
|
55
|
+
}),
|
|
56
|
+
{
|
|
57
|
+
authorizer,
|
|
58
|
+
methodResponses: [
|
|
59
|
+
{
|
|
60
|
+
statusCode: '200',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
76
63
|
},
|
|
77
|
-
|
|
64
|
+
);
|
|
78
65
|
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
cause: 'Job Failed',
|
|
82
|
-
error: 'Received a status that was not 200',
|
|
66
|
+
const connection = new events.Connection(stack, 'Connection', {
|
|
67
|
+
authorization: events.Authorization.basic(username, cdk.SecretValue.unsafePlainText(password)),
|
|
83
68
|
});
|
|
84
|
-
const finalStatus = new sfn.Pass(stack, 'Final step');
|
|
85
69
|
|
|
86
|
-
const
|
|
87
|
-
.
|
|
88
|
-
.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
);
|
|
70
|
+
const httpInvokeTask = new tasks.HttpInvoke(stack, 'Invoke HTTP Endpoint', {
|
|
71
|
+
apiRoot: api.urlForPath('/'),
|
|
72
|
+
apiEndpoint: sfn.TaskInput.fromText('/test'),
|
|
73
|
+
connection,
|
|
74
|
+
method: sfn.TaskInput.fromText('GET'),
|
|
75
|
+
});
|
|
93
76
|
|
|
94
77
|
const sm = new sfn.StateMachine(stack, 'StateMachine', {
|
|
95
|
-
definition:
|
|
78
|
+
definition: httpInvokeTask,
|
|
96
79
|
timeout: cdk.Duration.seconds(30),
|
|
97
80
|
});
|
|
98
81
|
|
|
99
|
-
new
|
|
100
|
-
value: sm.stateMachineArn,
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
const integ = new IntegTest(app, 'IntegTest', {
|
|
82
|
+
const testCase = new IntegTest(app, 'HttpInvokeTest', {
|
|
104
83
|
testCases: [stack],
|
|
105
84
|
});
|
|
106
|
-
|
|
85
|
+
|
|
86
|
+
// Start an execution
|
|
87
|
+
const start = testCase.assertions.awsApiCall('StepFunctions', 'startExecution', {
|
|
107
88
|
stateMachineArn: sm.stateMachineArn,
|
|
108
89
|
});
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
status: 'SUCCEEDED',
|
|
114
|
-
})).waitForAssertions({
|
|
115
|
-
totalTimeout: cdk.Duration.seconds(10),
|
|
116
|
-
interval: cdk.Duration.seconds(3),
|
|
90
|
+
|
|
91
|
+
// describe the results of the execution
|
|
92
|
+
const describe = testCase.assertions.awsApiCall('StepFunctions', 'describeExecution', {
|
|
93
|
+
executionArn: start.getAttString('executionArn'),
|
|
117
94
|
});
|
|
118
95
|
|
|
96
|
+
// assert the results
|
|
97
|
+
describe.expect(ExpectedResult.objectLike({
|
|
98
|
+
status: 'SUCCEEDED',
|
|
99
|
+
}));
|
|
100
|
+
|
|
119
101
|
app.synth();
|
|
@@ -1,122 +1,69 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import * as
|
|
3
|
-
import { AwsAuthMapping } from 'aws-cdk-lib/aws-eks';
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as glue from 'aws-cdk-lib/aws-glue';
|
|
4
3
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
4
|
+
import * as assets from 'aws-cdk-lib/aws-s3-assets';
|
|
5
5
|
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
6
6
|
import * as cdk from 'aws-cdk-lib';
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
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
|
+
import { GlueStartJobRun } from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
8
|
+
import { IntegTest } from '@aws-cdk/integ-tests-alpha';
|
|
12
9
|
|
|
13
|
-
|
|
10
|
+
/*
|
|
14
11
|
* Stack verification steps:
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
12
|
+
* * aws stepfunctions start-execution --state-machine-arn <deployed state machine arn>
|
|
13
|
+
* * aws stepfunctions describe-execution --execution-arn <execution arn created above>
|
|
14
|
+
* The "describe-execution" call should eventually return status "SUCCEEDED".
|
|
15
|
+
* NOTE: It will take up to 15 minutes for the step function to complete due to the cold start time
|
|
16
|
+
* for AWS Glue, which as of 02/2020, is around 10-15 minutes.
|
|
19
17
|
*/
|
|
20
18
|
|
|
21
|
-
const app = new cdk.App(
|
|
22
|
-
|
|
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);
|
|
29
|
-
|
|
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
|
+
const app = new cdk.App();
|
|
20
|
+
const stack = new cdk.Stack(app, 'aws-stepfunctions-integ');
|
|
36
21
|
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
properties: {
|
|
40
|
-
ContainerProvider: {
|
|
41
|
-
Id: eksCluster.clusterName,
|
|
42
|
-
Info: {
|
|
43
|
-
EksInfo: {
|
|
44
|
-
Namespace: 'default',
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
Type: 'EKS',
|
|
48
|
-
},
|
|
49
|
-
Name: 'Virtual-Cluster-Name',
|
|
50
|
-
},
|
|
22
|
+
const codeAsset = new assets.Asset(stack, 'Glue Job Script', {
|
|
23
|
+
path: path.join(__dirname, 'my-glue-script/job.py'),
|
|
51
24
|
});
|
|
52
25
|
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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'] },
|
|
26
|
+
const jobRole = new iam.Role(stack, 'Glue Job Role', {
|
|
27
|
+
assumedBy: new iam.ServicePrincipal('glue'),
|
|
28
|
+
managedPolicies: [
|
|
29
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole'),
|
|
65
30
|
],
|
|
66
31
|
});
|
|
32
|
+
codeAsset.grantRead(jobRole);
|
|
67
33
|
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
34
|
+
const job = new glue.CfnJob(stack, 'Glue Job', {
|
|
35
|
+
name: 'My Glue Job',
|
|
36
|
+
glueVersion: '1.0',
|
|
37
|
+
command: {
|
|
38
|
+
name: 'glueetl',
|
|
39
|
+
pythonVersion: '3',
|
|
40
|
+
scriptLocation: `s3://${codeAsset.s3BucketName}/${codeAsset.s3ObjectKey}`,
|
|
41
|
+
},
|
|
42
|
+
role: jobRole.roleArn,
|
|
74
43
|
});
|
|
75
44
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
virtualCluster.node.addDependency(emrRoleBind);
|
|
83
|
-
virtualCluster.node.addDependency(eksCluster.awsAuth);
|
|
84
|
-
|
|
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
|
-
},
|
|
45
|
+
const jobTask = new GlueStartJobRun(stack, 'Glue Job Task', {
|
|
46
|
+
glueJobName: job.name!,
|
|
47
|
+
integrationPattern: sfn.IntegrationPattern.RUN_JOB,
|
|
48
|
+
arguments: sfn.TaskInput.fromObject({
|
|
49
|
+
'--enable-metrics': 'true',
|
|
50
|
+
}),
|
|
96
51
|
});
|
|
97
52
|
|
|
98
|
-
const
|
|
53
|
+
const startTask = new sfn.Pass(stack, 'Start Task');
|
|
54
|
+
const endTask = new sfn.Pass(stack, 'End Task');
|
|
99
55
|
|
|
100
|
-
const
|
|
101
|
-
definition:
|
|
102
|
-
timeout: cdk.Duration.seconds(1000),
|
|
56
|
+
const stateMachine = new sfn.StateMachine(stack, 'State Machine', {
|
|
57
|
+
definition: sfn.Chain.start(startTask).next(jobTask).next(endTask),
|
|
103
58
|
});
|
|
104
59
|
|
|
105
|
-
new cdk.CfnOutput(stack, '
|
|
106
|
-
value:
|
|
60
|
+
new cdk.CfnOutput(stack, 'State Machine ARN Output', {
|
|
61
|
+
value: stateMachine.stateMachineArn,
|
|
107
62
|
});
|
|
108
63
|
|
|
109
|
-
new
|
|
64
|
+
new IntegTest(app, 'AwsSfnIntegTest', {
|
|
110
65
|
testCases: [stack],
|
|
111
|
-
|
|
112
|
-
diffAssets: false,
|
|
113
|
-
cdkCommandOptions: {
|
|
114
|
-
deploy: {
|
|
115
|
-
args: {
|
|
116
|
-
rollback: true,
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
},
|
|
66
|
+
diffAssets: true,
|
|
120
67
|
});
|
|
121
68
|
|
|
122
69
|
app.synth();
|
|
@@ -739,6 +739,10 @@ new pipelines.CodeBuildStep('Synth', {
|
|
|
739
739
|
buildEnvironment: {
|
|
740
740
|
computeType: codebuild.ComputeType.LARGE,
|
|
741
741
|
privileged: true,
|
|
742
|
+
dockerServer: {
|
|
743
|
+
computeType: codebuild.DockerServerComputeType.SMALL,
|
|
744
|
+
securityGroups: [mySecurityGroup],
|
|
745
|
+
},
|
|
742
746
|
},
|
|
743
747
|
timeout: Duration.minutes(90),
|
|
744
748
|
fileSystemLocations: [
|
|
@@ -53,8 +53,11 @@ class PipelineStack extends Stack {
|
|
|
53
53
|
dockerEnabledForSynth: true,
|
|
54
54
|
codeBuildDefaults: {
|
|
55
55
|
buildEnvironment: {
|
|
56
|
-
buildImage: codebuild.
|
|
56
|
+
buildImage: codebuild.LinuxBuildImage.AMAZON_LINUX_2023_5,
|
|
57
57
|
computeType: codebuild.ComputeType.SMALL,
|
|
58
|
+
dockerServer: {
|
|
59
|
+
computeType: codebuild.DockerServerComputeType.SMALL,
|
|
60
|
+
},
|
|
58
61
|
},
|
|
59
62
|
cache: codebuild.Cache.local(codebuild.LocalCacheMode.DOCKER_LAYER),
|
|
60
63
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: konokenj.cdk-api-mcp-server
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.47.0
|
|
4
4
|
Summary: An MCP server provides AWS CDK API Reference
|
|
5
5
|
Project-URL: Documentation, https://github.com/konokenj/cdk-api-mcp-server#readme
|
|
6
6
|
Project-URL: Issues, https://github.com/konokenj/cdk-api-mcp-server/issues
|
|
@@ -26,7 +26,7 @@ Description-Content-Type: text/markdown
|
|
|
26
26
|
[](https://pypi.org/project/konokenj.cdk-api-mcp-server)
|
|
27
27
|
|
|
28
28
|
<!-- DEP-VERSIONS-START -->
|
|
29
|
-
[](https://github.com/konokenj/cdk-api-mcp-server/blob/main/current-versions/aws-cdk.txt)
|
|
30
30
|
<!-- DEP-VERSIONS-END -->
|
|
31
31
|
|
|
32
32
|
---
|