

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

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

# Amazon EFS CSI ドライバーで、Amazon S3 ファイルシステムストレージを使用する
<a name="s3files-csi"></a>

S3 ファイルは、すべての AWS コンピューティングを Amazon S3 のデータに直接接続する共有ファイルシステムです。これにより、データが S3 を離れることなく、完全なファイルシステムのセマンティクスと低レイテンシーのパフォーマンスを備えたファイルとして、すべての S3 データにすばやく直接アクセスできます。つまり、ファイルベースのアプリケーション、エージェント、チームは、既に依存しているツールを使用して、ファイルシステムとして S3 データにアクセスして操作できます。[Amazon EFS Container Storage Interface (CSI) ドライバー](https://github.com/kubernetes-sigs/aws-efs-csi-driver) を使用すると、AWS で実行されている Kubernetes クラスターは、バージョン [3.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-3.x.md#v300) 以降の永続的ボリュームとして Amazon S3 ファイルシステムをマウントできます。このトピックでは、Amazon EKS クラスター上の Amazon S3 ファイルシステムを管理するために、Amazon EFS CSI ドライバーを使用する方法について説明します。

## 考慮事項
<a name="s3files-csi-considerations"></a>
+ Amazon EFS CSI ドライバーは、Windows ベースのコンテナイメージと互換性がありません。
+ EKS Fargate は、S3 ファイルをサポートしていません。
+ Amazon EFS CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がありません。
+ Amazon EFS CSI ドライバーでの Amazon S3 ファイルのサポートは、バージョン [3.0.0](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/CHANGELOG-3.x.md#v300) から開始されます。

## 前提条件
<a name="s3files-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 CloudShell に、`kubectl` コマンドラインツールがインストールされていること。バージョンはご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが `1.29` である場合、`kubectl` のバージョン `1.28`、`1.29`、または `1.30` が使用できます。`kubectl` をインストールまたはアップグレードする方法については、[`kubectl` および `eksctl` のセットアップ](install-kubectl.md) を参照してください。

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

Amazon EFS CSI ドライバーには、ファイルシステムと対話するための IAM アクセス許可が必要です。EFS CSI ドライバーは、個別の IAM ロールを持つ 2 つのサービスアカウントを使用します。
+  `efs-csi-controller-sa` — コントローラーで使用され、`AmazonS3FilesCSIDriverPolicy` が必要です。
+  `efs-csi-node-sa` — ノードデーモンセットで使用されるには、以下が必要です。
  +  `AmazonS3ReadOnlyAccess` — S3 バケットから直接読み取りをストリーミングして、スループットを向上できます。
  +  `AmazonElasticFileSystemsUtils` — マウント操作の可視性とトラブルシューティングの容易性を向上させるため、efs-utils のログを Amazon CloudWatch に公開できるようにします。

**注記**  
Amazon S3 ファイルシステムと Amazon EFS ストレージの両方を使用する場合は、`AmazonS3FilesCSIDriverPolicy` と `AmazonEFSCSIDriverPolicy` の両方のマネージドポリシーをコントローラーロールにアタッチする必要があります。Amazon EBS ストレージの詳細については、[Amazon EFS で Elastic File System ストレージを使用する](efs-csi.md) を参照してください。

この手順を実装するには、次のいずれかのツールを使用できます。
+  [`eksctl`](#eksctl_s3files_store_app_data) 
+  [AWS マネジメントコンソール](#console_s3files_store_app_data) 
+  [AWS CLI](#awscli_s3files_store_app_data) 

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

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

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

以下のコマンドを実行します。ここでは、`eksctl` を使用して IAM ロールと、Pod Identity の関連付けを作成しています。*マイクラスター* をご自分の値に置き換えます。

```
export cluster_name=my-cluster

# Create the controller role
eksctl create podidentityassociation \
    --service-account-name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name AmazonEKS_EFS_CSI_ControllerRole \
    --permission-policy-arns arn:aws:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy

# Create the node role
eksctl create podidentityassociation \
    --service-account-name efs-csi-node-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name AmazonEKS_EFS_CSI_NodeRole \
    --permission-policy-arns arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess,arn:aws:iam::aws:policy/AmazonElasticFileSystemsUtils
```

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

次のコマンドを実行して、`eksctl` を使用して IAM ロールを作成します。*my-cluster* はクラスター名に、*region-code* を AWS のリージョンコードに置き換えます。

```
export cluster_name=my-cluster
export region_code=region-code

# Create the controller role
export controller_role_name=AmazonEKS_EFS_CSI_ControllerRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $controller_role_name \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \
    --approve \
    --region $region_code

# Create the node role
export node_role_name=AmazonEKS_EFS_CSI_NodeRole
eksctl create iamserviceaccount \
    --name efs-csi-node-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $node_role_name \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonElasticFileSystemsUtils \
    --approve \
    --region $region_code
```

### AWS マネジメントコンソール
<a name="console_s3files_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. **[フィルタポリシー]** ボックスに `AmazonS3FilesCSIDriverPolicy` と入力します。

   1. 検索結果に表示されたポリシーの左側にあるチェックボックスを選択します。

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

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

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

   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. 上記の手順を繰り返して、ノードサービスアカウントの 2 つ目の役割を作成します。**アクセス許可の追加** ページで、代わりに `AmazonS3ReadOnlyAccess` と `AmazonElasticFileSystemsUtils` をアタッチします。次に、**Kubernetes サービスアカウント** フィールドの `efs-csi-node-sa` との Pod Identity 関連付けを作成します。

   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-controller-sa",
         ```

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

      1. 上記の手順を繰り返して、ノードサービスアカウントの 2 つ目の役割を作成します。**アクセス許可の追加** ページで、代わりに `AmazonS3ReadOnlyAccess` と `AmazonElasticFileSystemsUtils` をアタッチします。信頼ポリシーで、`:sub` 条件値に `efs-csi-node-sa` を使用します。

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

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

#### Pod Identity を使用する場合
<a name="s3files-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. ロールを作成します。*マイクラスター* の部分は自分のクラスター名に置き換えます。

      ```
      export cluster_name=my-cluster
      export controller_role_name=AmazonEKS_EFS_CSI_ControllerRole
      aws iam create-role \
        --role-name $controller_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/AmazonS3FilesCSIDriverPolicy \
     --role-name $controller_role_name
   ```

1. 同じ信頼ポリシーを使用して、ノードの IAM ロールを作成します。

   ```
   export node_role_name=AmazonEKS_EFS_CSI_NodeRole
   aws iam create-role \
     --role-name $node_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/AmazonS3ReadOnlyAccess \
     --role-name $node_role_name
   
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonElasticFileSystemsUtils \
     --role-name $node_role_name
   ```

1. 次のコマンドを実行して、Pod Identity の関連付けを作成します。`<111122223333>` は、ご自分のアカウント ID に置き換えます。

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

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

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

1. クラスターの OIDC プロバイダーの URL を表示します。*マイクラスター* の部分は自分のクラスター名に置き換えます。

   ```
   export cluster_name=my-cluster
   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 ロールを作成します。

   1. 次の内容を `controller-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.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com",
                          "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
                      }
                  }
              }
          ]
      }
      ```

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

      ```
      export controller_role_name=AmazonEKS_EFS_CSI_ControllerRole
      aws iam create-role \
        --role-name $controller_role_name \
        --assume-role-policy-document file://"controller-trust-policy.json"
      ```

1. コントローラーロールに、必要な AWS マネージドポリシーをアタッチします。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \
     --role-name $controller_role_name
   ```

1. ノードサービスアカウントの IAM ロールを作成します。

   1. 次の内容を `node-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.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:sub": "system:serviceaccount:kube-system:efs-csi-node-sa",
                          "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B71EXAMPLE>:aud": "sts.amazonaws.com"
                      }
                  }
              }
          ]
      }
      ```

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

      ```
      export node_role_name=AmazonEKS_EFS_CSI_NodeRole
      aws iam create-role \
        --role-name $node_role_name \
        --assume-role-policy-document file://"node-trust-policy.json"
      ```

1. ノードロールに、必要な AWS マネージドポリシーをアタッチします。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
     --role-name $node_role_name
   
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::aws:policy/AmazonElasticFileSystemsUtils \
     --role-name $node_role_name
   ```

**注記**  
この `AmazonS3ReadOnlyAccess` ポリシーは、すべての S3 バケットへの読み取りアクセスを許可します。特定のバケットへのアクセスを制限するには、バケットをデタッチし、タグベースのインラインポリシーに置き換えます。詳細については、GitHub の[「Amazon EFS CSI ドライバー IAM ポリシードキュメント](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/iam-policy-create.md)」を参照してください。

## ステップ 2: Amazon EFS CSI ドライバーを取得する
<a name="s3files-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/install.md#uninstalling-the-amazon-efs-csi-driver)」を参照してください。

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

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

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

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

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