IBM Cloud Docs
Objetos de Versão

Objetos de Versão

A versão permite que várias revisões de um único objeto existam no mesmo depósito. Cada versão de um objeto pode ser consultada, lida, restaurada de um estado arquivado ou excluída. A ativação da versão em um depósito pode minimizar a perda de dados de erro do usuário ou exclusão inadvertida. Quando um objeto é substituído, uma nova versão é criada e a versão anterior do objeto é preservada automaticamente. Portanto, em um depósito ativado por versão, os objetos que são excluídos como resultado de exclusão ou substituição acidental podem ser facilmente recuperados restaurando uma versão anterior do objeto. Se um objeto for excluído, ele será substituído por um marcador de exclusão e a versão anterior será salva (nada será excluído permanentemente. Para excluir permanentemente versões individuais de um objeto, uma solicitação de exclusão deve especificar um ID da versão. Uma solicitação de GET para um objeto recuperará a versão armazenada mais recentemente Se a versão atual for um marcador de exclusão, o IBM COS retorna um erro 404 Not Found.

Após um depósito ter ativado a versão, todos os objetos no depósito serão com versão. Todos os novos objetos (criados após a ativação da versão em um depósito) receberão um ID de versão designado permanentemente. Os objetos criados antes da versão ser ativada (no depósito) são designados a uma versão do null. Quando um objeto com um ID de versão do null é sobrescrito ou excluído, ele recebe um novo ID de versão. A suspensão da versão não altera nenhum objeto existente, mas mudará a maneira como as solicitações futuras são manipuladas pelo IBM COS. Depois de ativado, o versionamento pode ser suspenso apenas e não totalmente desativado. Portanto, um depósito pode ter três estados relacionados à versão: 1. Padrão (sem versão), 2. Ativado ou 3. Suspenso.

Introdução ao versionamento

Primeiro, crie um novo depósito com a versão do objeto ativada.

  1. Depois de navegar para a sua instância de armazenamento de objetos, clique em Criar depósito
  2. Escolha uma região e resiliência, em seguida, procure Versão do objeto e alterne o seletor para Ativado.

Ativar controle de versão
Ativar controle de versão

Em seguida, crie um objeto com versão.

  1. Navegue em seu novo depósito e faça upload de um arquivo arrastando-o para a janela do navegador
  2. Após o objeto ser transferido por upload com sucesso, faça upload de outro objeto com o mesmo nome. Em vez de ser sobrescrito, o arquivo receberá um UUID e será salvo como uma versão não atual do objeto.
  3. Alterne Visualizar versões para ver e interagir com versões alternativas de objetos..

Exibir versões
Exibir versões

Terminologia

Excluir marcador: um objeto 'invisível' que permite acessar versões do objeto excluído.

ID da versão: Uma string opaca codificada em Unicode, UTF-8, URL-safe, que indica uma versão exclusiva de um objeto e metadados associados, e é usada para direcionar solicitações para essa versão específica. IDs de versão têm no máximo 1.024 bytes de comprimento.

'null': um ID de versão especial designado a objetos que existiam quando a versão era ativada em um depósito.

Consistência e integridade de dados

Enquanto o IBM COS fornece uma consistência forte para todas as operações de E/S de dados, a configuração do depósito é eventualmente consistente Depois de ativar a versão pela primeira vez em um depósito, pode levar alguns minutos para que a configuração se propague pelo sistema. Embora o controle de versão possa parecer ativado, é recomendável aguardar 5 minutos após ativá-lo para fazer qualquer solicitação que possa criar versões ou excluir marcadores.

Ações do IAM

Há novas ações do IAM associadas à versão.

Ações de IAM associadas ao controle de versão
Ação do IAM Função
cloud-object-storage.bucket.put_versioning Gerenciador, gravador
cloud-object-storage.bucket.get_versioning Gerenciador, Gravador, Leitor
cloud-object-storage.object.get_version Gerenciador, Gravador, Leitor, Leitor de Conteúdo, Leitor de Objeto
cloud-object-storage.object.head_version Gerenciador, Gravador, Leitor, Leitor de Conteúdo, Leitor de Objeto
cloud-object-storage.bucket.delete_version Gerenciador, gravador
cloud-object-storage.object.get_versions Gerenciador, Gravador, Leitor, Leitor de Conteúdo, Leitor de Objeto
cloud-object-storage.object.copy_get_version Gerenciador, Gravador, Leitor
cloud-object-storage.object.copy_part_get_version Gerenciador, Gravador, Leitor
cloud-object-storage.object.restore_version Gerenciador, gravador
cloud-object-storage.object.put_tagging_version Gerenciador, Gravador, Gravador de objeto
cloud-object-storage.object.get_tagging_version Gerenciador, Gravador, Leitor
cloud-object-storage.object.delete_tagging_version Gerenciador, gravador

Eventos do Activity Tracker

A versão gerará novos eventos.

  • cloud-object-storage.bucket-versioning.create
  • cloud-object-storage.bucket-versioning.read
  • cloud-object-storage.bucket-versioning.list

Os eventos de gerenciamento para depósitos com versão contêm um campo requestData.versioning.state, indicando se a versão está ativada ou suspensa em um depósito.

As ações básicas HEAD, GET, PUT e DELETE que agem ou criam versões de objetos incluirão um campo target.versionId. O campo target.versionId também está presente ao concluir um upload de várias partes e ao copiar objetos ou partes, se uma nova versão for criada devido a essas ações

Um campo responseData.deleteMarker.created está presente quando um objeto é excluído e um marcador de exclusão é criado

Uso e contabilidade

Todas as versões são medidas como se fossem objetos iguais. Isso significa que se um depósito contiver um único objeto com cinco versões anteriores, o campo object_count retornado pela API de Configuração de Recurso será 6, mesmo que ele apareça como se houvesse apenas um único objeto no depósito Da mesma forma, versões acumuladas contribuem para o uso total e são faturáveis. Além do campo object_count retornado pela API Read Bucket Metadata, o corpo de resposta da API contém vários novos campos associados à versão:

  • noncurrent_object_count: número de versões de objeto não atuais no depósito no formato int64.
  • noncurrent_bytes_used: tamanho total de todas as versões de objeto não atuais no depósito no formato int64.
  • delete_marker_count: número total de marcadores de exclusão no depósito no formato int64.

Conforme mencionado, a versão só pode ser ativada ou suspensa. Se, por qualquer motivo, houver um desejo de desativar completamente a versão, será necessário migrar o conteúdo do depósito para um novo depósito que não tenha a versão ativada.

Interações

A implementação IBM COS das APIs S3 para controle de versão é idêntica às APIs AWS S3 para controle de versão, com algumas diferenças.

Arquivando e Expirando Objetos com Versão

As configurações de ciclo de vida são permitidas em um depósito ativado por versão No entanto, ao contrário do Amazon S3, novas versões estão sujeitas à regra de archive da mesma maneira que objetos regulares. Os objetos recebem uma data de transição quando são criados e são arquivados em suas datas de transição individuais, independentemente de serem versões atuais ou não. Sobrescrever um objeto não afeta a data de transição da versão anterior e a nova versão (atual) será designada uma data de transição.

Não é possível usar regras NoncurrentVersionTransition para arquivar apenas versões não atuais de objetos em uma configuração de ciclo de vida.

Imutável Object Storage (WORM)

A implementação do IBM COS do Immutable Object Storage (ou seja, políticas de retenção) não é permitida em depósitos com versão ativada. As tentativas de criar uma política de retenção falharão, assim como as tentativas de ativar a versão em um depósito com uma política de retenção.

APIs do S3 suportadas

O conjunto de APIs REST a seguir pode interagir com a versão de alguma maneira:

  • GET Object
  • HEAD Object
  • DELETE Object
  • GET Object ACL
  • PUT Object ACL
  • Upload Part Copy
  • Restore Object
  • DELETE Objects
  • List Object Versions
  • PUT Bucket Versioning
  • GET Bucket Versioning
  • PUT Object
  • POST Object
  • Copy Object
  • Complete Multipart Upload
  • PUT Object Tagging
  • GET Object Tagging
  • DELETE Object Tagging
  • PUT Bucket Lifecycle
  • GET Bucket Lifecycle
  • DELETE Bucket Lifecycle

Exemplos da API REST

Os exemplos a seguir são mostrados usando cURL para facilidade de uso.. Variáveis de ambiente são usadas para representar elementos específicos do usuário, como $BUCKET, $TOKEN e $REGION. Observe que o $REGION também incluiria quaisquer especificações de tipo de rede, portanto, enviar uma solicitação para um depósito no us-south usando a rede privada exigiria a configuração da variável como private.us-south.

Ativar a versão em um depósito

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: 8qj8HSeDu3APPMQZVG06WQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<VersioningConfiguration>
            <Status>Enabled</Status>
          </VersioningConfiguration>'

Uma solicitação bem-sucedida retorna uma resposta de 200

Suspender versão em um depósito

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versioning" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: hxXDWuCDWB72Be0LG4XniQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<VersioningConfiguration>
            <Status>Suspended</Status>
          </VersioningConfiguration>'

Uma solicitação bem-sucedida retorna uma resposta de 200

Listar versões de objetos em um bucket

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?versions" \
     -H 'Authorization: bearer $TOKEN'

Isso retorna um corpo de resposta XML:

<ListVersionsResult>
   <IsTruncated>boolean</IsTruncated>
   <KeyMarker>string</KeyMarker>
   <VersionIdMarker>string</VersionIdMarker>
   <NextKeyMarker>string</NextKeyMarker>
   <NextVersionIdMarker>string</NextVersionIdMarker>
   <Version>
      <ETag>string</ETag>
      <IsLatest>boolean</IsLatest>
      <Key>string</Key>
      <LastModified>timestamp</LastModified>
      <Owner>
         <DisplayName>string</DisplayName>
         <ID>string</ID>
      </Owner>
      <Size>integer</Size>
      <StorageClass>string</StorageClass>
      <VersionId>string</VersionId>
   </Version>
   ...
   <DeleteMarker>
      <IsLatest>boolean</IsLatest>
      <Key>string</Key>
      <LastModified>timestamp</LastModified>
      <Owner>
         <DisplayName>string</DisplayName>
         <ID>string</ID>
      </Owner>
      <VersionId>string</VersionId>
   </DeleteMarker>
   ...
   <Name>string</Name>
   <Prefix>string</Prefix>
   <Delimiter>string</Delimiter>
   <MaxKeys>integer</MaxKeys>
   <CommonPrefixes>
      <Prefix>string</Prefix>
   </CommonPrefixes>
   ...
   <EncodingType>string</EncodingType>
</ListVersionsResult>

delimiter: Um delimitador é um caractere que você especifica para agrupar chaves. Todas as chaves que contêm a mesma cadeia entre o prefixo e a primeira ocorrência do delimitador são agrupadas sob um único elemento de resultado em CommonPrefixes Esses grupos são contados como um resultado com relação à limitação de chaves máximas. Essas chaves não são retornadas em outro lugar na resposta..

encoding-type: solicita o COS para codificar por URL as chaves de objeto na resposta. As chaves do objeto podem conter qualquer caractere Unicode; no entanto, o analisador XML 1.0 não pode analisar alguns caracteres, como caracteres com um valor ASCII de 0 a 10. Para caracteres não suportados no XML 1.0, é possível incluir esse parâmetro para solicitar que o COS codifique as chaves na resposta. Valor válido: url.

key-marker: Especifica a chave com a qual começar ao listar objetos em um bucket.

max-keys: configura o número máximo de chaves retornadas na resposta. Por padrão, a API retorna até 1.000 nomes de chave.. A resposta pode conter menos chaves, mas nunca mais.

prefix: Use esse parâmetro para selecionar apenas as chaves que começam com o prefixo especificado.

version-id-marker: Especifica a versão do objeto da qual você deseja iniciar a listagem.

Operações em versões específicas de objetos

Várias APIs usam um novo parâmetro de consulta (?versionId=<VersionId>) que indica qual versão do objeto você está solicitando. Esse parâmetro é usado da mesma maneira para ler, excluir, verificar metadados e tags e restaurar objetos arquivados. Por exemplo, para ler uma versão de um objeto foo com um ID de versão L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo, a solicitação pode ser semelhante ao seguinte:

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

A exclusão desse objeto é feita da mesma maneira.

curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

Para solicitações que já usam um parâmetro de consulta, o parâmetro versionId pode ser incluído no final.

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/foo?tagging&versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo" \
     -H 'Authorization: bearer $TOKEN'

A cópia do lado do servidor de versões do objeto é suportada mas usa uma sintaxe ligeiramente diferente. O parâmetro de consulta não é adicionado ao próprio URL, mas sim anexado ao x-amz-copy-source cabeçalho. Essa é a mesma sintaxe da criação de uma parte para uma parte múltipla de um objeto de origem.

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/<new-object-key>"
 -H "Authorization: bearer $TOKEN"
 -H "x-amz-copy-source: /<source-bucket>/<object-key>?versionId=L4kqtJlcpXroDVBH40Nr8X8gdRQBpUMLUo"

Exemplo da CLI

É possível usar a CLI do IBM Cloud com o plug-in do cos para ativar a versão em um depósito.

cos bucket-versioning-put --bucket $BUCKET --versioning-configuration file://vers.json

Nesse caso, vers.json é um documento simples:

{
    "Status": "Enabled"
}

Exemplos SDK

Os exemplos a seguir usam os SDKs do IBM COS para Python e Node.js, embora a implementação de versão do objeto deva ser totalmente compatível com qualquer biblioteca ou ferramenta S3-compatible que permita a configuração de terminais customizados. O uso de ferramentas de terceiros requer credenciais HMAC para calcular assinaturas do AWS V4. Para obter mais informações sobre credenciais HMAC, consulte a documentação.

Python

A ativação da versão usando o IBM COS SDK for Python pode ser feita usando a sintaxe de recurso de alto nível ou cliente de baixo nível.

Usando um recurso:

#!/usr/bin/env python3

import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError

#Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')

BUCKET = "my-versioning-bucket" # The bucket that will enable versioning.

#Create resource client with configuration info pulled from environment variables.
cos = ibm_boto3.resource("s3",
                         ibm_api_key_id=API_KEY,
                         ibm_service_instance_id=SERVICE_INSTANCE,
                         config=Config(signature_version="oauth"),
                         endpoint_url=ENDPOINT
                         )

versioning = cos.BucketVersioning(BUCKET)

versioning.enable()

A versão para o depósito pode, então, ser suspensa usando versioning.suspend()

Usando esse mesmo recurso cos, todas as versões de objetos podem ser listadas usando o seguinte:

versions = s3.Bucket(BUCKET).object_versions.filter(Prefix=key)

for version in versions:
    obj = version.get()
    print(obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'))

Usando um cliente:

#!/usr/bin/env python3

import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError

#Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')

BUCKET = "my-versioning-bucket" # The bucket that will enable versioning.

#Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
                         ibm_api_key_id=API_KEY,
                         ibm_service_instance_id=SERVICE_INSTANCE,
                         config=Config(signature_version="oauth"),
                         endpoint_url=ENDPOINT
                         )

response = cosClient.put_bucket_versioning(
    Bucket=BUCKET,
    VersioningConfiguration={
        'Status': 'Enabled'
    }
)

Listando as versões de um objeto usando o mesmo cliente:

resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)

As APIs do site Python são muito flexíveis, e há muitas maneiras diferentes de realizar a mesma tarefa.

Node.js

Ativando a versão usando o SDK do IBM COS SDK for Node.js:

const IBM = require('ibm-cos-sdk');

var config = {
    endpoint: '<endpoint>',
    apiKeyId: '<api-key>',
    serviceInstanceId: '<resource-instance-id>',
};

var cos = new IBM.S3(config);

var params = {
    Bucket: 'my-versioning-bucket', /* required */
    VersioningConfiguration: { /* required */
    Status: 'Enabled'
   },
};

s3.putBucketVersioning(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});