使用 S3 存放和還原 AMI - Amazon Elastic Compute Cloud

使用 S3 存放和還原 AMI

您可以將 Amazon Machine Image (AMI) 存放在 Amazon S3 儲存貯體中,將 AMI 複製到另一個 S3 儲存貯體,然後從 S3 儲存貯體中還原。透過使用 S3 儲存貯體存放和還原 AMI,您可以將 AMI 從一個 AWS 分割區複製到另一個分割區,例如,從主要商業分割區到 AWS GovCloud (US) 分割區。您也可以透過將其存放在 S3 儲存貯體中,來建立 AMI 的封存複本。

支援使用 S3 存放和還原 AMI 的 API 包括 CreateStoreImageTaskDescribeStoreImageTasksCreateRestoreImageTask

CopyImage 是用於在 AWS 分割區複製 AMI 的建議 API。但是,CopyImage 無法將 AMI 複製到另一個分割區。

如需有關 AWS 分割區的資訊,請參閱《AWS 一般參考》中 Amazon Resource Names (ARN) 頁面上的分割區

警告

在 AWS 分割區或 AWS 區域之間移動資料時,請確保您遵守所有適用的法律和業務要求,包括但不限於任何適用的政府法規和資料落地要求。

使用案例

將 AMI 從一個 AWS 分割區複製到另一個 AWS 分割區

透過使用 S3 儲存貯體存放和還原 AMI,您可以將 AMI 從一個 AWS 分割區複製到另一個分割區,或從一個 AWS 區域複製到另一個區域。在下列範例中,您將 AMI 從主要商業分割區複製到 AWS GovCloud (US) 分割區,特別是從 us-east-2 區域到 us-gov-east-1 區域。

如果要將 AMI 從一個分割區複製到另一個分割區,請依照下列步驟執行:

  • 透過使用 CreateStoreImageTask 將 AMI 存放在當前區域的 S3 儲存貯體中。在此範例中,S3 儲存貯體位於 us-east-2。如需命令範例,請參閱將 AMI 存放在 S3 儲存貯體中

  • 使用 DescribeStoreImageTasks 監控存放任務的進度。當任務完成時,該物件在 S3 儲存貯體中變得可見。如需命令範例,請參閱描述 AMI 存放任務的進度

  • 使用您選擇的程序,將存放的 AMI 物件複製到目標分割區中的 S3 儲存貯體。在此範例中,S3 儲存貯體位於 us-gov-east-1

    注意

    因為每個分割區都需要不同的 AWS 登入資料,所以您無法將 S3 物件直接從一個分割區複製至另一個分割區。跨分割區複製 S3 物件的程序超出本文件的範圍。我們提供下列複製程序作為範例,但您必須使用符合安全性需求的複製程序。

    • 若要跨分割區複製一個 AMI,複製程序非常簡單明瞭,具體如下:從來源儲存貯體下載物件至中繼主機 (例如 EC2 執行個體或筆記型電腦),然後從中繼主機上傳物件至目標儲存貯體。針對程序的每個階段,請使用分割區的 AWS 登入資料。

    • 為了更能夠持續使用,請考慮開發一個能管理複製的應用程式,最好可使用 S3 分段下載和上傳

  • 使用 CreateRestoreImageTask 從目標分割區中的 S3 儲存貯體還原 AMI。在此範例中,S3 儲存貯體位於 us-gov-east-1。如需命令範例,請參閱從 S3 儲存貯體還原 AMI

  • 透過描述 AMI 來監控還原任務的進度,以查看其狀態何時變為可用。您也可以透過描述快照來監控組成還原 AMI 的快照進度百分比。

製作 AMI 的封存複本

您可以透過將其存放在 S3 儲存貯體中,來建立 AMI 的封存複本。如需命令範例,請參閱將 AMI 存放在 S3 儲存貯體中

AMI 被打包為 S3 中的單一物件,並且所有 AMI 中繼資料 (不包括共享資訊) 作為存放之 AMI 的一部分保留。AMI 資料被壓縮為儲存程序的一部分。包含可輕鬆壓縮之資料的 AMI 會在 S3 中產生較小的物件。為了降低成本,您可以使用較低成本的 S3 儲存層。如需詳細資訊,請參閱 Amazon S3 儲存類別Amazon S3 定價

AMI 存放和還原 API 如何運作

