Supporto dell'API di compatibilità Amazon S3 dello storage degli oggetti

Scopri come lo storage degli oggetti supporta l'API di compatibilità Amazon S3.

Il supporto dell'API di compatibilità Amazon S3 viene fornito a livello di bucket e di oggetto. L'API di compatibilità Amazon S3 supporta gli ID di versione.

Supporto SSE-C

Utilizzando intestazioni API facoltative, puoi fornire la tua chiave di cifratura AES a 256 bit utilizzata per cifrare e decifrare gli oggetti caricati e scaricati dallo storage degli oggetti.

Per utilizzare le proprie chiavi per la cifratura lato server, specificare le tre intestazioni di richiesta riportate di seguito con le informazioni sulle chiavi di cifratura.

Intestazioni descrizione; API supportate
x-amz-server-side-encryption-customer-algorithm Specifica "AES256" come algoritmo di cifratura.

GetObject

HeadObject

PutObject

InitiateMultipartUpload

UploadPart

x-amz-server-side-encryption-customer-key Specifica la chiave di cifratura a 256 bit con codifica base64 da utilizzare per cifrare o decifrare i dati.
x-amz-server-side-encryption-customer-key-md5 Specifica il digest MD5 a 128 bit con codifica base64 della chiave di cifratura. Questo valore viene utilizzato per controllare l'integrità della chiave di cifratura.

Lo storage degli oggetti dispone di API distinte per la copia di oggetti e parti. Amazon S3 utilizza la presenza delle seguenti intestazioni in PutObject e UploadPart per trovare le operazioni di copia. Per copiare un oggetto di origine cifrato con una chiave SSE-C, è necessario specificare queste tre intestazioni in modo che lo storage degli oggetti possa decifrare l'oggetto.

Intestazioni descrizione; API supportate
x-amz-copy-source-server-side-encryption-customer-algorithm Specifica "AES256" come algoritmo di cifratura da utilizzare per decifrare l'oggetto di origine.

PutObject

UploadPart

x-amz-copy-source-server-side-encryption-customer-key Specifica la chiave di cifratura a 256 bit con codifica base64 da utilizzare per decifrare l'oggetto di origine.
x-amz-copy-source-server-side-encryption-customer-key-md5 Specifica il digest MD5 a 128 bit con codifica base64 della chiave di cifratura utilizzata per decifrare l'oggetto di origine.

Utilizzo degli SDK S3

Tenere presente quanto riportato di seguito sulle funzioni API non supportate quando si utilizzano gli SDK e gli strumenti precedenti.

  • La versione 2 della firma AWS (SigV2) non è supportata. Utilizzare invece il meccanismo di firma AWS Signature versione 4.

Supporto per la cifratura mediante le chiavi personali nel vault

Utilizzando intestazioni API facoltative, puoi fornire la tua chiave di cifratura nel vault per cifrare gli oggetti caricati nello storage degli oggetti.

Per utilizzare le proprie chiavi nel vault per la cifratura lato server, specificare l'intestazione di richiesta seguente con l'OCID della chiave nel vault:

Intestazioni descrizione; API supportate
x-amz-server-side-encryption-aws-kms-key-id OCID di una chiave esistente nel vault da utilizzare per cifrare l'oggetto.

PutObject

InitiateMultipartUpload

UploadPart

Content-Encoding Supporto intestazione per aws-chunked

I client compatibili con S3 possono caricare gli oggetti utilizzando aws-chunked nell'intestazione Content-Encoding. Sono supportati sia i caricamenti in singola parte che le richieste UploadPart multiparte. Sono supportati i payload di streaming AWS SigV4, tra cui:

  • STREAMING-AWS4-HMAC-SHA256-PAYLOAD
  • STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER
  • STREAMING-UNSIGNED-PAYLOAD-TRAILER

