Integração Nextcloud + Amazon S3

Nextcloud tem suporte a diferentes tipos de armazenamentos externos através do app “External storage”, entre eles: SMB (compartilhamento de pasta do Windows), SFTP e Amazon S3.

Amazon Simple Storage Service (S3) é um serviço de armazenamento de objetos, que se diferencia do armazenamento de arquivos em alguns aspectos. Um deles sendo que, enquanto que em armazenamento de arquivos existe uma hierarquia de pastas ou diretórios, no armazenamento de objetos eles se encontram todos no mesmo ambiente, chamado bucket.

Aplicações conseguem, no entanto, simular essa estrutura de pastas, graças ao fato de que o caractere / é permitido no nome dos objetos. E é exatamente isso que acontece no Nextcloud e no utilitário de linha de comando aws.

A forma como o armazenamento de objetos é construído permite uma alta escalabilidade e, diferente de um serviço de armazenamento de arquivos como Google Drive, em que você contrata uma quantidade de armazenamento para ter disponível, nos serviços de armazenamento de objetos você paga pelo que é usado.

Esse tipo de serviço é comumente usado em cenários de armazenamento de grande escala, como backups, CDNs, dados para treinamento de LLMs como ChatGPT e Gemini, onde não há necessidade de edição de arquivos no armazenamento.

Partindo para a prática, o bucket foi criado de forma simples, mantendo as opções padrões:

Agora deve-se criar um usuário, um grupo, adicionar o usuário ao grupo e criar uma política para dar acesso ao bucket para o usuário. Isso pode ser feito através do console:

https://console.aws.amazon.com/iam

Você pode permitir acesso do grupo ao bucket através da política de permissão existente AmazonS3FullAccess. Isso daria acesso a todos os buckets existentes na conta para esse grupo. Isso pode não ser desejável. Uma alternativa é criar uma política de permissão, que pode ser feita no formato json:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "FullAccessToChuteiOBucket",
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::chuteiobucket",
        "arn:aws:s3:::chuteiobucket/*"
      ]
    }
  ]
}

Substitua o nome do bucket de acordo.

Para autenticação do usuário, deve-se criar uma chave de acesso.

Baixe a chave e guarde de forma segura. Você pode usar o utilitário de linha de comando para testar o acesso do usuário.

Para Debian, Ubuntu e derivados:

# apt install awscli

Para Fedora, CentOS Stream, RHEL, etc:

# dnf install awscli2

Configure a chave de acesso:

$ aws configure

E teste o acesso ao bucket para listar, copiar e deletar arquivos:

$ aws s3 ls s3://chuteiobucket
$ aws s3 cp arquivo.txt s3://chuteiobucket
$ aws s3 rm s3://chuteiobucket/arquivo.txt

Informação adicional: transferências incrementais podem ser feitas entre um armazenamento local e o bucket (em ambas as direções) com:

$ aws s3 sync s3://chuteiobucket /pasta/de/destino

Verificado o funcionamento, basta configurar no Nextcloud: habilite o aplicativo “External storage support” e ajuste as configurações de acordo com as preferências.

O host foi um pouco difícil de descobrir, não encontrei na AWS de forma tão explícita. Em vez disso, ao selecionar um objeto existente no bucket (que fiz upload com o utilitário de linha de comando), aparecia a opção de copiar URL, e foi como vi que o endereço era: s3.<região da AWS>.amazonaws.com

Ao conectar, o armazenamento S3 aparece como uma pasta para os usuários que você determinar. Adicionalmente, é possível permitir que usuários adicionem armazenamentos externos, como o S3, para as próprias contas.