<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Linn Latt Oo]]></title><description><![CDATA[Linn Latt Oo]]></description><link>https://blogs.linnlattoo.cloud</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1763237883745/46547ff9-65c4-4faf-9d3c-35f667594c2f.jpeg</url><title>Linn Latt Oo</title><link>https://blogs.linnlattoo.cloud</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 01:08:53 GMT</lastBuildDate><atom:link href="https://blogs.linnlattoo.cloud/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Encrypting S3 Objects Using SSE-KMS]]></title><description><![CDATA[When storing sensitive data in Amazon S3, it's critical to make sure it's protected. AWS provides multiple encryption options, and one of the most secure and flexible methods is server-side encryption with AWS Key Management Service (SSE-KMS) using a...]]></description><link>https://blogs.linnlattoo.cloud/encrypting-s3-objects-using-sse-kms</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/encrypting-s3-objects-using-sse-kms</guid><category><![CDATA[AWS]]></category><category><![CDATA[S3]]></category><category><![CDATA[kms in AWS]]></category><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Sun, 15 Jun 2025 04:00:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1749931726028/6b71aee0-450d-49a9-9679-5cf5e661eaee.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When storing sensitive data in Amazon S3, it's critical to make sure it's protected. AWS provides multiple encryption options, and one of the most secure and flexible methods is <strong>server-side encryption with AWS Key Management Service (SSE-KMS)</strong> using a <strong>customer-managed key</strong> (CMK).</p>
<p>In this post, I’ll walk you through:</p>
<ul>
<li><p>Creating your own KMS key</p>
</li>
<li><p>Using that key to encrypt files uploaded to S3</p>
</li>
<li><p>Enforcing encryption via bucket policies</p>
</li>
</ul>
<h2 id="heading-key-concepts-in-aws-kms">Key Concepts in AWS KMS</h2>
<ul>
<li><p><strong>Symmetric Key</strong> – A single key is used for both encrypting and decrypting data.</p>
</li>
<li><p><strong>Asymmetric Key</strong> – Uses a key pair: a public key to encrypt and a private key to decrypt.</p>
</li>
<li><p><strong>AWS-Managed Key</strong> – Automatically created and managed by AWS.</p>
</li>
<li><p><strong>Customer-Managed Key (CMK)</strong> – A key you create, configure, and control.</p>
</li>
<li><p><strong>Key Rotation</strong> – Periodically changes the key's internal material to improve security.</p>
</li>
</ul>
<p>For encrypting S3 files, a <strong>symmetric CMK</strong> is the most common and practical option.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749930969893/cb88ad59-9248-4ac3-80ca-705dc64d5568.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-create-a-customer-managed-kms-key">Create a Customer-Managed KMS Key</h2>
<p>Search for “KMS” in the AWS Console, click <strong>Key Management Service</strong>, then <strong>Customer-managed keys</strong> &gt; <strong>Create key</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749928739428/f7119e92-759a-42b5-9826-ba0cc33ff721.png" alt class="image--center mx-auto" /></p>
<p>Keep the default settings to generate a symmetric key with AWS-provided key material. On the next screen, give your key an alias and optionally add a description to help identify it later.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929139960/b44441d8-db27-4e86-b7a1-4901c3254e32.png" alt class="image--center mx-auto" /></p>
<p>Continue with the default administrative permissions, which define who can manage the key but not use it for encryption. Then, set the usage permissions to decide who can perform cryptographic operations like encrypting and decrypting data.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929091481/ff06de0e-a096-406c-95b5-5e8122ee432e.png" alt class="image--center mx-auto" /></p>
<p>Finally, review the policy details, click Finish, and make sure your key appears in the list with the status “Enabled.” The key is now ready to be used for securing S3 objects with server-side encryption.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929224876/f71ccef4-739d-4a63-b0c9-9a29f59b8d51.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-creating-an-s3-bucket-with-default-sse-kms-encryption">Creating an S3 Bucket with Default SSE-KMS Encryption</h2>
<p>To ensure all objects stored in our S3 bucket are encrypted with our own AWS KMS Customer Managed Key (CMK), we can configure <strong>default server-side encryption</strong> during bucket creation.</p>
<p>This way, every object uploaded to the bucket will be automatically encrypted without requiring users to explicitly select an encryption method during upload.</p>
<p>Navigate to the <strong>Amazon S3 Console</strong> and click <strong>Create bucket</strong>. Enter a unique bucket name and select a region.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929634644/13d69eb7-0204-4431-a8a3-4a4ea5c24b8e.png" alt class="image--center mx-auto" /></p>
<p>Scroll down to the <strong>Default encryption</strong> section and configure the following:</p>
<ul>
<li><p><strong>Encryption type</strong>:<br />  ✅ Select <strong>Server-side encryption with AWS Key Management Service keys (SSE-KMS)</strong>.</p>
</li>
<li><p><strong>AWS KMS key</strong>:<br />  ✅ Choose your <strong>Customer Managed Key (CMK)</strong> from the dropdown.<br />  <em>(You can also click "Create a KMS key" if you don’t have one yet.)</em></p>
</li>
<li><p><strong>Bucket Key</strong>:<br />  ✅ Enable <strong>Bucket Key</strong> to reduce AWS KMS request costs.</p>
</li>
</ul>
<p>Then, click <strong>Create bucket</strong> at the bottom of the page.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929708826/7c4fc9bc-0b98-4106-b667-c649032f682e.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-verify-encryption">Verify Encryption</h2>
<p>Go to your S3 bucket in the console and click <strong>Upload</strong> → <strong>Add Files</strong>. There's <strong>no need to configure encryption,</strong> it's handled automatically!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929857177/d9650506-348a-42e4-a8d4-66243de05a60.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-enforcing-sse-kms-using-bucket-policy-optional">Enforcing SSE-KMS using Bucket Policy (Optional)</h2>
<p>Even with default encryption, it’s good security practice to <strong>enforce SSE-KMS through a bucket policy</strong>, especially if others upload via SDK, CLI, or APIs.</p>
<p>In the S3 bucket console, click the <strong>Permissions</strong> tab followed by <strong>Bucket Policy</strong> to open the Bucket policy editor.</p>
<p>Insert the following bucket policy into the editor:</p>
<pre><code class="lang-plaintext">{
    "Version": "2012-10-17",
    "Id": "RequireSSEKMS",
    "Statement": [
        {
            "Sid": "DenyUploadIfNotSSEKMSEncrypted",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::&lt;your-bucket-name&gt;/*”,
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:&lt;region&gt;:&lt;account_id&gt;:key/&lt;key-id&gt;"
                }
            }
        }
    ]
}
</code></pre>
<p>Replace <code>&lt;Your_Bucket_Name&gt;</code> and <code>&lt;region&gt;:&lt;account_id&gt;:key/&lt;key-id&gt;</code> with your actual name.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749930357508/4c5e0197-4d3c-4d63-a144-b95142f1ffc2.png" alt class="image--center mx-auto" /></p>
<p>Attempt to upload a file by changing the encryption configuring. The upload should fail.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749930472094/ad1a39ec-7427-4ee4-a25c-8bc16669adbf.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749930565936/31e7ecb7-a0b1-4b93-8bd2-3b61dfeb7ccc.png" alt class="image--center mx-auto" /></p>
<p>Retry the upload, this time without changing the encryption configuration. The upload should succeed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749930642854/ba78e903-690d-466d-bc44-a07b86be94c4.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749930653499/c6b35c27-7d04-4f9f-86b9-19fbbd94bef8.png" alt class="image--center mx-auto" /></p>
<p>These steps are configuring an S3 bucket policy to require SSE-KMS encryption for any new objects uploaded to the bucket. This ensures that all data stored in the bucket is encrypted according to your specified requirements.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this article, we explored the process of encrypting S3 objects using SSE-KMS, from creating a Customer-Managed Key to enforcing encryption policies. By implementing these practices, you can significantly enhance the security of your data stored in AWS S3.</p>
]]></content:encoded></item><item><title><![CDATA[Easy Steps to Install OpenStack/DevStack All-in-One]]></title><description><![CDATA[Hi!👋 I'm excited to share how I set up OpenStack using DevStack on local machine. If you’re just getting started with OpenStack, this guide might help you spin up your own testing environment.

⚠️ Disclaimer: This is a minimal, all-in-one installati...]]></description><link>https://blogs.linnlattoo.cloud/openstack-devstack</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/openstack-devstack</guid><category><![CDATA[openstack]]></category><category><![CDATA[devstack]]></category><category><![CDATA[Private Cloud]]></category><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Mon, 26 May 2025 02:00:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748201274980/68eedaca-6905-4762-9a74-ee66fc1374a3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi!👋 I'm excited to share how I set up OpenStack using <strong>DevStack</strong> on local machine. If you’re just getting started with OpenStack, this guide might help you spin up your own testing environment.</p>
<blockquote>
<p>⚠️ <strong>Disclaimer</strong>: This is a <strong>minimal, all-in-one installation</strong> intended for development and testing purposes only. <strong>Do not use this setup in production environments.</strong></p>
</blockquote>
<h2 id="heading-what-is-devstack">What is DevStack?</h2>
<p>DevStack is a series of extensible scripts used to quickly bring up a complete OpenStack environment for development or testing purposes. It’s not recommended for production use, but it's perfect for labs and learning.</p>
<h3 id="heading-why-use-devstack">Why Use DevStack?</h3>
<p>DevStack is a great way to:</p>
<ul>
<li><p>Learn OpenStack hands-on</p>
</li>
<li><p>Test and experiment with OpenStack components</p>
</li>
<li><p>Set up a local cloud lab quickly</p>
</li>
</ul>
<p><mark>But again, it’s not designed for production workloads, so test it as your cloud playground.</mark></p>
<h2 id="heading-my-system-info">My System Info</h2>
<p>Before diving in, I’ve already installed a VM on my local machine. Here’s the OS I used:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748199917172/5737575f-1f80-4f41-9888-7affe5b7b350.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-setup-steps">Setup Steps</h2>
<h3 id="heading-1-update-the-system">1. Update the system</h3>
<p>Make sure your packages are up to date:</p>
<pre><code class="lang-plaintext">sudo apt-get update -y
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200038910/725fe3e9-0208-4ed6-bb6d-8ad3523a5d48.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-2-clone-my-devstack-setup-repo">2. Clone my DevStack setup repo</h3>
<p>I've uploaded a custom DevStack configuration script to GitHub. Feel free to clone and use it.</p>
<pre><code class="lang-plaintext">git clone https://github.com/linnlattoo-cloud/devstack.git
cd devstack
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200086834/9de39ae0-41b8-4854-a308-245812d5b014.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-3-make-the-setup-script-executable">3. Make the setup script executable</h3>
<pre><code class="lang-plaintext">chmod +x devstack_setup.sh
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200139909/b77eb304-6ed1-4609-bc76-742371924576.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-4-optional-customize-your-setup">4. Optional: Customize your setup</h3>
<p>You can change passwords for:</p>
<ul>
<li><p>Database</p>
</li>
<li><p><code>admin</code></p>
</li>
<li><p><code>service</code></p>
</li>
<li><p>RabbitMQ</p>
</li>
</ul>
<p>Just edit the <code>local.conf</code> file by using vim editor or nano inside the repo before starting the install.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200288443/8f9bf827-ec54-4396-9483-587ecf5d0876.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-5-run-the-setup-script">5. Run the setup script</h3>
<p>This will download and install OpenStack and take <strong>20–30 minutes</strong>.</p>
<pre><code class="lang-plaintext">./devstack_setup.sh
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200277854/8d65023a-61f9-4259-8c79-00b6fa118de6.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200410047/679d8922-caca-4c34-9955-999508254f58.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-accessing-openstack">Accessing OpenStack</h3>
<p>Once the setup is done, you can log in to the OpenStack dashboard (Horizon) (<a target="_blank" href="http://your-server-ip/dashboard"><code>http://your-server(vm)-ip/dashboard</code></a>) using the <code>admin</code> user and the admin password you defined in <code>local.conf</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200466011/884739a2-e9ff-43b8-af72-ab6f332186a0.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200476884/428e1dd0-a506-4b25-8b00-3fba006dfe0c.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200484715/b2f0cbb0-8b01-4fee-96ac-90b0dc92f076.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-cleaning-up">Cleaning Up</h2>
<p>Need to remove everything? Just run:</p>
<pre><code class="lang-plaintext">./clean.sh
</code></pre>
<p>This will clean up your DevStack environment so you can start fresh if needed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1748200697128/97c83dd5-2456-44c4-b08b-6d56c6908181.png" alt class="image--center mx-auto" /></p>
<p>That’s it! DevStack is a fantastic way to explore OpenStack locally without complex setups. Feel free to fork my <a target="_blank" href="https://github.com/linnlattoo-cloud/devstack">GitHub repo</a> if you find this useful.</p>
<p>Thanks for reading! 🙌</p>
]]></content:encoded></item><item><title><![CDATA[Kubernetes on Azure (AKS) – Only Demo Purposes]]></title><description><![CDATA[Whether you're a student, developer, or DevOps engineer preparing for a demo, this guide walks you through setting up AKS for demo purposes quickly and efficiently.
Let’s get started!
Prerequisites

An Azure Account: Sign up here

Azure CLI: Install ...]]></description><link>https://blogs.linnlattoo.cloud/kubernetes-on-azure-aks</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/kubernetes-on-azure-aks</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[k8s]]></category><category><![CDATA[Azure]]></category><category><![CDATA[AKS,Azure kubernetes services]]></category><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Mon, 19 May 2025 08:55:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1747644742315/461f30d2-5963-4146-b3ae-2eff04483587.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Whether you're a student, developer, or DevOps engineer preparing for a demo, this guide walks you through setting up <strong>AKS for demo purposes</strong> quickly and efficiently.</p>
<p>Let’s get started!</p>
<h2 id="heading-prerequisites">Prerequisites</h2>
<ul>
<li><p>An Azure Account: <a target="_blank" href="https://azure.microsoft.com/en-us/pricing/purchase-options/azure-account?icid=azurefreeaccount">Sign up here</a></p>
</li>
<li><p>Azure CLI: <a target="_blank" href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest">Install Guide</a></p>
</li>
<li><p>kubectl: <a target="_blank" href="https://kubernetes.io/docs/tasks/tools/">Install Guide</a></p>
</li>
</ul>
<h2 id="heading-creating-kubernetes-cluster">Creating Kubernetes cluster</h2>
<p>Visit <a target="_blank" href="https://portal.azure.com">Azure portal</a> and log in with your Azure account. On the top search bar, type <code>Kubernetes services</code> and select it. Click the <strong>"+ Create"</strong> button and choose <strong>"Create Kubernetes cluster"</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747640374703/fa534d75-1330-4fad-8e70-aa731d59e467.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747640491940/90b4e3b3-7508-459e-9d23-05034b880283.png" alt class="image--center mx-auto" /></p>
<p><strong>Configure the basic settings</strong> according to your needs. The image below shows an example configuration for demo purposes only.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747640609585/6b2325d6-1c53-4929-8e32-3889c7615840.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747640755673/6e7daa9f-ac67-444c-893c-f5e6c388e86e.png" alt class="image--center mx-auto" /></p>
<p>Once your AKS cluster is ready, follow the <strong>connection instructions</strong> provided under the <strong>"Connect"</strong> section in the Azure Portal to configure <code>kubectl</code> access.</p>
<blockquote>
<p><em>Note: In the screenshot, I skipped the</em> <code>az login</code> step because I was already logged in.</p>
</blockquote>
<pre><code class="lang-plaintext">az login
az account set --subcription &lt;subcription-id&gt;
az aks get-credentials --resource-group &lt;resource-group-name&gt; --name &lt;k8s-cluster-name&gt; --overwrite-existing
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747641150380/29af36df-c619-4bf2-bcd7-de2cc4c98b15.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747641164041/1fca005b-ca15-4e86-9ae8-84779825fb4c.png" alt class="image--center mx-auto" /></p>
<p>To verify your connection to the cluster, run:</p>
<pre><code class="lang-plaintext">kubectl get svc
</code></pre>
<p>You should see the default Kubernetes services listed, confirming the connection.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747641283368/b687015f-2570-42fd-97bc-389256a09449.png" alt class="image--center mx-auto" /></p>
<p>Below is the <strong>architecture</strong>, along with the <strong>deployment</strong> and <strong>service</strong> configuration files used in this demo.</p>
<blockquote>
<p><strong>Disclaimer:</strong> These files are originally created by <strong>KodeKloud</strong>. I'm using them solely for demonstration purposes. You can fork the original files from their <a target="_blank" href="https://github.com/kodekloudhub/example-voting-app/tree/master/k8s-specifications">public repository</a>.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747641457830/39b7bb04-2a5e-4560-ab73-c37e95e8e0e7.png" alt class="image--center mx-auto" /></p>
<p>I made a small modification:<br />Changed the <strong>service type</strong> to <code>LoadBalancer</code> for both <code>vote-service</code> and <code>result-service</code> (the frontends) to allow external access.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747641571211/72a2c03b-1a77-4a5e-b934-715205eac341.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-lets-deploy">Let’s Deploy</h2>
<p>As you can see in the screenshot, I have these manifest files (<code>vote-deployment.yaml</code>, <code>vote-service.yaml</code>, <code>result-deployment.yaml</code>, <code>result-service.yaml</code>, <code>db-deployment.yaml</code>, <code>db-service.yaml</code>, <code>redis-deployment.yaml</code>, <code>redis-service.yaml</code>, <code>worker-deployment.yaml</code>).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642362571/03cb2aa0-ee46-4845-8054-127fdd343199.png" alt class="image--center mx-auto" /></p>
<p>To deploy the applications to your AKS cluster, use the <code>kubectl apply</code> command, specifying the <code>-f</code> flag followed by the name of each manifest file:</p>
<pre><code class="lang-plaintext">kubectl apply -f vote-deployment.yaml
kubectl apply -f vote-service.yaml
kubectl apply -f result-deployment.yaml
kubectl apply -f result-service.yaml
kubectl apply -f db-deployment.yaml
kubectl apply -f db-service.yaml
kubectl apply -f redis-deployment.yaml
kubectl apply -f redis-service.yaml
kubectl apply -f worker-deployment.yaml
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642176591/7e2373b7-49b3-49a4-9fda-490ddb64826c.png" alt class="image--center mx-auto" /></p>
<p>As shown in the screenshot, each <code>kubectl apply</code> command will create the corresponding deployment and service in your AKS cluster.</p>
<p>To verify that the deployments and services have been created successfully, you can use the <code>kubectl get deployments,svc</code> command:</p>
<pre><code class="lang-plaintext">kubectl get deployments,svc
</code></pre>
<p>The output, as seen in the screenshot, will display the list of deployments and services along with their current status, the number of ready replicas, their age, and for services, their type, cluster IP, external IP, and exposed ports.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642240530/89763829-f587-4fb7-be23-adf429c964f1.png" alt class="image--center mx-auto" /></p>
<p>Similarly, the services (<code>service/vote</code>, <code>service/result</code>, <code>service/db</code>, <code>service/redis</code>) will be listed with their respective details in Azure portal. Notice that the <code>vote</code> and <code>result</code> services are of type <code>LoadBalancer</code>, which means Azure Kubernetes Service has provisioned external load balancers to make these applications accessible from outside the cluster. You can see their external IPs listed in the "EXTERNAL-IP" column.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642732938/0f265a81-3280-46b0-a579-952335957fc5.png" alt class="image--center mx-auto" /></p>
<p>You can now access the voting application and the results application using the external IPs provided for the <code>vote</code> and <code>result</code> services, respectively, in your web browser.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642792327/8ba7a62b-2d40-4c0a-82fc-52632af2a18e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642800183/48b817af-03f1-4f93-8951-c2b2b34b1664.png" alt class="image--center mx-auto" /></p>
<p>Congratulations! You have successfully deployed a multi-tier application to your Azure Kubernetes Service cluster using <code>kubectl</code>. This demonstrates the basic steps involved in deploying and managing applications on AKS.</p>
<blockquote>
<p>Don’t forget to delete the resources to avoid extra charges.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1747642982506/efc533d1-db32-4271-8148-77b8c567df56.png" alt class="image--center mx-auto" /></p>
<p><strong>Thanks for reading!</strong></p>
]]></content:encoded></item><item><title><![CDATA[Secure Nginx with Let’s Encrypt]]></title><description><![CDATA[If you're running a website or app, securing it with HTTPS is a must. Not only does HTTPS protect your users’ data with encryption, but it also improves trust and even your site's SEO ranking.
Let’s Encrypt?
Let’s Encrypt is a free and trusted Certif...]]></description><link>https://blogs.linnlattoo.cloud/secure-nginx-with-lets-encrypt</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/secure-nginx-with-lets-encrypt</guid><category><![CDATA[nginx]]></category><category><![CDATA[http]]></category><category><![CDATA[https]]></category><category><![CDATA[certbot]]></category><category><![CDATA[Let's Encrypt]]></category><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Sun, 04 May 2025 11:00:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1746291076070/2c90f054-ec78-4950-ab24-058fdf202b3e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you're running a website or app, securing it with HTTPS is a must. Not only does HTTPS protect your users’ data with encryption, but it also improves trust and even your site's SEO ranking.</p>
<h3 id="heading-lets-encrypt">Let’s Encrypt?</h3>
<p>Let’s Encrypt is a free and trusted Certificate Authority (CA) that provides SSL/TLS certificates. Using their service with <strong>Certbot</strong> (the official tool for managing certificates) makes SSL setup almost effortless - especially when paired with Nginx.</p>
<p>Here’s what I had set up before starting:</p>
<ul>
<li><p>A VM running Ubuntu 22.04 on Azure</p>
</li>
<li><p>Nginx installed and running</p>
</li>
<li><p>Ports 80 (HTTP) and 443 (HTTPS) open</p>
</li>
<li><p>A domain name with an A record pointing to the VM’s public IP</p>
</li>
</ul>
<p>This ensures that your domain resolves to your server and that Let's Encrypt can validate domain ownership.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746289941027/97507d5a-9bc9-4286-a1ab-518a4f00be08.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746289952622/8a16ab67-6afe-4fc6-a197-5fbe5d545f15.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746289959216/a392bd42-2369-400f-ae24-a9cbba4a48b7.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746289965128/1ddf57a4-3f50-4ea2-9c91-1c2c8ad17817.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746289970292/b176d7a6-c96c-401b-8937-24507ef854e0.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-by-step-setup">Step-by-Step Setup</h2>
<h3 id="heading-install-certbot-and-the-nginx-plugin">Install Certbot and the Nginx Plugin</h3>
<p>First, install Certbot and its Nginx integration plugin:</p>
<pre><code class="lang-plaintext">sudo apt install certbot python3-certbot-nginx
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290059021/4d98ae56-4293-4f16-b453-af768abb9452.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-edit-nginx-server-block">Edit Nginx Server Block</h3>
<p>Open your site’s Nginx config:</p>
<pre><code class="lang-plaintext">sudo vi /etc/nginx/sites-available/example.com
</code></pre>
<p>In the <code>server</code> block, make sure to add:</p>
<pre><code class="lang-plaintext">server_name example.com;
</code></pre>
<p>Nginx needs to know which domain this block is for. This is how Certbot identifies which site to secure.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290167332/6d24e0a8-20b3-4935-a5b4-fba3ea1ec330.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290172233/44f954ad-3a88-4c94-95b5-8e20f163be44.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-test-nginx-config">Test Nginx Config</h3>
<p>Check for any syntax errors:</p>
<pre><code class="lang-plaintext">sudo nginx -t
</code></pre>
<p>Apply your changes:</p>
<pre><code class="lang-plaintext">sudo systemctl reload nginx
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290269876/fed00ee2-0517-4043-865b-5cac359053c3.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-obtain-and-install-ssl-certificate">Obtain and Install SSL Certificate</h3>
<p>Now, let’s request the SSL certificate and configure Nginx in one command:</p>
<pre><code class="lang-plaintext">sudo certbot --nginx -d example.com
</code></pre>
<p>If this is your first time running <code>certbot</code>, you will be prompted to enter an email address and agree to the terms of service.</p>
<p>This command will:</p>
<ul>
<li><p>Verify your domain ownership</p>
</li>
<li><p>Download and install the SSL certificate</p>
</li>
<li><p>Automatically configure your Nginx site for HTTPS</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290394798/044f92b1-f91a-4a92-9c05-78bc4158c050.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-verifying-everything-works">Verifying Everything Works</h3>
<p>Certbot sets up an automatic renewal timer. Verify that it's running:</p>
<pre><code class="lang-plaintext">sudo systemctl status certbot.timer
</code></pre>
<p>Let’s Encrypt certificates expire every 90 days, so automated renewal is critical.</p>
<p><strong>Test Renewal</strong></p>
<p>Do a dry-run of the renewal process to ensure it's working:</p>
<pre><code class="lang-plaintext">sudo certbot renew --dry-run
</code></pre>
<p>This makes sure your renewal process will succeed before it really matters.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290571693/c1ffcb0d-14ad-4f5e-8573-ff8d7d1bddd9.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-here-we-go">Here we go!</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746290640222/ba5b867e-4893-4422-a512-82dec84becc7.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Securing your website or app with HTTPS is essential for encrypting user data, enhancing trust, and boosting SEO. Let’s Encrypt offers free SSL/TLS certificates via Certbot, simplifying setup with Nginx. The step-by-step guide includes installing Certbot and the Nginx plugin, editing the Nginx server block with your domain, and using Certbot to obtain and install an SSL certificate. Automated renewal ensures certificates stay valid, with verification and renewal testing processes included.</p>
]]></content:encoded></item><item><title><![CDATA[🚀 Setting Up Prometheus and Grafana Easily]]></title><description><![CDATA[Monitoring your infrastructure doesn’t have to be complicated. In this guide, I’ll show you how to set up Prometheus and Grafana in the easy way. Whether you're a beginner or just looking for a quick demo environment, this setup will get you up and r...]]></description><link>https://blogs.linnlattoo.cloud/setting-up-prometheus-and-grafana-easily</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/setting-up-prometheus-and-grafana-easily</guid><category><![CDATA[monitoring]]></category><category><![CDATA[#prometheus]]></category><category><![CDATA[Grafana]]></category><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Wed, 30 Apr 2025 13:26:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019467795/c78f0ee5-e287-498e-90d3-c8b81e2618f8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Monitoring your infrastructure doesn’t have to be complicated. In this guide, I’ll show you how to set up <strong>Prometheus and Grafana</strong> in the easy way. Whether you're a beginner or just looking for a quick demo environment, this setup will get you up and running with real-time metrics, dashboards, and multi-instance monitoring in under 15 minutes.</p>
<h3 id="heading-prerequisites">Prerequisites</h3>
<p>Before we begin, I’ve already launched <strong>three EC2 instances</strong> (Ubuntu 22.04) for this demo:</p>
<ul>
<li><p><code>instance-01</code> (Main Prometheus + Grafana Server)</p>
</li>
<li><p><code>instance-02</code> (Node Exporter)</p>
</li>
<li><p><code>instance-03</code> (Node Exporter)</p>
</li>
</ul>
<p>All instances follow the same initial setup.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746017882095/f0cae32f-9cba-455f-badd-40331315325e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-1-initial-setup-on-all-instances">Step 1: Initial Setup on All Instances</h3>
<p>SSH into each EC2 instance and run the following:</p>
<pre><code class="lang-plaintext">sudo suapt update -y
git clone https://github.com/linnlattoo-cloud/prometheus_grafana.git
cd prometheus_grafana
chmod +x *.sh
</code></pre>
<p>This prepares the environment by cloning the necessary scripts and ensuring all <code>.sh</code> files are executable.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746017997172/5ae9d7f9-4005-461e-af8a-b385295db0a6.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018044807/0786eec6-6ca9-419d-96b5-4c0311e5da4c.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018057215/5767b52f-fa7c-43f7-b4ac-ccc3fee2f7fa.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-2-configure-instance-01-main-monitoring-server">Step 2: Configure instance-01 (Main Monitoring Server)</h3>
<p>On <code>instance-01</code>, execute the installation scripts <strong>in order</strong>:</p>
<pre><code class="lang-plaintext">./01…
./02…
./03…
./04…
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018393559/ed362770-c141-47ce-a6f8-4a0f3cc5f126.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018403755/475214d7-7075-4deb-88ce-98b082cb1fcc.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018417246/617200a8-d891-4bd5-869d-80aea531ec7b.png" alt class="image--center mx-auto" /></p>
<p>Once done, you can now access the dashboards:</p>
<ul>
<li><p><strong>Prometheus:</strong> <code>http://&lt;instance-01-ip&gt;:9090</code></p>
</li>
<li><p><strong>Grafana:</strong> <code>http://&lt;instance-01-ip&gt;:3000</code></p>
</li>
</ul>
<p>🔐 Default Grafana credentials:</p>
<ul>
<li><p>Username: <code>admin</code></p>
</li>
<li><p>Password: <code>admin</code></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018483147/4ca9fc73-dbd1-4aaf-82d2-2c31f693b29d.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018490114/9590a530-7ce3-4e13-b4e8-6c429fd38e47.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018509471/db851b9a-e7fe-453f-8167-f76035bb17f3.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-3-configure-instance-02-and-instance-03-node-exporters">Step 3: Configure instance-02 and instance-03 (Node Exporters)</h3>
<p>For the other two instances, just set up Node Exporter <mark>by running 03…sh file</mark>:</p>
<pre><code class="lang-plaintext">./03…
</code></pre>
<p>This installs Node Exporter so they can be monitored by Prometheus.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018662377/88d20586-1662-4600-b1b0-172c240ecd16.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-4-connect-all-targets-in-prometheus">Step 4: Connect All Targets in Prometheus</h3>
<p>Back in <code>instance-01</code>, open the Prometheus configuration file:</p>
<pre><code class="lang-plaintext">sudo vi /etc/prometheus/prometheus.yml
</code></pre>
<p>Under the <code>scrape_configs</code> section, add all three instances like this:</p>
<pre><code class="lang-plaintext">- job_name: 'remote_collector' 
  scrape_interval: 10s 
  static_configs: 
    - targets: ['instance-01-ip:9100', 'instance-02-ip:9100', 'instance-03-ip:9100']
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018893488/80f5c730-4dd3-44aa-a580-0094e0a0d1f7.png" alt class="image--center mx-auto" /></p>
<p>Then, restart Prometheus to apply changes and Navigate to <code>http://&lt;instance-01-ip&gt;:9090/targets</code> to verify all your targets are listed and <strong>UP</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018943048/6b435615-b6a8-4579-b603-2709a9602332.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746018949479/629cfd3b-6e80-472b-83f6-8d3af98a3912.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-5-set-up-grafana-dashboard">Step 5: Set Up Grafana Dashboard</h3>
<p>Head over to your Grafana dashboard:</p>
<ul>
<li><p>Click <strong>Connections &gt; Add new connection</strong></p>
</li>
<li><p>Choose <strong>Prometheus</strong> and set the URL to <code>http://&lt;instance-01-ip&gt;:9090</code></p>
</li>
<li><p>Save and test the connection</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019006071/652316cf-cccc-46ec-a2bf-5f7e488e84fa.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019013890/dbf2da52-8d0b-42d1-92cb-c54d3f7611d8.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019030230/ea3e46d4-b716-427f-93c5-4be6e467e3eb.png" alt class="image--center mx-auto" /></p>
<p>Now for the fun part—dashboards!</p>
<ul>
<li><p>Go to <strong>Dashboards &gt; Import</strong></p>
</li>
<li><p>Upload the JSON file provided in the GitHub repo</p>
</li>
<li><p>Click <strong>Load</strong></p>
</li>
<li><p>Select the Prometheus data source and click <strong>Import</strong></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019088976/1b43973a-48c8-474a-bcc7-90378f6ad1c7.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019097651/4a336878-2422-44cf-b6b0-9280208780c8.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019108037/c64a93bf-e5a1-43af-b1ed-50ae00d67e2b.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019115574/0d7193cb-b9dc-4c3a-89fb-4a31947058c3.png" alt class="image--center mx-auto" /></p>
<p><strong>Boom! Your monitoring dashboard is live.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019171932/cb821a67-d289-467b-af6b-d3f346080b22.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746019179357/3e6d6959-4d7f-4f15-ad4c-9ef1b0fbadf1.png" alt class="image--center mx-auto" /></p>
<p>That’s it! In just a few simple steps, you’ve got a monitoring setup with Prometheus and Grafana across multiple instances. This stack is powerful for monitoring or demo purposes.<br />Feel free to fork the <a target="_blank" href="https://github.com/linnlattoo-cloud/prometheus_grafana">GitHub repo</a> and customize your dashboard or explore alerting features next!</p>
]]></content:encoded></item><item><title><![CDATA[How to Implement Amazon EFS with Two EC2 Instances]]></title><description><![CDATA[Introduction
Amazon Elastic File System (EFS) is a fully managed, scalable, and shared file storage solution provided by AWS. It allows multiple EC2 instances to access the same file system simultaneously, making it ideal for shared workloads or dist...]]></description><link>https://blogs.linnlattoo.cloud/how-to-implement-amazon-efs-with-two-ec2-instances-d7c4645a014a</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/how-to-implement-amazon-efs-with-two-ec2-instances-d7c4645a014a</guid><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Tue, 14 Jan 2025 16:45:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479126425/cd2806b4-c573-4e56-842d-710234bdad3f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction"><strong>Introduction</strong></h3>
<p>Amazon Elastic File System (EFS) is a fully managed, scalable, and shared file storage solution provided by AWS. It allows multiple EC2 instances to access the same file system simultaneously, making it ideal for shared workloads or distributed applications.</p>
<p>In this guide, I will walk through the steps to implement EFS with two Amazon Linux EC2 instances, highlighting its setup and benefits.</p>
<h3 id="heading-implementation"><strong>Implementation</strong></h3>
<p>First, I’ll create two EC2 security groups, each configured to allow SSH access for their respective EC2 instances.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479099741/d6eec714-eff6-4d2f-b168-5c6c799d44b3.png" alt /></p>
<p>Next, I’ll create another security group with NFS access allowed for the previously created security groups.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479101296/6734a996-df06-47b1-aecf-de42cb4f8433.png" alt /></p>
<p>Now, we have all the required security groups.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479102996/702a365b-c416-4bf2-9504-74417f571c40.png" alt /></p>
<p>Next, navigate to EFS, and I’ll create an NFS file system.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479104844/e89c984e-511a-4272-92f0-2a89c10d6c40.png" alt /></p>
<p>Enter the name, select the VPC, and click “Customize.”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479106429/5096a5f4-c819-4655-b9a5-6ff358a71268.png" alt /></p>
<p>I’ll uncheck automatic backups, encryption at rest, and lifecycle management since this is a demo. Then, we’ll select Bursting.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479108433/e8654a26-ef48-475b-bffc-cdd8eed3ab43.png" alt /></p>
<p>Next, we’ll create mount targets by selecting the NFS security group we created earlier for each availability zone (AZ).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479110798/a21dec12-a2bc-4e18-b9cb-d394080e65bd.png" alt /></p>
<p>Finally, review the settings and create the NFS file system.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479113921/5279856c-25de-4d4e-8753-d642b92a59c5.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479115507/2fd85faa-1837-4a78-b0a5-8718fddd8920.png" alt /></p>
<p>Next, we’ll create two EC2 instances with a Linux operating system. In this demo, I’ll launch instance_1 in ap-southeast-1a and instance_2 in ap-southeast-1b. During the creation process, make sure to select the correct VPC, subnets, and the existing security group we created earlier.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479117192/26c9ce9d-fc0f-4bd1-bfab-22450c337e72.png" alt /></p>
<p>In the “Configure storage” section, click “Edit” under File systems.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479118734/a71e7c6f-f4a4-4d64-ae2e-eb1e6c2b0d44.png" alt /></p>
<p>Select the EFS we created earlier and uncheck “Automatically create and attach security groups.”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479120436/766dec51-687a-4f38-9b8d-8ffc8c5504bd.png" alt /></p>
<p>Now, we have our EC2 instances set up.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479121726/5f2b29ba-71af-4165-8917-3ac6c0d34be2.png" alt /></p>
<h3 id="heading-testing"><strong>Testing</strong></h3>
<p>I created <strong>sample.txt</strong> under <strong>/mnt/efs/fs1/</strong> on instance_1. We can also access that file on instance_2.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479123682/4273bb73-da63-49f4-8eac-624709d20a9f.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479125258/a64dca74-1370-44bf-b26b-b382ff6b978f.png" alt /></p>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>By following these steps, you’ve successfully implemented Amazon EFS with two Amazon Linux EC2 instances. This setup allows you to share data seamlessly between instances and scale your applications without worrying about storage limitations.</p>
<p>Happy cloud computing!</p>
]]></content:encoded></item><item><title><![CDATA[How to Create Amazon CloudWatch Billing Alerts: A Step-by-Step Guide]]></title><description><![CDATA[Managing your AWS costs can feel like navigating a maze. AWS services offer unparalleled flexibility and scalability, but if they are not carefully monitored, they may also result in unexpected charges. AWS CloudWatch billing alerts are useful in thi...]]></description><link>https://blogs.linnlattoo.cloud/how-to-create-amazon-cloudwatch-billing-alerts-a-step-by-step-guide-870b6fe1c04b</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/how-to-create-amazon-cloudwatch-billing-alerts-a-step-by-step-guide-870b6fe1c04b</guid><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Fri, 05 Jul 2024 20:27:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479272688/fcb24aa0-662e-48ca-b04a-217ed4c14eae.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Managing your AWS costs can feel like navigating a maze. AWS services offer unparalleled flexibility and scalability, but if they are not carefully monitored, they may also result in unexpected charges. AWS CloudWatch billing alerts are useful in this situation. They help you monitor your expenses and prevent unexpected charges at the end of the month. In this guide, I’ll walk you through the process of setting up billing alerts on AWS CloudWatch, ensuring you stay on top of your expenses.</p>
<p><strong>Step 1: Enabling CloudWatch Billing Alerts in the Billing Console</strong></p>
<p>Our journey begins at the AWS Management Console, the control center of your AWS environment. Here’s how you can enable billing alerts:</p>
<ul>
<li><strong>Sign In:</strong> Open the <a target="_blank" href="https://console.aws.amazon.com/">AWS Management Console</a>.</li>
<li><strong>Navigate to the billing dashboard.</strong> In the top navigation bar, click on your account name and select <strong>Billing and Cost Management</strong>.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479244458/17b4112a-2ef2-4224-9c59-af3902a7635c.png" alt /></p>
<ul>
<li><strong>Billing Preferences:</strong> On the left-hand side, you’ll see a menu. Click on <strong>billing preferences</strong>.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479246048/668faa8b-9d42-43a7-80c4-d2fc0aedf4a1.png" alt /></p>
<ul>
<li><strong>Enable Alerts:</strong> Look for the <strong>alert preferences</strong> and edit them.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479247792/c00e18a2-a96a-4aa6-8d9d-dc6630cf2551.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479249624/00f2d07c-c8ef-454d-85a7-22daab68d79b.png" alt /></p>
<ul>
<li><strong>Update:</strong> Don’t forget to hit the <strong>Update</strong> button to apply your changes.</li>
</ul>
<p>With billing alerts enabled, you’ve taken the first step towards cost management mastery. Now, let’s set up a CloudWatch billing alarm to notify you when your costs exceed a certain threshold.</p>
<p><strong>Step 2: Creating a CloudWatch Billing Alarm</strong></p>
<p>Before creating the billing alarm, make sure to set the region to US East (North Virginia).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479251348/9e734c55-a753-41d9-ab43-4a2786a3d545.png" alt /></p>
<ul>
<li><strong>Open the CloudWatch Console:</strong> Navigate to the <a target="_blank" href="https://console.aws.amazon.com/cloudwatch/">CloudWatch console</a>.</li>
<li><strong>Create Alarm:</strong> In the navigation pane on the left, click on <strong>Alarms</strong>, then choose <strong>Create Alarm</strong>.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479253073/520f1133-40d8-471b-9cde-b04076253fac.png" alt /></p>
<ul>
<li><strong>Select Metric:</strong> Click on <strong>Select Metric</strong> to start defining what you want to monitor.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479254584/2d1da5eb-7130-42c2-8f48-56aec302deaa.png" alt /></p>
<ul>
<li><strong>Billing Metrics:</strong> Under the <strong>Browse</strong> tab, find and click on <strong>Billing</strong>.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479256445/90c99d40-96ae-4714-8dcd-4b833f3e458c.png" alt /></p>
<ul>
<li><strong>Choose Metric:</strong> Select <strong>the total estimated charge</strong>. You’ll need to pick the currency your account is billed in, like USD.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479257928/25cb87aa-7d07-42fc-b517-ade4a66cfa29.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479259493/434f9c65-1008-493b-b71b-d3f6d32836bf.png" alt /></p>
<ul>
<li><strong>Configure Metric:</strong> Click <strong>Select Metric</strong> to move to the configuration page.</li>
</ul>
<p><strong>Step 3: Configuring Alarm Conditions</strong></p>
<ul>
<li><strong>Set Period:</strong> Choose how often you want the alarm to evaluate your spending. A common choice is every 6 hours.</li>
<li><strong>Threshold Type:</strong> Select <strong>Static</strong>.</li>
<li><strong>Set Condition:</strong> Define the threshold that will trigger the alarm. For example, if you want to be alerted when your spending equals or exceeds $50, choose <strong>Greater/Equal</strong> and enter $50.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479260921/de3db616-3799-4412-a6ac-176524d8d0d9.png" alt /></p>
<p><strong>Step 4: Setting Up Actions</strong></p>
<p>Actions define what happens when an alarm state is triggered. Typically, this involves sending a notification via Amazon SNS:</p>
<ul>
<li><strong>Add Notification:</strong> Under <strong>Actions</strong>, select <strong>In alarm</strong>, then choose <strong>Add notification</strong>.</li>
<li><strong>SNS Topic:</strong> If you have an existing Amazon SNS topic, select an existing Amazon SNS topic. If not, create a new one. This is where notifications will be sent. In this guide, I’ll create a new Amazon SNS topic.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479262507/1ff82264-b294-4b41-a6bd-7424cfa02eae.png" alt /></p>
<ul>
<li><strong>Name your topic:</strong> Give your topic name and enter the email that will receive the notification, and then create a topic. If you want to enter 2 or more emails, you can separate with comma “,”. For example, user1@example.com and user2@example.com.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479263964/6cfa0926-a124-467a-931e-cba3306d96db.png" alt /></p>
<p>After creating a new Amazon SNS topic, it will select that topic automatically.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479265568/b04201db-c76f-447f-9c88-bcf47ade1963.png" alt /></p>
<ul>
<li><strong>Configure Notification:</strong> Add the necessary details and click <strong>Next</strong>.</li>
</ul>
<p><strong>Step 5: Naming and Reviewing Your Alarm</strong></p>
<ul>
<li><strong>Name Your Alarm:</strong> Give your alarm a descriptive name and add a brief description if needed.</li>
<li><strong>Review:</strong> Double-check all the settings.</li>
<li><strong>Create Alarm:</strong> Click <strong>Create Alarm</strong> to finalize the process.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479267830/8ae25b47-6f3d-4321-84f3-f73593ea65ff.png" alt /></p>
<p><strong>Step 6: Amazon SNS Subscription Confirmation</strong></p>
<p>This is the final step. You’ll get an email from AWS and then confirm your subscription using the link.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479269544/8539020a-7c2a-4510-aeb3-94ad7ac1a01e.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479271086/2ebbc984-c155-45ba-bd72-6bc724e5dd5d.png" alt /></p>
<p>And there you have it! You’ve successfully set up a billing alarm on Amazon CloudWatch. This proactive measure will help you stay informed about your AWS spending and avoid any budget overruns.</p>
<p>By following these steps, you’re not just enabling billing alerts; you’re taking control of your AWS environment. So, next time you log into your AWS account, you can do so with the confidence that you’re on top of your costs.</p>
<p><strong>Happy cloud computing!</strong></p>
<p>Feel free to share your thoughts or any additional tips in the comments below. If you found this guide helpful, don’t forget to clap and share it with others who might benefit from it!</p>
]]></content:encoded></item><item><title><![CDATA[How to use Amazon EC2 as GitHub self-hosted runner]]></title><description><![CDATA[Setting up a GitHub self-hosted runner on AWS EC2 involves several steps, from creating an EC2 instance to configuring it as a GitHub Actions runner.
First, we need to create Amazon EC2 instance.
Here is a sample instance. You can configure it depend...]]></description><link>https://blogs.linnlattoo.cloud/how-to-use-amazon-ec2-as-github-self-hosted-runner-c1f1b631820a</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/how-to-use-amazon-ec2-as-github-self-hosted-runner-c1f1b631820a</guid><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Sun, 16 Jun 2024 17:19:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745480871691/a9b025ce-d420-4fd0-ab05-7550f08b9e1b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Setting up a GitHub self-hosted runner on AWS EC2 involves several steps, from creating an EC2 instance to configuring it as a GitHub Actions runner.</p>
<p>First, we need to create Amazon EC2 instance.</p>
<p>Here is a sample instance. You can configure it depending on your needs.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479204827/d82e53a4-72e3-43e1-a750-46bd6ec244d8.png" alt /></p>
<p>After creating instance, connect to the instance.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479206921/e8d9197e-bfe2-4aef-8868-edf480166660.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479208939/bd5e0d2c-caec-48ce-9072-f2786a8b7155.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479211332/938449f7-b115-41fb-8795-7ab6c4300144.png" alt /></p>
<p>Now, enter these commands</p>
<ul>
<li>sudo apt update -y</li>
<li>sudo apt install git -y</li>
</ul>
<p>After installing git, go to the GitHub runners and click “New self-hosted runner”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479212866/edaa99f2-8862-4ef9-b464-d50c205db51d.png" alt /></p>
<p>Choose Linux x64, this can be different upon your instance OS and architecture.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479214681/a313e52a-f77f-4363-99fd-3e8244810b4d.png" alt /></p>
<p>You’ll see command lines to download and configure the runner in instance.</p>
<p>You just need to copy and run the command lines in the instance.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479216398/1be7258e-084a-4568-a338-3524f0ad6b3f.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479218362/54bc1b07-f90d-408a-9ebc-381bb1479187.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479220114/82a0175b-2b21-4151-bb87-91202cf4e41d.png" alt /></p>
<p>Now, let’s check the GitHub runner. We got the runner but its status is offline.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479221647/d28d0360-1e36-4c22-8e9a-b744ed6be2d4.png" alt /></p>
<p>Go to the instance and run these commands</p>
<ul>
<li>sudo ./svc.sh install</li>
<li>sudo ./svc.sh start</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479223626/5f17b2fd-dec1-44a4-a790-773ac1b64fd4.png" alt /></p>
<p>Check again the runner.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479225418/cea3a1ed-d23e-423d-8078-e36ddca41b8c.png" alt /></p>
<p>We got our self-hosted runner.</p>
<p>Now, I’ll continue to show how to use that runner in the GitHub Actions yml. It’s just that you need to type the runner labels in runs-on to use the self-hosted runner. Here is an example</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479227009/48064e2d-e9df-472e-936a-dc7c8f4a0540.png" alt /></p>
<p>Now, I’ll continue to show how to remove the runner.</p>
<p>Before we remove the runner, we need to stop and uninstall the runner service in the instance.</p>
<p>Run these commands</p>
<ul>
<li>sudo ./svc.sh stop</li>
<li>sudo ./svc.sh uninstall</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479228694/40abff3c-32cc-4403-9ae7-e244f8e305ec.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479230526/c6cba552-a4a5-462f-8f74-5c550645f779.png" alt /></p>
<p>Now, go to the GitHub runner option and click “remove runner”</p>
<p>You just need to copy and run the remove command.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479232348/f072b1ea-97bf-4da9-a6e6-febd6782c8fa.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479233724/60bfa85d-f0c8-4e58-bd54-4c8680d74a4e.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479235748/636b6138-8e09-44af-827b-58a1be496268.png" alt /></p>
<p>Check in the GitHub runner. It’ll be gone.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479237757/7d793856-d63b-4dc3-b0bc-214449917cec.png" alt /></p>
<p>This guideline will create a self-hosted GitHub Actions runner on an AWS EC2 instance, allowing you to run CI/CD jobs directly on your own infrastructure. I hope you enjoy!</p>
]]></content:encoded></item><item><title><![CDATA[How to Deploy a Static Website on Amazon S3 (Simple Storage Service)]]></title><description><![CDATA[Deploying a static website on Amazon S3 involves creating a bucket, uploading your website files, and configuring the bucket to serve the website. Here are the steps to do this:
First, navigate to S3 and create an S3 bucket.

Enter a unique bucket na...]]></description><link>https://blogs.linnlattoo.cloud/how-to-deploy-a-static-website-on-amazon-s3-simple-storage-service-f066c87f096e</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/how-to-deploy-a-static-website-on-amazon-s3-simple-storage-service-f066c87f096e</guid><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Mon, 03 Jun 2024 15:56:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745480953286/49f0a4a9-78ca-44c7-a924-882244067ce7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Deploying a static website on Amazon S3 involves creating a bucket, uploading your website files, and configuring the bucket to serve the website. Here are the steps to do this:</strong></p>
<p>First, navigate to S3 and create an S3 bucket.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479169926/b878449b-e238-4461-bf36-d7a27e18b94f.jpeg" alt /></p>
<p><strong>Enter a unique bucket name. The bucket name must be globally unique.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479171178/7cc867f2-f77b-49e4-8256-83f63dafdf97.jpeg" alt /></p>
<p>Uncheck “Block all public access” and check the acknowledge</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479172567/6d7acde9-9baa-41ae-94ad-00f37e28e3d5.jpeg" alt /></p>
<p>Bucket Versioning is your choice. Read more about Bucket Versioning “<a target="_blank" href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html">https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html</a>”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479173813/505277b8-b6a2-444e-9318-68b88b7b5fff.jpeg" alt /></p>
<p>Other settings are default.</p>
<p>This is my sample static webpage.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479175108/cf13a706-8f7e-4662-a2af-17fd5a9735df.jpeg" alt /></p>
<p>Now, let’s upload that file to S3.</p>
<ul>
<li>Click on the “Upload” button.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479176253/9df9d89b-68d5-42e0-82c7-f9cf2e273425.jpeg" alt /></p>
<ul>
<li>Add the files or folders of your static website.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479177808/dbe45dfc-3e48-44fd-a129-ac6e80969d35.jpeg" alt /></p>
<ul>
<li>Click “Upload” to start uploading the files.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479178988/5d45b5f6-08f2-406e-ba7d-a361987611b6.jpeg" alt /></p>
<p>Let’s configure the Bucket for Static Website Hosting</p>
<ul>
<li>In your bucket, go to the “Properties” tab.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479181101/ccb465ae-9cb0-4183-9759-ac1b2a5cfd12.jpeg" alt /></p>
<ul>
<li>Scroll down to the “Static website hosting” section and Click “Edit”.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479182478/de670647-7556-407a-be51-0e35baab5bcf.jpeg" alt /></p>
<ul>
<li>Select “Enable” for Static website hosting. If you uploaded with file, just specify the index document (e.g., ‘index.html’) or if you uploaded with folder, specity the index document in the folder (e.g., ‘your-folder-name/index.html’).</li>
<li>Optionally, you can also specify an error document (e.g., ‘error.html’). And then Click “Save changes”.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479184098/78822e3b-3281-49b1-898b-93b63fc0b6bd.jpeg" alt /></p>
<p>You’ll see your Bucket website endpoint. It is the URL for your website. Let’s check the URL.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479186131/31013dfd-2c21-4a1a-97ae-43e544703122.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479187754/3eddb770-92ee-40d1-8fe1-196da8169b44.jpeg" alt /></p>
<p>It’s not an error. You need to set permission of your bucket.</p>
<ul>
<li>Go to the “Permissions” tab of your bucket.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479189225/7590ebee-cbee-4a30-b9b9-36add15cbf79.jpeg" alt /></p>
<ul>
<li>Under “Bucket policy”, click on “Edit”.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479190812/b13af579-b5ca-47ca-a58c-5520e73ec5e2.jpeg" alt /></p>
<ul>
<li>Click on “Policy generator”.</li>
<li>Copy your Bucket ARN.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479191899/66f1e488-e03a-4e53-9855-1b1b17398f28.jpeg" alt /></p>
<ul>
<li>Select “S3 Bucket Policy”</li>
<li>Effect — “Allow”</li>
<li>Principal — “*”</li>
<li>Actions — “GetObject”</li>
<li>Enter your Bucket ARN with “/*”- “e.g,. your-arn/*”</li>
<li>And then click “Add Statement” and “Generate Policy”</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479193372/14bc0502-04b8-42e0-9314-816be021ed58.jpeg" alt /></p>
<p>Copy the Policy JSON Document and Paste in S3 Policy Box.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479194815/78ee0b41-448d-4f7d-9f8c-7337c9e32d3a.jpeg" alt /></p>
<p>And then Save the Policy.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479196813/47a70703-6cc8-44a8-b4aa-96d85224272a.jpeg" alt /></p>
<p>Let’s check again the URL.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479198412/dc58691a-d479-418f-acaf-6f59b338343f.jpeg" alt /></p>
<p><strong>Thank you for following along with my tutorial on deploying a static website using Amazon S3. I hope that this guide has provided you with clear and actionable steps to get your website up and running.</strong></p>
]]></content:encoded></item><item><title><![CDATA[How to Deploy your own Outline VPN server on Amazon Lightsail]]></title><description><![CDATA[First, download the Outline Manager “https://getoutline.org/en-GB/get-started/”.

You can choose the one that matches with you operating system.

After completing downloaded, install the Outline Manager.
In the Outline Manager, you can choose the clo...]]></description><link>https://blogs.linnlattoo.cloud/how-to-setup-outline-vpn-server-on-your-amazon-lightsail-e9aea4a0c317</link><guid isPermaLink="true">https://blogs.linnlattoo.cloud/how-to-setup-outline-vpn-server-on-your-amazon-lightsail-e9aea4a0c317</guid><dc:creator><![CDATA[Linn Latt Oo]]></dc:creator><pubDate>Sun, 02 Jun 2024 16:30:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745481004157/397b9b71-1203-410a-95e1-c4d74f2ddb8a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>First, download the Outline Manager “<a target="_blank" href="https://getoutline.org/en-GB/get-started/">https://getoutline.org/en-GB/get-started/</a>”.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479130830/efde9aa7-1b75-47fb-ade0-46091156982a.jpeg" alt /></p>
<p>You can choose the one that matches with you operating system.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479132294/5e0d319b-06b7-4c1a-aa04-29c2dc803b46.jpeg" alt /></p>
<p>After completing downloaded, install the Outline Manager.</p>
<p>In the Outline Manager, you can choose the cloud provider where you want to host the Outline VPN Server. For now, I continue with Amazon Lightsail.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479133724/29f245ab-fb91-43e4-b852-6e9bb0c4d588.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479135424/89e9a98a-0a21-4c8d-a981-393985ddd02f.jpeg" alt /></p>
<p>Now, go to Amazon Lightsail and create instance.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479136854/2d90b41a-a090-4839-b7e7-c0250bb88218.jpeg" alt /></p>
<p>You can choose the Region where you want to host your server.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479138573/1b1319e7-ccae-4927-90bf-c7a6d7728476.jpeg" alt /></p>
<p>You can choose the Operating System. I continue with Ubuntu. <strong>Note that please choose Operating System (OS) only</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479140369/9b937604-4025-4ce3-8faf-b6e225b45ae8.jpeg" alt /></p>
<p>Choose your plan that meet with your need. And then create the instance.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479141883/e69022dc-3422-439d-aed6-786e448db5e9.jpeg" alt /></p>
<p>After creating instance, go to Networking section and create and attach the static ip.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479143572/d7f2f1a2-0d20-425c-847d-40f2b805fd35.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479145159/7412f0a8-e989-46b2-bef0-7665511e9676.jpeg" alt /></p>
<p>In that Networking section, a little bit scroll down, you’ll see IPv4 Firewall rule and create “All TCP allow” rule.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479146472/349152b0-967f-43d3-9570-6dda88343dd5.jpeg" alt /></p>
<p>Now, go to Connect section and click “Connect using SSH”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479148246/b8c6d12c-bc12-41df-aecf-c36f2a18f46e.jpeg" alt /></p>
<p>Run “sudo apt-get update -y”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479149558/fc77ae3f-4c53-487d-8835-5f866abea4d2.jpeg" alt /></p>
<p>And then copy and run the command from Outline Manager.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479150799/dd4fadf6-60ee-4119-9061-0ae3b3e64196.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479152702/0bc66d20-a481-4956-b047-5d3ce3b7bbb8.jpeg" alt /></p>
<p>After completed installation, copy and paste the green part to the Outline Manager.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479154087/d38a6d51-619c-42f3-b1c8-4675f7cf9b97.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479155668/a87b7874-4fa7-4396-8659-5efc9e63e9f7.jpeg" alt /></p>
<p>Now, we have Outline VPN Server.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479157342/092cf105-39cb-49ab-b55d-45345c1c0f06.jpeg" alt /></p>
<p>Let’s create a key by clicking “Add new key”. Enter the key name as you prefer.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479158448/749993b9-c433-4dac-a01f-67d56f5e10c5.jpeg" alt /></p>
<p>Now. let’s connect the vpn.</p>
<p>Before you connect, you need to install the Outline VPN client in your device. You can download from the above link.</p>
<p>Get the Outline Access Key in the share button.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479159920/8c4bd238-3911-4266-ad47-a5c3ec8b2e53.jpeg" alt /></p>
<p>You can connect the VPN by just copy and paste the access key or you can share the access key if you want to connect in other devices.</p>
<p><strong>I recommend you should use one access key for one device.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479161583/16e007e0-c72d-44e5-85b9-edc93ab59542.jpeg" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479162980/83cd357a-a39d-4af6-8f55-33067099d0aa.jpeg" alt /></p>
<p>Now, let’s check our ip. You can check in “<a target="_blank" href="https://ipleak.net">https://ipleak.net</a>"</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745479164417/0157b9b3-17a1-4600-8d58-2fba3c45b430.jpeg" alt /></p>
<p>My result is Singapore because I hosted the server in Singapore region. Your result may be different depends on the region where you hosted the server.</p>
<p><strong>Okay, That’s all. How easy. I hope you can deploy your own VPN Server! Thank you!</strong></p>
]]></content:encoded></item></channel></rss>