I client possono inviare caricamenti aws-chunked con intestazioni HTTP Content-Length o Transfer-Encoding: chunked. I clienti devono fornire x-amz-decoded-content-length, che l'API di compatibilità Amazon S3 considera come la dimensione effettiva dell'oggetto o della parte. Le firme chunk vengono convalidate, pertanto i caricamenti con dati chunk manomessi o firme chunk non valide vengono rifiutati. Le firme del rimorchio vengono convalidate per i caricamenti firmati in modalità trailer, pertanto vengono rifiutati anche i blocchi di rimorchio manomessi. La convalida del checksum della chiusura è supportata per:

  • CRC32
  • CRC32C
  • SHA256
  • CRC64NVME

Mancate corrispondenze di checksum che causano l'errore del caricamento durante l'elaborazione della richiesta. I checksum dei trailer di SHA256 si integrano con il comportamento additional-checksum esistente, in modo che possano essere resi persistenti in modo coerente con la semantica dei checksum API di compatibilità Amazon S3 esistente. I checksum dei trailer CRC32, CRC32C e CRC64NVME sono di sola verifica, quindi vengono convalidati ma non resi persistenti come metadati dell'oggetto. Il comportamento di caricamento delle API di compatibilità Amazon S3 esistente per i caricamenti non sottoposti a tuning rimane invariato.

Supporto checksum per S3 DeleteObjects / BulkDelete

Le versioni più recenti dell'SDK AWS non aggiungono automaticamente l'intestazione Content-MD5 e sono invece passate a nuove intestazioni (ad esempio x-amz-checksum-crc32) come checksum predefinito. Il flusso DeleteObjects / BulkDelete nell'API di compatibilità Amazon S3 supporta x-amz-checksum-sha256 e x-amz-checksum-crc32c come alternative a Content-MD5 per convalidare il corpo della richiesta.

Se è necessaria la compatibilità con le versioni precedenti dei checksum MD5, utilizzare LegacyMd5Plugin in modo che l'SDK aggiunga l'intestazione Content-MD5 come prima.

Ad esempio:

S3Client s3Client = S3Client.builder()
    .addPlugin(LegacyMd5Plugin.create())
    .endpointOverride(URI.create(endpoint))
    .credentialsProvider(StaticCredentialsProvider.create(
        AwsBasicCredentials.create(accessKey, secretKey)))
    .forcePathStyle(true)
    .build();
Nota

Se si specifica checksumAlgorithm nella richiesta, LegacyMd5Plugin omette l'intestazione Content-MD5.

Client Amazon S3 supportati

Puoi configurare varie applicazioni client per parlare con gli endpoint compatibili con Amazon S3 di Object Storage. Questo argomento fornisce alcuni esempi di configurazione per i client Amazon S3 supportati.

SDK AWS per Java

L'SDK AWS per il repository Java, il download di file e i collegamenti alla documentazione sono disponibili sul sito GitHub: https://github.com/aws/aws-sdk-java.

Ecco un esempio di configurazione dell'SDK AWS per Java per l'uso dello storage degli oggetti


                // Put the Access Key and Secret Key here
                
AWSCredentialsProvider credentials = new AWSStaticCredentialsProvider(new BasicAWSCredentials(
 "gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID",
                         "7fa22331ebe62bf4605dc9a42aaeexampleuniqueID"))));

// Your namespace
String namespace = "namespace";

// The region to connect to
String region = "us-ashburn-1";

// Create an S3 client pointing at the region
String endpoint = String.format("%s.compat.objectstorage.%s.oraclecloud.com",namespace,region);
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endpoint, region);
AmazonS3 client = AmazonS3Client.builder()
 .standard()
 .withCredentials(credentials)
 .withEndpointConfiguration(endpointConfiguration)
 .disableChunkedEncoding()
 .enablePathStyleAccess()
 .build();

SDK AWS per Javascript

L'SDK AWS per il repository Javascript, i collegamenti alla documentazione e le istruzioni di installazione sono disponibili su GitHub: https://github.com/aws/aws-sdk-js.