要使用 S3 存放和還原 AMI,請使用以下 API:

  • CreateStoreImageTask – 將 AMI 存放在 S3 儲存貯體中

  • DescribeStoreImageTasks – 提供 AMI 存放任務的進度

  • CreateRestoreImageTask – 從 S3 儲存貯體還原 AMI

CreateStoreImageTask

CreateStoreImageTask API 將 AMI 作為單一物件存放在 S3 儲存貯體中。

API 建立一個從 AMI 及其快照中讀取所有資料的任務,然後使用 S3 分段上傳將資料存放在 S3 物件中。API 採用 AMI 的所有元件,包括大多數非特定區域的 AMI 中繼資料以及 AMI 中包含的所有 EBS 快照,並將其打包為 S3 中的單一物件。資料會在上傳過程中進行壓縮,以減少 S3 中使用的空間量,因此 S3 中的物件可能會小於 AMI 中快照大小的總和。

如果呼叫此 API 的帳戶可見 AMI 和快照標籤,則會將其保留。

S3 中的物件與 AMI 具有相同的 ID,但有 .bin 副檔名。下列資料也會作為 S3 中繼資料標籤存放於 S3 物件:AMI 名稱、AMI 描述、AMI 註冊日期、AMI 擁有者帳戶,以及存放操作的時間戳記。

完成任務所需的時間取決於 AMI 的大小。這也取決於有多少其他任務正在進行中,因為任務已排入佇列。您可以呼叫 DescribeStoreImageTasks API 來追蹤任務進度。

進行中的所有 AMI 的大小總和限制為每個帳戶 600 GB EBS 快照資料。系統會拒絕更多的任務建立,除非進行中的任務數量小於限制數量。例如,如果目前存放了一個具有 100 GB 快照資料的 AMI,以及另一個具有 200 GB 快照資料的 AMI,則會接受另一個請求,因為進行中的總量為小於限制的 300 GB。但是,如果目前存放了具有 800 GB 快照資料的單一 AMI,則在任務完成之前,更多的任務將被拒絕。

DescribeStoreImageTasks

DescribeStoreImageTasks API 描述了 AMI 存放任務的進度。您可以描述指定 AMI 的任務。如果未指定 AMI,您會取得過去 31 天內處理的所有存放映像任務的分頁清單。

對於每個 AMI 任務,回應會指示任務為 InProgressCompletedFailed。對於任務 InProgress,回應會以百分比顯示預估進度。

任務會以相反的時間順序列出。

目前,只能檢視上個月的任務。

CreateRestoreImageTask

CreateRestoreImageTask API 啟動一個任務,從先前使用 CreateStoreImageTask 請求建立的 S3 物件還原 AMI。

還原任務可以在執行存放任務的相同或不同區域中執行。

將從中還原 AMI 物件的 S3 儲存貯體必須位於請求還原任務的相同區域。AMI 將在此區域還原。

AMI 會還原其中繼資料,例如名稱、描述和對應於存放 AMI 之值的區塊型儲存設備映射。此帳戶的區域中,AMI 的名稱必須是唯一的。如果您沒有提供名稱,新的 AMI 將取得與原始 AMI 相同的名稱。AMI 取得在還原過程中產生的新 AMI ID。

完成 AMI 還原任務所需的時間取決於 AMI 的大小。這也取決於有多少其他任務正在進行中,因為任務已排入佇列。您可以透過描述 AMI (describe-images) 或其 EBS 快照 (describe-snapshots) 來查看任務的進度。如果任務失敗,AMI 和快照集會轉為失敗狀態。

進行中的所有 AMI 的大小總和限制為每個帳戶 300 GB EBS 快照資料 (根據還原後的大小)。在進行中的任務小於限制之前,系統會拒絕更多的任務建立。

限制

  • 使用這些 API 僅能存放 EBS 後端 AMI。

  • 不支援半虛擬 (PV) AMI。

  • 可存放的 AMI (壓縮之前) 大小限制為 5,000 GB。

  • 存放映像請求的配額:600 GB 的進行中儲存工作 (快照資料)。

  • 還原映像請求的配額:300 GB 的進行中還原工作 (快照資料)。

  • 在存放任務期間,不得刪除快照,且執行存放的 IAM 主體必須具有快照的存取權,否則存放程序將會失敗。

  • 您無法在同一個 S3 儲存貯體中建立 AMI 的多個複本。

  • 存放在 S3 儲存貯體中的 AMI 無法使用其原始 AMI ID 還原。您可以透過使用 AMI 別名來減輕這種情況。

  • 目前只有使用 AWS Command Line Interface、AWS 開發套件和 Amazon EC2 API 才支援存放和還原 API。您無法使用 Amazon EC2 主控台存放和還原 AMI。

