

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 Amazon S3 支援的 AMI 轉換為 EBS 支援的 AMI
<a name="Using_ConvertingS3toEBS"></a>

您可將擁有的 Amazon S3 支援的 Linux AMI 轉換為 Amazon EBS 支援的 Linux AMI。

**重要**  
您無法轉換不屬於您的 AMI。

**如需將 Amazon S3 支援的 AMI 轉換為 Amazon EBS 支援的 AMI**

1. 從 Amazon EBS 後端 AMI 啟動 Amazon Linux 執行個體。如需詳細資訊，請參閱[使用主控台中的啟動執行個體精靈，啟動 EC2 執行個體](ec2-launch-instance-wizard.md)。Amazon Linux 執行個體已預先安裝 AWS CLI 和 AMI 工具。

1. 請將您用來組合 Amazon S3 支援的 AMI 的 X.509 私有金鑰上傳至您的執行個體。此金鑰是用來確定只有您與 Amazon EC2 可存取您的 AMI。

   1. 在執行個體上為 X.509 私有金鑰建立如下的暫時目錄：

      ```
      [ec2-user ~]$ mkdir /tmp/cert
      ```

   1. 使用 [scp](linux-file-transfer-scp.md) 等安全複製工具從電腦上將 X.509 私有金鑰複製到執行個體上的 `/tmp/cert` 目錄內。以下命令中的 *my-private-key* 參數為用來透過 SSH 連接執行個體的私有金鑰。例如：

      ```
      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/
      pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem  100%  717     0.7KB/s   00:00
      ```

1. 設定環境變數以使用 AWS CLI。如需詳細資訊，請參閱[環境變數](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)。

   1. （建議） 為您的 AWS 存取金鑰、私密金鑰和工作階段字符設定環境變數。

      ```
      [ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id
      [ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
      [ec2-user ~]$ export AWS_SESSION_TOKEN=your_session_token
      ```

   1. 為您的 AWS 存取金鑰和私密金鑰設定環境變數。

      ```
      [ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id
      [ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
      ```

1. 為新的 AMI 準備 Amazon Elastic Block Store (Amazon EBS) 磁碟區。

   1. 使用 [create-volume](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-volume.html) 命令在與您執行個體相同的可用區域中建立空的 EBS 磁碟區。記下命令輸出中的磁碟區 ID。