Ecco un esempio di configurazione dell'SDK AWS per Javascript per l'utilizzo dello storage degli oggetti

s3 = new AWS.S3({
  region: 'us-ashburn-1',
  endpoint: 'https://' + mynamespace + '.compat.objectstorage.us-ashburn-1.oraclecloud.com',
  accessKeyId: 'gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID',
  secretAccessKey: '7fa22331ebe62bf4605dc9a42aaeexampleuniqueID',
  s3ForcePathStyle: true,
  signatureVersion: 'v4',
});

SDK AWS per Python (Boto3)

Il repository SDK AWS per Python (Boto3), i collegamenti alla documentazione e le istruzioni di installazione sono disponibili sul sito GitHub: https://github.com/boto/boto3.

Ecco un esempio di configurazione dell'SDK AWS per Python per utilizzare lo storage degli oggetti

import boto3
  
s3 = boto3.resource(
    's3',
    aws_access_key_id="gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID",
    aws_secret_access_key="7fa22331ebe62bf4605dc9a42aaeexampleuniqueID",
    region_name="us-phoenix-1", # Region name here that matches the endpoint
    endpoint_url="https://mynamespace.compat.objectstorage.us-phoenix-1.oraclecloud.com" # Include your namespace in the URL
)
  
# Print out the bucket names
for bucket in s3.buckets.all():
    print bucket.name

Esecuzione del MOUNT dei bucket di storage degli oggetti mediante s3fs

s3fs consente a Linux e macOS di eseguire il MOUNT dello storage degli oggetti come file system. Il repository s3fs, i collegamenti alla documentazione, le istruzioni di installazione ed esempi sono disponibili sul sito GitHub: https://github.com/s3fs-fuse/s3fs-fuse.

s3fs non è adatto a tutte le applicazioni. Comprendere le seguenti limitazioni:

  • I servizi di storage degli oggetti hanno un'alta latenza rispetto ai file system locali per il tempo necessario al primo byte e non dispongono di accesso in scrittura casuale. s3fs ottiene il throughput migliore sui carichi di lavoro che leggono solo file di grandi dimensioni.
  • Impossibile aggiornare parzialmente un file. La modifica di un singolo byte richiede il caricamento dell'intero file.
  • Le scritture casuali o le aggiunte ai file richiedono la riscrittura dell'intero file.
  • s3fs non supporta i download parziali, quindi anche se si desidera leggere solo un byte di un file, è necessario scaricare l'intero file.
  • s3fs non supporta le copie dei file lato server. I file copiati devono essere prima scaricati nel client e poi caricati nella nuova posizione.
  • Le operazioni dei metadati, come la lista delle directory, hanno prestazioni scadenti a causa della latenza di rete.
  • s3fs non supporta i collegamenti hardware o le ridenominazioni atomiche di file o directory.
  • s3fs non fornisce alcun coordinamento tra più client che montano lo stesso bucket.

