スキップしてコンテンツを表示

Amazon EKS クラスターに Amazon S3 CSI ドライバーをインストールする方法を教えてください。

所要時間4分
0

Amazon Elastic Kubernetes サービス (Amazon EKS) クラスターで Amazon Simple Storage Service (Amazon S3) の Container Storage Interface (CSI) ドライバーを使用したいです。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

前提条件

  • kubectl および eksctl コマンドラインツールをインストールする必要があります。
  • クラスター用の AWS Identity and Access Management (IAM) OpenID Connect (OIDC) プロバイダーを作成する必要があります。
  • Amazon S3 CSI ドライバーでは EKS Pod Identity を使用できないため、サービスアカウント用の IAM ロール (IRSA) を使用してください。

OIDC の発行者 ID を取得するには、次の AWS CLI コマンド describe-cluster を実行します。

aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5

注: your_cluster_name は実際の Amazon EKS クラスター名に置き換えます。

IAM OIDC プロバイダーを設定したかどうかを確認するには、次の list-open-id-connect-providers コマンドを実行します。

aws iam list-open-id-connect-providers | grep your_OIDC_ID | cut -d "/" -f4

注: YOUR_OIDC_ID を実際の OIDC ID に置き換えます。出力が空の場合は、IAM OIDC プロバイダーを作成する必要があります。

IAM OIDC プロバイダーを作成するには、次のコマンドを実行します。

eksctl utils associate-iam-oidc-provider --cluster your_cluster_name --approve

注: your_cluster_name を実際のクラスター名に置き換えます。

Amazon S3 CSI ドライバーをデプロイする

