<?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>DEV Community: KenjiGoh</title>
    <description>The latest articles on DEV Community by KenjiGoh (@kenji_goh).</description>
    <link>https://dev.to/kenji_goh</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%2F664307%2Fe0f9d3d2-762a-42da-abca-82e04ee063f8.jpg</url>
      <title>DEV Community: KenjiGoh</title>
      <link>https://dev.to/kenji_goh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kenji_goh"/>
    <language>en</language>
    <item>
      <title>Get started with Claude!</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Fri, 06 Mar 2026 13:59:05 +0000</pubDate>
      <link>https://dev.to/kenji_goh/get-started-with-claude-406p</link>
      <guid>https://dev.to/kenji_goh/get-started-with-claude-406p</guid>
      <description>&lt;h2&gt;
  
  
  Documenting my learning Journey
&lt;/h2&gt;

&lt;p&gt;Free Claude Tutorial can be found here: &lt;a href="https://anthropic.skilljar.com/claude-code-in-action" rel="noopener noreferrer"&gt;https://anthropic.skilljar.com/claude-code-in-action&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. MacOS (Homebrew):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. MacOS, Linux, WSL:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Windows CMD:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.cmd &lt;span class="nt"&gt;-o&lt;/span&gt; install.cmd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; install.cmd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; del install.cmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, run &lt;code&gt;claude&lt;/code&gt; at your terminal. The first time you run this command you will be prompted to authenticate&lt;/p&gt;

&lt;p&gt;Set up instructions can be found here:&lt;br&gt;
&lt;a href="https://code.claude.com/docs/en/quickstart" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/quickstart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fy1cduy509dsje2kwb7eb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fy1cduy509dsje2kwb7eb.png" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Start by creating a claude.md file
&lt;/h2&gt;

&lt;p&gt;Type &lt;code&gt;/init&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;claude
/init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F82ft9hy07r1t586tlcgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F82ft9hy07r1t586tlcgw.png" alt=" " width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Commands
&lt;/h2&gt;

&lt;p&gt;Stop Claude - press &lt;code&gt;Esc&lt;/code&gt;&lt;br&gt;
Add a memory - press&lt;code&gt;#&lt;/code&gt;&lt;br&gt;
Rewind to previous conversation - press &lt;code&gt;Esc&lt;/code&gt; 2 times&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Context
&lt;/h2&gt;

&lt;p&gt;Example, we can tell claude to always look at prisma/schema.prisma to check structure of data in db:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmq81aropu9ifrre42cpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmq81aropu9ifrre42cpw.png" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Few56088k41k78sieixod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Few56088k41k78sieixod.png" alt=" " width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next time when you ask about a schema attributes, claude will go straight to the schema instead of searching more files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjeg8f4inkaowxk8s1wqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjeg8f4inkaowxk8s1wqp.png" alt=" " width="707" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reusing knowledge for similar task
&lt;/h2&gt;

&lt;p&gt;Type &lt;code&gt;/compact&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fgt2ofuw1emnmwbsywenw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgt2ofuw1emnmwbsywenw.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan Mode
&lt;/h2&gt;

&lt;p&gt;Press Shift + Tab 2 times to enable Plan mode&lt;br&gt;
In Plan mode, claude will do more research, reads more files and come up with a complete plan for your tasks for your review. It will list down exactly what it wants to do to complete your tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thinking Mode
&lt;/h2&gt;

&lt;p&gt;Allow claude to reason about more challenging problems.&lt;br&gt;
Think ---&amp;gt; Ultrathink&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Playwright Server
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjz9anw01vg9fgbjzot15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjz9anw01vg9fgbjzot15.png" alt=" " width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7tp7wwdtkjdm97digenj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7tp7wwdtkjdm97digenj.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>ant</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>F5 Load Balancing</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Sun, 18 May 2025 09:16:05 +0000</pubDate>
      <link>https://dev.to/kenji_goh/f5-load-balancing-2aii</link>
      <guid>https://dev.to/kenji_goh/f5-load-balancing-2aii</guid>
      <description>&lt;h2&gt;
  
  
  VMs located in different Data Centre
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────────┐
                    │        Client            │
                    └────────────┬─────────────┘
                                 │
                                 ▼
                    DNS Request: pmpcn.com
                                 │
                                 ▼
                      ┌────────────────────┐
                      │   F5 GTM (DNS)     │
                      └───────┬────────────┘
                              │
         ┌────────────────────┴────────────────────┐
         ▼                                         ▼
┌────────────────────┐                   ┌────────────────────┐
│ F5 LTM - DC1       │                   │ F5 LTM - DC2       │
│ VIP: 10.0.0.100:8443│                   │ VIP: 10.0.1.100:8443│
└─────────┬──────────┘                   └─────────┬──────────┘
          │                                        │
   ┌──────┴──────┐                          ┌──────┴──────┐
   ▼             ▼                          ▼             ▼
┌────────┐   ┌────────┐                ┌────────┐     ┌────────┐
│ VM1    │   │ VM2    │                │ VM3    │     │ VM4    │
│ Java   │   │ Java   │                │ Java   │     │ Java   │
│ App    │   │ App    │                │ App    │     │ App    │
│ :8443  │   │ :8443  │                │ :8443  │     │ :8443  │
└────────┘   └────────┘                └────────┘     └────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  VMs in same Data Center
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────────┐
                    │        Client            │
                    └────────────┬─────────────┘
                                 │
                      DNS Request: pmpcn.com
                                 │
                                 ▼
                      ┌────────────────────┐
                      │   F5 LTM (VIP)     │
                      │  10.0.0.100:8443   │
                      └─────────┬──────────┘
                                │
                   ┌────────────┴────────────┐
                   ▼                         ▼
            ┌────────────┐           ┌────────────┐
            │   VM1      │           │    VM2     │
            │ Java App   │           │ Java App   │
            │  :8443     │           │  :8443     │
            └────────────┘           └────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
  ↓
DNS request (pmpcn.com)
  ↓
F5 GTM (optional, DNS-level routing)
  ↓
F5 LTM (VIP: 10.0.0.100:8443)
  |
  +--&amp;gt; VM1 (Java App 1:8443)
  |
  +--&amp;gt; VM2 (Java App 2:8443)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Flow from Client to App for VMs in different DCs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User accesses: https://api.pmpcn.com
     ↓
DNS lookup: api.pmpcn.com (CNAME → gtm.pmpcn.com)
     ↓