Per eseguire il MOUNT di un bucket di storage degli oggetti come file system

  1. Seguire le istruzioni di installazione disponibili all'indirizzo GitHub: https://github.com/s3fs-fuse/s3fs-fuse.

    Se non è possibile eseguire l'installazione utilizzando un pacchetto predefinito, seguire le istruzioni di compilazione disponibili al seguente indirizzo: https://github.com/s3fs-fuse/s3fs-fuse/blob/master/COMPILATION.md.

  2. Immettere le credenziali della coppia chiave di accesso/chiave segreta in un file delle credenziali ${HOME}/.passwd-s3fs:
    cat ${HOME}/.passwd-s3fs
    access_key:secret_key
                                    

    Ad esempio:

    cat ${HOME}/.passwd-s3fs
    gQ4+YC530sBa8qZI6WcbUbtH8oar0exampleuniqueID:7fa22331ebe62bf4605dc9a42aaeexampleuniqueID

    Quindi, impostare le autorizzazioni di solo proprietario per il file delle credenziali:

    chmod 600 ${HOME}/.passwd-s3fs
  3. Creare un punto di accesso per eseguire il MOUNT di un bucket di storage degli oggetti:

    Dove:

    • bucket_name è il nome del bucket che si desidera installare.
    • local_directory_name è il nome della directory locale in cui si desidera installare il bucket.
    • namespace_name è l'elemento univoco generato dal sistema assegnato alla tenancy al momento della creazione dell'account. È possibile utilizzare l'interfaccia CLI o la console per ottenere il nome dello spazio di nomi. Per i dettagli, vedere Spazi di nomi dello storage degli oggetti.
    • region_ID è l'identificativo dell'area in cui risiede il bucket. Per informazioni dettagliate, vedere Aree e domini di disponibilità.
    • endpoint: se si desidera eseguire il MOUNT di un bucket creato nella propria area di origine, non è necessario specificare il parametro endpoint. Se si desidera eseguire il MOUNT di un bucket creato in un'area diversa, è necessario specificare il parametro endpoint.
  4. Per attivare automaticamente il bucket come file system all'avvio del sistema utilizzando s3fs, aggiungere quanto segue al file /etc/fstab:
    
                                        bucket_name /path/to/local_directory_name fuse.s3fs use_path_request_style,passwd_file=/root/.s3fs-password,url=https://namespace_name.compat.objectstorage.region_ID.oraclecloud.com,endpoint=region_ID kernel_cache,multipart_size=128,parallel_count=50,multireq_max=100,max_background=1000,_netdev
  5. Per verificare l'attivazione del bucket s3fs, eseguire il comando df -h. L'output mostra il nuovo punto di accesso per il bucket. Passare al nuovo punto di accesso ed eseguire il comando ls per elencare tutti gli oggetti nel bucket.

Per risolvere i problemi relativi all'esecuzione del MOUNT di un bucket di storage degli oggetti

  • Se ricevi errori di autorizzazione, rivedi i criteri IAM e assicurati di averne uno che ti consenta di eseguire il MOUNT di un bucket come file system. Ad esempio:
    Allow group s3fsAdmins to manage object-family in compartment MyCompartment
  • Assicurarsi di utilizzare il nome dello spazio di nomi corretto nell'URL nel comando s3fs. Per verificare il nome dello spazio di nomi, vedere Spazi di nomi dello storage degli oggetti.
  • Assicurarsi che il bucket denominato che si sta tentando di installare esista e si trovi in un compartimento a cui si ha accesso. Utilizzare uno dei modi seguenti per verificare il nome del bucket:
    • Eseguire il login alla console e trovare il bucket denominato nel compartimento a cui si ha accesso.
    • Utilizzare il comando CLI oci os bucket list --namespace <object_storage_namespace> --compartment-id <target_compartment_id> .
  • Per eseguire il MOUNT di un bucket creato in un'area diversa dall'area di origine, è necessario specificare l'altra area nei parametri url e endpoint.
  • Se si monta un bucket come utente root, gli altri utenti non possono elencare o accedere agli oggetti nel bucket a meno che non si aggiunga -o allow_other al comando s3fs o allow_other alle opzioni di MOUNT /etc/fstab. È inoltre possibile fornire parametri UID e GID specifici per specificare i dettagli di accesso utente.
  • Se le soluzioni di risoluzione dei problemi sono state esaminate e verificate ed è necessario contattare il supporto clienti, eseguire nuovamente il comando mount in modalità DEBUG per ottenere ulteriori dettagli sull'errore. Aggiungere quanto segue alla fine del comando e salvare l'output:

    -o dbglevel=info -f -o curldbg

Per eseguire il NO MOUNT di un bucket di storage degli oggetti da un file system

Eseguire il comando seguente, specificando il punto di attivazione:
umount /path/to/<local_directory_name>
                            

Interfaccia (CLI, Command-Line Interface) AWS