Receita: usar o AWS S3 localmente para desenvolvimento
Tags: tutorial, aws, braziliandevs, ptbr
Published: 2021-06-16 12:35:16

---
title: Receita: usar o AWS S3 localmente para desenvolvimento
published: true
description: Receita: usar o AWS S3 localmente para desenvolvimento
tags: tutorial, aws, braziliandevs, ptbr
cover_image: https://itexto.com.br/wp-content/uploads/2020/04/receita_s3ninja.png
---
<!-- wp:paragraph -->
<p>O serviço <a href="https://aws.amazon.com/s3" class="rank-math-link">S3</a> da AWS é uma das melhores, mais baratas e mais populares soluções para armazenamento de arquivos na nuvem. Mas e se em desenvolvimento você precisar trabalhar offline ou, melhor ainda, quiser reduzir o seu custo mensal com a AWS enquanto estiver programando? Esta receita resolve estes problemas.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Ingredientes desta receita</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"center"} -->
<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.kenresearch.com/blog/wp-content/uploads/2018/01/Philippines-Food-Ingredients-Market-Research-1.jpg" alt="Food Anti-Oxidants Market Philippines, Philippines Sweeteners ..."/></figure></div>
<!-- /wp:image -->

<!-- wp:list -->
<ul><li>Docker</li><li>S3 Ninja - estamos usando aqui seu último release que é o 6.4</li><li>Java - mas pode ser substituído pela linguagem de sua preferência</li><li>SDK da AWS para o Java - usamos a versão 2.11.2 - mas você pode fazer adaptações fáceis para seu ambiente caso não seja o Java</li><li>Linux - mas pode ser substituído por Windows ou MacOS</li></ul>
<!-- /wp:list -->

<!-- wp:heading -->
<h2>Ingrediente principal: S3 Ninja</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"center"} -->
<div class="wp-block-image"><figure class="aligncenter"><img src="https://s3ninja.net/assets/images/ninja.jpg" alt=""/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>O <a href="https://s3ninja.net/" class="rank-math-link">S3 Ninja</a> implementa as APIs de manutenção de <strong>objetos</strong> ("arquivos") providas pelo S3, sendo assim você conseguirá facilmente simular nele operações de obtenção, escrita e remoção de objetos. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Atenção: observe que <strong>não há aqui suporte para a manutenção de buckets</strong>. Para que seu ambiente de desenvolvimento esteja completo será necessário que estes buckets já existam no S3 Ninja. Há duas maneiras de se fazer isto: a primeira é usando a interface web que a ferramenta promove, manualmente, por tanto.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A segunda forma é usando Docker, que é bem melhor e já automatiza esta tarefa pra você, evitando com isto o trabalho manual. Vou te ensinar como fazer isto, é bem simples.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Não envenene seus convidados</h3>
<!-- /wp:heading -->

<!-- wp:image {"align":"center"} -->
<div class="wp-block-image"><figure class="aligncenter"><img src="https://fleurmach.files.wordpress.com/2013/03/or-cyanide.jpg" alt="horror | fleurmach | Page 5"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Apesar do S3 Ninja funcionar tal como quem emula ele não passa de um mock, e um mock <strong>muito limitado</strong>. Você só consegue interagir com objetos aqui. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>S3 Ninja não é escalável, não não é seguro, não é robusto. É apenas o que se propõe ser: um <strong>mock</strong> para que você consiga <strong>simular</strong> o S3 no seu ambiente de desenvolvimento ou testes automatizados. <strong>Não use em produção e não conte com ele como um componente de alta qualidade.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Primeiro passo: instalando o S3 Ninja</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Eis algo que era muito mais fácil de ser feito no passado, então preste muita atenção a este ponto. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A instalação do S3 Ninja hoje se dá a partir do Docker. Se você clicar no link "<a class="rank-math-link rank-math-link" href="https://hub.docker.com/r/scireum/s3-ninja/">Download</a>" do <a href="https://s3ninja.net" class="rank-math-link">site oficial</a> do projeto, será inclusive direcionado para o <a href="https://hub.docker.com/r/scireum/s3-ninja/" class="rank-math-link">Docker Hub</a>. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Infelizmente se você tentar executar a imagem provida no link de download acima mencionado talvez não consiga, tal como pode ser visto no print a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":1636,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-4.png" alt="" class="wp-image-1636"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Por quê? Por quê?? Por quê??? Simples: por que no momento da escrita desta receita não existia uma imagem com a versão "latest". Durante a escrita deste post a última <a href="https://hub.docker.com/r/scireum/s3-ninja/tags" class="rank-math-link">versão era a 6.4</a>. Sendo assim, se você executasse o comando abaixo, funcionaria.</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">docker pull scireum/s3-ninja:6.4</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Mas não basta isto: você também irá querer iniciar o S3 Ninja com todos os buckets já criados, certo? Infelizmente na documentação você não encontrará nada lhe ensinando a fazer isto. Então resolvi te poupar tempo aqui. Segue um arquivo <em>Dockerfile</em> customizado. Modifique as instruções "mkdir" para criar todos os buckets que você precisa.</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">FROM scireum/s3-ninja:6.4
USER sirius

# Inclua todos os buckets que precisa no comando a seguir

CMD mkdir -p /home/sirius/data/seu_primeiro_bucket &amp;&amp; \
    mkdir -p /home/sirius/data/seu_segundo_bucket &amp;&amp; \
    /home/sirius/run.sh

