6.10. AWS Elastic File Service CSI Driver Operator


6.10.1. 概要

OpenShift Container Platform は、AWS Elastic File Service (EFS) の Container Storage Interface (CSI) ドライバーを使用して永続ボリューム (PV) をプロビジョニングできます。

CSI Operator およびドライバーを使用する場合は、永続ストレージ および CSI ボリュームの設定 を理解しておくことが推奨されます。

AWS EFS CSI Driver Operator をインストールすると、OpenShift Container Platform はデフォルトで AWS EFS CSI Operator と AWS EFS CSI ドライバーを openshift-cluster-csi-drivers namespace にインストールします。これにより、AWS EFS CSI Driver Operator は、AWS EFS アセットにマウントする CSI がプロビジョニングする PV を作成することができます。

  • AWS EFS CSI Driver Operator をインストールしても、デフォルトでは、永続ボリューム要求 (PVC) の作成に使用されるストレージクラスは作成されません。ただし、AWS EFS StorageClass を手動で作成することは可能です。AWS EFS CSI Driver Operator は、ストレージボリュームをオンデマンドで作成できるようにし、クラスター管理者がストレージを事前にプロビジョニングする必要がなくすことで、動的ボリュームのプロビジョニングをサポートします。
  • AWS EFS CSI ドライバー を使用すると、AWS EFS PV を作成し、マウントできます。
注記

AWS EFS はリージョナルボリュームのみをサポートしており、ゾーンボリュームはサポートしていません。

6.10.2. CSI について

ストレージベンダーはこれまで Kubernetes の一部としてストレージドライバーを提供してきました。Container Storage Interface (CSI) の実装では、サードパーティーのプロバイダーは、コア Kubernetes コードを変更せずに標準のインターフェイスを使用してストレージプラグインを提供できます。

CSI Operator は、インツリーボリュームプラグインでは不可能なボリュームスナップショットなどのストレージオプションを OpenShift Container Platform ユーザーに付与します。

6.10.3. AWS EFS CSI Driver Operator の設定

  1. AWS EFS と AWS Secure Token Service (STS) を使用している場合は、STS のロール Amazon Resource Name (ARN) を取得します。これは、AWS EFS CSI Driver Operator をインストールするために必要です。
  2. AWS EFS CSI Driver Operator をインストールします。
  3. AWS EFS CSI ドライバーをインストールします。

6.10.3.1. Security Token Service の Amazon リソース名ロールの取得

この手順では、AWS Security Token Service (STS) 上の OpenShift Container Platform で AWS EFS CSI Driver Operator を設定するための Amazon リソース名 (ARN) ロールを取得する方法を説明します。

重要

AWS EFS CSI Driver Operator をインストールする前に、この手順を実行してください (AWS EFS CSI Driver Operator のインストール に記載された手順を参照)。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • AWS アカウントの認証情報。

手順

ARN ロールは複数の方法で取得できます。次の手順は、クラスターのインストールと同じ概念と CCO ユーティリティー (ccoctl) バイナリーツールを使用する 1 つの方法を示しています。

STS を使用して AWS EFS CSI Driver Operator を設定するための ARN ロールを取得するには、以下を実行します。

  1. STS でクラスターをインストールするために使用した OpenShift Container Platform リリースイメージから ccoctl を展開します。詳細は、「Cloud Credential Operator ユーティリティーの設定」を参照してください。
  2. 以下の例に示されているように EFS CredentialsRequest YAML ファイルを作成および保存してから、それを credrequests ディレクトリーに配置します。

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: openshift-aws-efs-csi-driver
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: AWSProviderSpec
        statementEntries:
        - action:
          - elasticfilesystem:*
          effect: Allow
          resource: '*'
      secretRef:
        name: aws-efs-cloud-credentials
        namespace: openshift-cluster-csi-drivers
      serviceAccountNames:
      - aws-efs-csi-driver-operator
      - aws-efs-csi-driver-controller-sa
    Copy to Clipboard Toggle word wrap

  3. ccoctl ツールを実行して AWS に新規の IAM ロールを生成し、その YAML ファイルをローカルファイルシステムに作成します (<path_to_ccoctl_output_dir>/manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml)。

    $ ccoctl aws create-iam-roles --name=<name> --region=<aws_region> --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
    Copy to Clipboard Toggle word wrap
    • name=<name> は、追跡用に作成されたクラウドリソースにタグを付けるために使用される名前です。
    • region=<aws_region> は、クラウドリソースが作成される AWS リージョンです。
    • dir=<path_to_directory_with_list_of_credentials_requests>/credrequests は、前のステップの EFS CredentialsRequest ファイルが含まれるディレクトリーです。
    • <aws_account_id> は AWS アカウント ID です。

      $ ccoctl aws create-iam-roles --name my-aws-efs --credentials-requests-dir credrequests --identity-provider-arn arn:aws:iam::123456789012:oidc-provider/my-aws-efs-oidc.s3.us-east-2.amazonaws.com
      Copy to Clipboard Toggle word wrap

      出力例

      2022/03/21 06:24:44 Role arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud- created
      2022/03/21 06:24:44 Saved credentials configuration to: /manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml
      2022/03/21 06:24:45 Updated Role policy for Role my-aws-efs-openshift-cluster-csi-drivers-aws-efs-cloud-
      Copy to Clipboard Toggle word wrap

  4. 前の手順の 出力例 の最初の行から、ARN ロールをコピーします。ARN ロールは、"Role" と "created" の間にあります。この例では、ARN ロールは "arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud" です。

    AWS EFS CSI Driver Operator をインストールするときに、ARN ロールが必要になります。