F5 GTM resolves → dc1-ltm.pmpcn.com or dc2-ltm.pmpcn.com
     ↓
VIP: 10.0.0.100:8443 (DC1) or 10.1.0.100:8443 (DC2)
     ↓
Load balanced to: VM1 or VM2 in that DC on port 8443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test DNS resolving to GTM
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# DNS Resolution
dig api.pmpcn.com
OR
# CNAME Resolution
nslookup api.pmpcn.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;api.pmpcn.com should resolve to gtm.pmpcn.com (CNAME)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test GTM resolving to LTMs
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig gtm.pmpcn.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Test LTM connectivity
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping &amp;lt;VIP IP&amp;gt;
nc -vz &amp;lt;VIP IP&amp;gt; 8443
curl -vk https://&amp;lt;VIP IP&amp;gt;:8443/actuator/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Summary of Commands
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Command Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS Resolution&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig api.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAME Resolution&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nslookup api.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GTM FQDN Test&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig gtm.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LTM FQDN Test&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig dc1-ltm.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port Test to VIP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nc -vz api.pmpcn.com 8443&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL Cert Validation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openssl s_client -connect api.pmpcn.com:8443&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend Health API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -vk https://api.pmpcn.com/actuator/health&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trace Route&lt;/td&gt;
&lt;td&gt;&lt;code&gt;traceroute api.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct Backend Check&lt;/td&gt;
&lt;td&gt;&lt;code&gt;telnet &amp;lt;VM IP&amp;gt; 8443&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Telnet (for basic port check only)
&lt;/h4&gt;

&lt;p&gt;This tests TCP connectivity to a host and port, it doesn’t understand HTTP or HTTPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;telnet api.pmpcn.com 8443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Curl (for actual HTTPS request)
&lt;/h4&gt;

