<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Inhwa Son</title>
    <description>The latest articles on DEV Community by Inhwa Son (@nanun_inna).</description>
    <link>https://dev.to/nanun_inna</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%2F2143834%2F5558f6a5-c369-4604-b68f-fe158e660b42.JPG</url>
      <title>DEV Community: Inhwa Son</title>
      <link>https://dev.to/nanun_inna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nanun_inna"/>
    <language>en</language>
    <item>
      <title>AWS Deployment Best Practices: Let's make your own SPA web app! - (2)</title>
      <dc:creator>Inhwa Son</dc:creator>
      <pubDate>Tue, 12 Nov 2024 20:29:16 +0000</pubDate>
      <link>https://dev.to/nanun_inna/aws-deployment-best-practices-lets-make-your-own-spa-web-app-2-5g9k</link>
      <guid>https://dev.to/nanun_inna/aws-deployment-best-practices-lets-make-your-own-spa-web-app-2-5g9k</guid>
      <description>&lt;h2&gt;
  
  
  Key Content (✅ is in this post)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AWS connects with GitHub &lt;/li&gt;
&lt;li&gt;S3 UI web hosting &lt;/li&gt;
&lt;li&gt;Store my SSL/TLS certification in AWS Certificate Manager ✅&lt;/li&gt;
&lt;li&gt;Connect CloudFront with SSL enabled domain ✅&lt;/li&gt;
&lt;li&gt;Authentication with AWS Cognito&lt;/li&gt;
&lt;li&gt;Create RDS to store data&lt;/li&gt;
&lt;li&gt;Create backend based on Lambdas and API Gateway&lt;/li&gt;
&lt;li&gt;AWS Rekognition implementation&lt;/li&gt;
&lt;li&gt;AWS Transcribe implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/nanun_inna/aws-deployment-best-practices-lets-make-your-own-spa-web-app-1-282g"&gt;Series 1&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Domain name&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Store my SSL/TLS certification in AWS Certificate Manager
&lt;/h1&gt;

&lt;p&gt;Now, we deployed our webpage in S3, so let's publish it with SSL certified domain. I am a graduate student so I was provided free 2 domain names from name.com. I use name.com domain because they give you free SSL/TLS certification to protect your website securely.&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%2Fd9qunohx631vneaojqwv.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%2Fd9qunohx631vneaojqwv.png" alt="Image description" width="800" height="474"&gt;&lt;/a&gt;&lt;br&gt;
After acquiring domain name, you can click &lt;code&gt;Active SSL&lt;/code&gt; to issue certificate.&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%2Fr85gkqaokht367v2lt3c.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%2Fr85gkqaokht367v2lt3c.png" alt="Image description" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To issue SSL/TLS certificate, you need to issue CSR. I used &lt;a href="https://csrgenerator.com/" rel="noopener noreferrer"&gt;this website&lt;/a&gt; to issue simply. &lt;strong&gt;Keep in mind that you should never lose this CSR private key.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then after few minutes of verification, you will receive an email with &lt;code&gt;.crt&lt;/code&gt; files with Certification.&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%2Fhfkyooqx1bs6wczdg0nu.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%2Fhfkyooqx1bs6wczdg0nu.png" alt="Image description" width="800" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's go to ACM.&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%2F6sfk1n3g6ekghv5z0wgm.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%2F6sfk1n3g6ekghv5z0wgm.png" alt="Image description" width="800" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyxfv0j1knn6tecba39u.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%2Fhyxfv0j1knn6tecba39u.png" alt="Image description" width="800" height="521"&gt;&lt;/a&gt;&lt;br&gt;
You need to fill in this 3 parts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certification Body: you can find either from name.com or inside of email&lt;/li&gt;
&lt;li&gt;Certificate private key: CSR that I put bold above&lt;/li&gt;
&lt;li&gt;Certificate chain: Since we downloaded &lt;code&gt;.crt&lt;/code&gt; files from email, I run this command to make a chain. Then, paste &lt;code&gt;certificat_chain.crt&lt;/code&gt; in this section.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat SectigoRSADomainValidationSecureServerCA.crt USERTrustRSAAAACA.crt &amp;gt; certificate_chain.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After successfully imported, you can find your Certification is showing your domain properly.&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%2Fv9lqtk5jfi0umv7frxl3.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%2Fv9lqtk5jfi0umv7frxl3.png" alt="Image description" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Connect CloudFront with SSL enabled domain
&lt;/h1&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%2Fzur6gm4jp4opiopz5sbl.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%2Fzur6gm4jp4opiopz5sbl.png" alt="Image description" width="800" height="75"&gt;&lt;/a&gt;&lt;br&gt;
We need to create distribution.&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%2F2ewek75vgelj8j9t8n0y.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%2F2ewek75vgelj8j9t8n0y.png" alt="Image description" width="800" height="425"&gt;&lt;/a&gt;&lt;br&gt;
You can select your s3 bucket for origin, and click &lt;code&gt;Use web endpoint&lt;/code&gt;, then it will change into&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%2Fed1m7topo74b48n721lf.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%2Fed1m7topo74b48n721lf.png" alt="Image description" width="800" height="233"&gt;&lt;/a&gt;&lt;br&gt;
like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4z77i488kegiswuqh7o.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%2Fr4z77i488kegiswuqh7o.png" alt="Image description" width="800" height="300"&gt;&lt;/a&gt;&lt;br&gt;
Since we imported custom certification above, we can check that it shows up under here. So select this to connect.&lt;/p&gt;

