

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# クラスターのアプリケーションデータストレージを使用する
<a name="storage"></a>

アプリケーションのストレージニーズに応じて、Amazon EKS でさまざまな AWS ストレージサービスを使用できます。AWS でサポートされている幅広い Container Storage Interface (CSI) ドライバーを使用すると、Amazon EKS で実行されているアプリケーションのストレージニーズに応じて、Amazon EBS、Amazon S3、Amazon EFS、Amazon FSX、および Amazon File Cache を簡単に使用できます。Amazon EKS クラスターのバックアップを管理するには、「[Amazon EKS の AWS バックアップサポート](https://docs.aws.amazon.com/aws-backup/latest/devguide/working-with-supported-services.html#working-with-eks)」を参照してください。

この章では、Amazon EKS クラスターのストレージオプションについて説明します。

**Topics**
+ [Amazon EBS で Kubernetes ボリュームストレージを使用する](ebs-csi.md)
+ [Amazon EFS で Elastic File System ストレージを使用する](efs-csi.md)
+ [Amazon FSx for Lustre で高性能なアプリケーションストレージを使用する](fsx-csi.md)
+ [FSx for NetApp ONTAP で高性能なアプリケーションストレージを使用する](fsx-ontap.md)
+ [Amazon FSx for OpenZFS でデータストレージを使用する](fsx-openzfs-csi.md)
+ [Amazon File Cache を使用してレイテンシーを最小化する](file-cache-csi.md)
+ [Mountpoint for Amazon S3 CSI ドライバーを使用して Amazon S3 オブジェクトにアクセスする](s3-csi.md)
+ [CSI ボリュームのためにスナップショット機能を有効にする](csi-snapshot-controller.md)

# Amazon EBS で Kubernetes ボリュームストレージを使用する
<a name="ebs-csi"></a>

**注記**  
 **新規:** Amazon EKS Auto Mode は、ブロックストレージのルーチンタスクを自動化します。「[ステートフルワークロードのサンプルを EKS Auto Mode にデプロイする](sample-storage-workload.md)」ではその方法を説明しています。

[Amazon Elastic Block Store (Amazon EBS) コンテナストレージインターフェイス (CSI) ドライバー](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/)は、Amazon EBS ボリュームのライフサイクルを、作成した Kubernetes ボリュームのストレージとして管理します。Amazon EBS CSI ドライバーは、ジェネリック「[エフェメラルボリューム](https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/)」と「[永続ボリューム](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)」という種類の Kubernetes ボリューム用の Amazon EBS ボリュームを作成します。

## 考慮事項
<a name="ebs-csi-considerations"></a>
+ EKS Auto Mode クラスターに Amazon EBS CSI コントローラーをインストールする必要はありません。
+ Amazon EBS ボリュームを Fargate Pod にマウントすることはできません。
+ Amazon EBS CSI コントローラーは Fargate ノードで実行できますが、Amazon EBS CSI ノード `DaemonSet` は Amazon EC2 インスタンスでのみ実行できます。
+ Amazon EBS ボリュームと Amazon EBS CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がありません。
+ 最新のアドオンバージョンと 1 つの以前のバージョンがサポートされます。最新バージョンで見つかったバグや脆弱性の修正は、新しいマイナーバージョンの以前のリリースにバックポートされます。
+ EKS Auto Mode では、プロビジョナーとして `ebs.csi.eks.amazonaws.com` を使用するストレージクラスが必要です。標準の Amazon EBS CSI ドライバー (`ebs.csi.aws.com`) は、独自のボリュームを個別に管理します。EKS Auto Mode で既存のボリュームを使用するには、ボリュームスナップショットを使用して、Auto Mode プロビジョナーを使用するストレージクラスに移行します。

**重要**  
Amazon EBS CSI ドライバーのスナップショット機能を使用するには、まず CSI スナップショットコントローラーをインストールする必要があります。詳細については、「[CSI ボリュームのためにスナップショット機能を有効にする](csi-snapshot-controller.md)」を参照してください。

## 前提条件
<a name="ebs-csi-prereqs"></a>
+ 既存のクラスター。必要なプラットフォームのバージョンを確認するには、次のコマンドを実行します。

  ```
  aws eks describe-addon-versions --addon-name aws-ebs-csi-driver
  ```
+ EBS CSI ドライバーには AWS IAM アクセス許可が必要です。
  +  AWS では、EKS Pod Identity の使用を推奨しています。詳細については、「[EKS Pod Identity のセットアップの概要](pod-identities.md#pod-id-setup-overview)」を参照してください。
  + サービスアカウントの IAM ロールの詳細については、「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。

## ステップ 1: IAM ロールを作成する
<a name="csi-iam-role"></a>

Amazon EBS CSI プラグインでは、ユーザーに代わって AWS API の呼び出しを行うための IAM アクセス許可が必要です。これらのステップを実行しない場合、アドオンをインストールして `kubectl describe pvc` を実行しようとすると、`could not create volume in EC2: UnauthorizedOperation` エラーとともに `failed to provision volume with StorageClass` が表示されます。詳細については、GitHub 上の [Set up driver permission](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions) を参照してください。

**注記**  
Pod は、IMDS へのアクセスをブロックする場合を除き、IAM ロールに割り当てられたアクセス許可にアクセスできます。詳細については、「[ベストプラクティスによる Amazon EKS クラスターの保護](security-best-practices.md)」を参照してください。

以下の手順は、IAM ロールを作成し、それに AWS マネージドポリシーをアタッチする方法を示しています。この手順を実装するには、次のいずれかのツールを使用できます。
+  [`eksctl`](#eksctl_store_app_data) 
+  [AWS マネジメントコンソール](#console_store_app_data) 
+  [AWS CLI](#awscli_store_app_data) 

**注記**  
スコープダウンされたアクセス許可を持つセルフマネージドポリシーを作成できます。[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html) を確認し、アクセス許可を減らしたカスタム IAM ポリシーを作成します。

**注記**  
この手順には、ドライバーを Amazon EKS アドオンとして使用するための特定のステップが書かれています。ドライバーをセルフマネージドのアドオンとして使用するには、さまざまなステップが必要です。詳細については、GitHub の「[Set up driver permissions](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions)」を参照してください。

### `eksctl`
<a name="eksctl_store_app_data"></a>

1. IAM ロールを作成して、ポリシーをアタッチします。AWS が AWS マネージドポリシーを維持しますが、ユーザーが独自のカスタムポリシーを作成することもできます。次のコマンドを使用して、IAM ロールを作成し、それに AWS マネージドポリシーをアタッチできます。*マイクラスター* の部分は自分のクラスター名に置き換えます。このコマンドは IAM ロールを作成して IAM ポリシーをアタッチする AWS CloudFormation スタックをデプロイします。

   ```
   eksctl create iamserviceaccount \
           --name ebs-csi-controller-sa \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKS_EBS_CSI_DriverRole \
           --role-only \
           --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
           --approve
   ```

1. カスタム [KMS キー](https://aws.amazon.com/kms/)を使用しない場合は、このステップをスキップできます。このキーを Amazon EBS ボリュームでの暗号化に使用する場合、必要に応じて IAM ロールをカスタマイズします。例えば、以下を実行してください。

   1. 次のコードをコピーし、新しい `kms-key-for-encryption-on-ebs.json` ファイルに貼り付けます。*custom-key-arn* をカスタム [KMS key ARN](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key) に置き換えます。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. ポリシーを作成します。*KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* を別の名前に変更できます。ただし、変更する場合は、必ず後の手順で変更してください。

      ```
      aws iam create-policy \
            --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
            --policy-document file://kms-key-for-encryption-on-ebs.json
      ```

   1. 次のコマンドを使用して、IAM ポリシーをロールに添付します。*111122223333* は、ご自分のアカウント ID に置き換えます。

      ```
      aws iam attach-role-policy \
            --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \
            --role-name AmazonEKS_EBS_CSI_DriverRole
      ```

### AWS マネジメントコンソール
<a name="console_store_app_data"></a>

1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

1. 左のナビゲーションペインで、**[ロール]** を選択してください。

1. **[ロール]** ページで、**[ロールの作成]** を選択してください。

1. **[信頼されたエンティティを選択]** ページで、以下の操作を実行します。

   1. **[信頼されたエンティティの種類]** セクションで、**[ウェブ アイデンティティ]** を選択します。

   1. **[Identity provider]** (ID プロバイダー) で、(Amazon EKS の **[Overview]** (概要) に示されているように) クラスターに **[OpenID Connect provider URL]** (OpenID Connect プロバイダーの URL) を選択します。

   1. **[対象者]** で [`sts.amazonaws.com`] を選択します。

   1. [**次へ**] を選択します。

1. **[アクセス許可を追加]** ページで、以下を実行します。

   1. **[フィルタポリシー]** ボックスに `AmazonEBSCSIDriverPolicy` と入力します。

   1. 検索で返された `AmazonEBSCSIDriverPolicy` の左にあるチェックボックスを選択します。

   1. [**次へ**] を選択します。

1. **[名前を付けて、レビューし、作成する]** ページで、以下の操作を実行します。

   1. **[ロール名]** に、*AmazonEKS\$1EBS\$1CSI\$1DriverRole* などのロールの一意の名前を入力します。

   1. **[タグの追加 (オプション)]** で、タグをキーバリューのペアとして添付して、メタデータをロールに追加します。IAM でのタグの使用に関する詳細については『*IAM ユーザーガイド*』の「[IAM リソースにタグを付ける](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)」を参照してください。

   1. [**ロールの作成**] を選択してください。

1. ロールが作成されたら、コンソールでロールを選択して編集用に開きます。

1. **[信頼関係]** タブを選択し、続いて **[信頼ポリシーの編集]** を選択します。

1. 次の行と似ている行を探してます。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
   ```

   前の行の末尾にカンマを追加し、前の行の後に次の行を追加します。*region-code* を、クラスターのある AWS リージョンに置き換えます。*EXAMPLED539D4633E53DE1B71EXAMPLE* をクラスターの OIDC プロバイダー ID に置き換えます。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
   ```

1. **[ポリシーの更新]** を選択して終了します。

1. Amazon EBS ボリュームでの暗号化にカスタム「[KMS キー](https://aws.amazon.com/kms/)」を使用する場合、必要に応じて IAM ロールをカスタマイズします。例えば、以下を実行してください。

   1. 左のナビゲーションペインの **[ポリシー]** を選択します。

   1. **[ポリシー]** ページで、**[ポリシーの作成]** を選択します。

   1. **[ポリシーの作成]** ページで、**[JSON]** タブを選択します。

   1. 次のコードをコピーしてエディタに貼り付け、*custom-key-arn* をカスタム [KMS key ARN](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key) に置き換えます。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. **[Next: Tags]** (次へ: タグ) を選択します。

   1. **[タグの追加 (オプション)]** ページで、**[次へ: 確認]** を選択します。

   1. **名前** には、ポリシーの一意の名前を入力します (例: *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy*)。

   1. [**Create policy**] (ポリシーの作成) を選択します。

   1. 左のナビゲーションペインで、**[Roles (ロール)]** を選択してください。

   1. コンソールで** *[AmazonEKS\$1EBS\$1CSI\$1DriverRole]* ** を選択し、編集用に開きます。

   1. **[アクセス許可を追加]** ドロップダウンリストから **[ポリシーをアタッチ]** を選択します。

   1. **[フィルターポリシー]** ボックスに、*KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* と入力します。

   1. 検索で返された *KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* の左側にあるチェックボックスをオンにします。

   1. **ポリシーのアタッチ** を選択します。

### AWS CLI
<a name="awscli_store_app_data"></a>

1. クラスターの OIDC プロバイダーの URL を表示します。*マイクラスター* の部分は自分のクラスター名に置き換えます。コマンドの出力が `None` の場合は、「**前提条件**」を確認してください。

   ```
   aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text
   ```

   出力例は次のとおりです。

   ```
   https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
   ```

1. IAM ロールを作成して `AssumeRoleWithWebIdentity` アクションを付与します。

   1. 次の内容を `aws-ebs-csi-driver-trust-policy.json` という名前のファイルにコピーします。*111122223333* は、ご自分のアカウント ID に置き換えます。*EXAMPLED539D4633E53DE1B71EXAMPLE* および *region-code* を、前のステップで返された値にそれぞれ置き換えます。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                  "StringEquals": {
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                    "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
                  }
                }
              }
            ]
          }
      ```

   1. ロールを作成します。*AmazonEKS\$1EBS\$1CSI\$1DriverRole* を別の名前に変更できます。変更する場合は、必ず後の手順で変更してください。

      ```
      aws iam create-role \
            --role-name AmazonEKS_EBS_CSI_DriverRole \
            --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
      ```

1. ポリシーをアタッチします。AWS が AWS マネージドポリシーを維持しますが、ユーザーが独自のカスタムポリシーを作成することもできます。次のコマンドを使用して、AWS マネージドポリシーをロールにアタッチします。

   ```
   aws iam attach-role-policy \
         --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
         --role-name AmazonEKS_EBS_CSI_DriverRole
   ```

1. Amazon EBS ボリュームでの暗号化にカスタム「[KMS キー](https://aws.amazon.com/kms/)」を使用する場合、必要に応じて IAM ロールをカスタマイズします。例えば、以下を実行してください。

   1. 次のコードをコピーし、新しい `kms-key-for-encryption-on-ebs.json` ファイルに貼り付けます。*custom-key-arn* をカスタム [KMS key ARN](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-key) に置き換えます。

      ```
      {
            "Version":"2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Action": [
                  "kms:CreateGrant",
                  "kms:ListGrants",
                  "kms:RevokeGrant"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"],
                "Condition": {
                  "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                  }
                }
              },
              {
                "Effect": "Allow",
                "Action": [
                  "kms:Encrypt",
                  "kms:Decrypt",
                  "kms:ReEncrypt*",
                  "kms:GenerateDataKey*",
                  "kms:DescribeKey"
                ],
                "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"]
              }
            ]
          }
      ```

   1. ポリシーを作成します。*KMS\$1Key\$1For\$1Encryption\$1On\$1EBS\$1Policy* を別の名前に変更できます。ただし、変更する場合は、必ず後の手順で変更してください。

      ```
      aws iam create-policy \
            --policy-name KMS_Key_For_Encryption_On_EBS_Policy \
            --policy-document file://kms-key-for-encryption-on-ebs.json
      ```

   1. 次のコマンドを使用して、IAM ポリシーをロールに添付します。*111122223333* は、ご自分のアカウント ID に置き換えます。

      ```
      aws iam attach-role-policy \
            --policy-arn arn:aws:iam::111122223333:policy/KMS_Key_For_Encryption_On_EBS_Policy \
            --role-name AmazonEKS_EBS_CSI_DriverRole
      ```

Amazon EBS CSI ドライバーの IAM ロールを作成したので、次のセクションに進むことができます。この IAM ロールを使用してアドオンをデプロイすると、`ebs-csi-controller-sa` という名前のサービスアカウントが作成され、それを使用されるように設定されます。サービスアカウントは Kubernetes `clusterrole` にバインドされます。これには、必要な Kubernetes アクセス許可が割り当てられています。

## ステップ 2: Amazon EBS CSI ドライバーを入手する
<a name="managing-ebs-csi"></a>

セキュリティを強化し、作業量を削減するために、Amazon EKS アドオンを通じて Amazon EBS CSI ドライバーをインストールすることをお勧めします。Amazon EKS アドオンをクラスターに追加するには、「[Amazon EKS アドオンを作成する](creating-an-add-on.md)」を参照してください。アドオンの詳細については、「[Amazon EKS アドオン](eks-add-ons.md)」を参照してください。

**重要**  
Amazon EBS ドライバーを Amazon EKS アドオンとして追加する前に、クラスターにセルフマネージドバージョンのドライバーがインストールされていないことを確認してください。インストールされている場合は、GitHub の「[Uninstalling a self-managed Amazon EBS CSI driver](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#uninstalling-the-ebs-csi-driver)」を参照してください。

**注記**  
デフォルトでは、EBS CSI が使用する RBAC ロールには、テイント削除機能をサポートするためにノードを変更するアクセス許可があります。Kubernetes RBAC の制限により、このアクセス許可によってクラスター内の他の任意のノードも変更できます。Helm チャートには、ebs-csi-node サービスアカウントのノード RBAC 変更アクセス許可を無効にするパラメータ (`node.serviceAccount.disableMutation`) があります。有効にすると、テイント削除などのドライバー機能は動作しません。

または、Amazon EBS CSI ドライバーのセルフマネージドインストールが必要な場合は、GitHub の「[Installation](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md)」を参照してください。

## ステップ 3: サンプルアプリケーションをデプロイする
<a name="ebs-sample-app"></a>

さまざまなサンプルアプリケーションをデプロイし、必要に応じて変更できます。詳細については、GitHub の「[Kubernetes Examples](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes)」を参照してください。

# Amazon EFS で Elastic File System ストレージを使用する
<a name="efs-csi"></a>

 [Amazon Elastic File System](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) (Amazon EFS) は、サーバーレスで伸縮自在なファイルストレージを提供するため、ストレージ容量およびパフォーマンスのプロビジョニングや管理を行うことなくファイルデータを共有できます。[Amazon EFS Container Storage Interface (CSI) ドライバー](https://github.com/kubernetes-sigs/aws-efs-csi-driver)は、AWS で動作する Kubernetes クラスターが Amazon EFS ファイルシステムのライフサイクルを管理できるようにする CSI インターフェイスを提供します。このトピックでは、Amazon EFS CSI ドライバーを Amazon EKS クラスターにデプロイする方法を示します。

## 考慮事項
<a name="efs-csi-considerations"></a>
+ Amazon EFS CSI ドライバーは、Windows ベースのコンテナイメージと互換性がありません。
+ Fargate ノードでは永続ボリュームのために[動的プロビジョニング](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/dynamic_provisioning/README.md)を使用できませんが、[静的プロビジョニング](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/static_provisioning/README.md)は使用できます。
+  [動的プロビジョニング](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/dynamic_provisioning/README.md)には、[1.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v12) 以降のドライバーが必要です。サポートされている Amazon EKS クラスターバージョンでバージョン `1.1` のドライバーを使用して、永続ボリュームに[静的プロビジョニング](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/examples/kubernetes/static_provisioning/README.md)を使用できます (「[Amazon EKS supported versions](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照)。
+ このドライバーのバージョン [1.3.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v132) 以降では、Amazon EC2 Graviton ベースのインスタンスを含む Arm64 アーキテクチャがサポートされています。
+ バージョン [1.4.2](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-1.x.md#v142) 以降のドライバーでは、ファイルシステムのマウントに FIPS を使用できます。
+ Amazon EFS のリソースクォータに注意してください。例えば、Amazon EFS ファイルシステムごとに作成できるアクセスポイントのクォータは 1,000 です。詳細については、「[変更できない Amazon EFS リソースクォータ](https://docs.aws.amazon.com/efs/latest/ug/limits.html#limits-efs-resources-per-account-per-region)」を参照してください。
+ バージョン [2.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-2.x.md#v200) 以降、このドライバーは TLS 接続に `stunnel` から `efs-proxy` を使用するように切り替えました。`efs-proxy` を使用すると、実行中のノードのコア数に 1 を足した数のスレッドが開きます。
+ Amazon EFS CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がありません。

## 前提条件
<a name="efs-csi-prereqs"></a>
+ Amazon EFS CSI ドライバーには AWS Identity and Access Management (IAM) のアクセス権限が必要です。
  +  AWS では、EKS Pod Identity の使用を推奨しています。詳細については、「[EKS Pod Identity のセットアップの概要](pod-identities.md#pod-id-setup-overview)」を参照してください。
  + サービスアカウントの IAM ロールと、クラスターの IAM OpenID Connect (OIDC) プロバイダーの設定については、「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」で詳しく確認できます。
+ ご使用のデバイスまたは AWS クラウドシェル で、バージョン `2.12.3` 以降、または AWS コマンドラインインターフェイス (AWS CLI のバージョン `1.27.160` 以降がインストールおよび設定されていること。現在のバージョンを確認するには「`aws --version | cut -d / -f2 | cut -d ' ' -f1`」を参照してください。`yum`、`apt-get`、macOS 用の Homebrew などのパッケージマネージャーは、多くの場合 AWS CLI の最新バージョンより数バージョン古くなっています。最新バージョンをインストールするには「*AWS コマンドラインインターフェイスユーザーガイド*」の「[インストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」および「[aws configure を使用したクイック設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)」を参照してください。AWS クラウドシェル にインストールされている AWS CLI バージョンも最新バージョンより数バージョン遅れることがあります。更新するには、「*AWS CloudShell ユーザーガイド*」の「[ホームディレクトリへの AWS CLI のインストール](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)」を参照してください。
+ デバイスまたは AWS クラウドシェル に、`kubectl` コマンドラインツールがインストールされていること。バージョンはご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが `1.29` である場合、`kubectl` のバージョン `1.28`、`1.29`、または `1.30` が使用できます。`kubectl` をインストールまたはアップグレードする方法については「[`kubectl` および `eksctl` のセットアップ](install-kubectl.md)」を参照してください。

**注記**  
Fargate 上で実行される Pod は、ドライバーの手動インストールステップなしで、Amazon EFS ファイルシステムを自動的にマウントします。

## ステップ 1: IAM ロールを作成する
<a name="efs-create-iam-resources"></a>

Amazon EFS CSI ドライバーには、ファイルシステムと対話するための IAM アクセス許可が必要です。IAM ロールを作成して、必要な AWS 管理ポリシーをアタッチします。この手順を実装するには、次のいずれかのツールを使用できます。
+  [`eksctl`](#eksctl_efs_store_app_data) 
+  [AWS マネジメントコンソール](#console_efs_store_app_data) 
+  [AWS CLI](#awscli_efs_store_app_data) 

**注記**  
この手順には、ドライバーを Amazon EKS アドオンとして使用するための特定のステップが書かれています。セルフマネージド型インストールについての詳細は、GitHub の「[Set up driver permission](https://github.com/kubernetes-sigs/aws-efs-csi-driver#set-up-driver-permission)」を参照してください。

### `eksctl`
<a name="eksctl_efs_store_app_data"></a>

#### Pod Identity を使用する場合
<a name="efs-eksctl-pod-identities"></a>

以下のコマンドを実行します。ここでは、`eksctl` を使用して IAM ロールと、Pod Identity の関連付けを作成しています。`my-cluster` をクラスター名に置き換えます。`AmazonEKS_EFS_CSI_DriverRole` を別の名前に置き換えることもできます。

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create podidentityassociation \
    --service-account-name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --permission-policy-arns arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy
```

#### サービスアカウントに IAM ロールを使用している場合
<a name="efs-eksctl-irsa"></a>

次のコマンドを実行して、`eksctl` を使用して IAM ロールを作成します。`my-cluster` をクラスター名に置き換えます。`AmazonEKS_EFS_CSI_DriverRole` を別の名前に置き換えることもできます。

```
export cluster_name=my-cluster
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve
TRUST_POLICY=$(aws iam get-role --output json --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"
```

### AWS マネジメントコンソール
<a name="console_efs_store_app_data"></a>

次のコマンドを実行して、AWS マネジメントコンソール を使用して IAM ロールを作成します。

1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

1. 左のナビゲーションペインで、**[ロール]** を選択してください。

1. **[ロール]** ページで、**[ロールの作成]** を選択してください。

1. **[信頼されたエンティティを選択]** ページで、以下の操作を実行してください：

   1. EKS Pod Identity を使用する場合

      1. **[信頼するエンティティのタイプ]** で **[AWS サービス]** を選択してください。

      1. **[サービスまたはユースケース]** のドロップダウンで、**EKS** を選択します。

      1. **ユースケース**セクションで、**[EKS - Pod Identity]** を選択します。

      1. [**次へ**] を選択します。

   1. サービスアカウントに IAM ロールを使用している場合

      1. **[信頼されたエンティティの種類]** セクションで、**[ウェブ アイデンティティ]** を選択します。

      1. **[Identity provider]** (ID プロバイダー) で、(Amazon EKS の **[Overview]** (概要) に示されているように) クラスターに **[OpenID Connect provider URL]** (OpenID Connect プロバイダーの URL) を選択します。

      1. **[対象者]** で [`sts.amazonaws.com`] を選択します。

      1. [**次へ**] を選択します。

1. **[アクセス許可を追加]** ページで、以下を実行します。

   1. **[フィルタポリシー]** ボックスに `AmazonEFSCSIDriverPolicy` と入力します。

   1. 検索で返された `AmazonEFSCSIDriverPolicy` の左にあるチェックボックスを選択します。

   1. [**次へ**] を選択します。

1. **[名前を付けて、レビューし、作成する]** ページで、以下の操作を実行します。

   1. **[ロール名]** に、`AmazonEKS_EFS_CSI_DriverRole` などのロールの一意の名前を入力します。

   1. **[タグの追加 (オプション)]** で、タグをキーバリューのペアとして添付して、メタデータをロールに追加します。IAM でのタグの使用に関する詳細については『*IAM ユーザーガイド*』の「[IAM リソースにタグを付ける](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)」を参照してください。

   1. [**ロールの作成**] を選択してください。

1. ロールの作成後

   1. EKS Pod Identity を使用する場合

      1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

      1. 左のナビゲーションペインで、**[クラスター]** を選択して、EKS Pod Identity の関連付けを設定するクラスターの名前を選択します。

      1. **[リモートアクセス]** タブを選択してください。

      1. **[Pod Identity の関連付け]** で **[作成]** を選択します。

      1. **[IAM ロール]** ドロップダウンを選択して、新しく作成したロールを選択します。

      1. **[Kubernetes 名前空間]** フィールドを選択して、`kube-system` を入力します。

      1. **[Kubernetes サービスアカウント]** フィールドを選択して、`efs-csi-controller-sa` を入力します。

      1. **[作成]** を選択します。

      1. Pod Identity の関連付けの作成については、「[Pod Identity の関連付けを作成する (AWS コンソール)](pod-id-association.md#pod-id-association-create)」で詳しく確認できます。

   1. サービスアカウントに IAM ロールを使用している場合

      1. 編集するロールを選択します。

      1. **[信頼関係]** タブを選択し、続いて **[信頼ポリシーの編集]** を選択します。

      1. 次の行と似ている行を探してます。

         ```
         "oidc.eks.region-code.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com"
         ```

         前の行の上に、次の行を追加します。`<region-code>` を、クラスターのある AWS リージョンに置き換えます。`<EXAMPLED539D4633E53DE1B71EXAMPLE>` をクラスターの OIDC プロバイダー ID に置き換えます。

         ```
         "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-*",
         ```

      1. `Condition` オペレーターを `"StringEquals"` から `"StringLike"` に修正します。

      1. **[ポリシーの更新]** を選択して終了します。

### AWS CLI
<a name="awscli_efs_store_app_data"></a>

次のコマンドを実行して、AWS CLI を使用して IAM ロールを作成します。

#### Pod Identity を使用する場合
<a name="efs-cli-pod-identities"></a>

1. `pods.eks.amazonaws.com` サービスに `AssumeRole` および `TagSession` アクションを許可する IAM ロールを作成します。

   1. 次の内容を `aws-efs-csi-driver-trust-policy-pod-identity.json` という名前のファイルにコピーします。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "pods.eks.amazonaws.com"
                  },
                  "Action": [
                      "sts:AssumeRole",
                      "sts:TagSession"
                  ]
              }
          ]
      }
      ```

   1. ロールを作成します。`my-cluster` をクラスター名に置き換えます。`AmazonEKS_EFS_CSI_DriverRole` を別の名前に置き換えることもできます。

      ```
      export cluster_name=my-cluster
      export role_name=AmazonEKS_EFS_CSI_DriverRole
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy-pod-identity.json"
      ```

1. 次のマンドを実行して、必要な AWS マネージドポリシーをロールに添付します。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

1. 次のコマンドを実行して、Pod Identity の関連付けを作成します。` arn:aws:iam::<111122223333>:role/my-role` を前のステップで作成したロールに置き換えます。

   ```
   aws eks create-pod-identity-association --cluster-name $cluster_name --role-arn {arn-aws}iam::<111122223333>:role/my-role --namespace kube-system --service-account efs-csi-controller-sa
   ```

1. Pod Identity の関連付けの作成については、「[Pod Identity の関連付けを作成する (AWS コンソール)](pod-id-association.md#pod-id-association-create)」で詳しく確認できます。

#### サービスアカウントに IAM ロールを使用している場合
<a name="efs-cli-irsa"></a>

1. クラスターの OIDC プロバイダーの URL を表示します。`my-cluster` をクラスター名に置き換えます。`AmazonEKS_EFS_CSI_DriverRole` を別の名前に置き換えることもできます。

   ```
   export cluster_name=my-cluster
   export role_name=AmazonEKS_EFS_CSI_DriverRole
   aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text
   ```

   出力例は次のとおりです。

   ```
   https://oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>
   ```

   コマンドの出力が `None` の場合は、「**前提条件**」を確認してください。

1. IAM ロールを作成して `AssumeRoleWithWebIdentity` アクションを付与します。

   1. 次の内容を `aws-efs-csi-driver-trust-policy.json` という名前のファイルにコピーします。`<111122223333>` はご使用のアカウントの ID に置き換えます。`<EXAMPLED539D4633E53DE1B71EXAMPLE>` と `<region-code>` を、前のステップで返された値に置き換えます。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringLike": {
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*",
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      ```

   1. ロールを作成します。

      ```
      aws iam create-role \
        --role-name $role_name \
        --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
      ```

