1
0
Fork 0

Make object storage ACL configurable

Override this value to allow uploads to non-public S3
buckets. Otherwise "AccessDenied: Access Denied" errors will end up in
the log.

Fixes #4850
This commit is contained in:
Doug Luce 2022-03-15 08:57:12 -07:00 committed by Chocobozzz
parent 60233e90d2
commit f9915efa5e
5 changed files with 28 additions and 8 deletions

View File

@ -138,6 +138,9 @@ object_storage:
region: 'us-east-1' region: 'us-east-1'
# Set this ACL on each uploaded object
upload_acl: 'public-read'
credentials: credentials:
# You can also use AWS_ACCESS_KEY_ID env variable # You can also use AWS_ACCESS_KEY_ID env variable
access_key_id: '' access_key_id: ''

View File

@ -134,6 +134,9 @@ object_storage:
region: 'us-east-1' region: 'us-east-1'
# Set this ACL on each uploaded object
upload_acl: 'public'
credentials: credentials:
# You can also use AWS_ACCESS_KEY_ID env variable # You can also use AWS_ACCESS_KEY_ID env variable
access_key_id: '' access_key_id: ''

View File

@ -114,6 +114,7 @@ const CONFIG = {
MAX_UPLOAD_PART: bytes.parse(config.get<string>('object_storage.max_upload_part')), MAX_UPLOAD_PART: bytes.parse(config.get<string>('object_storage.max_upload_part')),
ENDPOINT: config.get<string>('object_storage.endpoint'), ENDPOINT: config.get<string>('object_storage.endpoint'),
REGION: config.get<string>('object_storage.region'), REGION: config.get<string>('object_storage.region'),
UPLOAD_ACL: config.get<string>('object_storage.upload_acl'),
CREDENTIALS: { CREDENTIALS: {
ACCESS_KEY_ID: config.get<string>('object_storage.credentials.access_key_id'), ACCESS_KEY_ID: config.get<string>('object_storage.credentials.access_key_id'),
SECRET_ACCESS_KEY: config.get<string>('object_storage.credentials.secret_access_key') SECRET_ACCESS_KEY: config.get<string>('object_storage.credentials.secret_access_key')

View File

@ -6,10 +6,12 @@ import {
CompletedPart, CompletedPart,
CompleteMultipartUploadCommand, CompleteMultipartUploadCommand,
CreateMultipartUploadCommand, CreateMultipartUploadCommand,
CreateMultipartUploadCommandInput,
DeleteObjectCommand, DeleteObjectCommand,
GetObjectCommand, GetObjectCommand,
ListObjectsV2Command, ListObjectsV2Command,
PutObjectCommand, PutObjectCommand,
PutObjectCommandInput,
UploadPartCommand UploadPartCommand
} from '@aws-sdk/client-s3' } from '@aws-sdk/client-s3'
import { pipelinePromise } from '@server/helpers/core-utils' import { pipelinePromise } from '@server/helpers/core-utils'
@ -143,12 +145,17 @@ async function objectStoragePut (options: {
}) { }) {
const { objectStorageKey, content, bucketInfo } = options const { objectStorageKey, content, bucketInfo } = options
const command = new PutObjectCommand({ const input: PutObjectCommandInput = {
Bucket: bucketInfo.BUCKET_NAME, Bucket: bucketInfo.BUCKET_NAME,
Key: buildKey(objectStorageKey, bucketInfo), Key: buildKey(objectStorageKey, bucketInfo),
Body: content, Body: content
ACL: 'public-read' }
})
if (CONFIG.OBJECT_STORAGE.UPLOAD_ACL) {
input.ACL = CONFIG.OBJECT_STORAGE.UPLOAD_ACL
}
const command = new PutObjectCommand(input)
await getClient().send(command) await getClient().send(command)
@ -167,11 +174,16 @@ async function multiPartUpload (options: {
const statResult = await stat(inputPath) const statResult = await stat(inputPath)
const createMultipartCommand = new CreateMultipartUploadCommand({ const input: CreateMultipartUploadCommandInput = {
Bucket: bucketInfo.BUCKET_NAME, Bucket: bucketInfo.BUCKET_NAME,
Key: key, Key: buildKey(objectStorageKey, bucketInfo)
ACL: 'public-read' }
})
if (CONFIG.OBJECT_STORAGE.UPLOAD_ACL) {
input.ACL = CONFIG.OBJECT_STORAGE.UPLOAD_ACL
}
const createMultipartCommand = new CreateMultipartUploadCommand(input)
const createResponse = await s3Client.send(createMultipartCommand) const createResponse = await s3Client.send(createMultipartCommand)
const fd = await open(inputPath, 'r') const fd = await open(inputPath, 'r')

View File

@ -66,6 +66,7 @@ object_storage:
bucket_name: "PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_BUCKET_NAME" bucket_name: "PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_BUCKET_NAME"
prefix: "PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_PREFIX" prefix: "PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_PREFIX"
base_url: "PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_BASE_URL" base_url: "PEERTUBE_OBJECT_STORAGE_STREAMING_PLAYLISTS_BASE_URL"
upload_acl: "PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL"
videos: videos:
bucket_name: "PEERTUBE_OBJECT_STORAGE_VIDEOS_BUCKET_NAME" bucket_name: "PEERTUBE_OBJECT_STORAGE_VIDEOS_BUCKET_NAME"