次の手順を実行します。

  1. 要件に応じて IAM ポリシーを作成します。
    汎用バケットポリシー:
    cat <<EOF > iam-policy.json
    {
       "Version": "2012-10-17",
       "Statement": [
            {
                "Sid": "MountpointFullBucketAccess",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::your_bucket_name"
                ]
            },
            {
                "Sid": "MountpointFullObjectAccess",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject",
                    "s3:AbortMultipartUpload",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::your_bucket_name/*"
                ]
            }
       ]
    }
    EOF
    注: your-bucket-name を該当するバケット名に置き換えます。
    ディレクトリバケットポリシー:
    cat <<EOF > iam-policy.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3express:CreateSession",
                "Resource": "arn:aws:s3express:YOUR_AWS_REGION:YOUR_AWS_ACCOUNT_ID:bucket/your_bucket_name--az_id--x-s3"
            }
        ]
    }
    EOF
    注: 実際のものでそれぞれ、YOUR_AWS_REGION を AWS リージョンに、YOUR_AWS_ACCOUNT_ID を AWS アカウントに、your_bucket_name をバケット名に、az_id をアベイラビリティゾーンに置き換えます。
  2. 次の create-policy コマンドを実行し、AmazonS3CSIDriverPolicy という名前の IAM ポリシーを作成します。
    aws iam create-policy --policy-name AmazonS3CSIDriverPolicy --policy-document file://iam-policy.json
    注: iam-policy.json を実際の IAM ポリシー JSON ファイルに置き換えます。
  3. 次の IAM 信頼ポリシーを作成します。
    cat <<EOF > trust-policy.json
    {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/your_OIDC_ID"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringLike": {
                "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/your_OIDC_ID:sub": "system:serviceaccount:kube-system:s3-csi-*",
                "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/your_OIDC_ID:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
    }
    EOF
    注: 実際のものでそれぞれ、YOUR_AWS_ACCOUNT_ID をアカウントに、YOUR_AWS_REGION をリージョンに、YOUR_OIDC_ID を OIDC ID に置き換えます。
  4. 次の create-role コマンドを実行し、AmazonEKS_S3_CSI_DriverRole という名前の IAM ロールを作成します。
    aws iam create-role --role-name AmazonEKS_S3_CSI_DriverRole  --assume-role-policy-document file://"trust-policy.json"
    注: trust-policy.json を実際の IAM 信頼ポリシー JSON ファイルに置き換えます。
  5. 次の attach-role-policy コマンドを実行し、ポリシーを IAM ロールにアタッチします。
    aws iam attach-role-policy  --policy-arn arn:aws:iam::YOUR_AWS_ACCOUNT_ID:policy/AmazonS3CSIDriverPolicy --role-name AmazonEKS_S3_CSI_DriverRole
    注: YOUR_AWS_ACCOUNT_ID を実際の AWS アカウント ID に置き換えます。
  6. 次の create-addon コマンドを実行し、Amazon S3 CSI ドライバーをクラスターにデプロイします。
    aws eks  create-addon --cluster-name your_cluster_name --addon-name aws-mountpoint-s3-csi-driver --service-account-role-arn arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_S3_CSI_DriverRole
    注: 実際のものでそれぞれ、your_cluster_name をクラスター名に、YOUR_AWS_ACCOUNT_ID をアカウント ID に置き換えます。Kustomize または Helm で Amazon S3 CSI ドライバをインストールする方法については、GitHub のウェブサイトで「インストール」を参照してください。

ユーザーが既存のファイルを上書きできるようにするには、--allow-overwrite フラグを永続ボリュームに追加します。すべての書き込みは、ファイルの先頭から順番に追加する必要があります。ファイルを追加することはできません。代わりに、既存のコンテンツを新しいコンテンツに置き換える必要があります。ただし、Amazon S3 Express One Zone ストレージクラスのディレクトリバケットでは、既存のファイルを追加できます。--incremental-upload フラグを永続ボリュームに追加すると、ファイルの追加が可能になります。ファイルの最後から開始すると、すべての書き込みを順番に追加できます。詳細については、GitHub のウェブサイトで「ファイルの読み取りと書き込み」および「設定」を参照してください。

Amazon S3 CSI ドライバーのマウントポイントは静的プロビジョニングのみを使用します。動的プロビジョニングを使用したり、新しいバケットを作成したりすることはできません。マウントポイントにマウントしたボリュームは、一部の POSIX ファイルシステム機能を使用できません。詳細については、GitHub のウェブサイトで「Amazon S3 ファイルシステム用のマウントポイントの動作」を参照してください。アプリケーションに完全なファイルシステムが必要な場合は、Amazon Elastic File System (Amazon EFS) または Amazon FSx を使用することをおすすめします。

Amazon S3 CSI ドライバーをテストする

Amazon S3 CSI ドライバーをテストするには、ポッドに静的プロビジョニングを使用するサンプルアプリケーションをデプロイします。手順と例については、GitHub のウェブサイトで「静的プロビジョニングの例」を参照してください。

Amazon S3 CSI ドライバーに関する問題のトラブルシューティング

Amazon S3 CSI ドライバが想定通りに動作しない

Amazon S3 CSI ドライバーのノードポッドが実行中であることを確認するには、次のコマンドを実行します。

kubectl get all -l app.kubernetes.io/name=aws-mountpoint-s3-csi-driver -n kube-system

Amazon S3 CSI ドライバーポッドのログを確認するには、次のコマンドを実行します。

kubectl logs daemonset/s3-csi-node -n kube-system -c s3-plugin:

Amazon S3 バケットが Amazon EKS クラスターと同じリージョンにあることを確認してください。バケットとクラスターが異なるリージョンにある場合は、mountOptions を更新し、そのリージョンを含めます。

設定例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: s3-pv-1
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  csi:
    driver: s3.csi.aws.com
    volumeAttributes:
      bucketName: bucket name
    volumeHandle: s3-csi-driver-volume
  mountOptions:
  - region us-west-2
  - allow-other     
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

Amazon S3 CSI ドライバーが Bottlerocket Amazon マシンイメージ (AMI) で動作しない場合は、次のコマンドを実行してコンテナイメージのバージョンを確認してください。

kubectl get ds s3-csi-node -n kube-system -ojsonpath="{range .spec.template.spec.containers[*]}{.image}{'\n'}{end}"

コマンドの出力で、コンテナイメージのバージョンが v1.4.0 以上であることを確認します。最新の Amazon S3 CSI ドライバーバージョンを使用することをおすすめします。最新バージョンに関する情報は、GitHub のウェブサイトで 「mountpoint-s3-csi-driver リリース」を参照してください。

コンテナ内のユーザーが Amazon S3 バケットにアクセスできない

デフォルトでは、S3 バケットをマウントしたユーザーのみがマウントされたディレクトリにアクセスできます。この問題は、アクセス許可や所有権がコンテナ内の他のユーザーがバケットにアクセスできるように設定されている場合にも発生します。

root 以外のユーザーがマウントしたディレクトリにアクセスできるようにするには、mountOptions を更新して --allow-other オプションを含めます。root ユーザーがマウントされたディレクトリに別のユーザーとしてアクセスできるようにするには、--allow-root を使用します。

ポリシー例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: s3-pv-1
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  csi:
    driver: s3.csi.aws.com
    volumeAttributes:
      bucketName: bucket name
    volumeHandle: s3-csi-driver-volume
  mountOptions:
  - region us-west-2
  - allow-other                        
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

「Volume capability not supported」エラーが発生する

Amazon S3 CSI ドライバーの使用時に、次の例のようなエラーメッセージが表示されることがあります。

「Warning FailedMount 39s (x8 over 104s) kubelet MountVolume.SetUp failed for volume "s3-pv-1" : rpc error: code = InvalidArgument desc = Volume capability not supported」

上記のエラーは、ReadWriteOncePodReadWriteOnce など、Amazon S3 CSI ドライバーがサポートしていないアクセスモードを使用した場合に発生します。アクセスモードには、ReadWriteMany または ReadOnlyMany のみを使用できます。

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