次のステップ

AWS EFS CSI Driver Operator をインストール します。

6.10.3.2. AWS EFS CSI Driver Operator のインストール

AWS EFS CSI Driver Operator (Red Hat Operator) は、デフォルトでは OpenShift Container Platform にインストールされません。以下の手順を使用して、クラスター内で AWS EFS CSI Driver Operator をインストールおよび設定します。

前提条件

  • OpenShift Container Platform Web コンソールにアクセスできる。

手順

Web コンソールから AWS EFS CSI Driver Operator をインストールするには、以下を実行します。

  1. Web コンソールにログインします。
  2. AWS EFS CSI Operator をインストールします。

    1. Operators OperatorHub をクリックします。
    2. フィルターボックスに AWS EFS CSI と入力して、AWS EFS CSI Operator を探します。
    3. AWS EFS CSI Driver Operator ボタンをクリックします。

      重要

      AWS EFS Operator ではなく AWS EFS CSI Driver Operator を必ず選択してください。AWS EFS Operator はコミュニティー Operator であり、Red Hat ではサポートしていません。

    4. AWS EFS CSI Driver Operator ページで Install をクリックします。
    5. Install Operator のページで、以下のことを確認してください。

      • AWS EFS と AWS Secure Token Service (STS) を使用している場合は、role ARN フィールドに、Security Token Service のロール Amazon Resource Name の取得 の手順の最後のステップでコピーした ARN ロールを入力します。
      • All namespaces on the cluster (default) が選択されている。
      • Installed Namespaceopenshift-cluster-csi-drivers に設定されている。
    6. Install をクリックします。

      インストールが終了すると、AWS EFS CSI Operator が Web コンソールの Installed Operators に表示されます。

次のステップ

AWS EFS CSI ドライバーをインストール します。

6.10.3.3. AWS EFS CSI ドライバーのインストール

前提条件

  • OpenShift Container Platform Web コンソールにアクセスできる。

手順

  1. Administration CustomResourceDefinitions ClusterCSIDriver をクリックします。
  2. Instances タブで Create ClusterCSIDriver をクリックします。
  3. 以下の YAML ファイルを使用します。

    apiVersion: operator.openshift.io/v1
    kind: ClusterCSIDriver
    metadata:
        name: efs.csi.aws.com
    spec:
      managementState: Managed
    Copy to Clipboard Toggle word wrap
  4. Create をクリックします。
  5. 以下の条件が "True" に変わるのを待ちます。

    • AWSEFSDriverNodeServiceControllerAvailable
    • AWSEFSDriverControllerServiceControllerAvailable

6.10.4. AWS EFS ストレージクラスの作成

ストレージクラスを使用すると、ストレージのレベルや使用状況を区別し、記述することができます。ストレージクラスを定義することにより、ユーザーは動的にプロビジョニングされた永続ボリュームを取得できます。

AWS EFS CSI Driver Operator (Red Hat Operator) は、インストール後、デフォルトではストレージクラスを作成しません。ただし、AWS EFS ストレージクラスを手動で作成することは可能です。

6.10.4.1. コンソールを使用した AWS EFS ストレージクラスの作成

手順

  1. OpenShift Container Platform コンソールで、Storage StorageClasses をクリックします。
  2. StorageClasses ページで、Create StorageClass をクリックします。
  3. StorageClass ページで、次の手順を実行します。

    1. ストレージクラスを参照するための名前を入力します。
    2. オプション: 説明を入力します。
    3. 回収ポリシーを選択します。
    4. Provisioner ドロップダウンリストから efs.csi.aws.com を選択します。
    5. オプション: 選択したプロビジョナーの設定パラメーターを設定します。
  4. Create をクリックします。

6.10.4.2. CLI を使用した AWS EFS ストレージクラスの作成

