2019年6月30日 星期日

AWS ECS 透過 CloudFormation 部署時的 Stack 更新行為

在 CloudFormation 的 Stack 被更新的時候,CloudFormation 有可能會針對要更新的資源做三種不同的處理 [1]:

  1. Update with No Interruption
  2. Updates with Some Interruption
  3. Replacement

其中第一種是直接完成更新,不會導致資源的服務中斷;第二種會導致一段時間的資源服務中斷,但 Resource ID 不會改變;第三種是會建立新的資源然後替換舊的資源,所以有可能資源的服務不會中斷,但必然導致 Resource ID 改變。

當 CloudFormation 在更新資源的時候,會依據被更新的資源的類型,套用上述三種更新方法的其中一種。因此具體而言到底會採用哪個方法更新,必須看被更新的東西是什麼而定。除此之外,更新的行為是以 Stack Property 為單位的。舉例來說:

AWS::ECS::Cluster
    ClusterName:
        Update requires: Replacement
    Tags:
        Update requires: No interruption

在 CloudFormation 的文件 [2] 中,可以看到 ECS Cluster 如果是 ClusterName 這個屬性變更了的話,會採取的更方式是 Replacement;但如果是 Tags 的變更的話,則會採取 Update with No Interruption。

參考資料
  1. AWS Documentation » AWS CloudFormation » User Guide » Working with Stacks » AWS CloudFormation Stacks Updates » Update Behaviors of Stack Resources
  2. AWS Documentation » AWS CloudFormation » User Guide » Template Reference » AWS Resource and Property Types Reference
  3. 1Strategy/fargate-cloudformation-example

2019年6月22日 星期六

在多節點環境將 logback 導出至 CloudWatch

在很久以前有寫了一篇文章 [1] 紀錄要如何用 logback 把 log 導出到 AWS CloudWatch,那時是用 logback.xml 直接設定,不過有個缺點是設定中指定在 logback.xml 裡的 Log Stream 的名字是個寫死的固定值,這在多節點的狀況可能會有問題。因為 CloudWatch 對於任一 Log Stream 同時只能允許一個執行緒存取,這會導致當應用程式會擴展成兩個以上的節點的時候,輸出 log 可能會有問題。