Skip to content

Commit 07c7d05

Browse files
authored
switch to s3 client for listing buckets to narrow based on LocationCo… (#221)
1 parent ff9096a commit 07c7d05

File tree

3 files changed

+365
-3
lines changed

3 files changed

+365
-3
lines changed

src/resourceState/ResourceStateManager.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { DateTime } from 'luxon';
33
import { SchemaRetriever } from '../schema/SchemaRetriever';
44
import { CfnExternal } from '../server/CfnExternal';
55
import { CcapiService } from '../services/CcapiService';
6+
import { S3Service } from '../services/S3Service';
67
import { ISettingsSubscriber, SettingsConfigurable, SettingsSubscription } from '../settings/ISettingsSubscriber';
78
import { DefaultSettings, ProfileSettings } from '../settings/Settings';
89
import { LoggerFactory } from '../telemetry/LoggerFactory';
@@ -47,6 +48,7 @@ export class ResourceStateManager implements SettingsConfigurable, Closeable {
4748
constructor(
4849
private readonly ccapiService: CcapiService,
4950
private readonly schemaRetriever: SchemaRetriever,
51+
private readonly s3Service: S3Service,
5052
) {
5153
this.registerCacheGauges();
5254
this.initializeCounters();
@@ -176,6 +178,23 @@ export class ResourceStateManager implements SettingsConfigurable, Closeable {
176178
}
177179

178180
private async retrieveResourceList(typeName: string, nextToken?: string): Promise<ResourceList | undefined> {
181+
if (typeName === 'AWS::S3::Bucket') {
182+
try {
183+
const response = await this.s3Service.listBuckets(this.settings.region, nextToken);
184+
const now = DateTime.now();
185+
return {
186+
typeName,
187+
resourceIdentifiers: response.buckets,
188+
createdTimestamp: now,
189+
lastUpdatedTimestamp: now,
190+
nextToken: response.nextToken,
191+
};
192+
} catch (error) {
193+
log.error(error, `S3 ListBuckets failed for region ${this.settings.region}`);
194+
return;
195+
}
196+
}
197+
179198
try {
180199
const output = await this.ccapiService.listResources(typeName, { nextToken });
181200

@@ -310,6 +329,6 @@ export class ResourceStateManager implements SettingsConfigurable, Closeable {
310329
}
311330

312331
static create(external: CfnExternal) {
313-
return new ResourceStateManager(external.ccapiService, external.schemaRetriever);
332+
return new ResourceStateManager(external.ccapiService, external.schemaRetriever, external.s3Service);
314333
}
315334
}

src/services/S3Service.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { readFileSync } from 'fs';
22
import { fileURLToPath } from 'url';
3-
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
3+
import { S3Client, PutObjectCommand, ListBucketsCommand } from '@aws-sdk/client-s3';
4+
import { Measure } from '../telemetry/TelemetryDecorator';
45
import { AwsClient } from './AwsClient';
56

67
export class S3Service {
@@ -11,6 +12,23 @@ export class S3Service {
1112
return await request(client);
1213
}
1314

15+
@Measure({ name: 'listBuckets' })
16+
async listBuckets(region: string, continuationToken?: string): Promise<{ buckets: string[]; nextToken?: string }> {
17+
return await this.withClient(async (client) => {
18+
const response = await client.send(
19+
new ListBucketsCommand({
20+
BucketRegion: region,
21+
ContinuationToken: continuationToken,
22+
}),
23+
);
24+
return {
25+
buckets:
26+
response.Buckets?.map((b) => b.Name).filter((name): name is string => name !== undefined) ?? [],
27+
nextToken: response.ContinuationToken,
28+
};
29+
});
30+
}
31+
1432
async putObjectContent(content: string | Buffer, bucketName: string, key: string) {
1533
return await this.withClient(async (client) => {
1634
return await client.send(

0 commit comments

Comments
 (0)