手順

  • StorageClass オブジェクトを作成します。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: efs-sc
    provisioner: efs.csi.aws.com
    parameters:
      provisioningMode: efs-ap 
    1
    
      fileSystemId: fs-a5324911 
    2
    
      directoryPerms: "700" 
    3
    
      gidRangeStart: "1000" 
    4
    
      gidRangeEnd: "2000" 
    5
    
      basePath: "/dynamic_provisioning" 
    6
    Copy to Clipboard Toggle word wrap
    1
    動的プロビジョニングを有効にするには、provisioningModeefs-ap を指定する必要があります。
    2
    fileSystemId は、手動で作成した EFS ボリュームの ID にする必要があります。
    3
    directoryPerms は、ボリュームのルートディレクトリーのデフォルトパーミッションです。この場合、ボリュームには所有者のみがアクセスできます。
    4 5
    gidRangeStartgidRangeEnd は、AWS アクセスポイントの GID を設定する際に使用する POSIX グループ ID (GID) の範囲を設定します。指定しないと、デフォルトの範囲は 50000 - 7000000 になります。プロビジョニングされた各ボリューム、つまり AWS のアクセスポイントには、この範囲からの固有 GID が割り当てられます。
    6
    basePath は、動的にプロビジョニングされたボリュームを作成する際に使用される EFS ボリューム上のディレクトリーです。この場合は、EFS ボリューム上に “/dynamic_provisioning/<random uuid>” として PV がプロビジョニングされます。PV を使用する Pod には、そのサブディレクトリーのみがマウントされます。
    注記

    クラスター管理者は、それぞれが異なる EFS ボリュームを使用する複数の StorageClass オブジェクトを作成することができます。

6.10.5. AWS EFS CSI クロスアカウントのサポート

クロスアカウントのサポートにより、1 つの AWS アカウントに OpenShift Container Platform クラスターを配置し、AWS Elastic File System (EFS) Container Storage Interface (CSI) ドライバーを使用して別の AWS アカウントにファイルシステムをマウントできます。

前提条件

  • 管理者権限を持つ OpenShift Container Platform クラスターへのアクセス
  • 2 つの有効な AWS アカウント
  • EFS CSI Operator がインストールされている。EFS CSI Operator のインストールの詳細は、AWS EFS CSI ドライバー Operator のインストール セクションを参照してください。
  • OpenShift Container Platform クラスターと EFS ファイルシステムの両方が同じ AWS リージョンに存在する必要があります。
  • 以下の手順で使用される 2 つの仮想プライベートクラウド(VPC)が、異なるネットワーククラスレスドメイン間ルーティング(CIDR)範囲を使用するようにしてください。
  • OpenShift Container Platform CLI (oc)へのアクセス。
  • AWS CLI へのアクセス。
  • jq コマンドライン JSON プロセッサーへのアクセス。

手順

次の手順では、設定方法を説明します。

  • OpenShift Container Platform AWS アカウント A: Red Hat OpenShift Container Platform クラスター v4.16 以降が含まれ、VPC 内にデプロイされます。
  • AWS Account B: VPC (サブネット、ルートテーブル、およびネットワーク接続を含む)が含まれます。EFS ファイルシステムがこの VPC に作成されます。

