UNPKG

cdk-athena-log

Version:

A CDK construct to create an Athena table for querying ALB logs.

85 lines 15.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AthenaTableForWaf = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs_1 = require("constructs"); /** * S3に保存されたAWS WAFログをクエリするためのGlueテーブルを作成します。 * このコンストラクトは、公式ドキュメントのdate型パーティション射影に準拠します。 */ class AthenaTableForWaf extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); const { logBucketName, databaseName, tableName, wafScope, webAclName, projectionStartDate, // ★ プロパティを受け取る logPrefix, } = props; const stack = aws_cdk_lib_1.Stack.of(this); const account = stack.account; const logRegion = wafScope === 'CLOUDFRONT' ? 'cloudfront' : stack.region; const s3Prefix = logPrefix ? `${logPrefix}/` : ''; const s3BaseLocation = `s3://${logBucketName}/${s3Prefix}AWSLogs/${account}/WAFLogs/${logRegion}/${webAclName}/`; const s3LocationTemplate = `${s3BaseLocation}\${log_time}`; this.table = new aws_cdk_lib_1.aws_glue.CfnTable(this, 'Default', { catalogId: account, databaseName: databaseName, tableInput: { name: tableName, tableType: 'EXTERNAL_TABLE', parameters: { 'projection.enabled': 'true', 'projection.log_time.type': 'date', 'projection.log_time.format': 'yyyy/MM/dd/HH/mm', 'projection.log_time.range': `${projectionStartDate}/00/00,NOW`, 'projection.log_time.interval': '1', 'projection.log_time.interval.unit': 'MINUTES', 'storage.location.template': s3LocationTemplate, }, partitionKeys: [{ name: 'log_time', type: 'string' }], storageDescriptor: { columns: [ { name: 'timestamp', type: 'bigint' }, { name: 'formatversion', type: 'int' }, { name: 'webaclid', type: 'string' }, { name: 'terminatingruleid', type: 'string' }, { name: 'terminatingruletype', type: 'string' }, { name: 'action', type: 'string' }, { name: 'terminatingrulematchdetails', type: 'array<struct<conditiontype:string,sensitivitylevel:string,location:string,matcheddata:array<string>>>' }, { name: 'httpsourcename', type: 'string' }, { name: 'httpsourceid', type: 'string' }, { name: 'rulegrouplist', type: 'array<struct<rulegroupid:string,terminatingrule:struct<ruleid:string,action:string,rulematchdetails:string>,nonterminatingmatchingrules:array<struct<ruleid:string,action:string,rulematchdetails:string>>,excludedrules:string>>', }, { name: 'ratebasedrulelist', type: 'array<struct<ratebasedruleid:string,limitkey:string,maxrateallowed:int>>' }, { name: 'nonterminatingmatchingrules', type: 'array<struct<ruleid:string,action:string,rulematchdetails:string>>' }, { name: 'requestheadersinserted', type: 'array<struct<name:string,value:string>>' }, { name: 'responsecodesent', type: 'string' }, { name: 'httprequest', type: 'struct<clientip:string,country:string,headers:array<struct<name:string,value:string>>,uri:string,args:string,httpversion:string,httpmethod:string,requestid:string,fragment:string,scheme:string,host:string>', }, { name: 'labels', type: 'array<struct<name:string>>' }, { name: 'captcharesponse', type: 'struct<responsecode:string,solvetimestamp:string,failurereason:string>' }, { name: 'challengeresponse', type: 'struct<responsecode:string,solvetimestamp:string,failurereason:string>' }, { name: 'ja3fingerprint', type: 'string' }, { name: 'ja4fingerprint', type: 'string' }, { name: 'oversizefields', type: 'string' }, { name: 'requestbodysize', type: 'int' }, { name: 'requestbodysizeinspectedbywaf', type: 'int' }, ], location: s3BaseLocation, inputFormat: 'org.apache.hadoop.mapred.TextInputFormat', outputFormat: 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat', serdeInfo: { serializationLibrary: 'org.openx.data.jsonserde.JsonSerDe', }, }, }, }); } } exports.AthenaTableForWaf = AthenaTableForWaf; _a = JSII_RTTI_SYMBOL_1; AthenaTableForWaf[_a] = { fqn: "cdk-athena-log.AthenaTableForWaf", version: "0.0.14" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRoZW5hLXRhYmxlLWZvci13YWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXRoZW5hLXRhYmxlLWZvci13YWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBc0Q7QUFDdEQsMkNBQXVDO0FBeUJ2Qzs7O0dBR0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLHNCQUFTO0lBRzlDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixtQkFBbUIsRUFBRSxlQUFlO1FBQ3BDLFNBQVMsR0FDVixHQUFHLEtBQUssQ0FBQztRQUVWLE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFOUIsTUFBTSxTQUFTLEdBQUcsUUFBUSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBRTFFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLFFBQVEsYUFBYSxJQUFJLFFBQVEsV0FBVyxPQUFPLFlBQVksU0FBUyxJQUFJLFVBQVUsR0FBRyxDQUFDO1FBQ2pILE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxjQUFjLGNBQWMsQ0FBQztRQUUzRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksc0JBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUM5QyxTQUFTLEVBQUUsT0FBTztZQUNsQixZQUFZLEVBQUUsWUFB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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF3c19nbHVlIGFzIGdsdWUsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hVGFibGVGb3JXYWZQcm9wcyB7XG4gIC8qKiBTM+OBq+S/neWtmOOBleOCjOOBn1dBRuODreOCsOOBruODkOOCseODg+ODiOWQjSAqL1xuICByZWFkb25seSBsb2dCdWNrZXROYW1lOiBzdHJpbmc7XG4gIC8qKiBHbHVl44OH44O844K/44OZ44O844K55ZCNICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICAvKiog5L2c5oiQ44GZ44KLR2x1ZeODhuODvOODluODq+WQjSAqL1xuICByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFdBRuOBruOCueOCs+ODvOODl+OCkuaMh+WumuOBl+OBvuOBmeOAglxuICAgKiAnUkVHSU9OQUwnIOOBvuOBn+OBryAnQ0xPVURGUk9OVCdcbiAgICovXG4gIHJlYWRvbmx5IHdhZlNjb3BlOiAnUkVHSU9OQUwnIHwgJ0NMT1VERlJPTlQnO1xuICAvKiog44Kv44Ko44Oq5a++6LGh44GuV2ViIEFDTOWQjSAqL1xuICByZWFkb25seSB3ZWJBY2xOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDimIUg44OR44O844OG44Kj44K344On44Oz5bCE5b2x44Gu6ZaL5aeL5pelICh5eXl5L01NL2Rk5b2i5byPKVxuICAgKiBAZXhhbXBsZSAnMjAyNS8wOC8xMSdcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Rpb25TdGFydERhdGU6IHN0cmluZztcbiAgLyoqIOODkOOCseODg+ODiOWGheOBruOCquODl+OCt+ODp+ODs+OBruODl+ODrOODleOCo+ODg+OCr+OCuSAqL1xuICByZWFkb25seSBsb2dQcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUzPjgavkv53lrZjjgZXjgozjgZ9BV1MgV0FG44Ot44Kw44KS44Kv44Ko44Oq44GZ44KL44Gf44KB44GuR2x1ZeODhuODvOODluODq+OCkuS9nOaIkOOBl+OBvuOBmeOAglxuICog44GT44Gu44Kz44Oz44K544OI44Op44Kv44OI44Gv44CB5YWs5byP44OJ44Kt44Ol44Oh44Oz44OI44GuZGF0ZeWei+ODkeODvOODhuOCo+OCt+ODp+ODs+WwhOW9seOBq+a6luaLoOOBl+OBvuOBmeOAglxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hVGFibGVGb3JXYWYgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGU6IGdsdWUuQ2ZuVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF0aGVuYVRhYmxlRm9yV2FmUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgbG9nQnVja2V0TmFtZSxcbiAgICAgIGRhdGFiYXNlTmFtZSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHdhZlNjb3BlLFxuICAgICAgd2ViQWNsTmFtZSxcbiAgICAgIHByb2plY3Rpb25TdGFydERhdGUsIC8vIOKYhSDjg5fjg63jg5Hjg4bjgqPjgpLlj5fjgZHlj5bjgotcbiAgICAgIGxvZ1ByZWZpeCxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IGFjY291bnQgPSBzdGFjay5hY2NvdW50O1xuXG4gICAgY29uc3QgbG9nUmVnaW9uID0gd2FmU2NvcGUgPT09ICdDTE9VREZST05UJyA/ICdjbG91ZGZyb250JyA6IHN0YWNrLnJlZ2lvbjtcblxuICAgIGNvbnN0IHMzUHJlZml4ID0gbG9nUHJlZml4ID8gYCR7bG9nUHJlZml4fS9gIDogJyc7XG4gICAgY29uc3QgczNCYXNlTG9jYXRpb24gPSBgczM6Ly8ke2xvZ0J1Y2tldE5hbWV9LyR7czNQcmVmaXh9QVdTTG9ncy8ke2FjY291bnR9L1dBRkxvZ3MvJHtsb2dSZWdpb259LyR7d2ViQWNsTmFtZX0vYDtcbiAgICBjb25zdCBzM0xvY2F0aW9uVGVtcGxhdGUgPSBgJHtzM0Jhc2VMb2NhdGlvbn1cXCR7bG9nX3RpbWV9YDtcblxuICAgIHRoaXMudGFibGUgPSBuZXcgZ2x1ZS5DZm5UYWJsZSh0aGlzLCAnRGVmYXVsdCcsIHtcbiAgICAgIGNhdGFsb2dJZDogYWNjb3VudCxcbiAgICAgIGRhdGFiYXNlTmFtZTogZGF0YWJhc2VOYW1lLFxuICAgICAgdGFibGVJbnB1dDoge1xuICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgIHRhYmxlVHlwZTogJ0VYVEVSTkFMX1RBQkxFJyxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICdwcm9qZWN0aW9uLmVuYWJsZWQnOiAndHJ1ZScsXG4gICAgICAgICAgJ3Byb2plY3Rpb24ubG9nX3RpbWUudHlwZSc6ICdkYXRlJyxcbiAgICAgICAgICAncHJvamVjdGlvbi5sb2dfdGltZS5mb3JtYXQnOiAneXl5eS9NTS9kZC9ISC9tbScsXG4gICAgICAgICAgJ3Byb2plY3Rpb24ubG9nX3RpbWUucmFuZ2UnOiBgJHtwcm9qZWN0aW9uU3RhcnREYXRlfS8wMC8wMCxOT1dgLFxuICAgICAgICAgICdwcm9qZWN0aW9uLmxvZ190aW1lLmludGVydmFsJzogJzEnLFxuICAgICAgICAgICdwcm9qZWN0aW9uLmxvZ190aW1lLmludGVydmFsLnVuaXQnOiAnTUlOVVRFUycsXG4gICAgICAgICAgJ3N0b3JhZ2UubG9jYXRpb24udGVtcGxhdGUnOiBzM0xvY2F0aW9uVGVtcGxhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnRpdGlvbktleXM6IFt7IG5hbWU6ICdsb2dfdGltZScsIHR5cGU6ICdzdHJpbmcnIH1dLFxuICAgICAgICBzdG9yYWdlRGVzY3JpcHRvcjoge1xuICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdiaWdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdmb3JtYXR2ZXJzaW9uJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3dlYmFjbGlkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3Rlcm1pbmF0aW5ncnVsZWlkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3Rlcm1pbmF0aW5ncnVsZXR5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYWN0aW9uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3Rlcm1pbmF0aW5ncnVsZW1hdGNoZGV0YWlscycsIHR5cGU6ICdhcnJheTxzdHJ1Y3Q8Y29uZGl0aW9udHlwZTpzdHJpbmcsc2Vuc2l0aXZpdHlsZXZlbDpzdHJpbmcsbG9jYXRpb246c3RyaW5nLG1hdGNoZWRkYXRhOmFycmF5PHN0cmluZz4+PicgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2h0dHBzb3VyY2VuYW1lJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2h0dHBzb3VyY2VpZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdydWxlZ3JvdXBsaXN0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2FycmF5PHN0cnVjdDxydWxlZ3JvdXBpZDpzdHJpbmcsdGVybWluYXRpbmdydWxlOnN0cnVjdDxydWxlaWQ6c3RyaW5nLGFjdGlvbjpzdHJpbmcscnVsZW1hdGNoZGV0YWlsczpzdHJpbmc+LG5vbnRlcm1pbmF0aW5nbWF0Y2hpbmdydWxlczphcnJheTxzdHJ1Y3Q8cnVsZWlkOnN0cmluZyxhY3Rpb246c3RyaW5nLHJ1bGVtYXRjaGRldGFpbHM6c3RyaW5nPj4sZXhjbHVkZWRydWxlczpzdHJpbmc+PicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBuYW1lOiAncmF0ZWJhc2VkcnVsZWxpc3QnLCB0eXBlOiAnYXJyYXk8c3RydWN0PHJhdGViYXNlZHJ1bGVpZDpzdHJpbmcsbGltaXRrZXk6c3RyaW5nLG1heHJhdGVhbGxvd2VkOmludD4+JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnbm9udGVybWluYXRpbmdtYXRjaGluZ3J1bGVzJywgdHlwZTogJ2FycmF5PHN0cnVjdDxydWxlaWQ6c3RyaW5nLGFjdGlvbjpzdHJpbmcscnVsZW1hdGNoZGV0YWlsczpzdHJpbmc+PicgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3JlcXVlc3RoZWFkZXJzaW5zZXJ0ZWQnLCB0eXBlOiAnYXJyYXk8c3RydWN0PG5hbWU6c3RyaW5nLHZhbHVlOnN0cmluZz4+JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAncmVzcG9uc2Vjb2Rlc2VudCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdodHRwcmVxdWVzdCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJ1Y3Q8Y2xpZW50aXA6c3RyaW5nLGNvdW50cnk6c3RyaW5nLGhlYWRlcnM6YXJyYXk8c3RydWN0PG5hbWU6c3RyaW5nLHZhbHVlOnN0cmluZz4+LHVyaTpzdHJpbmcsYXJnczpzdHJpbmcsaHR0cHZlcnNpb246c3RyaW5nLGh0dHBtZXRob2Q6c3RyaW5nLHJlcXVlc3RpZDpzdHJpbmcsZnJhZ21lbnQ6c3RyaW5nLHNjaGVtZTpzdHJpbmcsaG9zdDpzdHJpbmc+JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdsYWJlbHMnLCB0eXBlOiAnYXJyYXk8c3RydWN0PG5hbWU6c3RyaW5nPj4nIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdjYXB0Y2hhcmVzcG9uc2UnLCB0eXBlOiAnc3RydWN0PHJlc3BvbnNlY29kZTpzdHJpbmcsc29sdmV0aW1lc3RhbXA6c3RyaW5nLGZhaWx1cmVyZWFzb246c3RyaW5nPicgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NoYWxsZW5nZXJlc3BvbnNlJywgdHlwZTogJ3N0cnVjdDxyZXNwb25zZWNvZGU6c3RyaW5nLHNvbHZldGltZXN0YW1wOnN0cmluZyxmYWlsdXJlcmVhc29uOnN0cmluZz4nIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdqYTNmaW5nZXJwcmludCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdqYTRmaW5nZXJwcmludCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdvdmVyc2l6ZWZpZWxkcycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdyZXF1ZXN0Ym9keXNpemUnLCB0eXBlOiAnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAncmVxdWVzdGJvZHlzaXplaW5zcGVjdGVkYnl3YWYnLCB0eXBlOiAnaW50JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYXRpb246IHMzQmFzZUxvY2F0aW9uLFxuICAgICAgICAgIGlucHV0Rm9ybWF0OiAnb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLlRleHRJbnB1dEZvcm1hdCcsXG4gICAgICAgICAgb3V0cHV0Rm9ybWF0OiAnb3JnLmFwYWNoZS5oYWRvb3AuaGl2ZS5xbC5pby5IaXZlSWdub3JlS2V5VGV4dE91dHB1dEZvcm1hdCcsXG4gICAgICAgICAgc2VyZGVJbmZvOiB7XG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uTGlicmFyeTogJ29yZy5vcGVueC5kYXRhLmpzb25zZXJkZS5Kc29uU2VyRGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=