Skip to content

Commit 2dd79a5

Browse files
committed
make keyId and secretKey optional for s3
1 parent 9274201 commit 2dd79a5

File tree

3 files changed

+46
-6
lines changed

3 files changed

+46
-6
lines changed

packages/cubejs-snowflake-driver/src/SnowflakeDriver.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ const SnowflakeToGenericType: Record<string, GenericDataBaseType> = {
106106
interface SnowflakeDriverExportAWS {
107107
bucketType: 's3',
108108
bucketName: string,
109-
keyId: string,
110-
secretKey: string,
109+
keyId?: string,
110+
secretKey?: string,
111111
region: string,
112112
integrationName?: string,
113113
}
@@ -328,14 +328,17 @@ export class SnowflakeDriver extends BaseDriver implements DriverInterface {
328328
if (bucketType === 's3') {
329329
// integrationName is optional for s3
330330
const integrationName = getEnv('dbExportIntegration', { dataSource });
331+
// keyId and secretKey are optional for s3 if IAM role is used
332+
const keyId = getEnv('dbExportBucketAwsKey', { dataSource });
333+
const secretKey = getEnv('dbExportBucketAwsSecret', { dataSource });
331334

332335
return {
333336
bucketType,
334337
bucketName: getEnv('dbExportBucket', { dataSource }),
335-
keyId: getEnv('dbExportBucketAwsKey', { dataSource }),
336-
secretKey: getEnv('dbExportBucketAwsSecret', { dataSource }),
337338
region: getEnv('dbExportBucketAwsRegion', { dataSource }),
338339
...(integrationName !== undefined && { integrationName }),
340+
...(keyId !== undefined && { keyId }),
341+
...(secretKey !== undefined && { secretKey }),
339342
};
340343
}
341344

@@ -387,6 +390,23 @@ export class SnowflakeDriver extends BaseDriver implements DriverInterface {
387390
);
388391
}
389392

393+
private getRequiredExportBucketKeys(
394+
exportBucket: SnowflakeDriverExportBucket,
395+
emptyKeys: string[]
396+
): string[] {
397+
if (exportBucket.bucketType === 's3') {
398+
const s3Config = exportBucket as SnowflakeDriverExportAWS;
399+
const hasCredentials = s3Config.keyId && s3Config.secretKey;
400+
const hasIntegration = s3Config.integrationName;
401+
402+
if (!hasCredentials && !hasIntegration) {
403+
return emptyKeys.filter(key => key !== 'keyId' && key !== 'secretKey');
404+
}
405+
}
406+
407+
return emptyKeys;
408+
}
409+
390410
protected getExportBucket(
391411
dataSource: string,
392412
): SnowflakeDriverExportBucket | undefined {
@@ -402,9 +422,11 @@ export class SnowflakeDriver extends BaseDriver implements DriverInterface {
402422

403423
const emptyKeys = Object.keys(exportBucket)
404424
.filter((key: string) => exportBucket[<keyof SnowflakeDriverExportBucket>key] === undefined);
405-
if (emptyKeys.length) {
425+
const keysToValidate = this.getRequiredExportBucketKeys(exportBucket, emptyKeys);
426+
427+
if (keysToValidate.length) {
406428
throw new Error(
407-
`Unsupported configuration exportBucket, some configuration keys are empty: ${emptyKeys.join(',')}`
429+
`Unsupported configuration exportBucket, some configuration keys are empty: ${keysToValidate.join(',')}`
408430
);
409431
}
410432

packages/cubejs-testing-drivers/fixtures/snowflake.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@
2222
}
2323
}
2424
},
25+
"export-bucket-s3-iam-roles": {
26+
"cube": {
27+
"environment": {
28+
"CUBEJS_DB_EXPORT_BUCKET_TYPE": "s3",
29+
"CUBEJS_DB_EXPORT_BUCKET": "snowflake-drivers-tests-preaggs",
30+
"CUBEJS_DB_EXPORT_BUCKET_AWS_REGION": "us-west-1"
31+
}
32+
}
33+
},
2534
"export-bucket-azure": {
2635
"cube": {
2736
"environment": {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { testQueries } from '../src/tests/testQueries';
2+
3+
testQueries('snowflake', {
4+
// NOTICE: It's enough to turn on this flag only once for any one
5+
// cloud storage integration. Please do not turn it on for every integration test!
6+
includeIncrementalSchemaSuite: false,
7+
includeHLLSuite: false,
8+
extendedEnv: 'export-bucket-s3-iam-roles'
9+
});

0 commit comments

Comments
 (0)