成本

當您使用 S3 存放和還原 AMI 時,需支付存放和還原 API 所使用之服務的費用,以及資料傳輸的費用。這些 API 使用 S3 和 EBS 直接 API (由這些 API 內部使用以存取快照資料)。如需詳細資訊,請參閱 Amazon S3 定價Amazon EBS 定價

保護您的 AMI

若要使用存放和還原 API,S3 儲存貯體和 AMI 必須位於相同的區域。請務必確保 S3 儲存貯體具有足夠的安全性來保護 AMI 的內容,而且只要 AMI 物件保留在儲存貯體中,安全性就必須要維護。如果無法完成,則不建議使用這些 API。確保不允許公開存取 S3 儲存貯體。我們建議針對存放 AMI 的 S3 儲存貯體啟用伺服器端加密,儘管這不是必要的。

如需如何為 S3 儲存貯體設置適當安全性設定的相關資訊,請檢閱下列安全性主題:

將 AMI 快照複製到 S3 物件時,資料會透過 TLS 連線複製。您可以將 AMI 與加密的快照一起存放,但快照會在存放程序中解密。

使用 S3 存放和還原 AMI 的許可

若您的 IAM 主體將使用 Amazon S3 存放或還原 AMI,則您需要授予其所需的許可。

下列範例政策包含允許 IAM 主體執行存放和還原任務所需的所有動作。

您還可建立僅授予委託人存取特定資源的 IAM 政策。如需更多政策範例,請參閱《IAM 使用者指南》中的 AWS 資源存取管理

注意

若組成 AMI 的快照已進行加密,或者您的帳戶依預設啟用了加密功能,則您的 IAM 主體必須具有使用 KMS 金鑰的許可權限。如需詳細資訊,請參閱 使用 AWS KMS keys 的許可

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:AbortMultipartUpload", "ebs:CompleteSnapshot", "ebs:GetSnapshotBlock", "ebs:ListChangedBlocks", "ebs:ListSnapshotBlocks", "ebs:PutSnapshotBlock", "ebs:StartSnapshot", "ec2:CreateStoreImageTask", "ec2:DescribeStoreImageTasks", "ec2:CreateRestoreImageTask", "ec2:GetEbsEncryptionByDefault", "ec2:DescribeTags", "ec2:CreateTags" ], "Resource": "*" } ] }

使用 AMI 存放和還原 API

將 AMI 存放在 S3 儲存貯體中

若要存放 AMI (AWS CLI)

使用 create-store-image-task 命令。指定 AMI 的 ID 以及要存放 AMI 的 S3 儲存貯體名稱。

aws ec2 create-store-image-task \ --image-id ami-1234567890abcdef0 \ --bucket myamibucket

預期的輸出結果

{ "ObjectKey": "ami-1234567890abcdef0.bin" }

描述 AMI 存放任務的進度

若要描述 AMI 存放任務的進度 (AWS CLI)

使用 describe-store-image-tasks 命令。

aws ec2 describe-store-image-tasks

預期的輸出結果

{ "AmiId": "ami-1234567890abcdef0", "Bucket": "myamibucket", "ProgressPercentage": 17, "S3ObjectKey": "ami-1234567890abcdef0.bin", "StoreTaskState": "InProgress", "StoreTaskFailureReason": null, "TaskStartTime": "2021-01-01T01:01:01.001Z" }

從 S3 儲存貯體還原 AMI

若要還原 AMI (AWS CLI)

使用 create-restore-image-task 命令。使用來自 describe-store-image-tasks 輸出的 S3ObjectKeyBucket 值,指定 AMI 的物件索引鍵,以及將 AMI 複製到其中之 S3 儲存貯體的名稱。同時指定已還原 AMI 的名稱。此帳戶的區域中,AMI 的名稱必須是唯一的。

注意

還原的 AMI 會取得一個新的 AMI ID。

aws ec2 create-restore-image-task \ --object-key ami-1234567890abcdef0.bin \ --bucket myamibucket \ --name "New AMI Name"

預期的輸出結果

{ "ImageId": "ami-0eab20fe36f83e1a8" }