1. 次のマンドを実行して、必要な AWS マネージドポリシーをロールに添付します。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
     --role-name $role_name
   ```

## ステップ 2: Amazon EFS CSI ドライバーを取得する
<a name="efs-install-driver"></a>

Amazon EFS CSI ドライバーは Amazon EKS アドオンを使用してインストールすることをお勧めします。Amazon EKS アドオンをクラスターに追加するには、「[Amazon EKS アドオンを作成する](creating-an-add-on.md)」を参照してください。アドオンの詳細については、「[Amazon EKS アドオン](eks-add-ons.md)」を参照してください。Amazon EKS アドオンを使用できない場合は、その理由に関する問題を[コンテナロードマップ GitHub リポジトリ](https://github.com/aws/containers-roadmap/issues)に送信することをお勧めします。

**重要**  
Amazon EFS ドライバーを Amazon EKS アドオンとして追加する前に、クラスターにセルフマネージドバージョンのドライバーがインストールされていないことを確認してください。インストールされている場合は、GitHub の「[Uninstalling the Amazon EFS CSI Driver](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#uninstalling-the-amazon-efs-csi-driver)」を参照してください。

または、Amazon EFS CSI ドライバーのセルフマネージド型インストールが必要な場合は、GitHub の「[Installation](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#installation)」を参照してください。

## ステップ 3:Amazon EFS ファイルシステムを作成する
<a name="efs-create-filesystem"></a>

Amazon EFS ファイルシステムを作成するには、「GitHub」の「[Amazon EKS 用の Amazon EFS ファイルシステムを作成](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/efs-create-filesystem.md)」を参照してください。

## ステップ 4: サンプルアプリケーションをデプロイする
<a name="efs-sample-app"></a>

さまざまなサンプルアプリケーションをデプロイし、必要に応じて変更できます。詳細については、「GitHub」の「[例](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#examples)」を参照してください。

# Amazon FSx for Lustre で高性能なアプリケーションストレージを使用する
<a name="fsx-csi"></a>

[Amazon FSx for Lustre コンテナストレージインターフェイス (CSI) ドライバー](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)は、Amazon EKS クラスターが Amazon FSx for Lustre ファイルシステムのライフサイクルを管理できるようにする CSI インターフェイスを提供します。詳細については、「[Amazon FSx for Lustre ユーザーガイド](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html)」を参照してください。

Amazon FSx for Lustre CSI ドライバーを Amazon EKS クラスターにデプロイし、動作することを確認する方法の詳細は、「[FSx for Lustre ドライバーをデプロイする](fsx-csi-create.md)」を参照してください。

# FSx for Lustre ドライバーをデプロイする
<a name="fsx-csi-create"></a>

このトピックでは、[FSx for Lustre CSI ドライバー](fsx-csi.md)を Amazon EKS クラスターにデプロイし、動作することを確かめる方法について説明します。最新バージョンのドライバーを使用することをお勧めします。利用可能なバージョンについては、GitHub の「[CSI Specification Compatibility Matrix](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/blob/master/docs/README.md#csi-specification-compatibility-matrix)」(CSI 仕様互換性マトリックス) を参照してください。

**注記**  
ドライバーは、Fargate または Amazon EKS Hybrid Nodes ではサポートされていません。

使用可能なパラメータの詳細と、ドライバーの機能を示す完全な例については、GitHub の 「[FSx for Lustre Container Storage Interface (CSI) driver](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)」プロジェクトを参照してください。

## 前提条件
<a name="fsx-csi-prereqs"></a>
+ 既存のクラスター。
+ Amazon FSx CSI ドライバー EKS アドオンの認証には、EKS Pod Identity エージェントが必要です。このコンポーネントがないと、アドオンは「`Amazon EKS Pod Identity agent is not installed in the cluster`」というエラーで失敗し、ボリュームオペレーションが回避されます。FSx CSI ドライバーアドオンをデプロイする前後に Pod Identity エージェントをインストールします。詳細については、「[Amazon EKS Pod Identity エージェントのセットアップ](pod-id-agent-setup.md)」を参照してください。
+ ご使用のデバイスまたは AWS クラウドシェル で、バージョン `2.12.3` 以降、または AWS コマンドラインインターフェイス (AWS CLI のバージョン `1.27.160` 以降がインストールおよび設定されていること。現在のバージョンを確認するには「`aws --version | cut -d / -f2 | cut -d ' ' -f1`」を参照してください。`yum`、`apt-get`、macOS 用の Homebrew などのパッケージマネージャーは、多くの場合 AWS CLI の最新バージョンより数バージョン古くなっています。最新バージョンをインストールするには「*AWS コマンドラインインターフェイスユーザーガイド*」の「[インストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」および「[aws configure を使用したクイック設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)」を参照してください。AWS クラウドシェル にインストールされている AWS CLI バージョンも最新バージョンより数バージョン遅れることがあります。更新するには、「*AWS CloudShell ユーザーガイド*」の「[ホームディレクトリへの AWS CLI のインストール](https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html#install-cli-software)」を参照してください。
+ デバイスまたは AWS CloudShell にインストールされている `eksctl` コマンドラインツールのバージョン `0.215.0` 以降。`eksctl` をインストールまたはアップグレードするには`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation)」を参照してください。
+ デバイスまたは AWS クラウドシェル に、`kubectl` コマンドラインツールがインストールされていること。バージョンはご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが `1.29` である場合、`kubectl` のバージョン `1.28`、`1.29`、または `1.30` が使用できます。`kubectl` をインストールまたはアップグレードする方法については「[`kubectl` および `eksctl` のセットアップ](install-kubectl.md)」を参照してください。

