<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Choonho Son</title>
    <description>The latest articles on Forem by Choonho Son (@choonho).</description>
    <link>https://forem.com/choonho</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%2F1058664%2F7851c324-80c0-42ba-817b-1df68f10c598.png</url>
      <title>Forem: Choonho Son</title>
      <link>https://forem.com/choonho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/choonho"/>
    <language>en</language>
    <item>
      <title>Mindmap Tool: A Free Mindmap SaaS service</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Sat, 15 Nov 2025 08:47:53 +0000</pubDate>
      <link>https://forem.com/choonho/mindmap-ziin-a-free-mindmap-5340</link>
      <guid>https://forem.com/choonho/mindmap-ziin-a-free-mindmap-5340</guid>
      <description>&lt;p&gt;advancd.ai started as a scratch pad for visual thinkers and turned into a polished, free SaaS built by a tiny team obsessed with flow. If you spend more time prepping your canvas than capturing ideas, this one’s for you.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://advancd.ai/share/share_2NSpW4cZtMaWpYNkbcLMRdaMLToU0Pir" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;advancd.ai&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&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%2Fkd1bjijsste3ubnzd3sb.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%2Fkd1bjijsste3ubnzd3sb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it feels different
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instantly ready workspace&lt;/strong&gt;
Open the editor and a centered root node, zoom-fit canvas, and shortcut hints are already in place. No toolbars to rearrange or zoom to rescale.&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%2Fzgh04zn8e7qbgzl0yo3b.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%2Fzgh04zn8e7qbgzl0yo3b.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard-native UX&lt;/strong&gt;
&lt;code&gt;Enter&lt;/code&gt; toggles inline edit, &lt;code&gt;Tab&lt;/code&gt; adds a child, &lt;code&gt;A&lt;/code&gt; adds a standalone node, &lt;code&gt;M&lt;/code&gt; opens the context menu near your focus, and the arrow keys walk connected nodes or edges. You can map an entire sprint with barely a mouse click.&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%2Ftrbsjp4thxiyjpsoztot.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%2Ftrbsjp4thxiyjpsoztot.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rich nodes and edges&lt;/strong&gt;
Images, PDFs, embeds, and draggable edge inspectors all live directly on the canvas. PDF nodes include a built-in viewer modal so you can present without popping out of the map.&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%2Fum2nj8bi05w1zswfq6bx.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%2Fum2nj8bi05w1zswfq6bx.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smart sharing&lt;/strong&gt;
Each map is versioned in its own Git branch (GitHub or local Git). Flip a share badge when you’re ready, or stay private in guest mode—the data lives in your repo.&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%2Fx2fazqb5t7zxm3uhkztt.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%2Fx2fazqb5t7zxm3uhkztt.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Version history you can trust
&lt;/h3&gt;

&lt;p&gt;Every save is a Git commit. If you ever need to revisit past thinking, the version view lets you jump back to any earlier state to inspect it before deciding what to restore.&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%2Fon4wjbxky2sragj9bn5j.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%2Fon4wjbxky2sragj9bn5j.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Get started
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign in (or stay in guest mode).&lt;/li&gt;
&lt;li&gt;Create a map; the root node is created and auto-saved so you never lose the blank slate.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Tab&lt;/code&gt;, &lt;code&gt;Enter&lt;/code&gt;, and &lt;code&gt;M&lt;/code&gt; to run. Paste images or drag PDFs as needed.&lt;/li&gt;
&lt;li&gt;When you want to share, hit save—Git commits the branch, and share badges appear in both the dashboard and editor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mindmap Ziin is free to use, easy to self-host, and built openly with the community. If you like mind maps that feel more like thinking and less like wrangling tooling, give it a spin and let us know what you build.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://advancd.ai" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;advancd.ai&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&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%2Fe9d6bshfx09voxj7p3t0.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%2Fe9d6bshfx09voxj7p3t0.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ux</category>
      <category>tooling</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The Identity of OpenStack, Keystone</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Fri, 27 Sep 2024 09:54:14 +0000</pubDate>
      <link>https://forem.com/choonho/openstack-keystone-c6j</link>
      <guid>https://forem.com/choonho/openstack-keystone-c6j</guid>
      <description>&lt;h1&gt;
  
  
  Keystone, the heart of OpenStack's Identity
&lt;/h1&gt;

&lt;p&gt;Authentication, Authorization is the starting point of API call. IAM in AWS, GCP, or Azure is core component for Authentication and Authorization. In the OpenStack, keystone works as IAM.&lt;/p&gt;

&lt;p&gt;I want to understand how keystone works?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The basic concept of Authentication, Authorization in the micro service architecture is 1) there is a central identity which publishs token, 2) all other micro services validate token(authentication) and check permission (authorization) &lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  Keystone v2 and v3
&lt;/h2&gt;

&lt;p&gt;Keystone v3 supports Domain and Project&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Token Types
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Support From&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UUID&lt;/td&gt;
&lt;td&gt;32-bit UUID, Just random number&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FERNET&lt;/td&gt;
&lt;td&gt;256Bytes, symmetric encryption and signing&lt;/td&gt;
&lt;td&gt;Kilo (default since Queens)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JWS&lt;/td&gt;
&lt;td&gt;JSON Web Token, asymmetric cryptography&lt;/td&gt;
&lt;td&gt;Stein&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Fernet and JWS has no databased backed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UUID
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[token]
provider = keystone.token.providers.uuid.Provider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  FERNET (Cryptographic Authentication Method)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[token]
provider = keystone.token.providers.fernet.Provider
[fernet_tokens]
key_repository = /etc/keystone/fernet-keys/
max_active_keys = &amp;lt;number of keys&amp;gt; # defaults is 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  JWS (JSON Web Signature)
&lt;/h3&gt;

