

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

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

# 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)」を参照してください。