**重要**  
 此 EBS 磁碟區的大小必須等於或大於原本的執行個體儲存體根磁碟區。

      ```
      aws ec2 create-volume \
          --size 10 \
          --region us-west-2 \
          --availability-zone us-west-2b
      ```

   1. 使用 [attach-volume](https://docs.aws.amazon.com/cli/latest/reference/ec2/attach-volume.html) 命令將磁碟區連接到您的 Amazon EBS 後端執行個體。

      ```
      aws ec2 attach-volume \
          --volume-id vol-01234567890abcdef \
          --instance-id i-1234567890abcdef0 \
          --region us-west-2
      ```

1. 建立您的 bundle 資料夾。

   ```
   [ec2-user ~]$ mkdir /tmp/bundle
   ```

1. 使用 `/tmp/bundle` 命令將執行個體後端 AMI 的 bundle 下載至 [ec2-download-bundle](ami-tools-commands.md#ami-download-bundle)。

   ```
   [ec2-user ~]$ ec2-download-bundle -b amzn-s3-demo-bucket/bundle_folder/bundle_name -m image.manifest.xml -a $AWS_ACCESS_KEY_ID -s $AWS_SECRET_ACCESS_KEY --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -d /tmp/bundle
   ```

1. 使用 [ec2-unbundle](ami-tools-commands.md#ami-unbundle) 命令從 bundle 重新建構映像檔。

   1. 將目錄變更為 bundle 資料夾。

      ```
      [ec2-user ~]$ cd /tmp/bundle/
      ```

   1. 執行 [ec2-unbundle](ami-tools-commands.md#ami-unbundle) 命令。

      ```
      [ec2-user bundle]$ ec2-unbundle -m image.manifest.xml --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
      ```

1. 從解開映像將檔案複製到新的 EBS 磁碟區。

   ```
   [ec2-user bundle]$ sudo dd if=/tmp/bundle/image of=/dev/sdb bs=1M
   ```

1. 探測磁碟區中是否有任何解開的新分割區。

   ```
   [ec2-user bundle]$ sudo partprobe /dev/sdb1
   ```

1. 列出區塊型儲存設備，以找出要掛載的設備名稱。

   ```
   [ec2-user bundle]$ lsblk
   NAME         MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
   /dev/sda    202:0    0   8G  0 disk
   └─/dev/sda1 202:1    0   8G  0 part /
   /dev/sdb    202:80   0  10G  0 disk
   └─/dev/sdb1 202:81   0  10G  0 part
   ```

   在此範例中，要掛載的分割區為 `/dev/sdb1`，但您的設備名稱可能不同。如果磁碟區尚未分割，要掛載的設備會類似 `/dev/sdb` (沒有設備分割區尾碼)。

1. 為新的 EBS 磁碟區建立掛載點，然後掛載磁碟區。

   ```
   [ec2-user bundle]$ sudo mkdir /mnt/ebs
   [ec2-user bundle]$ sudo mount /dev/sdb1 /mnt/ebs
   ```

1. 用您偏好的文字編輯器 (例如 `/etc/fstab` 或 **vim**) 在 EBS 磁碟區上開啟 **nano** 檔案，並移除執行個體 (暫時性) 存放磁碟區的任何項目。EBS 磁碟區掛載於 `/mnt/ebs`，因此 `fstab` 檔案位於 `/mnt/ebs/etc/fstab`。

   ```
   [ec2-user bundle]$ sudo nano /mnt/ebs/etc/fstab
   #
   LABEL=/     /           ext4    defaults,noatime  1   1
   tmpfs       /dev/shm    tmpfs   defaults        0   0
   devpts      /dev/pts    devpts  gid=5,mode=620  0   0
   sysfs       /sys        sysfs   defaults        0   0
   proc        /proc       proc    defaults        0   0
   /dev/sdb        /media/ephemeral0       auto    defaults,comment=cloudconfig    0       2
   ```

   在此範例中，應該移除最後一行。

1. 卸載磁碟區，並從執行個體分離。

   ```
   [ec2-user bundle]$ sudo umount /mnt/ebs
   [ec2-user bundle]$ aws ec2 detach-volume --volume-id vol-01234567890abcdef --region us-west-2
   ```

1. 從新的 EBS 磁碟區建立 AMI，如下所示。

   1. 建立新 EBS 磁碟區的快照。

      ```
      [ec2-user bundle]$ aws ec2 create-snapshot --region us-west-2 --description "your_snapshot_description" --volume-id vol-01234567890abcdef
      ```

   1. 檢查快照是否完整。

      ```
      [ec2-user bundle]$ aws ec2 describe-snapshots --region us-west-2 --snapshot-id snap-0abcdef1234567890
      ```

   1. 使用 **describe-images** 命令找出原始 AMI 的處理器架構、虛擬化類型與核心映像 (`aki`)。在此步驟中，您需要擁有原始 Amazon S3 支援的 AMI 的 AMI ID。

      ```
      [ec2-user bundle]$ aws ec2 describe-images --region us-west-2 --image-id ami-0abcdef1234567890 --output text
      IMAGES	x86_64	amazon/amzn-ami-pv-2013.09.2.x86_64-s3	ami-8ef297be	amazon	available	public	machine	aki-fc8f11cc	instance-store	paravirtual	xen
      ```

      在此範例中，其架構為 `x86_64`，核心映像 ID 為 `aki-fc8f11cc`。請將這些數值使用在下列步驟。如果上述命令的輸出也列出 `ari` ID，請將其記下。

   1. 使用新 EBS 磁碟區的快照 ID 和先前步驟中的數值登錄您的新 AMI。如果先前的命令輸出列出 `ari` ID，請用 `--ramdisk-id ari_id` 將其加入到下列命令。

      ```
      [ec2-user bundle]$ aws ec2 register-image --region us-west-2 --name your_new_ami_name --block-device-mappings DeviceName=device-name,Ebs={SnapshotId=snap-0abcdef1234567890} --virtualization-type paravirtual --architecture x86_64 --kernel-id aki-fc8f11cc --root-device-name device-name
      ```

1. (選用) 確認可以從新 AMI 啟動執行個體後，您便能刪除為此程序建立的 EBS 磁碟區。

   ```
   aws ec2 delete-volume --volume-id vol-01234567890abcdef
   ```