&lt;p&gt;a type of JWT (JSON Web Token)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[token]
provider = jws
[jwt_tokens]
jws_public_key_repository = /etc/keystone/jws-keys/public
jws_private_key_repository = /etc/keystone/jws-keys/private
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;h2&gt;
  
  
  Token Scope
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Un-scoped&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System&lt;/td&gt;
&lt;td&gt;interacting with resources at the system level, usually admin only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;Users and Groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;users to work on items that fit withinn a project scope&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  Reference
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Integrating Keystone with large-scale centralized authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/DKOJ-UToCKM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How OpenStack's Keystone handles authentication and authorization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.redhat.com/sysadmin/keystone-identity-openstack" rel="noopener noreferrer"&gt;https://www.redhat.com/sysadmin/keystone-identity-openstack&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep Dive into Keystone Tokens and Lessons Learned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.slideshare.net/slideshow/deep-dive-into-keystone-tokens-and-lessons-learned/54414862" rel="noopener noreferrer"&gt;https://www.slideshare.net/slideshow/deep-dive-into-keystone-tokens-and-lessons-learned/54414862&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keystone JWS Tokens Past, Present, and Future&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zxsrkABzwOg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Complete Guide to OpenID Connect in OpenStack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GiLcKjuTyi0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Nitro Card, Why AWS is best!</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Fri, 28 Jun 2024 07:47:03 +0000</pubDate>
      <link>https://forem.com/choonho/nitro-card-why-aws-is-best-46ph</link>
      <guid>https://forem.com/choonho/nitro-card-why-aws-is-best-46ph</guid>
      <description>&lt;p&gt;One of my interesting area is a virtualization. It is very complicated area in computer science and hardware. Why AWS is so special compared with Google Cloud and Microsoft Azure. Some people said that "First Mover Advantage"&lt;/p&gt;

&lt;p&gt;Generally speaking, Yes. But from the point of computer scientist, I think AWS Nitro is the key technology. There is no similar technology in Google Cloud and Microsoft Azure. But the detailed information is not well documented. I want to summarize the Nitro Card. This is my understanding from the AWS re-invent.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Secret Sauce, Annapurna Labs
&lt;/h1&gt;

&lt;p&gt;In Early 2010, the performance of AWS EC2 instance was not different other Companies, since commodity hardware and open-source Xen hypervisor would have been used. To overcome the performance bottleneck of virtualization, IO virtualization was the key technical area. At that time, everyone said about SR-IOV for network interface.&lt;/p&gt;

&lt;p&gt;In 2015, the partnership opportunity between AWS and Annapurna Labs launched AWS EC2 C4 instance family, the network virtualization to custom hardware and ASIC optimized for storage services.&lt;/p&gt;

&lt;p&gt;In 2016, Amazon announced that it is acquiring the Israeli startup, Annapurna Labs.&lt;/p&gt;

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

&lt;p&gt;With Annapurna Labs, AWS introduced Storage Virtualization.&lt;/p&gt;

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

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

&lt;h1&gt;
  
  
  EC2 C4 instance type
&lt;/h1&gt;

&lt;p&gt;EC2 C4 has traditional Xen hypervisor and Intel SR-IOV.&lt;br&gt;
In C4 instance type, block storage looks like scsi disk not NVMe.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;h1&gt;
  
  
  Hypervisor Info
&lt;/h1&gt;

&lt;p&gt;[    0.000000] DMI: Xen HVM domU, BIOS 4.11.amazon 08/24/2006&lt;br&gt;
[    0.000000] Hypervisor detected: Xen HVM&lt;br&gt;
[    0.000000] Xen version 4.11.&lt;/p&gt;
&lt;h1&gt;
  
  
  Block Device
&lt;/h1&gt;

&lt;p&gt;[    0.858936] blkfront: xvda: barrier or flush: disabled; persistent grants: disabled; indirect descriptors: enabled; bounce buffer: disabled;&lt;br&gt;
[    0.859416] scsi host1: ata_piix&lt;br&gt;
[    0.863963] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc000 irq 14 lpm-pol 0&lt;br&gt;
[    0.866375] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc008 irq 15 lpm-pol 0&lt;br&gt;
[    0.867267]  xvda: xvda1 xvda14 xvda15 xvda16&lt;/p&gt;
&lt;h1&gt;
  
  
  SR-IOV intel NIC
&lt;/h1&gt;