&lt;p&gt;After successfully creation, &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flalq5c7ts1i29qye710v.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%2Flalq5c7ts1i29qye710v.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
The blue box and red box are important. I had issue with missing &lt;code&gt;Alternate domain names&lt;/code&gt;. After filling in, I could successfully connect my CloudFront.&lt;/p&gt;

&lt;p&gt;When it's successfully deployed, we can see our website anywhere!&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%2Fpul2ltefsqzeqqplru44.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%2Fpul2ltefsqzeqqplru44.png" alt="Image description" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AWS Deployment Best Practices: Let's make your own SPA web app! - (1)</title>
      <dc:creator>Inhwa Son</dc:creator>
      <pubDate>Thu, 07 Nov 2024 01:09:49 +0000</pubDate>
      <link>https://dev.to/nanun_inna/aws-deployment-best-practices-lets-make-your-own-spa-web-app-1-282g</link>
      <guid>https://dev.to/nanun_inna/aws-deployment-best-practices-lets-make-your-own-spa-web-app-1-282g</guid>
      <description>&lt;p&gt;In this blog post, I will guide you through creating your own website from scratch and deploying it in the real world. As mentioned earlier, there are some prerequisites, as I’ll be reusing elements from my &lt;a href="https://dev.to/nanun_inna/secure-your-website-best-practices-for-aws-deployment-5c48"&gt;previous post&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An AWS account&lt;/li&gt;
&lt;li&gt;An SSL-certified domain name&lt;/li&gt;
&lt;li&gt;A GitHub repository for the project&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;I created my web application based on this flow diagram. A more detailed explanation can be found in the README.md file in the &lt;a href="https://github.com/inhwaS/spa-cloud-dear-diary.git" rel="noopener noreferrer"&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhngg8kh0z1w2yh9a45b2.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%2Fhngg8kh0z1w2yh9a45b2.png" alt="Image description" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Content (✅ is in this post)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AWS connects with GitHub ✅&lt;/li&gt;
&lt;li&gt;S3 UI web hosting ✅&lt;/li&gt;
&lt;li&gt;Store my SSL/TLS certification in AWS Certificate Manager&lt;/li&gt;
&lt;li&gt;Connect CloudFront with SSL enabled domain&lt;/li&gt;
&lt;li&gt;Authentication with AWS Cognito&lt;/li&gt;
&lt;li&gt;Create RDS to store data&lt;/li&gt;
&lt;li&gt;Create backend based on Lambdas and API Gateway&lt;/li&gt;
&lt;li&gt;AWS Rekognition implementation&lt;/li&gt;
&lt;li&gt;AWS Transcribe implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.to/nanun_inna/aws-deployment-best-practices-lets-make-your-own-spa-web-app-2-5g9k"&gt;Series 2&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  AWS connection with GitHub workflow
&lt;/h2&gt;