## ステップ 1: IAM ロールを作成する
<a name="fsx-create-iam-role"></a>

Amazon FSx CSI プラグインでは、ユーザーに代わって AWS API の呼び出しを行うための IAM アクセス許可が必要です。

**注記**  
Pod は、IMDS へのアクセスをブロックする場合を除き、IAM ロールに割り当てられたアクセス許可にアクセスできます。詳細については、「[ベストプラクティスによる Amazon EKS クラスターの保護](security-best-practices.md)」を参照してください。

以下の手順は、IAM ロールを作成し、それに AWS マネージドポリシーをアタッチする方法を示しています。

1. IAM ロールを作成し、次のコマンドで AWS マネージドポリシーをアタッチします。`my-cluster` を、使用するクラスターの名前に置き換えます。このコマンドは IAM ロールを作成して IAM ポリシーをアタッチする AWS CloudFormation スタックをデプロイします。

   ```
   eksctl create iamserviceaccount \
       --name fsx-csi-controller-sa \
       --namespace kube-system \
       --cluster my-cluster \
       --role-name AmazonEKS_FSx_CSI_DriverRole \
       --role-only \
       --attach-policy-arn arn:aws:iam::aws:policy/AmazonFSxFullAccess \
       --approve
   ```

   サービスアカウントが作成されると、数行の出力が表示されます。出力の最後の数行は、次のようになります。

   ```
   [ℹ]  1 task: {
       2 sequential sub-tasks: {
           create IAM role for serviceaccount "kube-system/fsx-csi-controller-sa",
           create serviceaccount "kube-system/fsx-csi-controller-sa",
       } }
   [ℹ]  building iamserviceaccount stack "eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa"
   [ℹ]  deploying stack "eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa"
   [ℹ]  waiting for CloudFormation stack "eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa"
   [ℹ]  created serviceaccount "kube-system/fsx-csi-controller-sa"
   ```

   デプロイされた AWS CloudFormation スタックの名前を書き留めます。前述の出力例では、スタックの名前は `eksctl-my-cluster-addon-iamserviceaccount-kube-system-fsx-csi-controller-sa` です。

Amazon FSx CSI ドライバーの IAM ロールを作成したので、次のセクションに進むことができます。この IAM ロールを使用してアドオンをデプロイすると、`fsx-csi-controller-sa` という名前のサービスアカウントが作成され、それを使用されるように設定されます。サービスアカウントは Kubernetes `clusterrole` にバインドされます。これには、必要な Kubernetes アクセス許可が割り当てられています。

## ステップ 2: Amazon FSx CSI ドライバーをインストールする
<a name="fsx-csi-deploy-driver"></a>

セキュリティを強化し、作業量を削減するために、Amazon EKS アドオンを通じて Amazon FSx CSI ドライバーをインストールすることをお勧めします。Amazon EKS アドオンをクラスターに追加するには、「[Amazon EKS アドオンを作成する](creating-an-add-on.md)」を参照してください。アドオンの詳細については、「[Amazon EKS アドオン](eks-add-ons.md)」を参照してください。

**重要**  
クラスターに既存の Amazon FSx CSI ドライバーをインストールすると、アドオンのインストールに失敗する可能性があります。EKS 以外の FSx CSI ドライバーが存在するところに Amazon EKS のアドオンバージョンをインストールしようとすると、リソースの競合によりインストールが失敗します。この問題を解消するには、インストール時に `OVERWRITE` フラグを使用します。  

```
aws eks create-addon --addon-name aws-fsx-csi-driver --cluster-name my-cluster --resolve-conflicts OVERWRITE
```

または、Amazon FSx CSI ドライバーのセルフマネージド型インストールが必要な場合は、GitHub の「[Installation](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/blob/master/docs/install.md)」を参照してください。

## ステップ 3: ストレージクラス、永続的なボリューム要求、サンプルアプリケーションをデプロイする
<a name="fsx-csi-deploy-storage-class"></a>

この手順では、「[FSx for Lustre Container Storage Interface (CSI) driver](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)」(FSx for Lustre コンテナストレージインターフェイス (CSI) ドライバー) GitHub リポジトリを使用して、動的にプロビジョニングされた FSx for Lustre ボリュームを使用します。

1. クラスターのセキュリティグループを書き留めます。AWS マネジメントコンソール の **[ネットワーク]** セクションまたは次の AWS CLI コマンドを使用して確認できます。`my-cluster` を、使用するクラスターの名前に置き換えます。

   ```
   aws eks describe-cluster --name my-cluster --query cluster.resourcesVpcConfig.clusterSecurityGroupId
   ```