&lt;p&gt;[    4.511853] ixgbevf: Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver&lt;br&gt;
[    4.511857] ixgbevf: Copyright (c) 2009 - 2018 Intel Corporation.&lt;br&gt;
[    4.535946] ixgbevf 0000:00:03.0: 02:64:96:26:40:13&lt;br&gt;
[    4.535949] ixgbevf 0000:00:03.0: MAC: 1&lt;br&gt;
[    4.535951] ixgbevf 0000:00:03.0: Intel(R) 82599 Virtual Function&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  PCI Devices&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;root@ip-172-31-30-241:~# lspci&lt;br&gt;
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC &lt;a href="https://dev.torev%2002"&gt;Natoma&lt;/a&gt;&lt;br&gt;
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]&lt;br&gt;
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]&lt;br&gt;
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 01)&lt;br&gt;
00:02.0 VGA compatible controller: Cirrus Logic GD 5446&lt;br&gt;
00:03.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)&lt;br&gt;
00:1f.0 Unassigned class [ff80]: XenSource, Inc. Xen Platform Device (rev 01)&lt;br&gt;
In EC2 C4 instance type, there is no Nitro System.&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Intel 82599 10GbE&lt;br&gt;
&lt;/h3&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Intel 82599 10G gigabit Ethernet Controller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launch Date&lt;/td&gt;
&lt;td&gt;Q2'09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lithography&lt;/td&gt;
&lt;td&gt;65 nm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Interface Type&lt;/td&gt;
&lt;td&gt;PCIe v2.0 (5.0 GT/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  EC2 C5 Instance
&lt;/h1&gt;

&lt;p&gt;AWS Nitro System was adopted from EC2 C5 instance.&lt;br&gt;
With the Nitro System, AWS changed the hypervisor from Xen to KVM.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;h1&gt;
  
  
  KVM Hypervisor
&lt;/h1&gt;

&lt;p&gt;[    0.000000] efi: EFI v2.7 by EDK II&lt;br&gt;
[    0.000000] efi: SMBIOS=0xbbe6a000 ACPI=0xbbf5d000 ACPI 2.0=0xbbf5d014 MEMATTR=0xba3f0518 MOKvar=0xbbe58000 INITRD=0xb9ecdf18&lt;br&gt;
[    0.000000] secureboot: Secure boot disabled&lt;br&gt;
[    0.000000] SMBIOS 2.7 present.&lt;br&gt;
[    0.000000] DMI: Amazon EC2 c5.large/, BIOS 1.0 10/16/2017&lt;br&gt;
[    0.000000] Hypervisor detected: KVM&lt;/p&gt;

&lt;p&gt;[    0.014734] Booting paravirtualized kernel on KVM&lt;br&gt;
[    0.202690] smpboot: CPU0: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz (family: 0x6, model: 0x55, stepping: 0x7)&lt;/p&gt;
&lt;h1&gt;
  
  
  NVMe
&lt;/h1&gt;

&lt;p&gt;[    0.455535] nvme nvme0: pci function 0000:00:04.0&lt;br&gt;
[    0.465281] nvme nvme0: 2/0/0 default/read/poll queues&lt;br&gt;
[    0.469270]  nvme0n1: p1 p14 p15 p16&lt;br&gt;
[    0.992904] EXT4-fs (nvme0n1p1): mounted filesystem 6387caa1-122f-48bc-b447-9f1386d06e06 ro with ordered data mode. Quota mode: none.&lt;br&gt;
[    2.899354] EXT4-fs (nvme0n1p1): re-mounted 6387caa1-122f-48bc-b447-9f1386d06e06 r/w. Quota mode: none.&lt;br&gt;
[    3.729719] EXT4-fs (nvme0n1p16): mounted filesystem 9d39f3ff-b465-4c20-9ec1-06182226356c r/w with ordered data mode. Quota mode: none.&lt;/p&gt;
&lt;h1&gt;
  
  
  Elastic Network Adaptor
&lt;/h1&gt;

&lt;p&gt;[    3.409564] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1&lt;br&gt;
[    3.430162] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0510000, mac addr 06:4e:11:f5:80:6b&lt;br&gt;
[    3.466230] ena 0000:00:05.0 ens5: renamed from eth0&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  PCI Devices&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;root@ip-172-31-44-203:~# lspci&lt;br&gt;
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma]&lt;br&gt;
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]&lt;br&gt;
00:01.3 Non-VGA unclassified device: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)&lt;br&gt;
00:03.0 VGA compatible controller: Amazon.com, Inc. Device 1111&lt;br&gt;
00:04.0 Non-Volatile memory controller: Amazon.com, Inc. NVMe EBS Controller&lt;br&gt;
00:05.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  NVMe&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;00:04.0 Non-Volatile memory controller: Amazon.com, Inc. NVMe EBS Controller (prog-if 02 [NVM Express])&lt;br&gt;
Subsystem: Amazon.com, Inc. NVMe EBS Controller&lt;br&gt;
Physical Slot: 4&lt;br&gt;
Latency: 0&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Interrupt: pin A routed to IRQ 11&lt;br&gt;
Region 0: Memory at c0514000 (32-bit, non-prefetchable) [size=16K]&lt;br&gt;
Capabilities: [70] Express (v2) Endpoint, MSI 00&lt;br&gt;
PBA: BAR=0 offset=00003000&lt;br&gt;
Kernel driver in use: nvme&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  AWS ENA Network Interface Card&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;ENA does not provide Link Speed. From the Linux Kernel, single ENA driver can provides 10GbE, 25GbE, or 40GbE.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;00:05.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)&lt;br&gt;
Physical Slot: 5&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Capabilities: [b0] MSI-X: Enable+ Count=9 Masked-&lt;br&gt;
Vector table: BAR=0 offset=00002000&lt;br&gt;
PBA: BAR=0 offset=00003000&lt;br&gt;
Kernel driver in use: ena&lt;br&gt;
Kernel modules: ena&lt;/p&gt;

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

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  AWS Nitro Server&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;2023 AWS re-invent, AWS describe the Nitro Server in "A Deep dive on AWS infrastructure powering the generative AI boom", &lt;a href="https://d1.awsstatic.com/events/Summits/reinvent2023/CMP201_A-deep-dive-on-AWS-infrastructure-powering-the-generative-AI-boom.pdf" rel="noopener noreferrer"&gt;https://d1.awsstatic.com/events/Summits/reinvent2023/CMP201_A-deep-dive-on-AWS-infrastructure-powering-the-generative-AI-boom.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two Nitro Cards, 1x primary and 1x networking.&lt;/p&gt;

