cdk-athena-log
Version:
A CDK construct to create an Athena table for querying ALB logs.
85 lines • 15.9 kB
JavaScript
"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=