1. 「Amazon FSx for Lustre ユーザーガイド」の「[Amazon VPC セキュリティグループ](https://docs.aws.amazon.com/fsx/latest/LustreGuide/limit-access-security-groups.html#fsx-vpc-security-groups)」に示す基準に従って、Amazon FSx ファイルシステムのセキュリティグループを作成します。**[VPC]** で、**[ネットワーク]** セクションに示されているようにクラスターの VPC を選択します。「Lustre クライアントに関連付けられているセキュリティグループ」には、クラスターセキュリティグループを使用します。アウトバウンドルールをそのままにして、**[すべてのトラフィック]** を許可することができます。

1. 次のコマンドを使用して、ストレージクラスマニフェストをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
   ```

1. `storageclass.yaml` ファイルの parameters セクションを編集します。各サンプル値は独自の値に置き換えます。

   ```
   parameters:
     subnetId: subnet-0eabfaa81fb22bcaf
     securityGroupIds: sg-068000ccf82dfba88
     deploymentType: PERSISTENT_1
     automaticBackupRetentionDays: "1"
     dailyAutomaticBackupStartTime: "00:00"
     copyTagsToBackups: "true"
     perUnitStorageThroughput: "200"
     dataCompressionType: "NONE"
     weeklyMaintenanceStartTime: "7:09:00"
     fileSystemTypeVersion: "2.12"
   ```
   +  ** `subnetId` ** – Amazon FSx for Lustre ファイルシステムが作成されるサブネット ID。Amazon FSx for Lustre は、すべてのアベイラビリティーゾーンでサポートされているわけではありません。[https://console.aws.amazon.com/fsx/](https://console.aws.amazon.com/fsx/) で Amazon FSx for Lustre コンソールを開き、使用するサブネットが、サポートされているアベイラビリティーゾーンにあることを確認します。次のように、サブネットにノードを含めることも、別のサブネットまたは VPC にすることもできます。
     + AWS マネジメントコンソール で **[コンピューティング]** セクションのノードグループを選択すると、ノードサブネットを確認できます。
     + 指定するサブネットが、ノードがあるサブネットと同じでない場合は、VPC が[接続](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/amazon-vpc-to-amazon-vpc-connectivity-options.html)されている必要があり、セキュリティグループで必要なポートが開いていることを確認する必要があります。
   +  ** `securityGroupIds` ** – ファイルシステム用に作成したセキュリティグループの ID。
   +  ** `deploymentType` (オプション)** – ファイルシステムのデプロイのタイプ。有効な値は、`SCRATCH_1`、`SCRATCH_2`、`PERSISTENT_1`、および `PERSISTENT_2` です。デプロイのタイプの詳細については、「[Amazon FSx for Lustre ファイルシステムを作成する](https://docs.aws.amazon.com/fsx/latest/LustreGuide/getting-started-step1.html)」を参照してください。
   +  **他のパラメータ (オプション)** – 他のパラメータについては、GitHub の「[Edit StorageClass](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/tree/master/examples/kubernetes/dynamic_provisioning#edit-storageclass)」(StorageClass の編集) を参照してください。

1. ストレージクラスマニフェストを作成します。

   ```
   kubectl apply -f storageclass.yaml
   ```

   出力例は次のとおりです。

   ```
   storageclass.storage.k8s.io/fsx-sc created
   ```

1. 永続的なボリューム要求マニフェストをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/claim.yaml
   ```

1. (オプション) `claim.yaml` ファイルを編集します。ストレージ要件と前のステップで選択した `deploymentType` に基づいて、`1200Gi` を次のいずれかの増分値に変更します。

   ```
   storage: 1200Gi
   ```
   +  `SCRATCH_2` および `PERSISTENT` – `1.2 TiB`、`2.4 TiB`、または 2.4 TiB を超えると 2.4 TiB の増分。
   +  `SCRATCH_1` – `1.2 TiB`、`2.4 TiB`、`3.6 TiB`、または 3.6 TiB を超えると 3.6 TiB の増分。

1. 永続的なボリューム要求を作成します。

   ```
   kubectl apply -f claim.yaml
   ```

   出力例は次のとおりです。

   ```
   persistentvolumeclaim/fsx-claim created
   ```

1. ファイルシステムがプロビジョニングされていることを確認します。

   ```
   kubectl describe pvc
   ```

   出力例は次のとおりです。

   ```
   Name:          fsx-claim
   Namespace:     default
   StorageClass:  fsx-sc
   Status:        Bound
   [...]
   ```
**注記**  
`Status` は、`Pending` になる前に 5～10 分間 `Bound` と表示されることがあります。`Status` が `Bound` になるまで次のステップに進まないでください。`Status` が 10 分を超えて `Pending` になっている場合は、`Events` 内の警告メッセージを問題に対処するための参考として使用します。

1. サンプルアプリケーションをデプロイします。

   ```
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-fsx-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
   ```

1. サンプルアプリケーションが実行中であることを確認します。

   ```
   kubectl get pods
   ```

   出力例は次のとおりです。

   ```
   NAME      READY   STATUS              RESTARTS   AGE
   fsx-app   1/1     Running             0          8s
   ```

1. ファイルシステムがアプリケーションによって正しくマウントされていることを確認します。

   ```
   kubectl exec -ti fsx-app -- df -h
   ```

   出力例は次のとおりです。

   ```
   Filesystem                   Size  Used Avail Use% Mounted on
   overlay                       80G  4.0G   77G   5% /
   tmpfs                         64M     0   64M   0% /dev
   tmpfs                        3.8G     0  3.8G   0% /sys/fs/cgroup
   192.0.2.0@tcp:/abcdef01      1.1T  7.8M  1.1T   1% /data
   /dev/nvme0n1p1                80G  4.0G   77G   5% /etc/hosts
   shm                           64M     0   64M   0% /dev/shm
   tmpfs                        6.9G   12K  6.9G   1% /run/secrets/kubernetes.io/serviceaccount
   tmpfs                        3.8G     0  3.8G   0% /proc/acpi
   tmpfs                        3.8G     0  3.8G   0% /sys/firmware
   ```

1. データがサンプルアプリケーションによって FSx for Lustre ファイルシステムに書き込まれたことを確認します。

   ```
   kubectl exec -it fsx-app -- ls /data
   ```

   出力例は次のとおりです。

   ```
   out.txt
   ```

   この出力例は、サンプルアプリケーションが `out.txt` ファイルをファイルシステムに正常に書き込んだことを示しています。

**注記**  
クラスターを削除する前に FSx for Lustre ファイルシステムを必ず削除してください。詳細については、*FSx for Lustre ユーザーガイド*の「[リソースをクリーンアップする](https://docs.aws.amazon.com/fsx/latest/LustreGuide/getting-started-step4.html)」を参照してください。

## FSx for Lustre のパフォーマンスチューニング
<a name="_performance_tuning_for_fsx_for_lustre"></a>

Amazon EKS で FSx for Lustre を使用する場合、ノードの初期化中に Lustre のチューニングを適用するとパフォーマンスを最適化できます。推奨されるアプローチは、起動テンプレートのユーザーデータを使用して、すべてのノードで一貫した設定を確保することです。

チューニングの内容は次のとおりです。
+ ネットワークと RPC の最適化
+ Lustre モジュールの管理
+ LRU (ロックリソースユニット) の調整
+ クライアントキャッシュコントロールの設定
+ OST および MDC の RPC コントロール

これらのパフォーマンスチューニングを実装する詳細な手順については、以下を参照してください。
+ 標準ノード (EFA 以外) のパフォーマンスを最適化するには、「[ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA 以外)](fsx-csi-tuning-non-efa.md)」で起動テンプレートのユーザーデータに追加できる完全なスクリプトを参照してください。
+ EFA 対応ノードのパフォーマンスを最適化するには、「[ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA)](fsx-csi-tuning-efa.md)」を参照してください。

# ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA)
<a name="fsx-csi-tuning-efa"></a>

このトピックでは、Amazon EKS と Amazon FSx for Lustre を使用して Elastic Fabric Adapter (EFA) のチューニングを設定する方法について説明します。

**注記**  
FSx for Lustre CSI ドライバーの作成とデプロイの詳細については、「[FSx for Lustre ドライバーをデプロイする](fsx-csi-create.md)」を参照してください。
EFA を使用しない標準ノードの最適化については、「[ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA 以外)](fsx-csi-tuning-non-efa.md)」を参照してください。

## ステップ 1. EKS クラスターを作成する
<a name="create-eks-cluster"></a>

所定の設定ファイルを使用してクラスターを作成します。

```
# Create cluster using efa-cluster.yaml
eksctl create cluster -f efa-cluster.yaml
```

例 `efa-cluster.yaml`:

```
#efa-cluster.yaml

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: csi-fsx
  region: us-east-1
  version: "1.30"

iam:
  withOIDC: true

availabilityZones: ["us-east-1a", "us-east-1d"]

managedNodeGroups:
  - name: my-efa-ng
    instanceType: c6gn.16xlarge
    minSize: 1
    desiredCapacity: 1
    maxSize: 1
    availabilityZones: ["us-east-1b"]
    volumeSize: 300
    privateNetworking: true
    amiFamily: Ubuntu2204
    efaEnabled: true
    preBootstrapCommands:
      - |
        #!/bin/bash
        eth_intf="$(/sbin/ip -br -4 a sh | grep $(hostname -i)/ | awk '{print $1}')"
        efa_version=$(modinfo efa | awk '/^version:/ {print $2}' | sed 's/[^0-9.]//g')
        min_efa_version="2.12.1"

        if [[ "$(printf '%s\n' "$min_efa_version" "$efa_version" | sort -V | head -n1)" != "$min_efa_version" ]]; then
            sudo curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.37.0.tar.gz
            tar -xf aws-efa-installer-1.37.0.tar.gz && cd aws-efa-installer
            echo "Installing EFA driver"
            sudo apt-get update && apt-get upgrade -y
            sudo apt install -y pciutils environment-modules libnl-3-dev libnl-route-3-200 libnl-route-3-dev dkms
            sudo ./efa_installer.sh -y
            modinfo efa
        else
            echo "Using EFA driver version $efa_version"
        fi

        echo "Installing Lustre client"
        sudo wget -O - https://fsx-lustre-client-repo-public-keys.s3.amazonaws.com/fsx-ubuntu-public-key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/fsx-ubuntu-public-key.gpg > /dev/null
        sudo echo "deb [signed-by=/usr/share/keyrings/fsx-ubuntu-public-key.gpg] https://fsx-lustre-client-repo.s3.amazonaws.com/ubuntu jammy main" > /etc/apt/sources.list.d/fsxlustreclientrepo.list
        sudo apt update | tail
        sudo apt install -y lustre-client-modules-$(uname -r) amazon-ec2-utils | tail
        modinfo lustre

        echo "Loading Lustre/EFA modules..."
        sudo /sbin/modprobe lnet
        sudo /sbin/modprobe kefalnd ipif_name="$eth_intf"
        sudo /sbin/modprobe ksocklnd
        sudo lnetctl lnet configure

        echo "Configuring TCP interface..."
        sudo lnetctl net del --net tcp 2> /dev/null
        sudo lnetctl net add --net tcp --if $eth_intf

        # For P5 instance type which supports 32 network cards,
        # by default add 8 EFA interfaces selecting every 4th device (1 per PCI bus)
        echo "Configuring EFA interface(s)..."
        instance_type="$(ec2-metadata --instance-type | awk '{ print $2 }')"
        num_efa_devices="$(ls -1 /sys/class/infiniband | wc -l)"
        echo "Found $num_efa_devices available EFA device(s)"

        if [[ "$instance_type" == "p5.48xlarge" || "$instance_type" == "p5e.48xlarge" ]]; then
           for intf in $(ls -1 /sys/class/infiniband | awk 'NR % 4 == 1'); do
               sudo lnetctl net add --net efa --if $intf --peer-credits 32
          done
        else
        # Other instances: Configure 2 EFA interfaces by default if the instance supports multiple network cards,
        # or 1 interface for single network card instances
        # Can be modified to add more interfaces if instance type supports it
            sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | head -n1) --peer-credits 32
            if [[ $num_efa_devices -gt 1 ]]; then
               sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | tail -n1) --peer-credits 32
            fi
        fi

        echo "Setting discovery and UDSP rule"
        sudo lnetctl set discovery 1
        sudo lnetctl udsp add --src efa --priority 0
        sudo /sbin/modprobe lustre

        sudo lnetctl net show
        echo "Added $(sudo lnetctl net show | grep -c '@efa') EFA interface(s)"
```

## ステップ 2. ノードグループの作成
<a name="create-node-group"></a>

EFA 対応ノードグループを作成します。

```
# Create node group using efa-ng.yaml
eksctl create nodegroup -f efa-ng.yaml
```

**重要**  
=== これらの値をセクション `# 5. Mount FSx filesystem` の環境向けに調整します。

```
FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
```

===

例 `efa-ng.yaml`:

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: final-efa
  region: us-east-1