&lt;p&gt;From the image and form factor, this nitro card is nitro v3. But these two nitro cards have a little different from size and color.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front panel cabling: most of commodity server has back panel cabling. But AWS has front panel cabling.&lt;/li&gt;
&lt;li&gt;No Power Unit: in the back side there is no power unit. This means AWS Nitro server uses DC power instead of AC.&lt;/li&gt;
&lt;li&gt;No SSD: From the image, I can't find any SSD like NVMe. This means the root volume of EC2 instance is not located at local SSD. Nitro Card provides Instance Store remotely.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;After watching two different Nitro Cards, my question was what is the functionality of each Nitro Cards?&lt;/p&gt;

&lt;p&gt;The hint can be founded in AWS Outpost.&lt;/p&gt;

&lt;h1&gt;
  
  
  Nitro Cards cabling
&lt;/h1&gt;

&lt;p&gt;AWS Outpost uses same hardware in AWS Data Center.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;IPMI UTP cable: Left green UTP cable is IPMI port&lt;/li&gt;
&lt;li&gt;Orange UTP in left Nitro Card: Nitro Controller APIs. EC2 control plane network.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;From the above feature, there is a EC2 VM with single ENA, EBS, Local Storage. The Local Storage and EBS may be processed by right Nitro Card. The ENA may be processed by left Nitro Card.&lt;/p&gt;

&lt;h3&gt;
  
  
  No 802.11ad Bonding interface
&lt;/h3&gt;

&lt;p&gt;One of hardware challenges are no redundancy for Nitro Card failure. Commodity server usually make bonding interface coupling two physical interfaces to single logical interface. But AWS Nitro Server does not make bonding interface.&lt;br&gt;
But this is an understandable architecture, since network interface and storage device are PCIe devices with SR-IOV.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hidden Technology, PCIe with single root complex
&lt;/h1&gt;

&lt;p&gt;Remote NVMe via Nitro Card is one of the key technologies in AWS. &lt;/p&gt;

&lt;p&gt;In the commodity hardware and standard, we need PCIe switch and separate PCI express networking equipments with MR-IOV (multi root complex) support. But Nitro Card do all these features in the Ethernet networking.&lt;/p&gt;

&lt;h1&gt;
  
  
  Who is the next Annapurna Labs
&lt;/h1&gt;

&lt;p&gt;We call this kind of Nitro Card as SmartNIC or DPU(Data Processing Unit),a new class of programmable processor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nvidia BlueField-3
&lt;/h3&gt;

&lt;p&gt;Nvidia acquired Mellanox in 2020 &lt;/p&gt;

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

&lt;h3&gt;
  
  
  AMD Pendando DSC
&lt;/h3&gt;

&lt;p&gt;AMD acquired Pensando for its DPU Future in 2022&lt;/p&gt;

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

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>nvidia</category>
      <category>smartnic</category>
    </item>
    <item>
      <title>Apple Silicon, State-of-the-art ARM CPU</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Fri, 21 Jun 2024 02:12:03 +0000</pubDate>
      <link>https://forem.com/choonho/apple-silicon-state-of-the-art-arm-cpu-4131</link>
      <guid>https://forem.com/choonho/apple-silicon-state-of-the-art-arm-cpu-4131</guid>
      <description>&lt;p&gt;My Macbook air has M2 CPU. I want to deploy my Cloudforet application in my Macbook. But we have only X86 docker image, because github does not support ARM linux runner for github action. There is a way for building X86 and ARM docker image in one command, but it takes too much time. Because it is a cross compilation for ARM image build in X86 machine.&lt;/p&gt;

&lt;p&gt;Suddenly, I just want to know about ARM CPU.&lt;/p&gt;

&lt;h1&gt;
  
  
  Apple Silicon
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CPU Version&lt;/th&gt;
&lt;th&gt;ARM Instruction Set&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Release Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apple M1&lt;/td&gt;
&lt;td&gt;ARMv8.5-A (3.2 GHz)&lt;/td&gt;
&lt;td&gt;5nm TSMC&lt;/td&gt;
&lt;td&gt;Nov. 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple M2&lt;/td&gt;
&lt;td&gt;ARMv8.6-A (3.49 GHz)&lt;/td&gt;
&lt;td&gt;5nm TSMC&lt;/td&gt;
&lt;td&gt;Jun. 2022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple M3&lt;/td&gt;
&lt;td&gt;ARMv8.6-A (4.05 GHz)&lt;/td&gt;
&lt;td&gt;3nm TSMC&lt;/td&gt;
&lt;td&gt;Oct. 2023&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple M4&lt;/td&gt;
&lt;td&gt;ARMv9.2-A&lt;/td&gt;
&lt;td&gt;3nm TSMC&lt;/td&gt;
&lt;td&gt;May  2024&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  AWS
&lt;/h1&gt;

&lt;p&gt;AWS provides Graviton instance&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CPU Version&lt;/th&gt;
&lt;th&gt;ARM Instruction Set&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Release Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graviton&lt;/td&gt;
&lt;td&gt;ARMv8-A (2.3 GHz)&lt;/td&gt;
&lt;td&gt;16nm TSMC&lt;/td&gt;
&lt;td&gt;Nov. 2018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton2&lt;/td&gt;
&lt;td&gt;ARMv8.2-A (2.5 GHz, Neoverse N1)&lt;/td&gt;
&lt;td&gt;7nm TSMC&lt;/td&gt;
&lt;td&gt;Dec. 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton3&lt;/td&gt;
&lt;td&gt;ARMv8.4-A (2.6 GHz, Neoverse v1)&lt;/td&gt;
&lt;td&gt;5nm TSMC&lt;/td&gt;
&lt;td&gt;May 2022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graviton4&lt;/td&gt;
&lt;td&gt;ARMv9.0-A (2.7 GHz, Neoverse v2)&lt;/td&gt;
&lt;td&gt;4nm TSMC&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In EC2 instances, 7 generation is Graviton3, 8 generation is Graviton4.&lt;br&gt;
For example c7g.large is 2 vcores, 4GB memory Graviton3 CPU instance.&lt;/p&gt;

