

# Amazon Linux 2023 のサンプルイメージの説明を作成する
<a name="build-sample-ami"></a>

AWS は、ワークロード用に独自のカスタム構成証明可能 AMI を作成するための出発点として使用できる Amazon Linux 2023 のサンプルイメージの説明を提供します。サンプルイメージの説明には、ベースオペレーティングシステムとしての Amazon Linux 2023、ファイルシステムのイミュータビリティ用の `dm-verity` と `erofs` の設定が含まれ、分離されたコンピューティング環境を作成するためにすべてのインタラクティブアクセス (SSH、EC2 インスタンス接続、シリアルコンソールなど) が削除されます。サンプルイメージの説明の詳細については、[Github リポジトリ](https://github.com/amazonlinux/kiwi-image-descriptions-examples)を参照してください。

サンプルイメージの説明では、NitroTPM ツール (`nitro-tpm-pcr-compute` および `nitro-tpm-attest`) が `/usr/bin/` ディレクトリのビルド済みイメージに自動的にインストールされます。これにより、AMI から起動されたインスタンスにツールがプリインストールされます。

サンプルイメージの説明には、リファレンス測定値の生成に必要なコマンドを含むスクリプトである `edit_boot_install.sh` が含まれています。スクリプトは、KIWI NG によって作成された raw ディスクイメージファイル (`.raw`) をループバックデバイスにマウントし、UKI (`.efi` ファイル拡張子を持つ) を見つけ、`nitro-tpm-pcr-compute` ユーティリティを実行して AMI のリファレンス測定値を生成します。スクリプトは、ビルド時に KIWI NG によって自動的に実行されます。

このチュートリアルでは、サンプルイメージの説明を作成して構成証明可能 AMI を作成する方法を示します。

独自のイメージの説明の作成に関する詳細については、次の KIWI NG ドキュメントを参照してください。
+ [クイックスタート](https://osinside.github.io/kiwi/quickstart.html)
+ [イメージの説明](https://osinside.github.io/kiwi/image_description.html)
+ [Amazon Linux 2023 のサンプルイメージの説明](https://github.com/amazonlinux/kiwi-image-descriptions-examples)

前提条件

このチュートリアルを完了するには、IAM アイデンティティに次の許可が必要です。
+ `arn:aws:ec2:*::snapshot/*` に対する `ebs:CompleteSnapshot`、`ebs:StartSnapshot`、`ebs:PutSnapshotBlock`
+ すべてのリソースの `ec2:RegisterImage`

**KIWI NG を使用して Amazon Linux 2023 のサンプルイメージの説明を構築するには**

1. 最新の AL2023 AMI を使用して Amazon EC2 インスタンスを起動する インスタンスに AMI を構築するのに十分なストレージスペースを確保するために、少なくとも 12 GB のストレージをプロビジョニングしてください。

1. 必要な依存ファイルをインストールします。次のコマンドは、次のユーティリティをインストールします。
   + `kiwi-cli`
   + `veritysetup`
   + `erofs-utils`
   + `aws-nitro-tpm-tools`

   ```
   sudo dnf install -y kiwi-cli python3-kiwi kiwi-systemdeps-core python3-poetry-core qemu-img veritysetup erofs-utils git cargo aws-nitro-tpm-tools
   ```

1. `coldsnap` ユーティリティをインストールします。このユーティリティを使用すると、raw イメージデータから Amazon EBS スナップショットを作成できます。このユーティリティを使用して、KIWI NG によって作成された raw ディスクイメージファイルから EBS スナップショットを作成します。

   ```
   git clone https://github.com/awslabs/coldsnap.git
   cd coldsnap
   cargo install --locked coldsnap
   cd ..
   ```

1. サンプルイメージの説明ファイルを取得します。

   ```
   sudo dnf install kiwi-image-descriptions-examples
   ```

   サンプルイメージの説明ファイルは、`/usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example` のディレクトリにダウンロードされます。

1. KIWI NG `system build` コマンドを使用してサンプルイメージの説明を作成します。次のコマンドは、`./image` ディレクトリに raw ディスクイメージファイルを作成します。

   ```
   sudo kiwi-ng \
   --color-output \
   --loglevel 0 \
   system build \
   --description /usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example \
   --target-dir ./image
   ```

   詳細については、[kiwi-ng system build](https://osinside.github.io/kiwi/commands/system_build.html) のドキュメントを参照してください。

1. AMI のリファレンス測定値を取得します。測定値は、前のステップのイメージのビルド時に `nitro-tpm-pcr-compute` ユーティリティによって生成されます。リファレンス測定値は、`./image/pcr_measurements.json` というファイルにあります。

   測定値は、次の JSON 形式で提供されます。

   ```
   {
     "Measurements": {
       "HashAlgorithm": "SHA384 { ... }",
       "PCR4": "PCR4_measurement",
       "PCR7": "PCR7_measurement",
       "PCR12": "PCR12_measurement"
     }
   }
   ```

1. `coldsnap` ユーティリティを使用して、KIWI NG によって作成された raw ディスクイメージを EBS スナップショットにアップロードします。コマンドはスナップショット ID を返します。次のステップで必要になるため、ID を書きとめておきます。

   ```
   SNAPSHOT=$(.cargo/bin/coldsnap upload ./image/al2023*.raw)
   echo "Created snapshot: $SNAPSHOT"
   ```

   `coldsnap` ユーティリティの詳細については、[コールドスナップ GitHub リポジトリ](https://github.com/awslabs/coldsnap)を参照してください。

1. 前のステップのスナップショットを使用して、TPM 2.0 対応 AMI を UEFI ブートモードで登録します。`--architecture` には、Intel の場合は `x86_64`、Graviton の場合は `arm64` を指定します。

   ```
   aws ec2 register-image \
   --name "attestable_isolated_al2023_ami" \
   --virtualization-type hvm \
   --boot-mode uefi \
   --architecture x86_64|arm64 \
   --root-device-name /dev/xvda \
   --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=${SNAPSHOT}} \
   --tpm-support v2.0 \
   --ena-support
   ```