&lt;p&gt;Since I want to update my S3 bucket whenever the UI changes, I created a workflow and connected it to my AWS account. To link GitHub with AWS, I created a new IAM user with specific policies:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bw45hj1rdxd8r03ga2e.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%2F3bw45hj1rdxd8r03ga2e.png" alt="Image description" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the user is created, you will receive an access key and a secret key. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8kspyawg3jug3awcwss.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%2Fi8kspyawg3jug3awcwss.png" alt="Image description" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you need to add these keys to GitHub Secrets.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficm0dmtnnbk5f5ij8wo9.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%2Ficm0dmtnnbk5f5ij8wo9.png" alt="Image description" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploy into S3 bucket
&lt;/h2&gt;

&lt;p&gt;To deploy into s3 bucket, we need to create &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; file from the project root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Deploy to S3

on:
  push:
    branches:
      - main
    paths:
      - "**/*"

jobs:
  build_and_deploy:
    if: contains(github.event.head_commit.message, '[build]')
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up Node.js
      uses: actions/setup-node@v3

    - name: Install dependencies
      run: |
        npm install

    - name: Build React app
      run: |
        npm run build

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v2
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ secrets.AWS_REGION }}

    - name: Validate AWS credentials
      run: |
        if aws sts get-caller-identity &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then
          echo "AWS credentials are valid."
        else
          echo "Error: AWS credentials are invalid or not configured."
          exit 1
        fi

    - name: Deploy to S3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
      run: |
        aws s3 sync ./build/ s3://${{ secrets.S3_BUCKET_NAME }}/ --delete --exclude ".git/*"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this part; &lt;code&gt;contains(github.event.head_commit.message, '[build]')&lt;/code&gt;, I intentionally added since I don't want to trigger too many github actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling Web Hosting
&lt;/h2&gt;

&lt;p&gt;Once deployment is complete, you can check the deployed version by enabling web hosting in S3. To do this, go to your S3 bucket, navigate to &lt;strong&gt;Properties&lt;/strong&gt; tab, and select &lt;strong&gt;Static website hosting&lt;/strong&gt;. After enabling it, you will receive a URL to view your deployment.&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%2Fj8954tnswdx4nkvgsb6l.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%2Fj8954tnswdx4nkvgsb6l.png" alt="Image description" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;p&gt;If you encounter a 403 Forbidden error, try updating the bucket policy under the &lt;strong&gt;Permissions&lt;/strong&gt; tab with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By clicking the URL, you can confirm that your code has been successfully hosted.&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%2Fb7u6zp641pvpny8qdfiy.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%2Fb7u6zp641pvpny8qdfiy.png" alt="Image description" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>New Journey begins with MLH Fellowship 2024 Fall B</title>
      <dc:creator>Inhwa Son</dc:creator>
      <pubDate>Wed, 02 Oct 2024 18:43:04 +0000</pubDate>
      <link>https://dev.to/nanun_inna/new-journey-begins-with-mlh-fellowship-2024-fall-b-3fhb</link>
      <guid>https://dev.to/nanun_inna/new-journey-begins-with-mlh-fellowship-2024-fall-b-3fhb</guid>
      <description>&lt;p&gt;After knocking on the door of the MLH Fellowship Program three times, I finally became a Fellow!&lt;/p&gt;

&lt;p&gt;I learned about the program from a friend I met at UKC last year. Although I reached the final interview stage for both the 2023 Fall and 2024 Spring batches, I was rejected at the Project Matching stage each time. I applied again for the 2024 Fall Batch, and finally, I received an email confirming that I was matched with an MLH project and have completed the registration process.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is MLH Fellowship?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://fellowship.mlh.io/" rel="noopener noreferrer"&gt;https://fellowship.mlh.io/&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%2Fekj3mytr3vixx5qop6p7.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%2Fekj3mytr3vixx5qop6p7.png" alt="Image description" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's not exactly an internship, but you can think of it as an internship-alternative program that lasts for 12 weeks. Around 10 people form a pod to work on projects sponsored by external organizations, while also receiving training throughout the 12 weeks. And of course, you get paid! (Up to $5,000)&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%2Ffcjhtpy41mxmnrdpndc7.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%2Ffcjhtpy41mxmnrdpndc7.png" alt="Image description" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I applied to the Site Reliability Engineering (SRE) track, but I could have applied to up to three programs, including Open Source and Web3.&lt;/p&gt;

&lt;p&gt;And I successfully got accepted into the SRE track!&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Apply
&lt;/h2&gt;

