<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cloud on (dev) Lucas Polo</title><link>https://blog.lucaspolo.dev/tags/cloud/</link><description>Recent content in Cloud on (dev) Lucas Polo</description><image><title>(dev) Lucas Polo</title><url>https://blog.lucaspolo.dev/images/og-default.png</url><link>https://blog.lucaspolo.dev/images/og-default.png</link></image><generator>Hugo -- 0.157.0</generator><language>pt-br</language><lastBuildDate>Mon, 08 Nov 2021 11:30:00 +0000</lastBuildDate><atom:link href="https://blog.lucaspolo.dev/tags/cloud/index.xml" rel="self" type="application/rss+xml"/><item><title>Enviando SMS via Amazon Web Services SNS com Python</title><link>https://blog.lucaspolo.dev/posts/enviando-sms-via-amazon-web-services-sns-com-python/</link><pubDate>Mon, 08 Nov 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/enviando-sms-via-amazon-web-services-sns-com-python/</guid><description>Como enviar SMS com o Amazon SNS em Python usando a biblioteca boto3, do usuário com permissão ao script de envio.</description></item><item><title>Fazendo upload de arquivos para o Google Cloud Storage com Python</title><link>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python-2/</link><pubDate>Mon, 11 Oct 2021 11:30:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python-2/</guid><description>&lt;p&gt;Algum tempo atrás precisei aprender a fazer upload de arquivos para o Google Cloud Storage. Uma das coisas que eu gosto de fazer para me ajudar aprender a fazer algo é criar um scriptzinho com o conceito do que quero, sem aplicar em grandes projetos, evitando assim grandes complexidades.&lt;/p&gt;
&lt;p&gt;Assim na época eu criei este script simples que faz o upload do arquivo em um bucket do GCS. A primeira coisa que você precisa fazer é ter instalada a biblioteca, para isso temos o bom e velho pip:&lt;/p&gt;</description></item><item><title>Fazendo upload de arquivos para o Google Cloud Storage com Python (versão de 2020)</title><link>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python/</link><pubDate>Fri, 10 Jan 2020 15:52:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/fazendo-upload-de-arquivos-para-o-google-cloud-storage-com-python/</guid><description>&lt;p&gt;O processo é bem simples, porém é necessário antes configurar algumas coisas no Google Cloud e gerar as credenciais necessárias, para este processo pode seguir &lt;a href="https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-python"&gt;este tutorial.&lt;/a&gt; Lembre-se também de criar uma variável de ambiente com o nome &lt;strong&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/strong&gt; apontando para o caminho do json, no Linux basta fazer:&lt;/p&gt;
&lt;p&gt;export GOOGLE_APPLICATION_CREDENTIALS=/caminho/para/arquivo.json&lt;/p&gt;
&lt;p&gt;Depois disso é possível executar o código abaixo (é claro, o bucket e o  arquivo indicado deve existir):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; datetime &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; timezone, datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; typing &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; BinaryIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;from&lt;/span&gt; google.cloud &lt;span style="color:#ff79c6"&gt;import&lt;/span&gt; storage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;upload_file&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data: BinaryIO,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket: &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_path: &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; link_lifetime: &lt;span style="color:#8be9fd;font-style:italic"&gt;int&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#ff79c6"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; Função que realiza o upload do arquivo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f1fa8c"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; storage_client &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; storage&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;Client()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; storage_client&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;bucket(bucket)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blob &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; bucket&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;blob(file_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blob&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;upload_from_file(data) &lt;span style="color:#6272a4"&gt;# Faz o upload do arquivo binário e cria um objeto associado ao arquivo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lifetime &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;int&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; datetime&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;now(tz&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;timezone&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;utc)&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;timestamp()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#ff79c6"&gt;+&lt;/span&gt; link_lifetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;# Gera um link para o arquivo com tempo de expiração&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; blob&lt;span style="color:#ff79c6"&gt;.&lt;/span&gt;generate_signed_url(lifetime)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;def&lt;/span&gt; &lt;span style="color:#50fa7b"&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;meu-pequeno-bucket&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# Bucket name in GCS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_name &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;arquivo_legal.pdf&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# Filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;with&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;open&lt;/span&gt;(file_name, &lt;span style="color:#f1fa8c"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; upload_file(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;f,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;bucket,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_path&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;file_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;print&lt;/span&gt;(&lt;span style="color:#f1fa8c"&gt;f&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;URL for file: &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;{&lt;/span&gt;url&lt;span style="color:#f1fa8c"&gt;}&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;__name__&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; main()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Utilizando Celery junto com o SQS</title><link>https://blog.lucaspolo.dev/posts/utilzando-celery-junto-com-o-sqs/</link><pubDate>Sun, 17 Mar 2019 23:36:00 +0000</pubDate><guid>https://blog.lucaspolo.dev/posts/utilzando-celery-junto-com-o-sqs/</guid><description>&lt;p&gt;Uma das formas de lidar com processamento assíncrono no Python (e diversas outras linguagens) sem a necessidade de usar threads e afins é utilizando filas e tasks (que são aplicações que rodam conforme demanda, em um processamento similar a batches).&lt;/p&gt;
&lt;p&gt;Para isso o Python dispõe de uma biblioteca chamada Celery, que de uma maneira bem simples permite realizar o processamento assíncrono. Explicando de uma maneira simples, ao invocar uma função, ao invés de executar seu código, o Celery pega os parâmetros e mais algumas meta-informações da chamada e coloca numa fila, enquanto isso, em outro lugar (processo, computador ou continente), o Celery captura as mensagens desta fila e dispara as tasks. Aqui está uma implementação básica de uma task que soma dois valores:&lt;/p&gt;</description></item></channel></rss>