アカウント間で AWS EFS を使用するには:

  1. 環境を設定します。

    1. 次のコマンドを実行して、環境変数を設定します。

      export CLUSTER_NAME="<CLUSTER_NAME>" 
      1
      
      export AWS_REGION="<AWS_REGION>" 
      2
      
      export AWS_ACCOUNT_A_ID="<ACCOUNT_A_ID>" 
      3
      
      export AWS_ACCOUNT_B_ID="<ACCOUNT_B_ID>" 
      4
      
      export AWS_ACCOUNT_A_VPC_CIDR="<VPC_A_CIDR>" 
      5
      
      export AWS_ACCOUNT_B_VPC_CIDR="<VPC_B_CIDR>" 
      6
      
      export AWS_ACCOUNT_A_VPC_ID="<VPC_A_ID>" 
      7
      
      export AWS_ACCOUNT_B_VPC_ID="<VPC_B_ID>" 
      8
      
      export SCRATCH_DIR="<WORKING_DIRECTORY>" 
      9
      
      export CSI_DRIVER_NAMESPACE="openshift-cluster-csi-drivers" 
      10
      
      export AWS_PAGER="" 
      11
      Copy to Clipboard Toggle word wrap
      1
      選択のクラスター名。
      2
      AWS region of choice。
      3
      AWS アカウント A ID。
      4
      AWS Account B ID。
      5
      アカウント A の VPC の CIDR 範囲。
      6
      アカウント B の VPC の CIDR 範囲。
      7
      アカウント A (クラスター)の VPC ID
      8
      アカウント B の VPC ID (EFS クロスアカウント)
      9
      一時ファイルの保存に使用する書き込み可能なディレクトリー。
      10
      ドライバーがデフォルト以外の名前空間にインストールされている場合は、この値を変更します。
      11
      AWS CLI がすべてが stdout に直接出力します。
    2. 次のコマンドを実行して、作業ディレクトリーを作成します。

      mkdir -p $SCRATCH_DIR
      Copy to Clipboard Toggle word wrap
    3. OpenShift Container Platform CLI で以下のコマンドを実行して、クラスターの接続性を確認します。

      $ oc whoami
      Copy to Clipboard Toggle word wrap
    4. OpenShift Container Platform クラスタータイプを判別し、ノードセレクターを設定します。

      EFS クロスアカウント機能では、EFS CSI コントローラー Pod を実行しているノードに AWS IAM ポリシーを割り当てる必要があります。ただし、これはすべての OpenShift Container Platform タイプに一貫性があるわけではありません。

      • クラスターが Hosted Control Plane (HyperShift)としてデプロイされている場合は、次のコマンドを実行して、NODE_SELECTOR 環境変数がワーカーノードラベルを保持するように設定します。

        export NODE_SELECTOR=node-role.kubernetes.io/worker
        Copy to Clipboard Toggle word wrap
      • その他すべての OpenShift Container Platform タイプについて、以下のコマンドを実行して、NODE_SELECTOR 環境変数がマスターノードラベルを保持するように設定します。

        export NODE_SELECTOR=node-role.kubernetes.io/master
        Copy to Clipboard Toggle word wrap
    5. 次のコマンドを実行して、AWS CLI プロファイルをアカウント切り替えの環境変数として設定します。

      export AWS_ACCOUNT_A="<ACCOUNT_A_NAME>"
      export AWS_ACCOUNT_B="<ACCOUNT_B_NAME>"
      Copy to Clipboard Toggle word wrap
    6. 次のコマンドを実行して、AWS CLI が両方のアカウントのデフォルトとして JSON 出力形式で設定されていることを確認してください。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      aws configure get output
      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      aws configure get output
      Copy to Clipboard Toggle word wrap

      上記のコマンドが返すと、以下のようになります。

      • 値なし: デフォルトの出力形式はすでに JSON に設定されており、変更は必要ありません。
      • 任意の値: JSON 形式を使用するように AWS CLI を再設定します。出力形式の変更に関する詳細は、AWS ドキュメントの Setting the output format in the AWS CLI を参照してください。
    7. 次のコマンドを実行して、シェルで AWS_PROFILE の設定を解除して、AWS_DEFAULT_PROFILE との競合を防ぎます。

      unset AWS_PROFILE
      Copy to Clipboard Toggle word wrap
  2. AWS Account B IAM のロールとポリシーを設定します。

    1. 次のコマンドを実行して、アカウント B プロファイルに切り替えます。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、EFS CSI ドライバー Operator の IAM ロール名を定義します。

      export ACCOUNT_B_ROLE_NAME=${CLUSTER_NAME}-cross-account-aws-efs-csi-operator
      Copy to Clipboard Toggle word wrap
    3. 次のコマンドを実行して、IAM 信頼ポリシーファイルを作成します。

      cat <<EOF > $SCRATCH_DIR/AssumeRolePolicyInAccountB.json
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::${AWS_ACCOUNT_A_ID}:root"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {}
              }
          ]
      }
      EOF
      Copy to Clipboard Toggle word wrap
    4. 次のコマンドを実行して、EFS CSI Driver Operator の IAM ロールを作成します。

      ACCOUNT_B_ROLE_ARN=$(aws iam create-role \
        --role-name "${ACCOUNT_B_ROLE_NAME}" \
        --assume-role-policy-document file://$SCRATCH_DIR/AssumeRolePolicyInAccountB.json \
        --query "Role.Arn" --output text) \
      && echo $ACCOUNT_B_ROLE_ARN
      Copy to Clipboard Toggle word wrap
    5. 次のコマンドを実行して、IAM ポリシーファイルを作成します。

      cat << EOF > $SCRATCH_DIR/EfsPolicyInAccountB.json
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "VisualEditor0",
                  "Effect": "Allow",
                  "Action": [
                      "ec2:DescribeNetworkInterfaces",
                      "ec2:DescribeSubnets"
                  ],
                  "Resource": "*"
              },
              {
                  "Sid": "VisualEditor1",
                  "Effect": "Allow",
                  "Action": [
                      "elasticfilesystem:DescribeMountTargets",
                      "elasticfilesystem:DeleteAccessPoint",
                      "elasticfilesystem:ClientMount",
                      "elasticfilesystem:DescribeAccessPoints",
                      "elasticfilesystem:ClientWrite",
                      "elasticfilesystem:ClientRootAccess",
                      "elasticfilesystem:DescribeFileSystems",
                      "elasticfilesystem:CreateAccessPoint",
                      "elasticfilesystem:TagResource"
                  ],
                  "Resource": "*"
              }
          ]
      }
      EOF
      Copy to Clipboard Toggle word wrap
    6. 次のコマンドを実行して、IAM ポリシーを作成します。

      ACCOUNT_B_POLICY_ARN=$(aws iam create-policy --policy-name "${CLUSTER_NAME}-efs-csi-policy" \
         --policy-document file://$SCRATCH_DIR/EfsPolicyInAccountB.json \
         --query 'Policy.Arn' --output text) \
      && echo ${ACCOUNT_B_POLICY_ARN}
      Copy to Clipboard Toggle word wrap
    7. 次のコマンドを実行して、ポリシーをロールにアタッチします。

      aws iam attach-role-policy \
         --role-name "${ACCOUNT_B_ROLE_NAME}" \
         --policy-arn "${ACCOUNT_B_POLICY_ARN}"
      Copy to Clipboard Toggle word wrap
  3. AWS Account A IAM のロールとポリシーを設定します。

    1. 次のコマンドを実行して、アカウント A プロファイルに切り替えます。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、IAM ポリシードキュメントを作成します。

      cat << EOF > $SCRATCH_DIR/AssumeRoleInlinePolicyPolicyInAccountA.json
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "${ACCOUNT_B_ROLE_ARN}"
          }
        ]
      }
      EOF
      Copy to Clipboard Toggle word wrap
    3. AWS アカウント A で、次のコマンドを実行して、AWS 管理ポリシー AmazonElasticFileSystemClientFullAccess を OpenShift Container Platform クラスターマスターロールにアタッチします。

      EFS_CLIENT_FULL_ACCESS_BUILTIN_POLICY_ARN=arn:aws:iam::aws:policy/AmazonElasticFileSystemClientFullAccess
      declare -A ROLE_SEEN
      for NODE in $(oc get nodes --selector="${NODE_SELECTOR}" -o jsonpath='{.items[*].metadata.name}'); do
          INSTANCE_PROFILE=$(aws ec2 describe-instances \
              --filters "Name=private-dns-name,Values=${NODE}" \
              --query 'Reservations[].Instances[].IamInstanceProfile.Arn' \
              --output text | awk -F'/' '{print $NF}' | xargs)
          MASTER_ROLE_ARN=$(aws iam get-instance-profile \
              --instance-profile-name "${INSTANCE_PROFILE}" \
              --query 'InstanceProfile.Roles[0].Arn' \
              --output text | xargs)
          MASTER_ROLE_NAME=$(echo "${MASTER_ROLE_ARN}" | awk -F'/' '{print $NF}' | xargs)
          echo "Checking role: '${MASTER_ROLE_NAME}'"
          if [[ -n "${ROLE_SEEN[$MASTER_ROLE_NAME]:-}" ]]; then
              echo "Already processed role: '${MASTER_ROLE_NAME}', skipping."
              continue
          fi
          ROLE_SEEN["$MASTER_ROLE_NAME"]=1
          echo "Assigning policy ${EFS_CLIENT_FULL_ACCESS_BUILTIN_POLICY_ARN} to role ${MASTER_ROLE_NAME}"
          aws iam attach-role-policy --role-name "${MASTER_ROLE_NAME}" --policy-arn "${EEFS_CLIENT_FULL_ACCESS_BUILTIN_POLICY_ARN}"
      done
      Copy to Clipboard Toggle word wrap
  4. ポリシーを IAM エンティティーに割り当て、ロールの仮定を許可します。

    この手順は、クラスター設定によって異なります。以下のシナリオの両方で、EFS CSI ドライバー Operator はエンティティーを使用して AWS に対して認証し、このエンティティーにはアカウント B のロールを引き受けるパーミッションが必要です。

    クラスターの場合に、以下を実行します。

    • STS が有効にされていない: EFS CSI ドライバー Operator は AWS 認証に IAM ユーザーエンティティーを使用します。手順「IAM ユーザーへのポリシーのアタッチ」に進んで、ロールの仮定を許可します。
    • STS が有効になっている: EFS CSI ドライバー Operator は AWS 認証に IAM ロールエンティティーを使用します。ロールの仮定を許可するために手順「IAM ロールへのポリシーのアタッチ」に進みます。
  5. ロールの前提条件を許可するための IAM User へのポリシーの割り当て

    1. 次のコマンドを実行して、EFS CSI Driver Operator が使用する IAM ユーザーを特定します。

      EFS_CSI_DRIVER_OPERATOR_USER=$(oc -n openshift-cloud-credential-operator get credentialsrequest/openshift-aws-efs-csi-driver -o json | jq -r '.status.providerStatus.user')
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、ポリシーを IAM ユーザーにアタッチします。

      aws iam put-user-policy \
          --user-name "${EFS_CSI_DRIVER_OPERATOR_USER}"  \
          --policy-name efs-cross-account-inline-policy \
          --policy-document file://$SCRATCH_DIR/AssumeRoleInlinePolicyPolicyInAccountA.json
      Copy to Clipboard Toggle word wrap
  6. IAM ロールにポリシーを割り当て、ロールの仮定を許可します。

    1. 次のコマンドを実行して、EFS CSI ドライバー Operator によって現在使用されている IAM ロール名を特定します。

      EFS_CSI_DRIVER_OPERATOR_ROLE=$(oc -n ${CSI_DRIVER_NAMESPACE} get secret/aws-efs-cloud-credentials -o jsonpath='{.data.credentials}' | base64 -d | grep role_arn | cut -d'/' -f2) && echo ${EFS_CSI_DRIVER_OPERATOR_ROLE}
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、EFS CSI Driver Operator が使用する IAM ロールにポリシーを割り当てます。

       aws iam put-role-policy \
          --role-name "${EFS_CSI_DRIVER_OPERATOR_ROLE}"  \
          --policy-name efs-cross-account-inline-policy \
          --policy-document file://$SCRATCH_DIR/AssumeRoleInlinePolicyPolicyInAccountA.json
      Copy to Clipboard Toggle word wrap
  7. VPC ピアリングを設定します。

    1. 次のコマンドを実行して、アカウント A から Account B へのピアリング要求を開始します。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      PEER_REQUEST_ID=$(aws ec2 create-vpc-peering-connection --vpc-id "${AWS_ACCOUNT_A_VPC_ID}" --peer-vpc-id "${AWS_ACCOUNT_B_VPC_ID}" --peer-owner-id "${AWS_ACCOUNT_B_ID}" --query VpcPeeringConnection.VpcPeeringConnectionId --output text)
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、アカウント B からのピアリング要求を受け入れます。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      aws ec2 accept-vpc-peering-connection --vpc-peering-connection-id "${PEER_REQUEST_ID}"
      Copy to Clipboard Toggle word wrap
    3. 次のコマンドを実行して、アカウント A のルートテーブル ID を取得し、アカウント B VPC にルートを追加します。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      for NODE in $(oc get nodes --selector=node-role.kubernetes.io/worker | tail -n +2 | awk '{print $1}')
      do
          SUBNET=$(aws ec2 describe-instances --filters "Name=private-dns-name,Values=$NODE" --query 'Reservations[*].Instances[*].NetworkInterfaces[*].SubnetId' | jq -r '.[0][0][0]')
          echo SUBNET is ${SUBNET}
          ROUTE_TABLE_ID=$(aws ec2 describe-route-tables --filters "Name=association.subnet-id,Values=${SUBNET}" --query 'RouteTables[*].RouteTableId' | jq -r '.[0]')
          echo Route table ID is $ROUTE_TABLE_ID
          aws ec2 create-route --route-table-id ${ROUTE_TABLE_ID} --destination-cidr-block ${AWS_ACCOUNT_B_VPC_CIDR} --vpc-peering-connection-id ${PEER_REQUEST_ID}
      done
      Copy to Clipboard Toggle word wrap
    4. 次のコマンドを実行して、アカウント B のルートテーブル ID を取得し、アカウント A VPC にルートを追加します。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      for ROUTE_TABLE_ID in $(aws ec2 describe-route-tables   --filters "Name=vpc-id,Values=${AWS_ACCOUNT_B_VPC_ID}"   --query "RouteTables[].RouteTableId" | jq -r '.[]')
      do
          echo Route table ID is $ROUTE_TABLE_ID
          aws ec2 create-route --route-table-id ${ROUTE_TABLE_ID} --destination-cidr-block ${AWS_ACCOUNT_A_VPC_CIDR} --vpc-peering-connection-id ${PEER_REQUEST_ID}
      done
      Copy to Clipboard Toggle word wrap
  8. アカウント B のセキュリティーグループを設定し、アカウント A から EFS への NFS トラフィックを許可します。

    1. 次のコマンドを実行して、アカウント B プロファイルに切り替えます。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、EFS アクセス用の VPC セキュリティーグループを設定します。

      SECURITY_GROUP_ID=$(aws ec2 describe-security-groups --filters Name=vpc-id,Values="${AWS_ACCOUNT_B_VPC_ID}" | jq -r '.SecurityGroups[].GroupId')
      aws ec2 authorize-security-group-ingress \
       --group-id "${SECURITY_GROUP_ID}" \
       --protocol tcp \
       --port 2049 \
       --cidr "${AWS_ACCOUNT_A_VPC_CIDR}" | jq .
      Copy to Clipboard Toggle word wrap
  9. アカウント B にリージョン全体の EFS ファイルシステムを作成します。

    1. 次のコマンドを実行して、アカウント B プロファイルに切り替えます。

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      Copy to Clipboard Toggle word wrap
    2. 次のコマンドを実行して、リージョン全体の EFS ファイルシステムを作成します。

      CROSS_ACCOUNT_FS_ID=$(aws efs create-file-system --creation-token efs-token-1 \
      --region ${AWS_REGION} \
      --encrypted | jq -r '.FileSystemId') \
      && echo $CROSS_ACCOUNT_FS_ID
      Copy to Clipboard Toggle word wrap
    3. 次のコマンドを実行して、EFS のリージョン全体のマウントターゲットを設定します。

      for SUBNET in $(aws ec2 describe-subnets \
        --filters "Name=vpc-id,Values=${AWS_ACCOUNT_B_VPC_ID}" \
        --region ${AWS_REGION} \
        | jq -r '.Subnets.[].SubnetId'); do \
          MOUNT_TARGET=$(aws efs create-mount-target --file-system-id ${CROSS_ACCOUNT_FS_ID} \
          --subnet-id ${SUBNET} \
          --region ${AWS_REGION} \
          | jq -r '.MountTargetId'); \
          echo ${MOUNT_TARGET}; \
      done
      Copy to Clipboard Toggle word wrap

      これにより、VPC の各サブネットにマウントポイントが作成されます。

  10. アカウント間のアクセス用に EFS Operator を設定します。

    1. 以下のコマンドを実行して、後続の手順で作成するシークレットおよびストレージクラスのカスタム名を定義します。

      export SECRET_NAME=my-efs-cross-account
      export STORAGE_CLASS_NAME=efs-sc-cross
      Copy to Clipboard Toggle word wrap
    2. OpenShift Container Platform CLI で以下のコマンドを実行して、アカウント B のロール ARN を参照するシークレットを作成します。

      oc create secret generic ${SECRET_NAME} -n ${CSI_DRIVER_NAMESPACE} --from-literal=awsRoleArn="${ACCOUNT_B_ROLE_ARN}"
      Copy to Clipboard Toggle word wrap
    3. OpenShift Container Platform CLI で以下のコマンドを実行して、CSI ドライバーコントローラーに新規に作成されたシークレットへのアクセスを許可します。

      oc -n ${CSI_DRIVER_NAMESPACE} create role access-secrets --verb=get,list,watch --resource=secrets
      oc -n ${CSI_DRIVER_NAMESPACE} create rolebinding --role=access-secrets default-to-secrets --serviceaccount=${CSI_DRIVER_NAMESPACE}:aws-efs-csi-driver-controller-sa
      Copy to Clipboard Toggle word wrap
    4. OpenShift Container Platform CLI で以下のコマンドを実行して、アカウント B から EFS ID と以前に作成したシークレットを参照する新しいストレージクラスを作成します。

      cat << EOF | oc apply -f -
      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: ${STORAGE_CLASS_NAME}
      provisioner: efs.csi.aws.com
      parameters:
        provisioningMode: efs-ap
        fileSystemId: ${CROSS_ACCOUNT_FS_ID}
        directoryPerms: "700"
        gidRangeStart: "1000"
        gidRangeEnd: "2000"
        basePath: "/dynamic_provisioning"
        csi.storage.k8s.io/provisioner-secret-name: ${SECRET_NAME}
        csi.storage.k8s.io/provisioner-secret-namespace: ${CSI_DRIVER_NAMESPACE}
      EOF
      Copy to Clipboard Toggle word wrap

