<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Victor Costa</title>
    <description>The latest articles on Forem by Victor Costa (@victorcosta).</description>
    <link>https://forem.com/victorcosta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F105353%2F3403402f-9807-445a-9401-b085df8c221a.png</url>
      <title>Forem: Victor Costa</title>
      <link>https://forem.com/victorcosta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/victorcosta"/>
    <language>en</language>
    <item>
      <title>Grafana 'no pg_hba.conf entry for host' error</title>
      <dc:creator>Victor Costa</dc:creator>
      <pubDate>Fri, 03 Oct 2025 17:17:38 +0000</pubDate>
      <link>https://forem.com/victorcosta/grafana-no-pghbaconf-entry-for-host-error-2836</link>
      <guid>https://forem.com/victorcosta/grafana-no-pghbaconf-entry-for-host-error-2836</guid>
      <description>&lt;p&gt;When deploying grafana with an aws rds postgres as backend db I came across the following error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Error: ✗ pq: no pg_hba.conf entry &lt;span class="k"&gt;for &lt;/span&gt;host &lt;span class="s2"&gt;"&amp;lt;my-custom.grafana.pod.ip&amp;gt;"&lt;/span&gt;, user &lt;span class="s2"&gt;"&amp;lt;some-user&amp;gt;"&lt;/span&gt;, database &lt;span class="s2"&gt;"&amp;lt;my-custom-db-name&amp;gt;"&lt;/span&gt;, no encryption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Turns out the rds was deployed with a default parameter group, which had &lt;code&gt;rds.force_ssl&lt;/code&gt; set to &lt;code&gt;1&lt;/code&gt;. For my scenario having it turned off was fine. The solution was to re-deploy (a reboot also works) the rds with a customized parameter group based off of the default one with &lt;code&gt;rds.force_ssl&lt;/code&gt; set to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>help</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Python logger</title>
      <dc:creator>Victor Costa</dc:creator>
      <pubDate>Sun, 04 Aug 2024 15:36:18 +0000</pubDate>
      <link>https://forem.com/victorcosta/python-logger-924</link>
      <guid>https://forem.com/victorcosta/python-logger-924</guid>
      <description>&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;There are too many posts defining how to configure python logs and some are too noise others are incomplete.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An example with json logger at the end&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So here’s my version of it that just works and suits my purposes well&lt;/p&gt;

&lt;h3&gt;
  
  
  Example with plain text output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Change this level according to your needs
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INFO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;propagate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StreamHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Default level for root logger is NOTSET which means all messages will be logged
# I prefer having this as is to avoid two places controlling what gets to output
# Leaving this to logger.setLevel to define what should be printed is more flexible undless devs are not allowed to control this (for log volume purposes, for example)
# https://docs.python.org/3/library/logging.config.html
# stdout.setLevel(logging.DEBUG)
&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%(name)s: %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(process)d &amp;gt;&amp;gt;&amp;gt; %(message)s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# YOUR CODE BELOW
&lt;/span&gt;
&lt;span class="c1"&gt;# Database connection
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;psycopg2.extras&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RealDictCursor&lt;/span&gt;

&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connecting to database &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rds_host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; on port &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rds_port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; as user &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rds_user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to database &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rds_database&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Debug message when creating connection to database&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rds_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rds_port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rds_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rds_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rds_database&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cursor_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RealDictCursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample output for log level set as INFO :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;__main__: 2024-06-25 06:15:12,171 | INFO | main.py:39 | 61869 &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; Connecting to database &lt;span class="s1"&gt;'mydbinstance.cjzjxjzjzjzj.us-west-2.rds.amazonaws.com'&lt;/span&gt; on port &lt;span class="s1"&gt;'5432'&lt;/span&gt; as user &lt;span class="s1"&gt;'postgres'&lt;/span&gt; to database &lt;span class="s1"&gt;'postgres'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample output for log level set as DEBUG :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;__main__: 2024-06-25 06:17:38,664 | INFO | main.py:39 | 62437 &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; Connecting to database &lt;span class="s1"&gt;'mydbinstance.cjzjxjzjzjzj.us-west-2.rds.amazonaws.com'&lt;/span&gt; on port &lt;span class="s1"&gt;'5432'&lt;/span&gt; as user &lt;span class="s1"&gt;'postgres'&lt;/span&gt; to database &lt;span class="s1"&gt;'postgres'&lt;/span&gt;
__main__: 2024-06-25 06:17:38,664 | DEBUG | main.py:42 | 62437 &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; Debug message when creating connection to database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example with json output
&lt;/h3&gt;