&lt;p&gt;Selection process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Submit application&lt;/li&gt;
&lt;li&gt;Personal interview&lt;/li&gt;
&lt;li&gt;Technical interview&lt;/li&gt;
&lt;li&gt;Project matching&lt;/li&gt;
&lt;li&gt;Enroll as Fellow
These are the five steps in total.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Submit application
&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%2F0driue33vx19lcw19c6v.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%2F0driue33vx19lcw19c6v.png" alt="Image description" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After reading testimonials from those who were accepted, it seems that the application submission is extremely important.&lt;/p&gt;

&lt;p&gt;You have to answer two questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why do you want to become an MLH Fellow? (500 words)&lt;/li&gt;
&lt;li&gt;The MLH Fellowship is a diverse community that welcomes Fellows from a wide range of experiences and backgrounds. What perspective or experience will you bring to the fellowship to strengthen our community?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The questions haven’t changed throughout the three times I applied, so it seems like they keep these the same.&lt;/p&gt;

&lt;p&gt;I filled almost all 500 words when I submitted mine.&lt;/p&gt;

&lt;p&gt;Although the application period for this program is quite long, it seems to operate on a rolling basis, so I recommend preparing in advance and applying as early as possible. This way, you can get to the interviews faster.&lt;/p&gt;

&lt;p&gt;Also, when submitting the application, you need to provide a GitHub repository that represents you. In my case, I had to highlight my DevOps experience, so I submitted a project I worked on during a hackathon. Though it was a simple setup, it had a front-end, back-end, and database, so I used that for my submission.&lt;/p&gt;

&lt;h3&gt;
  
  
  2,3. Interviews
&lt;/h3&gt;

&lt;p&gt;After submitting the application, you’ll receive an invitation for the Personal Interview.&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%2Fsslt5huzh4qn79wqxujx.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%2Fsslt5huzh4qn79wqxujx.png" alt="Image description" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both the 2nd and 3rd interviews are quite short, lasting only about 15 minutes, so there’s no need to feel too much pressure. The questions weren’t particularly difficult; they mainly focused on why I wanted to pursue this field and why I was interested in the program.&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%2Fn43xqj8lvcsvqrx3fk2j.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%2Fn43xqj8lvcsvqrx3fk2j.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the third interview, you’ll be asked to explain the project you submitted in more detail, with follow-up questions based on that. They might ask what part of the project you were responsible for, whether you encountered any challenges, and if there are areas you think could be improved or things you wish you had done differently. The questions are aimed at gauging how seriously you took the project and whether you had ownership over it.&lt;/p&gt;

&lt;p&gt;After completing the third stage, you’ll automatically receive an email with a detailed survey about the projects. The first time I applied, I foolishly completed the project matching survey a week late.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Project matching
&lt;/h3&gt;

&lt;p&gt;For both the 2023 Fall and 2024 Spring batches, I couldn't progress past the fourth stage.&lt;/p&gt;

&lt;p&gt;I was placed on a waitlist, with the hope that they would match me with a suitable project if one came up. But after a few months, I received the dreaded email starting with "Unfortunately..."&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%2Fp5vr3kzm6fsgaya8ii6n.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%2Fp5vr3kzm6fsgaya8ii6n.png" alt="Image description" width="800" height="458"&gt;&lt;/a&gt;&lt;br&gt;
However, this week, I received an acceptance email.&lt;br&gt;
I got in on the third try!&lt;/p&gt;




&lt;h2&gt;
  
  
  What's on next?
&lt;/h2&gt;

&lt;p&gt;Starting on 9/30, I began my new journey as an MLH Fellow, and now I'm in week 1. It's been really exciting to meet people from all over the world who share common interests. My project will be JavaScript-based, so it will offer me many opportunities to learn."&lt;/p&gt;