&lt;h1&gt;
  
  
  Google Cloud
&lt;/h1&gt;

&lt;p&gt;Google Cloud also provides ARM VM.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CPU Version&lt;/th&gt;
&lt;th&gt;ARM Instruction Set&lt;/th&gt;
&lt;th&gt;Manufacturer&lt;/th&gt;
&lt;th&gt;Release Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ampere Altra&lt;/td&gt;
&lt;td&gt;ARMv8.2-A (3.0 GHz, Neoverse N1)&lt;/td&gt;
&lt;td&gt;7nm TSMC&lt;/td&gt;
&lt;td&gt;July 2022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Axion&lt;/td&gt;
&lt;td&gt;ARMv9.0-A (Neoverse V2)&lt;/td&gt;
&lt;td&gt;TSMC&lt;/td&gt;
&lt;td&gt;Apr. 2024&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  Apple, State-of-the-art
&lt;/h1&gt;

&lt;p&gt;From the ARM Instruction Set and Manufacturing technology, Apple adopts the latest technology in the world. The clock speed of Apple Silicon is unbelievable.&lt;/p&gt;

&lt;p&gt;Is it real?&lt;/p&gt;

&lt;p&gt;In MacOS, "sudo powermetrics" can see the System Information. From the log, CPU speed is adaptive on workload. In Apple Silicon, there are two type of CPUs. E-Cluster and P-Cluster. E means "efficiency" and P means "Performance".&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;****&lt;/span&gt; Processor usage &lt;span class="k"&gt;****&lt;/span&gt;

E-Cluster HW active frequency: 999 MHz
CPU 0 frequency: 1113 MHz
CPU 1 frequency: 1079 MHz
CPU 2 frequency: 1082 MHz
CPU 3 frequency: 1132 MHz

P-Cluster HW active frequency: 711 MHz
CPU 4 frequency: 2249 MHz
CPU 5 frequency: 2137 MHz
CPU 6 frequency: 3058 MHz
CPU 7 frequency: 2624 MHz


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

&lt;/div&gt;

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

&lt;h1&gt;
  
  
  What is Neoverse?
&lt;/h1&gt;

&lt;p&gt;Neoverse is an ARM CPU architecture for server-class for datacenter, edge-computing, and high-performance computing.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Neoverse V2 CPU
&lt;/h2&gt;

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

&lt;h1&gt;
  
  
  Who design custom ARM CPU?
&lt;/h1&gt;

&lt;p&gt;AWS and Google has their own ARM CPU, Graviton, Ampere and Axion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Annapururna Labs
&lt;/h3&gt;

&lt;p&gt;Amazon acquires Annapururna Labs, an Israeli microelectronics company in January 2015. Annapururna Labs launched AWS Nitro hardware, Graviton, Trainium, and Inferentia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ampere Computing
&lt;/h3&gt;

&lt;p&gt;Google Cloud and Azure uses Ampere Altra ARM CPU, which is designed by Ampere Computing LLC.&lt;/p&gt;

&lt;p&gt;Ampere Computing is an American fabless semiconductor company founded in 2017. Renne James is CEO, ex-President of Intel.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Google Silicon
&lt;/h3&gt;

&lt;p&gt;Google also has their own Silicon design team, they launched Tensor Processing Units in 2015. Google's first ARM-based CPU is Axion&lt;/p&gt;

&lt;h1&gt;
  
  
  Intel's alien moved to ARM
&lt;/h1&gt;

&lt;p&gt;Intel has been an indispensable company in CPU design, there were rumors that Intel CPUs were designed by aliens. Now that alien moved to ARM!&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Intel Corp Stock Market
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  ARM Stock Market
&lt;/h3&gt;

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

&lt;h1&gt;
  
  
  Develop in Macbook Apple Silicon, Launch ARM Kubernetes.
&lt;/h1&gt;

</description>
      <category>arm</category>
      <category>apple</category>
      <category>aws</category>
      <category>gcp</category>
    </item>
    <item>
      <title>Cloudforet 101: Provider &amp; Service Accounts</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Wed, 19 Jun 2024 08:19:59 +0000</pubDate>
      <link>https://forem.com/choonho/cloudforet-101-provider-service-accounts-412j</link>
      <guid>https://forem.com/choonho/cloudforet-101-provider-service-accounts-412j</guid>
      <description>&lt;p&gt;In the Cloudforet a series of LinuxFoundation Open Source Project, the key concept for resources is "Provider" and "Service Account"&lt;/p&gt;

&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;A provider is the overarching entity that offers resources, within which multiple service accounts exist. These service accounts are used to securely and efficiently access the resources provided by the provider.Concept of Provider and Service Accounts&lt;/p&gt;

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

&lt;h1&gt;
  
  
  User Experience: Console
&lt;/h1&gt;

&lt;p&gt;In the Cloudforet console web page, Provider and Service Accounts can be seen at "Home &amp;gt; Asset Inventory &amp;gt; Service Account"&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Provider
&lt;/h1&gt;

&lt;p&gt;In the context of Cloudforet, a provider is a top-level entity that groups a range of resources. Providers can include cloud providers like Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure, as well as any entity that groups together like software_licence.&lt;/p&gt;

&lt;h1&gt;
  
  
  Service Account
&lt;/h1&gt;