&lt;p&gt;Using &lt;a href="https://pypi.org/project/python-json-logger/" rel="noopener noreferrer"&gt;python-json-logger&lt;/a&gt; dependency&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Change this level according to your needs
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INFO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;propagate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;log_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StreamHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Default level for root logger is NOTSET which means all messages will be logged
# https://docs.python.org/3/library/logging.config.html
# stdout.setLevel(logging.DEBUG)
&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%(name)s: %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(process)d &amp;gt;&amp;gt;&amp;gt; %(message)s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonlogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;JsonFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;log_handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"asctime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-07-01 15:28:07,119"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"levelname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INFO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lineno"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"process"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60945&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Connecting to database 'mydbinstance.cjzjxjzjzjzj.us-west-2.rds.amazonaws.com' on port '5432' as user 'postgres' to database 'postgres'"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"asctime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-07-01 15:28:07,119"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"levelname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INFO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lineno"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"process"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60945&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Starting execution..."&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Configuring StatsD</title>
      <dc:creator>Victor Costa</dc:creator>
      <pubDate>Sat, 22 Jun 2019 14:46:34 +0000</pubDate>
      <link>https://forem.com/victorcosta/configuring-statsd-20fk</link>
      <guid>https://forem.com/victorcosta/configuring-statsd-20fk</guid>
      <description>&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;p&gt;Learn how to emit metrics with statsD.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is StatsD
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/statsd/statsd" rel="noopener noreferrer"&gt;Statsd's&lt;/a&gt; description on its git repo is clear enough so let's just use it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A network daemon that runs on the Node.js platform and listens for statistics, like counters and timers, sent over UDP or TCP and sends aggregates to one or more pluggable backend services (e.g., Graphite).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  When to use and when not to use StatsD
&lt;/h2&gt;

&lt;p&gt;You should not expect metrics generated with statsD to be 100% precise and extract business metrics from it (e.g: how many clients bought a product, or how many users registered for your newsletter) since data is sent over &lt;code&gt;UDP&lt;/code&gt; (more on that below). Use statsD metrics to identify abnormalities in your services (e.g.: too many error statuses; methods taking too long to complete; etc). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Packages sent over User Datagram Protocol (UDP) do not have guaranteed delivery. More on that this &lt;a href="https://en.wikipedia.org/wiki/User_Datagram_Protocol" rel="noopener noreferrer"&gt;wikipedia page&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Our current scenario and goal with statsd
&lt;/h2&gt;

&lt;p&gt;Suppose we have an application which is accessed for not so many users and has an average of 10 login operations per minute. We will have a CloudWatch Alarm to notify us in case there is more than 30 unsuccessful login operations within a minute so we can find out what is going on. The application will emit events with statsD to CloudWatch using CloudWatch Agent.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run StatsD locally
&lt;/h2&gt;

&lt;p&gt;First make sure you have docker installed and running. Then run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;--name&lt;/span&gt; graphite&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 81:81&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 2003-2004:2003-2004&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 2023-2024:2023-2024&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 8125:8125/udp&lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 8126:8126&lt;span class="se"&gt;\&lt;/span&gt;
 hopsoft/graphite-statsd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can already navigate to &lt;a href="http://localhost:81" rel="noopener noreferrer"&gt;http://localhost:81&lt;/a&gt; and see an empty graph from &lt;a href="https://graphiteapp.org" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Our application
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/augustovictor/loud-watch-agent-statsd-collectd" rel="noopener noreferrer"&gt;My application for this demo&lt;/a&gt; (Instructions on how to run that can be found in the &lt;code&gt;README.MD&lt;/code&gt; of the repository.&lt;/p&gt;

&lt;p&gt;Here is the part of the code that matters. For simplicity I kept everything in the same file:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;h2&gt;
  
  
  Generate some metrics
&lt;/h2&gt;

&lt;p&gt;Make some successful requests to our api:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..30&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;do
    &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; localhost:8080/v1/users/login &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"username": "firstuser", "password": "123"}'&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now some requests with wrong credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..8&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;do
    &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; localhost:8080/v1/users/login &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"username": "firstuser", "password": "wrong_passwd"}'&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check graphite graph for the requests by navigating &lt;a href="http://localhost:81" rel="noopener noreferrer"&gt;http://localhost:81&lt;/a&gt; and open the directories in the left hand side: &lt;code&gt;Metrics&lt;/code&gt; &amp;gt; &lt;code&gt;stats_counts&lt;/code&gt; &amp;gt; &lt;code&gt;my&lt;/code&gt; &amp;gt; &lt;code&gt;custom&lt;/code&gt; &amp;gt; &lt;code&gt;app&lt;/code&gt; &amp;gt; &lt;code&gt;users&lt;/code&gt; &amp;gt; &lt;code&gt;login&lt;/code&gt; and click the &lt;code&gt;success&lt;/code&gt; and &lt;code&gt;error&lt;/code&gt; metrics.&lt;/p&gt;