6.10.6. Amazon Elastic File Storage の動的プロビジョニング

AWS EFS CSI ドライバー は、他の CSI ドライバーとは異なる形式の動的プロビジョニングをサポートします。既存の EFS ボリュームのサブディレクトリーとして新しい PV をプロビジョニングします。PV はお互いに独立しています。しかし、これらはすべて同じ EFS ボリュームを共有しています。ボリュームが削除されると、そのボリュームからプロビジョニングされたすべての PV も削除されます。EFS CSI ドライバーは、そのようなサブディレクトリーごとに AWS アクセスポイントを作成します。AWS AccessPoint の制限により、単一の StorageClass/EFS ボリュームから動的にプロビジョニングできるのは 1000 PV のみです。

重要

なお、PVC.spec.resources は EFS では強制されません。

以下の例では、5 GiB の容量を要求しています。しかし、作成された PV は無限であり、どんな量のデータ (ペタバイトのような) も保存することができます。ボリュームに大量のデータを保存してしまうと、壊れたアプリケーション、あるいは不正なアプリケーションにより、多額の費用が発生します。

AWS の EFS ボリュームサイズのモニタリングを使用することを強く推奨します。

前提条件

  • Amazon Elastic File Storage (Amazon EFS) ボリュームが作成されている。
  • AWS EFS ストレージクラスを作成している。

