Skip to content

Commit bc32fd2

Browse files
authored
feat: Migrate S3 Client from AWS SDK v2 (deprecated) to v3 (#221)
1 parent 1f74921 commit bc32fd2

14 files changed

+6297
-3296
lines changed

.eslintrc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
"globals": {
2929
"Parse": true
3030
}
31-
}
31+
}

.github/workflows/ci.yml

-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ jobs:
3434
- name: Parse Server 7, Node.js 22
3535
NODE_VERSION: 22.4.1
3636
PARSE_SERVER_VERSION: 7
37-
- name: Parse Server 6
38-
NODE_VERSION: 18
39-
PARSE_SERVER_VERSION: 6
4037
fail-fast: false
4138
name: ${{ matrix.name }}
4239
timeout-minutes: 15

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,4 @@ ___
177177

178178

179179

180-
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
180+
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

README.md

+96-13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
[![Coverage](https://img.shields.io/codecov/c/github/parse-community/parse-server-s3-adapter/master.svg)](https://codecov.io/github/parse-community/parse-server-s3-adapter?branch=master)
66
[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-server-s3-adapter/releases)
77

8+
[![Parse Server](https://img.shields.io/badge/Parse_Server-7.0-169CEE.svg?style=flat&logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJ1dWlkLTg2MzQ2MDY1LTNjNjQtNDBlYy1hNmQ0LWUyNzZmM2E0Y2U5MiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTExMy42NiAxMDk5LjQyIj48ZyBpZD0idXVpZC04MWRmNWUyZC04YWQyLTQwMmEtYTNlZS1hYjE2YTQ5NjhhNjciPjxwYXRoIGQ9Ik00ODUuMDMsNzg1LjE0Yy04MC4zMSwwLTE2MC42MS0uMDktMjQwLjkyLjA3LTE5LjY5LjA0LTM4Ljk2LDIuODUtNTYuODksMTEuODYtMzAuNjEsMTUuMzktNDYuMjQsNDAuODYtNTAuNTEsNzQuMTctMS43OCwxMy44Ny0xLjA3LDI3LjUzLDIuNCw0MS4wNyw5Ljg4LDM4LjYxLDQwLjk3LDYzLDgwLjc3LDYzLjYxLDE0LjQ4LjIyLDI4LjYtMS4xMyw0Mi4xOC02LjU3LDIyLjIxLTguODksMzcuNjgtMjQuNjksNDcuNTUtNDYuMjIsNS43LTEyLjQ0LDguNzgtMjUuNiwxMC4wMy0zOS4yMS43LTcuNjUsMS4zNC04LjM5LDkuMDctOC40LDM5LjExLS4wNiw3OC4yMi0uMDYsMTE3LjMzLDAsNy44MS4wMSw4LjcuNzcsOC4yNSw4LjYxLTEuNSwyNS45LTYuMjYsNTEuMTktMTQuOTUsNzUuNjgtOS44OSwyNy44OC0yNC41Miw1Mi45Ni00NC44OCw3NC40OS0xMi4wNiwxMi43NS0yNS44NiwyMy41LTQxLDMyLjM2LTI3LjYxLDE2LjE3LTU3LjU2LDI1LjU0LTg5LjIxLDI5LjYzLTE2LjAzLDIuMDctMzIuMTMsMy41Ni00OC4zMiwyLjk5LTUxLjA1LTEuODEtOTguMTktMTUuMzItMTM4LjkyLTQ3LjM1LTI5LjE4LTIyLjk0LTUwLjIzLTUxLjkxLTYzLjE2LTg2LjczQzQuNDksOTQwLjAzLjIsOTE0LjAyLDAsODg3LjEyYy0uMi0yNy4zOSwzLjIzLTU0LjA2LDEyLjA0LTgwLjAxLDE2LjE1LTQ3LjU1LDQ2LjA0LTg0LjIyLDg4LjM3LTExMC44NSwzMy41LTIxLjA4LDcwLjM1LTMyLjQxLDEwOS41MS0zNi43NiwxOC45My0yLjEsMzcuOTEtMi43OCw1Ni45NS0yLjc4LDE0Ni4wMS4wNiwyOTIuMDItLjE0LDQzOC4wMy4xNCw0MC43OC4wOCw3OS44OC03LjIsMTE3LjEzLTIzLjY0LDUxLjQ0LTIyLjcsOTEuNi01OC4yNSwxMTkuNzUtMTA3LjA4LDE5LjE3LTMzLjI3LDI5Ljk3LTY5LjE0LDMzLjU2LTEwNy4zNSw0LjI0LTQ1LjEyLS42My04OS4xNy0xNi44LTEzMS40Ni0yOS4xNS03Ni4xOS04My4xMS0xMjUuOTUtMTYxLjc0LTE0OC41NS0zMC42OC04LjgxLTYyLjExLTExLjExLTkzLjc0LTkuMDMtNTAuMzEsMy4zMS05Ni41MiwxOC45LTEzNy4wOCw0OS40MS0yNi45OCwyMC4zLTQ4Ljg5LDQ1LjI3LTY1LjkxLDc0LjQ3LTIzLjY0LDQwLjU2LTM2LjIsODQuNTgtNDEuMzYsMTMxLTIuMDUsMTguNDItMi45OSwzNi44NS0yLjkzLDU1LjM4LjEzLDM4LjA3LjA0LDc2LjEzLjA0LDExNC4yLDAsMi4zNS4xLDQuNy0uMDgsNy4wNC0uMzYsNC44Ny0xLjIzLDUuNjktNi4yMiw2LjA4LTEuODIuMTQtMy42NS4wNy01LjQ3LjA3LTM3LjU1LDAtNzUuMDksMC0xMTIuNjQsMC0xLjU2LDAtMy4xMy4wNS00LjY5LS4wNC01Ljk2LS4zMi02Ljc1LTEuMDgtNy4xMS02LjgyLS4wNi0xLjA0LS4wNC0yLjA5LS4wNC0zLjEzLjAyLTQ1LjYzLS44NC05MS4yOC4yOC0xMzYuODgsMS44MS03My44NSwxNi43My0xNDQuODQsNTAuNTQtMjExLjE0LDIxLjE3LTQxLjUxLDQ4LjY0LTc4LjQsODMuMi0xMDkuNzEsNDEuMzktMzcuNDksODguOTYtNjQuMjcsMTQyLjM5LTgwLjcxLDMwLjU1LTkuNCw2MS43NC0xNS4zNSw5My41My0xNy42NSw4MC4yMS01Ljc5LDE1Ny4wNSw2Ljg1LDIyOC42LDQ0Ljg3LDYzLjExLDMzLjU0LDExMi4wMSw4MS44OCwxNDYuNTUsMTQ0LjU1LDI0LjczLDQ0Ljg3LDM5LjE3LDkyLjk2LDQ1LjU3LDE0My43MSwzLjcxLDI5LjM4LDQuMjIsNTguODcsMi4yOSw4OC4yMS00LjU0LDY5LjI2LTI1LjQxLDEzMy4zOS02NC41LDE5MS4xMS0zNS41MSw1Mi40Mi04MS43Miw5Mi44OC0xMzcuNjgsMTIyLjM4LTQ1LjQ5LDIzLjk4LTkzLjg4LDM4LjY1LTE0NC43NSw0NS4zNC0xOS4zOCwyLjU1LTM4Ljg3LDMuNzQtNTguNDYsMy43LTc0LjA1LS4xNi0xNDguMS0uMDYtMjIyLjE0LS4wNloiIHN0eWxlPSJmaWxsOiNlMGUwZTA7Ii8+PC9nPjwvc3ZnPg==)](https://github.com/parse-community/parse-server/releases)
9+
[![Node Version](https://img.shields.io/badge/nodejs-18,_20,_22-green.svg?logo=node.js&style=flat)](https://nodejs.org)
10+
811
[![npm latest version](https://img.shields.io/npm/v/@parse/s3-files-adapter.svg)](https://www.npmjs.com/package/@parse/s3-files-adapter)
912

1013
---
@@ -28,6 +31,9 @@ The official AWS S3 file storage adapter for Parse Server. See [Parse Server S3
2831
- [Adding Metadata and Tags](#adding-metadata-and-tags)
2932
- [Compatibility with other Storage Providers](#compatibility-with-other-storage-providers)
3033
- [Digital Ocean Spaces](#digital-ocean-spaces)
34+
- [Breaking Changes From v2 to v3](#breaking-changes-from-v2-to-v3)
35+
- [Best Practices](#best-practices)
36+
- [Why the Change](#why-the-change)
3137

3238

3339
# Getting Started
@@ -40,21 +46,24 @@ The official AWS S3 file storage adapter for Parse Server. See [Parse Server S3
4046

4147
### Parse Server
4248

43-
| Version | End-of-Life | Compatible |
44-
|---------|---------------|------------|
45-
| <=5 | December 2023 | ✅ Yes |
46-
| 6 | December 2024 | ✅ Yes |
47-
| 7 | December 2025 | ✅ Yes |
49+
Parse Server S3 Adapter is compatible with the following versions of Parse Server.
50+
51+
| Parse Server Version | End-of-Life | Compatible |
52+
|----------------------|---------------|------------|
53+
| <=5 | December 2023 | ❌ No |
54+
| 6 | December 2024 | ❌ No |
55+
| <7.3.0 | December 2025 | ❌ No |
56+
| >=7.3.0 | December 2025 | ✅ Yes |
4857

4958
### Node.js
5059

51-
This product is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
60+
Parse Server S3 Adapter is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
5261

53-
| Version | Latest Version | End-of-Life | Compatible |
54-
|------------|----------------|-------------|------------|
55-
| Node.js 18 | 18.20.4 | April 2025 | ✅ Yes |
56-
| Node.js 20 | 20.15.1 | April 2026 | ✅ Yes |
57-
| Node.js 22 | 22.4.1 | April 2027 | ✅ Yes |
62+
| Node.js Version | End-of-Life | Compatible |
63+
|-----------------|-------------|------------|
64+
| 18 | April 2025 | ✅ Yes |
65+
| 20 | April 2026 | ✅ Yes |
66+
| 22 | April 2027 | ✅ Yes |
5867

5968
## AWS Credentials
6069

@@ -277,7 +286,6 @@ var S3Adapter = require("@parse/s3-files-adapter");
277286
var AWS = require("aws-sdk");
278287

279288
//Configure Digital Ocean Spaces EndPoint
280-
const spacesEndpoint = new AWS.Endpoint(process.env.SPACES_ENDPOINT);
281289
var s3Options = {
282290
bucket: process.env.SPACES_BUCKET_NAME,
283291
baseUrl: process.env.SPACES_BASE_URL,
@@ -290,7 +298,7 @@ var s3Options = {
290298
s3overrides: {
291299
accessKeyId: process.env.SPACES_ACCESS_KEY,
292300
secretAccessKey: process.env.SPACES_SECRET_KEY,
293-
endpoint: spacesEndpoint
301+
endpoint: process.env.SPACES_ENDPOINT
294302
}
295303
};
296304

@@ -307,3 +315,78 @@ var api = new ParseServer({
307315
filesAdapter: s3Adapter
308316
});
309317
```
318+
319+
320+
# Breaking Changes from v2 to v3
321+
322+
1. **Old Method (No Longer Supported)**:
323+
```javascript
324+
const options = {
325+
bucket: 'bucket-1',
326+
s3overrides: {
327+
accessKeyId: 'access-key',
328+
secretAccessKey: 'secret-key'
329+
}
330+
};
331+
```
332+
333+
2. **New Methods (Required)**:
334+
Credentials must now be passed either:
335+
336+
- **Inside the `s3overrides.credentials` key**:
337+
```javascript
338+
const options = {
339+
bucket: 'bucket-1',
340+
s3overrides: {
341+
credentials: {
342+
accessKeyId: 'access-key',
343+
secretAccessKey: 'secret-key'
344+
}
345+
}
346+
};
347+
```
348+
349+
- **Directly in the root object**:
350+
```javascript
351+
const options = {
352+
bucket: 'bucket-1',
353+
credentials: {
354+
accessKeyId: 'access-key',
355+
secretAccessKey: 'secret-key'
356+
}
357+
};
358+
```
359+
360+
## Best Practices
361+
362+
1. **Use Environment Variables for Credentials**:
363+
Storing credentials directly in code can be insecure. Instead, use environment variables with the AWS SDK's built-in support for credential resolution:
364+
```javascript
365+
const options = {
366+
bucket: 'bucket-1',
367+
s3overrides: {
368+
// The SDK will automatically load credentials from the environment
369+
}
370+
};
371+
```
372+
373+
2. **Prefer AWS IAM Roles (for EC2, ECS, or Lambda)**:
374+
If running in AWS-managed environments, use IAM roles to automatically provide temporary credentials:
375+
- No need to pass `credentials` manually; the SDK resolves them automatically.
376+
377+
3. **Use the AWS Credential Provider Chain**:
378+
Leverage the SDK's support for multiple credential sources:
379+
```javascript
380+
import { fromIni } from '`aws-sdk/credential-providers';
381+
382+
const options = {
383+
bucket: 'bucket-1',
384+
s3overrides: {
385+
credentials: fromIni({ profile: 'your-profile-name' })
386+
}
387+
};
388+
```
389+
390+
## Why the Change
391+
392+
The updated approach adheres to AWS SDK v3's modular and secure design, improving compatibility with advanced credential management techniques and security best practices.

0 commit comments

Comments
 (0)