Bloqueio de objeto
O Object Lock preserva registros eletrônicos e mantém a integridade de dados assegurando que as versões de objetos individuais sejam armazenadas em um WORM (Write-Once-Read-Many), não apagável e não regravável. Esta política é aplicada até uma data especificada ou a remoção de qualquer retenção legal.
Por que usar o Object Lock?
O Object Lock ajuda os clientes a governarem os requisitos de preservação e retenção de dados, aplicando a imutabilidade de dados para suas cargas de trabalho de backup, recuperação de desastre e resiliência cibernética.
O Object Lock assegura que os dados do não possam ser excluídos por ninguém e não há nenhuma maneira de suspender a retenção em um objeto. Leia a documentação com cuidado antes de bloquear objetos com um período de retenção
Ao usar o Object Lock, é sua responsabilidade assegurar a conformidade com quaisquer regulamentos que você (sua organização) possa estar sujeito quando se trata de preservação e armazenamento de dados para retenção a longo prazo.
Ao utilizar o Object Lock, você é responsável por garantir que sua conta do IBM Cloud permaneça em situação regular, de acordo com as políticas e diretrizes da IBM Cloud, enquanto os dados estiverem sujeitos a um período de retenção. Consulte os termos do IBM Cloud Service para obter mais informações.
Terminologia
Há duas maneiras de usar o Object Lock para proteger dados: períodos de retenção e retenções legais.
- Um período de retenção define um período durante o qual um objeto não pode ser modificado ou excluído.
- Uma retenção legal também evita que um objeto seja alterado, mas permanece em vigor apenas até que seja explicitamente levantado
É possível fazer uso de qualquer combinação desses parâmetros-uma versão de objeto pode ter um, ambos ou nenhum.
Manter até a Data (Período de Retenção)
Se você precisar proteger uma versão do objeto por um período de tempo fixo, será necessário especificar uma Reter até a Data que determina o período no qual ela não pode ser alterada A versão do objeto pode ser excluída após essa
data ser passada (supondo que não haja nenhuma retenção legal na versão do objeto) Para objetos no modo GOVERNANCE, usuários autorizados com a bypass-governance-retention permissão podem excluir a versão do objeto antes da data
de retenção.
O período de retenção para novos objetos pode ser herdado do valor padrão configurado no depósito ou pode ser explicitamente definido ao gravar o objeto especificando uma Reter até a data.
Ao usar as configurações padrão do depósito, você não especifica uma Retenção até a Data. Em vez disso, você especifica uma duração, em dias ou anos, para a qual cada versão de objeto colocada no depósito deve ser protegida Quando você coloca um objeto no depósito, uma Retenção até a Data é calculada para a versão do objeto incluindo a duração especificada no tempo de gravação do objeto.
Se a sua solicitação para colocar uma versão de objeto em um depósito contiver um modo de retenção explícito e Reter até a Data, essas configurações substituirão quaisquer configurações padrão do depósito para essa versão de objeto..
Como todas as outras configurações de Bloqueio de Objeto, a Retenção até a Data se aplica a versões de objeto individuais Diferentes versões de um único objeto podem ter diferentes modos de retenção e períodos..
Imagine um objeto que tenha 60 dias em um período de retenção de 90 dias e você sobrescreva esse objeto com o mesmo nome e com um período de retenção de dois anos A operação será bem-sucedida e uma nova versão do objeto com um período de retenção de dois anos será criada Enquanto isso, após mais 30 dias, a versão original é elegível para exclusão.
Estendendo um período de retenção
Para estender o período de retenção de um objeto, basta enviar uma solicitação para configurar um novo período de retenção mais longo.. O valor antigo será sobrescrito com o novo, supondo que o solicitante tenha as ações cloud-object-storage.object.put_object_lock_retention e cloud-object-storage.object.put_object_lock_retention_version.
Reduzindo o período de retenção
Para objetos protegidos no modo GOVERNANCE, os usuários autorizados podem reduzir o período de retenção para uma data anterior, desde que incluam o x-amz-bypass-governance-retention cabeçalho na solicitação e tenham as permissões
apropriadas (cloud-object-storage.object.bypass_governance_retention, cloud-object-storage.object.put_object_lock_retention e cloud-object-storage.object.put_object_lock_retention_version).
Os objetos no modo CONFORMIDADE não podem ter seu período de retenção reduzido ou removido antes do vencimento da data de retenção.
Retenção legal
Uma suspensão legal é semelhante a um período de retenção no qual ela evita que uma versão do objeto seja sobrescrita ou excluída No entanto, os portais legais são mais flexíveis e não têm um componente temporal definido. Em vez disso,
eles simplesmente permanecem em vigor até serem removidos. As suspensões legais podem ser livremente colocadas e removidas por qualquer usuário que possua as ações cloud-object-storage.object.put_object_lock_legal_hold e cloud-object-storage.object.put_object_lock_legal_hold_version
A retenção legal tem o benefício adicional de agir como método para aplicar retenção indefinida em um objeto.
Retenções legais e períodos de retenção operam de forma independente. As suspensões legais não têm impacto nos períodos de retenção e vice-versa.
Imagine um objeto com uma retenção legal e um período de retenção. Quando o período de retenção termina, a versão do objeto permanece protegida até que a suspensão legal seja removida. Se você remover uma suspensão legal enquanto uma versão de objeto estiver sujeita a um período de retenção, ela permanecerá protegida até que o período de retenção seja concluído
Os objetos bloqueados e armazenados com um período de retenção não podem ser excluídos até que o período de retenção expire e qualquer suspensão legal associada seja removida No entanto, para objetos bloqueados no modo GOVERNANCE, usuários
autorizados com a bypass-governance-retention permissão podem excluir o objeto antes do término do período de retenção, desde que não haja nenhuma retenção legal ativa sobre o objeto.
Introdução ao Object Lock
Para começar, há alguns pré-requisitos:
- Você precisará da função de plataforma
WriterouManagerem um depósito ou de uma função customizada com as ações apropriadas (comocloud-object-storage.bucket.put_object_lock_configuration) designadas. - A versão do objeto deve ser ativada..
- Será necessário usar o plano de precificação Standard, consulte precificação para obter detalhes
- Será necessário selecionar uma região na qual o Bloqueio de Objeto é suportado, consulte Serviços Integrados para obter detalhes
- Um período máximo de retenção padrão de 100 anos (ou 36500 dias) é suportado..
- Ao usar o console, também é possível configurar um Retain Until Date em meses, além de dias ou anos.
No modo CONFORMIDADE, o período de retenção de um objeto não pode ser reduzido. No modo GOVERNANCE, os usuários autorizados com a permissão BypassGovernanceRetention podem diminuir ou remover a retenção, se necessário. Para testes de validação, recomenda-se usar uma retenção padrão mais curta (por exemplo, 1 dia) e ajustar conforme necessário.
Criando e configurando seu novo depósito para uso com o Object Lock
- Navegue para sua instância desejada do Object Storage e use Criar depósito com Customizar sua opção de depósito
- Insira os detalhes de configuração de depósito necessários de acordo com seus requisitos de caso de uso
- Navegue para a seção Versão do objeto e configure-a como Ativado...
- Procure por Imutabilidade e, em Bloqueio de Objeto, clique em Incluir
- Configure o bloqueio do objeto para Ativado
- Opcionalmente, configure um período de retenção padrão
- Clique em Salvar
- Continue com o restante das definições de configuração e clique em Criar depósito
Ativando o bloqueio de objeto em um depósito existente:
Um depósito pode ser configurado para uso do Object Lock da seguinte forma:
- Navegue para a seção Configuração do depósito
- Clique em Versão do Objeto
- Na seção Versão do Objeto , clique em Editar, configure a opção de configuração para Ativado e Salvar
- Navegue para a seção Bloqueio de Objeto e clique em Incluir.
- Configure Bloqueio de Objeto como Ativado....
- Opcionalmente, configure um período de retenção padrão
- Clique em “Salvar”
Incluindo uma Retenção até a Data ou Retenção Legal em um objeto
- Navegar para o depósito com o objeto de destino
- Alternar Versões de Exibição
- Acesse os detalhes da versão de destino
- Inclua um período de retenção e / ou alterne em uma suspensão legal
Usando o Object Lock para continuidade de negócios e recuperação de desastre
O Object Lock pode ser usado para fornecer continuidade de serviço no caso de um ataque de ransomware, pois os dados protegidos não podem ser modificados ou destruídos.
Consistência e integridade de dados
Embora o site IBM Cloud Object Storage ofereça uma consistência sólida para todas as operações de E/S de dados, a configuração do bucket acaba sendo consistente. Depois de ativar, modificar ou excluir um período de retenção padrão em um depósito, pode levar alguns minutos para que a configuração se propague pelo sistema Operações em objetos, como incluir uma suspensão legal, são imediatamente consistentes.
Uso e contabilidade
Objetos bloqueados (e suas versões) contribuem com o uso assim como quaisquer outros dados e você será responsável pelos custos de uso enquanto o objeto permanecer bloqueado com um período de retenção.
Interações
O Object Lock pode ser usado em combinação com vários recursos de armazenamento de objeto de acordo com seus requisitos de caso de uso
Versionamento
Ativando a versão é um pré-requisito para ativar o Bloqueio de Objeto. Se um depósito for criado usando o cabeçalho x-amz-bucket-object-lock-enabled,
a versão será ativada automaticamente.
Excluir um objeto com versão cria um marcador de exclusão. O objeto pode parecer ter sido excluído, mas se ele estiver protegido, será impossível excluir a versão protegida no modo CONFORMIDADE. Os marcadores de exclusão em si não
são protegidos No entanto, para objetos bloqueados no modo GOVERNANCE, usuários autorizados com a bypass-governance-retention permissão podem excluir o objeto antes do término do período de retenção, desde que não haja nenhuma
retenção legal ativa sobre o objeto.
Replicação
O Object Lock pode ser usado com a replicação. Se o Object Lock estiver ativado tanto no bucket de origem quanto no de destino da replicação, todos os estados do Object Lock nas versões do objeto de origem serão replicados para o bucket de destino. Isso inclui quaisquer atualizações do Object Lock que envolvam a contornagem de políticas de governança. Consulte “Replicação de objetos ” para obter mais informações.
Sistemas de Gerenciamento de Chaves
Os objetos protegidos serão criptografados usando a chave raiz do depósito. Quando o Bloqueio de Objeto é ativado em um depósito, a chave raiz hospedada pelo Key Protect ou pelo Hyper Protect Crypto Services é protegida contra exclusão, desde que um depósito associado tenha o Object Lock ativado. Isso evita a fragmentação de criptografia de objetos protegidos.
Configurações do ciclo de vida
É possível ativar políticas de ciclo de vida que arquivam objetos bloqueados, mas naturalmente não aquelas que expiram objetos sob retenção ou suspensão legal (objetos desprotegidos no depósito ainda podem ser expirados).
Immutable Object Storage
O Object Lock é uma alternativa às políticas de retenção disponíveis ao usar o Immutable Object Storage. Como o Object Lock requer que a versão seja ativada e o Immutable Object Storage não é compatível com a versão, é impossível ter ambas as soluções WORM ativadas no mesmo depósito. É possível ter uma combinação de buckets em uma Instância de Serviço, cada um usando o Object Storage ou o Bloqueio de Objeto Imutável
Identificação de objeto
Não há nenhuma restrição para incluir ou modificar tags em um objeto protegido.
Outras interações
Não deve haver interações adversas ao usar o Object Lock com outros recursos do site Object Storage, como a configuração de políticas do site CORS, firewalls de IP ou restrições baseadas em condições, cotas de bucket ou Code Engine.
Ações do IAM
Há novas ações do IAM associadas ao Object Lock.
| Ação do IAM | Função |
|---|---|
cloud-object-storage.bucket.get_object_lock_configuration |
Gerenciador, Gravador, Leitor |
cloud-object-storage.bucket.put_object_lock_configuration |
Gerenciador, gravador |
cloud-object-storage.object.get_object_lock_retention |
Gerenciador, Gravador, Leitor |
cloud-object-storage.object.put_object_lock_retention |
Gerenciador, gravador |
cloud-object-storage.object.get_object_lock_retention_version |
Gerenciador, Gravador, Leitor |
cloud-object-storage.object.put_object_lock_retention_version |
Gerenciador, gravador |
cloud-object-storage.object.get_object_lock_legal_hold |
Gerenciador, Gravador, Leitor |
cloud-object-storage.object.put_object_lock_legal_hold |
Gerenciador, gravador |
cloud-object-storage.object.get_object_lock_legal_hold_version |
Gerenciador, Gravador, Leitor |
cloud-object-storage.object.put_object_lock_legal_hold_version |
Gerenciador, gravador |
cloud-object-storage.object.bypass_governance_retention |
Gerenciador, gravador |
Esteja ciente de que os usuários com a função de Gravador são capazes de tornar objetos não excluíveis por muitos anos (possivelmente mil anos). Tenha cuidado e considere criar funções customizadas que não permitam que a maioria dos usuários configure uma Retain Until Date.
Eventos do Activity Tracker
O bloqueio de objeto gera eventos adicionais
cloud-object-storage.bucket-object-lock.createcloud-object-storage.bucket-object-lock.readcloud-object-storage.object-object-lock-legal-hold.createcloud-object-storage.object-object-lock-legal-hold.readcloud-object-storage.object-object-lock-retention.createcloud-object-storage.object-object-lock-retention.read
Para eventos cloud-object-storage.bucket-object-lock.create, os campos a seguir fornecem informações extras:
| Campo | Descrição |
|---|---|
requestData.object_lock_configuration.enabled |
Indica que o Bloqueio de Objeto está ativado no depósito |
requestData.object_lock_configuration.defaultRetention.mode |
Indica COMPLIANCE que GOVERNANCE o modo está ativo. |
object_lock_configuration.defaultRetention.years |
O período de retenção padrão em anos.. |
object_lock_configuration.defaultRetention.days |
O período de retenção padrão, em dias |
Apenas object_lock_configuration.defaultRetention.years ou object_lock_configuration.defaultRetention.days estará presente, mas não ambos ao mesmo tempo..
Para operações em objetos protegidos, os seguintes campos podem estar presentes:
| Campo | Descrição |
|---|---|
requestData.object_lock_protection.legal_hold |
Indica que uma suspensão legal está em vigor para a versão do objeto |
requestData.object_lock_protection.retention.mode |
Indica COMPLIANCE que GOVERNANCE o modo está ativo na versão do objeto. |
requestData.object_lock_protection.retention.retain_until_date |
Indica a data em que a versão do objeto é elegível para exclusão Após essa data, o objeto não será mais excluído protegido com base em uma data de retenção.. |
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 bloqueio de objeto em um depósito
A configuração do Object Lock é fornecida como XML no corpo da solicitação. Novas solicitações sobrescreverão quaisquer regras de replicação existentes presentes no depósito.
Uma configuração de Bloqueio de Objeto deve incluir uma regra
| Cabeçalho | Tipo | Descrição |
|---|---|---|
Content-MD5 |
Sequência | O hash de 128 bits do payload, codificado no formato “ base64 ” ( MD5 ), é utilizado como verificação de integridade para garantir que o payload não tenha sido alterado durante o transporte. |
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. |
x-amz-sdk-checksum-algorithm |
Sequência | Indica o algoritmo usado para criar a soma de verificação do objeto ao usar o SDK. |
x-amz-bypass-governance-retention |
Sequência | Este cabeçalho permite que usuários autorizados substituam as configurações de retenção do modo GOVERNANCE para excluir ou modificar um objeto antes de sua data de retenção. |
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 |
|---|---|---|---|---|
ObjectLockConfiguration |
Contêiner | ObjectLockEnabled, Rule |
Nenhum | Obrigatório Limite 1 |
ObjectLockEnabled |
Sequência | Nenhum | ObjectLockConfiguration |
Obrigatório O único valor válido é Enabled (distinção entre maiúsculas e minúsculas). |
Rule |
Contêiner | DefaultRetention |
ObjectLockConfiguration |
Limite 1 |
DefaultRetention |
Contêiner | Days, Mode, Years |
Rule |
Limite 1. |
Days |
Integer | Nenhum | DefaultRetention |
O número de dias que deseja especificar para o período de retenção padrão. Não é possível ser combinado com Years |
Mode |
Sequência | Nenhum | DefaultRetention |
COMPLIANCE ou GOVERNANCE (sensível a maiúsculas e minúsculas). |
Years |
Integer | Nenhum | DefaultRetention |
O número de anos que você deseja especificar para o período de retenção padrão.. Não é possível ser combinado com Days |
Este exemplo manterá quaisquer novos objetos por pelo menos 30 dias.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<ObjectLockEnabled>Enabled</ObjectLockEnabled>
<Rule>
<DefaultRetention>
<Days>30</Days>
<Mode>COMPLIANCE</Mode>
</DefaultRetention>
</Rule>
</ObjectLockConfiguration>'
Uma solicitação bem-sucedida retorna uma resposta de 200
Visualizar a configuração do bloqueio de objetos de um bucket
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
-H 'Authorization: bearer $TOKEN'
Isso retorna um corpo de resposta XML com o esquema apropriado:
<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<ObjectLockEnabled>string</ObjectLockEnabled>
<Rule>
<DefaultRetention>
<Days>30</Days>
<Mode>COMPLIANCE</Mode>
</DefaultRetention>
</Rule>
</ObjectLockConfiguration>
Incluir ou estender um período de retenção para um objeto
A configuração do Object Lock é fornecida como XML no corpo da solicitação. Novas solicitações substituirão quaisquer regras de replicação existentes no objeto, desde que o RetainUntilDate valor esteja mais distante no futuro
do que o valor atual, ou se o objeto estiver bloqueado no modo GOVERNANCE e o solicitante tiver a bypass-governance-retention permissão.
| Cabeçalho | Tipo | Descrição |
|---|---|---|
Content-MD5 |
Sequência | O hash de 128 bits do payload, codificado no formato “ base64 ” ( MD5 ), é utilizado como verificação de integridade para garantir que o payload não tenha sido alterado durante o transporte. |
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. |
x-amz-sdk-checksum-algorithm |
Sequência | Indica o algoritmo usado para criar a soma de verificação do objeto ao usar o SDK. |
x-amz-bypass-governance-retention |
Sequência | Este cabeçalho permite que usuários autorizados substituam as configurações de retenção do modo GOVERNANCE para excluir ou modificar um objeto antes de sua data de retenção. |
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.
Opcionalmente, é possível especificar a versão para a qual aplicar o RetainUntilDate..
Parâmetros de consulta opcionais
| Parâmetro | Obrigatório? | Tipo | Descrição |
|---|---|---|---|
versionID |
Opcional | string | ID da Versão. |
O corpo da solicitação deve conter um bloco XML com o esquema a seguir:
| Elemento | Tipo | Filhos | Antecessor | Restrição |
|---|---|---|---|---|
Retention |
Contêiner | Mode, RetainUntilDate |
Nenhum | Obrigatório Limite 1 |
Mode |
Sequência | Nenhum | Retention |
**Obrigatório **COMPLIANCE ou GOVERNANCE (sensível a maiúsculas e minúsculas). |
RetainUntilDate |
Sequência | Nenhum | Retention |
Obrigatório A data após a qual um objeto é elegível para exclusão no Formato de Data e Hora ISO8601 |
Este exemplo reterá quaisquer novos objetos pelo menos até 12 de março de 2023.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?retention" \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-MD5: fT0hYstki6zUvEh7abhcTA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<Retention>
<Mode>COMPLIANCE</Mode>
<RetainUntilDate>2023-03-12T23:01:00.000Z</RetainUntilDate>
</Retention>'
Uma solicitação bem-sucedida retorna uma resposta de 200
Se os valores RetainUntilDate não estiverem além de nenhum valor existente, a operação falhará com um 403 Access Denied.
Este exemplo reduz o período de retenção de uma versão de objeto existente protegida no modo GOVERNANCE. O solicitante deve ter a permissão de retenção de governança de bypass.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT?retention" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-MD5: fT0hYstki6zUvEh7abhcTA==" \
-H "Content-Type: text/plain; charset=utf-8" \
-H "x-amz-bypass-governance-retention: true" \
-d $'<Retention>
<Mode>GOVERNANCE</Mode>
<RetainUntilDate>2023-02-10T23:01:00.000Z</RetainUntilDate>
</Retention>'
Uma solicitação bem-sucedida retorna uma resposta 200 OK. Se o solicitante não tiver permissão bypass-governance-retention ou o cabeçalho for omitido, a operação falhará com um 403 Acesso negado.
Incluir ou remover uma suspensão legal para um objeto..
A configuração do Object Lock é fornecida como XML no corpo da solicitação. Novas solicitações sobrescreverão quaisquer regras de replicação existentes que estejam presentes no objeto, desde que o RetainUntilDate esteja mais distante
no futuro do que o valor atual...
| Cabeçalho | Tipo | Descrição |
|---|---|---|
Content-MD5 |
Sequência | O hash de 128 bits do payload, codificado no formato “ base64 ” ( MD5 ), é utilizado como verificação de integridade para garantir que o payload não tenha sido alterado durante o transporte. |
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. |
x-amz-sdk-checksum-algorithm |
Sequência | Indica o algoritmo usado para criar a soma de verificação do objeto ao usar o SDK. |
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 |
|---|---|---|---|---|
legal-hold |
Contêiner | Status |
Nenhum | Limite 1. |
Status |
Sequência | Nenhum | legal-hold |
Os valores suportados são ON ou OFF (com distinção entre maiúsculas e minúsculas) |
Este exemplo reterá quaisquer novos objetos pelo menos até 12 de março de 2023.
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?legal-hold&versionId=$VERSION_ID" \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-MD5: FMh6GxizXUBRaiDuB0vtgQ==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<legal-hold>
<Status>ON</Status>
</legal-hold>'
Uma solicitação bem-sucedida retorna uma resposta de 200
Exemplos SDK
Os exemplos a seguir utilizam os SDKs COS da IBM para Python, Node.js, Java e Go, bem como um script Terraform, 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 pontos de extremidade personalizados. O uso de ferramentas de terceiros requer credenciais HMAC para calcular assinaturas AWS V4.
Python
A ativação do Object Lock usando o IBM COS SDK for Python pode ser feita usando a sintaxe do cliente de baixo nível.
Usando um cliente:
import ibm_boto3
from ibm_botocore.client import Config
from ibm_botocore.exceptions import ClientError
from datetime import datetime, timedelta
import time
# Create new bucket with Object Lock enabled.
def create_bucket_with_objectlock(bucket_name):
cos_cli.create_bucket(
Bucket=bucket_name,
ObjectLockEnabledForBucket=True,
)
print("Bucket: {0} created with objectlock enabled".format(bucket_name))
def objectlock_configuration_on_bucket(bucket_name):
# Putting default retenion on the COS bucket.
default_retention_rule = {'DefaultRetention': {'Mode': 'COMPLIANCE', 'Years': 1}}
object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
# Reading the objectlock configuration set on the bucket.
response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
print("Objectlock Configuration for {0} =>".format(bucket_name))
print(response.ObjectLockConfiguration)
def objectlock_configuration_with_governance_mode_on_bucket(bucket_name):
# Putting default retenion on the COS bucket with governance mode.
default_retention_rule = {'DefaultRetention': {'Mode': 'GOVERNANCE', 'Years': 1}}
object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
# Reading the objectlock configuration set on the bucket.
response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
print("Objectlock Configuration for {0} =>".format(bucket_name))
print(response.ObjectLockConfiguration)
def upload_object(bucket_name,object_name,object_content):
cos_cli.put_object(
Bucket=bucket_name,
Key=object_name,
Body=object_content
)
print("Object: {0} uploaded!".format(object_name))
def upload_object_with_governance_mode(bucket_name,object_name,object_content):
cos_cli.put_object(
Bucket=bucket_name,
Key=object_name,
Body=object_content,
ObjectLockMode='GOVERNANCE',
ObjectLockRetainUntilDate=datetime(2025, 11, 15)
)
print("Object: {0} uploaded!".format(object_name))
def objectlock_retention(bucket_name,object_name):
# Put objectlock retenion on the object uploaded to the bucket.
date = datetime.now()+timedelta(seconds=5)
retention_rule = {'Mode': 'COMPLIANCE', 'RetainUntilDate': date}
cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)
# Get objectlock retention of the above object.
response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
print("Objectlock Retention for {0}=>".format(object_name))
print(response.Retention)
def objectlock_retention_with_governance_mode(bucket_name,object_name):
# Put objectlock retenion with governance mode on the object uploaded to the bucket.
date = datetime.now()+timedelta(seconds=5)
retention_rule = {'Mode': 'GOVERNANCE', 'RetainUntilDate': date}
cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)
# Get objectlock retention of the above object.
response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
print("Objectlock Retention for {0}=>".format(object_name))
print(response.Retention)
def objectlock_legal_hold(bucket_name,object_name):
# Setting the objectlock legal-hold status to ON.
cos_cli.put_object_legal_hold(Bucket=bucket_name, Key=object_name, legal_hold={'Status': 'ON'})
# Get objectlock retention of the above object.
response = cos_cli.get_object_legal_hold(Bucket=bucket_name, Key=object_name)
print("Objectlock legal-hold for {0}=>".format(object_name))
print(response.legal_hold)
def delete_object_with_bypass_governance(bucket_name,object_name):
# Deleting an object with retention using bypass governance
cos_cli.delete_object(Bucket=bucket_name, Key=object_name, BypassGovernanceRetention=True)
COS_ENDPOINT = "" #Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints -> Ex:https://s3.us-south.cloud-object-storage.appdomain.cloud
COS_API_KEY_ID = "" #API Key of the cos instance created Ex: W00YixxxxxxxxxxMB-odB-2ySfTrFBIQQWanc--P3byk
COS_RESOURCE_INSTANCE_CRN = "" #API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
# Create client connection
cos_cli = ibm_boto3.client("s3",
ibm_api_key_id=COS_API_KEY_ID,
config=Config(signature_version="oauth"),
endpoint_url=COS_ENDPOINT,
ibm_service_instance_id=COS_RESOURCE_INSTANCE_CRN,
ibm_auth_endpoint="https://iam.cloud.ibm.com/identity/token"
)
new_bucket_name = "create-example-python12345" # bucket name should be unique gloablly, or else it will throw an error.
new_text_file_name = "cos_object.txt"
new_text_file_contents = "This is a test file from Python code sample!!!"
# *** Main Program ***
def main():
create_bucket_with_objectlock(new_bucket_name) # Create a new cos bucket with object lock enabled.
objectlock_configuration_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
objectlock_configuration_with_governance_mode_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention)with governance mode on COS bucket and get the configuration.
upload_object(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket.
upload_object_with_governance_mode(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket with governance mode.
objectlock_retention(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
objectlock_retention_with_governance_mode(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
objectlock_legal_hold(new_bucket_name,new_text_file_name) # Put objectlock legal-hold on the object and get the legal-hold status.
delete_object_with_bypass_governance(new_bucket_name,new_text_file_name) # Deleting an object with retention with governance mode using bypass governance.
if __name__ == "__main__":
main()
Node.js
Ativando a versão usando o SDK do IBM COS SDK for Node.js:
'use strict';
// Required libraries
const ibm = require('ibm-cos-sdk');
const fs = require('fs');
const crypto = require('crypto');
function logError(e) {
console.log(`ERROR: ${e.code} - ${e.message}\n`);
}
function logDone() {
console.log('DONE!\n');
}
const COS_ENDPOINT = ""; //Choose endpoint from https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints. Ex: https://s3.us-south.cloud-object-storage.appdomain.cloud
const COS_API_KEY_ID = ""; // API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
const COS_AUTH_ENDPOINT = "";
const COS_RESOURCE_INSTANCE_CRN = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a <CREDENTIAL_ID_AS_GENERATED>:<SERVICE_ID_AS_GENERATED>::
// Client Creation.
var config = {
endpoint: COS_ENDPOINT,
apiKeyId: COS_API_KEY_ID,
ibmAuthEndpoint: COS_AUTH_ENDPOINT,
serviceInstanceId: COS_RESOURCE_INSTANCE_CRN,
signatureVersion: 'iam'
};
var cos = new ibm.S3(config);
// Create new bucket with objectlock enabled.
function createBucket(bucketName) {
console.log(`Creating new bucket: ${bucketName}`);
return cos.createBucket({
Bucket: bucketName,
ObjectLockEnabledForBucket: true,
CreateBucketConfiguration: {
LocationConstraint: ''
},
}).promise()
.then((() => {
console.log(`Bucket: ${bucketName} created!`);
}))
.catch((e) => {
console.error(`ERROR: ${e.code} - ${e.message}\n`);
});
}
// Create new text file and upload the object to COS bucket.
function createTextFile(bucketName, itemName, fileText) {
console.log(`Creating new item: ${itemName}`);
return cos.putObject({
Bucket: bucketName,
Key: itemName,
Body: fileText
}).promise()
.then(() => {
console.log(`Item: ${itemName} created!`);
logDone();
})
.catch(logError);
}
function uploadFileWithGovernanceMode(bucketName, itemName, fileText) {
var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
console.log(`Creating new item: ${itemName}`);
return cos.putObject({
Bucket: bucketName,
Key: itemName,
Body: fileText,
ObjectLockMode: "GOVERNANCE",
ObjectLockRetainUntilDate: inFiveSecond,
}).promise()
.then(() => {
console.log(`Item: ${itemName} created!`);
logDone();
})
.catch(logError);
}
function putObjectLockConfigurationOnBucket(bucketName) {
console.log(`Putting Objectlock Configuration on : ${bucketName}`);
// Putting objectlock configuration
var defaultRetention = {Mode: 'COMPLIANCE', Days: 1}
var objectLockRule = {DefaultRetention : defaultRetention}
var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
return cos.putObjectLockConfiguration({
Bucket: bucketName,
ObjectLockConfiguration: param
}).promise()
.then(() => {
console.log(`Object lock Configurtion added!!`);
logDone();
})
.catch(logError);
}
function putObjectLockConfigurationWithGovernanceModeOnBucket(bucketName) {
console.log(`Putting Objectlock Configuration on : ${bucketName}`);
// Putting objectlock configuration
var defaultRetention = {Mode: 'GOVERNANCE', Days: 1}
var objectLockRule = {DefaultRetention : defaultRetention}
var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
return cos.putObjectLockConfiguration({
Bucket: bucketName,
ObjectLockConfiguration: param
}).promise()
.then(() => {
console.log(`Object lock Configurtion with Governance mode added!!`);
logDone();
})
.catch(logError);
}
function getObjectLockConfigurationonBucket(bucketName) {
console.log(`Getting Objectlock Configuration for : ${bucketName}`);
// Getting objectlock configuration
return cos.getObjectLockConfiguration({
Bucket: bucketName,
}).promise()
.then((data) => {
console.log(`objectlock configuration`);
console.log( JSON.stringify(data.ObjectLockConfiguration, null, " ") );
logDone();
})
.catch(logError);
}
function putObjectLockRetention(bucketName,keyName) {
console.log(`Putting Objectlock Retention on : ${keyName}`);
var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
var rule = {Mode: 'COMPLIANCE', RetainUntilDate: inFiveSecond}
// Putting objectlock retention
return cos.putObjectRetention({
Bucket: bucketName,
Key: keyName,
Retention: rule
}).promise()
.then(() => {
console.log(`Object lock Retention added!!`);
logDone();
})
.catch(logError);
}
function putObjectLockRetentionWithGovernanceMode(bucketName,keyName) {
console.log(`Putting Objectlock Retention on : ${keyName}`);
var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
var rule = {Mode: 'GOVERNANCE', RetainUntilDate: inFiveSecond}
// Putting objectlock retention
return cos.putObjectRetention({
Bucket: bucketName,
Key: keyName,
Retention: rule
}).promise()
.then(() => {
console.log(`Object lock Retention with governance mode added!!`);
logDone();
})
.catch(logError);
}
function getObjectLockRetention(bucketName,keyName) {
console.log(`Getting Objectlock Retention for : ${keyName}`);
// Getting objectlock retention
return cos.getObjectRetention({
Bucket: bucketName,
Key: keyName
}).promise()
.then((data) => {
console.log(`Objectlock retention for : ${keyName} `);
console.log( JSON.stringify(data.Retention, null, " ") );
logDone();
})
.catch(logError);
}
function putObjectLocklegalHold(bucketName,keyName) {
console.log(`Putting Objectlock legal-hold status ON for : ${keyName}`);
// Putting objectlock legal-hold status
return cos.putObjectlegalHold({
Bucket: bucketName,
Key: keyName,
LegalHold: {Status: 'ON'}
}).promise()
.then(() => {
console.log(`Object lock legal-hold added!!`);
logDone();
})
.catch(logError);
}
function getObjectLocklegalHold(bucketName,keyName) {
console.log(`Getting Objectlock legal-hold for : ${keyName}`);
// Getting objectlock legal-hold
return cos.getObjectlegal-hold({
Bucket: bucketName,
Key: keyName
}).promise()
.then((data) => {
console.log(`Objectlock legal-hold for : ${keyName} `);
console.log( JSON.stringify(data.legal-hold, null, " ") );
logDone();
})
.catch(logError);
}
function createBucket(bucketName,objectName) {
console.log(`Deleting Object t: ${objectName}`);
return cos.deleteObject({
Bucket: bucketName,
Key: objectName,
BypassGovernanceRetention: true,
}).promise()
.then(() => {
console.log("Object deleted");
})
.catch(err => {
console.error("Error deleting object:", err);
});
}
// Main app
function main() {
try {
var newBucketName = "jscosbucket350";
var newTextFileName = "js_cos_bucket_file.txt";
var newTextFileContents = "This is a test file from Node.js code sample!!!";
createBucket(newBucketName) // Create a new cos bucket with object lock enabled.
.then(() => putObjectLockConfigurationOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) on COS bucket.
.then(() => putObjectLockConfigurationWithGovernanceModeOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
.then(() => getObjectLockConfigurationonBucket(newBucketName)) // Read objectlock configuration on COS bucket.
.then(() => createTextFile(newBucketName, newTextFileName, newTextFileContents)) // Upload an object with governance mode to cos bucket.
.then(() => uploadFileWithGovernanceMode(newBucketName, newTextFileName, newTextFileContents)) // Upload an object to cos bucket.
.then(() => putObjectLockRetention(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) on the object.
.then(() => putObjectLockRetentionWithGovernanceMode(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) with governance mode on the object.
.then(() => getObjectLockRetention(newBucketName, newTextFileName)) // Get the configured retention.
.then(() => putObjectLocklegalHold(newBucketName,newTextFileName)) // Put objectlock legal-hold on the object.
.then(() => getObjectLocklegalHold(newBucketName,newTextFileName))// Get the legal-hold status.
.then(() => deleteObjectWithGovernanceMode(newBucketName,newTextFileName)); // Deleting an object with retention using bypass governance
}
catch(ex) {
logError(ex);
}
}
main();
```### Java
{: #ol-sdks-java}
```java {: codeblock}
mport com.ibm.cloud.objectstorage.ClientConfiguration;
import com.ibm.cloud.objectstorage.SDKGlobalConfiguration;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder;
import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;
public class JavaExampleSDK {
private static AmazonS3 _cosClient;
private static String api_key;
private static String service_instance_id;
private static String endpoint_url;
private static String location;
private static String auth_endpoint;
public static void main(String[] args) throws IOException
{
// Constants for IBM COS values
auth_endpoint = ""; // auth endpoint
api_key = "";// example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
service_instance_id = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a/xx999cd94a0dda86fd8eff3191349999:9999b05b-x999-4917-xxxx-9d5b326a1111::
endpoint_url = ""; // example: https://s3.us-south.cloud-object-storage.appdomain.cloud
location = "";// example: us-south-standard
// Create client connection details
// _cosClient = createClient(api_key, service_instance_id, endpoint_url, location);
// String bucketName = "java.bucket" + UUID.randomUUID().toString().replace("-","");
// String itemName = UUID.randomUUID().toString().replace("-","") + "_java_file.txt";
// String fileText = "This is a test file from the Java code sample!!!";
// // create a new bucket
// createBucket(bucketName, _cosClient);
// // Put objectlock configuration(i.e. default retention) on COS bucket.
// putObjectLockConfiguration(bucketName , _cosClient);
// // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
// putObjectLockConfigurationWithGovernanceMode(bucketName , _cosClient);
// // create a new text file & upload
// createTextFileAndUpload(bucketName, itemName, fileText);
// // Upload an object with governance mode to cos bucket.
// uploadFileWithGovernanceMode(bucketName, itemName, fileText);
// // Put objectlock retention(i.e. retain until date) on the object.
// putObjectLockRetention(bucketName, itemName, _cosClient);
// // Put objectlock retention(i.e. retain until date) with governance mode on the object.
// putObjectLockRetentionWithGovernanceMode(bucketName, itemName, _cosClient);
// // remove the object with bypass governance
// deleteObjectWithBypassGovernance(bucketName);
}
// Create client connection
public static AmazonS3 createClient(String api_key, String service_instance_id, String endpoint_url, String location)
{
AWSCredentials credentials;
credentials = new BasicIBMOAuthCredentials(api_key, service_instance_id);
ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
clientConfig.setUseTcpKeepAlive(true);
AmazonS3 cosClient = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint_url, location)).withPathStyleAccessEnabled(true)
.withClientConfiguration(clientConfig).build();
return cosClient;
}
// Create a new bucket
public static void createBucket(String bucketName, AmazonS3 _cosClient)
{
_cosClient.createBucket(bucketName);
System.out.printf("Bucket: %s created!\n", bucketName);
}
// Put objectlock configuration(i.e. default retention) on COS bucket.
public static void putObjectLockConfiguration(String bucketName, AmazonS3 _cosClient)
{
DefaultRetention defRet = new DefaultRetention()
.withMode(ObjectLockRetentionMode.COMPLIANCE)
.withDays(1);
ObjectLockRule objRule = new ObjectLockRule()
.withDefaultRetention(defRet);
ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
.withObjectLockEnabled(ObjectLockEnabled.ENABLED)
.withRule(objRule);
SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
.withBucketName(BUCKET_NAME)
.withObjectLockConfiguration(objConfig);
_cosClient.setObjectLockConfiguration(objSet);
System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
ObjectLockRule objGetRule = objLckConfig.getRule();
System.out.printf("ObjectLock Configuration : %s\n", objGetRule);
}
// Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
public static void putObjectLockConfigurationWithGovernanceMode(String bucketName, AmazonS3 _cosClient)
{
DefaultRetention defRet = new DefaultRetention()
.withMode(ObjectLockRetentionMode.GOVERNANCE)
.withDays(1);
ObjectLockRule objRule = new ObjectLockRule()
.withDefaultRetention(defRet);
ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
.withObjectLockEnabled(ObjectLockEnabled.ENABLED)
.withRule(objRule);
SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
.withBucketName(BUCKET_NAME)
.withObjectLockConfiguration(objConfig);
_cosClient.setObjectLockConfiguration(objSet);
System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
ObjectLockRule objGetRule = objLckConfig.getRule();
System.out.printf("ObjectLock Configuration : %s\n", objGetRule);
}
// Create file and upload to new bucket
public static void createTextFileAndUpload(String bucketName, String itemName, String fileText) {
System.out.printf("Creating new item: %s\n", itemName);
InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileText.length());
PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata);
_cosClient.putObject(req);
System.out.printf("Item: %s created!\n", itemName);
}
// Upload an object with governance mode to cos bucket.
public static void uploadFileWithGovernanceMode(String bucketName, String itemName, String fileText) {
System.out.printf("Creating new item: %s\n", itemName);
LocalDate date = LocalDate.of(2025, 11, 11);
InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileText.length());
PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata)
.withObjectLockMode("GOVERNANCE")
.withObjectLockRetainUntilDate(date);
_cosClient.putObject(req);
System.out.printf("Item: %s created!\n", itemName);
}
// Put objectlock retention(i.e. retain until date) on the object.
public static void putObjectLockRetention(String bucketName,String itemName, AmazonS3 _cosClient)
{
LocalDate date = LocalDate.of(2025, 11, 11);
ObjectLockRetention objRet = new ObjectLockRetention()
.withMode("COMPLIANCE")
.withRetainUntilDate(date);
SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName)
.withRetention(objRet);
.withBypassGovernanceRetention(true);
_cosClient.setObjectRetention(objSet);
System.out.printf("Successfully added object retention on : %s\n", itemName);
GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName);
GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
ObjectLockRetention objRet1 = objRes1.getRetention();
System.out.printf("Retention : %s\n", objRet1);
}
// Put objectlock retention(i.e. retain until date) with governance mode on the object.
public static void putObjectLockRetentionWithGovernanceMode(String bucketName,String itemName, AmazonS3 _cosClient)
{
LocalDate date = LocalDate.of(2025, 11, 11);
ObjectLockRetention objRet = new ObjectLockRetention()
.withMode("GOVERNANCE")
.withRetainUntilDate(date);
SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName)
.withRetention(objRet);
.withBypassGovernanceRetention(true);
_cosClient.setObjectRetention(objSet);
System.out.printf("Successfully added object retention on : %s\n", itemName);
GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
.withBucketName(BUCKET_NAME)
.withitemName(itemName);
GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
ObjectLockRetention objRet1 = objRes1.getRetention();
System.out.printf("Retention : %s\n", objRet1);
}
// Delete object
public static void deleteObjectWithBypassGovernance(String bucketName, String itemName) {
System.out.printf("Deleting item: %s\n", itemName);
DeleteObjectRequest deleteRequest = new DeleteObjectRequest(BUCKET_NAME, Key)
.withBypassGovernanceRetention(true);
_cosClient.deleteObject(deleteRequest);
System.out.printf("Item: %s deleted!\n", itemName);
}
}
Acessar
package main
import (
"bytes"
"fmt"
"time"
"github.com/IBM/ibm-cos-sdk-go/aws"
"github.com/IBM/ibm-cos-sdk-go/aws/credentials/ibmiam"
"github.com/IBM/ibm-cos-sdk-go/aws/session"
"github.com/IBM/ibm-cos-sdk-go/service/s3"
)
const (
apiKey = "<apiKey>"
serviceInstanceID = "<serviceInstanceID>"
authEndpoint = "https://iam.cloud.ibm.com/identity/token"
serviceEndpoint = "https://<endpoint>.appdomain.cloud"
)
// Create new bucket with objectlock enabled.
func createBucket(bucketName string, client *s3.S3) {
createBucketInput := new(s3.CreateBucketInput)
createBucketInput.Bucket = aws.String(bucketName)
createBucketInput.ObjectLockEnabledForBucket = aws.Bool(true)
_, e := client.CreateBucket(createBucketInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Bucket Created !!! ")
}
}
func uploadObject(bucketName string, client *s3.S3, fileName string, fileContent string) {
putInput := &s3.PutObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(fileName),
Body: bytes.NewReader([]byte(fileContent)),
}
_, e := client.PutObject(putInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Uploaded!!! ")
}
}
func uploadObjectWithGovernanceMode(bucketName string, client *s3.S3, fileName string, fileContent string) {
retention_date := time.Now().Local().Add(time.Second * 5)
putInput := &s3.PutObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(fileName),
Body: bytes.NewReader([]byte(fileContent)),
ObjectLockMode: aws.String("GOVERNANCE"),
ObjectLockRetainUntilDate: aws.Time(retention_date),
}
_, e := client.PutObject(putInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Uploaded!!! ")
}
}
func objectLockConfiguration(bucketName string, client *s3.S3) {
// Putting default retenion on the COS bucket.
putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
Bucket: aws.String(bucketName),
ObjectLockConfiguration: &s3.ObjectLockConfiguration{
ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
Rule: &s3.ObjectLockRule{
DefaultRetention: &s3.DefaultRetention{
Mode: aws.String("COMPLIANCE"),
Days: aws.Int64(1),
},
},
},
}
_, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)
// Reading the objectlock configuration set on the bucket.
getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
}
}
func objectLockConfigurationwithGovernanceMode(bucketName string, client *s3.S3) {
// Putting default retenion on the COS bucket.
putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
Bucket: aws.String(bucketName),
ObjectLockConfiguration: &s3.ObjectLockConfiguration{
ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
Rule: &s3.ObjectLockRule{
DefaultRetention: &s3.DefaultRetention{
Mode: aws.String("GOVERNANCE"),
Days: aws.Int64(1),
},
},
},
}
_, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)
// Reading the objectlock configuration set on the bucket.
getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
}
}
func objectLockRetention(bucketName string, client *s3.S3, keyName string) {
// Put objectlock retenion on the object uploaded to the bucket.
retention_date := time.Now().Local().Add(time.Second * 5)
putObjectRetentionInput := &s3.PutObjectRetentionInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
Retention: &s3.ObjectLockRetention{
Mode: aws.String("COMPLIANCE"),
RetainUntilDate: aws.Time(retention_date),
},
}
_, e := client.PutObjectRetention(putObjectRetentionInput)
// Get objectlock retention of the above object.
getObjectRetentionInput := new(s3.GetObjectRetentionInput)
getObjectRetentionInput.Bucket = aws.String(bucketName)
getObjectRetentionInput.Key = aws.String(keyName)
response, e := client.GetObjectRetention(getObjectRetentionInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Retention =>", response.Retention)
}
}
func objectLockRetentionWithGovernanceMode(bucketName string, client *s3.S3, keyName string) {
// Put objectlock retenion on the object uploaded to the bucket.
retention_date := time.Now().Local().Add(time.Second * 5)
putObjectRetentionInput := &s3.PutObjectRetentionInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
Retention: &s3.ObjectLockRetention{
Mode: aws.String("GOVERNANCE"),
RetainUntilDate: aws.Time(retention_date),
},
}
_, e := client.PutObjectRetention(putObjectRetentionInput)
// Get objectlock retention of the above object.
getObjectRetentionInput := new(s3.GetObjectRetentionInput)
getObjectRetentionInput.Bucket = aws.String(bucketName)
getObjectRetentionInput.Key = aws.String(keyName)
response, e := client.GetObjectRetention(getObjectRetentionInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock Retention =>", response.Retention)
}
}
func objectLocklegalHold(bucketName string, client *s3.S3, keyName string) {
// Setting the objectlock legal-hold status to ON.
putObjectlegalHoldInput := &s3.PutObjectlegalHoldInput{
Bucket: aws.String(bucketName),
Key: aws.String(keyName),
legalHold: &s3.ObjectLocklegalHold{
Status: aws.String("ON"),
},
}
_, e := client.PutObjectlegalHold(putObjectlegalHoldInput)
// Get objectlock retention of the above object.
getObjectlegalHoldInput := new(s3.GetObjectlegalHoldInput)
getObjectlegalHoldInput.Bucket = aws.String(bucketName)
getObjectlegalHoldInput.Key = aws.String(keyName)
response, e := client.GetObjectlegalHold(getObjectlegalHoldInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Lock legal-hold =>", response.legalHold)
}
}
func deleteObjectWithBypassGovernance(bucketName string, client *s3.S3, fileName string) {
deleteObjectInput := new(s3.DeleteObjectInput)
deleteObjectInput.Bucket = aws.String(bucketName)
deleteObjectInput.Key = aws.String("foo")
deleteObjectInput.BypassGovernanceRetention = aws.Bool(true)
_, e := client.DeleteObject(deleteObjectInput)
if e != nil {
fmt.Println(e)
} else {
fmt.Println("Object Deleted")
}
}
func main() {
bucketName := "gocosbucket353"
textFileName := "go_cos_bucket_file.txt"
textFileContents := "This is a test file from Node.js code sample!!!"
conf := aws.NewConfig().
WithEndpoint(serviceEndpoint).
WithCredentials(ibmiam.NewStaticCredentials(aws.NewConfig(),
authEndpoint, apiKey, serviceInstanceID)).
WithS3ForcePathStyle(true)
sess := session.Must(session.NewSession())
client := s3.New(sess, conf)
createBucket(bucketName, client) // Create a new cos bucket with object lock enabled.
objectLockConfiguration(bucketName, client) // Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
objectLockConfigurationwithGovernanceMode(bucketName, client) // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket and get the configuration.
uploadObject(bucketName, client, textFileName, textFileContents) // Upload an object to cos bucket.
uploadObjectWithGovernanceMode(bucketName, client, textFileName, textFileContents) // Upload an object with governance mode to cos bucket.
objectLockRetention(bucketName, client, textFileName) // Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
objectLockRetentionWithGovernanceMode(bucketName, client, textFileName) // Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
objectLocklegalHold(bucketName, client, textFileName) // Put objectlock legal-hold on the object and get the legal-hold status.
deleteObjectWithBypassGovernance(bucketName, client, textFileName) // Delete object using governace bypass header
}
Terraform
// Create COS instance.
resource "ibm_resource_instance" "cos_instance" {
name = "cos-instance"
resource_group_id = data.ibm_resource_group.cos_group.id
service = "cloud-object-storage"
plan = "standard"
location = "global"
}
// Create a new bucket with objectlock and object versioning enabled.
resource "ibm_cos_bucket" "bucket" {
bucket_name = var.bucket_name
resource_instance_id = ibm_resource_instance.cos_instance.id
region_location = var.regional_loc
storage_class = var.standard_storage_class
object_versioning {
enable = true
}
object_lock = true
}
// Set object lock configuration on the bucket by providing the crn of the new COS bucket.
resource ibm_cos_bucket_objectlock_configuration "objectlock" {
bucket_crn = ibm_cos_bucket.bucket.crn
bucket_location = var.regional_loc
object_lock_configuration{
objectlockenabled = "Enabled"
objectlockrule{
defaultretention{
mode = "COMPLIANCE"
days = 6
}
}
}
}
// Upload an object to the COS bucket with objectlock retention and objectlock legal-hold.
resource "ibm_cos_bucket_object" "object_object_lock" {
bucket_crn = ibm_cos_bucket.bucket.crn
bucket_location = ibm_cos_bucket.bucket.region_location
content = "Hello World 2"
key = "plaintext5.txt"
object_lock_mode = "COMPLIANCE"
object_lock_retain_until_date = "2023-02-15T18:00:00Z"
object_lock_legal_hold_status = "ON"
force_delete = true
}