packages/app/src/config.ts (71 lines of code) (raw):
interface SetRetentionConfig {
retentionInDays: number;
}
interface StructuredDataConfig {
structuredDataBucket: string;
structuredDataKey: string;
}
interface ConfigureLogShippingConfig extends StructuredDataConfig {
logNamePrefixes: string[];
logShippingFilterName: string;
logShippingLambdaArn: string;
}
interface ShipLogsConfig extends StructuredDataConfig {
kinesisStreamName: string;
}
function getRequiredEnv(key: string, devDefault?: string): string {
const value = process.env[key];
// happy path
if (value) {
return value;
}
const stage = process.env['STAGE'] ?? 'DEV';
const shouldUseDevDefault = stage === 'DEV';
// happy path, when in DEV
if (devDefault && shouldUseDevDefault) {
return devDefault;
}
// unhappy path
throw new Error(`Missing ENV var ${key}`);
}
interface AwsClientConfig {
region: string;
maxAttempts: number;
}
export function awsClientConfig(): AwsClientConfig {
const region = getRequiredEnv('AWS_REGION');
const maxAttempts = 10;
return {
region,
maxAttempts,
};
}
export function getSetRetentionConfig(): SetRetentionConfig {
const retentionInDays = parseInt(getRequiredEnv('RETENTION_IN_DAYS', '14'));
return {
retentionInDays,
};
}
export function getConfigureLogShippingConfig(): ConfigureLogShippingConfig {
const logNamePrefixes = getRequiredEnv('LOG_NAME_PREFIXES', '')
.split(',')
.filter((prefix) => prefix.length !== 0);
const logShippingLambdaArn = getRequiredEnv('LOG_SHIPPING_LAMBDA_ARN');
const structuredDataBucket = getRequiredEnv('STRUCTURED_DATA_BUCKET');
return {
logNamePrefixes,
logShippingFilterName: 'GuLogShippingLambdaFilter',
logShippingLambdaArn,
structuredDataBucket,
structuredDataKey: 'structured-data.json',
};
}
export function getShipLogsConfig(): ShipLogsConfig {
const kinesisStream = getRequiredEnv('LOG_KINESIS_STREAM');
const structuredDataBucket = getRequiredEnv('STRUCTURED_DATA_BUCKET');
const kinesisStreamName = kinesisStream.includes('/')
? kinesisStream.split('/')[1]
: kinesisStream;
return {
kinesisStreamName,
structuredDataBucket,
structuredDataKey: 'structured-data.json',
};
}