iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
DevOps

關於我幫新公司建立整套部屬流程那檔事系列 第 29

EP29 - 穢土轉生~到了 AWS 也要能夠備份~

EP13 - 災難演練,重建你的 VPC
我們在重建 VPC 之前,
有帶著大家怎麼進行單次備份,
但是實務上,
我們鮮少有機會做單次備份,
取而代之的會是定期備份,
透過定期的備份,
來確保系統對於重大災變具有一定的應變能力,
而定期備份的好處除了固定時間備份不怕忘記以外,
也可以設定備份保留天數,
不用擔心備份存放太久,
導致佔用太多不必要的資源,
那...我們就開始吧 XD

為系統建立週期性備份使用 Lifecycle Manager

什麼是 Lifecycle Manager

您可以使用 Amazon Data Lifecycle Manager 來自動建立、保留和刪除 EBS 快照和 EBS 後端 AMI。

當您將快照與 AMI 管理自動化時,它可以幫助您:

  • 強制執行定期備份排程來保護重要資料。
  • 建立可定期重新整理的標準化 AMI。
  • 依稽核人員或內部合規的要求來保留備份。
  • 刪除過時的備份以降低儲存成本。
  • 建立災難復原備份政策,這些政策會將資料備份至隔離的帳戶。

當 Amazon Data Lifecycle Manager 結合了 Amazon CloudWatch Events 和 AWS CloudTrail 的監控功能時
可為 Amazon EC2 執行個體和個別 EBS 磁碟區提供一套完整的備份解決方案
無需額外成本
只需要負擔 Snapshot 佔用空間的費用
以及 Snapshot 傳送到其他地方的傳輸費用

新增 IAM Role

在執行備份的時候
也需要有一個 Role 來執行
這時候我們需要建立一個 Role 去跑例行性的備份
並且給予相對應得權限

stage/main.tf

resource "aws_iam_role" "dlm_lifecycle_role" {
    name = "dlm-lifecycle-role"
    
    assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "dlm.amazonaws.com"
      },
      "Effect": "Allow"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy" "dlm_lifecycle" {
    name = "dlm-lifecycle-policy"
    role = aws_iam_role.dlm_lifecycle_role.id

    policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateSnapshot",
        "ec2:CreateSnapshots",
        "ec2:DeleteSnapshot",
        "ec2:DescribeInstances",
        "ec2:DescribeVolumes",
        "ec2:DescribeSnapshots"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:*::snapshot/*"
    }
  ]
}
EOF
}

建立備份週期

我們暫時沒有將所有的機械都做備份
只將自動部署的 Octopus Deploy 做備份
因為 Octopus Deploy 有使用 RDS 存放資料
因此 EC2 的備份不需要太過頻繁

我們就設定一天備份四次
備份基準點從八點開始算
不是因為我鐵人賽剛好這時候寫的關係
目的是希望能夠達到下班後以及上班前都能夠備份到
並且上班期間也可以卡一個時間備份一次

而備份最多保留 20 筆
換言之只會保留五天的備份
五天後舊的備份就會自動刪除

比較有趣的還是備份的參考條件
是使用 tags 來做標記
之前有使用到 tag 的部分是根據 AWS CodeDeploy
而這是則是 lifecyle management

stage/main.tf

resource "aws_dlm_lifecycle_policy" "octopus_deploy" {
    description        = "Octopus Deploy DLM lifecycle policy"
    execution_role_arn = aws_iam_role.dlm_lifecycle_role.arn
    state              = "ENABLED"
    
    policy_details {
        resource_types = ["VOLUME"]
        
        schedule {
            name = "reserve 5 day of weeks and backup 4 times a day"
            
            create_rule {
                interval      = 6
                interval_unit = "HOURS"
                times         = ["20:00"]
            }
            
            retain_rule {
                count = 20
            }
            
            tags_to_add = {
                SnapshotCreator = "DLM"
            }
            
            copy_tags = false
        }
        
        target_tags = {
            name = "octopus deploy"
        }
    }
}

Console 查看狀態

在登入 aws cloud console 以後
EC2 的頁面中可看到 Lifecycle Manager 已經出現我們剛剛建立的備份政策
也很清楚的描述到我們的備份會從八點開始
並且備份最多保留五天

https://ithelp.ithome.com.tw/upload/images/20211011/20141518iZ7H5xfQKi.png


其實備份的部分早該提到
但是前面在寫文章時
我仍著重於架構整個 CI/CD 的過程為主
因為擔心會寫不完
因此才將這部分娜到後面來寫
實際上這個操作相對獨立
其實放在任何時候做都是是適合的

參考資料:

  1. 自動化快照生命週期
  2. Resource: aws_dlm_lifecycle_policy

上一篇
EP28 - 使用 Container Insights 監控 EKS 上的容器,並整合 Grafana 作為儀表板
下一篇
EP30 - 最後但不是終點
系列文
關於我幫新公司建立整套部屬流程那檔事30

尚未有邦友留言

立即登入留言