# AWS S3 Static Hosting with CloudFront

ကျွန်တော်တို့ Frontend Web project တွေကို SSR မပါပဲ ရေးခဲ့တယ်ဆိုရင် hosting အတွက် ကျွန်တော်အကြိုက်ဆုံးကတော့ S3 ပေါ်မှာ ထားပြီး Cloudfront နဲ့ static host တာပါ။ ဒီနည်းက ငွေကြေးအရလည်း တွက်ချေကိုက်ပြီးတော့ speed, reliability and availability လည်း အရမ်းကောင်းပါတယ်။ ဒီလို လုပ်ဖို့ အတွက် လိုအပ်တဲ့ AWS Services တွေကတော့

1. AWS S3
    
2. AWS CloudFront
    
3. AWS Certificate Manager (ACM) တို့ပဲ ဖြစ်ပါတယ်။
    

### Creating S3 Bucket

1. Browser မှာ AWS Account login ဝင်ပြီးရင် S3 Management Console ထဲသွားပြီး **Create bucket** ကိုနှိပ်ပါ။
    
2. Bucket name ကိုယ်ကြိုက်တာပေးပါ Bucke name ပေးတဲ့ Ploicy ကို ဒီမှာ ([bucketnamingrules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)) ဖတ်ကြည့်လို့ရပါတယ်။ ကျွန်တော်ကတော့ **kalaung-org-test** လို့ ပေးလိုက်ပါတယ်။
    
3. AWS Region နေရာမှာ Asia Pacific (Singapore) ကိုရွေးလိုက်ပါတယ် မြန်မာနဲ့ အနီးဆုံးမို့လို့ပါ။
    
4. Object Ownership မှာ ACLs disabled ကိုရွေးပေးလိုက်ပါ။
    
5. အောက်ဆုံးထိ scroll ဆွဲပြီး အောက်ဆုံးမှာရှိတဲ့ **Create bucket** ကိုနှိပ်လိုက်လို့ရပါပြီ။ \*\*(\*\*ကျန်တာတွေကို ကျော်သွားလို့ရပါတယ်)။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684581455981/c0d17a33-e62e-4f4f-85e0-d2f52f5ef2b3.png align="center")
    

### Creating CloudFront Distribution

1. CloudFront Console ထဲသွားပြီး **Create Distribution** ဆိုတာကို နှိပ်ပါ။
    
2. Origin domain ဆိုတဲ့ နေရာမှာ ခုနက ဆောက်ခဲ့တဲ့ S3 Bucket ကို ရွေးလိုက်ပါ။
    
3. Origin Access မှာ Origin access control settings (recommended) ကိုရွေးပြီး  
    Origin access control ဘေးမှာ Create Control Setting ဆိုတာကိုနှိပ်ပြီး  
    ပေါ်လာတဲ့ Box ထဲမှာ Do not override authorization header လေးကို On ပေးပြီး **Create** ကို နှိပ်ပါ။
    
4. အလယ်လောက်အထိ Scroll ဆွဲသွားလိုက်ရင် **Web Application Firewall (WAF)** ဆိုတဲ့ နေရာကိုရောက်ပါမယ်။ အဲ့မှာ **Do not enable security protections** ကိုပဲ ရွေးပေးလိုက်ပါ။
    
5. ဒီလောက်ဆို ကျွန်တော်တို့ လိုအပ်တာတွေ ရပါပြီ ကျန်တွေကို ကျော်သွားပြီး အောက်ဆုံးက **Create Distribution** ဆိုတာကိုနှိပ်လိုက်လို့ရပါပြီ။
    
6. ဒီနေရမှာ တခု သတိထားရမှာက ကျွန်တော်တို့က S3 bucket ကို private ထားပြီး Origin Access control နဲ့သွားမှာ ဖြစ်တဲ့အတွက် CloudFront ကနေ S3 ကို Read access ရဖို့ S3 bucket မှာ Ploicy ရေးပေးဖို့လိုတဲ့ အကြောင်းနဲ့ ရေးရမဲ့ policy ကို CloudFront creating ပြီးရင် ပေးမယ်ဆိုတဲ့အကြောင်း သတိပေးထားပါတယ်။
    
7. ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684583662462/88780cd0-1d20-46b2-a803-03d7d0292f07.png align="center")
    
    Distribution create ပြီးသွားတဲ့အခါမှာ ဒီလိုလေး ပေါ်လာပါလိမ့်မယ်။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684584206725/a2ce03e4-d9ca-4752-930d-7f5f13a0496b.png align="center")
    
8. Copy policy ကိုနှိပ်ပြီး policy ကို ကော်ပီကူးလိုက်ပါ။ ပြီးရင် Go to bucket permissions.... ဆိုတာကိုနှိပ်ပြီး permission ထည့်ရမဲ့နေရာကို သွားထည့်လိုက်ရုံပါပဲ။
    