&lt;p&gt;A service account functions as an identifier for a group of resources within a provider. This means that the service account is used as primary key for distinguishing a specific set of resources.&lt;/p&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://cloudforet.io/docs/concepts/identity/provider/" rel="noopener noreferrer"&gt;https://cloudforet.io/docs/concepts/identity/provider/&lt;/a&gt;&lt;br&gt;
cloudforet: &lt;a href="https://cloudforet.io" rel="noopener noreferrer"&gt;https://cloudforet.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>cloudforet</category>
      <category>aws</category>
      <category>gcp</category>
    </item>
    <item>
      <title>Discord Webhook</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Tue, 11 Jun 2024 06:31:10 +0000</pubDate>
      <link>https://forem.com/choonho/discord-webhook-39la</link>
      <guid>https://forem.com/choonho/discord-webhook-39la</guid>
      <description>&lt;p&gt;Discord webhooks are a powerful way to send messages and updates from external sources into your Discord channels. Whether you're integrating with a CI/CD pipeline, receiving alerts from a monitoring system, or simply automating messages, webhooks are an efficient solution. In this blog post, we'll walk you through the process of creating a webhook in Discord and how to send messages to it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 1. Create Webhook
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;1.1 Open Your Discord Server&lt;/strong&gt;&lt;br&gt;
First, navigate to the Discord server where you want to create the webhook. You must have the appropriate permissions to manage webhooks in the channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.2 Access Channel Settings&lt;/strong&gt;&lt;br&gt;
Go to the specific channel where you want the webhook to send messages. Click on the gear icon (⚙️) next to the channel name to open the channel settings.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.3 Navigate to Integrations&lt;/strong&gt;&lt;br&gt;
In the channel settings, select the "Integrations" tab from the sidebar. Here, you’ll see an option to create a new webhook.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.4 Create a Webhook&lt;/strong&gt;&lt;br&gt;
Click the "Create Webhook" button. You’ll be prompted to set up your webhook:&lt;/p&gt;

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

&lt;p&gt;Name: Choose a name for your webhook. This will be displayed as the sender of the messages.&lt;br&gt;
Channel: Select the channel where the messages will be sent. By default, it’s the channel you accessed the settings from.&lt;br&gt;
Avatar: Optionally, you can set an avatar for your webhook.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.5 Copy Webhook URL&lt;/strong&gt;&lt;br&gt;
After setting up your webhook, click the "Copy Webhook URL" button. This URL is crucial as it will be used to send messages to this webhook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn83mn7o8rp2mtpyveu27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn83mn7o8rp2mtpyveu27.png" alt="Image description" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Step 2: Sending Messages to the Webhook
&lt;/h1&gt;

&lt;p&gt;Now that you have your webhook URL, you can send messages to it using a simple HTTP POST request. Here's a basic example using Python and the requests library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import requests

webhook_url = 'YOUR_WEBHOOK_URL'

embed = {
    "title": "Sample Embed",
    "description": "This is an example of an embedded message.",
    "color": 16711680,  # Red color in RGB
    "fields": [
        {"name": "Field 1", "value": "This is field 1", "inline": True},
        {"name": "Field 2", "value": "This is field 2", "inline": True},
    ]
}

data = {
    "content": "This message contains an embed.",
    "embeds": [embed]
}

response = requests.post(webhook_url, json=data)

if response.status_code == 204:
    print("Message sent successfully!")
