{"id":1765,"date":"2026-09-29T08:52:35","date_gmt":"2026-09-29T11:52:35","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1765"},"modified":"2026-09-29T08:52:35","modified_gmt":"2026-09-29T11:52:35","slug":"rclone-migracao-do-s3-para-gcs-ou-oci-parte-2","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/rclone-migracao-do-s3-para-gcs-ou-oci-parte-2\/","title":{"rendered":"rclone: migraci\u00f3n de S3 a GCS o OCI \u2014 parte 2"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/rclone-migracao-s3-gcs-oci-capa.webp\" alt=\"Mascote LinuxPro e cachorro caramelo cyborg transportam caixas com o logo rclone de um rack AWS para racks Google Cloud e Oracle.\" width=\"1486\" height=\"856\" \/><\/p>\n<p>Na <a href=\"\/2026\/09\/rclone-no-linux-sync-backup-criptografado-mount-e-serve-em-qualquer-nuvem\/\">parte 1<\/a>, o rclone levou arquivos do servidor para a nuvem. Aqui ele leva uma nuvem para outra: buckets do <strong>Amazon S3<\/strong> migrados para o <strong>Google Cloud Storage<\/strong> (GCS) ou para o <strong>OCI Object Storage<\/strong>, da Oracle. O processo \u00e9 o mesmo para os dois destinos \u2014 muda s\u00f3 o remote de chegada \u2014 e foi montado para migrar sem janela longa de parada: c\u00f3pia em massa com as aplica\u00e7\u00f5es ainda no S3, deltas at\u00e9 o atraso ficar pequeno, congelamento curto, verifica\u00e7\u00e3o e virada.<\/p>\n<p><!-- more --><\/p>\n<p>Os comandos usam o rclone <strong>1.75.1<\/strong>. O fluxo de c\u00f3pia, delta, sync final e verifica\u00e7\u00e3o foi ensaiado de ponta a ponta contra um S3 local (o pr\u00f3prio <code>rclone serve s3<\/code>); a sintaxe dos remotes de GCS e OCI foi conferida no bin\u00e1rio e na documenta\u00e7\u00e3o dos provedores. N\u00e3o houve teste contra contas reais de AWS, GCP ou OCI. Contas reais t\u00eam limites, pol\u00edticas e quotas pr\u00f3prias \u2014 fa\u00e7a um ensaio com um bucket pequeno antes do grande.<\/p>\n<h2>Antes de come\u00e7ar: custo, lugar e escopo<\/h2>\n<p><strong>Custo.<\/strong> O que mais pesa numa migra\u00e7\u00e3o para fora da AWS \u00e9 a sa\u00edda de dados: a AWS cobra por GB transferido do S3 para a internet. Desde mar\u00e7o de 2024 existe um programa que <strong>isenta essa cobran\u00e7a para quem est\u00e1 saindo da AWS<\/strong>, mas ele n\u00e3o \u00e9 autom\u00e1tico: \u00e9 preciso abrir um chamado no suporte, a aprova\u00e7\u00e3o \u00e9 por conta e o prazo para concluir a migra\u00e7\u00e3o \u00e9 de 90 dias (<a href=\"https:\/\/aws.amazon.com\/blogs\/aws\/free-data-transfer-out-to-internet-when-moving-out-of-aws\/\">an\u00fancio oficial<\/a>). Pe\u00e7a antes de come\u00e7ar, n\u00e3o depois da fatura. Some as requisi\u00e7\u00f5es de listagem, leitura e grava\u00e7\u00e3o (<code>LIST<\/code>, <code>GET<\/code>, <code>HEAD<\/code> e <code>PUT<\/code>), a recupera\u00e7\u00e3o de classes frias, a VM e eventual tr\u00e1fego de sa\u00edda do destino na verifica\u00e7\u00e3o. Muitos objetos pequenos podem tornar o custo de requisi\u00e7\u00f5es relevante; calcule para suas regi\u00f5es e classes.<\/p>\n<p><strong>Lugar.<\/strong> Numa c\u00f3pia entre provedores diferentes n\u00e3o existe &#8220;c\u00f3pia server-side&#8221;: cada objeto sai do S3, passa pela mem\u00f3ria da m\u00e1quina que roda o rclone e \u00e9 gravado no destino. O conte\u00fado dos objetos \u00e9 transmitido sem precisar armazenar o bucket no disco local; logs e invent\u00e1rios ficam em disco. A banda, a CPU e os limites das APIs podem limitar a transfer\u00eancia. Rode o rclone numa VM perto de uma das pontas \u2014 uma inst\u00e2ncia no GCP ou no OCI na mesma regi\u00e3o do bucket de destino \u00e9 o mais pr\u00e1tico, porque permite autenticar sem chave em arquivo (veja abaixo) \u2014 e n\u00e3o no notebook de casa.<\/p>\n<p><strong>Escopo.<\/strong> O rclone migra <strong>objetos<\/strong>: conte\u00fado, nome, <code>Content-Type<\/code> e data de modifica\u00e7\u00e3o. Pol\u00edticas de bucket, ACLs, regras de ciclo de vida, versionamento, notifica\u00e7\u00f5es de eventos e replica\u00e7\u00e3o s\u00e3o configura\u00e7\u00e3o do bucket e precisam ser recriadas no destino, na linguagem de cada provedor. Liste isso no in\u00edcio para n\u00e3o descobrir na virada.<\/p>\n<h2>Arquitetura e fases da migra\u00e7\u00e3o<\/h2>\n<p>A VM com o rclone l\u00ea do S3 com um usu\u00e1rio IAM somente leitura e grava no destino com uma credencial de objetos restrita ao bucket de destino. A migra\u00e7\u00e3o passa por seis fases: invent\u00e1rio, c\u00f3pia em massa, deltas repetidos, congelamento com sync final, verifica\u00e7\u00e3o e virada das aplica\u00e7\u00f5es. O bucket do S3 continua intacto e somente leitura at\u00e9 o novo estar validado em produ\u00e7\u00e3o \u2014 \u00e9 o seu plano de volta.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/rclone-migracao-s3-gcs-oci.webp\" alt=\"Diagrama da migra\u00e7\u00e3o de Amazon S3 para Google Cloud Storage ou OCI Object Storage com rclone, com a VM de migra\u00e7\u00e3o no meio e as seis fases: invent\u00e1rio, c\u00f3pia em massa, deltas, congelamento, verifica\u00e7\u00e3o e virada\" width=\"1200\" height=\"760\" \/><\/p>\n<h2>Preparar a VM de migra\u00e7\u00e3o<\/h2>\n<p>Instale o rclone conforme a parte 1, al\u00e9m de <code>tmux<\/code> e Python 3. Os exemplos abaixo usam Bash e nomes de buckets ilustrativos: substitua nomes, projeto, namespace, compartment e regi\u00f5es. A cria\u00e7\u00e3o de buckets, contas e pol\u00edticas exige uma identidade administrativa separada; o processo de c\u00f3pia usa somente as permiss\u00f5es restritas apresentadas adiante. Instale e autentique a CLI do destino escolhido antes das etapas de provisionamento.<\/p>\n<pre><code class=\"language-bash\">umask 077\nmkdir -p \"$HOME\/rclone-migracao\/logs\" \"$HOME\/.config\/rclone\"\ncd \"$HOME\/rclone-migracao\"\nrclone version<\/code><\/pre>\n<p>Todos os arquivos de invent\u00e1rio e relat\u00f3rios ser\u00e3o gerados nesse diret\u00f3rio. N\u00e3o coloque chaves em reposit\u00f3rios, no hist\u00f3rico do shell ou em argumentos vis\u00edveis na lista de processos.<\/p>\n<h2>Origem: credencial somente leitura na AWS<\/h2>\n<p>Crie um usu\u00e1rio IAM (ou uma role, se o rclone rodar numa EC2) s\u00f3 com leitura no bucket de origem. Nada de chave de administrador numa VM de migra\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-json\">{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\"s3:ListBucket\", \"s3:GetBucketLocation\"],\n      \"Resource\": \"arn:aws:s3:::meu-bucket\"\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\"s3:GetObject\"],\n      \"Resource\": \"arn:aws:s3:::meu-bucket\/*\"\n    }\n  ]\n}<\/code><\/pre>\n<p>E o remote de origem, com a regi\u00e3o do bucket:<\/p>\n<pre><code class=\"language-bash\">rclone config<\/code><\/pre>\n<p>Crie o remote <code>aws<\/code>, tipo <code>s3<\/code>, provider <code>AWS<\/code>, regi\u00e3o <code>us-east-1<\/code> (troque pela real). Para chaves fornecidas pelo administrador, use <code>env_auth=false<\/code> e informe access key e secret key no assistente, sem coloc\u00e1-las na linha de comando. Credenciais tempor\u00e1rias tamb\u00e9m precisam do session token. Teste diretamente o bucket autorizado:<\/p>\n<pre><code class=\"language-bash\">rclone lsf aws:meu-bucket --max-depth 1<\/code><\/pre>\n<p>Se o rclone rodar numa EC2 com instance profile, use <code>env_auth=true<\/code> e n\u00e3o grave chave nenhuma. Como na parte 1, cifre o <code>rclone.conf<\/code> com <code>rclone config encryption set<\/code> depois de configurar todos os remotes. Se houver SSE-KMS, a leitura tamb\u00e9m pode precisar de <code>kms:Decrypt<\/code> e autoriza\u00e7\u00e3o na pol\u00edtica da chave. N\u00e3o aumente o IAM s\u00f3 para listar todos os buckets da conta.<\/p>\n<h2>Fase 1: invent\u00e1rio<\/h2>\n<p>Antes de mover um byte, saiba o que existe. Tamanho total e n\u00famero de objetos:<\/p>\n<pre><code class=\"language-bash\">rclone size aws:meu-bucket --fast-list<\/code><\/pre>\n<p>A lista completa, com caminho, tamanho, data e <strong>classe de armazenamento<\/strong>, num CSV que vai servir de refer\u00eancia na verifica\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-bash\">rclone lsf -R --files-only --fast-list \\\n  --format \"pstT\" --csv \\\n  aws:meu-bucket &gt; inventario-s3.csv\n\n# objetos por classe de armazenamento\npython3 - &lt;&lt;'PYCSV'\nimport csv\nfrom collections import Counter\nwith open(\"inventario-s3.csv\", newline=\"\") as f:\n    counts = Counter(row[3] or \"not-reported\" for row in csv.reader(f))\nfor storage_class, count in sorted(counts.items()):\n    print(count, storage_class)\nPYCSV<\/code><\/pre>\n<p>Tr\u00eas coisas que o invent\u00e1rio precisa responder:<\/p>\n<ul>\n<li><strong>H\u00e1 objetos nas classes Glacier Flexible Retrieval ou Deep Archive?<\/strong> Sem restaura\u00e7\u00e3o, o rclone n\u00e3o l\u00ea o conte\u00fado deles: a c\u00f3pia falha com <code>Object in GLACIER, restore first<\/code>. Pe\u00e7a a um operador com <code>s3:RestoreObject<\/code> que restaure antes (essa a\u00e7\u00e3o n\u00e3o est\u00e1 na credencial somente leitura de migra\u00e7\u00e3o). Com o remote desse operador autorizado, os comandos s\u00e3o:\n<pre><code class=\"language-bash\">rclone backend restore aws:meu-bucket\/arquivo-morto -o priority=Bulk -o lifetime=7\nrclone backend restore-status aws:meu-bucket\/arquivo-morto<\/code><\/pre>\n<p>O prazo depende da classe e da prioridade e pode ultrapassar um dia; aguarde o status de restaura\u00e7\u00e3o antes da c\u00f3pia. Glacier Instant Retrieval n\u00e3o exige esse procedimento.<\/li>\n<li><strong>O bucket tem versionamento?<\/strong> O rclone copia a vers\u00e3o atual de cada objeto. Se o hist\u00f3rico de vers\u00f5es precisa ir junto, isso \u00e9 um projeto \u00e0 parte (<code>--s3-versions<\/code> lista as vers\u00f5es antigas como arquivos com sufixo de data); para a maioria das migra\u00e7\u00f5es, vers\u00e3o atual basta.<\/li>\n<li><strong>Quanto muda por dia?<\/strong> Compare dois invent\u00e1rios com um dia de dist\u00e2ncia. Isso define quantos deltas ser\u00e3o necess\u00e1rios e quanto tempo dura o congelamento.<\/li>\n<\/ul>\n<h2>Destino A: Google Cloud Storage<\/h2>\n<p>Crie o bucket na regi\u00e3o certa e com acesso uniforme (permiss\u00e3o pelo IAM do bucket, sem ACL por objeto \u2014 \u00e9 o padr\u00e3o recomendado pelo Google):<\/p>\n<pre><code class=\"language-bash\">gcloud storage buckets create gs:\/\/meu-bucket-gcs \\\n  --location=southamerica-east1 \\\n  --default-storage-class=STANDARD \\\n  --uniform-bucket-level-access<\/code><\/pre>\n<p>Crie uma service account s\u00f3 para a migra\u00e7\u00e3o e d\u00ea a ela permiss\u00e3o de objetos <strong>naquele bucket<\/strong>, n\u00e3o no projeto inteiro:<\/p>\n<pre><code class=\"language-bash\">gcloud iam service-accounts create rclone-migracao \\\n  --display-name=\"rclone migracao S3\"\n\ngcloud storage buckets add-iam-policy-binding gs:\/\/meu-bucket-gcs \\\n  --member=serviceAccount:rclone-migracao@MEU-PROJETO.iam.gserviceaccount.com \\\n  --role=roles\/storage.objectAdmin<\/code><\/pre>\n<p><strong>Autentica\u00e7\u00e3o sem chave (prefer\u00edvel).<\/strong> Rode o rclone numa VM do Compute Engine com essa service account anexada e escopo OAuth <code>cloud-platform<\/code>. IAM e escopos da VM precisam permitir a opera\u00e7\u00e3o; um escopo somente leitura bloqueia uploads mesmo com o papel adequado. O rclone usa as Application Default Credentials da pr\u00f3pria VM:<\/p>\n<pre><code class=\"language-bash\">rclone config create gcs gcs \\\n  env_auth=true \\\n  bucket_policy_only=true\n\nrclone lsf gcs:meu-bucket-gcs --max-depth 1<\/code><\/pre>\n<p><strong>Autentica\u00e7\u00e3o com chave JSON.<\/strong> Fora do GCP, gere uma chave da service account. Organiza\u00e7\u00f5es criadas a partir de 3 de maio de 2024 v\u00eam com a pol\u00edtica <code>iam.disableServiceAccountKeyCreation<\/code> ativa por padr\u00e3o, e o comando abaixo falha at\u00e9 um administrador abrir exce\u00e7\u00e3o \u2014 mais um motivo para rodar dentro do GCP:<\/p>\n<pre><code class=\"language-bash\">umask 077\nmkdir -p \"$HOME\/.config\/rclone\"\ngcloud iam service-accounts keys create \"$HOME\/.config\/rclone\/gcs-migracao.json\" \\\n  --iam-account=rclone-migracao@MEU-PROJETO.iam.gserviceaccount.com\nchmod 600 \"$HOME\/.config\/rclone\/gcs-migracao.json\"\n\nrclone config create gcs gcs \\\n  service_account_file=\"$HOME\/.config\/rclone\/gcs-migracao.json\" \\\n  bucket_policy_only=true<\/code><\/pre>\n<p>Com <code>bucket_policy_only=true<\/code> o rclone n\u00e3o tenta gravar ACL por objeto, o que daria erro num bucket com acesso uniforme. Terminada a migra\u00e7\u00e3o, apague a chave (<code>gcloud iam service-accounts keys delete<\/code>).<\/p>\n<p><strong>Alternativa gerenciada.<\/strong> Para S3 \u2192 GCS, o Google tem o <a href=\"https:\/\/docs.cloud.google.com\/storage-transfer\/docs\/sources-and-sinks\">Storage Transfer Service<\/a>, que l\u00ea do Amazon S3 sem VM nem agente. Para um bucket \u00fanico e grande, sem transforma\u00e7\u00e3o no meio, vale comparar. O rclone ganha quando voc\u00ea quer o mesmo procedimento para GCS e OCI, filtros, relat\u00f3rios de diferen\u00e7a e controle fino de cada fase.<\/p>\n<h2>Destino B: OCI Object Storage<\/h2>\n<p>O rclone tem backend nativo para o OCI (<code>oracleobjectstorage<\/code>), que usa a autentica\u00e7\u00e3o da pr\u00f3pria Oracle. Voc\u00ea vai precisar do <strong>namespace<\/strong> do tenancy (<code>oci os ns get<\/code>), do <strong>OCID do compartment<\/strong> e da <strong>regi\u00e3o<\/strong>. Crie o bucket:<\/p>\n<pre><code class=\"language-bash\">oci os bucket create \\\n  --name meu-bucket-oci \\\n  --compartment-id ocid1.compartment.oc1..aaaa... \\\n  --storage-tier Standard<\/code><\/pre>\n<p>Esta policy permite consultar metadados dos buckets do compartment <code>Storage<\/code>, mas restringe o gerenciamento de objetos ao bucket de migra\u00e7\u00e3o. Para uma VM, substitua <code>group MigracaoS3<\/code> por <code>dynamic-group NomeDoGrupo<\/code>:<\/p>\n<pre><code class=\"language-text\">Allow group MigracaoS3 to read buckets in compartment Storage\nAllow group MigracaoS3 to manage objects in compartment Storage where target.bucket.name='meu-bucket-oci'<\/code><\/pre>\n<p><strong>User principal<\/strong> (rclone fora do OCI): o usu\u00e1rio tem uma API key e um arquivo de configura\u00e7\u00e3o do OCI, o mesmo que o <code>oci<\/code> CLI usa. Use <code>rclone config<\/code> para cadastrar o remote e selecionar o arquivo e o profile. O bloco resultante deve corresponder ao exemplo abaixo, adaptando o caminho e o nome do profile do seu arquivo OCI. N\u00e3o cole texto INI em um <code>rclone.conf<\/code> j\u00e1 criptografado: use o assistente.<\/p>\n<pre><code class=\"language-ini\">[oci]\ntype = oracleobjectstorage\nprovider = user_principal_auth\nnamespace = meunamespace\ncompartment = ocid1.compartment.oc1..aaaa...\nregion = sa-saopaulo-1\nconfig_file = \/etc\/rclone\/oci\/config\nconfig_profile = MIGRACAO<\/code><\/pre>\n<p><strong>Instance principal<\/strong> (rclone numa VM do OCI, prefer\u00edvel): a VM entra num dynamic group, a policy \u00e9 dada ao dynamic group, e nenhuma chave fica em disco:<\/p>\n<pre><code class=\"language-bash\">rclone config create oci oracleobjectstorage \\\n  provider=instance_principal_auth \\\n  namespace=meunamespace \\\n  compartment=ocid1.compartment.oc1..aaaa... \\\n  region=sa-saopaulo-1\n\nrclone lsf oci:meu-bucket-oci --max-depth 1<\/code><\/pre>\n<p><strong>Alternativa pela API compat\u00edvel com S3.<\/strong> O OCI tamb\u00e9m exp\u00f5e uma API compat\u00edvel com S3, com Customer Secret Keys (par access\/secret gerado no console) e endpoint no formato <code>https:\/\/&lt;namespace&gt;.compat.objectstorage.&lt;regi\u00e3o&gt;.oci.customer-oci.com<\/code>. Serve para aplica\u00e7\u00f5es que j\u00e1 falam S3 \u2014 \u00fatil na virada \u2014 mas para a migra\u00e7\u00e3o prefira o backend nativo. Um detalhe: buckets criados pela API S3 v\u00e3o para o compartment raiz, a menos que voc\u00ea defina outro compartment padr\u00e3o para ela.<\/p>\n<h2>Fase 2: c\u00f3pia em massa<\/h2>\n<p>Com as aplica\u00e7\u00f5es ainda gravando no S3, fa\u00e7a a primeira c\u00f3pia completa. Use <code>copy<\/code>, n\u00e3o <code>sync<\/code>: nesta fase nada deve ser apagado no destino. Ensaie antes com <code>--dry-run<\/code> e rode dentro de um <code>tmux<\/code> (ou <code>screen<\/code>), porque vai demorar:<\/p>\n<pre><code class=\"language-bash\">tmux new -s migracao\n\nrclone copy aws:meu-bucket gcs:meu-bucket-gcs \\\n  --transfers 32 \\\n  --checkers 64 \\\n  --fast-list \\\n  --order-by size,descending \\\n  --log-file \"$HOME\/rclone-migracao\/logs\"\/migracao-copy.log \\\n  --log-level INFO \\\n  --stats 1m --stats-one-line<\/code><\/pre>\n<p>Para o OCI, troque s\u00f3 o destino: <code>oci:meu-bucket-oci<\/code>. O que cada flag faz aqui:<\/p>\n<ul>\n<li><code>--transfers 32 --checkers 64<\/code>: bem acima do padr\u00e3o (4 e 8). S\u00e3o valores ilustrativos, n\u00e3o uma garantia: banda, mem\u00f3ria, CPU e quotas das APIs limitam o resultado. Suba aos poucos olhando o log.<\/li>\n<li><code>--fast-list<\/code>: lista o bucket em menos chamadas de API. Gasta mais mem\u00f3ria (a listagem inteira fica em RAM), economiza tempo e requisi\u00e7\u00f5es cobradas.<\/li>\n<li><code>--order-by size,descending<\/code>: come\u00e7a pelos objetos grandes, que ocupam a banda de forma est\u00e1vel, e deixa a cauda de arquivos pequenos para o fim.<\/li>\n<li><code>--log-file<\/code>: a prova do que foi copiado. Guarde.<\/li>\n<\/ul>\n<p>Se a c\u00f3pia cair no meio \u2014 rede, rein\u00edcio da VM, fim da sess\u00e3o \u2014, rode o mesmo comando de novo. O rclone compara tamanho e data e s\u00f3 copia o que falta; n\u00e3o recome\u00e7a do zero.<\/p>\n<h2>Fase 3: deltas at\u00e9 o atraso ficar pequeno<\/h2>\n<p>Enquanto a c\u00f3pia em massa rodava, as aplica\u00e7\u00f5es continuaram gravando no S3. Repita o mesmo <code>copy<\/code>: agora ele s\u00f3 transfere objetos novos ou alterados. As rodadas s\u00f3 tendem a encurtar quando a capacidade de c\u00f3pia supera a taxa de altera\u00e7\u00f5es na origem. Para rodadas intermedi\u00e1rias em buckets muito grandes, limite a compara\u00e7\u00e3o ao que mudou recentemente:<\/p>\n<pre><code class=\"language-bash\">rclone copy aws:meu-bucket gcs:meu-bucket-gcs \\\n  --max-age 2d \\\n  --transfers 32 --checkers 64 --fast-list \\\n  --log-file \"$HOME\/rclone-migracao\/logs\"\/migracao-delta.log --log-level INFO<\/code><\/pre>\n<p><code>--max-age<\/code> filtra pela data de modifica\u00e7\u00e3o do objeto, que pode vir do metadado <code>X-Amz-Meta-Mtime<\/code>, n\u00e3o necessariamente da data do upload. Um objeto rec\u00e9m-enviado pode preservar uma data antiga e ficar fora do filtro. Use uma janela maior que o intervalo entre as rodadas e, antes do congelamento, fa\u00e7a uma rodada <strong>sem<\/strong> o filtro para pegar qualquer coisa que tenha escapado. Quando um delta completo levar poucos minutos, est\u00e1 na hora da fase 4.<\/p>\n<h2>Fase 4: congelamento e sync final<\/h2>\n<p>Pare as grava\u00e7\u00f5es no S3: coloque a aplica\u00e7\u00e3o em manuten\u00e7\u00e3o, pare os workers de upload ou tire temporariamente a permiss\u00e3o de escrita no bucket. Mantenha o destino sem escritores de aplica\u00e7\u00e3o tamb\u00e9m. Ent\u00e3o ensaie e rode um <code>sync<\/code>, que al\u00e9m de copiar o que falta <strong>apaga no destino<\/strong> o que foi removido na origem desde a c\u00f3pia em massa:<\/p>\n<pre><code class=\"language-bash\"># Primeiro simule e revise especialmente as exclus\u00f5es:\nrclone sync aws:meu-bucket gcs:meu-bucket-gcs \\\n  --transfers 32 --checkers 64 --fast-list \\\n  --max-delete 1000 \\\n  --log-file \"$HOME\/rclone-migracao\/logs\"\/migracao-final.log --log-level INFO \\\n  --dry-run\n\n# S\u00f3 ap\u00f3s revisar: repita o comando acima removendo --dry-run.<\/code><\/pre>\n<p>O <code>--max-delete<\/code> \u00e9 a trava da parte 1 aplicada aqui: se o sync quiser apagar mais do que o esperado \u2014 origem trocada por engano, credencial apontando para o bucket errado \u2014, ele para. Ajuste o n\u00famero ao que o invent\u00e1rio e os deltas indicam. Esse limite n\u00e3o torna o sync uma transa\u00e7\u00e3o e n\u00e3o desfaz altera\u00e7\u00f5es j\u00e1 feitas. Exija t\u00e9rmino com c\u00f3digo zero e investigue qualquer erro antes de avan\u00e7ar.<\/p>\n<h2>Fase 5: verifica\u00e7\u00e3o<\/h2>\n<p>Depois do sync, rode <code>check<\/code> sem <code>--one-way<\/code>: queremos encontrar tanto objetos faltando quanto sobras no destino. Ele verifica tamanho e hashes dispon\u00edveis; n\u00e3o \u00e9 prova de igualdade de conte\u00fado quando n\u00e3o existe um hash utiliz\u00e1vel nos dois lados.<\/p>\n<pre><code class=\"language-bash\">if rclone check aws:meu-bucket gcs:meu-bucket-gcs \\\n  --fast-list \\\n  --differ \"$HOME\/rclone-migracao\/logs\/check-diferentes.txt\" \\\n  --missing-on-dst \"$HOME\/rclone-migracao\/logs\/check-faltando.txt\" \\\n  --missing-on-src \"$HOME\/rclone-migracao\/logs\/check-sobrando.txt\" \\\n  --error \"$HOME\/rclone-migracao\/logs\/check-erros.txt\"; then\n  echo \"Check conclu\u00eddo; revise tamb\u00e9m o resumo de hashes no log.\"\nelse\n  echo \"FALHA: n\u00e3o fa\u00e7a a virada; examine erros e diferen\u00e7as.\" &gt;&amp;2\nfi<\/code><\/pre>\n<p>Avance somente com c\u00f3digo de sa\u00edda zero, relat\u00f3rios sem diferen\u00e7as e sem erros. Relat\u00f3rios vazios isoladamente n\u00e3o bastam. MD5 pode estar indispon\u00edvel em objetos multipart ou cifrados; o rclone tamb\u00e9m pode encontrar um MD5 adicional nos metadados de objetos enviados por ele. Sem hash comum, a compara\u00e7\u00e3o pode se limitar ao tamanho.<\/p>\n<p>Para conferir o conte\u00fado de um prefixo cr\u00edtico, use:<\/p>\n<pre><code class=\"language-bash\">rclone check aws:meu-bucket\/pasta-critica gcs:meu-bucket-gcs\/pasta-critica \\\n  --download<\/code><\/pre>\n<p><code>--download<\/code> l\u00ea o conte\u00fado nas duas pontas e pode gerar egress em ambos os provedores. Uma amostra valida somente a amostra. Se o requisito \u00e9 conferir todo o conte\u00fado sem hashes comuns, planeje a leitura integral, seu custo e sua dura\u00e7\u00e3o; n\u00e3o encerre a janela de manuten\u00e7\u00e3o enquanto a valida\u00e7\u00e3o exigida estiver pendente.<\/p>\n<p>Com as grava\u00e7\u00f5es ainda congeladas, gere invent\u00e1rios novos de origem e destino e compare caminho e tamanho usando um parser CSV (nomes com v\u00edrgulas ou quebras de linha n\u00e3o podem ser tratados com <code>cut<\/code>):<\/p>\n<pre><code class=\"language-bash\">rclone lsf -R --files-only --fast-list --format \"ps\" --csv aws:meu-bucket &gt; inventario-origem-final.csv\nrclone lsf -R --files-only --fast-list --format \"ps\" --csv gcs:meu-bucket-gcs &gt; inventario-destino.csv\n\npython3 - &lt;&lt;'PYCSV'\nimport csv\nfrom collections import Counter\n\ndef load(path):\n    with open(path, newline=\"\") as f:\n        return Counter((row[0], int(row[1])) for row in csv.reader(f))\n\nsrc = load(\"inventario-origem-final.csv\")\ndst = load(\"inventario-destino.csv\")\nif src != dst:\n    raise SystemExit(\"Invent\u00e1rios diferentes: n\u00e3o fa\u00e7a a virada\")\nprint(\"Invent\u00e1rios batem em caminho e tamanho; isso n\u00e3o substitui hashes\")\nPYCSV<\/code><\/pre>\n<p>Interrompa tamb\u00e9m se qualquer comando de invent\u00e1rio falhar; n\u00e3o compare arquivos parciais. O parser carrega os invent\u00e1rios em mem\u00f3ria: para milh\u00f5es de objetos, dimensione a RAM ou fa\u00e7a a compara\u00e7\u00e3o em banco de dados.<\/p>\n<h2>O que chega e o que n\u00e3o chega no destino<\/h2>\n<table>\n<thead>\n<tr>\n<th>Item<\/th>\n<th>GCS<\/th>\n<th>OCI<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Conte\u00fado e nome do objeto<\/td>\n<td>Sim<\/td>\n<td>Sim<\/td>\n<\/tr>\n<tr>\n<td><code>Content-Type<\/code><\/td>\n<td>Sim<\/td>\n<td>Sim<\/td>\n<\/tr>\n<tr>\n<td>Data de modifica\u00e7\u00e3o<\/td>\n<td>Sim (metadado <code>mtime<\/code>)<\/td>\n<td>Sim (metadado <code>opc-meta-mtime<\/code>)<\/td>\n<\/tr>\n<tr>\n<td>Metadados customizados <code>x-amz-meta-*<\/code><\/td>\n<td>N\u00e3o<\/td>\n<td>N\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>ACLs, bucket policy, lifecycle, vers\u00f5es antigas<\/td>\n<td>N\u00e3o \u2014 recriar<\/td>\n<td>N\u00e3o \u2014 recriar<\/td>\n<\/tr>\n<tr>\n<td>Classe de armazenamento<\/td>\n<td>N\u00e3o \u2014 definir no destino<\/td>\n<td>N\u00e3o \u2014 definir no destino<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Os metadados customizados s\u00e3o o ponto que mais surpreende. O rclone sabe ler os metadados do S3 (<code>-M<\/code>\/<code>--metadata<\/code>), mas na vers\u00e3o 1.75.1 os backends de GCS e de OCI n\u00e3o gravam metadados arbitr\u00e1rios por esse mecanismo. Se a aplica\u00e7\u00e3o depende de <code>x-amz-meta-*<\/code> \u2014 um hash pr\u00f3prio, um ID de usu\u00e1rio \u2014, exporte antes com <code>rclone lsjson aws:meu-bucket -R --files-only --metadata &gt; metadados-origem.json<\/code>, e trate a migra\u00e7\u00e3o desses campos \u00e0 parte, ou mude a aplica\u00e7\u00e3o para n\u00e3o depender deles.<\/p>\n<p>A classe de armazenamento tamb\u00e9m n\u00e3o \u00e9 copiada: tudo chega na classe padr\u00e3o do bucket ou na que voc\u00ea passar. Para mandar um prefixo de arquivo morto direto para uma classe barata, fa\u00e7a essa parte num comando separado com <code>--gcs-storage-class ARCHIVE<\/code> (GCS) ou <code>--oos-storage-tier Archive<\/code> (OCI) \u2014 e lembre que a leitura dessas classes tem custo e, no OCI Archive, tempo de restaura\u00e7\u00e3o.<\/p>\n<h2>Fase 6: virada das aplica\u00e7\u00f5es<\/h2>\n<p>Com a verifica\u00e7\u00e3o limpa, aponte as aplica\u00e7\u00f5es para o novo bucket. O tamanho da mudan\u00e7a depende de como elas falam com o storage:<\/p>\n<ul>\n<li><strong>SDK nativo do provedor<\/strong>: troque o cliente S3 pelo do GCS ou do OCI. \u00c9 o caminho mais limpo, e o mais trabalhoso.<\/li>\n<li><strong>Continuar falando S3<\/strong>: o GCS aceita chamadas no formato S3 em <code>https:\/\/storage.googleapis.com<\/code> com chaves HMAC (a documenta\u00e7\u00e3o do rclone, no backend S3, tem o provider <code>GCS<\/code> para isso), e o OCI tem a API compat\u00edvel com S3 citada acima. A troca pode se limitar a endpoint, regi\u00e3o e credenciais, mas n\u00e3o assuma compatibilidade completa do SDK ou de todos os recursos. Teste as opera\u00e7\u00f5es que a aplica\u00e7\u00e3o usa \u2014 URLs pr\u00e9-assinadas, multipart, listagem com prefixo \u2014 porque compat\u00edvel n\u00e3o significa id\u00eantico.<\/li>\n<li><strong>CDN e URLs p\u00fablicas<\/strong>: se o bucket servia arquivos por URL direta ou atr\u00e1s de CloudFront, a origem do CDN e os links publicados tamb\u00e9m mudam. Planeje redirecionamentos.<\/li>\n<\/ul>\n<p>Depois da virada, deixe o bucket do S3 <strong>somente leitura<\/strong> por alguns dias ou semanas. <strong>Rollback n\u00e3o \u00e9 apenas repontar.<\/strong> Depois de aceitar grava\u00e7\u00f5es no novo provedor, o S3 estar\u00e1 desatualizado. Para voltar, congele os escritores novamente, reconcilie cria\u00e7\u00f5es, altera\u00e7\u00f5es e exclus\u00f5es ocorridas ap\u00f3s a virada e valide os dados antes de reabrir o S3 para escrita. Defina previamente quem faz essa reconcilia\u00e7\u00e3o, as permiss\u00f5es tempor\u00e1rias necess\u00e1rias e o tratamento de conflitos. N\u00e3o execute um sync reverso \u00e0s cegas. S\u00f3 apague o S3 quando o novo bucket tiver passado por um ciclo completo de uso \u2014 e lembre de encerrar a credencial IAM, a chave da service account e o usu\u00e1rio do OCI criados para a migra\u00e7\u00e3o.<\/p>\n<h2>Checklist<\/h2>\n<ul>\n<li>Pedido de isen\u00e7\u00e3o de egress aberto no suporte da AWS (se aplic\u00e1vel) antes da primeira c\u00f3pia.<\/li>\n<li>Invent\u00e1rio com contagem, tamanho e classes; objetos Glacier restaurados.<\/li>\n<li>Credencial de origem somente leitura; credencial de destino restrita ao bucket.<\/li>\n<li>VM de migra\u00e7\u00e3o na regi\u00e3o certa, com banda suficiente e <code>tmux<\/code>.<\/li>\n<li><code>copy<\/code> em massa \u2192 deltas \u2192 congelamento \u2192 <code>sync<\/code> com <code>--max-delete<\/code>.<\/li>\n<li><code>check<\/code> bidirecional com c\u00f3digo zero, sem erros ou diferen\u00e7as; <code>--download<\/code> no escopo exigido; invent\u00e1rios finais comparados.<\/li>\n<li>Pol\u00edticas, lifecycle, CORS e permiss\u00f5es recriados no destino.<\/li>\n<li>Aplica\u00e7\u00f5es repontadas; S3 em somente leitura; rollback com reconcilia\u00e7\u00e3o definido; credenciais tempor\u00e1rias revogadas ao encerrar.<\/li>\n<\/ul>\n<h2>Fechando<\/h2>\n<p>Trocar de provedor de object storage \u00e9, no fundo, copiar muitos arquivos com cuidado \u2014 e isso o rclone faz bem. O trabalho de verdade est\u00e1 em volta: pedir a isen\u00e7\u00e3o de egress, restaurar o Glacier, aceitar que metadados customizados e configura\u00e7\u00f5es de bucket n\u00e3o viajam sozinhos, e manter o S3 intacto at\u00e9 o novo destino provar que funciona. O mesmo roteiro serve para GCS e OCI; muda uma linha de remote. Se voc\u00ea ainda n\u00e3o usa o rclone, comece pela <a href=\"\/2026\/09\/rclone-no-linux-sync-backup-criptografado-mount-e-serve-em-qualquer-nuvem\/\">parte 1<\/a>. E se o seu pr\u00f3ximo passo \u00e9 armazenar logs e m\u00e9tricas nesses buckets, o <a href=\"\/2026\/09\/openobserve-ubuntu-servidor-dedicado-s3-gcs-minio\/\">OpenObserve com S3, GCS e OCI<\/a> mostra o outro lado.<\/p>\n<h2>Refer\u00eancias oficiais<\/h2>\n<ul>\n<li><a href=\"https:\/\/rclone.org\/s3\/\">Backend S3: permiss\u00f5es, hashes, datas e Glacier<\/a><\/li>\n<li><a href=\"https:\/\/rclone.org\/googlecloudstorage\/\">Backend Google Cloud Storage<\/a> e <a href=\"https:\/\/rclone.org\/oracleobjectstorage\/\">backend OCI<\/a><\/li>\n<li><a href=\"https:\/\/rclone.org\/commands\/rclone_check\/\">Verifica\u00e7\u00e3o com rclone check<\/a> e <a href=\"https:\/\/rclone.org\/commands\/rclone_lsf\/\">invent\u00e1rios CSV<\/a><\/li>\n<li><a href=\"https:\/\/docs.cloud.google.com\/iam\/docs\/keys-create-delete\">Chaves de service account<\/a> e <a href=\"https:\/\/docs.cloud.google.com\/compute\/docs\/access\/service-accounts\">service accounts em VMs<\/a><\/li>\n<li><a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/Tasks\/s3compatibleapi.htm\">API S3 do OCI<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Migra buckets de Amazon S3 a Google Cloud Storage u OCI con rclone: inventario, copia inicial, deltas, congelamiento, verificaci\u00f3n y rollback.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[103,46,2,120],"tags":[189,106,461,331,515,511,460],"class_list":["post-1765","post","type-post","status-publish","format-standard","hentry","category-cloud","category-devops","category-linux","category-servidores","tag-aws","tag-cloud","tag-gcs","tag-migracao","tag-oci","tag-rclone","tag-s3"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=1765"}],"version-history":[{"count":2,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1765\/revisions"}],"predecessor-version":[{"id":1769,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1765\/revisions\/1769"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}