Amazon-Web-Services

如何創建正確附加了多個基於硝基的捲的 EC2 AMI 映像

  • May 10, 2021

我正在使用 EC2 映像生成器來自動化為 mongoDB 伺服器創建 AMI 映像的過程。

此圖像有兩卷:

  • /data- 100 GB
  • /logs- 10 GB

為了實現這個設置,我創建了一個附加了 3 個卷的圖像建構器配方(一個用於 root /)。

然後,映像生成器組件格式化並安裝卷。以下是執行此操作的步驟片段:

 - name: FormatAndMountDataVolume
   action: ExecuteBash
   inputs:
     commands:
       - sudo mkdir /data
       - sudo mkfs -t xfs /dev/nvme1n1
       - echo "/dev/nvme1n1  /data  xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab
       - sudo mount -a
       - sudo chown -R mongodb:mongodb /data
 - name: FormatAndMountLogsVolume
   action: ExecuteBash
   inputs:
     commands:
       - sudo mkdir /logs
       - sudo mkfs -t xfs /dev/nvme2n1
       - echo "/dev/nvme2n1  /logs  xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab
       - sudo mount -a
       - sudo chown -R mongodb:mongodb /logs

它工作正常並創建了圖像。問題是這些實例使用 Nitro-System,它們的文件說明如下:

設備名稱為 /dev/nvme0n1、/dev/nvme1n1 等。您在塊設備映射中指定的設備名稱使用 NVMe 設備名稱(/dev/nvme

$$ 0-26 $$n1)。塊設備驅動程序可以按照與您為塊設備映射中的捲指定的順序不同的順序分配 NVMe 設備名稱。

因此,上述 AMI 存在潛在問題。它將目錄掛載到/data設備/dev/nvme1n1/logson 上/dev/nvme2n1,但亞馬遜不保證設備將使用此順序命名。該實例可能最終擁有一個/logs容量為 100GB 的文件夾,而/data只有 10GB。

關於在為此 AMI 執行 EC2 實例時如何確保將捲安裝在正確文件夾上的任何想法?

在您的腳本上,您有一個步驟可以創建文件系統,mkfs另一個步驟可以將其添加到fstab文件中。

在添加之前fstab獲取UUID剛剛格式化的來自設備。

使用它UUID來添加安裝指令fstab,而不是設備路徑。

這就是您可以更改程式碼的方式。

 commands:
   - sudo mkdir /data
   - sudo mkfs -t xfs /dev/nvme1n1
   - echo "$(blkid /dev/nvme1n1 | awk '{print $2}')  /data  xfs  defaults,nofail  0  2" | sudo tee -a /etc/fstab

請參閱有關 UUID 使用的其他答案:

https://stackoverflow.com/questions/64568780/aws-nvme-mounted-to-different-directory-after-reboot/67453438?noredirect=1#comment119235037_67453438


更新

您關於 AMI 的概念以及卷與其相關的時間是不正確的。

卷會在您生成 AMI 時準確附加,無論您使用哪種機制來生成它。

當您使用映像生成器生成 AMI 時,它將在其上附加卷並執行您添加的命令以格式化您的設備(請參閱註釋)。正是在您創建 AMI 的那一刻。不是在創建實例時。

所以,文件系統已經存在UUIDfstab已經配置好了。

您稍後從此 AMI 創建的每個實例都將與此 AMI 完全相同。

請參閱此範例,我創建一個實例,使用 格式化設備xfs,通過 安裝它fstab,停止它並生成一個 AMI。

然後我從這個 AMI 啟動了一個新實例,看到所有設備UUID都是相同的,即使是來自根卷的設備。

在生成 AMI 之前,實例名稱ip-172-31-12-219

[root@ip-172-31-12-219 ~]# lsblk -f
NAME          FSTYPE LABEL UUID                                 MOUNTPOINT
nvme1n1
└─nvme1n1p1   xfs          e24884d7-26a2-457d-bf51-875907986bf0 /mnt/disk10
nvme0n1
├─nvme0n1p1   xfs    /     7b355c6b-f82b-4810-94b9-4f3af651f629 /
└─nvme0n1p128

上面 AMI 的另一個實例,實例名稱ip-172-31-8-239

[root@ip-172-31-8-239 ~]# lsblk -f
NAME          FSTYPE LABEL UUID                                 MOUNTPOINT
nvme1n1
└─nvme1n1p1   xfs          e24884d7-26a2-457d-bf51-875907986bf0 /mnt/disk10
nvme0n1
├─nvme0n1p1   xfs    /     7b355c6b-f82b-4810-94b9-4f3af651f629 /
└─nvme0n1p128

當您從控制台生成 AMI 時,您可以看到此消息。

在映像創建過程中,Amazon EC2 會為上述每個卷創建一個快照。

這意味著當您從此 AMI 創建實例時,所有捲都是從這些快照“還原”的。每個位和字節都是相同的。

我希望我在這裡澄清了你的疑問。


筆記

完全脫離主題,您正在磁碟上而不是分區上創建文件系統。沒關係,支持。但不建議這樣做。

您可以搜尋有關每個選項的更多資訊。一個優點是分區對齊,這對 SSD 非常有幫助。

引用自:https://serverfault.com/questions/1062962