&lt;p&gt;This checks the HTTP response from your app, including TLS handshake:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -vk https://api.pmpcn.com:8443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-v: verbose (shows headers)&lt;br&gt;
-k: skip SSL certificate validation (useful if self-signed cert)&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Use This Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check if port 8443 is open&lt;/td&gt;
&lt;td&gt;&lt;code&gt;telnet api.pmpcn.com 8443&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Send HTTPS request&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -vk https://api.pmpcn.com:8443&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check specific API health&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -vk https://api.pmpcn.com:8443/actuator/health&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Configuring SSL Certs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;SSL Cert Needed?&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GTM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;GTM mainly handles DNS, not SSL termination.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LTM VIP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LTM usually terminates SSL for your public-facing service.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend VMs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional (Yes or No)&lt;/td&gt;
&lt;td&gt;Depends if LTM does SSL termination or passes through.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client URL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (on LTM VIP)&lt;/td&gt;
&lt;td&gt;The cert must match the public FQDN clients use (e.g., &lt;code&gt;api.pmpcn.com&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What to secure&lt;/th&gt;
&lt;th&gt;How to name it&lt;/th&gt;
&lt;th&gt;Cert procurement method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LTM VIP SSL certificate&lt;/td&gt;
&lt;td&gt;Use FQDN, not IP&lt;/td&gt;
&lt;td&gt;Public CA for domain cert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public service domain&lt;/td&gt;
&lt;td&gt;FQDN (e.g., api.pmpcn.com)&lt;/td&gt;
&lt;td&gt;Public CA or internal CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend VMs (optional)&lt;/td&gt;
&lt;td&gt;Depends on your architecture&lt;/td&gt;
&lt;td&gt;Internal CA or self-signed cert&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Steps to setup SSL for LTM (VIPs)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create DNS A records pointing FQDNs to your VIP IPs&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hostname&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Value (VIP IP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dc1-ltm.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;10.0.0.100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dc2-ltm.pmpcn.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;10.0.0.101&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Get SSL certificates for these FQDNs from a trusted CA.&lt;/li&gt;
&lt;li&gt;Configure your LTM VIPs to use these FQDN certs for SSL termination.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your public service URL (e.g., api.pmpcn.com) should be a CNAME that ultimately resolves to your GTM, which then routes to the LTM VIP FQDNs/IPs.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSL Termination at LTM (Backend VMs do not need SSL)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;LTM VIP has the SSL cert for your public FQDN (api.pmpcn.com).&lt;/li&gt;
&lt;li&gt;LTM decrypts SSL, forwards plain HTTP (or HTTPS) to backend VMs.&lt;/li&gt;
&lt;li&gt;Backend VMs don’t need certs if traffic is HTTP, or can have self-signed certs if HTTPS is used internally.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SSL Passthrough (Backend VMS must have SSL)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;End-to-End Encryption&lt;/li&gt;
&lt;li&gt;LTM passes encrypted SSL traffic to backend VMs without decrypting.&lt;/li&gt;
&lt;li&gt;Backend VMs must have SSL certs matching the FQDN (usually their own hostname).&lt;/li&gt;
&lt;li&gt;GTM still doesn’t handle SSL, just DNS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use OpenSSL to inspect a cert
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openssl s_client -connect api.pmpcn.com:8443 | openssl x509 -text -noout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look under Subject: and X509v3 Subject Alternative Name:.&lt;/p&gt;

</description>
      <category>f5</category>
      <category>loadbalancing</category>
      <category>architecture</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Basic Setup: Run SpringBoot using JBoss (Wildfly)</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Thu, 20 Feb 2025 05:39:30 +0000</pubDate>
      <link>https://dev.to/kenji_goh/basic-setup-run-springboot-using-jboss-wildfly-2349</link>
      <guid>https://dev.to/kenji_goh/basic-setup-run-springboot-using-jboss-wildfly-2349</guid>
      <description>&lt;p&gt;This tutorial assumes you have already set up Java and Maven in your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Install JBoss (Wildfly)
&lt;/h2&gt;

&lt;p&gt;Go &lt;a href="https://www.wildfly.org/downloads/" rel="noopener noreferrer"&gt;wildfly download page&lt;/a&gt; and download the tar file. For example, I downloaded version 35.0.1.Final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fg2go9urus4kjn2sh0d3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fg2go9urus4kjn2sh0d3u.png" alt="Image description" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once downloaded, run this to unzip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar -xvzf wildfly-&amp;lt;version&amp;gt;.tar.gz
cd wildfly-&amp;lt;version&amp;gt;/

tar -xvzf wildfly-35.0.1.Final.tar.gz
cd wildfly-35.0.1.Final/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Test start the Jboss server
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd wildfly-35.0.1.Final/
./bin/standalone.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default port is 8080, you can change port like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./bin/standalone.sh -Djboss.http.port=9090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:9090" rel="noopener noreferrer"&gt;http://localhost:9090&lt;/a&gt; to see this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwdmoyekh7wf74jrzpfnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwdmoyekh7wf74jrzpfnw.png" alt="Image description" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Download and package a springboot app
&lt;/h2&gt;

&lt;p&gt;Go &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;start spring&lt;/a&gt; and select maven.&lt;br&gt;
By default, maven will build jar. We need to use war for JBoss server.&lt;br&gt;
Locate your pom.xml and update your build to war:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exclude the embedded tomcat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add spring-boot-starter-tomcat as provided:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modify the SpringBootApplication Class to extend from SpringBootServletInitializer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do some minimal changes to your springboot app for easier validation:&lt;br&gt;
Add ThymeLeaf in pom.xl&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a HTML under resources\templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html xmlns:th="http://www.thymeleaf.org"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Home Page&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1 th:text="${message}"&amp;gt;Welcome to the Home Page&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a HomeController&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HomeController {

    @GetMapping("/home")
    public String home(@RequestParam(name = "message", required = false, defaultValue = "Hello, Thymeleaf!") String message, Model model) {
        model.addAttribute("message", message);
        return "home";
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Start the war package
&lt;/h2&gt;

&lt;p&gt;Build the WAR&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn clean package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the WAR file to JBoss deployments folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp target/demo-0.0.1-SNAPSHOT.war $JBOSS_HOME/standalone/deployments/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F99uukbls0f723riisixx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F99uukbls0f723riisixx.png" alt="Image description" width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Finally start your demo springboot app with Jboss server!
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:9090/demo-0.0.1-SNAPSHOT/home?message=Springboot%20is%20running%20on%20jboss%20now!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F0pxio2o6ikqz6apqrchr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0pxio2o6ikqz6apqrchr.png" alt="Image description" width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jboss</category>
      <category>wildfly</category>
      <category>springboot</category>
      <category>maven</category>
    </item>
    <item>
      <title>Shell script to start up a flask project in a venv</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Sat, 16 Mar 2024 01:40:10 +0000</pubDate>
      <link>https://dev.to/kenji_goh/shell-script-to-start-up-a-flask-project-in-a-venv-1ocf</link>
      <guid>https://dev.to/kenji_goh/shell-script-to-start-up-a-flask-project-in-a-venv-1ocf</guid>
      <description>&lt;h2&gt;
  
  
  Copy &amp;amp; Save it as flask_starter.sh
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Inform the user about the script purpose&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"This script will set up a Flask project."&lt;/span&gt;

&lt;span class="c"&gt;# Ask for project directory name&lt;/span&gt;
&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Enter the name of your Flask project: "&lt;/span&gt; project_name

&lt;span class="c"&gt;# Inform the user about creating the project directory&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Creating project directory: &lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c"&gt;# Create project directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$project_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Inform the user about setting up the virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting up virtual environment..."&lt;/span&gt;
&lt;span class="c"&gt;# Set up virtual environment&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv

&lt;span class="c"&gt;# Inform the user about activating the virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Activating virtual environment..."&lt;/span&gt;
&lt;span class="c"&gt;# Activate virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;source &lt;/span&gt;venv/Scripts/activate

&lt;span class="c"&gt;# Inform the user about installing Flask&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing Flask..."&lt;/span&gt;
&lt;span class="c"&gt;# Install Flask&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;Flask

&lt;span class="c"&gt;# Inform the user about creating app.py&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Creating app.py..."&lt;/span&gt;
&lt;span class="c"&gt;# Create app.py&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Inform the user about creating templates directory&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Creating templates directory..."&lt;/span&gt;
&lt;span class="c"&gt;# Create templates directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;templates

&lt;span class="c"&gt;# Inform the user about creating index.html template&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Creating index.html template..."&lt;/span&gt;
&lt;span class="c"&gt;# Create index.html template&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; templates/index.html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Flask App&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Hello, Flask!&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Inform the user that setup is complete&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setup completed successfully!"&lt;/span&gt;

&lt;span class="c"&gt;# Open the project in Visual Studio Code&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Opening the project in Visual Studio Code..."&lt;/span&gt;
code &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Run the Flask app&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running the Flask app..."&lt;/span&gt;
python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Command to run the script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash flask_starter.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Now go to browser to see the app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:5000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>flask</category>
      <category>webdev</category>
      <category>shell</category>
      <category>python</category>
    </item>
    <item>
      <title>Kafka Quickstart</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Wed, 13 Mar 2024 13:01:05 +0000</pubDate>
      <link>https://dev.to/kenji_goh/kafka-basics-90j</link>
      <guid>https://dev.to/kenji_goh/kafka-basics-90j</guid>
      <description>&lt;h1&gt;
  
  
  Getting Started on Kafka (Windows)
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. Start up zookeeper server
&lt;/h3&gt;

&lt;p&gt;Open a command prompt in C:\kafka and enter this command:&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="se"&gt;\b&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\w&lt;/span&gt;indows&lt;span class="se"&gt;\z&lt;/span&gt;ookeeper-server-start.bat .&lt;span class="se"&gt;\c&lt;/span&gt;onfig&lt;span class="se"&gt;\z&lt;/span&gt;ookeeper.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F6ljwvjylp2hf13201kvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6ljwvjylp2hf13201kvz.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zookeeper is running on Port 2181&lt;br&gt;
&lt;a href="https://media2.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%2F4b1gy4zt0uaas4fe78ch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F4b1gy4zt0uaas4fe78ch.png" alt="Image description" width="800" height="74"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Start the Kafka server
&lt;/h3&gt;

&lt;p&gt;Open a new command prompt and start the Kafka server:&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="se"&gt;\b&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="se"&gt;\w&lt;/span&gt;indows&lt;span class="se"&gt;\k&lt;/span&gt;afka-server-start.bat .&lt;span class="se"&gt;\c&lt;/span&gt;onfig&lt;span class="se"&gt;\s&lt;/span&gt;erver.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F6ew7glew99toc12292de.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6ew7glew99toc12292de.png" alt="Image description" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create a topic
&lt;/h3&gt;

&lt;p&gt;Open a new command prompt in C:\kafka\bin\windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kafka-topics.bat &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="nt"&gt;--topic&lt;/span&gt; mytopic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F1bmgxsjo2xy4getoqxop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1bmgxsjo2xy4getoqxop.png" alt="Image description" width="800" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Create a Producer Console
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kafka-console-producer.sh &lt;span class="nt"&gt;--broker-list&lt;/span&gt; &amp;lt;BROKER_LIST&amp;gt; &lt;span class="nt"&gt;--topic&lt;/span&gt; &amp;lt;TOPIC_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open another new command prompt in C:\kafka\bin\windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kafka-console-producer.bat &lt;span class="nt"&gt;--broker-list&lt;/span&gt; localhost:9092 &lt;span class="nt"&gt;--topic&lt;/span&gt; mytopic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a &amp;gt; prompt when the producer is ready. &lt;/p&gt;

&lt;h3&gt;
  
  
  5. Create a Consumer Console
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kafka-console-consumer.sh &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; &amp;lt;BROKER_LIST&amp;gt; &lt;span class="nt"&gt;--topic&lt;/span&gt; &amp;lt;TOPIC_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open another new command prompt in C:\kafka\bin\windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kafka-console-consumer.bat &lt;span class="nt"&gt;--topic&lt;/span&gt; mytopic &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="nt"&gt;--from-beginning&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Paste Data to Producer and Observe Consumer
&lt;/h3&gt;

&lt;p&gt;Sample data for use:&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="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;:&lt;span class="s2"&gt;"Kenneth"&lt;/span&gt;,&lt;span class="s2"&gt;"Age"&lt;/span&gt;:&lt;span class="s2"&gt;"35"&lt;/span&gt;,&lt;span class="s2"&gt;"Gender"&lt;/span&gt;:&lt;span class="s2"&gt;"Male"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;:&lt;span class="s2"&gt;"Gemma"&lt;/span&gt;,&lt;span class="s2"&gt;"Age"&lt;/span&gt;:&lt;span class="s2"&gt;"25"&lt;/span&gt;,&lt;span class="s2"&gt;"Gender"&lt;/span&gt;:&lt;span class="s2"&gt;"Female"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;:&lt;span class="s2"&gt;"Amy"&lt;/span&gt;,&lt;span class="s2"&gt;"Age"&lt;/span&gt;:&lt;span class="s2"&gt;"15"&lt;/span&gt;,&lt;span class="s2"&gt;"Gender"&lt;/span&gt;:&lt;span class="s2"&gt;"Male"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referencing the image below, once you paste a row of data into the producer terminal (left), the data appears on the consumer terminal (right) almost instantaneously.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0cf0tbkewtznvu2mbt2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0cf0tbkewtznvu2mbt2b.png" alt="Image description" width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  In Git Bash/ Linux
&lt;/h1&gt;

&lt;p&gt;Similar commands collated from &lt;a href="https://kafka.apache.org/quickstart" rel="noopener noreferrer"&gt;kafka quickstart&lt;/a&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;# Download and extract&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; kafka_2.13-3.7.0.tgz
&lt;span class="nb"&gt;cd &lt;/span&gt;kafka_2.13-3.7.0

&lt;span class="c"&gt;# Start the ZooKeeper service&lt;/span&gt;
bin/zookeeper-server-start.sh config/zookeeper.properties
&lt;span class="c"&gt;# Start and hide logs on terminal&lt;/span&gt;
bin/zookeeper-server-start.sh config/zookeeper.properties &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;span class="c"&gt;# verify that Zookeeper is indeed running&lt;/span&gt;
ps &lt;span class="nt"&gt;-aef&lt;/span&gt;

&lt;span class="c"&gt;# Start the Kafka broker service in another terminal&lt;/span&gt;
bin/kafka-server-start.sh config/server.properties

&lt;span class="c"&gt;# Create a topic in another terminal&lt;/span&gt;
bin/kafka-topics.sh &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="nt"&gt;--topic&lt;/span&gt; quickstart-events &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092

&lt;span class="c"&gt;# Show details of a topic&lt;/span&gt;
bin/kafka-topics.sh &lt;span class="nt"&gt;--describe&lt;/span&gt; &lt;span class="nt"&gt;--topic&lt;/span&gt; quickstart-events &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092
Topic: quickstart-events        TopicId: z_zqwwkiT6ueXVJxi3EAdA PartitionCount: 1       ReplicationFactor: 1     Configs:
        Topic: quickstart-events        Partition: 0    Leader: 0       Replicas: 0     Isr: 0

&lt;span class="c"&gt;# Run Producer Console in another terminal&lt;/span&gt;
bin/kafka-console-producer.sh &lt;span class="nt"&gt;--topic&lt;/span&gt; quickstart-events &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092

&lt;span class="c"&gt;# Run Consumer Console in another terminal&lt;/span&gt;
bin/kafka-console-consumer.sh &lt;span class="nt"&gt;--topic&lt;/span&gt; quickstart-events &lt;span class="nt"&gt;--from-beginning&lt;/span&gt; &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092

&lt;span class="c"&gt;# Write event to topic at Producer console&lt;/span&gt;
This is my first message
This is my second message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F9x4lgoxa49kmpac7e2ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9x4lgoxa49kmpac7e2ph.png" alt="Image description" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating 3 Brokers Replica
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create 2 other brokers&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/server.properties config/server-1.properties
&lt;span class="nb"&gt;cp &lt;/span&gt;config/server.properties config/server-2.properties
ll config/serv&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F9l1ptjdw0s3ttbyhf5ly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9l1ptjdw0s3ttbyhf5ly.png" alt="Image description" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update these 3 areas in server-1 and server-2 file:&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;# SERVER-1&lt;/span&gt;
&lt;span class="c"&gt;# id of the broker&lt;/span&gt;
broker.id&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="c"&gt;# broker port&lt;/span&gt;
&lt;span class="nv"&gt;listeners&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PLAINTEXT://:9093
&lt;span class="c"&gt;# log files directories &lt;/span&gt;
log.dirs&lt;span class="o"&gt;=&lt;/span&gt;/tmp/kafka-logs-1

&lt;span class="c"&gt;# SERVER-2&lt;/span&gt;
&lt;span class="c"&gt;# id of the broker&lt;/span&gt;
broker.id&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;span class="c"&gt;# broker port&lt;/span&gt;
&lt;span class="nv"&gt;listeners&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PLAINTEXT://:9094
&lt;span class="c"&gt;# log files directories &lt;/span&gt;
log.dirs&lt;span class="o"&gt;=&lt;/span&gt;/tmp/kafka-logs-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now start all 3 brokers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-server-start.sh config/server.properties
bin/kafka-server-start.sh config/server-1.properties
bin/kafka-server-start.sh config/server-2.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Create a topic with 2 partitions and 3 replication factor across 3 brokers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="nt"&gt;--topic&lt;/span&gt; TestTopicXYZ &lt;span class="nt"&gt;--partitions&lt;/span&gt; 2 &lt;span class="nt"&gt;--replication-factor&lt;/span&gt; 3 &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092, localhost:9093, localhost:9094
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly describe the topic to examine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="nt"&gt;--describe&lt;/span&gt; &lt;span class="nt"&gt;--topic&lt;/span&gt; TestTopicXYZ &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092,localhost:9093, localhost:9094

Topic: TestTopicXYZ     TopicId: 65thxHOeTIGSJJ5L_jl-XQ PartitionCount: 2       ReplicationFactor: 3    Configs:
        Topic: TestTopicXYZ     Partition: 0    Leader: 0       Replicas: 0,2,1 Isr: 0,2,1
        Topic: TestTopicXYZ     Partition: 1    Leader: 2       Replicas: 2,1,0 Isr: 2,1,0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F01dme63wwlbnldskfsoi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F01dme63wwlbnldskfsoi.png" alt="Image description" width="800" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Kafka?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Publish/Subscribe systems&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With Publish/Subscribe systems, each event can be processed by multiple consumers who are listening to the topic. So multiple consumers can all get the same messages from the producer.&lt;/p&gt;

&lt;p&gt;Pub/Sub systems introduce the concept of a topic. We can have multiple topics (to categorize your messages) and multiple producers writing to each topic and multiple consumers reading from a topic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Distributed&lt;br&gt;
Kafka is like a messaging system. Kafka Cluster is made up of &lt;strong&gt;more than 1&lt;/strong&gt; Kafka servers. Each Kafka server is referred to as a &lt;strong&gt;Broker&lt;/strong&gt;. A Kafka cluster will have multiple brokers, therefore it is distributed application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fault-Tolerant&lt;br&gt;
In Kafka cluster, messages are replicated in multiple brokers. A message published in Broker 1 will also be published in Broker 3. Therefore Kafka is fault-tolerant as message is replicated and not lost even if Broker 1 is down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Language Agnostic&lt;br&gt;
Data transferred (called Messages) are byte arrays so you can use JSON or a data format like Avro. Messages are immutable and have a timestamp, a value and optional key/headers&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Kafka Architecture
&lt;/h2&gt;

&lt;p&gt;Every Kafka ecosystem can have multiple producers/publishers.&lt;br&gt;
A Kafka system consists of several components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Producer&lt;/strong&gt; - Any service that pushes messages to Kafka is a producer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumer&lt;/strong&gt; - Any service that consumes (pulls) messages from Kafka is a consumer. There can be multiple Consumer groups in the Kafka ecosystem. Consumers must be associated in a Consumer groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kafka Brokers&lt;/strong&gt; - the kafka cluster is composed of a network of nodes called brokers. Each machine/instance/container running a Kafka process is called a broker. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a Kafka cluster, the individual servers are referred to as brokers. Brokers will handle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receiving Messages - accepting messages from producers&lt;/li&gt;
&lt;li&gt;Storing Messages - storing them on disk organized by topic. Each message has a unique offset identifying it.&lt;/li&gt;
&lt;li&gt;Serving Messages - sending messages to consumer services when the consumer requests it&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topics&lt;/strong&gt; - A Kafka server has multiple topics. Every topics can have multiple partitions. Messages in Kafka are stored in topics, which are the core structure for organizing and storing your messages. You can think of a topic as a log file that stores all the messages and maintains their order. New message are appended to the end of the topic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.kafkatool.com/download.html" rel="noopener noreferrer"&gt;Offset Explorer&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A UI tool for Kafka to help us visualize kafka clusters, topics and offset etc.&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
      <category>kafka</category>
    </item>
    <item>
      <title>Using AWS-CLI &amp; AWS CloudShell</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Sun, 04 Feb 2024 01:43:38 +0000</pubDate>
      <link>https://dev.to/kenji_goh/using-aws-cli-aws-cloudshell-51g</link>
      <guid>https://dev.to/kenji_goh/using-aws-cli-aws-cloudshell-51g</guid>
      <description>&lt;h2&gt;
  
  
  1. AWS-CLI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Following this official guide: &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example, for windows, we can install via this command on command prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check for success installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws --version
# aws-cli/2.15.17 Python/3.11.6 Windows/10 exe/AMD64 prompt/off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure
&lt;/h3&gt;

&lt;p&gt;Example, on VS Code local:&lt;br&gt;
&lt;a href="https://media2.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%2Fvqsmh0rcm05do32wyh6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvqsmh0rcm05do32wyh6z.png" alt="Image description" width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;Check for iam users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam list-users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. AWS CloudShell
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An alternative to AWS-CLI will be using AWS CloudShell directly.&lt;/li&gt;
&lt;li&gt;AWS CloudShell is a &lt;strong&gt;browser-based shell&lt;/strong&gt; that gives you command-line access to your AWS resources in the selected AWS region. &lt;/li&gt;
&lt;li&gt;AWS CloudShell comes pre-installed with popular tools for resource management and creation.&lt;/li&gt;
&lt;li&gt;You have the same credentials as you used to log in to the console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Are available only in &lt;a href="https://docs.aws.amazon.com/cloudshell/latest/userguide/supported-aws-regions.html" rel="noopener noreferrer"&gt;Supported Regions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F99eyl9gezstmew7vq1uy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F99eyl9gezstmew7vq1uy.png" alt="Image description" width="800" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fv6qwnwc45ywkckmagr0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fv6qwnwc45ywkckmagr0d.png" alt="Image description" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fblncab4oo6jm0w0z5mmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fblncab4oo6jm0w0z5mmx.png" alt="Image description" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Create and download a file from CloudShell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsud26pqozybhshsbirmw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsud26pqozybhshsbirmw.png" alt="Image description" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;pwd&lt;/code&gt; to get the path of your created file in the CloudShell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxktqycgnm2y1wjvsw6cx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxktqycgnm2y1wjvsw6cx.png" alt="Image description" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0eoyl0vkh35dco35nkxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0eoyl0vkh35dco35nkxu.png" alt="Image description" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>awscl</category>
      <category>cloudshell</category>
    </item>
    <item>
      <title>Spring Boot 3 – package javax.persistence does not exist</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Wed, 20 Dec 2023 14:57:53 +0000</pubDate>
      <link>https://dev.to/kenji_goh/spring-boot-3-package-javaxpersistence-does-not-exist-195j</link>
      <guid>https://dev.to/kenji_goh/spring-boot-3-package-javaxpersistence-does-not-exist-195j</guid>
      <description>&lt;p&gt;When migrating from Spring Boot 2 to Spring Boot 3, one might face this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The import javax.persistence cannot be resolvedJava(268435846)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is due to this &lt;a href="https://blogs.oracle.com/javamagazine/post/transition-from-java-ee-to-jakarta-ee" rel="noopener noreferrer"&gt;Transition from Java EE to Jakarta EE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spring Boot 2.x using Java EE APIs javax.*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nl"&gt;java:&lt;/span&gt; &lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.Entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.GenerationType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.Id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fix this, we can just update all javax to jakarta.&lt;/p&gt;

&lt;p&gt;Spring Boot 3 using Jakarta EE APIs jakarta.*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.Entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.GenerationType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.Id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
    </item>
    <item>
      <title>How SAML is used for SSO</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Sun, 03 Dec 2023 08:59:25 +0000</pubDate>
      <link>https://dev.to/kenji_goh/how-saml-is-used-for-sso-3m29</link>
      <guid>https://dev.to/kenji_goh/how-saml-is-used-for-sso-3m29</guid>
      <description>&lt;h2&gt;
  
  
  Identity Management System
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;example of identity providers (IdP): Okta, ADFS, ForgeRock&lt;/li&gt;
&lt;li&gt;in real world, there will usually be a mixture of applications using different authentication mechanism, some using SAML, some using OIDC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security Assertion Markup Language (SAML)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;a popular authentication mechanism for SSO&lt;/li&gt;
&lt;li&gt;other alternative mechanism are OAuth/OIDC and AD directory services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SAML Theory &amp;amp; Terminology
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Subject - End User&lt;/li&gt;
&lt;li&gt;User Agent - The Browser&lt;/li&gt;
&lt;li&gt;Identity Provider (IdP)&lt;/li&gt;
&lt;li&gt;Service Provider (SP) - E.g. SaaS Application&lt;/li&gt;
&lt;li&gt;Circle of Trust&lt;/li&gt;
&lt;li&gt;SAML Metadata&lt;/li&gt;
&lt;li&gt;SAML Assertion&lt;/li&gt;
&lt;li&gt;Protocol Binding&lt;/li&gt;
&lt;li&gt;Subject - User of Application&lt;/li&gt;
&lt;li&gt;XML - SAML's Requests &amp;amp; Response data format&lt;/li&gt;
&lt;li&gt;HTTP-Redirect&lt;/li&gt;
&lt;li&gt;HTTP-POST&lt;/li&gt;
&lt;li&gt;Entity ID - Identifier associated with SP &amp;amp; IdP&lt;/li&gt;
&lt;li&gt;Relay State&lt;/li&gt;
&lt;li&gt;Relying Party (refer to the SP too)&lt;/li&gt;
&lt;li&gt;Assertion - the XML within the response that contains user and group attributes&lt;/li&gt;
&lt;li&gt;Attributes - sometimes called SAML claims&lt;/li&gt;
&lt;li&gt;Assertion Consumer Service (ACS) URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  IdP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;is responsible for authenticating end users, managing their account, and issuing SAML assertions about them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The provider of the service or application that the end user is trying to access.&lt;/li&gt;
&lt;li&gt;has a trust relationship with the IdP, which enables the SP to rely on the assertions it receives from the IdP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Single Sign-On (SSO)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The ability for an end user to authenticate once but gain access to multiple applications, without having to authenticate separately to each one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trust Relationship
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;to be set up between IdP and SP&lt;/li&gt;
&lt;li&gt;a quick way to achieve this trust is to exchange the SAML metadata file (an XML formatted) file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SAML's Protocol Binding
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;defines what forwarded mechanisms to use&lt;/li&gt;
&lt;li&gt;can be HTTP 302 redirect or HTTP Post&lt;/li&gt;
&lt;li&gt;either way, a similar request is being sent to the SAML IdP from the browser (user agent)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  SAML Authentication Flow
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;SP Initiated SAML Single Sign On&lt;/li&gt;
&lt;li&gt;IdP Initiated SAML Single Sign On&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. SP Initiated SAML SSO
&lt;/h2&gt;

&lt;p&gt;SP initiates the SAML Request Redirect back to the browser after User access the SP from the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample SP Initiated SAML SSO Flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User accessed Application on Browser&lt;/li&gt;
&lt;li&gt;Browser (as agent) forwards Request to IdP&lt;/li&gt;
&lt;li&gt;IdP displays login screen&lt;/li&gt;
&lt;li&gt;IdP authenticates the user against directory&lt;/li&gt;
&lt;li&gt;IdP forwards Response to Application&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Understanding Entity ID
&lt;/h3&gt;

&lt;p&gt;Both the IdP and SP are entities and both have Entity ID associated with them. With Entity ID, we can identify who is the issuer of a request or who is the recipient of the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Relay State Here
&lt;/h3&gt;

&lt;p&gt;When User first requests (1) a URL (e.g. SaaS Application), this accessed URL is usually passed as Relay State when (2) Browser forwards the request to IdP. And it will be returned in the Response (5) for application to act on.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. IdP Initiated SAML SSO
&lt;/h2&gt;

&lt;p&gt;IdP initiates the SAML Response. The application gets a SAML Response without it requesting an authentication.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample IdP Initiated SAML SSO Flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User accesses &amp;amp; logs into IdP&lt;/li&gt;
&lt;li&gt;IdP authenticates the user against directory&lt;/li&gt;
&lt;li&gt;IdP creates a Response XML with the right assertion (XML within the response that contains user and group attributes)&lt;/li&gt;
&lt;li&gt;The assertion is digitally sign and encrypted&lt;/li&gt;
&lt;li&gt;The Response is being sent to the SP&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Understanding Relay State Here
&lt;/h3&gt;

&lt;p&gt;Since it is not SP-initiated, there is no initial URL to store as Relay State. In this case, the IdPs can store a default Relay State to sent back to the Application on Browser. Application gets the response from the IdP and verify the assertion. &lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.okta.com/docs/concepts/saml/" rel="noopener noreferrer"&gt;https://developer.okta.com/docs/concepts/saml/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://backstage.forgerock.com/docs/am/7/saml2-guide/saml2-introduction.html" rel="noopener noreferrer"&gt;https://backstage.forgerock.com/docs/am/7/saml2-guide/saml2-introduction.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Getting Started with Openshift on Windows</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Sat, 11 Nov 2023 17:02:21 +0000</pubDate>
      <link>https://dev.to/kenji_goh/getting-started-with-openshift-on-windows-8p3</link>
      <guid>https://dev.to/kenji_goh/getting-started-with-openshift-on-windows-8p3</guid>
      <description>&lt;h1&gt;
  
  
  Step-by-Step Instructions
&lt;/h1&gt;

&lt;h4&gt;
  
  
  1. Register account at &lt;a href="https://www.redhat.com/en" rel="noopener noreferrer"&gt;Redhat&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  2. Go &lt;a href="https://console.redhat.com/openshift/create/local" rel="noopener noreferrer"&gt;Console&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  3. Download OpenShift local
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjpvx8phyuyu5cz3wrvo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjpvx8phyuyu5cz3wrvo0.png" alt="console" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Unzipped the downloaded folder at C:\Users\username\crc
&lt;/h4&gt;

&lt;h4&gt;
  
  
  5. Open Powershell and run &lt;code&gt;crc setup&lt;/code&gt;. Will take awhile to setup.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crc setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fqjoq9ihd0hdrt22msd17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqjoq9ihd0hdrt22msd17.png" alt="setup" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6. After setup is down run &lt;code&gt;crc start&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crc start
// &lt;span class="k"&gt;if &lt;/span&gt;face error
crc start &lt;span class="nt"&gt;--log-level&lt;/span&gt; debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;It will eventually prompt you for the &lt;code&gt;pull secret&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy from the console and right-click to paste to the terminal.&lt;/li&gt;
&lt;li&gt;It will then take awhile to start up the container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fpj4jv28rc2hdxi9ngym0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fpj4jv28rc2hdxi9ngym0.png" alt="Image description" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Test that Openshift Cli oc is properly installed.
&lt;/h4&gt;

&lt;p&gt;Copy and paste 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;oc login &lt;span class="nt"&gt;-u&lt;/span&gt; developer https://api.crc.testing:6443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  8. Head over to &lt;a href="https://developers.redhat.com/developer-sandbox" rel="noopener noreferrer"&gt;Sandbox&lt;/a&gt; and start a 30-day trial sandbox account.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxjybo3y180xxhwmkmdxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxjybo3y180xxhwmkmdxl.png" alt="Image description" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  9. Login to your sandbox once provisioned and download oc CLI
&lt;/h4&gt;

&lt;p&gt;Extract the file and save it to "C:\Users\username\oc-folder" or any preferred location.&lt;br&gt;
&lt;a href="https://media2.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%2Fwcjwzi0wi4jswjb8bsil.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwcjwzi0wi4jswjb8bsil.png" alt="Image description" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  10. Add the oc CLI file path to the environment variables
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fub8eb8ehj1f0g4r5ruhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fub8eb8ehj1f0g4r5ruhi.png" alt="Image description" width="700" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  11. Open powershell and run &lt;code&gt;oc&lt;/code&gt; to verify.
&lt;/h4&gt;

&lt;h4&gt;
  
  
  12. Logging into sandbox via cli
&lt;/h4&gt;

&lt;p&gt;Go over to sandbox console and copy login command&lt;br&gt;
This will open a new tab with your API token and login command.&lt;br&gt;
&lt;a href="https://media2.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%2F6bajl89fyy44rbowp2ll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6bajl89fyy44rbowp2ll.png" alt="Image description" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>redhat</category>
      <category>openshift</category>
      <category>sandbox</category>
      <category>windows</category>
    </item>
    <item>
      <title>Create Lambda function using AWS CloudShell</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Sun, 24 Sep 2023 17:17:46 +0000</pubDate>
      <link>https://dev.to/kenji_goh/create-lambda-function-using-aws-cloudshell-594l</link>
      <guid>https://dev.to/kenji_goh/create-lambda-function-using-aws-cloudshell-594l</guid>
      <description>&lt;h3&gt;
  
  
  1. Access CloudShell from Lambda Console
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdg2v06grahgeoyevmmpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdg2v06grahgeoyevmmpf.png" alt="Image description" width="800" height="213"&gt;&lt;/a&gt;&lt;br&gt;
Since npm is already installed in CloudShell, we can use it to create node_modules.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Create a lambda folder
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;lambda
&lt;span class="nb"&gt;cd &lt;/span&gt;lambda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Open Nano text editor
&lt;/h3&gt;

&lt;p&gt;Run nano index.js to open the nano editing GNU.&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;if &lt;/span&gt;no nano installed &lt;span class="k"&gt;then &lt;/span&gt;run this first
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nano
// &lt;span class="k"&gt;else &lt;/span&gt;just run this
nano index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Copy the following code into the nano GNU
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWSXRay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-xray-sdk-core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;AWSXRay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;captureAWS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;S3&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listBuckets&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;promise&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;&lt;a href="https://media2.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%2F1usm8xfavsk5o1088rdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1usm8xfavsk5o1088rdk.png" alt="Image description" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;Ctrl-X&lt;/code&gt;, &lt;code&gt;Y&lt;/code&gt; and &lt;code&gt;Enter&lt;/code&gt; to exit nano.&lt;br&gt;
We can run the following to double confirm the code has been pasted into index.js&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="nb"&gt;cat &lt;/span&gt;index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2F9q7dbvkxncmnrfin1gjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9q7dbvkxncmnrfin1gjm.png" alt="Image description" width="797" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Install the required Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i aws-xray-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;ll&lt;/code&gt; to check that node_modules exist and the dependencies are indeed being installed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F71f62u1tdromlejd92cv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F71f62u1tdromlejd92cv.png" alt="Image description" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Set proper permission for files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;a+r &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Zip the files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zip &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;.zip &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;ll&lt;/code&gt; again to double check zipped folder is created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fyxhzbuemqre1sv295mvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fyxhzbuemqre1sv295mvw.png" alt="Image description" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Create a IAM role
&lt;/h3&gt;

&lt;p&gt;Since we are using lambda and S3, we need to assign 2 permission policies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWSLambdaBasicExecutionRole&lt;/li&gt;
&lt;li&gt;AmazonS3ReadOnlyAccess&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Name the IAM role as &lt;code&gt;DemoLambdaRole&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhwoiwzyz4ab0z5v9h6pa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhwoiwzyz4ab0z5v9h6pa.png" alt="Image description" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the role ARN&lt;br&gt;
&lt;a href="https://media2.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%2Fgioj2ldl2xivn1fx1u9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgioj2ldl2xivn1fx1u9r.png" alt="Image description" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  9. Use cli to upload the zipped folder to create the lambda function
&lt;/h3&gt;

&lt;p&gt;Remember to replace the ARN with yours&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws lambda create-function &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://function_test.zip &lt;span class="nt"&gt;--function-name&lt;/span&gt; lambda-with-dependencies &lt;span class="nt"&gt;--runtime&lt;/span&gt; nodejs14.x &lt;span class="nt"&gt;--handler&lt;/span&gt; index.handler &lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::023028579192:role/DemoLambdaRole
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fvuyl79ql47q6mozvjilb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvuyl79ql47q6mozvjilb.png" alt="Image description" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refresh the Lambda Functions table and you should see your new lambda being created&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fgofd0zmqdt7jrv2vssdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgofd0zmqdt7jrv2vssdp.png" alt="Image description" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Enable x-ray Tracing
&lt;/h3&gt;

&lt;p&gt;Lastly, since we are using x-ray, we also need to enable x-ray tracing at the lambda function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffdx142imxzu8cbkfye02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffdx142imxzu8cbkfye02.png" alt="Image description" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you enabled x-ray tracing, go back to the IAM &lt;code&gt;DemoLambdaRole&lt;/code&gt; and you will see a new permission policy being assigned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fenne46bo4ec4h2wfsphq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fenne46bo4ec4h2wfsphq.png" alt="Image description" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Test the Lambda
&lt;/h3&gt;

&lt;p&gt;You should see all your S3 buckets being returned, as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1pxmtk321cxyolw1n94d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1pxmtk321cxyolw1n94d.png" alt="Image description" width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Clean up!
&lt;/h3&gt;

&lt;p&gt;Finally, as a good habit, delete the Lambda to save resources. You may also delete the create Role too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3w9o9wn21p52e9j3kcva.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3w9o9wn21p52e9j3kcva.png" alt="Image description" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cheers! &lt;a href="https://www.udemy.com/course/aws-certified-developer-associate-dva-c01/" rel="noopener noreferrer"&gt;Reference&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudshell</category>
      <category>lambda</category>
    </item>
    <item>
      <title>Automate CloudFront Cache Invalidation</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Tue, 15 Aug 2023 13:57:42 +0000</pubDate>
      <link>https://dev.to/kenji_goh/automate-cloudfront-cache-invalidation-4bfm</link>
      <guid>https://dev.to/kenji_goh/automate-cloudfront-cache-invalidation-4bfm</guid>
      <description>&lt;p&gt;If you are using CloudFront distribution to serve your users, it will be good to be able to automate cache invalidation by using this command:&lt;/p&gt;

&lt;p&gt;Replace stackName with the name of your Cloudformation stack.&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;distributionId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws cloudformation describe-stacks &lt;span class="nt"&gt;--stack-name&lt;/span&gt; stackName &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Stacks[0].Outputs[?OutputKey=='DistributionId'].OutputValue"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo &lt;/span&gt;distributionId

aws cloudfront create-invalidation &lt;span class="nt"&gt;--distribution-id&lt;/span&gt; &lt;span class="nv"&gt;$distributionId&lt;/span&gt; &lt;span class="nt"&gt;--paths&lt;/span&gt; &lt;span class="s2"&gt;"/*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>aws</category>
      <category>cloudfront</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>2 ways to create Lambda with Cloudformation</title>
      <dc:creator>KenjiGoh</dc:creator>
      <pubDate>Mon, 17 Jul 2023 14:32:49 +0000</pubDate>
      <link>https://dev.to/kenji_goh/2-ways-to-create-lambda-with-cloudformation-5gil</link>
      <guid>https://dev.to/kenji_goh/2-ways-to-create-lambda-with-cloudformation-5gil</guid>
      <description>&lt;h2&gt;
  
  
  1. Inline Code
&lt;/h2&gt;

&lt;p&gt;Cloudformation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;AWSTemplateFormatVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010-09-09"&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lambda inline code&lt;/span&gt;
&lt;span class="na"&gt;Resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;MyInlineLambda&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Lambda::Function&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;Runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python3.x&lt;/span&gt;
      &lt;span class="na"&gt;Role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789012:role/lambda-role&lt;/span&gt;
      &lt;span class="na"&gt;Handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;index.handler&lt;/span&gt;
      &lt;span class="na"&gt;Code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ZipFile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;import os&lt;/span&gt;

          &lt;span class="s"&gt;DB_URL = os.getenv("DB_URL")&lt;/span&gt;
          &lt;span class="s"&gt;db_client = db.connect(DB_URL)&lt;/span&gt;
          &lt;span class="s"&gt;def handler(event, context):&lt;/span&gt;
            &lt;span class="s"&gt;user = db_client.get(user_id = event["user_id"])&lt;/span&gt;
            &lt;span class="s"&gt;return user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Through Zip File on S3
&lt;/h2&gt;

&lt;p&gt;Cloudformation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;AWSTemplateFormatVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010-09-09"&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lambda from S3&lt;/span&gt;
&lt;span class="na"&gt;Resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;MyLambdaFromS3&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Lambda::Function&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;Runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nodejs18.x&lt;/span&gt;
      &lt;span class="na"&gt;Role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789012:role/lambda-role&lt;/span&gt;
      &lt;span class="na"&gt;Handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;index.handler&lt;/span&gt;
      &lt;span class="na"&gt;Code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;S3Bucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;some-bucket&lt;/span&gt;
        &lt;span class="na"&gt;S3Key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;function.zip&lt;/span&gt;
        &lt;span class="na"&gt;S3ObjectVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;String&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Serverless Framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-service&lt;/span&gt;

&lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;individually&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;functions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hello&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;com.serverless.Handler&lt;/span&gt;
    &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;s3://some-bucket/path/to/function.zip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>aws</category>
    </item>
  </channel>
</rss>