managedNodeGroups:
  - name: ng-1
    instanceType: c6gn.16xlarge
    minSize: 1
    desiredCapacity: 1
    maxSize: 1
    availabilityZones: ["us-east-1a"]
    volumeSize: 300
    privateNetworking: true
    amiFamily: Ubuntu2204
    efaEnabled: true
    preBootstrapCommands:
      - |
        #!/bin/bash
        exec 1> >(logger -s -t $(basename $0)) 2>&1

        #########################################################################################
        #                                    Configuration Section                              #
        #########################################################################################

        # File System Configuration
        FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
        MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
        MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.

        # Lustre Tuning Parameters
        LUSTRE_LRU_MAX_AGE=600000
        LUSTRE_MAX_CACHED_MB=64
        LUSTRE_OST_MAX_RPC=32
        LUSTRE_MDC_MAX_RPC=64
        LUSTRE_MDC_MOD_RPC=50

        # File paths
        FUNCTIONS_SCRIPT="/usr/local/bin/lustre_functions.sh"
        TUNINGS_SCRIPT="/usr/local/bin/apply_lustre_tunings.sh"
        SERVICE_FILE="/etc/systemd/system/lustre-tunings.service"

        #EFA
        MIN_EFA_VERSION="2.12.1"

        # Function to check if a command was successful
        check_success() {
            if [ $? -eq 0 ]; then
                echo "SUCCESS: $1"
            else
                echo "FAILED: $1"
                return 1
            fi
        }

        echo "********Starting FSx for Lustre configuration********"

        # 1. Install Lustre client
        if grep -q '^ID=ubuntu' /etc/os-release; then
            echo "Detected Ubuntu, proceeding with Lustre setup..."
            # Add Lustre repository
            sudo wget -O - https://fsx-lustre-client-repo-public-keys.s3.amazonaws.com/fsx-ubuntu-public-key.asc | sudo gpg --dearmor | sudo tee /usr/share/keyrings/fsx-ubuntu-public-key.gpg > /dev/null

            echo "deb [signed-by=/usr/share/keyrings/fsx-ubuntu-public-key.gpg] https://fsx-lustre-client-repo.s3.amazonaws.com/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/fsxlustreclientrepo.list

            sudo apt-get update
            sudo apt-get install -y lustre-client-modules-$(uname -r)
            sudo apt-get install -y lustre-client
        else
            echo "Not Ubuntu, exiting"
            exit 1
        fi

        check_success "Install Lustre client"

        # Ensure Lustre tools are in the PATH
        export PATH=$PATH:/usr/sbin

        # 2. Apply network and RPC tunings
        echo "********Applying network and RPC tunings********"
        if ! grep -q "options ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf; then
            echo "options ptlrpc ptlrpcd_per_cpt_max=64" | sudo tee -a /etc/modprobe.d/modprobe.conf
            check_success "Set ptlrpcd_per_cpt_max"
        else
            echo "ptlrpcd_per_cpt_max already set in modprobe.conf"
        fi

        if ! grep -q "options ksocklnd credits" /etc/modprobe.d/modprobe.conf; then
            echo "options ksocklnd credits=2560" | sudo tee -a /etc/modprobe.d/modprobe.conf
            check_success "Set ksocklnd credits"
        else
            echo "ksocklnd credits already set in modprobe.conf"
        fi

        # 3. Load Lustre modules
        manage_lustre_modules() {
            echo "Checking for existing Lustre modules..."
            if lsmod | grep -q lustre; then
                echo "Existing Lustre modules found."

                # Check for mounted Lustre filesystems
                echo "Checking for mounted Lustre filesystems..."
                if mount | grep -q "type lustre"; then
                    echo "Found mounted Lustre filesystems. Attempting to unmount..."
                    mounted_fs=$(mount | grep "type lustre" | awk '{print $3}')
                    for fs in $mounted_fs; do
                        echo "Unmounting $fs"
                        sudo umount $fs
                        check_success "Unmount filesystem $fs"
                    done
                else
                    echo "No Lustre filesystems mounted."
                fi

                # After unmounting, try to remove modules
                echo "Attempting to remove Lustre modules..."
                sudo lustre_rmmod
                if [ $? -eq 0 ]; then
                    echo "SUCCESS: Removed existing Lustre modules"
                else
                    echo "WARNING: Could not remove Lustre modules. They may still be in use."
                    echo "Please check for any remaining Lustre processes or mounts."
                    return 1
                fi
            else
                echo "No existing Lustre modules found."
            fi

            echo "Loading Lustre modules..."
            sudo modprobe lustre
            check_success "Load Lustre modules" || exit 1

            echo "Checking loaded Lustre modules:"
            lsmod | grep lustre
        }

        # Managing Lustre kernel modules
        echo "********Managing Lustre kernel modules********"
        manage_lustre_modules

        # 4. Initializing Lustre networking
        echo "********Initializing Lustre networking********"
        sudo lctl network up
        check_success "Initialize Lustre networking" || exit 1

        # 4.5 EFA Setup and Configuration
        setup_efa() {
            echo "********Starting EFA Setup********"

            # Get interface and version information
            eth_intf="$(/sbin/ip -br -4 a sh | grep $(hostname -i)/ | awk '{print $1}')"
            efa_version=$(modinfo efa | awk '/^version:/ {print $2}' | sed 's/[^0-9.]//g')
            min_efa_version=$MIN_EFA_VERSION

            # Install or verify EFA driver
            if [[ "$(printf '%s\n' "$min_efa_version" "$efa_version" | sort -V | head -n1)" != "$min_efa_version" ]]; then
                echo "Installing EFA driver..."
                sudo curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.37.0.tar.gz
                tar -xf aws-efa-installer-1.37.0.tar.gz && cd aws-efa-installer

                # Install dependencies
                sudo apt-get update && apt-get upgrade -y
                sudo apt install -y pciutils environment-modules libnl-3-dev libnl-route-3-200 libnl-route-3-dev dkms

                # Install EFA
                sudo ./efa_installer.sh -y
                modinfo efa
            else
                echo "Using existing EFA driver version $efa_version"
            fi
        }

        configure_efa_network() {
            echo "********Configuring EFA Network********"

            # Load required modules
            echo "Loading network modules..."
            sudo /sbin/modprobe lnet
            sudo /sbin/modprobe kefalnd ipif_name="$eth_intf"
            sudo /sbin/modprobe ksocklnd

            # Initialize LNet
            echo "Initializing LNet..."
            sudo lnetctl lnet configure

            # Configure TCP interface
            echo "Configuring TCP interface..."
            sudo lnetctl net del --net tcp 2> /dev/null
            sudo lnetctl net add --net tcp --if $eth_intf

            # For P5 instance type which supports 32 network cards,
            # by default add 8 EFA interfaces selecting every 4th device (1 per PCI bus)
            echo "Configuring EFA interface(s)..."
            instance_type="$(ec2-metadata --instance-type | awk '{ print $2 }')"
            num_efa_devices="$(ls -1 /sys/class/infiniband | wc -l)"
            echo "Found $num_efa_devices available EFA device(s)"

            if [[ "$instance_type" == "p5.48xlarge" || "$instance_type" == "p5e.48xlarge" ]]; then
                # P5 instance configuration
                for intf in $(ls -1 /sys/class/infiniband | awk 'NR % 4 == 1'); do
                    sudo lnetctl net add --net efa --if $intf --peer-credits 32
                done
            else
                # Standard configuration
                # Other instances: Configure 2 EFA interfaces by default if the instance supports multiple network cards,
                # or 1 interface for single network card instances
                # Can be modified to add more interfaces if instance type supports it
                sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | head -n1) --peer-credits 32
                if [[ $num_efa_devices -gt 1 ]]; then
                    sudo lnetctl net add --net efa --if $(ls -1 /sys/class/infiniband | tail -n1) --peer-credits 32
                fi
            fi

            # Configure discovery and UDSP
            echo "Setting up discovery and UDSP rules..."
            sudo lnetctl set discovery 1
            sudo lnetctl udsp add --src efa --priority 0
            sudo /sbin/modprobe lustre

            # Verify configuration
            echo "Verifying EFA network configuration..."
            sudo lnetctl net show
            echo "Added $(sudo lnetctl net show | grep -c '@efa') EFA interface(s)"
        }

        # Main execution
        setup_efa
        configure_efa_network

        # 5. Mount FSx filesystem
        if [ ! -z "$FSX_DNS" ] && [ ! -z "$MOUNT_NAME" ]; then
            echo "********Creating mount point********"
            sudo mkdir -p $MOUNT_POINT
            check_success "Create mount point"

            echo "Mounting FSx filesystem..."
            sudo mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT}
            check_success "Mount FSx filesystem"
        else
            echo "Skipping FSx mount as DNS or mount name is not provided"
        fi

        # 6. Applying Lustre performance tunings
        echo "********Applying Lustre performance tunings********"

        # Get number of CPUs
        NUM_CPUS=$(nproc)

        # Calculate LRU size (100 * number of CPUs)
        LRU_SIZE=$((100 * NUM_CPUS))

        #Apply LRU tunings
        echo "Apply LRU tunings"
        sudo lctl set_param ldlm.namespaces.*.lru_max_age=${LUSTRE_LRU_MAX_AGE}
        check_success "Set lru_max_age"
        sudo lctl set_param ldlm.namespaces.*.lru_size=$LRU_SIZE
        check_success "Set lru_size"

        # Client Cache Control
        sudo lctl set_param llite.*.max_cached_mb=${LUSTRE_MAX_CACHED_MB}
        check_success "Set max_cached_mb"

        # RPC Controls
        sudo lctl set_param osc.*OST*.max_rpcs_in_flight=${LUSTRE_OST_MAX_RPC}
        check_success "Set OST max_rpcs_in_flight"

        sudo lctl set_param mdc.*.max_rpcs_in_flight=${LUSTRE_MDC_MAX_RPC}
        check_success "Set MDC max_rpcs_in_flight"

        sudo lctl set_param mdc.*.max_mod_rpcs_in_flight=${LUSTRE_MDC_MOD_RPC}
        check_success "Set MDC max_mod_rpcs_in_flight"

        # 7. Verify all tunings
        echo "********Verifying all tunings********"

        # Function to verify parameter value
        verify_param() {
            local param=$1
            local expected=$2
            local actual=$3

            if [ "$actual" == "$expected" ]; then
                echo "SUCCESS: $param is correctly set to $expected"
            else
                echo "WARNING: $param is set to $actual (expected $expected)"
            fi
        }

        echo "Verifying all parameters:"

        # LRU tunings
        actual_lru_max_age=$(lctl get_param -n ldlm.namespaces.*.lru_max_age | head -1)
        verify_param "lru_max_age" "600000" "$actual_lru_max_age"

        actual_lru_size=$(lctl get_param -n ldlm.namespaces.*.lru_size | head -1)
        verify_param "lru_size" "$LRU_SIZE" "$actual_lru_size"

        # Client Cache
        actual_max_cached_mb=$(lctl get_param -n llite.*.max_cached_mb | grep "max_cached_mb:" | awk '{print $2}')
        verify_param "max_cached_mb" "64" "$actual_max_cached_mb"

        # RPC Controls
        actual_ost_rpcs=$(lctl get_param -n osc.*OST*.max_rpcs_in_flight | head -1)
        verify_param "OST max_rpcs_in_flight" "32" "$actual_ost_rpcs"

        actual_mdc_rpcs=$(lctl get_param -n mdc.*.max_rpcs_in_flight | head -1)
        verify_param "MDC max_rpcs_in_flight" "64" "$actual_mdc_rpcs"

        actual_mdc_mod_rpcs=$(lctl get_param -n mdc.*.max_mod_rpcs_in_flight | head -1)
        verify_param "MDC max_mod_rpcs_in_flight" "50" "$actual_mdc_mod_rpcs"

        # Network and RPC configurations from modprobe.conf
        actual_ptlrpc=$(grep "ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf | awk '{print $3}')
        verify_param "ptlrpcd_per_cpt_max" "ptlrpcd_per_cpt_max=64" "$actual_ptlrpc"

        actual_ksocklnd=$(grep "ksocklnd credits" /etc/modprobe.d/modprobe.conf | awk '{print $3}')
        verify_param "ksocklnd credits" "credits=2560" "$actual_ksocklnd"

        # 8. Setup persistence
        setup_persistence() {
            # Create functions file
            cat << EOF > $FUNCTIONS_SCRIPT
        #!/bin/bash

        apply_lustre_tunings() {
            local NUM_CPUS=\$(nproc)
            local LRU_SIZE=\$((100 * NUM_CPUS))

            echo "Applying Lustre performance tunings..."
            lctl set_param ldlm.namespaces.*.lru_max_age=$LUSTRE_LRU_MAX_AGE
            lctl set_param ldlm.namespaces.*.lru_size=\$LRU_SIZE
            lctl set_param llite.*.max_cached_mb=$LUSTRE_MAX_CACHED_MB
            lctl set_param osc.*OST*.max_rpcs_in_flight=$LUSTRE_OST_MAX_RPC
            lctl set_param mdc.*.max_rpcs_in_flight=$LUSTRE_MDC_MAX_RPC
            lctl set_param mdc.*.max_mod_rpcs_in_flight=$LUSTRE_MDC_MOD_RPC
        }
        EOF

            # Create tuning script
            cat << EOF > $TUNINGS_SCRIPT
        #!/bin/bash
        exec 1> >(logger -s -t \$(basename \$0)) 2>&1

        source $FUNCTIONS_SCRIPT

        # Function to check if Lustre is mounted
        is_lustre_mounted() {
            mount | grep -q "type lustre"
        }

        # Function to mount Lustre
        mount_lustre() {
            echo "Mounting Lustre filesystem..."
            mkdir -p $MOUNT_POINT
            mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} $MOUNT_POINT
            return \$?
        }

        # Main execution
        # Try to mount if not already mounted
        if ! is_lustre_mounted; then
            echo "Lustre filesystem not mounted, attempting to mount..."
            mount_lustre
        fi

        # Wait for successful mount (up to 5 minutes)
        for i in {1..30}; do
            if is_lustre_mounted; then
                echo "Lustre filesystem mounted, applying tunings..."
                apply_lustre_tunings
                exit 0
            fi
            echo "Waiting for Lustre filesystem to be mounted... (attempt $i/30)"
            sleep 10
        done

        echo "Timeout waiting for Lustre filesystem mount"
        exit 1
        EOF

        # Create systemd service

        # Create systemd directory if it doesn't exist
        sudo mkdir -p /etc/systemd/system/

            # Create service file directly for Ubuntu
            cat << EOF > $SERVICE_FILE
        [Unit]
        Description=Apply Lustre Performance Tunings
        After=network.target remote-fs.target

        [Service]
        Type=oneshot
        ExecStart=/bin/bash -c 'source $FUNCTIONS_SCRIPT && $TUNINGS_SCRIPT'
        RemainAfterExit=yes

        [Install]
        WantedBy=multi-user.target
        EOF


            # Make scripts executable and enable service
            sudo chmod +x $FUNCTIONS_SCRIPT
            sudo chmod +x $TUNINGS_SCRIPT
            systemctl enable lustre-tunings.service
            systemctl start lustre-tunings.service
        }

        echo "********Setting up persistent tuning********"
        setup_persistence

        echo "FSx for Lustre configuration completed."
```

## (オプション) ステップ 3. EFA の設定を検証する
<a name="verify-efa-setup"></a>

ノードに SSH 接続する:

```
# Get instance ID from EKS console or {aws} CLI
ssh -i /path/to/your-key.pem ec2-user@<node-internal-ip>
```

EFA 設定を検証する:

```
sudo lnetctl net show
```

セットアップログを確認する:

```
sudo cat /var/log/cloud-init-output.log
```

`lnetctl net show` の想定される出力例:

```
net:
    - net type: tcp
      ...
    - net type: efa
      local NI(s):
        - nid: xxx.xxx.xxx.xxx@efa
          status: up
```

## デプロイ例
<a name="example-deployments"></a>

### a. claim.yaml を作成する
<a name="_a_create_claim_yaml"></a>

```
#claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fsx-claim-efa
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 4800Gi
  volumeName: fsx-pv
```

claim を適用する:

```
kubectl apply -f claim.yaml
```

### b. pv.yaml を作成する
<a name="_b_create_pv_yaml"></a>

`<replaceable-placeholders>` を更新:

```
#pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: fsx-pv
spec:
  capacity:
    storage: 4800Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  mountOptions:
    - flock
  persistentVolumeReclaimPolicy: Recycle
  csi:
    driver: fsx.csi.aws.com
    volumeHandle: fs-<1234567890abcdef0>
    volumeAttributes:
      dnsname: fs-<1234567890abcdef0>.fsx.us-east-1.amazonaws.com
      mountname: <abcdef01>
