Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: AWS

雲端除存服務的費用

Posted on 2024 年 3 月 5 日2024 年 3 月 5 日 By 日落 在〈雲端除存服務的費用〉中尚無留言

剛好有一些資料打算封存,所以嘗試各種雲端除存服務。

以儲存空間計費 (忽略資料傳輸費用) 的話,由貴到便宜分別是:

  1. AWS S3
  2. Google Cloud Storage
  3. BackBlaze B2

原本以為 BackBlaze 沒有亞洲資料中心,傳輸速度會很慢,但一直都有維持在 5 MB/s 以上,還算不錯。

Azure 還沒研究,等下一輪吧

Tags:AWS, BackBlaze, GCP, 資訊學習

將檔案複製到 AWS S3 並設定為公開讀取

Posted on 2024 年 2 月 13 日2024 年 2 月 13 日 By 日落 在〈將檔案複製到 AWS S3 並設定為公開讀取〉中尚無留言

bucket 預設為公開,但檔案上傳到 bucket 上預設並不會是公開的。

可以在上傳檔案時指定 --acl 來設定 object 的權限:

aws s3 cp --recursive files/ s3://my-bucket/files/ --acl public-read
aws s3 sync files s3://my-bucket/files --acl public-read
Tags:AWS

s3fs 參數設定

Posted on 2022 年 7 月 16 日2022 年 11 月 4 日 By 日落 在〈s3fs 參數設定〉中尚無留言

s3fs 是透過 Linux FUSE 界面來與 AWS S3 服務串接,這樣就可以 mount 一個容量幾乎是無限大的 device。

雖然官方文件的 README 很簡單,事實上照著做一定會遇到一堆問題。踩雷以後建議按照以下步驟來規劃並設定 s3fs 的參數:

  1. AWS 設定
    1. 建立 S3 bucket
    2. 建立 IAM 的存取政策 (policy)
  2. server 設定
    1. 建立暫存路徑
    2. s3fs mount 參數設定、測試
    1. fstab 設定

More “s3fs 參數設定” »

Tags:AWS, Web

Laravel UrlGenerator 判斷 HTTP or HTTPS 的因素

Posted on 2019 年 10 月 7 日2021 年 3 月 12 日 By 日落 在〈Laravel UrlGenerator 判斷 HTTP or HTTPS 的因素〉中尚無留言

第一個要求 Laravel 要使用 HTTP or HTTPS (以下簡稱 protocol … 因為字太多了 .._Drz) 的方法,其實就是在「.env」做設定,例如:

APP_URL=http://zeroplex.tw

再來網路上應該會找到,要開發者在 AppServiceProvider 中加入設定:

URL::forceScheme('https');

這邊的 URL facade,可以從 config/app.php 中追蹤到,是 IlluminateRoutingUrlGenerator::class 的 alias,設定了 forceSheme() 以後,未來透過 UrlGenerator 建立的 link 都會是設定好的 protocol。

BUT …. 就是這個 BUT,若是遇到另一個其他的 method 來產生 URL (例如 IlluminateRoutingRedirector::route() …),這樣就可能吃到開發者設定的 protocol ,則由 Laravel 會自動抓進來的 request 來判斷該用什麼 protocol,若 application 剛好是靠 Nginx 在 handle HTTP SSL 的話,request 到 Laravel 這端時 HTTPS 就已經轉成 HTTP,導致 Laravel 以為 application 沒有上 HTTPS。

若要讓 reverse proxy 後面的 Laravel application 都固定用 HTTPS 的話,可以再到 app/Http/Middleware/TrustedProxy.php 去修改設定,讓 Laravel 識別 proxy 做出對應的動作 (給正確的 protocol)。

Ref: Laravel 5 force HTTPS issue with login routing to HTTP

Tags:AWS, Laravel, Nginx, PHP

Build AWS EC2 for CodeDeploy

Posted on 2019 年 5 月 31 日2021 年 3 月 12 日 By 日落 在〈Build AWS EC2 for CodeDeploy〉中尚無留言

最後更新時間:2019/05/31

文章開頭先謝謝 ellery 大大,沒有你提醒,我大概會繼續通靈 debug 幾個禮拜 XD

先說明 CodeDeploy 大概的運作機制:

  1. 先設定好 EC2 的基本權限 (IAM)
  2. 要支援 CodeDeploy 的 EC2 instance 必須安裝 CodeDeploy agent (很重要,EC2 上 trigger event 都是靠這個 agent)
  3. 設定 CodeDeploy 上 Application 對應到的 EC2 instances
  4. User 先將打包好的 code 送到 S3 上存放
  5. 接下來 trigger application 上特定的  deploy-er,將特定版本的 code 從 S3 上派送到 EC2 instance 上
  6. EC2 instance 的 CodeDeploy agent 收到 event 以後,會按照 appspec.yml 中指定的動作來動作,操作完成會回傳 status 給 CodeDeploy。
  7. CodeDeploy 會在 pannel 顯示 deploy 的進度和狀態。

TL;DR


接下來這邊會用較為簡單的方法 (但較不安全 XD) 的說明,來建立支援 CodeDeploy 的 EC2 instance,並做一次 deployment。操作、設定會幾乎按照 AWS 的 document 上的進行,但會調整一些順序讓操作比較順暢。

IAM

該做的還是要做,逃也逃不掉。要先幫 EC2 建立一個支援 CodeDeploy 的 Role,EC2 需要從 S3 上面拉檔案,所以除了 CodeDeploy 的權限以外,也要開 S3 的權限。

這邊用最寬鬆的權限來做 demo,若需要更安全、仔細的設定說明,請參考 AWS docs。

圖 1-1:這個 role 是要給 EC2 用的,所以建立時要先選 EC2
圖 1-2:要支援自動部屬的 EC2 需要這二個 policy

接下來,CodeDeploy 的 deploy-er 也需要權限,所以要建立一個 Role 給 Deploy-er 使用。這個就比較簡單,直接使用 CodeDeploy 的 policy 即可。

圖 1-3:建立 CodeDeploy 用的 role
圖 1-4:這邊就只有一個 policy 沒得挑

S3 bucket

前文有提到,會把要 deploy 的檔案先放在 S3 上,所以需要開一個 bucket 供 CodeDeploy 存放檔案用。

按照一般步驟建立一個 s3 bucket,除了 bucket name 不要 conflict 以外,其他選項都用預設值即可。我這邊用的名稱是「deploy-for-qwe」:

圖 N-M:我還沒想到要打什麼註解 ….

EC2 設定

EC2 其實沒有太複雜的設定,主要就是需要安裝 CodeDeploy agent 而已。

在開機器時,要留意幾個地方,第一個是 instance 的 IAM role 必須是上一步驟建立給 EC2 可以 deploy 的 role:

圖 2-1:建立 EC2 instance 時要加上 role
圖 2-2:幫 EC2 加個 tag,之後操作會比較方便。可以隨意命名。

再來要幫 EC2 instance 安裝 CodeDeploy agent,這邊可以直接參考 AWS install the CodeDeploy agent 的文件說明。

CodeDeploy

切換到 CodeDeploy 的 console,直接按下「Create application」就對了:

圖 3-1:建立 application,供之後為不同 application 設定不同的操作
圖 3-2:CodeDeploy 支援不同的 platform,我這邊使用 EC2

接著建立 deployment group,這邊要選擇前面建立的 CodeDeployRole:

圖 3-3:記得要選擇 role

最後選擇預計要被 deployed 的 instance,這個時候建立 EC2 設定的 tag 就很有用了,可以一次選擇多個 instance 或是不同的群組:

圖 3-4:透過 tag 來選擇要 deploy 的 EC2 instance:佈署到「usage」為「deploy」的所有 instance

appsepec.yml

這個檔案主要用來記錄、控制佈署時要做的動作,包括停止服務、刪除 cache、把新的程式移動到指定的位置、initialize …. 等等。

appspec.yml 檔案必須放在專案的根目錄,appspec.yml 的撰寫方法可以參考 AWS – AppSpec File Example。

這邊不自己寫 appspec.yml,直接從 AWS 提供的 example 來測試即可。開啟 download resource kit file 頁面,為意選擇一個 example 下載並解壓縮,目錄看起來會像下面這個樣子:

$ tree
.
├── appspec.yml
├── index.html
├── LICENSE.txt
└── scripts
    ├── install_dependencies
    ├── start_server
    └── stop_server

appspec.yml 的檔案內容如下:

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

「version」這個 key 是必要的,其他的 key 看不同的部屬環境而有不同。

這邊要 deploy 到 EC2 instance 上,所以改寫 appspec.yml 到最簡單的寫法:

version: 0.0
os: linux

files:
    - source: index.html
      destination: /var/www/html/

接著,透過 aws-cli 下指令將 source code 打包上傳到 s3 的 bucket 上:

aws deploy push 
  --application-name hello-world 
  --s3-location s3://deploy-for-qwe/hello.zip 
  --source .

藍色標記是需要依照前文自行設定的資料自行修改的文字。

指令成功執行以後,應會看到以下的 response:
To deploy with this revision, run:
aws deploy create-deployment –application-name hello-world –s3-location bucket=deploy-for-qwe,key=hello.zip,bundleType=zip,eTag=0bd6b5414d8315a960ab1256d33b4e9b –deployment-group-name <deployment-group-name> –deployment-config-name <deployment-config-name> –description <description>

既然 AWS 都要你照做了,就不用多想跟著下指令:

aws deploy create-deployment 
--application-name hello-world 
--s3-location bucket=deploy-for-qwe,key=hello.zip,bundleType=zip,eTag=0bd6b5414d8315a960ab1256d33b4e9b 
--deployment-group-name tmp-group

# 後半段非必要參數,所以我刪掉了

指令成功,會回傳 JSON data:

{   
    "deploymentId": "d-SDXUUDKFZ"
}

這個時候打開 CodeDeploy 的 Deployments,就會看到有 deploy 正在進行:

圖 4-1:透過指令送出的 deployment 需求正在進行中

執行完成,連到 EC2 instance 上,就可以看到 /var/www/html/ 目錄下多了一個 index.html 的檔案了,deploy 成功!

回到 local 端,對 index.html 的內容做個調整,再做一次 aws deploy push,這次回傳結果也差不多,不過注意紅色標記的部份:
To deploy with this revision, run:
aws deploy create-deployment –application-name hello-world –s3-location bucket=deploy-for-qwe,key=hello.zip,bundleType=zip,eTag=085f6c6ca293276a3072be2e8a5a7870 –deployment-group-name <deployment-group-name> –deployment-config-name <deployment-config-name> –description <description>

「eTag」的 hash 值已經和前一次不同了!

CodeDeploy 上,eTag 的值相當於 product version,不同的值代表不同的版本,所以有必要時可以快速透過 eTag 在個版本之間做切換:

圖 4-2:在 pannel 會自動帶出可以 deploy 的版本

希望這篇說明,可以幫你快速了解 AWS CodeDeploy 的功能以及設定、操作方式。

Tags:AWS, EC2, Linux

文章分頁

1 2 下一頁

其他

關於我  (About me)

小額贊助

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.