&lt;p&gt;Change the range of time of the displayed data in the empty Graphite Composite panel by clicking the clock icon and set its &lt;code&gt;Recent Time Range&lt;/code&gt; to &lt;code&gt;10 min&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zftmt3ais33zikd7r10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zftmt3ais33zikd7r10.png" width="367" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your metrics
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yb94kde74xdespzce9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yb94kde74xdespzce9l.png" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>statsd</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Dynamic scaling VS Fleet management scaling</title>
      <dc:creator>Victor Costa</dc:creator>
      <pubDate>Wed, 05 Jun 2019 16:27:42 +0000</pubDate>
      <link>https://forem.com/victorcosta/dynamic-scaling-vs-fleet-management-scaling-2e1l</link>
      <guid>https://forem.com/victorcosta/dynamic-scaling-vs-fleet-management-scaling-2e1l</guid>
      <description>&lt;p&gt;Aws Auto scaling divides into 2 categories: Fleet Management and Dynamic Scaling.&lt;/p&gt;




&lt;h3&gt;
  
  
  Fleet management
&lt;/h3&gt;

&lt;p&gt;Used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replacing unhealthy instances;&lt;/li&gt;
&lt;li&gt;Distributing instances among availability-zones to maximize resilience; E.g: You're running instances in us-east, so auto-scaling can provision instances in the following AZs: us-east-1a, us-east-1b, us-east-1c, us-east-1d, and us-east-1e;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Dynamic scaling
&lt;/h3&gt;

&lt;p&gt;Used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scaling based on cloudWatch alarm metrics or a metric type (more on that later) when a threshold is met or different measures should be taken depending on the breach of a cloudWatch alarm threshold.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Types of Dynamic scaling
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Simple scaling: Scales based on a single cloudwatch alarm metric, and apply the measures you define;&lt;/li&gt;
&lt;li&gt;Step scaling: Scales based on different levels of cloud watch alarm metrics, and apply the actions you define;&lt;/li&gt;
&lt;li&gt;Target tracking scaling: Scales based on a metric type, but delegates the action to be taken to AWS;&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Which one to use?
&lt;/h4&gt;

&lt;p&gt;That's not the right question to ask. Actually you'll be using &lt;strong&gt;Fleet Management&lt;/strong&gt; out-of-the-box, with the possibility of configuring &lt;strong&gt;Dynamic Scaling&lt;/strong&gt; to take some custom actions;&lt;/p&gt;




&lt;h3&gt;
  
  
  Let's go through some exemples:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;To get to the auto-scaling configuration you should go to the &lt;code&gt;EC2&lt;/code&gt; dashboard and find &lt;code&gt;Auto Scaling Groups&lt;/code&gt; in the sidebar. Select one auto-scaling group and find in the tabs below the auto-scaling groups listing the one called &lt;code&gt;Scaling Policies&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Fleet management&lt;/strong&gt;: An application running on an EC2 instance stops responding health check, then auto-scaling stops routing traffic to it and moves that instance to quarantine to be analyzed, and spins up another instance one to replace it;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic scaling - Simple scaling&lt;/strong&gt;: You have a cloudWatch alarm that monitors EC2 instances for cpu utilization and fires an alarm whenever it goes beyond 80% for 300 seconds (5 min). Your &lt;strong&gt;simple scaling policy&lt;/strong&gt; defines the action to be taken is to spin up 1 more instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1ie82orwpqbp7rcpvd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1ie82orwpqbp7rcpvd0.png" alt="Simple scaling policy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic scaling - Step scaling&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;You have a cloudWatch alarm that monitors EC2 instances for cpu utilization and fires an alarm whenever it goes beyond 50% for 300 seconds (5 min). Your &lt;strong&gt;step scaling policy&lt;/strong&gt; defines the action to be taken is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spin up 1 more instance when cpu utilization is &amp;lt;= 50% and &amp;lt; 60%;&lt;/li&gt;
&lt;li&gt;Spin up 3 more instances when cpu utilization is &amp;lt;= 60% and &amp;lt; 70%;&lt;/li&gt;
&lt;li&gt;Spin up 5 more instances when cpu utilization is &amp;lt;= 70% and &amp;lt; infinity;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep in mind that these instances will add up, so if your cpu utilization goes progressively until 70% you'll end up having 9 EC2 instances;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3ppm7m6yoyad8o4ttx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3ppm7m6yoyad8o4ttx2.png" alt="Step scaling policy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target tracking scaling&lt;/strong&gt;:&lt;br&gt;
You want to keep the cpu utilization of your fleet at 50%, but let AWS handle how many instances should be launched or terminated in order to keep that metric.&lt;/p&gt;