else:
    print(f"Failed to send message: {response.status_code}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output looks like&lt;/p&gt;

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

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://discord.com/developers/docs/resources/channel#embed-object" rel="noopener noreferrer"&gt;https://discord.com/developers/docs/resources/channel#embed-object&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best Practice: Micro Service Architecture</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Thu, 06 Jun 2024 02:04:43 +0000</pubDate>
      <link>https://forem.com/choonho/best-practice-micro-service-architecture-1p3h</link>
      <guid>https://forem.com/choonho/best-practice-micro-service-architecture-1p3h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cloudforet, a series of LinuxFounation Open Source projects is one of the best practice for Micro Service Architecture and Cloud Native.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Micro Service Architecture
&lt;/h1&gt;

&lt;p&gt;Cloudforet adopts a microservice architecture to provide a scalable and flexible platform. The microservice architecture is a design pattern that structures an application as a collection of loosely coupled services. Each service is self-contained and implements a single business capability. The services communicate with each other through well-defined APIs. This architecture allows each service to be developed, deployed, and scaled independently.&lt;/p&gt;

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

&lt;p&gt;The frontend is a service provided for web users, featuring components such as console and console-api that communicate directly with the web browser. The core logic is structured as independent microservices and operates based on gRPC to ensure high-performance and reliable communication.&lt;/p&gt;

&lt;p&gt;Each core logic can be extended by plugin services. Every plugins are developed and deployed independently, and they can be added, removed or upgraded without affecting the core logic.&lt;/p&gt;

&lt;h1&gt;
  
  
  API-Driven design
&lt;/h1&gt;

&lt;p&gt;API-Driven design in microservice architecture is a pattern where APIs (Application Programming Interfaces) are the primary way that services interact and communicate with each other. This approach emphasizes the design of robust, well-defined, and consistent APIs that serve as the contracts between microservices. Here’s a detailed explanation of the API-Driven design pattern:&lt;/p&gt;

&lt;h3&gt;
  
  
  gRPC as the Communication Protocol
&lt;/h3&gt;

&lt;p&gt;gRPC is a high-performance, open-source, universal RPC (Remote Procedure Call) framework that is widely used in microservice architectures. It uses HTTP/2 as the transport protocol and Protocol Buffers (protobuf) as the interface definition language. gRPC provides features such as bidirectional streaming, flow control, and authentication, making it an ideal choice for building efficient and reliable microservices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loose Coupling
&lt;/h3&gt;

&lt;p&gt;API-Driven design promotes loose coupling between microservices by defining clear and well-documented APIs. Each microservice exposes a set of APIs that define how other services can interact with it. This allows services to evolve independently without affecting each other, making it easier to develop, deploy, and maintain microservices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version control
&lt;/h3&gt;

&lt;p&gt;Cloudforet APIs support two types of versioning, core and plugin version. Core version is for communication between micro services for frontend. plugin version of internal communication in a single micro services for implementing API.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;API Documentation &lt;a href="https://cloudforet.io/api-doc/" rel="noopener noreferrer"&gt;https://cloudforet.io/api-doc/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Protobuf API Specification &lt;a href="https://github.com/cloudforet-io/api" rel="noopener noreferrer"&gt;https://github.com/cloudforet-io/api&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Service-Resource-Verb Pattern
&lt;/h1&gt;

&lt;p&gt;API-Driven design can be effectively explained using the concepts of service, resource, and verb. Here’s how these concepts apply to microservices:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Service
&lt;/h3&gt;

&lt;p&gt;A service in microservice architecture represents a specific business functionality. Each service is a standalone unit that encapsulates a distinct functionality, making it independently deployable, scalable, and maintainable. Services communicate with each other over a network, using lightweight protocols gRPC.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: in the Cloudforet, individual services are identity, repository, or inventory.

&lt;ul&gt;
&lt;li&gt;identity service: manages user authentication and authorization.&lt;/li&gt;
&lt;li&gt;repository service: manages the metadata for plugins and their versions.&lt;/li&gt;
&lt;li&gt;inventory service: manages the resources and their states.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resource
&lt;/h3&gt;

&lt;p&gt;A resource represents the entities or objects that the services manage. Resources are typically data entities that are created, read, updated, or deleted (CRUD operations) by the services.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: in the identity Service, resources include Domain, User, and Workspace.

&lt;ul&gt;
&lt;li&gt;Domain: represents a seperated organization or customer.&lt;/li&gt;
&lt;li&gt;User: represents a user account.&lt;/li&gt;
&lt;li&gt;Workspace: represents a logically isolated group contains resources.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verb
&lt;/h3&gt;

&lt;p&gt;A verb represents the actions or operations that can be performed on resources. These are typically the gRPC methods (get, create, delete, update, list, etc.) in a service. Verbs define what kind of interaction is taking place with a resource.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: in the User resource, verbs include create, get, update, delete, and list.

&lt;ul&gt;
&lt;li&gt;create: creates a new user.&lt;/li&gt;
&lt;li&gt;get: retrieves the user information.&lt;/li&gt;
&lt;li&gt;update: updates the user information.&lt;/li&gt;
&lt;li&gt;delete: deletes the user.&lt;/li&gt;
&lt;li&gt;list: lists all users.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Reference
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Cloudforet &lt;a href="https://cloudforet.io" rel="noopener noreferrer"&gt;https://cloudforet.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cloudforet github &lt;a href="https://github.com/cloudforet-io" rel="noopener noreferrer"&gt;https://github.com/cloudforet-io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>msa</category>
      <category>development</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>[Cloudforet] Enable Azure Billing Plugin</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Mon, 20 May 2024 08:08:19 +0000</pubDate>
      <link>https://forem.com/choonho/cloudforet-enable-azure-billing-plugin-41ln</link>
      <guid>https://forem.com/choonho/cloudforet-enable-azure-billing-plugin-41ln</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Azure Billing Plugin(Ver 1.1.12) is compatible for Cloudforet Ver 1.12&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  1. Register Azure Billing DataSource Plugin
&lt;/h1&gt;

&lt;p&gt;Create azure_data_source.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
name: Azure Cost Management Data Source
data_source_type: EXTERNAL
provider: azure
secret_type: MANUAL
plugin_info:
  plugin_id: plugin-azure-cost-mgmt-cost-datasource
  secret_data:
    client_id: 4e56b0f1-XXXXXXXXXXX
    client_secret: V.18Q~YYYYYYYYYYYYYY
    tenant_id: 8f97eaee-TTTTTTTTTTTTTTT
    billing_account_id: 9fd31315BBBBBBBBBBBBBBBBBB
  options:
    collect_resource_id: true
    currency: USD
  version: 1.1.12
  upgrade_mode: MANUAL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To register DataSource&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spacectl exec register cost_analysis.DataSource -f azure_data_source.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  2. Sync DataSource
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spacectl exec sync cost_analysis.DataSource -p data_source_id=&amp;lt;Data Source ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;client_id, client_secret: &lt;a href="https://github.com/cloudforet-io/plugin-azure-inven-collector/tree/master/docs/en" rel="noopener noreferrer"&gt;https://github.com/cloudforet-io/plugin-azure-inven-collector/tree/master/docs/en&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;billing_account_id: &lt;a href="https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/view-all-accounts#scopes-for-billing-accounts" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/view-all-accounts#scopes-for-billing-accounts&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Cloudforet for Production</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Mon, 13 May 2024 01:55:26 +0000</pubDate>
      <link>https://forem.com/choonho/cloudforet-for-production-3i4d</link>
      <guid>https://forem.com/choonho/cloudforet-for-production-3i4d</guid>
      <description>&lt;p&gt;This guide is for Installation of Cloudforet for Production.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On-premise Kubernetes&lt;/li&gt;
&lt;li&gt;MongoDB Atlas SaaS&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Architecture
&lt;/h1&gt;

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

&lt;h1&gt;
  
  
  Pre-requisite
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Kubernetes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install your own Kubernetes Clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nginx Ingress
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://kubernetes.github.io/ingress-nginx/deploy/" rel="noopener noreferrer"&gt;https://kubernetes.github.io/ingress-nginx/deploy/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MongoDB Cluster
&lt;/h3&gt;

&lt;p&gt;Case 1) MongoDB Atlas&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/feUpigXyVDo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Case 2) MongoDB self-hosted (Helm Chart)&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain Name
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prepare your domain name (In this guide, example.com)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Certificates
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/choonho/install-cert-manager-lets-encrypt-443b"&gt;https://dev.to/choonho/install-cert-manager-lets-encrypt-443b&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SMTP Server
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For sending email notification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.gmass.co/blog/gmail-smtp/" rel="noopener noreferrer"&gt;https://www.gmass.co/blog/gmail-smtp/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Survey on the Feasibility of AI Ops Agents Replacing Human Tasks?</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Thu, 02 May 2024 00:39:00 +0000</pubDate>
      <link>https://forem.com/choonho/survey-on-the-feasibility-of-ai-ops-agents-replacing-human-tasks-1fi6</link>
      <guid>https://forem.com/choonho/survey-on-the-feasibility-of-ai-ops-agents-replacing-human-tasks-1fi6</guid>
      <description>&lt;p&gt;This question aims to investigate the feasibility of Artificial Intelligence Operations (AI Ops) agents replacing human tasks. Your valuable participation will help increase understanding in this field and provide insights into future job transformations.&lt;/p&gt;