</description>
      <category>mlh</category>
      <category>mlhfellowship</category>
      <category>csgradlife</category>
    </item>
    <item>
      <title>Secure Your Website: Best Practices for AWS Deployment</title>
      <dc:creator>Inhwa Son</dc:creator>
      <pubDate>Tue, 01 Oct 2024 01:27:20 +0000</pubDate>
      <link>https://dev.to/nanun_inna/secure-your-website-best-practices-for-aws-deployment-5c48</link>
      <guid>https://dev.to/nanun_inna/secure-your-website-best-practices-for-aws-deployment-5c48</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In this post, I’ll share my perspective on securely deploying a simple web page, based on key principles I’ve learned from cloud computing in the fall of 2024. When discussing "security" in web development, there are numerous aspects to consider, but I’ll focus on four critical areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dockerization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD Pipeline&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running on ECS Fargate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSL-Enabled Domain&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additionally, I’ll demonstrate how to set up the website to be &lt;strong&gt;Highly Available (HA)&lt;/strong&gt;, ensuring reliability and uptime even during traffic spikes or failures. &lt;/p&gt;

&lt;h3&gt;
  
  
  Before we start
&lt;/h3&gt;

&lt;p&gt;I am using this repository to create simple front, back, and nginx architecture.&lt;br&gt;
&lt;a href="https://github.com/inhwaS/supreme" rel="noopener noreferrer"&gt;https://github.com/inhwaS/supreme&lt;/a&gt;&lt;br&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%2F9nhs87zq98vujj9wgqf1.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%2F9nhs87zq98vujj9wgqf1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  1. Dockerization
&lt;/h1&gt;

&lt;p&gt;Containerizing the application ensures consistency across different environments, which is essential for security.&lt;/p&gt;

&lt;p&gt;In the repository, I created a &lt;code&gt;docker-compose.yml&lt;/code&gt; file to run all containers under the same network. However, &lt;code&gt;nginx&lt;/code&gt; is only mapped to port &lt;code&gt;80&lt;/code&gt; for &lt;code&gt;HTTP&lt;/code&gt;, while the &lt;code&gt;demo(backend)&lt;/code&gt; and &lt;code&gt;front(frontend)&lt;/code&gt; are only exposing their respective folders, allowing communication solely within the same bridge network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supreme/
├── README.md
├── docker-compose.yml
├── demo/
│   └── Dockerfile
├── front/
│   └── Dockerfile
└── nginx/
    └── Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  2. CI/CD Pipeline
&lt;/h1&gt;

&lt;p&gt;Automating the deployment process, from building a Docker image to pushing it into Amazon ECR (Elastic Container Registry), reduces human error and improves security.&lt;/p&gt;

&lt;p&gt;Under the &lt;code&gt;.github/workflows folder&lt;/code&gt;, I created a &lt;code&gt;release.yml&lt;/code&gt; file to automate the pipeline for pushing Docker images into the ECR repository. Since I’m using an AWS Academy account, it’s mandatory to include the &lt;code&gt;AWS_SESSION_TOKEN&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Log in to Amazon ECR
        uses: aws-actions/amazon-ecr-login@v1
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_SESSION_TOKEN: ${{ secrets.AWS_SESSION_TOKEN }}
          AWS_REGION: ${{ secrets.AWS_REGION }}

      - name: Build and push Docker images
        env:
          AWS_REGION:  ${{ secrets.AWS_REGION }}
          ECR_REPO_NAME_BACKEND: supreme-backend
          ECR_REPO_NAME_FRONTEND: supreme-frontend
          ECR_REPO_NAME_NGINX: supreme-nginx
          IMAGE_TAG: latest
          ACCOUNT_ID: ${{ secrets.ACCOUNT_ID }}
        run: |
          # Full ECR repository URIs
          ECR_URI_BACKEND="${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME_BACKEND}"
          ECR_URI_FRONTEND="${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME_FRONTEND}"
          ECR_URI_NGINX="${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME_NGINX}"

          # Build images for both architectures
          echo "Building multi-architecture Docker images..."
          docker buildx build --platform linux/amd64,linux/arm64 -t ${ECR_URI_BACKEND}:${IMAGE_TAG} --push ./demo
          docker buildx build --platform linux/amd64,linux/arm64 -t ${ECR_URI_FRONTEND}:${IMAGE_TAG} --push ./front
          docker buildx build --platform linux/amd64,linux/arm64 -t ${ECR_URI_NGINX}:${IMAGE_TAG} --push ./nginx

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

&lt;/div&gt;