&lt;p&gt;Good to know: Aws runs algorithms and defines how to best take actions to scale out/in your EC2 instances based on the receiving demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metric types&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application Load Balancer Request Count Per Target;&lt;/li&gt;
&lt;li&gt;Average CPU Utilization;&lt;/li&gt;
&lt;li&gt;Average Network In (Bytes);&lt;/li&gt;
&lt;li&gt;Average Network Out (Bytes);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd78hnspmw52yzq9qs8je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd78hnspmw52yzq9qs8je.png" alt="Target tracking scaling policy"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let me know if it was all clear in the comments below or with a reaction.&lt;/p&gt;




&lt;h3&gt;
  
  
  References:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/solutions/server-fleet-management-at-scale/" rel="noopener noreferrer"&gt;https://aws.amazon.com/solutions/server-fleet-management-at-scale/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/compute/fleet-management-made-easy-with-auto-scaling" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/compute/fleet-management-made-easy-with-auto-scaling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scale-based-on-demand.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scale-based-on-demand.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=WUUbOQyrnJU" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=WUUbOQyrnJU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=srofVz6xvkE" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=srofVz6xvkE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>autoscaling</category>
    </item>
    <item>
      <title>Local AWS environment with LocalStack</title>
      <dc:creator>Victor Costa</dc:creator>
      <pubDate>Sun, 19 May 2019 12:59:05 +0000</pubDate>
      <link>https://forem.com/victorcosta/local-aws-environment-with-localstack-32bm</link>
      <guid>https://forem.com/victorcosta/local-aws-environment-with-localstack-32bm</guid>
      <description>&lt;h1&gt;
  
  
  Useful links
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/localstack/localstack" rel="noopener noreferrer"&gt;LocalStack git repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/reference/#available-services" rel="noopener noreferrer"&gt;Aws available services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/aws-cli.pdf" rel="noopener noreferrer"&gt;Aws docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  LocalStack
&lt;/h1&gt;

&lt;p&gt;The definition used in their git repo is clear enough so let's just use it here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;LocalStack provides an easy-to-use test/mocking framework for developing Cloud applications&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Setup
&lt;/h1&gt;

&lt;p&gt;This tutorial uses a docker-image in order to setup Localstack, so you should have Docker and Docker-compose installed to move forward here.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;docker-compose.localstack.yml&lt;/code&gt; at the root of the project with the following content (which can be found &lt;a href="https://github.com/localstack/localstack#running-in-docker" rel="noopener noreferrer"&gt;here&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;version: '2.1'
services:
...
  localstack:
    image: localstack/localstack
    ports:
      - "4567-4584:4567-4584"
      - "${PORT_WEB_UI-8080}:${PORT_WEB_UI-8080}"
    environment:
      - SERVICES=${SERVICES- }
      - DEBUG=${DEBUG- }
      - DATA_DIR=${DATA_DIR- }
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
      - KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- }
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spin up a Localstack docker container with &lt;code&gt;s3&lt;/code&gt; and &lt;code&gt;dynamodb&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For MacOS users (in case your $TMPDIR contains a symbolic link that cannot be mounted by Docker):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TMPDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/private&lt;span class="nv"&gt;$TMPDIR&lt;/span&gt; &lt;span class="nv"&gt;PORT_WEB_UI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9000 &lt;span class="nv"&gt;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;s3,dynamodb docker-compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.localstack.yml up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PORT_WEB_UI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9000 &lt;span class="nv"&gt;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;s3,dynamodb docker-compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.localstack.yml up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ℹ️ Quick ref:&lt;br&gt;
&lt;strong&gt;-f&lt;/strong&gt; - Specify an alternate compose file (default: docker-compose.yml)&lt;br&gt;
&lt;strong&gt;-d&lt;/strong&gt; - Run as daemon process (in background)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The names of the services to be used must follow the official aws services naming convention which can be found in &lt;a href="https://docs.aws.amazon.com/cli/latest/reference/#available-services" rel="noopener noreferrer"&gt;aws available services&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Useful &lt;code&gt;docker&lt;/code&gt; commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker ps&lt;/code&gt;: List running containers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker logs &amp;lt;container-name&amp;gt;&lt;/code&gt;: Output logs container&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Api calls to LocalStack
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt; to make sure your local AWS is working. You're expected to see an empty dashboard.&lt;/p&gt;