&lt;p&gt;Q-1. To what extent do you believe AI Ops agents can replace human tasks?&lt;br&gt;
a) Completely replaceable&lt;br&gt;
b) Replaceable to some extent, but not entirely&lt;br&gt;
c) Hardly replaceable&lt;br&gt;
d) Not replaceable at all&lt;/p&gt;

&lt;p&gt;Q-2. Which types of tasks do you think are most suitable for AI Ops agents? (Multiple choices possible)&lt;br&gt;
a) Data analysis and prediction&lt;br&gt;
b) Incident management and troubleshooting&lt;br&gt;
c) Automated operational tasks&lt;br&gt;
d) Security and compliance&lt;br&gt;
e) Customer support and service desk&lt;br&gt;
Other (please specify)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forms.gle/QQYhS6HQXiLoUiA67" rel="noopener noreferrer"&gt;https://forms.gle/QQYhS6HQXiLoUiA67&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What is Next Item after Terraform?</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Thu, 25 Apr 2024 06:20:20 +0000</pubDate>
      <link>https://forem.com/choonho/what-is-next-item-after-terraform-3j7j</link>
      <guid>https://forem.com/choonho/what-is-next-item-after-terraform-3j7j</guid>
      <description>&lt;p&gt;The transition to the cloud-native era is reshaping today's IT landscape. Consequently, enterprises are adopting hybrid and multi-cloud strategies, utilizing multiple cloud platforms and on-premises infrastructure rather than relying solely on a single cloud platform. To manage and optimize this complexity, integrated tools and platforms are necessary.&lt;/p&gt;

&lt;p&gt;Infrastructure as Code (IaC) tools like Terraform are incredibly useful for provisioning and managing cloud infrastructure. However, in cloud-native environments, management extends beyond infrastructure operations to include areas such as application deployment, monitoring, security, and regulatory compliance. For this reason, enterprises are looking beyond simply provisioning infrastructure and are adopting Multi-Cloud Management Platforms (MCMPs) and similar tools to comprehensively manage and optimize both cloud infrastructure and applications.&lt;/p&gt;

&lt;p&gt;IBM's acquisition of Terraform reflects these market trends. It is expected that IBM will leverage Terraform's capabilities to develop and integrate multi-cloud management platforms. While Terraform will continue to play a significant role in creating and managing infrastructure, integration with tools like MCMPs will be necessary in cloud-native environments.&lt;/p&gt;

&lt;p&gt;Therefore, in the future of cloud management, tools like Terraform and MCMPs are expected to be used together to effectively manage both cloud infrastructure and applications.&lt;/p&gt;

&lt;p&gt;One of the best combination with Terraform will be Cloudforet, An open-source LinuxFoundation Project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloudforet.io" rel="noopener noreferrer"&gt;https://cloudforet.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>cloud</category>
      <category>cloudforet</category>
    </item>
    <item>
      <title>How to Get and Apply AWS Credits: A Step-by-Step Guide</title>
      <dc:creator>Choonho Son</dc:creator>
      <pubDate>Mon, 25 Mar 2024 01:30:40 +0000</pubDate>
      <link>https://forem.com/choonho/how-to-get-and-apply-aws-credits-a-step-by-step-guide-427g</link>
      <guid>https://forem.com/choonho/how-to-get-and-apply-aws-credits-a-step-by-step-guide-427g</guid>
      <description>&lt;h1&gt;
  
  
  1. What are AWS Credits?
&lt;/h1&gt;

&lt;p&gt;AWS credits are a monetary value that can be used to pay for AWS services. AWS offers credits to new and existing customers through various promotional programs.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. How to Get AWS Credits
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;AWS Promotions: AWS offers various promotional programs that provide AWS credits. You can check the current promotions on the AWS website.&lt;/li&gt;
&lt;li&gt;AWS Partners: You can also get AWS credits through AWS partners.&lt;/li&gt;
&lt;li&gt;AWS Training: You can earn AWS credits by completing AWS training courses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  3. How to Apply AWS Credits
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Log in to the AWS Management Console. (by ROOT account)&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Billing and Cost Management&lt;/strong&gt; Service.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;Credits&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Redeem credit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter your Credit Code.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;h1&gt;
  
  
  Use within Expiration Date
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Each credit has its own expiration date.&lt;/li&gt;
&lt;/ul&gt;

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

</description>
    </item>
  </channel>
</rss>