9. ပွင့်လာတဲ့ Browser new tab ထဲက Bucket Policy ဘေးနားက Edit ဆိုတာကို နှိပ်ပြီး ကူးလာတာလေး ထည့်ပေးပြီး **save** လိုက်ရုံပါပဲ။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684584460470/ec976dcd-a396-4e2c-a745-39bb0af6628c.png align="center")
    

### Testing Distribution

ကျွန်တော်တို့ လုပ်ခဲ့တာတွေ အလုပ် လုပ်/မလုပ် စမ်းဖို့ index.html ဖိုင်တစ်ခု ဖန်တီးပြီး S3 ပေါ်တင်ကြည့်ပါမယ် ကျွန်တော်ကတော့ index.html ဖိုင်ထဲမှာ အောက်က code တွေထည့်ရေးပြီးသိမ်းလိုက်ပါတယ်။

```xml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Testing</title>
</head>
<body>
    <h1>Hello</h1>
    <p>Testing the S3 static website hosting width CloudFront</p>
</body>
</html>
```

html ဖိုင်ရလာပြီဆိုရင် S3 bucket ကိုဖွင့်ပြီး အဲ့ဖိုင်ကို upload တင်ပေးလိုက်ပါမယ်။

ဖိုင်တင်ပြီးပြီဆိုရင် စမ်းကြည့်ဖို့ CloudFront console ထဲက Distributions ထဲသွားပါ။ အောက်က ပုံထဲကလိုမျိုး မြင်ရပါလိမ့်မယ်။ အဲ့ထဲက Domain name ဆိုတာလေးကို ကော်ပီကူးပြီး new tab မှာ ဖွင့်ကြည့်ပါ အဆင်ပြေပြီလို့ မထင်ပါနဲ့ Access Denied ဆိုတာပဲ မြင်ရမှာပါ :3 ။ ဘာလို့လဲဆိုတော့ ကျွန်တော်တို့ Default root object နဲ့ custom error page တွေ မသတ်မှတ်ပေးရသေးလို့ပါ။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684585499330/1cd1a790-9abd-483b-860d-8a03b2030e8e.png align="center")

Default root object ကို သတ်မှတ်ဖို့အတွက်။ Distribution ID ကို နှိပ်ပြီး ဖွင့်လိုက်ပါ။ အောက်က ပုံထဲကလိုပေါ်လာရင် General &gt;&gt; Settings ထဲက Edit ကိုနှိပ်ပါ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684585684079/28b150f3-44cd-472c-b233-fc317c3b6c85.png align="center")

ပြီးရင် Default root object မှာ index.html လို့ ထားလိုက်ပြီး Save changes ကို နှိပ်လိုက်ပါ။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684585761092/c4ca12cc-8713-466a-a270-bca4a62d37db.png align="center")

ပြီးရင် Error pages ထဲသွားပြီး Create custom error responses ကိုနှိပ်ပါမယ်။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684585887084/9cc7959d-d700-485f-84bd-7efabdd77882.png align="center")

ပုံထဲကလိုမျိုး သတ်မှတ်ပါမယ် 403 အတွက် တခု 404 အတွက် တခု နှစ်ခု လုပ်ရပါမယ်။ ကိုယ့် project မှာ 403, 404 page တွေ ပါရင် အဲ့ဖိုင်ကို သတ်မှတ်ပေးပြီး မပါရင်တော့ index.html ပဲ ထားလိုက်ပါ။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684690778544/31d54694-2bfd-4c0b-9e31-171a213c864a.png align="center")

အောက်ကလိုလေး ဖြစ်သွားပြီဆိုရင်တော့ ကျွန်တော်တို့ cloudfront domain ကို ဖွင့်ကြည့်လို့ရပါပြီ။

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684690858926/8726838d-2af9-4453-8be1-432eb24ea26e.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684586306070/8487402a-3d1d-430f-adab-35e9f973eeec.png align="center")

ဒီတစ်ခါတော့ တကယ် အလုပ်လုပ်ပြီနော်။ ဒါဆိုရင်တော့ ကျွန်တော်တို့ CloudFront မှာ static hosing ပြီးသွားပါပြီ။ ကိုယ်ပိုင် Domain နဲ့ ချိတ်ဖို့ တဆင့်ပဲ ကျန်ပါတော့တယ်။

### Linking with own domain

1. Domain ချိတ်ဖို့အတွက် Default root object ထည့်တုန်းကလိုပဲ CloudFront distribution ရဲ့ General &gt;&gt; Settings ထဲက Edit ကိုနှိပ်ပါ။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684592344576/7c6f38bc-3bcc-4bb1-8245-882aa28a0acf.png align="center")
    