# O terceiro ponto irá iniciar o processo do S3 Ninja</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Caso não saiba o que fazer com este arquivo <em>Dockerfile</em>, crie um arquivo com este nome em um diretório qualquer em seu computador e, neste diretório, execute o seguinte comando:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">docker build --tag=s3ninja-itexto:latest .</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Isto irá criar uma imagem chamada <em>s3ninja-itexto.</em> O próximo passo consiste em executar seu container. Caso não saiba como fazê-lo, segue um exemplo:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">docker run -p 9444:9000 s3ninja-itexto:latest</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Voilá: note que estamos direcionando a saída da porta 9000 (do container) para a 9444 do host. Para testar sua instalação abra seu browser e acesse este endereço: <a href="http://localhost:9444/ui" class="rank-math-link">http://localhost:9444/ui</a> . Você verá uma página similar à exposta a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1638,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://www.itexto.com.br/site/wp-content/uploads/2020/04/image-5.png" alt="" class="wp-image-1638"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Observe que o Access Key e Secret Key são criados por padrão e apresentados no painel esquerdo desta interface. <strong>Guarde esta informação</strong>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Por esta interface você pode criar novos buckets, incluir arquivos em seu interior e verificar quais endpoints da API do S3 estão implementados no S3 Ninja. Pode ser muito útil!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Quer os arquivos de referência? Criei um repositório no Github contendo inclusive um arquivo do Docker Compose pra você. Basta clicar <a href="https://github.com/loboweissmann/receita-s3ninja" class="rank-math-link">neste link</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Aplicando em seu código fonte</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3>Aplicável a qualquer ambiente de desenvolvimento</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Você precisará de três informações apenas:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><strong>Access Key e Secret Key</strong> - você o obtém na página pública do S3 Ninja - <a href="http://localhost:9444/ui" class="rank-math-link">http://localhost:9444/ui</a> . Boa notícia: estas informações não mudam, então você pode aplicá-las em sua configuração de dev/teste. (não falei que não era seguro o S3 Ninja???)</li><li><strong>Endpoint de requisições</strong> - a AWS fornece endpoints padrão de requisições para o S3, mas também a possibilidade de você poder usar endpoints alternativos justamente pra situações muito específicas como esta. O endpoint do S3 Ninja contra o qual todas as requisições deverão ser feitas é o <a href="http://localhost:9444/s3" class="rank-math-link">http://localhost:9444/s3</a> </li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>O S3 Ninja vai ignorar qualquer região da AWS e também não vai aplicar ACLs tal como o serviço original, leve isto em consideração. Consulte sua ferramenta de desenvolvimento para que possa realizar esta integração.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Exemplo em Java</h3>
<!-- /wp:heading -->

<!-- wp:image {"align":"center","id":728,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="http://beta.itexto.com.br/wp-content/uploads/2015/03/java_logo-300x2381-1.png" alt="" class="wp-image-728"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Se você não programa em Java, <strong>leia mesmo assim</strong> pois há um detalhe importante ali.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Tudo o que você precisará fazer é customizar o cliente S3 provido pelo SDK provido pela AWS. Em nosso exemplo iremos usar a versão 2.11.2 desta biblioteca. Leve em consideração que esperamos que você já saiba usar esta biblioteca. Vamos expor aqui apenas como usar junto com o S3 Ninja.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Veja o exemplo a seguir escrito em Java no qual instanciamos o cliente S3 usando o SDK da AWS.</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;


// observe o exemplo com atenção. Se houver a configuração
// do endpoint, é por que estamos usando o S3 Ninja
// claro: pode haver variações, isto é apenas
// um exemplo!

public S3Client getS3Client() {
  String url = "http://localhost:9444/s3");
  S3Client result = S3Client.builder()
               .region(qualquerUma)
               .credentialsProvider(oQueSeAplica)
                // A mágica acontece aqui
               .endpointOverride(URI.create(endpoint))
            // O detalhe da maldade
             serviceConfiguration(
              S3Configuration.builder()
               .chunkedEncodingEnabled(false).build()
               )
               .build();
  return result;
}

</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>O primeiro detalhe é o uso do endpoint customizado. <strong>A maldade está no detalhe:</strong> a opção "Chunked Encoding". Fizemos isto por que em versões mais antigas do S3 Ninja esta funcionalidade não estava implementada. Sua função consiste em validar o conteúdo recebido pelo S3. </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>As Deliciosas Receitas da itexto</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"center","id":1584,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="http://beta.itexto.com.br/wp-content/uploads/2020/04/receitas_itexto_block.png" alt="" class="wp-image-1584"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Esta é mais uma receita do nosso livro que estamos tornando pública. O objetivo é te dar um pontapé inicial para resolver problemas comuns em seu dia a dia no desenvolvimento de software. Claro que há outras alternativas e modos de se resolver o mesmo problema (até melhores!). Caso tenha alguma sugestão, por favor, compartilhe conosco!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Quer escrever seu próprio livro de receitas? Mostramos para você como criamos o nosso e lhe trazemos diversas dicas neste post para te ajudar neste processo. Leia mais <a href="https://www.itexto.com.br/site/receitas-da-itexto/" class="rank-math-link">clicando aqui</a>!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Tomara que esta receita torne seu dia a dia um pouco melhor. Até a próxima!</p>
<!-- /wp:paragraph -->