```

永続ボリュームを適用する:

```
kubectl apply -f pv.yaml
```

### c。pod.yaml を作成する
<a name="_c_create_pod_yaml"></a>

```
#pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: fsx-efa-app
spec:
  containers:
  - name: app
    image: amazonlinux:2
    command: ["/bin/sh"]
    args: ["-c", "while true; do dd if=/dev/urandom bs=100M count=20 > data/test_file; sleep 10; done"]
    resources:
      requests:
        vpc.amazonaws.com/efa: 1
      limits:
        vpc.amazonaws.com/efa: 1
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: fsx-claim-efa
```

ポッドを適用する:

```
kubectl apply -f pod.yaml
```

## 追加の検証コマンド
<a name="verification-commands"></a>

ポッドがマウントされファイルシステムに書き込まれていることを確認します。

```
kubectl exec -ti fsx-efa-app -- df -h | grep data
# Expected output:
# <192.0.2.0>@tcp:/<abcdef01>  4.5T  1.2G  4.5T   1% /data

kubectl exec -ti fsx-efa-app -- ls /data
# Expected output:
# test_file
```

ノードに SSH 接続してトラフィックが EFA を経由していることを確認します。

```
sudo lnetctl net show -v
```

想定される出力に、トラフィックの統計を含む EFA インターフェイスが表示されます。

## 関連情報
<a name="_related_information"></a>
+  [FSx for Lustre ドライバーをデプロイする](fsx-csi-create.md) 
+  [ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA 以外)](fsx-csi-tuning-non-efa.md) 
+  [Amazon FSx for Lustre のパフォーマンス](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html) 
+  [Elastic Fabric Adapter](https://docs.aws.amazon.com/ec2/latest/userguide/efa.html) 

# ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA 以外)
<a name="fsx-csi-tuning-non-efa"></a>

起動テンプレートのユーザーデータを使用して、ノードの初期化中にチューニングパラメータを適用することで、Amazon FSx for Lustre のパフォーマンスを最適化することができます。

**注記**  
FSx for Lustre CSI ドライバーの作成とデプロイの詳細については、「[FSx for Lustre ドライバーをデプロイする](fsx-csi-create.md)」を参照してください。EFA 対応ノードでパフォーマンスを最適化するには、「[ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA)](fsx-csi-tuning-efa.md)」を参照してください。

## なぜ起動テンプレートのユーザーデータを使用するのか
<a name="_why_use_launch_template_user_data"></a>
+ ノードの初期化中にチューニングを自動的に適用するため。
+ すべてのノードで一貫した設定を確保するため。
+ 手動でのノード設定を不要にするため。

## スクリプトの概要の例
<a name="_example_script_overview"></a>

このトピックで定義されているスクリプト例では、以下の操作を実行します。

### `# 1. Install Lustre client`
<a name="_1_install_lustre_client"></a>
+ Amazon Linux (AL) OS バージョンを自動検出します。
+ 適切な Lustre クライアントパッケージをインストールします。

### `# 2. Apply network and RPC tunings`
<a name="_2_apply_network_and_rpc_tunings"></a>
+ 並列 RPC 処理用に `ptlrpcd_per_cpt_max=64` を設定します。
+ `ksocklnd credits=2560` を設定してネットワークバッファを最適化します。

### `# 3. Load Lustre modules`
<a name="_3_load_lustre_modules"></a>
+ 既存の Lustre モジュールがある場合は、安全に削除します。
+ 既存のファイルシステムのアンマウントに対処します。
+ 新しい Lustre モジュールをロードします。

### `# 4. Lustre Network Initialization`
<a name="_4_lustre_network_initialization"></a>
+ Lustre のネットワーク設定を初期化します。
+ 必要なネットワークパラメータを設定します。

### `# 5. Mount FSx filesystem`
<a name="_5_mount_fsx_filesystem"></a>
+ このセクションでは、お使いの環境向けに値を調整する必要があります。

### `# 6. Apply tunings`
<a name="_6_apply_tunings"></a>
+ LRU (ロックリソースユニット) の調整:
  +  `lru_max_age=600000` 
  +  `lru_size` CPU 数に基づいて計算
+ クライアントキャッシュコントロール: `max_cached_mb=64` 
+ RPC コントロール:
  + OST `max_rpcs_in_flight=32` 
  + MDC `max_rpcs_in_flight=64` 
  + MDC `max_mod_rpcs_in_flight=50` 

### `# 7. Verify tunings`
<a name="_7_verify_tunings"></a>
+ 適用されたすべてのチューニングを検証します。
+ 各パラメータの成功または警告を報告します。

### `# 8. Setup persistence`
<a name="_8_setup_persistence"></a>
+ このセクションでも同様にお使いの環境向けに値を調整する必要があります。
+ OS のバージョン (AL2023) を自動検出し、どの `Systemd` サービスを適用するか判断します。
+ システムが起動します。
+  `Systemd` が `lustre-tunings` サービスを開始します (`WantedBy=multi-user.target` により)。
+ サービスが `apply_lustre_tunings.sh` 実行します。こちらは、
  + ファイルシステムがマウントされているかどうかを確認します。
  + マウントされていない場合、ファイルシステムをマウントします。
  + マウントが完了するまで待機します (最大 5 分)。
  + マウントが完了すると、チューニングパラメータを適用します。
+ 設定は、再起動するまでアクティブな状態のままです。
+ スクリプトが完成すると、サービスは終了します。
  + Systemd は、サービスを [アクティブ (終了済み)] にマークします。
+ 次回の再起動時にプロセスが繰り返されます。

## 起動テンプレートの作成
<a name="_create_a_launch_template"></a>

1. Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。

1. **[起動テンプレート]** を選択します。

1. [**起動テンプレートの作成**] を選択してください。

1. **[高度な詳細]** で、**[ユーザーデータ]** のセクションを見つけます。

1. 以下のスクリプトを貼り付け、必要に応じて更新します。
**重要**  
セクション `# 5. Mount FSx filesystem` と、セクション `# 8. Setup persistence` の `apply_lustre_tunings.sh` の `setup_persistence()` 関数の両方で、お使いの環境のこれらの値を調整します。  

   ```
   FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
   MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
   MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
   ```

   ```
   MIME-Version: 1.0
   Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
   --==MYBOUNDARY==
   Content-Type: text/x-shellscript; charset="us-ascii"
   #!/bin/bash
   exec 1> >(logger -s -t $(basename $0)) 2>&1
   # Function definitions
   check_success() {
       if [ $? -eq 0 ]; then
           echo "SUCCESS: $1"
       else
           echo "FAILED: $1"
           return 1
       fi
   }
   apply_tunings() {
       local NUM_CPUS=$(nproc)
       local LRU_SIZE=$((100 * NUM_CPUS))
       local params=(
           "ldlm.namespaces.*.lru_max_age=600000"
           "ldlm.namespaces.*.lru_size=$LRU_SIZE"
           "llite.*.max_cached_mb=64"
           "osc.*OST*.max_rpcs_in_flight=32"
           "mdc.*.max_rpcs_in_flight=64"
           "mdc.*.max_mod_rpcs_in_flight=50"
       )
       for param in "${params[@]}"; do
           lctl set_param $param
           check_success "Set ${param%%=*}"
       done
   }
   verify_param() {
       local param=$1
       local expected=$2
       local actual=$3
   
       if [ "$actual" == "$expected" ]; then
           echo "SUCCESS: $param is correctly set to $expected"
       else
           echo "WARNING: $param is set to $actual (expected $expected)"
       fi
   }
   verify_tunings() {
       local NUM_CPUS=$(nproc)
       local LRU_SIZE=$((100 * NUM_CPUS))
       local params=(
           "ldlm.namespaces.*.lru_max_age:600000"
           "ldlm.namespaces.*.lru_size:$LRU_SIZE"
           "llite.*.max_cached_mb:64"
           "osc.*OST*.max_rpcs_in_flight:32"
           "mdc.*.max_rpcs_in_flight:64"
           "mdc.*.max_mod_rpcs_in_flight:50"
       )
       echo "Verifying all parameters:"
       for param in "${params[@]}"; do
           name="${param%%:*}"
           expected="${param#*:}"
           actual=$(lctl get_param -n $name | head -1)
           verify_param "${name##*.}" "$expected" "$actual"
       done
   }
   setup_persistence() {
       # Create functions file
       cat << 'EOF' > /usr/local/bin/lustre_functions.sh
   #!/bin/bash
   apply_lustre_tunings() {
       local NUM_CPUS=$(nproc)
       local LRU_SIZE=$((100 * NUM_CPUS))
   
       echo "Applying Lustre performance tunings..."
       lctl set_param ldlm.namespaces.*.lru_max_age=600000
       lctl set_param ldlm.namespaces.*.lru_size=$LRU_SIZE
       lctl set_param llite.*.max_cached_mb=64
       lctl set_param osc.*OST*.max_rpcs_in_flight=32
       lctl set_param mdc.*.max_rpcs_in_flight=64
       lctl set_param mdc.*.max_mod_rpcs_in_flight=50
   }
   EOF
       # Create tuning script
       cat << 'EOF' > /usr/local/bin/apply_lustre_tunings.sh
   #!/bin/bash
   exec 1> >(logger -s -t $(basename $0)) 2>&1
   # Source the functions
   source /usr/local/bin/lustre_functions.sh
   # FSx details
   FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
   MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
   MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
   # Function to check if Lustre is mounted
   is_lustre_mounted() {
       mount | grep -q "type lustre"
   }
   # Function to mount Lustre
   mount_lustre() {
       echo "Mounting Lustre filesystem..."
       mkdir -p ${MOUNT_POINT}
       mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT}
       return $?
   }
   # Main execution
   # Try to mount if not already mounted
   if ! is_lustre_mounted; then
       echo "Lustre filesystem not mounted, attempting to mount..."
       mount_lustre
   fi
   # Wait for successful mount (up to 5 minutes)
   for i in {1..30}; do
       if is_lustre_mounted; then
           echo "Lustre filesystem mounted, applying tunings..."
           apply_lustre_tunings
           exit 0
       fi
       echo "Waiting for Lustre filesystem to be mounted... (attempt $i/30)"
       sleep 10
   done
   echo "Timeout waiting for Lustre filesystem mount"
   exit 1
   EOF
       # Create systemd service
       cat << 'EOF' > /etc/systemd/system/lustre-tunings.service
   [Unit]
   Description=Apply Lustre Performance Tunings
   After=network.target remote-fs.target
   StartLimitIntervalSec=0
   [Service]
   Type=oneshot
   ExecStart=/usr/local/bin/apply_lustre_tunings.sh
   RemainAfterExit=yes
   Restart=on-failure
   RestartSec=30
   [Install]
   WantedBy=multi-user.target
   EOF
       chmod +x /usr/local/bin/lustre_functions.sh
       chmod +x /usr/local/bin/apply_lustre_tunings.sh
       systemctl enable lustre-tunings.service
       systemctl start lustre-tunings.service
   }
   echo "Starting FSx for Lustre configuration..."
   # 1. Install Lustre client
   if grep -q 'VERSION="2"' /etc/os-release; then
       amazon-linux-extras install -y lustre
   elif grep -q 'VERSION="2023"' /etc/os-release; then
       dnf install -y lustre-client
   fi
   check_success "Install Lustre client"
   # 2. Apply network and RPC tunings
   export PATH=$PATH:/usr/sbin
   echo "Applying network and RPC tunings..."
   if ! grep -q "options ptlrpc ptlrpcd_per_cpt_max" /etc/modprobe.d/modprobe.conf; then
       echo "options ptlrpc ptlrpcd_per_cpt_max=64" | tee -a /etc/modprobe.d/modprobe.conf
       echo "options ksocklnd credits=2560" | tee -a /etc/modprobe.d/modprobe.conf
   fi
   # 3. Load Lustre modules
   modprobe lustre
   check_success "Load Lustre modules" || exit 1
   # 4. Lustre Network Initialization
   lctl network up
   check_success "Initialize Lustre networking" || exit 1
   # 5. Mount FSx filesystem
   FSX_DNS="<your-fsx-filesystem-dns>" # Needs to be adjusted.
   MOUNT_NAME="<your-mount-name>" # Needs to be adjusted.
   MOUNT_POINT="</your/mount/point>" # Needs to be adjusted.
   if [ ! -z "$FSX_DNS" ] && [ ! -z "$MOUNT_NAME" ]; then
       mkdir -p $MOUNT_POINT
       mount -t lustre ${FSX_DNS}@tcp:/${MOUNT_NAME} ${MOUNT_POINT}
       check_success "Mount FSx filesystem"
   fi
   # 6. Apply tunings
   apply_tunings
   # 7. Verify tunings
   verify_tunings
   # 8. Setup persistence
   setup_persistence
   echo "FSx for Lustre configuration completed."
   --==MYBOUNDARY==--
   ```

1. Amazon EKS ノードグループを作成するときは、この起動テンプレートを選択します。詳細については、「[クラスターのマネージドノードグループを作成する](create-managed-node-group.md)」を参照してください。

## 関連情報
<a name="_related_information"></a>
+  [FSx for Lustre ドライバーをデプロイする](fsx-csi-create.md) 
+  [ノードでの Amazon FSx for Lustre のパフォーマンスを最適化する (EFA)](fsx-csi-tuning-efa.md) 
+  [Amazon FSx for Lustre のパフォーマンス](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html) 

# FSx for NetApp ONTAP で高性能なアプリケーションストレージを使用する
<a name="fsx-ontap"></a>