&lt;p&gt;Lets make some api calls to our local aws to check if we can start interacting with it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔎 Here is a complete user guide on &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/aws-cli.pdf" rel="noopener noreferrer"&gt;aws-cli&lt;/a&gt; (Go to S3 section)&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a bucket&lt;/span&gt;
aws-vault &lt;span class="nb"&gt;exec &lt;/span&gt;scd-stg &lt;span class="nt"&gt;--&lt;/span&gt; aws s3 mb s3://my-custom-bucket &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt; http://localhost:4572
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output or similar: &lt;code&gt;make_bucket: my-custom-bucket&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List buckets&lt;/span&gt;
aws-vault &lt;span class="nb"&gt;exec &lt;/span&gt;scd-stg &lt;span class="nt"&gt;--&lt;/span&gt; aws s3 &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt; http://localhost:4572
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output or similar: &lt;code&gt;2006-02-03 14:45:09 my-custom-bucket&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Let me know if you had any issues in the comments below, or leave a reaction if everything worked as expected.&lt;/p&gt;

</description>
      <category>localstack</category>
      <category>aws</category>
    </item>
    <item>
      <title>How to setup a spring-boot project</title>
      <dc:creator>Victor Costa</dc:creator>
      <pubDate>Sun, 19 May 2019 12:44:59 +0000</pubDate>
      <link>https://forem.com/victorcosta/how-to-setup-a-spring-boot-project-341</link>
      <guid>https://forem.com/victorcosta/how-to-setup-a-spring-boot-project-341</guid>
      <description>&lt;h1&gt;
  
  
  Setup
&lt;/h1&gt;

&lt;p&gt;To download SpringBoot go to &lt;a href="https://start.spring.io"&gt;start.spring.io&lt;/a&gt; and make sure your config is as follows (remember to replace the &lt;code&gt;Group&lt;/code&gt; description, and to add the &lt;code&gt;Web&lt;/code&gt; dependency):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UdL_SDkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n1k7xudoam5joiafzpnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UdL_SDkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n1k7xudoam5joiafzpnn.png" alt="spring boot config"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  With &lt;a href="https://www.jetbrains.com/idea/download"&gt;Intellij&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;File &amp;gt; New &amp;gt; Project from existing sources&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Gradle&lt;/code&gt; option (since we've chose it to be our build and dependencies manager)&lt;/li&gt;
&lt;li&gt;Select the &lt;code&gt;Use auto-import&lt;/code&gt; option so dependencies can be automatically downloaded&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Select the downloaded spring-boot folder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wait until all dependencies are downloaded (This might take a few minutes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  With command-line
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install &lt;a href="https://gradle.org/install/"&gt;Gradle&lt;/a&gt; (Install maven if you chose it as your build and dependencies manager&lt;/li&gt;
&lt;li&gt;Copy the downloaded folder to Intellij directory&lt;/li&gt;
&lt;li&gt;Enter the folder and run &lt;code&gt;gradle build&lt;/code&gt; (This command also run application tests)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Runing the project with Intellij
&lt;/h2&gt;

&lt;p&gt;The right upper corner of your IDE there is this green &lt;code&gt;play&lt;/code&gt; button. Just click on it and watch the IDE's terminal for a similar output:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;2019-05-19 09:36:07.615  INFO 70436 &lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService &lt;span class="s1"&gt;'applicationTaskExecutor'&lt;/span&gt;
2019-05-19 09:36:07.751  INFO 70436 &lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;: 8080 &lt;span class="o"&gt;(&lt;/span&gt;http&lt;span class="o"&gt;)&lt;/span&gt; with context path &lt;span class="s1"&gt;''&lt;/span&gt;
2019-05-19 09:36:07.754  INFO 70436 &lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;           main] com.example.demo.DemoApplicationKt       : Started DemoApplicationKt &lt;span class="k"&gt;in &lt;/span&gt;1.826 seconds &lt;span class="o"&gt;(&lt;/span&gt;JVM running &lt;span class="k"&gt;for &lt;/span&gt;2.28&lt;span class="o"&gt;)&lt;/span&gt;
2019-05-19 09:36:12.131  INFO 70436 &lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;       Thread-4] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService &lt;span class="s1"&gt;'applicationTaskExecutor'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Runing the project with command-line
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Inside the project's folder run &lt;code&gt;gradle bootRun&lt;/code&gt; and for an output as presented above.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Let me know if you had any issues in the commends below, or leave a reaction if everything worked as expected.&lt;/p&gt;

</description>
      <category>spring</category>
      <category>springboot</category>
      <category>springframework</category>
    </item>
  </channel>
</rss>
