

# Amazon S3-backed AMI を作成する
<a name="creating-an-ami-instance-store"></a>

インスタンスの起動時に指定する AMI によってルートボリュームのタイプが決まります。

Amazon S3-backed Linux AMI を作成するには、既存の Amazon S3-backed Linux AMI から起動したインスタンスから始めます。ニーズに合わせてインスタンスをカスタマイズしたら、ボリュームをバンドルし、新しい AMI を登録します。新しい AMI を使用して、カスタマイズした新しいインスタンスを起動できます。

Windows AMI はルートボリュームのインスタンスストアをサポートしていないため、Amazon S3-backed Windows AMI を作成することはできません。

**重要**  
インスタンスストアボリュームをルートボリュームとしてサポートし、Amazon S3-backed AMI を必要とするインスタンスタイプは C1、C3、D2、I2、M1、M2、M3、R3、X1 のみです。

AMI の作成プロセスは、Amazon EBS-backed AMI の場合とは異なります。詳細については、「[Amazon EBS-backed AMI を作成する](creating-an-ami-ebs.md)」を参照してください。

**Topics**
+ [AMI 作成の概要](#process-creating-an-ami-instance-store)
+ [前提条件](#bundle-ami-prerequisites)
+ [Amazon Linux インスタンスから AMI を作成する](#amazon_linux_instructions)
+ [Amazon EC2 AMI ツールのセットアップ](set-up-ami-tools.md)
+ [Amazon EC2 AMI ツールリファレンス](ami-tools-commands.md)
+ [Amazon S3-backed AMI を EBS-backed AMI に変換する](Using_ConvertingS3toEBS.md)

## AMI 作成の概要
<a name="process-creating-an-ami-instance-store"></a>

次の図は、インスタンスストアのルートボリュームを持つインスタンスから AMI を作成するプロセスをまとめたものです。

![\[Amazon S3-backed AMI の作成\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/ami_create_instance_store.png)


最初に、作成する AMI と同様の AMI からインスタンスを起動します。インスタンスに接続し、それをカスタマイズできます。インスタンスのカスタマイズが終わったら、それをバンドルできます。バンドルプロセスが完了するには数分間かかります。プロセスが完了すると、イメージマニフェスト (`image.manifest.xml`) とルートボリューム用のテンプレートを含むファイル (`image.part.`*xx*) で構成されるバンドルが作成されます。次に、バンドルを Amazon S3 バケットにアップロードし、AMI を登録します。

**注記**  
Amazon S3-backed Linux AMI の S3 バケットにオブジェクトをアップロードするには、バケットで ACL を有効にする必要があります。有効にしない場合、Amazon EC2 はアップロードするオブジェクトに ACL を設定できません。宛先のバケットが S3 オブジェクトの所有権のバケット所有者強制設定を使用している場合、ACL が無効になるため、この方法は使えません。詳細については、「[バケットのオブジェクト所有権のコントロールと ACL の無効化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)」を参照してください。

お客様が新しい AMI を使用してインスタンスを起動すると、Amazon はユーザーが Amazon S3 にアップロードしたバンドルを使用してインスタンスのルートボリュームを作成します。Amazon S3 のバンドルで使用されるストレージ領域については、お客様がその領域を削除するまでアカウントに料金が発生します。詳細については、「[Amazon EC2 AMI の登録を解除する](deregister-ami.md)」を参照してください。

ルートボリュームに加えて、インスタンスストアボリュームをインスタンスに追加した場合、新しい AMI のブロックデバイスマッピングにこれらのボリュームの情報が含まれ、新しい AMI から起動するインスタンスのブロックデバイスマッピングに自動的にこれらのボリュームの情報が含まれます。詳細については、「[Amazon EC2 インスタンスでのボリュームのブロックデバイスマッピング](block-device-mapping-concepts.md)」を参照してください。

## 前提条件
<a name="bundle-ami-prerequisites"></a>

AMI を作成するには、最初に次のタスクを完了する必要があります。
+ AMI ツールをインストールします。詳細については、[Amazon EC2 AMI ツールのセットアップ](set-up-ami-tools.md) を参照してください。
+ AWS CLI をインストールします。詳細については、「[AWS CLIを使い始める](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)」を参照してください。
+ バンドルに S3 バケットがあり、バケットに ACL が有効になっていることを確認します。ACL の設定の詳細については、「[ACL の設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/managing-acls.html)」を参照してください。
  + AWS マネジメントコンソール を使用して S3 バケットを作成するには、[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) で Amazon S3 コンソールを開き、**[バケツ作成]** を選択してください。
  + AWS CLI で S3 バケットを作成するには、「[mb](https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html)」コマンドを使用できます。インストールしている AMI ツールのバージョンが 1.5.18 以降の場合は、`ec2-upload-bundle` コマンドを使用して S3 バケットを作成することもできます。詳細については、「[ec2-upload-bundle](ami-tools-commands.md#ami-upload-bundle)」を参照してください。
+ バンドル内のファイルが S3 バケットで暗号化されていないことを確認します。AMI に暗号化が必要な場合は、代わりに EBS-backed AMI を使用できます。詳細については、「[EBS-backed AMI での暗号化の利用](AMIEncryption.md)」を参照してください。
+ AWS アカウント ID があることを確認します。詳細については、「AWS アカウント管理リファレンスガイド」の「[AWS アカウント 識別表示](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html)」を参照してください。
+ AWS CLI を使用するのに必要な認証情報があることを確認します。詳細については、*AWS Command Line Interface ユーザーガイド*の「[AWS CLI に対する認証とアクセスコントロール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)」を参照してください。
+ X.509 証明書および対応するプライベートキーがあることを確認します。
  + X.509 証明書を作成する必要がある場合は、「[署名証明書の管理](set-up-ami-tools.md#ami-tools-managing-certs)」を参照してください。X.509 証明書とプライベートキーは、AMI の暗号化/復号に使用されます。
  + [中国 (北京)] `$EC2_AMITOOL_HOME/etc/ec2/amitools/cert-ec2-cn-north-1.pem` 証明書を使用します。
  + [AWS GovCloud (米国 – 西部)] `$EC2_AMITOOL_HOME/etc/ec2/amitools/cert-ec2-gov.pem` 証明書を使用します。
+ インスタンスに接続し、カスタマイズします。例えば、ソフトウェアとアプリケーションをインストールしたり、データをコピーしたり、一時ファイルを削除したり、Linux 設定を変更したりできます。

## Amazon Linux インスタンスから AMI を作成する
<a name="amazon_linux_instructions"></a>

次の手順では、Amazon Linux 1 を実行するインスタンスストアのルートボリュームを持つインスタンスから AMI を作成する方法について説明します。他の Linux ディストリビューションを実行するインスタンスでは機能しない可能性があります。

**AMI ツールの使用準備を整えるには (HVM インスタンスのみ)**

1. AMI ツールでは、GRUB のレガシーが正常に起動する必要があります。次のコマンドを使用して GRUB をインストールします。

   ```
   [ec2-user ~]$ sudo yum install -y grub
   ```

1. 次のコマンドを使用して、パーティション管理パッケージをインストールします。

   ```
   [ec2-user ~]$ sudo yum install -y gdisk kpartx parted
   ```

**インスタンスストアのルートボリュームを持つ Amazon Linux インスタンスから AMI を作成するには**

この手順では、「[前提条件](#bundle-ami-prerequisites)」に記載された前提条件が満たされていることを前提としています。

次のコマンドでは、*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。

1. インスタンスに認証情報をアップロードします。Amazon ではこれらの認証情報を使用して、お客様と Amazon EC2 だけがお客様の AMI にアクセスできるようにします。

   1. 次のように、認証情報のための一時ディレクトリをインスタンスに作成します。

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

      それにより、作成したイメージから認証情報を除外できます。

   1. [scp](linux-file-transfer-scp.md) などの安全なコピーツールを使用して、コンピュータからインスタンスの `/tmp/cert` ディレクトリに X.509 証明書と対応するプライベートキーをコピーします。次の `-i my-private-key.pem` コマンドの **scp** オプションは、X.509 プライベートキーではなく、SSH でインスタンスに接続するために使用するプライベートキーです。次に例を示します。

      ```
      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-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
      cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem  100%  685     0.7KB/s   00:00
      ```

   または、これらがプレーンテキストファイルの場合、証明書とキーをテキストエディタで開き、コンテンツを `/tmp/cert` の新しいファイルにコピーできます。

1. <a name="step_with_bundle_path_amazon_linux"></a>インスタンス内から [ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol) コマンドを実行して、Amazon S3 にアップロードするバンドルを準備します。`-e` オプションを指定して、認証情報を保存するディレクトリを除外します。デフォルトでは、バンドルプロセスで機密情報を含んでいる可能性があるファイルを除外します。ファイルには、`*.sw`、`*.swo`、`*.swp`、`*.pem`、`*.priv`、`*id_rsa*`、`*id_dsa*`、`*.gpg`、`*.jks`、`*/.ssh/authorized_keys`、`*/.bash_history` などがあります。これらのファイルをすべて含めるには、`--no-filter` オプションを使用します。これらのファイルの一部を含めるには、`--include` オプションを使用します。
**重要**  
AMI バンドルプロセスは、デフォルトで、ルートボリュームを表す `/tmp` ディレクトリに、圧縮され暗号化された一連のファイルを作成します。バンドルを格納するのに十分な空きディスク領域が `/tmp` にない場合、`-d /path/to/bundle/storage` オプションを使用して、バンドルを格納する別の場所を指定する必要があります。インスタンスによっては、エフェメラルストレージが `/mnt` または `/media/ephemeral0` にマウントされて使用可能になっている場合があります。または、バンドルを格納する新しい Amazon EBS ボリュームを作成、アタッチ、およびマウントすることもできます。詳細については、「Amazon EBS ユーザーガイド」の「[Amazon EKS ボリュームの作成](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html)」を参照してください。

   1. **ec2-bundle-vol** コマンドは、root として実行する必要があります。ほとんどのコマンドで、**sudo** を使用することでアクセス許可を昇格させることができますが、この場合は、環境変数を維持するために **sudo -E su** を実行する必要があります。

      ```
      [ec2-user ~]$ sudo -E su
      ```

      これで、bash プロンプトにより root ユーザーとして識別されるようになったことと、root シェルにいることを示すハッシュタグにドル記号が置き換えられたことに注意してください。

      ```
      [root ec2-user]#
      ```

   1. AMI のバンドルを作成するには、次のように [ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol) コマンドを実行します。

      ```
      [root ec2-user]# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 123456789012 -r x86_64 -e /tmp/cert --partition gpt
      ```
**注記**  
中国 (北京) および AWS GovCloud (米国 – 西部) リージョンについては、`--ec2cert` パラメータを使用し、[前提条件](#bundle-ami-prerequisites)に従って証明書を指定します。

      イメージの作成には数分かかります。このコマンドが完了したら、`/tmp` (またはデフォルト以外の) ディレクトリにバンドルが含まれます (`image.manifest.xml`、および複数の `image.part.`*xx* ファイル)。

   1. root シェルを終了します。

      ```
      [root ec2-user]# exit
      ```

1. (オプション) インスタンスストアをさらに追加するには、AMI 用の `image.manifest.xml` ファイルで、ブロックデバイスマッピングを編集します。詳細については、[Amazon EC2 インスタンスでのボリュームのブロックデバイスマッピング](block-device-mapping-concepts.md) を参照してください。

   1. `image.manifest.xml` ファイルのバックアップを作成します。

      ```
      [ec2-user ~]$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
      ```

   1. `image.manifest.xml` ファイルの形式を変更し、読み取りと編集が簡単になるようにします。

      ```
      [ec2-user ~]$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
      ```

   1. テキストエディタで `image.manifest.xml` のブロックデバイスマッピングを編集します。次の例は、`ephemeral1` インスタンスストアボリュームの新しいエントリを示しています。
**注記**  
無効な種類のファイルの一覧については、「[ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol)」を参照してください。

      ```
          <block_device_mapping>
            <mapping>
              <virtual>ami</virtual>
              <device>sda</device>
            </mapping>
            <mapping>
              <virtual>ephemeral0</virtual>
              <device>sdb</device>
            </mapping>
            <mapping>
              <virtual>ephemeral1</virtual>
              <device>sdc</device>
            </mapping>
            <mapping>
              <virtual>root</virtual>
              <device>/dev/sda1</device>
            </mapping>
          </block_device_mapping>
      ```

   1. `image.manifest.xml` ファイルを保存し、テキストエディタを終了します。

1. バンドルを Amazon S3 にアップロードするには、次のように [ec2-upload-bundle](ami-tools-commands.md#ami-upload-bundle) コマンドを実行します。

   ```
   [ec2-user ~]$ ec2-upload-bundle -b amzn-s3-demo-bucket/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
   ```
**重要**  
US East (N. Virginia) 以外のリージョンで AMI を登録するには、`--region` オプションと、すでにターゲットリージョンに存在するバケットパス、またはターゲットリージョンで作成できる一意のバケットパスの両方でターゲットリージョンを指定する必要があります。

1. (オプション) バンドルを Amazon S3 にアップロードしたら、次の `/tmp` コマンドを使用して、インスタンスの **rm** ディレクトリからバンドルを削除できます。

   ```
   [ec2-user ~]$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
   ```
**重要**  
`-d /path/to/bundle/storage` で [Step 2](#step_with_bundle_path_amazon_linux) オプションを使用してパスを指定した場合は、`/tmp` ではなくそのパスを使用します。

1. AMI を登録するには、次のように [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) コマンドを実行します。

   ```
   [ec2-user ~]$ aws ec2 register-image --image-location amzn-s3-demo-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
   ```
**重要**  
[ec2-upload-bundle](ami-tools-commands.md#ami-upload-bundle) コマンドでリージョンを以前に指定した場合は、このコマンドでもう一度そのリージョンを指定します。