手順

動的プロビジョニングを有効にするには、以下の手順を実施します。

  • 以前に作成した StorageClass を参照して、通常どおり PVC (または StatefulSet や Template) を作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test
    spec:
      storageClassName: efs-sc
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    Copy to Clipboard Toggle word wrap

動的プロビジョニングのセットアップに問題がある場合は、AWS EFS のトラブルシューティング を参照してください。

6.10.7. Amazon Elastic File Storage を使用した静的 PV の作成

動的プロビジョニングを行わずに、Amazon Elastic File Storage (Amazon EFS) ボリュームを単一の PV として使用できます。ボリューム全体が Pod にマウントされます。

前提条件

  • Amazon EFS ボリュームが作成されている。

手順

  • 以下の YAML ファイルで PV を作成します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: efs-pv
    spec:
      capacity: 
    1
    
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: efs.csi.aws.com
        volumeHandle: fs-ae66151a 
    2
    
        volumeAttributes:
          encryptInTransit: "false" 
    3
    Copy to Clipboard Toggle word wrap
    1
    spec.capacity には意味がなく、CSI ドライバーでは無視されます。PVC へのバインディング時にのみ使用されます。アプリケーションは、ボリュームに任意の量のデータを保存することができます。
    2
    volumeHandle は、AWS で作成した EFS ボリュームと同じ ID である必要があります。独自のアクセスポイントを提供する場合、volumeHandle<EFS volume ID>::<access point ID> とします。たとえば、fs-6e633ada::fsap-081a1d293f0004630 です。
    3
    必要に応じて、転送中の暗号化を無効にすることができます。デフォルトでは、暗号化が有効になっています。

