Skip to content

Commit cb852ce

Browse files
migrate to sdk v3 for removeDeleteMarkers
Issue : S3UTILS-204
1 parent eeb784a commit cb852ce

File tree

1 file changed

+85
-74
lines changed

1 file changed

+85
-74
lines changed

removeDeleteMarkers.js

Lines changed: 85 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
/* eslint-disable no-console */
22

3-
const { http } = require('httpagent');
3+
const { http, https } = require('httpagent');
44
const async = require('async');
5-
const AWS = require('aws-sdk');
5+
const crypto = require('crypto');
6+
const {
7+
S3Client,
8+
GetBucketVersioningCommand,
9+
ListObjectVersionsCommand,
10+
DeleteObjectsCommand
11+
} = require('@aws-sdk/client-s3');
12+
const { NodeHttpHandler } = require('@aws-sdk/node-http-handler');
613
const { Logger } = require('werelogs');
714

815
const log = new Logger('s3utils::removeDeleteMarkers');
@@ -78,22 +85,21 @@ const LOG_PROGRESS_INTERVAL = (
7885
&& Number.parseInt(process.env.LOG_PROGRESS_INTERVAL, 10))
7986
|| DEFAULT_LOG_PROGRESS_INTERVAL;
8087

81-
AWS.config.update({
82-
accessKeyId: ACCESS_KEY,
83-
secretAccessKey: SECRET_KEY,
88+
const s3 = new S3Client({
89+
credentials: {
90+
accessKeyId: ACCESS_KEY,
91+
secretAccessKey: SECRET_KEY,
92+
},
8493
endpoint: ENDPOINT,
8594
region: 'us-east-1',
86-
sslEnabled: false,
87-
s3ForcePathStyle: true,
88-
apiVersions: { s3: '2006-03-01' },
89-
signatureVersion: 'v4',
90-
signatureCache: false,
91-
});
92-
93-
const s3 = new AWS.S3({
94-
httpOptions: {
95-
agent: new http.Agent({ keepAlive: true }),
96-
},
95+
forcePathStyle: true,
96+
requestHandler: new NodeHttpHandler({
97+
httpAgent: new http.Agent({ keepAlive: true }),
98+
httpsAgent: new https.Agent({
99+
keepAlive: true,
100+
rejectUnauthorized: false
101+
}),
102+
}),
97103
});
98104

99105
const status = {
@@ -136,36 +142,50 @@ const taskQueue = async.queue((task, done) => {
136142
return next();
137143
}
138144
logProgress('start scanning bucket');
139-
return s3.getBucketVersioning({
145+
return s3.send(new GetBucketVersioningCommand({
140146
Bucket: bucket,
141-
}, (err, data) => {
142-
if (err) {
147+
}))
148+
.then(data => {
149+
if (data.Status !== 'Suspended') {
150+
log.error('bucket versioning status is not "Suspended", skipping bucket', {
151+
bucket,
152+
versioningStatus: data.Status,
153+
});
154+
bucketDone = true;
155+
return next(new Error('bucket not processed'));
156+
}
157+
return next();
158+
})
159+
.catch(err => {
143160
log.error('error getting bucket versioning', {
144161
bucket,
145162
error: err.message,
146163
});
147164
bucketDone = true;
148165
return next(err);
149-
}
150-
if (data.Status !== 'Suspended') {
151-
log.error('bucket versioning status is not "Suspended", skipping bucket', {
152-
bucket,
153-
versioningStatus: data.Status,
154-
});
155-
bucketDone = true;
156-
return next(new Error('bucket not processed'));
157-
}
158-
return next();
159-
});
166+
});
160167
},
161-
next => s3.listObjectVersions({
168+
next => s3.send(new ListObjectVersionsCommand({
162169
Bucket: bucket,
163170
MaxKeys: LISTING_LIMIT,
164171
Prefix: TARGET_PREFIX,
165172
KeyMarker: keyMarker,
166173
VersionIdMarker: versionIdMarker,
167-
}, (err, data) => {
168-
if (err) {
174+
}))
175+
.then(data => {
176+
status.objectsListed += (data.Versions || []).length + (data.DeleteMarkers || []).length;
177+
if (data.NextKeyMarker || data.NextVersionIdMarker) {
178+
taskQueue.push({
179+
bucket,
180+
keyMarker: data.NextKeyMarker,
181+
versionIdMarker: data.NextVersionIdMarker,
182+
});
183+
} else {
184+
bucketDone = true;
185+
}
186+
return next(null, data.DeleteMarkers || []);
187+
})
188+
.catch(err => {
169189
log.error('error listing object versions', {
170190
bucket,
171191
keyMarker,
@@ -174,33 +194,48 @@ const taskQueue = async.queue((task, done) => {
174194
});
175195
bucketDone = true;
176196
return next(err);
177-
}
178-
status.objectsListed += data.Versions.length + data.DeleteMarkers.length;
179-
if (data.NextKeyMarker || data.NextVersionIdMarker) {
180-
taskQueue.push({
181-
bucket,
182-
keyMarker: data.NextKeyMarker,
183-
versionIdMarker: data.NextVersionIdMarker,
184-
});
185-
} else {
186-
bucketDone = true;
187-
}
188-
return next(null, data.DeleteMarkers);
189-
}),
197+
}),
190198
(deleteMarkers, next) => {
191199
if (deleteMarkers.length === 0) {
192200
return next();
193201
}
194-
return s3.deleteObjects({
202+
const command = new DeleteObjectsCommand({
195203
Bucket: bucket,
196204
Delete: {
197205
Objects: deleteMarkers.map(item => ({
198206
Key: item.Key,
199207
VersionId: item.VersionId,
200208
})),
201209
},
202-
}, (err, data) => {
203-
if (err) {
210+
});
211+
212+
return s3.send(command)
213+
.then(data => {
214+
if (data.Deleted) {
215+
status.deleteMarkersDeleted += data.Deleted.length;
216+
data.Deleted.forEach(entry => {
217+
log.info('delete marker deleted', {
218+
bucket,
219+
objectKey: entry.Key,
220+
versionId: entry.VersionId,
221+
});
222+
});
223+
}
224+
if (data.Errors) {
225+
status.deleteMarkersErrors += data.Errors.length;
226+
data.Errors.forEach(entry => {
227+
log.error('error deleting delete marker', {
228+
bucket,
229+
objectKey: entry.Key,
230+
versionId: entry.VersionId,
231+
error: entry.Code,
232+
errorDesc: entry.Message,
233+
});
234+
});
235+
}
236+
return next();
237+
})
238+
.catch(err => {
204239
log.error('batch delete request error', {
205240
bucket,
206241
keyMarker,
@@ -217,31 +252,7 @@ const taskQueue = async.queue((task, done) => {
217252
});
218253
});
219254
return next();
220-
}
221-
if (data.Deleted) {
222-
status.deleteMarkersDeleted += data.Deleted.length;
223-
data.Deleted.forEach(entry => {
224-
log.info('delete marker deleted', {
225-
bucket,
226-
objectKey: entry.Key,
227-
versionId: entry.VersionId,
228-
});
229-
});
230-
}
231-
if (data.Errors) {
232-
status.deleteMarkersErrors += data.Errors.length;
233-
data.Errors.forEach(entry => {
234-
log.error('error deleting delete marker', {
235-
bucket,
236-
objectKey: entry.Key,
237-
versionId: entry.VersionId,
238-
error: entry.Code,
239-
errorDesc: entry.Message,
240-
});
241-
});
242-
}
243-
return next();
244-
});
255+
});
245256
},
246257
], err => {
247258
if (bucketDone) {

0 commit comments

Comments
 (0)