&lt;p&gt;After writing the file, I stored the relevant keys in the GitHub settings.&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%2F2mo52em1gv8nxv4qdw3v.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%2F2mo52em1gv8nxv4qdw3v.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whenever a commit is pushed to the &lt;code&gt;master&lt;/code&gt; branch, it automatically builds the Docker image and pushes it to the ECR repository that I have already set up. To create ECR, please refer &lt;a href="https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html" rel="noopener noreferrer"&gt;this tutorial&lt;/a&gt;.&lt;br&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%2F41coqr6nii878npt0yya.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%2F41coqr6nii878npt0yya.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
When the build is done,&lt;br&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%2Fio866ync7cdetipyc1t1.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%2Fio866ync7cdetipyc1t1.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
 we can confirm that ECR is updated with new images.&lt;br&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%2Fpyokbjc6dhzd2t7vqfia.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%2Fpyokbjc6dhzd2t7vqfia.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  3. Running on ECS Fargate
&lt;/h1&gt;

&lt;p&gt;Utilizing Amazon’s ECS Fargate allows the application to run securely in a serverless environment, with built-in scaling and isolation.&lt;/p&gt;

&lt;p&gt;With the image stored in ECR, we can create a Task Definition to run ECS services. Based on my repository, it will create three different containers.&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%2Fiqji2neyb4ljwbesxtxj.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%2Fiqji2neyb4ljwbesxtxj.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%2Fpab9j1tv5mrl3pv59k5e.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%2Fpab9j1tv5mrl3pv59k5e.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
After successfully creating all the containers, we can access the nginx container using the assigned IP for that container, and they communicate successfully.&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%2Fhtrrkhsjh7i0qi561nom.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%2Fhtrrkhsjh7i0qi561nom.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%2F6ux8gr6rhm402gh2mt9g.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%2F6ux8gr6rhm402gh2mt9g.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  4. SSL-Enabled Domain
&lt;/h1&gt;

&lt;p&gt;Configuring a custom domain with SSL ensures encrypted communication between the user and the website, enhancing trust and security.&lt;/p&gt;

&lt;p&gt;To use my personal domain, I tried using name.com since it offers two free domain names under the GitHub Student Developer Pack.&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%2Frzry0uncwow7hp79oqg6.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%2Frzry0uncwow7hp79oqg6.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I registered dragonai.live and stored my SSL certificate in ACM.&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%2Fh3gr33lztnqb0xwzs6uy.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%2Fh3gr33lztnqb0xwzs6uy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also wrote how to issue name.com domain &lt;a href="https://trippy-sanfran.tistory.com/44" rel="noopener noreferrer"&gt;here in Korean&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After properly setting up the load balancer for my ECS services, I was able to create a secure website with a valid SSL certificate.&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%2Fbhwojet97n5igkydxnmj.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%2Fbhwojet97n5igkydxnmj.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%2Fopb6n3ilaudw8wwjt5bc.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%2Fopb6n3ilaudw8wwjt5bc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  High Available (HA) Website
&lt;/h1&gt;

&lt;p&gt;To ensure high availability for my website, I need to host servers in different availability zones in AWS. Since I'm running my containers on ECS, I had to configure IP instances accordingly.&lt;/p&gt;

&lt;p&gt;Since this involves a lot of steps, I would like to recommend a prompt for GenAI that I can use to get successful instructions from ChatGPT.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm looking to set up a highly available website on AWS using ECS and other AWS services. I already have my SSL-certified domain name. Could you provide a step-by-step guide that includes:

1. Creating a VPC
2. Setting up load balancers
3. Deploying a container with that load balancer in ECS
4. Connecting my domain to the ECS service

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

&lt;/div&gt;



&lt;p&gt;My load balancer looks like this:&lt;br&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%2F82n434n5y25mpznbk53l.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%2F82n434n5y25mpznbk53l.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%2Fgjovr3jdlg5y4vktul1r.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%2Fgjovr3jdlg5y4vktul1r.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion:
&lt;/h1&gt;

&lt;p&gt;This blog post may not be very beginner-friendly, as it covers many different concepts. However, I believe the most challenging part will be creating a "Highly Available" website, for which I provided a prompt. I outlined some mandatory steps from a security perspective, so for detailed instructions, you can seek help from GenAI and follow the steps they provide. While it does require a basic understanding of web architecture, if you start following the steps I outlined and ask for details from GenAI, you'll be able to run a "secure website" on your own.&lt;/p&gt;

&lt;p&gt;Thank you for reading, and cheers!&lt;/p&gt;

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