View a markdown version of this page

Amazon EFS CSI ドライバーで、Amazon S3 Filesシステムストレージを使用する - Amazon EKS

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

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

Amazon EFS CSI ドライバーで、Amazon S3 Filesシステムストレージを使用する

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

考慮事項

  • Amazon EFS CSI ドライバーは、Windows ベースのコンテナイメージと互換性がありません。

  • EKS Fargate は、S3 ファイルをサポートしていません。

  • Amazon EFS CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がありません。

  • Amazon EFS CSI ドライバーでの Amazon S3 Filesのサポートは、バージョン 3.0.0 から開始されます。

前提条件

  • Amazon EFS CSI ドライバーには AWS Identity and Access Management (IAM) のアクセス権限が必要です。

  • ご使用のデバイスまたは AWS CloudShell で、バージョン 2.12.3 以降、または AWS コマンドラインインターフェイス (AWS CLI) のバージョン 1.27.160 以降がインストールおよび設定されていること。現在のバージョンを確認するには、aws --version | cut -d / -f2 | cut -d ' ' -f1 を参照してください。yumapt-get、macOS 用の Homebrew などのパッケージマネージャーは、多くの場合 AWS CLI の最新バージョンより数バージョン古くなっています。最新バージョンをインストールするには、「 AWS コマンドラインインターフェイスユーザーガイド」の「インストール」および「aws configure を使用したクイック設定」を参照してください。AWS クラウドシェル にインストールされている AWS CLI バージョンも最新バージョンより数バージョン遅れることがあります。更新するには、「AWS CloudShell ユーザーガイド」の「ホームディレクトリへの AWS CLI のインストール」を参照してください。

  • デバイスまたは AWS CloudShell に、kubectl コマンドラインツールがインストールされていること。バージョンはご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが 1.29 である場合、kubectl のバージョン 1.281.29、または 1.30 が使用できます。kubectl をインストールまたはアップグレードする方法については、kubectl および eksctl のセットアップ を参照してください。

ステップ 1: IAM ロールを作成する

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 Filesシステムと Amazon EFS ストレージの両方を使用する場合は、AmazonS3FilesCSIDriverPolicyAmazonEFSCSIDriverPolicy の両方のマネージドポリシーをコントローラーロールにアタッチする必要があります。Amazon EBS ストレージの詳細については、Amazon EFS で Elastic File System ストレージを使用する を参照してください。

この手順を実装するには、次のいずれかのツールを使用できます。

注記

この手順には、ドライバーを Amazon EKS アドオンとして使用するための特定のステップが書かれています。セルフマネージド型インストールについての詳細は、GitHub の「Set up driver permission」を参照してください。

eksctl

Pod Identity を使用する場合

以下のコマンドを実行します。ここでは、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 ロールを使用している場合

次のコマンドを実行して、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 マネジメントコンソール

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. ロールの作成後

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

      1. Amazon EKS コンソール を開きます。

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

      3. アクセス タブを選択します。

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

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

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

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

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

      9. Pod Identity の関連付けの作成については、Pod Identity の関連付けを作成する (AWS コンソール) で詳しく確認できます。

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

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

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

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

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

        "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",
      4. [ポリシーの更新] を選択して終了します。

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

AWS CLI

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

Pod Identity を使用する場合

  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" ] } ] }
    2. ロールを作成します。マイクラスター の部分は自分のクラスター名に置き換えます。

      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"
  2. コントローラーロールに、必要な AWS マネージドポリシーをアタッチします。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \ --role-name $controller_role_name
  3. 同じ信頼ポリシーを使用して、ノードの 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"
  4. ノードロールに、必要な 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
  5. 次のコマンドを実行して、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
  6. Pod Identity の関連付けの作成については、Pod Identity の関連付けを作成する (AWS コンソール) で詳しく確認できます。

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

  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 の場合は、「前提条件」を確認してください。

  2. コントローラーサービスアカウントの 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" } } } ] }
    2. ロールを作成します。

      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"
  3. コントローラーロールに、必要な AWS マネージドポリシーをアタッチします。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonS3FilesCSIDriverPolicy \ --role-name $controller_role_name
  4. ノードサービスアカウントの 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" } } } ] }
    2. ロールを作成します。

      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"
  5. ノードロールに、必要な 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 ポリシードキュメント」を参照してください。

ステップ 2: Amazon EFS CSI ドライバーを取得する

Amazon EFS CSI ドライバーは Amazon EKS アドオンを使用してインストールすることをお勧めします。Amazon EKS アドオンをクラスターに追加するには、Amazon EKS アドオンを作成する を参照してください。アドオンの詳細については、Amazon EKS アドオン を参照してください。Amazon EKS アドオンを使用できない場合は、その理由に関する問題を コンテナロードマップ GitHub リポジトリ に送信することをお勧めします。

重要

Amazon EFS ドライバーを Amazon EKS アドオンとして追加する前に、クラスターにセルフマネージドバージョンのドライバーがインストールされていないことを確認してください。インストールされている場合は、GitHub の「Uninstalling the Amazon EFS CSI Driver」を参照してください。

または、Amazon EFS CSI ドライバーのセルフマネージド型インストールが必要な場合は、GitHub の「Installation」を参照してください。

ステップ 3: Amazon EFS ファイルシステムを作成する

Amazon S3 Filesシステムを作成するには、「GitHub」の「Amazon EKS 用の Amazon S3 Filesシステムを作成」を参照してください。

ステップ 4: サンプルアプリケーションをデプロイする

さまざまなサンプルアプリケーションをデプロイし、必要に応じて変更できます。詳細については、「GitHub」の「」を参照してください。