2. Alternate domain name (CNAME) အောက်မှာ Add item ကိုနှိပ်ပြီး ချိတ်ချင်တဲ့ domain name ထည့်ပေးရပါမယ်။
    
3. SSL သုံးဖို့အတွက် Certificate မရှိသေးတဲ့အတွက် Request certificate ကိုနှိပ်ပြီး certificate ACM ထဲမှာ request သွားလုပ်ပါမယ်။ Certificate Request လုပ်ပုံ အသေးစိတ်ကို နောက်တစ်ဆင့်မှာ ဆက်ရေးပေးပါမယ်။
    
4. Certificate request လုပ်ပြီးပြီဆိုရင်တော့ ဘေးက မျှားဝိုင်းလေးကို နှိပ်ပြီး refresh လုပ်လုပ်ကြည့်ပါ။ Certificate ပေါ်လာရင်တော့ Certificate ကို ရွေးပေးပြီး save changes နှိပ်လိုက်ပါ။
    
5. ဒီအဆင့်အားလုံး ပြီးပြီ cloudfront distribution CNAME ကိုလည်း DNS point ပြီးပြီဆိုရင်တော့ ကိုယ့် domain ကို browser မှာ ဖွင့်လိုက်တာနဲ့ S3 မှာ ကိုယ်တင်ထားတဲ့ Website လေး အဆင်ပြေပြေ ပေါ်လာတော့မှာ ဖြစ်ပါတယ်။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684592432407/859f3f88-38a1-4430-b105-42ab5775e627.png align="center")
    

### Requesting SSL certificate in ACM

1. Request certificate &gt;&gt; Request a public certificate &gt;&gt; **Next** ကိုနှိပ်ပါမယ်။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684587362641/3afce1b2-748a-41ec-bc6a-f1b255ee4e28.png align="center")
    
2. Domain names နေရာမှာ ကိုယ် Certificate လိုချင်တဲ့ domain name ထည့်ပြီး Request ကိုနှိပ်ပါ။ Certificate list ထဲ ရောက်သွားပါမယ်။ Certificate list ထဲမှာ request လုပ်လိုက်တဲ့ doamin name မပေါ်လာသေးရင် refresh လုပ်ကြည့်ပါ။
    
3. Certificate list ထဲမှာ request လုပ်လိုက်တဲ့ doamin name ရောက်လာပြီဆိုရင်တော့ Validation လုပ်ဖို့အတွက် **Certificate ID** ကိုနှိပ်လိုက်ပါ။
    
4. Pending validation ဆိုပြီး ပေါ်နေပါလိမ့်မယ်။ အဲ့ထဲက CNAME record ကို ကိုယ့်ရဲ့ dns controller ထဲမှာ သွားထည့်ပါမယ်။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684588083544/ee0d96d8-56bd-44a0-94b6-de6ca87e1df3.png align="center")
    
5. DNS record ထည့်တာကတော့ ကိုယ်သုံးတဲ့ Domain Controller ပေါ်မူတည်ပြီး အနည်းငယ်ကွာခြားနိုင်တာကြောင့် အသေးစိတ် မရေးတော့ပါဘူး။ Record က နှစ်ခုထည့်ရပါမယ်။ အနီနဲ့ တစ်ခုက ကိုယ်ချိတ်လိုက်တဲ့ Domain ကိုဖွင့်လိုက်ရင် cloudfront ကို route ဖို့ ဖြစ်ပြီး ၊ အစိမ်းနဲ့တစ်ခုကတော့ အခုလုပ်နေတဲ့ domain validation အတွက် ဖြစ်ပါတယ်။
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1684588495212/c0811273-f814-41f6-a00e-27c4a8b9f5a7.png align="center")
    
6. DNS update ဖြစ်အောင်စောင့်ပြီး Refresh လုပ်ကြည့်လို့ domain validation success ဖြစ်သွားရင်တော့ ဒီ SSL Certificate ကို AWS services တွေမှာ ချိတ်သုံးလို့ရပါပြီ။
    

စာလည်း တော်တော် ရှည်သွားပြီဆိုတော့ Gitlab CI သုံးပြီး S3 ပေါ်ကို ဘယ်လို Deploy လုပ်မလဲဆိုတာနဲ့ CloudFront cache တွေ ဘယ်လို ရှင်းမလဲဆိုတာလေး မနက်ဖြန်မှ ဒီလင့်မှာ ( [https://kalaung.org/gitlab-ci-deploy-to-s3cloudfront](https://kalaung.org/gitlab-ci-deploy-to-s3cloudfront) ) ဆက်ရေးပေးပါ့မယ်။
