This repository has been archived by the owner on Apr 10, 2024. It is now read-only.
/
index.ts
105 lines (95 loc) · 3.02 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import * as aws_glue from '@aws-cdk/aws-glue-alpha';
import { aws_kms, aws_s3, RemovalPolicy, Stack, StackProps, Tags } from 'aws-cdk-lib';
import { EncryptionOption, WorkGroup } from 'cdk-athena';
import * as statement from 'cdk-iam-floyd';
import { Construct } from 'constructs';
import * as Migration from '../../lib';
export class TestStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const tableName = `test_table`;
const dbName = this.stackName.toLowerCase();
const bucket = new aws_s3.Bucket(this, 'Bucket', {
encryptionKey: aws_kms.Alias.fromAliasName(this, 'Key', 'aws/s3'),
autoDeleteObjects: true,
removalPolicy: RemovalPolicy.DESTROY,
});
const db = new aws_glue.Database(this, 'Database', {
databaseName: dbName,
});
const workgroup = new WorkGroup(this, 'WorkGroup', {
name: `${this.stackName}-test-workgroup`,
resultConfiguration: {
outputLocation: `s3://${bucket.bucketName}/output`,
encryptionConfiguration: {
encryptionOption: EncryptionOption.SSE_S3,
},
},
});
const m1 = new Migration.Athena(this, 'M1', {
dependsOn: [bucket, db, workgroup],
workGroup: workgroup.name,
up: `
CREATE EXTERNAL TABLE ${dbName}.${tableName} (
Id INT,
Name STRING,
Address STRING
)
PARTITIONED BY (
date STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://${bucket.bucketName}/input';
`,
down: `DROP TABLE ${dbName}.${tableName};`,
});
new Migration.Athena(this, 'M2', {
dependsOn: [m1],
workGroup: workgroup.name,
up: `
ALTER TABLE ${dbName}.${tableName}
SET TBLPROPERTIES (
'projection.enabled'='true',
'projection.date.format'='yyyy/MM/dd',
'projection.date.interval'='1',
'projection.date.interval.unit'='DAYS',
'projection.date.range'='2021/01/01,NOW',
'projection.date.type'='date',
'storage.location.template'='s3://${bucket.bucketName}/input/\${date}'
);
`,
down: `
ALTER TABLE ${dbName}.${tableName}
SET TBLPROPERTIES (
'projection.enabled'='false'
);
`,
});
bucket.grantReadWrite(m1.role);
[
new statement.S3()
.allow()
.toGetBucketLocation()
.toListBucket()
.toListBucketMultipartUploads()
.toListMultipartUploadParts()
.toAbortMultipartUpload()
.onBucket(bucket.bucketName)
.onObject(bucket.bucketName, '*'),
new statement.Athena()
.allow()
.toStartQueryExecution()
.toGetQueryExecution(),
new statement.Glue()
.allow()
.toGetTable()
.toGetDatabase()
.toCreateTable()
.toDeleteTable()
.toUpdateTable()
.toUpdatePartition(),
].forEach((statement) => {
m1.role.addToPolicy(statement);
});
}
}