静的 PV の設定に問題がある場合は、AWS EFS のトラブルシューティング を参照してください。

6.10.8. Amazon Elastic File Storage のセキュリティー

次の情報は、Amazon Elastic File Storage (Amazon EFS) のセキュリティーに重要です。

前述の動的プロビジョニングなどでアクセスポイントを使用する場合、Amazon はファイルの GID をアクセスポイントの GID に自動的に置き換えます。また、EFS では、ファイルシステムの権限を評価する際に、アクセスポイントのユーザー ID、グループ ID、セカンダリーグループ ID を考慮します。EFS は、NFS クライアントの ID を無視します。アクセスポイントの詳細は、https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html を参照してください。

その結果、EFS ボリュームは FSGroup を静かに無視します。OpenShift Container Platform は、ボリューム上のファイルの GID を FSGroup で置き換えることができません。マウントされた EFS アクセスポイントにアクセスできる Pod は、そこにあるすべてのファイルにアクセスできます。

これとは関係ありませんが、転送中の暗号化はデフォルトで有効になっています。詳細は、https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html を参照してください。

6.10.9. Amazon Elastic File Storage のトラブルシューティング

次の情報は、Amazon Elastic File Storage (Amazon EFS) に関する問題のトラブルシューティング方法に関するガイダンスです。

  • AWS EFS Operator と CSI ドライバーは、namespace openshift-cluster-csi-drivers で実行されます。
  • AWS EFS Operator と CSI ドライバーのログ収集を開始するには、以下のコマンドを実行します。

    $ oc adm must-gather
    [must-gather      ] OUT Using must-gather plugin-in image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5
    [must-gather      ] OUT namespace/openshift-must-gather-xm4wq created
    [must-gather      ] OUT clusterrolebinding.rbac.authorization.k8s.io/must-gather-2bd8x created
    [must-gather      ] OUT pod for plug-in image quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5 created
    Copy to Clipboard Toggle word wrap
  • AWS EFS Operator のエラーを表示するには、ClusterCSIDriver のステータスを表示します。

    $ oc get clustercsidriver efs.csi.aws.com -o yaml
    Copy to Clipboard Toggle word wrap
  • Pod にボリュームをマウントできない場合 (以下のコマンドの出力に示す):

    $ oc describe pod
    ...
      Type     Reason       Age    From               Message
      ----     ------       ----   ----               -------
      Normal   Scheduled    2m13s  default-scheduler  Successfully assigned default/efs-app to ip-10-0-135-94.ec2.internal
      Warning  FailedMount  13s    kubelet            MountVolume.SetUp failed for volume "pvc-d7c097e6-67ec-4fae-b968-7e7056796449" : rpc error: code = DeadlineExceeded desc = context deadline exceeded 
    1
    
      Warning  FailedMount  10s    kubelet            Unable to attach or mount volumes: unmounted volumes=[persistent-storage], unattached volumes=[persistent-storage kube-api-access-9j477]: timed out waiting for the condition
    Copy to Clipboard Toggle word wrap
    1
    ボリュームがマウントされていないことを示す警告メッセージ。

    このエラーは、OpenShift Container Platform ノードと Amazon EFS 間のパケットを AWS がドロップすることで頻繁に発生します。

    以下が正しいことを確認します。

    • AWS のファイアウォールとセキュリティーグループ
    • ネットワーク: ポート番号と IP アドレス

