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.
- Depois de navegar para a sua instância de armazenamento de objetos, clique em Criar depósito
- Escolha uma região e resiliência, em seguida, procure Versão do objeto e alterne o seletor para Ativado.
Em seguida, crie um objeto com versão.
- Navegue em seu novo depósito e faça upload de um arquivo arrastando-o para a janela do navegador
- 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.
- Alterne Visualizar versões para ver e interagir com versões alternativas de objetos..
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çã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.createcloud-object-storage.bucket-versioning.readcloud-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 formatoint64.noncurrent_bytes_used: tamanho total de todas as versões de objeto não atuais no depósito no formatoint64.delete_marker_count: número total de marcadores de exclusão no depósito no formatoint64.
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 ObjectHEAD ObjectDELETE ObjectGET Object ACLPUT Object ACLUpload Part CopyRestore ObjectDELETE ObjectsList Object VersionsPUT Bucket VersioningGET Bucket VersioningPUT ObjectPOST ObjectCopy ObjectComplete Multipart UploadPUT Object TaggingGET Object TaggingDELETE Object TaggingPUT Bucket LifecycleGET Bucket LifecycleDELETE 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
});