konokenj.cdk-api-mcp-server 0.29.0__py3-none-any.whl → 0.31.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cdk_api_mcp_server/__about__.py +1 -1
- cdk_api_mcp_server/resources/aws-cdk/constructs/@aws-cdk/aws-lambda-python-alpha/README.md +17 -4
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api-dualstack.ts +4 -3
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.api.ts +4 -2
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2/integ.stage.ts +20 -7
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-authorizers/integ.iam.ts +38 -34
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-apigatewayv2-integrations/integ.sqs.ts +71 -58
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-backup/README.md +2 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-backup/integ.backup.ts +12 -1
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cloudwatch/README.md +32 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cloudwatch/integ.alarm-and-dashboard.ts +1 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-cloudwatch/integ.math-alarm-and-dashboard.ts +4 -0
- 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-codepipeline-actions/integ.pipeline-elastic-beanstalk-deploy.ts +1 -1
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ec2/README.md +13 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-ec2/integ.client-vpn-endpoint-client-route-enforcement.ts +68 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-eks/integ.helm-chart-logging.ts +55 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-lambda/README.md +15 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-lambda/integ.log-retention.ts +8 -2
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/README.md +23 -13
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.cluster-snapshot.ts +3 -71
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-rds/integ.instance-engine-lifecycle-support.ts +53 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-s3-notifications/integ.bucket-notifications.ts +42 -80
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.call-aws-service-cross-region-lambda.ts +97 -0
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/aws-stepfunctions-tasks/integ.start-job-run.ts +51 -106
- cdk_api_mcp_server/resources/aws-cdk/constructs/aws-cdk-lib/cx-api/FEATURE_FLAGS.md +156 -156
- {konokenj_cdk_api_mcp_server-0.29.0.dist-info → konokenj_cdk_api_mcp_server-0.31.0.dist-info}/METADATA +2 -2
- {konokenj_cdk_api_mcp_server-0.29.0.dist-info → konokenj_cdk_api_mcp_server-0.31.0.dist-info}/RECORD +32 -28
- {konokenj_cdk_api_mcp_server-0.29.0.dist-info → konokenj_cdk_api_mcp_server-0.31.0.dist-info}/WHEEL +0 -0
- {konokenj_cdk_api_mcp_server-0.29.0.dist-info → konokenj_cdk_api_mcp_server-0.31.0.dist-info}/entry_points.txt +0 -0
- {konokenj_cdk_api_mcp_server-0.29.0.dist-info → konokenj_cdk_api_mcp_server-0.31.0.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as ec2 from 'aws-cdk-lib/aws-ec2';
|
|
2
|
+
import { App, RemovalPolicy, Stack } from 'aws-cdk-lib';
|
|
3
|
+
import * as rds from 'aws-cdk-lib/aws-rds';
|
|
4
|
+
import { IntegTest } from '@aws-cdk/integ-tests-alpha';
|
|
5
|
+
import { InstanceSnapshoter } from './snapshoter';
|
|
6
|
+
|
|
7
|
+
const app = new App({
|
|
8
|
+
postCliContext: {
|
|
9
|
+
'@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy': true,
|
|
10
|
+
'@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const stack = new Stack(app, 'cdk-instance-engine-lifecycle-support');
|
|
15
|
+
|
|
16
|
+
const vpc = new ec2.Vpc(stack, 'Vpc', { maxAzs: 2, natGateways: 1, restrictDefaultSecurityGroup: false });
|
|
17
|
+
|
|
18
|
+
const engine = rds.DatabaseInstanceEngine.mysql({ version: rds.MysqlEngineVersion.VER_8_4_5 });
|
|
19
|
+
const instanceType = ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.SMALL);
|
|
20
|
+
|
|
21
|
+
const sourceInstance = new rds.DatabaseInstance(stack, 'Instance', {
|
|
22
|
+
engine,
|
|
23
|
+
instanceType,
|
|
24
|
+
vpc,
|
|
25
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
26
|
+
engineLifecycleSupport: rds.EngineLifecycleSupport.OPEN_SOURCE_RDS_EXTENDED_SUPPORT,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const snapshoter = new InstanceSnapshoter(stack, 'Snapshoter', {
|
|
30
|
+
instance: sourceInstance,
|
|
31
|
+
snapshotIdentifier: 'cdk-instance-engine-lifecycle-support-snapshot',
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const restoredInstance = new rds.DatabaseInstanceFromSnapshot(stack, 'FromSnapshot', {
|
|
35
|
+
snapshotIdentifier: snapshoter.snapshotArn,
|
|
36
|
+
engine,
|
|
37
|
+
instanceType,
|
|
38
|
+
vpc,
|
|
39
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
40
|
+
engineLifecycleSupport: rds.EngineLifecycleSupport.OPEN_SOURCE_RDS_EXTENDED_SUPPORT_DISABLED,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
new rds.DatabaseInstanceReadReplica(stack, 'ReadReplica', {
|
|
44
|
+
sourceDatabaseInstance: restoredInstance,
|
|
45
|
+
instanceType,
|
|
46
|
+
vpc,
|
|
47
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
48
|
+
engineLifecycleSupport: rds.EngineLifecycleSupport.OPEN_SOURCE_RDS_EXTENDED_SUPPORT_DISABLED,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
new IntegTest(app, 'cdk-instance-engine-lifecycle-support-test', {
|
|
52
|
+
testCases: [stack],
|
|
53
|
+
});
|
|
@@ -1,106 +1,68 @@
|
|
|
1
|
-
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
1
|
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
2
|
+
import * as sqs from 'aws-cdk-lib/aws-sqs';
|
|
3
3
|
import * as cdk from 'aws-cdk-lib';
|
|
4
|
-
import * as s3n from 'aws-cdk-lib/aws-s3-notifications';
|
|
5
|
-
import { STANDARD_NODEJS_RUNTIME } from '../../../config';
|
|
6
|
-
import * as constructs from 'constructs';
|
|
7
4
|
import * as integ from '@aws-cdk/integ-tests-alpha';
|
|
5
|
+
import * as s3n from 'aws-cdk-lib/aws-s3-notifications';
|
|
8
6
|
|
|
9
7
|
const app = new cdk.App({
|
|
10
8
|
postCliContext: {
|
|
11
|
-
'@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
|
|
12
9
|
'@aws-cdk/aws-s3:keepNotificationInImportedBucket': false,
|
|
13
10
|
},
|
|
14
11
|
});
|
|
15
12
|
|
|
16
|
-
const stack = new cdk.Stack(app, '
|
|
13
|
+
const stack = new cdk.Stack(app, 'sqs-bucket-notifications');
|
|
17
14
|
|
|
18
|
-
const
|
|
15
|
+
const bucket1 = new s3.Bucket(stack, 'Bucket1', {
|
|
19
16
|
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
20
17
|
});
|
|
18
|
+
const queue = new sqs.Queue(stack, 'MyQueue');
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
runtime: STANDARD_NODEJS_RUNTIME,
|
|
24
|
-
handler: 'index.handler',
|
|
25
|
-
code: lambda.Code.fromInline(`exports.handler = ${handler.toString()}`),
|
|
26
|
-
});
|
|
20
|
+
bucket1.addObjectCreatedNotification(new s3n.SqsDestination(queue));
|
|
27
21
|
|
|
28
|
-
const
|
|
22
|
+
const bucket2 = new s3.Bucket(stack, 'Bucket2', {
|
|
29
23
|
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
24
|
+
autoDeleteObjects: true,
|
|
30
25
|
});
|
|
26
|
+
bucket2.addObjectCreatedNotification(new s3n.SqsDestination(queue), { suffix: '.png' });
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const c1 = new constructs.Construct(stack, 'Construct1');
|
|
35
|
-
const unmanagedBucket = s3.Bucket.fromBucketName(c1, 'IntegUnmanagedBucket1', bucketA.bucketName);
|
|
36
|
-
|
|
37
|
-
unmanagedBucket.addObjectCreatedNotification(new s3n.LambdaDestination(fn), { prefix: 'TEST1/', suffix: '.png' });
|
|
38
|
-
unmanagedBucket.addEventNotification(s3.EventType.OBJECT_CREATED, new s3n.LambdaDestination(fn), { prefix: 'TEST2/' });
|
|
28
|
+
const encryptedQueue = new sqs.Queue(stack, 'EncryptedQueue', { encryption: sqs.QueueEncryption.KMS });
|
|
29
|
+
bucket1.addObjectRemovedNotification(new s3n.SqsDestination(encryptedQueue));
|
|
39
30
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
const bucket3 = new s3.Bucket(stack, 'Bucket3WithSkipDestinationValidation', {
|
|
32
|
+
notificationsSkipDestinationValidation: true,
|
|
33
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
34
|
+
});
|
|
35
|
+
const queueWithIncorrectS3Permissions = new sqs.Queue(stack, 'MyQueueWithIncorrectS3Permissions');
|
|
36
|
+
queueWithIncorrectS3Permissions.addToResourcePolicy(
|
|
37
|
+
new cdk.aws_iam.PolicyStatement({
|
|
38
|
+
effect: cdk.aws_iam.Effect.DENY,
|
|
39
|
+
actions: ['sqs:SendMessage'],
|
|
40
|
+
principals: [new cdk.aws_iam.ServicePrincipal('s3.amazonaws.com')],
|
|
41
|
+
resources: [queueWithIncorrectS3Permissions.queueArn],
|
|
42
|
+
}));
|
|
43
|
+
bucket3.addEventNotification(s3.EventType.OBJECT_TAGGING_PUT, new s3n.SqsDestination(queueWithIncorrectS3Permissions));
|
|
45
44
|
|
|
46
|
-
const integTest = new integ.IntegTest(app, '
|
|
47
|
-
cdkCommandOptions: {
|
|
48
|
-
deploy: {
|
|
49
|
-
args: {
|
|
50
|
-
rollback: false,
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
},
|
|
45
|
+
const integTest = new integ.IntegTest(app, 'SQSBucketNotificationsTest', {
|
|
54
46
|
testCases: [stack],
|
|
55
47
|
diffAssets: true,
|
|
56
48
|
});
|
|
57
49
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
50
|
+
integTest.assertions
|
|
51
|
+
// First remove the test notifications
|
|
52
|
+
.awsApiCall('SQS', 'purgeQueue', {
|
|
53
|
+
QueueUrl: queue.queueUrl,
|
|
54
|
+
})
|
|
55
|
+
.next(integTest.assertions
|
|
56
|
+
.awsApiCall('S3', 'putObject', {
|
|
57
|
+
Bucket: bucket2.bucketName,
|
|
58
|
+
Key: 'image.png',
|
|
59
|
+
Body: 'Some content',
|
|
60
|
+
}))
|
|
61
|
+
.next(integTest.assertions
|
|
62
|
+
.awsApiCall('SQS', 'receiveMessage', {
|
|
63
|
+
QueueUrl: queue.queueUrl,
|
|
64
|
+
WaitTimeSeconds: 20,
|
|
65
|
+
})
|
|
66
|
+
.assertAtPath('Messages.0.Body.Records.0.s3.object.key', integ.ExpectedResult.stringLikeRegexp('image\\.png')));
|
|
67
67
|
|
|
68
|
-
getNotifications.expect(integ.ExpectedResult.objectLike({
|
|
69
|
-
LambdaFunctionConfigurations: [
|
|
70
|
-
{
|
|
71
|
-
Events: [
|
|
72
|
-
's3:ObjectCreated:*',
|
|
73
|
-
],
|
|
74
|
-
Filter: {
|
|
75
|
-
Key: {
|
|
76
|
-
FilterRules: [
|
|
77
|
-
{
|
|
78
|
-
Name: 'Prefix',
|
|
79
|
-
Value: 'TEST1/',
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
Name: 'Suffix',
|
|
83
|
-
Value: '.png',
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
Events: [
|
|
91
|
-
's3:ObjectCreated:*',
|
|
92
|
-
],
|
|
93
|
-
Filter: {
|
|
94
|
-
Key: {
|
|
95
|
-
FilterRules: [
|
|
96
|
-
{
|
|
97
|
-
Name: 'Prefix',
|
|
98
|
-
Value: 'TEST2/',
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
}));
|
|
106
68
|
app.synth();
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as cdk from 'aws-cdk-lib';
|
|
2
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
3
|
+
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
4
|
+
import { ExpectedResult, IntegTest, Match } from '@aws-cdk/integ-tests-alpha';
|
|
5
|
+
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
6
|
+
|
|
7
|
+
class TestStack extends cdk.Stack {
|
|
8
|
+
public readonly stateMachine: sfn.StateMachine;
|
|
9
|
+
constructor(scope: cdk.App, id: string, props: cdk.StackProps = {}) {
|
|
10
|
+
super(scope, id, props);
|
|
11
|
+
// Create a target Lambda function that returns JSON response
|
|
12
|
+
const targetLambda = new lambda.Function(this, 'TargetLambda', {
|
|
13
|
+
runtime: lambda.Runtime.NODEJS_18_X,
|
|
14
|
+
handler: 'index.handler',
|
|
15
|
+
code: lambda.Code.fromInline(`
|
|
16
|
+
exports.handler = async (event) => {
|
|
17
|
+
console.log('Target Lambda received event:', JSON.stringify(event, null, 2));
|
|
18
|
+
|
|
19
|
+
// Return a JSON response that should be properly serialized
|
|
20
|
+
return {
|
|
21
|
+
statusCode: 200,
|
|
22
|
+
body: {
|
|
23
|
+
status: 'success',
|
|
24
|
+
message: 'Hello from target Lambda',
|
|
25
|
+
receivedData: event
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
`),
|
|
30
|
+
description: 'Target Lambda function for CallAwsServiceCrossRegion testing',
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Create a cross-region Lambda invoke task using CallAwsServiceCrossRegion
|
|
34
|
+
const crossRegionInvokeTask = tasks.CallAwsServiceCrossRegion.jsonata(this, 'CrossRegionLambdaInvoke', {
|
|
35
|
+
service: 'lambda',
|
|
36
|
+
action: 'invoke',
|
|
37
|
+
region: 'us-east-1',
|
|
38
|
+
parameters: {
|
|
39
|
+
FunctionName: targetLambda.functionArn,
|
|
40
|
+
Payload: JSON.stringify({
|
|
41
|
+
hello: 'world',
|
|
42
|
+
testData: 'reproduction',
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
iamResources: [targetLambda.functionArn],
|
|
46
|
+
iamAction: 'lambda:InvokeFunction',
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Create a Step Functions state machine to execute the cross-region task
|
|
50
|
+
this.stateMachine = new sfn.StateMachine(this, 'TestStateMachine', {
|
|
51
|
+
definitionBody: sfn.DefinitionBody.fromChainable(crossRegionInvokeTask),
|
|
52
|
+
timeout: cdk.Duration.minutes(5),
|
|
53
|
+
comment: 'State machine to reproduce issue 34768 - CallAwsServiceCrossRegion byte array bug',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const app = new cdk.App({
|
|
59
|
+
postCliContext: {
|
|
60
|
+
'@aws-cdk/aws-lambda:useCdkManagedLogGroup': false,
|
|
61
|
+
'@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy': false,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const stack = new TestStack(app, 'aws-stepfunctions-call-aws-service-cross-region-lambda-integ');
|
|
66
|
+
|
|
67
|
+
const integ = new IntegTest(app, 'IntegTest', {
|
|
68
|
+
testCases: [stack],
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Start the Step Functions execution
|
|
72
|
+
const res = integ.assertions.awsApiCall('StepFunctions', 'startExecution', {
|
|
73
|
+
stateMachineArn: stack.stateMachine.stateMachineArn,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const executionArn = res.getAttString('executionArn');
|
|
77
|
+
|
|
78
|
+
// Describe the execution to see the output
|
|
79
|
+
const describe = integ.assertions
|
|
80
|
+
.awsApiCall('StepFunctions', 'describeExecution', {
|
|
81
|
+
executionArn,
|
|
82
|
+
})
|
|
83
|
+
.expect(ExpectedResult.objectLike({
|
|
84
|
+
status: 'SUCCEEDED',
|
|
85
|
+
}))
|
|
86
|
+
.waitForAssertions({
|
|
87
|
+
totalTimeout: cdk.Duration.minutes(5),
|
|
88
|
+
interval: cdk.Duration.seconds(10),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Verify that the output contains the expected Lambda response structure as JSON
|
|
92
|
+
// This ensures the response is properly serialized as JSON, not as byte array
|
|
93
|
+
describe.expect(ExpectedResult.objectLike({
|
|
94
|
+
output: Match.stringLikeRegexp('.*"statusCode":200.*"status":"success".*"message":"Hello from target Lambda".*'),
|
|
95
|
+
}));
|
|
96
|
+
|
|
97
|
+
app.synth();
|
|
@@ -1,124 +1,69 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as glue from 'aws-cdk-lib/aws-glue';
|
|
2
3
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
3
|
-
import * as
|
|
4
|
+
import * as assets from 'aws-cdk-lib/aws-s3-assets';
|
|
4
5
|
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
|
|
5
6
|
import * as cdk from 'aws-cdk-lib';
|
|
6
|
-
import {
|
|
7
|
+
import { GlueStartJobRun } from 'aws-cdk-lib/aws-stepfunctions-tasks';
|
|
8
|
+
import { IntegTest } from '@aws-cdk/integ-tests-alpha';
|
|
7
9
|
|
|
8
10
|
/*
|
|
9
11
|
* Stack verification steps:
|
|
10
|
-
* * aws stepfunctions start-execution --state-machine-arn <deployed state machine arn>
|
|
11
|
-
* * aws stepfunctions describe-execution --execution-arn <
|
|
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.
|
|
12
17
|
*/
|
|
13
18
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
super(scope, id, props);
|
|
17
|
-
|
|
18
|
-
const region = this.region;
|
|
19
|
-
|
|
20
|
-
const outputBucket = new s3.Bucket(this, 'JobOutputBucket', {
|
|
21
|
-
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
const role = new iam.Role(this, 'DataBrew Role', {
|
|
25
|
-
managedPolicies: [{
|
|
26
|
-
managedPolicyArn: 'arn:aws:iam::aws:policy/service-role/AWSGlueDataBrewServiceRole',
|
|
27
|
-
}],
|
|
28
|
-
path: '/',
|
|
29
|
-
assumedBy: new iam.ServicePrincipal('databrew.amazonaws.com'),
|
|
30
|
-
inlinePolicies: {
|
|
31
|
-
DataBrewPolicy: iam.PolicyDocument.fromJson({
|
|
32
|
-
Statement: [{
|
|
33
|
-
Effect: 'Allow',
|
|
34
|
-
Action: [
|
|
35
|
-
's3:GetObject',
|
|
36
|
-
's3:PutObject',
|
|
37
|
-
's3:DeleteObject',
|
|
38
|
-
's3:ListBucket',
|
|
39
|
-
],
|
|
40
|
-
Resource: [
|
|
41
|
-
`arn:aws:s3:::databrew-public-datasets-${region}/*`,
|
|
42
|
-
`arn:aws:s3:::databrew-public-datasets-${region}`,
|
|
43
|
-
`${outputBucket.bucketArn}/*`,
|
|
44
|
-
`${outputBucket.bucketArn}`,
|
|
45
|
-
],
|
|
46
|
-
}],
|
|
47
|
-
}),
|
|
48
|
-
},
|
|
49
|
-
});
|
|
19
|
+
const app = new cdk.App();
|
|
20
|
+
const stack = new cdk.Stack(app, 'aws-stepfunctions-integ');
|
|
50
21
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
{
|
|
55
|
-
action: {
|
|
56
|
-
operation: 'UPPER_CASE',
|
|
57
|
-
parameters: {
|
|
58
|
-
sourceColumn: 'description',
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
action: {
|
|
64
|
-
operation: 'DELETE',
|
|
65
|
-
parameters: {
|
|
66
|
-
sourceColumn: 'doc_id',
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
});
|
|
22
|
+
const codeAsset = new assets.Asset(stack, 'Glue Job Script', {
|
|
23
|
+
path: path.join(__dirname, 'my-glue-script/job.py'),
|
|
24
|
+
});
|
|
72
25
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
name: 'dataset-1',
|
|
81
|
-
});
|
|
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'),
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
codeAsset.grantRead(jobRole);
|
|
82
33
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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,
|
|
43
|
+
});
|
|
91
44
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
bucket: outputBucket.bucketName,
|
|
100
|
-
},
|
|
101
|
-
}],
|
|
102
|
-
});
|
|
103
|
-
job.addDependency(project);
|
|
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
|
+
}),
|
|
51
|
+
});
|
|
104
52
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
53
|
+
const startTask = new sfn.Pass(stack, 'Start Task');
|
|
54
|
+
const endTask = new sfn.Pass(stack, 'End Task');
|
|
108
55
|
|
|
109
|
-
|
|
56
|
+
const stateMachine = new sfn.StateMachine(stack, 'State Machine', {
|
|
57
|
+
definition: sfn.Chain.start(startTask).next(jobTask).next(endTask),
|
|
58
|
+
});
|
|
110
59
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
});
|
|
60
|
+
new cdk.CfnOutput(stack, 'State Machine ARN Output', {
|
|
61
|
+
value: stateMachine.stateMachineArn,
|
|
62
|
+
});
|
|
115
63
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
64
|
+
new IntegTest(app, 'AwsSfnIntegTest', {
|
|
65
|
+
testCases: [stack],
|
|
66
|
+
diffAssets: true,
|
|
67
|
+
});
|
|
121
68
|
|
|
122
|
-
const app = new cdk.App();
|
|
123
|
-
new GlueDataBrewJobStack(app, 'aws-stepfunctions-tasks-databrew-start-job-run-integ');
|
|
124
69
|
app.synth();
|