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.

Files changed (24) hide show
  1. cdk_api_mcp_server/__about__.py +1 -1
  2. cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-elasticache-alpha/README.md +421 -0
  3. cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/custom-resource-handlers/README.md +15 -78
  4. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cloudfront-origins/README.md +14 -0
  5. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cloudfront-origins/integ.http-origin.ts +5 -2
  6. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-config.ts +4 -15
  7. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-codedeploy/integ.deployment-group.ts +218 -40
  8. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-docdb/README.md +24 -0
  9. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-docdb/integ.cluster-serverless.ts +34 -0
  10. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.availability-zone-rebalancing.ts +14 -4
  11. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.enable-execute-command.ts +35 -29
  12. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.exec-command.ts +16 -22
  13. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.lb-awsvpc-nw.ts +26 -16
  14. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ecs/integ.pseudo-terminal.ts +18 -8
  15. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.invoke-jsonata.ts +80 -87
  16. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.invoke.ts +69 -87
  17. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts +43 -96
  18. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/README.md +4 -0
  19. cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/pipelines/integ.newpipeline-reduce-stagerole-scope.ts +4 -1
  20. {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/METADATA +2 -2
  21. {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/RECORD +24 -22
  22. {konokenj_cdk_api_mcp_server-0.45.0.dist-info → konokenj_cdk_api_mcp_server-0.47.0.dist-info}/WHEEL +0 -0
  23. {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
  24. {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 { Code, Function } from 'aws-cdk-lib/aws-lambda';
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 { STANDARD_NODEJS_RUNTIME } from '../../../config';
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 a state machine with a task state to invoke a Lambda function
10
- * The state machine creates a couple of Lambdas that pass results forward
11
- * and into a Choice state that validates the output.
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
- * -- aws stepfunctions start-execution --state-machine-arn <state-machine-arn-from-output> provides execution arn
18
- * -- aws stepfunctions describe-execution --execution-arn <state-machine-arn-from-output> returns a status of `Succeeded`
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-lambda-invoke-jsonata-integ');
25
+ const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-http-invoke-integ');
26
26
 
27
- const submitJobLambda = new Function(stack, 'submitJobLambda', {
28
- code: Code.fromInline(`exports.handler = async (event, context) => {
29
- return {
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 submitJob = LambdaInvoke.jsonata(stack, 'Invoke Handler', {
40
- lambdaFunction: submitJobLambda,
41
- payload: sfn.TaskInput.fromObject({
42
- execId: '{% $states.context.Execution.Id %}',
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 checkJobStateLambda = new Function(stack, 'checkJobStateLambda', {
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
- const checkJobState = LambdaInvoke.jsonata(stack, 'Check the job state', {
73
- lambdaFunction: checkJobStateLambda,
74
- outputs: {
75
- status: '{% $states.result.Payload.status %}',
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 isComplete = sfn.Choice.jsonata(stack, 'Job Complete?');
80
- const jobFailed = sfn.Fail.jsonata(stack, 'Job Failed', {
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 chain = sfn.Chain.start(submitJob)
87
- .next(checkJobState)
88
- .next(
89
- isComplete
90
- .when(sfn.Condition.jsonata("{% $states.input.status = 'FAILED' %}"), jobFailed)
91
- .when(sfn.Condition.jsonata("{% $states.input.status = 'SUCCEEDED' %}"), finalStatus),
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: chain,
81
+ definition: httpInvokeTask,
96
82
  timeout: cdk.Duration.seconds(30),
97
83
  });
98
84
 
99
- new cdk.CfnOutput(stack, 'stateMachineArn', {
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
- const res = integ.assertions.awsApiCall('@aws-sdk/client-sfn', 'StartExecution', {
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
- const executionArn = res.getAttString('executionArn');
110
- integ.assertions.awsApiCall('@aws-sdk/client-sfn', 'DescribeExecution', {
111
- executionArn,
112
- }).expect(ExpectedResult.objectLike({
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();
@@ -1,119 +1,101 @@
1
- import { Code, Function } from 'aws-cdk-lib/aws-lambda';
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 { STANDARD_NODEJS_RUNTIME } from '../../../config';
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 a state machine with a task state to invoke a Lambda function
10
- * The state machine creates a couple of Lambdas that pass results forward
11
- * and into a Choice state that validates the output.
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
- * -- aws stepfunctions start-execution --state-machine-arn <state-machine-arn-from-output> provides execution arn
18
- * -- aws stepfunctions describe-execution --execution-arn <state-machine-arn-from-output> returns a status of `Succeeded`
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-lambda-invoke-integ');
25
+ const stack = new cdk.Stack(app, 'aws-stepfunctions-tasks-http-invoke-integ');
26
26
 
27
- const submitJobLambda = new Function(stack, 'submitJobLambda', {
28
- code: Code.fromInline(`exports.handler = async (event, context) => {
29
- return {
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 submitJob = new LambdaInvoke(stack, 'Invoke Handler', {
40
- lambdaFunction: submitJobLambda,
41
- payload: sfn.TaskInput.fromObject({
42
- execId: sfn.JsonPath.executionId,
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 checkJobStateLambda = new Function(stack, 'checkJobStateLambda', {
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
- const checkJobState = new LambdaInvoke(stack, 'Check the job state', {
73
- lambdaFunction: checkJobStateLambda,
74
- resultSelector: {
75
- status: sfn.JsonPath.stringAt('$.Payload.status'),
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 isComplete = new sfn.Choice(stack, 'Job Complete?');
80
- const jobFailed = new sfn.Fail(stack, 'Job Failed', {
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 chain = sfn.Chain.start(submitJob)
87
- .next(checkJobState)
88
- .next(
89
- isComplete
90
- .when(sfn.Condition.stringEquals('$.status', 'FAILED'), jobFailed)
91
- .when(sfn.Condition.stringEquals('$.status', 'SUCCEEDED'), finalStatus),
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: chain,
78
+ definition: httpInvokeTask,
96
79
  timeout: cdk.Duration.seconds(30),
97
80
  });
98
81
 
99
- new cdk.CfnOutput(stack, 'stateMachineArn', {
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
- const res = integ.assertions.awsApiCall('StepFunctions', 'startExecution', {
85
+
86
+ // Start an execution
87
+ const start = testCase.assertions.awsApiCall('StepFunctions', 'startExecution', {
107
88
  stateMachineArn: sm.stateMachineArn,
108
89
  });
109
- const executionArn = res.getAttString('executionArn');
110
- integ.assertions.awsApiCall('StepFunctions', 'describeExecution', {
111
- executionArn,
112
- }).expect(ExpectedResult.objectLike({
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 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';
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 { 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
+ 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
- * 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
+ * * 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
- 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);
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 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
- },
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 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'] },
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 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' },
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
- emrRoleBind.node.addDependency(emrRole);
77
-
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);
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 chain = sfn.Chain.start(startJobRunJob);
53
+ const startTask = new sfn.Pass(stack, 'Start Task');
54
+ const endTask = new sfn.Pass(stack, 'End Task');
99
55
 
100
- const sm = new sfn.StateMachine(stack, 'StateMachine', {
101
- definition: chain,
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, 'stateMachineArn', {
106
- value: sm.stateMachineArn,
60
+ new cdk.CfnOutput(stack, 'State Machine ARN Output', {
61
+ value: stateMachine.stateMachineArn,
107
62
  });
108
63
 
109
- new integ.IntegTest(app, 'aws-stepfunctions-tasks-emr-containers-start-job-run-integ', {
64
+ new IntegTest(app, 'AwsSfnIntegTest', {
110
65
  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
- },
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.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_3_0,
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.45.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
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/konokenj.cdk-api-mcp-server.svg)](https://pypi.org/project/konokenj.cdk-api-mcp-server)
27
27
 
28
28
  <!-- DEP-VERSIONS-START -->
29
- [![aws-cdk](https://img.shields.io/badge/aws%20cdk-v2.215.0-blue.svg)](https://github.com/konokenj/cdk-api-mcp-server/blob/main/current-versions/aws-cdk.txt)
29
+ [![aws-cdk](https://img.shields.io/badge/aws%20cdk-v2.217.0-blue.svg)](https://github.com/konokenj/cdk-api-mcp-server/blob/main/current-versions/aws-cdk.txt)
30
30
  <!-- DEP-VERSIONS-END -->
31
31
 
32
32
  ---