NetApp Trident は、コンテナストレージインターフェイス (CSI) 準拠のドライバーを使用して、動的なストレージオーケストレーションを提供します。これにより、Amazon EKS クラスターが Amazon FSx for NetApp ONTAP ファイルシステムによってバックアップされた永続的ボリューム (PV) のライフサイクルを管理できるようになります。Amazon FSx for NetApp ONTAP CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がないことに注意してください。開始するには、NetApp Trident ドキュメントの「[Use Trident with Amazon FSx for NetApp ONTAP](https://docs.netapp.com/us-en/trident/trident-use/trident-fsx.html)」を参照してください。

Amazon FSx for NetApp ONTAP は、クラウドでフルマネージド型の ONTAP ファイルシステムを起動して実行できるストレージサービスです。ONTAP は、NetApp のファイルシステムテクノロジーであり、幅広く採用されているデータアクセス機能とデータ管理機能を提供します。FSx for ONTAP によって、オンプレミスの NetApp ファイルシステムの機能、パフォーマンス、および API に、フルマネージド型 AWS サービスの俊敏性、スケーラビリティが加わり、簡素化されます。詳細については、「[FSx for ONTAP ユーザーガイド](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/what-is-fsx-ontap.html)」を参照してください。

**重要**  
Amazon EBS CSI ドライバーと共に Amazon FSx for NetApp ONTAP を使用して EBS ボリュームをプロビジョニングしている場合は、`multipath.conf` ファイルに EBS デバイスを使用しないように指定する必要があります。サポートされている方法については、「[Configuration File Blacklist](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7/html/dm_multipath/config_file_blacklist#config_file_blacklist)」を参照してください。以下はその例です。  

```
 defaults {
        user_friendly_names yes
        find_multipaths no
      }
      blacklist {
        device {
          vendor "NVME"
          product "Amazon Elastic Block Store"
        }
      }
```

# Amazon FSx for OpenZFS でデータストレージを使用する
<a name="fsx-openzfs-csi"></a>

Amazon FSX for OpenZFS は、オンプレミスの ZFS またはその他の Linux ベースのファイルサーバーから AWS にデータを簡単に移動できるようにするフルマネージド型のファイルストレージサービスです。データの移動は、アプリケーションコードやデータの管理方法を変更しなくても実行できます。Amazon FSX for OpenZFS は、オープンソースの OpenZFS ファイルシステム上に構築された、信頼性が高く、スケーラブルで効率的で機能豊富なファイルストレージを提供しています。これらの機能は、フルマネージド型の AWS サービスの俊敏性、スケーラビリティ、およびシンプルさを兼ね備えています。詳細については、「[Amazon FSx for OpenZFS ユーザーガイド](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/what-is-fsx.html)」を参照してください。

FSx for OpenZFS コンテナストレージインターフェイス (CSI) ドライバーは、Amazon EKS クラスターが FSx for OpenZFS ボリュームのライフサイクルを管理できるようにする CSI インターフェイスを提供します。Amazon FSx for OpenZFS CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がないことに注意してください。FSx for OpenZFS CSI ドライバーを Amazon EKS クラスターにデプロイするには、GitHub の「[aws-fsx-openzfs-csi-driver](https://github.com/kubernetes-sigs/aws-fsx-openzfs-csi-driver)」を参照してください。

# Amazon File Cache を使用してレイテンシーを最小化する
<a name="file-cache-csi"></a>

Amazon File Cache は、データの保存場所にかかわらず、ファイルデータの処理に使用される AWS のフルマネージド型の高速キャッシュです。Amazon File Cache は、初回アクセス時にデータをキャッシュに自動的にロードし、使用されていないときにデータを解放します。詳細については、「[Amazon File Cache ユーザーガイド](https://docs.aws.amazon.com/fsx/latest/FileCacheGuide/what-is.html)」を参照してください。

Amazon File Cache Container Storage Interface (CSI) ドライバーは、Amazon EKS クラスターが Amazon ファイルキャッシュのライフサイクルを管理できるようにする CSI インターフェイスを提供します。Amazon File Cache CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がないことに注意してください。Amazon File Cache CSI ドライバーを Amazon EKS クラスターにデプロイするには、GitHub の「[aws-file-cache-csi-driver](https://github.com/kubernetes-sigs/aws-file-cache-csi-driver)」を参照してください。

# Mountpoint for Amazon S3 CSI ドライバーを使用して Amazon S3 オブジェクトにアクセスする
<a name="s3-csi"></a>

[Mountpoint for Amazon S3 Container Storage Interface (CSI) ドライバー](https://github.com/awslabs/mountpoint-s3-csi-driver)を使用すると、Kubernetes アプリケーションはファイルシステムインターフェイスを介して Amazon S3 オブジェクトにアクセスできるため、アプリケーションコードを変更せずに高い総スループットを実現できます。[Mountpoint for Amazon S3](https://github.com/awslabs/mountpoint-s3) 上に構築された CSI ドライバーは、Amazon S3 バケットを Amazon EKS 内のコンテナやセルフマネージド型 Kubernetes クラスターからアクセスできるボリュームとして提供します。

## 考慮事項
<a name="s3-csi-considerations"></a>
+ Mountpoint for Amazon S3 CSI ドライバーは、Windows ベースのコンテナイメージと現時点では互換性がありません。
+ Mountpoint for Amazon S3 CSI ドライバーは現在、Amazon EKS Hybrid Nodes と互換性がありません。
+ Mountpoint for Amazon S3 CSI ドライバーは、AWS Fargate をサポートしていません。ただし、Amazon EC2 で実行されているコンテナ (Amazon EKS またはカスタム Kubernetes インストール) はサポートされています。
+ Mountpoint for Amazon S3 CSI ドライバーは、静的プロビジョニングのみをサポートします。動的プロビジョニング、つまり新しいバケットの作成はサポートされていません。
**注記**  
静的プロビジョニングとは、`PersistentVolume` オブジェクトの `volumeAttributes` で `bucketName` として指定されている既存の Amazon S3 バケットを使用することです。詳細については、GitHub の「[Static Provisioning](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/examples/kubernetes/static_provisioning/README.md)」を参照してください。
+ Mountpoint for Amazon S3 CSI ドライバーでマウントされたボリュームは、すべての POSIX ファイルシステム機能をサポートしているわけではありません。ファイルシステムの動作の詳細については、GitHub の「[Mountpoint for Amazon S3 file system behavior](https://github.com/awslabs/mountpoint-s3/blob/main/doc/SEMANTICS.md)」を参照してください。

ドライバーのデプロイ方法の詳細は、「[Mountpoint for Amazon S3 ドライバーをデプロイする](s3-csi-create.md)」を参照してください。ドライバーの削除方法の詳細は、「[Mountpoint for Amazon S3 Amazon EKS アドオンを削除する](removing-s3-csi-eks-add-on.md)」を参照してください。

# Mountpoint for Amazon S3 ドライバーをデプロイする
<a name="s3-csi-create"></a>

[Mountpoint for Amazon S3 Container Storage Interface (CSI) ドライバー](https://github.com/awslabs/mountpoint-s3-csi-driver)を使用すると、Kubernetes アプリケーションはファイルシステムインターフェイスを介して Amazon S3 オブジェクトにアクセスできるため、アプリケーションコードを変更せずに高い総スループットを実現できます。

こちらの手順では、[Mountpoint for Amazon S3 CSI Amazon EKS ドライバー](s3-csi.md)をデプロイする方法を解説します。先に進む前に、[考慮事項](s3-csi.md#s3-csi-considerations)をご一読ください。

## 前提条件
<a name="s3-csi-prereqs"></a>
+ クラスターの既存の AWS Identity and Access Management (IAM) OpenID Connect (OIDC) プロバイダー。既に存在しているかどうかを確認する、または作成するには「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。
+ ご使用のデバイスまたは AWS CloudShell で、AWS CLI のバージョン 2.12.3 以降がインストールおよび設定されていること。
+ デバイスまたは AWS クラウドシェル に、`kubectl` コマンドラインツールがインストールされていること。バージョンはご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが `1.29` である場合、`kubectl` のバージョン `1.28`、`1.29`、または `1.30` が使用できます。`kubectl` をインストールまたはアップグレードする方法については「[`kubectl` および `eksctl` のセットアップ](install-kubectl.md)」を参照してください。

## ステップ 1: IAM ポリシーを作成する
<a name="s3-create-iam-policy"></a>

Mountpoint for Amazon S3 CSI ドライバーには、ファイルシステムとやり取りするための Amazon S3 アクセス許可が必要です。このセクションでは、必要な権限を付与する IAM ポリシーを作成する方法を説明します。

以下のポリシー例は、Mountpoint の IAM アクセス許可に関する推奨事項に従っています。別の方法として、AWS マネージドポリシー [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) を使用することもできますが、このマネージドポリシーでは Mountpoint に必要以上のアクセス権限が付与されます。

Mountpoint の推奨アクセス許可の詳細については、GitHub の「[Mountpoint IAM permissions](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md#iam-permissions)」を参照してください。

1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

1. 左のナビゲーションペインの [**ポリシー**] を選択します。

1. **[ポリシー]** ページで、**[ポリシーの作成]** を選択します。

1. **[ポリシーエディター]** には **[JSON]** を選択します。

1. 以下の **[ポリシー]** をコピーして、エディタに貼り付けます。
**重要**  
`amzn-s3-demo-bucket1` を Amazon S3 バケットの名前に置き換えます。

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
           {
               "Sid": "MountpointFullBucketAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1"
               ]
           },
           {
               "Sid": "MountpointFullObjectAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject",
                   "s3:AbortMultipartUpload",
                   "s3:DeleteObject"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1/*"
               ]
           }
      ]
   }
   ```

   Amazon S3 Express One Zone ストレージクラスで導入されたディレクトリバケットは、汎用バケットとは異なる認証メカニズムを使用します。`s3:*` アクションではなく、`s3express:CreateSession` アクションを使用する必要があります。ディレクトリバケットの詳細については、「*Amazon S3 ユーザーガイド*」の「[ディレクトリバケット](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html)」を参照してください。

   以下は、ディレクトリバケットに使用する最小特権ポリシーの例です。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3express:CreateSession",
               "Resource": "arn:aws:s3express:us-west-2:111122223333:bucket/amzn-s3-demo-bucket1--usw2-az1--x-s3"
           }
       ]
   }
   ```

1. [**次へ**] を選択します。

1. **[確認と作成]** ページで、ポリシーに名前を付けます。このウォークスルーでは、名前に `AmazonS3CSIDriverPolicy` を使用します。

1. [**Create policy**] (ポリシーの作成) を選択します。

## ステップ 2: IAM ロールを作成する
<a name="s3-create-iam-role"></a>

Mountpoint for Amazon S3 CSI ドライバーには、ファイルシステムとやり取りするための Amazon S3 アクセス許可が必要です。このセクションでは、IAM ロールを作成して、これらの権限を委任する方法を示します。このロールを作成するには、次のいずれかのツールを使用できます。
+  [eksctl](#eksctl_s3_store_app_data) 
+  [AWS マネジメントコンソール](#console_s3_store_app_data) 
+  [AWS CLI](#awscli_s3_store_app_data) 

**注記**  
IAM ポリシー `AmazonS3CSIDriverPolicy` は、前のセクションで作成しました。

### eksctl
<a name="eksctl_s3_store_app_data"></a>

 **`eksctl` を使用して Mountpoint for Amazon S3 CSI ドライバーの IAM ロールを作成するには** 

IAM ロールと Kubernetes サービスアカウントを作成するには、以下のコマンドを実行します。これらのコマンドはまた、`AmazonS3CSIDriverPolicy` IAM ポリシーをロールにアタッチし、Kubernetes サービスアカウント (`s3-csi-controller-sa`) に IAM ロールの Amazon リソースネーム (ARN) の注釈を付け、Kubernetes サービスアカウント名を IAMロールの信頼ポリシーに追加します。

```
CLUSTER_NAME=my-cluster
REGION=region-code
ROLE_NAME=AmazonEKS_S3_CSI_DriverRole
POLICY_ARN=AmazonEKS_S3_CSI_DriverRole_ARN
eksctl create iamserviceaccount \
    --name s3-csi-driver-sa \
    --namespace kube-system \
    --cluster $CLUSTER_NAME \
    --attach-policy-arn $POLICY_ARN \
    --approve \
    --role-name $ROLE_NAME \
    --region $REGION \
    --role-only
```

### AWS マネジメントコンソール
<a name="console_s3_store_app_data"></a>

1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

1. 左のナビゲーションペインで、**[ロール]** を選択してください。

1. **[ロール]** ページで、**[ロールの作成]** を選択してください。

1. **[信頼されたエンティティを選択]** ページで、以下の操作を実行します。

   1. **[信頼されたエンティティの種類]** セクションで、**[ウェブ アイデンティティ]** を選択します。

   1. **[Identity provider]** (ID プロバイダー) で、(Amazon EKS の **[Overview]** (概要) に示されているように) クラスターに **[OpenID Connect provider URL]** (OpenID Connect プロバイダーの URL) を選択します。

      URL が表示されない場合は、「[前提条件](#s3-csi-prereqs)」を確認してください。

   1. **[対象者]** で [`sts.amazonaws.com`] を選択します。

   1. [**次へ**] を選択します。

1. **[アクセス許可を追加]** ページで、以下を実行します。

   1. **[フィルターポリシー]** ボックスに AmazonS3CSIDriverPolicy と入力します。
**注記**  
このポリシーは、前のセクションで作成されました。

   1. 検索で返された `AmazonS3CSIDriverPolicy` 結果の左にあるチェックボックスを選択します。

   1. [**次へ**] を選択します。

1. **[名前を付けて、レビューし、作成する]** ページで、以下の操作を実行します。

   1. **[ロール名]** に、AmazonEKS\$1S3\$1CSI\$1DriverRole などロールの一意の名前を入力します。

   1. **[タグの追加 (オプション)]** で、タグをキーバリューのペアとして添付して、メタデータをロールに追加します。IAM でのタグの使用に関する詳細については『*IAM ユーザーガイド*』の「[IAM リソースにタグを付ける](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)」を参照してください。

   1. [**ロールの作成**] を選択してください。

1. ロールが作成されたら、コンソールでロールを選択して編集用に開きます。

1. **[信頼関係]** タブを選択し、続いて **[信頼ポリシーの編集]** を選択します。

1. 次のように表示されます。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
   ```

   前の行の末尾にカンマを追加し、前の行の後に次の行を追加します。*region-code* を、クラスターのある AWS リージョンに置き換えます。*EXAMPLED539D4633E53DE1B71EXAMPLE* をクラスターの OIDC プロバイダー ID に置き換えます。

   ```
   "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:s3-csi-driver-sa"
   ```

1. `Condition` 演算子が `"StringEquals"` に設定されていることを確認します。

1. **[ポリシーの更新]** を選択して終了します。

### AWS CLI
<a name="awscli_s3_store_app_data"></a>

1. クラスターの OIDC プロバイダーの URL を表示します。*マイクラスター* の部分は自分のクラスター名に置き換えます。コマンドの出力が `None` の場合は、「[前提条件](#s3-csi-prereqs)」を確認してください。

   ```
   aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text
   ```

   出力例は次のとおりです。

   ```
   https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
   ```

1. IAM ロールを作成し、Kubernetes サービスアカウントに `AssumeRoleWithWebIdentity` アクションを付与します。

   1. 次の内容を `aws-s3-csi-driver-trust-policy.json` という名前のファイルにコピーします。*111122223333* は、ご自分のアカウント ID に置き換えます。*EXAMPLED539D4633E53DE1B71EXAMPLE* および *region-code* を、前のステップで返された値にそれぞれ置き換えます。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringEquals": {
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:s3-csi-driver-sa",
                "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      ```

   1. ロールを作成します。*AmazonEKS\$1S3\$1CSI\$1DriverRole* を別の名前に変更できますが、変更する場合は、後の手順でも変更してください。

      ```
      aws iam create-role \
        --role-name AmazonEKS_S3_CSI_DriverRole \
        --assume-role-policy-document file://"aws-s3-csi-driver-trust-policy.json"
      ```

1. 次のコマンドを使用して IAM ロールを作成し、そのロールに IAM ポリシーをアタッチします。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonS3CSIDriverPolicy \
     --role-name AmazonEKS_S3_CSI_DriverRole
   ```
**注記**  
IAM ポリシー `AmazonS3CSIDriverPolicy` は、前のセクションで作成しました。

1. ドライバーを Amazon EKS アドオンとしてインストールする場合は、この手順をスキップしてください。ドライバーのセルフマネージド型インストールでは、作成した IAM ロールの ARN の注釈が付けられた Kubernetes サービスアカウントを作成します。

   1. 次の内容を `mountpoint-s3-service-account.yaml` という名前のファイルに保存します。*111122223333* は、ご自分のアカウント ID に置き換えます。

      ```
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/name: aws-mountpoint-s3-csi-driver
        name: mountpoint-s3-csi-controller-sa
        namespace: kube-system
        annotations:
          eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
      ```

   1. クラスター上で Kubernetes サービスアカウントを作成します。Kubernetes サービスアカウント (`mountpoint-s3-csi-controller-sa`) は、*AmazonEKS\$1S3\$1CSI\$1DriverRole* という名前で作成した IAM ロールの注釈が付けられています。

      ```
      kubectl apply -f mountpoint-s3-service-account.yaml
      ```
**注記**  
その手順でプラグインがデプロイされると、`s3-csi-driver-sa` という名前のサービスアカウントを作成して使用するように設定されます。

## ステップ 3: Mountpoint for Amazon S3 CSI ドライバーをインストールする
<a name="s3-install-driver"></a>

Mountpoint for Amazon S3 CSI ドライバーは、Amazon EKS アドオンを使用してインストールできます。次のツールを使用して、アドオンをクラスターに追加できます。
+  [eksctl](#eksctl_s3_add_store_app_data) 
+  [AWS マネジメントコンソール](#console_s3_add_store_app_data) 
+  [AWS CLI](#awscli_s3_add_store_app_data) 

または、セルフマネージド型インストールとして Mountpoint for Amazon S3 CSI ドライバーをインストールできます。セルフマネージド型インストールを実行する方法については、GitHub の「[Installation](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/docs/install.md#deploy-driver)」を参照してください。

`v1.8.0` 以降、CSI ドライバーの Pod を許容するようにテイントを設定できます。これを行うには、`node.tolerations` を使用して許容するカスタムのテイントセットを指定するか、`node.tolerateAllTaints` を使用してすべてのテイントを許容します。詳細については、Kubernetes ドキュメントの「[テイントと容認](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)」を参照してください。

### eksctl
<a name="eksctl_s3_add_store_app_data"></a>

 **`eksctl` を使用して Amazon S3 CSI アドオンを追加するには** 

以下のコマンドを実行してください。*my-cluster* をクラスターの名前に、*111122223333* をアカウント ID に、*AmazonEKS\$1S3\$1CSI\$1DriverRole* を[前に作成した IAM ロール](#s3-create-iam-role)の名前に置き換えます。

```
eksctl create addon --name aws-mountpoint-s3-csi-driver --cluster my-cluster \
  --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole --force
```

*--force* オプションを削除した状態で Amazon EKS アドオンを更新する際に、そのアドオン設定のいずれかが現状の設定と競合している場合、その更新は失敗します。この場合、競合を解決するためのエラーメッセージが表示されます。このオプションを指定する前に、自分が管理する必要がある設定を Amazon EKS アドオンが管理していないことを確認してください。これらの設定は、このオプションの指定により上書きされます。この設定のその他のオプションの詳細については、`eksctl` ドキュメントの「[アドオン](https://eksctl.io/usage/addons/)」を参照してください。Amazon EKS Kubernetes フィールド管理の詳細については、「[Amazon EKS アドオンのためにカスタマイズできるフィールドを決定する](kubernetes-field-management.md)」を参照してください。

設定ファイルをによって `eksctl` をカスタマイズできます。詳細については、`eksctl` ドキュメントの「[Working with configuration values](https://eksctl.io/usage/addons/#working-with-configuration-values)」を参照してください。次の例は、すべてのテイントを許容する方法を示しています。

```
# config.yaml
...

addons:
- name: aws-mountpoint-s3-csi-driver
  serviceAccountRoleARN: arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
  configurationValues: |-
    node:
      tolerateAllTaints: true
```

### AWS マネジメントコンソール
<a name="console_s3_add_store_app_data"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで **[Clusters]** (クラスター) を選択してください。

1. Mountpoint for Amazon S3 CSI アドオンを設定するクラスターの名前を選択します。

1. **[アドオン]** タブを選択してください。

1. **[その他のアドオンを入手]** を選択してください。

1. **[アドオンを選択]** ページで、次の操作を行います。

   1. **[Amazon EKS アドオン]** セクションで、**[Mountpoint for Amazon S3 CSI ドライバー]** チェックボックスを選択します。

   1. [**次へ**] を選択します。

1. **[選択したアドオンセッティングの設定]** ページで、次の操作を行います。

   1. 使用する [**バージョン**] を選択します。

   1. **[IAM ロールを選択]** で、Mountpoint for Amazon S3 CSI ドライバーの IAM ポリシーをアタッチした IAM ロールの名前を選択します。

   1. (オプション) **[オプション設定]** を展開した後、**[競合解決方法]** を更新します。**[上書きする]** を選択すると、既存のアドオンでの 1 つ以上の設定が、Amazon EKS アドオンの設定で上書きされます。このオプションが有効でない状態で既存の設定との競合が発生する場合は、オペレーションが失敗します。表示されたエラーメッセージを使用して、競合をトラブルシューティングできます。このオプションを選択する前に、自分で管理する必要のある設定が、Amazon EKS アドオンにより管理されていないことを確認してください。

   1. (オプション) **[オプション設定]** を展開した後、**[設定値]** フィールドで許容値を設定します。

   1. [**次へ**] を選択します。

1. **[確認と追加]** ページで、**[作成]** を選択します。アドオンのインストールが完了した後、インストールしたアドオンが表示されます。

### AWS CLI
<a name="awscli_s3_add_store_app_data"></a>

 **AWS CLI を使用して Mountpoint for Amazon S3 CSI アドオンを追加するには** 

以下のコマンドを実行してください。*my-cluster* をクラスターの名前に、*111122223333* をアカウント ID に、*AmazonEKS\$1S3\$1CSI\$1DriverRole* を前に作成したロールの名前に置き換えます。

```
aws eks create-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver \
  --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole
```

`--configuration-values` フラグを使用してコマンドをカスタマイズできます。次の代替例は、すべてのテイントを許容する方法を示しています。

```
aws eks create-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver \
  --service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_S3_CSI_DriverRole \
  --configuration-values '{"node":{"tolerateAllTaints":true}}'
```

## ステップ 4: Mountpoint for Amazon S3 を設定する
<a name="s3-configure-mountpoint"></a>

ほとんどの場合、Mountpoint for Amazon S3 はバケット名のみで設定できます。Mountpoint for Amazon S3 を設定する手順については、GitHub の「[Configuring Mountpoint for Amazon S3](https://github.com/awslabs/mountpoint-s3/blob/main/doc/CONFIGURATION.md)」を参照してください。

## ステップ 5: サンプルアプリケーションをデプロイする
<a name="s3-sample-app"></a>

既存の Amazon S3 バケットのドライバーにデプロイできます。詳細については、GitHub の「[Static provisioning](https://github.com/awslabs/mountpoint-s3-csi-driver/blob/main/examples/kubernetes/static_provisioning/README.md)」を参照してください。

# Mountpoint for Amazon S3 Amazon EKS アドオンを削除する
<a name="removing-s3-csi-eks-add-on"></a>

[Mountpoint for Amazon S3 CSI ドライバー](s3-csi.md)を削除する方法は 2 通りあります。
+  **クラスター上のアドオンソフトウェアを保持する** — このオプションではすべての設定の Amazon EKS 管理が削除されます。また、Amazon EKS による更新の通知機能や、更新の開始後の Amazon EKS アドオンの自動更新機能も削除されます。ただし、クラスター上のアドオンソフトウェアは保持されます。このオプションを選択すると、アドオンは Amazon EKS アドオンではなく、セルフマネージド型インストールになります。このオプションを使用すると、アドオンのダウンタイムは発生しません。この手順のコマンドには、このオプションを使用します。
+  **クラスターからアドオンソフトウェアを完全に削除する** — クラスターから Amazon EKS アドオンを削除するのはアドオンに依存するリソースがクラスター上にない場合のみとすることをお勧めします。このオプションを実行するには、この手順で使用するコマンドから `--preserve` を削除します。

アドオンに IAM アカウントが関連付けられている場合、その IAM アカウントは削除されません。

次のツールを使用して、Amazon S3 CSI アドオンを削除できます。
+  [eksctl](#eksctl_s3_remove_store_app_data) 
+  [AWS マネジメントコンソール](#console_s3_remove_store_app_data) 
+  [AWS CLI](#awscli_s3_remove_store_app_data) 

## eksctl
<a name="eksctl_s3_remove_store_app_data"></a>

 **`eksctl` を使用して Amazon S3 CSI アドオンを削除するには** 

*my-cluster* を自分のクラスター名に置き換えた上で、次のコマンドを実行します。

```
eksctl delete addon --cluster my-cluster --name aws-mountpoint-s3-csi-driver --preserve
```

## AWS マネジメントコンソール
<a name="console_s3_remove_store_app_data"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで **[Clusters]** (クラスター) を選択してください。

1. Amazon EBS CSI アドオンを削除するクラスターの名前を選択します。

1. **[アドオン]** タブを選択してください。

1. **[Mountpoint for Amazon S3 CSI ドライバー]** を選択します。

1. **[削除]** を選択してください。

1. **[削除: aws-mountpoint-s3-csi-driver]** 確認ダイアログボックスで、以下の操作を行います。

   1. Amazon EKS でのアドオンの設定の管理を停止する場合は**[クラスターで保持する]** を選択してください。クラスターでアドオンソフトウェアを保持する場合はこの操作を実行してください。これはアドオンのすべての設定を自分で管理できるようにするためです。

   1. `aws-mountpoint-s3-csi-driver` と入力してください。

   1. **[削除]** を選択します。

## AWS CLI
<a name="awscli_s3_remove_store_app_data"></a>

 **AWS CLI を使用して Amazon S3 CSI アドオンを削除するには** 

*my-cluster* を自分のクラスター名に置き換えた上で、次のコマンドを実行します。

```
aws eks delete-addon --cluster-name my-cluster --addon-name aws-mountpoint-s3-csi-driver --preserve
```

# CSI ボリュームのためにスナップショット機能を有効にする
<a name="csi-snapshot-controller"></a>

スナップショット機能を使用すると、データのポイントインタイムコピーが可能になります。Kubernetes でこの機能を使用するには、スナップショットをサポートする CSI ドライバー (Amazon EBS CSI ドライバーなど) と CSI スナップショットコントローラーの両方が必要です。スナップショットコントローラーは、Amazon EKS マネージドアドオンまたはセルフマネージドインストールのいずれかとして使用できます。

CSI スナップショットコントローラーを使用する場合の考慮事項を以下に示します。
+ スナップショットコントローラーは、スナップショット機能を備えた CSI ドライバーと一緒にインストールする必要があります。Amazon EBS CSI ドライバーのインストール手順については、「[Amazon EBS で Kubernetes ボリュームストレージを使用する](ebs-csi.md)」を参照してください。
+ Kubernetes では、プロビジョナー `kubernetes.io/aws-ebs` で `StorageClass` を使用する Amazon EBS ボリュームなど、CSI 移行経由で提供されるボリュームのスナップショットはサポートされていません。ボリュームは CSI ドライバープロビジョナー、`ebs.csi.aws.com` を参照する `StorageClass` を使用して作成する必要があります。
+ Amazon EKS Auto Mode にはスナップショットコントローラーは含まれません。EKS Auto Mode のストレージ機能はスナップショットコントローラーと互換性があります。

CSI スナップショットコントローラーは Amazon EKS マネージドアドオンを使用してインストールすることをお勧めします。このアドオンには、Amazon EKS でスナップショットを作成および管理するために必要なカスタムリソース定義 (CRD) が含まれています。Amazon EKS アドオンをクラスターに追加するには、「[Amazon EKS アドオンを作成する](creating-an-add-on.md)」を参照してください。アドオンの詳細については、「[Amazon EKS アドオン](eks-add-ons.md)」を参照してください。

または、CSI スナップショットコントローラーの自己管理型インストールを希望する場合は、GitHub でのアップストリーム Kubernetes `external-snapshotter` での「[Usage](https://github.com/kubernetes-csi/external-snapshotter/blob/master/README.md#usage)」を参照してください。