6.10.10. AWS EFS CSI Driver Operator のアンインストール

AWS EFS CSI Driver Operator (Red Hat Operator) をアンインストールすると、すべての EFS PV にアクセスできなくなります。

前提条件

  • OpenShift Container Platform Web コンソールにアクセスできる。

手順

Web コンソールから AWS EFS CSI Driver Operator をアンインストールするには、以下を実行します。

  1. Web コンソールにログインします。
  2. AWS EFS PV を使用するすべてのアプリケーションを停止します。
  3. すべての AWS EFS PV を削除します。

    1. Storage PersistentVolumeClaims をクリックします。
    2. AWS EFS CSI Driver Operator が使用している各 PVC を選択し、PVC の右端にあるドロップダウンメニューをクリックして、Delete PersistentVolumeClaims をクリックします。
  4. AWS EFS CSI ドライバー をアンインストールします。

    注記

    Operator をアンインストールする前に、まず CSI ドライバーを削除する必要があります。

    1. Administration CustomResourceDefinitions ClusterCSIDriver をクリックします。
    2. Instances タブの efs.csi.aws.com の左端にあるドロップダウンメニューをクリックし、Delete ClusterCSIDriver をクリックします。
    3. プロンプトが表示されたら、Delete をクリックします。
  5. AWS EFS CSI Operator をアンインストールします。

    1. Operators Installed Operators をクリックします。
    2. Installed Operators ページで、スクロールするか、Search by name ボックスに AWS EFS CSI と入力して Operator を見つけてクリックします。
    3. Installed Operators > Operator details ページの右上にある Actions Uninstall Operator をクリックします。
    4. Uninstall Operator ウィンドウでプロンプトが表示されたら、Uninstall ボタンをクリックして namespace から Operator を削除します。Operator によってクラスターにデプロイされたアプリケーションは手動でクリーンアップする必要があります。

      アンインストールすると、AWS EFS CSI Driver Operator が Web コンソールの Installed Operators セクションにリスト表示されなくなります。

注記

クラスターを破棄 (openshift-install destroy cluster) する前に、AWS の EFS ボリュームを削除する必要があります。クラスターの VPC を使用する EFS ボリュームがある場合、OpenShift Container Platform クラスターを破棄することはできません。Amazon はこのような VPC の削除を許可していません。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat