AWS Lambda 實作紀錄

當初想把實價登錄的資料處理部分移轉到雲端服務上,所以找了 AWS、GCP、Azure,比較結果後好像 AWS 給的優惠好像比較多,所以選擇 AWS,不過後來發現好像也沒有優惠到哪裡


一開始鎖定使用 Lambda

因為原本的專案使用 SpringBoot 編寫,所以直接採用 Spring Cloud Function,而且之後要改用其他雲端服務,可能要做的修正也會比較少

Spring Cloud Function 可以參考這裡
https://www.baeldung.com/spring-cloud-function

除了 Lambda 外,還用到其他不少服務

  • Step Functions
    建立 Lambda Function 的邏輯順序,如先執行 Lambda Function 1,接著再執行 Lambda Function 2
  • RDS
    存放整理後的資訊
  • Secret Manager
    存放第三方 API 的 client secret 或 long token
  • S3
    存放資料備份,以及授權後的權杖
  • CloudWatch
    用來監看 log
  • CloudWatch Events (已改名為 Amazon EventBridge)
    用來設定定期排程呼叫 Lambda Function
  • VPC
    將各個服務間以內網的方式做串接


在用到第三方 API 時需要 OAuth 授權,需透過 client secret 去登入產生權杖,在 AWS Lambda 裡,權杖可暫存在 /tmp 底下,/tmp 是 Lambda Function 唯一可以存取的檔案系統,如果要另外掛 EFS 也可以,不過多掛 EFS 也是一筆費用,所以在需要利用已產生的權杖時,會從 S3 讀回 /tmp,用完就從 /tmp 存回 S3。

由於是既有專案修改而來,所以建立的 Lambda Function 需要使用好幾個服務,如對外拉取資料、存取 S3、存取 Secret Manager、存取 RDS。

在 Lambda Function 裡,因為要同時存取其他服務,如 S3、SecretManager、RDS,需要掛 VPC,但是,Lambda Function 掛上 VPC 後無法對外拉取資料。要額外建立 Internet Gateway 及 NAT Gateway。

Lambda 在 VPC 中存取網路資源的設定可以參考這裡
https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/

其中需要建立 Elastic IP Addresses,由於 Elastic IP Address 沒有綁定在 instance 上,所以會收費。再加上 NAT Gateway 的傳輸費用,Lambda 從 VPC 內取得外面的網路資源的費用不低,是很不建議的做法。

AWS 建議的做法是,Lambda Function不透過 VPC 存取網路資源並存到 S3,之後再由其他 Lambda Function 從 S3 取得資料進行處理。

透過 VPC 存取其他服務也會產生費用,如存取 S3 要建立 Gateway endpoint、存取 Secret Manager 要建立 Interface endpoint,每小時的 VPC endpoint 費用累積起來也很可觀。

所以存取 RDS,可以將 RDS 對外公開讀取,這時資料庫密碼就要好好設定,可以不透過 VPC 存取。

原本存在於 Secret Manager 的 client secret 或 long token,也可以改為存在 S3,一樣不透過 VPC。

RDS 在不用時也可以關閉,需要使用時,透過 Step Functions 及 Lambda 在需要時打開,用完後就關閉。(這邊確定重開後 IP 是否可以固定,如果不行可能還是得回到使用 VPC,可以評估 VPC 或 RDS 持續開啟的費用)

不過如果為了安全性,除了對外存取網路資源至 S3 不要用 VPC 外,使用其他服務,用 VPC 還是安全的選擇。