<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Figueirego Blog – Automação</title><link>https://figueirego.com/pt/blog/tags/automa%C3%A7%C3%A3o/</link><description>Publicações recentes em Automação no Figueirego Blog.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Mon, 19 Oct 2026 04:33:15 -0300</lastBuildDate><atom:link href="https://figueirego.com/pt/blog/tags/automa%C3%A7%C3%A3o/index.xml" rel="self" type="application/rss+xml"/><item><title>Construindo meu blog, parte 4: imagens no S3 pelo Finder</title><link>https://figueirego.com/pt/blog/posts/construindo-o-blog-04-imagens/</link><pubDate>Mon, 19 Oct 2026 04:15:50 -0300</pubDate><guid>https://figueirego.com/pt/blog/posts/construindo-o-blog-04-imagens/</guid><description>&lt;p&gt;&lt;img src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-images/imagens.webp" alt="Fotografias organizadas sobre uma mesa, gavetas de arquivo e um computador com prévias de imagens."&gt;&lt;/p&gt;&lt;p&gt;Selecionar uma imagem, usar o botão direito e receber uma URL pronta para o artigo. Era esse o tipo de facilidade que eu queria trazer para a rotina do blog. A automação da AWS foi a parte mais trabalhosa depois do design.&lt;/p&gt;
&lt;p&gt;O caminho começou com um auxiliar de upload e chegou a uma Ação Rápida no Finder. O caso feliz era simples de descrever. O trabalho apareceu nas perguntas seguintes: o que acontece quando a sessão expira, quando eu desisto do login ou quando o envio falha?&lt;/p&gt;
&lt;h2 data-hextra-search-id="páginas-na-hostinger-imagens-no-s3"&gt;Páginas na Hostinger, imagens no S3&lt;span class="hx:absolute hx:-mt-20" id="páginas-na-hostinger-imagens-no-s3"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O S3 armazena objetos: neste caso, os arquivos das imagens. As páginas continuam na Hostinger. O Markdown guarda a URL pública do arquivo e o navegador busca a imagem nesse endereço.&lt;/p&gt;
&lt;p&gt;Isso separa o envio da imagem do build do site. Colocar um arquivo no repositório não executa um upload para a AWS. Também existem assets locais que acompanham o build; o fluxo das novas imagens editoriais usa o S3.&lt;/p&gt;
&lt;p&gt;Uma URL de imagem publicada precisa continuar funcionando quando minha sessão termina. Por isso, o endereço usado no artigo não é um link assinado temporário. O prefixo das imagens tem leitura pública configurada, enquanto a escrita exige autenticação. O script de envio não transforma qualquer bucket privado em público.&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-chamo-de-versões-das-imagens"&gt;O que chamo de versões das imagens&lt;span class="hx:absolute hx:-mt-20" id="o-que-chamo-de-versões-das-imagens"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Cada envio recebe um nome novo, com ano, mês, nome normalizado e um identificador. Um caminho ilustrativo seria:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/2026/10/minha-capa-identificador-unico.webp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Se corrigir uma capa, envio outro arquivo e atualizo a referência no artigo. A imagem anterior continua disponível até ser removida. Isso ajuda a evitar que uma URL com cache longo passe a representar outro arquivo sem controle.&lt;/p&gt;
&lt;p&gt;Esse mecanismo é diferente do &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html" target="_blank" rel="noopener"&gt;S3 Versioning&lt;/a&gt;, que mantém versões de um mesmo objeto dentro do bucket. Aqui estou descrevendo novas chaves e novas URLs. Não basta ter dois arquivos para afirmar que o recurso nativo de versionamento está ativado.&lt;/p&gt;
&lt;p&gt;O histórico do Git registra as alterações na referência do artigo. Ele não é, por si só, um backup dos arquivos externos. Preservar e recuperar as imagens exige cuidar também do armazenamento delas.&lt;/p&gt;
&lt;h2 data-hextra-search-id="um-usuário-dedicado-ao-envio"&gt;Um usuário dedicado ao envio&lt;span class="hx:absolute hx:-mt-20" id="um-usuário-dedicado-ao-envio"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;O atalho usa um perfil da AWS CLI com credenciais temporárias de um usuário dedicado. Não depende da sessão root e não guarda uma chave permanente dentro do projeto.&lt;/p&gt;
&lt;p&gt;A conta e as permissões são preparadas antes. O auxiliar usa esse destino existente; não provisiona um ambiente AWS inteiro. O &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html" target="_blank" rel="noopener"&gt;login local pelo navegador da AWS CLI&lt;/a&gt; permite renovar a autenticação sem colocar senha ou código no artigo, no script ou em uma conversa.&lt;/p&gt;
&lt;p&gt;No projeto configurado, a instalação da Ação Rápida parte da raiz:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 blog/scripts/install-finder-upload.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Esse comando pertence ao repositório privado e requer o ambiente descrito acima. Ele não é um instalador público universal para qualquer conta AWS. Para reproduzir a ideia, é preciso adaptar destino, perfil e permissões ao próprio ambiente.&lt;/p&gt;
&lt;h2 data-hextra-search-id="a-rotina-no-finder"&gt;A rotina no Finder&lt;span class="hx:absolute hx:-mt-20" id="a-rotina-no-finder"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Com a ação instalada, seleciono a imagem e uso &lt;strong&gt;Ações Rápidas → Enviar imagem ao S3 — Figueirego&lt;/strong&gt;. Após o envio, a ação copia a URL e apresenta a notificação de conclusão. Não preciso abrir o Terminal para a rotina normal.&lt;/p&gt;
&lt;p&gt;Se a sessão expirou, o atalho abre a autenticação no navegador e aguarda a conclusão. Depois do login autorizado, continua o envio. Foi importante testar o caminho completo pelo Finder: executar o auxiliar no Terminal não demonstraria, sozinho, que o aviso aparecia pela ação do macOS.&lt;/p&gt;
&lt;p&gt;Também conferimos a URL pública e a imagem recebida. Uma mensagem de conclusão ajuda, mas não substitui verificar se o arquivo certo está acessível fora da sessão AWS.&lt;/p&gt;
&lt;figure class="reader-figure reader-figure-wide"&gt;
&lt;div class="post-cover cover-reader"&gt;
&lt;img class="cover-image" src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-images/finder-acao-real.webp" alt="Menu de Ações Rápidas do Finder com Enviar imagem ao S3 — Figueirego." width="1840" height="872" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;A ação instalada no Finder, acessível pelo botão direito sobre a imagem. O menu foi aberto para esta captura, sem executar outro upload.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-images/finder-acao-real.webp" target="_blank" rel="noopener"&gt;Ver captura em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="cancelar-também-faz-parte-da-interface"&gt;Cancelar também faz parte da interface&lt;span class="hx:absolute hx:-mt-20" id="cancelar-também-faz-parte-da-interface"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Esperar cinco minutos para descobrir que um login foi abandonado era ruim. A espera ganhou uma janela com &lt;strong&gt;Cancelar envio&lt;/strong&gt;, para encerrar aquela tentativa de forma explícita.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situação&lt;/th&gt;
&lt;th&gt;Comportamento esperado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sessão válida&lt;/td&gt;
&lt;td&gt;Enviar, copiar a URL e avisar a conclusão.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessão expirada&lt;/td&gt;
&lt;td&gt;Abrir o login e continuar depois de autenticar.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cancelamento enquanto aguarda login&lt;/td&gt;
&lt;td&gt;Avisar, não enviar a imagem e preservar o conteúdo copiado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nova tentativa após cancelar&lt;/td&gt;
&lt;td&gt;Permitir iniciar o fluxo novamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fechar apenas a aba do navegador não equivale a apertar o botão de cancelamento. E esse botão cancela a espera pela autenticação; ele não promete interromper um upload que já começou.&lt;/p&gt;
&lt;p&gt;Testamos a espera primeiro com uma AWS simulada e depois com login real. As duas verificações respondem a perguntas diferentes: a simulação ajuda a controlar o cenário; o teste real confirma a integração que será usada.&lt;/p&gt;
&lt;figure class="reader-figure reader-figure-wide"&gt;
&lt;div class="post-cover cover-reader"&gt;
&lt;img class="cover-image" src="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-images/finder-pt.webp" alt="Da imagem no Finder à URL copiada. O cancelamento durante o login encerra o fluxo antes do envio." width="1200" height="1000" loading="lazy" decoding="async"&gt;&lt;/div&gt;&lt;figcaption&gt;Da imagem no Finder à URL copiada. O cancelamento durante o login encerra o fluxo antes do envio.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://figueirego-blog-images.s3.us-east-1.amazonaws.com/images/2026/10/building-blog-images/finder-pt.webp" target="_blank" rel="noopener"&gt;Abrir diagrama em tamanho original&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-hextra-search-id="o-que-ainda-precisa-de-cuidado"&gt;O que ainda precisa de cuidado&lt;span class="hx:absolute hx:-mt-20" id="o-que-ainda-precisa-de-cuidado"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Não removo automaticamente uma imagem antiga só porque enviei outra. Ela pode continuar referenciada por um rascunho, por outro texto ou por um feed já recebido. A limpeza precisa considerar essas referências.&lt;/p&gt;
&lt;p&gt;Se o upload concluir, mas a cópia para a área de transferência falhar, isso também não desfaz o objeto enviado. É preciso distinguir falha de envio de falha na última etapa da conveniência, para não repetir uploads sem necessidade.&lt;/p&gt;
&lt;p&gt;A automação tornou a rotina mais curta. O aprendizado foi dedicar atenção também aos caminhos de desistência e recuperação: uma ferramenta simples de usar precisa explicar quando terminou, quando falhou e o que aconteceu com o arquivo.&lt;/p&gt;
&lt;nav id="series-navigation" class="series-navigation" aria-label="Construindo meu blog"&gt;
&lt;div class="series-heading"&gt;
&lt;h2&gt;Construindo meu blog&lt;/h2&gt;
&lt;p&gt;Explore as 5 partes da série.&lt;/p&gt;
&lt;/div&gt;
&lt;ol class="series-chapters" role="list"&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-01-arquitetura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;01&lt;/span&gt;
&lt;span class="series-title"&gt;Ideia e arquitetura&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-02-leitura/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;02&lt;/span&gt;
&lt;span class="series-title"&gt;Design e leitura&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-03-publicacao/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;03&lt;/span&gt;
&lt;span class="series-title"&gt;Publicação&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span class="series-chapter" aria-current="page"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;04&lt;/span&gt;
&lt;span class="series-title"&gt;Imagens e automação&lt;/span&gt;
&lt;span class="series-current"&gt;Você está aqui&lt;/span&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class="series-chapter" href="https://figueirego.com/pt/blog/posts/construindo-o-blog-05-seo-rss/"&gt;
&lt;span class="series-number" aria-hidden="true"&gt;05&lt;/span&gt;
&lt;span class="series-title"&gt;SEO e RSS&lt;/span&gt;
&lt;svg width="20" height="20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"/&gt;&lt;/svg&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/nav&gt;</description></item></channel></rss>