Replicando objetos no IBM Cloud® Object Storage
A replicação permite que você defina regras para a cópia automática e assíncrona de objetos de um bucket de origem para um bucket de destino na mesma conta. Além disso, você pode copiar objetos de um bucket para outro bucket em contas diferentes.
O que é replicação?
A replicação copia objetos recém-criados e atualizações de objetos de um bucket de origem para um bucket de destino.
- Somente novos objetos ou novas versões dos objetos existentes (criados depois que a regra de replicação foi adicionada ao bucket) são copiados para o bucket de destino. Os objetos existentes podem ser replicados copiando-os sobre si mesmos, criando uma nova versão que é replicada.
- Os metadados do objeto de origem são aplicados ao objeto replicado.
- A replicação bidirecional entre dois buckets exige que as regras estejam ativas em ambos os buckets.
- Os filtros (compostos de prefixos e/ou tags) podem ser usados para que a regra de replicação seja aplicada somente a um subconjunto de objetos. Várias regras podem ser definidas em uma única política e essas regras podem especificar destinos diferentes. Dessa forma, diferentes objetos no mesmo bucket podem ser replicados para diferentes destinos.
Por que usar a replicação?
- Mantenha uma cópia dos dados em um bucket em uma localização geográfica diferente.
- Atenda às normas de conformidade para a soberania dos dados, definindo regras de replicação que armazenam réplicas somente dentro dos locais permitidos.
- Mantenha os dados de produção e de teste sincronizados, pois a replicação retém os metadados do objeto, como a hora da última modificação, o ID da versão e assim por diante.
- Gerencie a classe de armazenamento e as políticas de ciclo de vida dos objetos replicados independentemente da origem, definindo uma classe de armazenamento diferente e/ou regras de ciclo de vida para o bucket de destino. Da mesma forma, você pode armazenar réplicas em um bucket em uma instância de serviço separada ou até mesmo em uma conta IBM Cloud e também controlar independentemente o acesso às réplicas.
Primeiros passos com a replicação
Para começar, aqui estão alguns pré-requisitos que devem ser atendidos:
- Defina a função de plataforma
WriterouManagerno bucket de origem ou uma função personalizada com as ações de replicação apropriadas (comocloud-object-storage.bucket.put_replication) atribuídas. - Você não precisa ter acesso ao bucket de destino, mas precisa ter funções de plataforma suficientes para criar novas políticas de IAM que permitam que o bucket de origem grave no bucket de destino.
- O bucket de destino não deve ter um firewall de bucket legado ativado, mas pode usar restrições baseadas em contexto.
- Os objetos criptografados usando SSE-C não podem ser replicados, embora a criptografia gerenciada(SSE-KMS), como Key Protect, seja totalmente compatível com a replicação.
- Os objetos em um estado arquivado não podem ser replicados.
- Se os buckets de origem e de destino estiverem em contas IBM diferentes, certifique-se de criar os buckets em cada conta.
- Habilite o controle de versão nos buckets de origem e de destino.
Como o controle de versão é um requisito para a replicação, é impossível replicar objetos em buckets configurados com uma política Immutable Object Storage.
Usando uma conta IBM
Para replicar objetos entre buckets na mesma conta IBM, faça o seguinte:
- Depois de navegar até o bucket de origem escolhido, clique na guia Configuration (Configuração ).
- Procure a replicação do Bucket e clique no botão Setup replication (Configurar replicação ).
- Selecione a fonte de replicação e clique em Avançar.
- Selecione a instância e o bucket nos menus suspensos. Como alternativa, alterne o botão de opção para Não e cole o CRN do bucket de destino.
- Clique no botão “Verificar permissões ”.
Agora, você precisará conceder ao bucket de origem as permissões Writer no bucket de destino. Há várias maneiras de fazer isso, mas a mais fácil é usar o IBM Cloud Shell e a CLI do IBM Cloud.
- Abra o site IBM Cloud Shell em uma nova janela ou guia.
- Copie o comando IBM Cloud CLI mostrado no console do armazenamento de objetos e cole-o no novo shell.
- Volte à janela ou aba de configuração do bucket e clique no botão “Verificar permissões” novamente.
Agora você criará uma regra de replicação.
- Certifique-se de que o botão de rádio de status da regra esteja definido como Ativado.
- Atribua um nome e uma prioridade à regra, bem como quaisquer filtros de prefixo ou tag que limitem os objetos sujeitos à regra de replicação.
- Clique em Pronto.
Usando diferentes contas IBM
Para replicar objetos entre buckets em diferentes contas IBM, faça o seguinte:
-
Configure uma política de IAM na conta de destino IBM. Para obter informações sobre como criar uma política de IAM, consulte O que são políticas de IAM e quem pode atribuí-las.
-
Localize o ID da conta e o ID da instância do serviço no formato CRN na página Configuração do Bucket.
-
Usando a interface do usuário IBM Cloud da conta de destino, clique em Manage>Access**(IAM)**.
-
Clique em Authentication (Autenticação ) no painel esquerdo.
-
Clique em “Criar” para criar uma nova política de IAM.
-
Conceder uma configuração de página de autorização de serviço. Esta é a página na qual você é direcionado após criar uma nova política de IAM.
-
Selecione Outra conta e forneça o ID da conta de origem.
-
Fornecer acesso ao serviço como Cloud Object Storage.
-
Em Escopo de acesso, selecione Recursos específicos.
-
Selecione Source Service Instance (Instância de serviço de origem) e insira o ID da instância de serviço do bucket de origem.
-
Em Target (Destino), selecione Cloud Object Storage para o acesso ao bucket de origem.
-
Em Target Scope (Escopo de destino), selecione Recursos específicos>**Service Instance (Instância de serviço).
-
Selecione o ID da instância de serviço da conta de destino no menu suspenso.
-
Selecione a função Object Writer ou Writer, conforme necessário.
A função de escritor de objetos é suficiente para ativar a replicação.
Terminologia
Bucket de origem: O bucket para o qual uma política de replicação está configurada. É a origem dos objetos replicados.
Compartimento de destino: O bucket definido como o destino na política de replicação do bucket de origem. É o destino dos objetos replicados. Também chamado de balde de "destino".
Réplica: O novo objeto criado em um bucket de destino devido a uma solicitação feita a um bucket de origem.
O que é replicado?
Novos objetos criados usando CopyObject, PutObject, ou CompleteMultipartUpload são replicados do bucket de origem para o bucket de destino. Os objetos replicados herdam os seguintes campos de metadados
do objeto de origem: Etag, Last Modified Time, Version ID, user-attributes, e Tags.
Os marcadores de exclusão são replicados se configurados pela política de replicação.
As atualizações nas tags de uma versão são replicadas do bucket de origem para o bucket de destino.
Os itens a seguir não são replicados:
- Ações iniciadas por eventos do ciclo de vida
- Objetos gravados diretamente no arquivo
- Objetos restaurados de uma camada de arquivo
- Objetos criptografados usando SSE-C
- ACLs de objeto
Utilização da replicação para continuidade de negócios e recuperação de desastres
A replicação pode ser usada para fornecer continuidade de serviço em caso de interrupção:
- Certifique-se de que os buckets de origem e de destino estejam em locais diferentes.
- Verifique se as versões mais recentes dos objetos estão sincronizadas entre os dois buckets. Uma ferramenta como o
Rclone(o comandorclone check) pode ser útil para verificar a sincronicidade a partir da linha de comando. - No caso de uma interrupção, o tráfego de um aplicativo pode ser redirecionado para o bucket de destino.
Consistência e integridade dos dados
Embora o site IBM Cloud Object Storage ofereça uma consistência forte para todas as operações de E/S de dados, a configuração do bucket acaba sendo consistente. Depois de ativar as regras de replicação pela primeira vez em um bucket, pode levar alguns instantes para que a configuração se propague pelo sistema e novos objetos comecem a ser replicados.
Tratamento de erros
Falhas na replicação podem ocorrer por diversos motivos, incluindo (mas não se limitando a) configurações incorretas do bucket, interrupções no serviço e interações do usuário com o bucket de destino.
O Object Storage possui resiliência integrada para lidar com falhas de replicação. Quando ocorre uma falha, Object Storage pode tentar novamente por até 30 dias. A frequência das tentativas pode variar dependendo da natureza da falha. Por exemplo,
falhas causadas por erros raros de E/S podem ser repetidas em questão de horas, enquanto falhas decorrentes de configurações incorretas do bucket do usuário podem ser repetidas uma vez por dia. Se uma falha não for resolvida em até 30 dias,
o sistema não tentará mais corrigi-la automaticamente. Todas as falhas de longo prazo podem ser listadas usando o método [_ListBucketReplicationFailures_](#replication-apis-list-failures).
Se você desejar tentar novamente falhas “antigas” que ocorreram há mais de 30 dias, é possível acionar uma nova tentativa usando o PutBucketReplicationFailureReattempt.
Causas de falha
Na resposta da API do ListBucketReplicationFailures , o parâmetro SyncFailureCause é fornecido em cada elemento de falha, indicando a última causa conhecida da falha. A tabela a seguir descreve as possíveis
causas:
| Causa | Explicação |
|---|---|
| Controle de versões desativado no bucket de destino | O controle de versões não está habilitado no bucket de destino. É provável que o usuário tenha suspendido o controle de versão após a configuração da replicação. |
| Operação de replicação não autorizada no bucket de destino | O serviço Object Storage não está autorizado a modificar o bucket de destino em nome do usuário. Verifique se a autorização entre serviços ainda existe entre os recursos dos buckets de origem e de destino no IAM. |
| Bucket remoto não encontrado | Não foi possível localizar o bucket de destino. É possível que o usuário tenha excluído o bucket de destino. Verifique se o bucket de destino ainda existe. |
| O bucket de origem/remoto não foi encontrado ou está desativado | O balde não foi encontrado ou está inutilizável. Verifique se o bucket ainda existe. Se isso acontecer, entre em contato com o suporte ao cliente. |
| Objeto de destino não encontrado | Tentou replicar uma alteração de metadados (por exemplo, bloqueio de tag/objeto), mas o objeto de destino não existe. É provável que o usuário tenha excluído o objeto do bucket de destino antes que a alteração pudesse ser replicada. |
| Objeto local não encontrado | O objeto de origem não foi encontrado ao tentar a replicação. É provável que o usuário tenha excluído o objeto de origem logo após criá-lo ou modificá-lo. |
| O bloqueio de objetos não está ativado no bucket de destino | Tentou replicar as configurações do Object Lock em um objeto, mas o bucket de destino não tinha o Object Lock ativado. |
| A chave de criptografia não está ativa ou foi excluída | Object Storage tentou recuperar a chave de criptografia do Key Protect (o bucket de origem tem SSE-KP/SSE-HPCS configurado), mas a chave foi excluída. |
| Faltam as informações do endpoint da instância do KMS | Não foi possível recuperar o ponto de extremidade do Serviço de Gerenciamento de Chaves necessário para ler a chave de criptografia. Se o erro persistir, entre em contato com o suporte ao cliente. |
| Permissões insuficientes para consultar informações sobre o endpoint do KMS | O recurso do bucket de origem não possui permissões para consultar o endpoint do Serviço de Gerenciamento de Chaves necessário para ler a chave de criptografia. Verifique sua política de autorização entre serviços do IAM. |
| Erro interno | Vários problemas internos que impedem a replicação. Entre em contato com o suporte ao cliente. |
Ações do IAM
Há novas ações de IAM associadas à replicação.
| Ação do IAM | Função |
|---|---|
cloud-object-storage.bucket.get_replication |
Gerenciador, Gravador, Leitor |
cloud-object-storage.bucket.put_replication |
Gerenciador, gravador |
cloud-object-storage.bucket.delete_replication |
Gerenciador, gravador |
cloud-object-storage.bucket.get_replication_failures |
Gerenciador, Gravador, Leitor |
cloud-object-storage.bucket.put_replication_reattempt |
Gerenciador, gravador |
Eventos do Activity Tracker
A replicação gera eventos adicionais..
| Ação de Evento | Gerado em | Descrição |
|---|---|---|
| cloud-object-storage.bucket-replication.create | Depósito de origem | Quando o usuário faz uma solicitação à API PutBucketReplication |
| cloud-object-storage.bucket-replication.read | Depósito de origem | Quando o usuário faz uma solicitação à API GetBucketReplication |
| cloud-object-storage.bucket-replication.delete | Depósito de origem | Quando o usuário faz uma solicitação à API DeleteBucketReplication |
| cloud-object-storage.bucket-replication-failures.list | Depósito de origem | Quando o usuário faz uma solicitação à API ListBucketReplicationFailures |
| cloud-object-storage.bucket-replication-failures.update | Depósito de origem | Quando o usuário faz uma solicitação à API PutReplicationFailureReattempt |
| cloud-object-storage.object-replication.sync | Depósito de origem | Quando Object Storage replica um objeto do bucket de origem |
| cloud-object-storage.object-replication.create | Depósito de destino | Quando Object Storage cria uma nova versão de réplica no bucket de destino |
| cloud-object-storage.object-replication.update | Depósito de destino | Quando Object Storage replica a atualização de metadados em uma réplica existente no bucket de destino |
| cloud-object-storage.object-replication.delete | Depósito de destino | Quando Object Storage replica um marcador de exclusão no bucket de destino |
Para eventos cloud-object-storage.bucket-replication.create, os campos a seguir fornecem informações extras:
| Campo | Descrição |
|---|---|
requestData.replication.num_sync_remote_buckets |
O número de buckets de destino especificados nas regras de replicação do bucket |
requestData.replication.failed_remote_sync |
Os CRNs dos depósitos que falharam na verificação de réplica |
Quando a replicação está ativa, as operações em objetos podem gerar as seguintes informações extras:
| Campo | Descrição |
|---|---|
requestData.replication.replication_throttled |
Indica se a replicação do objeto foi atrasada na origem devido a um mecanismo de regulagem |
requestData.replication.destination_bucket_id |
O CRN do depósito de destino |
requestData.replication.sync_type |
O tipo de operação de sincronização. - content indica que os dados do objeto e quaisquer metadados foram gravados no destino.- tag indica que as tags do objeto foram replicadas.- retention indica que as configurações de retenção do Object Lock foram replicadas.- legal_hold indica que as configurações de retenção legal do Object Lock foram replicadas.- delete indica que o marcador de exclusão
foi gravado no destino. |
responseData.replication.source_bucket_id |
O CRN do depósito de origem |
responseData.replication.result |
Os valores podem ser success, failure (indica um erro do servidor), user (indica um erro do usuário. |
responseData.replication.message |
A mensagem de resposta HTTP (como OK). |
É possível rastrear um objeto a partir de quando ele é gravado na origem até ser gravado no destino. Procure o ID de solicitação associado à gravação do objeto e três eventos devem aparecer:
- O
PUToriginal.. - A solicitação de sincronização da origem.
- A solicitação
PUTno destino..
Qualquer um desses três ausentes indica uma falha
Uso e contabilidade
Todas as réplicas são objetos em si e contribuem com o uso como qualquer outro dado. A replicação bem-sucedida resulta em solicitações PUT, GET e HEAD faturáveis, embora qualquer largura da banda consumida no processo de réplica não seja faturado
A replicação gera métricas adicionais para uso com IBM Cloud Monitoring:
ibm_cos_bucket_replication_sync_requests_issuedibm_cos_bucket_replication_sync_requests_received
Interações
Versionamento
A versão é obrigatória para ativar a replicação. Depois de ativar a versão nos depósitos de origem e de destino e configurar a replicação no depósito de origem, é possível encontrar os problemas a seguir:
- Se você tentar desativar a versão no depósito de origem, o Object Storage retornará um erro. Deve-se remover a configuração de replicação antes de poder desativar a versão no depósito de origem.
- Se você desativar a versão no depósito de destino, a replicação falhará.
Bloqueio de objeto
O Object Lock pode ser ativado em buckets com replicação. Quando objetos de origem são criados com o Object Lock (retenção e/ou retenção legal) ou se o Object Lock for atualizado em objetos existentes, ele é replicado para o destino.
O Object Lock só pode ser replicado se estiver ativado no bucket de destino. Portanto, habilite o Object Lock no bucket de destino, caso ele esteja habilitado no bucket de origem.
A tabela abaixo descreve o comportamento quando os buckets de origem e de destino apresentam configurações diferentes de Object Lock:
| Bloqueio do objeto de origem | Bloqueio do objeto de destino | Comportamento |
|---|---|---|
| Ativado | Ativado | Todos os estados do Object Lock da origem são replicados para o destino. Se o objeto de origem for criado sem o Object Lock, a retenção padrão do bucket de destino poderá ser aplicada à réplica. A replicação do Object Lock segue todas as restrições do Object Lock do S3. Por exemplo, nunca é possível reduzir o período de retenção na réplica no modo de conformidade se o usuário tiver feito alterações de forma independente no destino. |
| Desativado | Ativado | Os objetos de origem não podem ter o Object Lock; portanto, os estados do Object Lock nunca se propagam da origem para o destino. Se o bucket de destino tiver uma retenção padrão definida, ela será aplicada às novas réplicas criadas. |
| Ativado | Desativado | Objetos de origem criados com o Object Lock não são replicados. Essas falhas são repetidas pelo Object Storage e podem ser replicadas assim que o Object Lock for ativado no bucket de destino. Quaisquer
atualizações relacionadas à retenção do Object Lock ou à retenção legal em objetos existentes também não podem ser replicadas até que o Object Lock seja ativado no destino. Objetos de origem criados sem o Object Lock ainda podem ser replicados. |
Criptografia Key Protect
Os objetos de origem são criptografados usando a chave raiz do bucket de origem, e as réplicas são criptografadas usando a chave raiz do bucket de destino.
Configurações do ciclo de vida
Se uma política de ciclo de vida estiver ativada em um bucket de destino, as ações do ciclo de vida serão baseadas na hora original de criação do objeto na origem, e não na hora em que a réplica fica disponível no bucket de destino.
Immutable Object Storage
O uso de políticas de retenção é impossível em um depósito com versão ativada e, como a versão é um requisito para replicação, é impossível replicar objetos para ou a partir de um depósito com o Object Storage ativado.
Firewalls de depósito anteriores
Os depósitos que usam firewalls anteriores para restringir o acesso com base em endereços IP não podem usar a replicação, pois os serviços de segundo plano que replicam os objetos não possuem endereços IP fixos e não podem transmitir o firewall
Em vez disso, use restrições baseadas no contexto para controlar o acesso com base nas informações de rede.
Code Engine
A configuração da replicação não aciona eventos do Code Engine no momento, mas as gravações e exclusões de objetos geram notificações Object:Delete tanto para o bucket de origem quanto Object:Write para o de destino.
Esses eventos são anotados com um campo “ notifications.replication_type ” que indica se o evento acionou uma sincronização ou se foi acionado por uma sincronização.
Replicando objetos existentes
Uma regra de réplica só pode agir em objetos que são gravados após a regra ser configurada e aplicada a um depósito Se houver objetos existentes em um depósito que devem ser replicados, os processos de replicação precisam ser informados
sobre a existência dos objetos. Isso pode ser facilmente realizado usando a operação PUT copy para copiar objetos para si mesmos
Esse processo redefine alguns metadados do objeto, incluindo os carimbos de data e hora de criação. Isso afeta as políticas de ciclo de vida e quaisquer outros serviços que utilizem carimbos de data e hora de criação ou modificação (como redes de distribuição de conteúdo). Assegure-se de que quaisquer interrupções que possam surgir da reconfiguração de metadados do objeto sejam tratadas apropriadamente.
O processo envolve:
- Criando uma lista de todos os objetos em um depósito que devem estar sujeitos a regras de replicação,
- Iterando sobre essa lista, executando uma operação
PUT copyem cada objeto com a origem sendo idêntica ao destino da solicitação
Este exemplo replica apenas a nova versão do objeto criado pela solicitação PUT copy. Para replicar todas as versões do objeto, seria necessário copiar cada versão individualmente também.
O exemplo a seguir é gravado em Python, mas o algoritmo poderia ser aplicado em qualquer linguagem de programação ou contexto
import os
import sys
import ibm_boto3
from ibm_botocore.config import Config
# Create client connection
cos = ibm_boto3.client("s3",
ibm_api_key_id=os.environ.get('IBMCLOUD_API_KEY'),
ibm_service_instance_id=os.environ['SERVICE_INSTANCE_ID'],
config=Config(signature_version="oauth"),
endpoint_url=os.environ['US_GEO']
)
# Define the bucket with existing objects for replication
bucket = os.environ['BUCKET']
def copy_in_place(BUCKET_NAME):
print("Priming existing objects in " + bucket + " for replication...")
paginator = cos.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=bucket)
for page in pages:
for obj in page['Contents']:
key = obj['Key']
print(" * Copying " + key + " in place...")
try:
headers = cos.head_object(
Bucket=bucket,
Key=key
)
md = headers["Metadata"]
cos.copy_object(
CopySource={
'Bucket': bucket,
'Key': key
},
Bucket=bucket,
Key=key,
TaggingDirective='COPY',
MetadataDirective='REPLACE',
Metadata=md
)
print(" Success!")
except Exception as e:
print(" Unable to copy object: {0}".format(e))
print("Existing objects in " + bucket + " are now subject to replication rules.")
copy_in_place(bucket)
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 replicação em um depósito
A configuração de replicação é fornecida como XML no corpo da requisição Novas solicitações substituem quaisquer regras de replicação existentes no bucket.
Uma configuração de replicação deve incluir pelo menos uma regra e pode conter no máximo 1.000. Cada regra identifica um subconjunto de objetos para replicar filtrando os objetos no depósito de origem. Para escolher subconjuntos adicionais de objetos para replicação, inclua uma regra para cada subconjunto.
Para especificar um subconjunto dos objetos no depósito de origem para aplicar uma regra de replicação, inclua o elemento Filter como um filho do elemento Rule. É possível filtrar objetos com base em um prefixo de
chave de objeto, uma ou mais tags de objeto ou ambas. Ao incluir o elemento Filter na configuração, você também deve incluir os elementos a seguir: DeleteMarkerReplication, Status e Priority.
Cabeçalhos opcionais
| Cabeçalho | Tipo | Descrição |
|---|---|---|
Content-MD5 |
Sequência | O hash MD5 de 128 bits da carga útil, codificado em base64, que é usado como verificação de integridade para garantir que a carga útil não tenha sido alterada durante o trânsito. |
x-amz-checksum-crc32 |
Sequência | Esse cabeçalho é a soma de verificação Base64 codificada e de 32 bits CRC32 do objeto. |
x-amz-checksum-crc32c |
Sequência | Esse cabeçalho é a soma de verificação Base64 codificada e de 32 bits CRC32C do objeto. |
x-amz-checksum-crc64nvme |
Sequência | Esse cabeçalho é a soma de verificação Base64 codificada e de 64 bits CRC64NVME do objeto. A soma de verificação CRC64NVME é sempre uma soma de verificação completa do objeto. |
x-amz-checksum-sha1 |
Sequência | Esse cabeçalho é o Base64 codificado, 160 bits SHA1 digest do objeto. |
x-amz-checksum-sha256 |
Sequência | Esse cabeçalho é o Base64 codificado, 256 bits SHA256 digest do objeto. |
Um cabeçalho Content-MD5 ou um cabeçalho checksum (incluindo x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 ou x-amz-checksum-sha256)
é necessário como uma verificação de integridade para a carga útil. O corpo da solicitação deve conter um bloco XML com o esquema a seguir:
| Elemento | Tipo | Filhos | Antecessor | Restrição |
|---|---|---|---|---|
ReplicationConfiguration |
Contêiner | Rule |
Nenhum | Limite 1. |
Rule |
Contêiner | ID, Status, Filter, DeleteMarkerReplication, Destination, Priority |
ReplicationConfiguration |
Limite 1000. |
ID |
Sequência | Nenhum | Rule |
Devem conter (a-z,A-Z0-9) e os seguintes símbolos: !``_``.``*``'``(``)``- |
Destination |
Contêiner | Bucket |
Rule |
Limite 1. |
Bucket |
Sequência | Nenhum | Destination |
O CRN do depósito de destino |
Priority |
Integer | Nenhum | Rule |
Uma prioridade é associada a cada regra. Pode haver casos em que várias regras podem ser aplicáveis a um objeto transferido por upload. Nessas situações, o armazenamento de objetos aplica a regra aplicável com maior prioridade ao replicar esse objeto. Assim, apenas uma única regra de replicação pode ser aplicada a qualquer objeto, independentemente de quantas regras na política de replicação podem ser correspondentes para o objeto. Observe que quanto maior o número, maior a prioridade. |
Status |
Sequência | Nenhum | Rule |
Especifica se a regra está ativada. Os valores válidos são Enabled ou Disabled. |
DeleteMarkerReplication |
Contêiner | Status |
Rule |
Limite 1. |
Status |
Sequência | Nenhum | DeleteMarkerReplication |
Especifica se o Object Storage replica marcadores de exclusão. Os valores válidos são Enabled ou Disabled. |
Filter |
Sequência | Prefix, Tag, AND |
Rule |
Um filtro que identifica o subconjunto de objetos ao qual a regra de duplicação se aplica. Um Filter deve especificar exatamente um elemento filho Prefix, Tag ou And. |
Prefix |
Sequência | Nenhum | Filter |
Um prefixo de nome de chave de objeto que identifica o subconjunto de objetos ao qual a regra se aplica... |
Tag |
Sequência | Nenhum | Filter |
Um contêiner para especificar uma chave e valor de tag. A regra aplica-se apenas a objetos que possuem a tag em seu conjunto de tags |
And |
Sequência | Nenhum | Filter |
Um contêiner para especificar filtros de regras. Os filtros determinam o subconjunto de objetos ao qual a regra se aplica.. Esse elemento será necessário apenas se você especificar mais de um filtro |
Key |
Sequência | Nenhum | Tag |
A chave de tag |
Value |
Sequência | Nenhum | Tag |
O valor da tag. |
Este exemplo replica todos os novos objetos, mas não replica marcadores de exclusão.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Priority>1</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Disabled</Status>
</DeleteMarkerReplication>
<Filter/>
<Destination>
<Bucket>$DESTINATION_CRN</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
Este exemplo replica todos os objetos cuja chave (nome) comece com project_a/ para o bucket identificado como $DESTINATION_CRN_A, todos os objetos cuja chave (nome) comece com project_b/ para o bucket
identificado como $DESTINATION_CRN_B, e todos os objetos que possuam uma tag de objeto com a chave Client e o valor ACME para um terceiro bucket identificado como $DESTINATION_CRN_C,
além de replicar marcadores de exclusão em todos os casos.
Suponha que os quatro objetos a seguir sejam incluídos no depósito de origem Eles são replicados para os buckets de destino conforme descrito abaixo:
project_a/foo.mp4project_a/bar.mp4project_b/baz.pdfproject_b/acme.pdf. Este quarto objeto também tem uma tag de objeto com a chaveCliente o valorACME..
Devido às regras a seguir, os objetos 1 e 2 são replicados para $DESTINATION_CRN_A. O objeto 3 é replicado para $DESTINATION_CRN_B. O Objeto 4 é replicado apenas para $DESTINATION_CRN_C porque a regra
com o ID AcmeCorp tem um valor de prioridade maior do que a regra com o ID e ProjectB, embora atenda aos requisitos de ambas as regras, está sujeito apenas à primeira.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>ProjectA</ID>
<Priority>10</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_a/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_A</Bucket>
</Destination>
</Rule>
<Rule>
<ID>ProjectB</ID>
<Priority>5</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_b/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_B</Bucket>
</Destination>
</Rule>
<Rule>
<ID>AcmeCorp</ID>
<Priority>20</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Tag>
<Key>Client</Key>
<Value>ACME</Value>
</Tag>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_C</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
Uma solicitação bem-sucedida retorna uma resposta de 200
Visualizar configuração de replicação para um depósito
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
Isso retorna um corpo de resposta XML com o esquema apropriado:
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Status>ENABLED</Status>
<DeleteMarkerReplication>
<Status>DISABLED</Status>
</DeleteMarkerReplication>
<Destination>
<Bucket>crn:v1:bluemix:public:cloud-object-storage:global:a/9978e07eXXXXXXXX66c89c428028654:ef1c725e-XXXX-4967-bcc1-734c03a2b846:bucket:replication-destination</Bucket>
</Destination>
<Priority>1</Priority>
<Filter/>
</Rule>
</ReplicationConfiguration>
Excluir a configuração de replicação de um bucket
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
Uma solicitação bem-sucedida retorna uma resposta de 204
Listar falhas de replicação de um bucket
Exemplo de solicitação usando curl
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-failures" \
-H 'Authorization: bearer $TOKEN'
Parâmetros de consulta opcionais
| Nome | Tipo | Descrição |
|---|---|---|
| tipo de codificação | Sequência | Se forem utilizados caracteres Unicode não suportados pelo XML em um nome de objeto, este parâmetro pode ser definido como url para codificar corretamente a resposta. |
| max-keys | Sequência | Limita o número de falhas a serem exibidas na resposta. O padrão e o máximo são 1.000. |
| primeira-tentativa-de-sincronização-anterior | Sequência | Especifica o carimbo de data e hora a partir do qual a lista deve começar, em ordem cronológica inversa. A hora corresponde ao momento em que a replicação foi acionada originalmente (campo “
|
| token de continuação | Sequência | Especifica a falha a partir da qual a lista deve começar, em ordem cronológica inversa. Isso é usado para fins de paginação, caso haja mais entradas além das retornadas na última solicitação de listagem. |
Exemplo de resposta
<ListReplicationFailureResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>example</Name>
<FirstSyncAttemptedBefore>2025-12-15T00:00:00.000Z</FirstSyncAttemptedBefore>
<MaxKeys>10</MaxKeys>
<IsTruncated>false</IsTruncated>
<EncodingType>false</EncodingType>
<KeyCount>2</KeyCount>
<Contents>
<Key>test-obj+*1765434016787</Key>
<VersionId>00000000-0000-0000-0000-019b0c114413</VersionId>
<SyncType>Content</SyncType>
<FirstSyncAttempted>2025-12-11T06:20:16.787Z</FirstSyncAttempted>
<LastSyncAttempted>2025-12-11T06:20:16.787Z</LastSyncAttempted>
<SyncFailureCause>Versioning disabled on destination bucket</SyncFailureCause>
</Contents>
<Contents>
<Key>test-obj+*1765434016786</Key>
<VersionId>00000000-0000-0000-0000-019b0c114412</VersionId>
<SyncType>Content</SyncType>
<FirstSyncAttempted>2025-12-11T06:20:16.786Z</FirstSyncAttempted>
<LastSyncAttempted>2025-12-11T06:20:16.786Z</LastSyncAttempted>
<SyncFailureCause>Replication operation not authorized on target bucket</SyncFailureCause>
</Contents>
</ListReplicationFailureResult>
Elementos de resposta
| Nome | Tipo | Descrição |
|---|---|---|
ListReplicationFailureResult |
Contêiner | Tag de nível raiz |
Name |
Sequência | Nome do bucket que está sendo listado. |
FirstSyncAttemptedBefore |
Sequência | ISO-8601 data e hora da solicitação ?first-sync-attempted-before |
MaxKeys |
Número | Número máximo de chaves solicitado neste anúncio. |
IsTruncated |
Booleano | Se a lista atual foi truncada (ou seja, há mais falhas após o último elemento retornado nesta lista). Se true, NextContinuationToken é sempre fornecido. |
EncodingType |
Sequência | Tipo de codificação solicitado nesta listagem. |
KeyCount |
Número | Número de elementos com falha exibidos nesta lista. |
ContinuationToken |
Sequência | O token de continuação que foi especificado para esta listagem. |
NextContinuationToken |
Sequência | Próximo token de continuação a ser usado para paginação, caso a lista atual tenha sido truncada. |
Agendar uma nova tentativa para falhas de replicação antigas em um bucket
Isso agenda uma nova tentativa para todas as falhas de replicação, incluindo quaisquer falhas “antigas” com mais de 30 dias e que não sejam mais elegíveis para novas tentativas automáticas pelo sistema. Falhas de replicação de longo prazo
são processadas em ciclos de 24 horas. Ao enviar essa solicitação, são agendadas novas tentativas para as falhas antigas no ciclo que começa à meia-noite GMT seguinte. Por exemplo, se uma solicitação for enviada às 2026-01-01T01:00:00Z,
o horário mais cedo em que essas falhas serão processadas é às 2026-01-02T00:00:00Z. Caso a solicitação seja bem-sucedida, esse carimbo de data/hora também é fornecido no cabeçalho da resposta x-ibm-replication-reattempt-scheduled-time.
Várias solicitações recebidas no mesmo dia no fuso horário GMT (ou seja, resultando no mesmo horário programado) são idempotentes.
Cada falha por tempo limite é repetida uma vez, com o máximo esforço possível — elas são executadas, mas não há garantias quanto ao tempo de execução.
Exemplo de solicitação usando curl
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?ibm-replication-reattempt" \
-H 'Authorization: bearer $TOKEN'
Exemplo de resposta
HTTP/1.1 204 No Content
Connection: close
...
x-ibm-replication-reattempt-scheduled-time: Fri, 12 Dec 2025 00:00:00 GMT
Exemplos SDK
Os exemplos a seguir utilizam os SDKs IBM Cloud Object Storage para Python e Node.js, embora a implementação do controle de versão de objetos deva ser totalmente compatível com qualquer biblioteca ou ferramenta S3-compatible que permita a configuração de endpoints personalizados. 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
É possível habilitar o controle de versão usando o SDK IBM Cloud Object Storage para Python por meio da sintaxe de cliente de baixo nível.
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-replication-bucket" # The bucket that will enable replication.
# 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,
ReplicationConfiguration={
'Rules': [
{
'ID': 'string',
'Priority': 123,
'Filter': {
'Prefix': 'string',
'Tag': {
'Key': 'string',
'Value': 'string'
},
'And': {
'Prefix': 'string',
'Tags': [
{
'Key': 'string',
'Value': 'string'
},
]
}
},
'Status': 'Enabled'|'Disabled',
'Destination': {
'Bucket': 'string',
},
'DeleteMarkerReplication': {
'Status': 'Enabled'|'Disabled'
}
},
]
}
)
Listando as versões de um objeto usando o mesmo cliente:
resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)
Observe que as APIs do Python são muito flexíveis e há muitas maneiras diferentes de realizar a mesma tarefa
Node.js
Ativando o controle de versão usando o IBM Cloud Object Storage 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: 'STRING_VALUE', /* required */
ReplicationConfiguration: { /* required */
Role: 'STRING_VALUE', /* required */
Rules: [ /* required */
{
Destination: { /* required */
Bucket: 'STRING_VALUE', /* required */
},
Status: Enabled | Disabled, /* required */
Filter: {
And: {
Prefix: 'STRING_VALUE',
Tags: [
{
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
},
/* more items */
]
},
Prefix: 'STRING_VALUE',
Tag: {
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
}
},
ID: 'STRING_VALUE',
Prefix: 'STRING_VALUE',
Priority: 'NUMBER_VALUE',
}
}
]
},
ContentMD5: 'STRING_VALUE',
};
cos.putBucketReplication(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});