AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Amazon EKS で永続ストレージを使用する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) で永続ストレージを使用したいと考えています。
簡単な説明
Amazon EKS で永続ストレージを使用するには、以下のいずれかのオプションのステップを実行します。
- Amazon Elastic Block Store (Amazon EBS) Container Storage Interface (CSI) ドライバーをデプロイし、テストします。
- Amazon Elastic File System (Amazon EFS) CSI ドライバーをデプロイし、テストします。
注: セキュリティと効率の観点から、Amazon EKS アドオンを使用してCSI ドライバーをインストールすることをおすすめします。また、最新バージョンのドライバーのインストールが推奨されます。インストール手順と最新のドライバーバージョンについては、GitHub のウェブサイトで aws-ebs-csi-driver または aws-efs-csi-driver を参照してください。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
前提条件:
-
使用する Kubernetes のバージョンに合った kubectl バージョンを設定すること。バージョンスキューの要件については、Kubernetes のウェブサイトで kubectl を参照してください。
-
eksctl をインストールするか、更新します。手順については、eksctl のウェブサイトで「インストール」を参照してください。
-
AWS Identity and Access Management (IAM) の Create 権限を設定します。次に、ポリシーを CSI ドライバーまたは Amazon EKS ワーカーノードのロールにアタッチします。
-
Amazon EKS クラスターを作成し、ワーカーノードをクラスターに結合します。ワーカーノードがクラスターにアタッチされたかどうかを確認するには、次のコマンドを実行します。
kubectl get nodes -
クラスターに IAM OpenID Connect (OIDC) プロバイダーが存在することを確認するには、次の AWS CLI コマンド describe-cluster を実行します。
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text注: your_cluster_name を実際のクラスター名に置き換えてください。
-
IAM OIDC プロバイダーが設定済みかどうかを確認するには、次の list-open-id-connect-providers コマンドを実行します。
aws iam list-open-id-connect-providers | grep OIDC-ID注: OIDC-ID を実際の OIDC プロバイダー ID に置き換えてください。エラーメッセージ が表示される場合は、IAM OIDC プロバイダーを作成"No OpenIDConnect provider found in your account"します。
Amazon EBS CSI ドライバー
Amazon EBS CSI ドライバーをデプロイするには、次の手順を実行します。
-
次の例に類似した 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/OIDC-ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:aud": "sts.amazonaws.com", "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] } EOF注: YOUR_AWS_ACCOUNT_ID を AWS アカウント ID に、YOUR_AWS_REGION を使用する AWS リージョンに、OIDC-ID を OIDC プロバイダー ID に置き換えてください。
-
次の create-role コマンドを実行し、AmazonEKS_EBS_CSI_DriverRole という IAM ロールを作成します。
aws iam create-role --role-name AmazonEKS_EBS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json" -
CSI ドライバーの AWS マネージド IAM ポリシーを IAM ロールにアタッチするには、次の attach-role-policy コマンドを実行します。
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --role-name AmazonEKS_EBS_CSI_DriverRole -
Amazon EBS CSI ドライバーをデプロイするには、Kustomize、Helm、または Amazon EKS マネージドアドオンを使用します。デプロイ手順については、GitHub のウェブサイトで「インストール」を参照してください。
-
ポッドに動的プロビジョニングを使用するサンプルアプリケーションを使用して Amazon EBS CSI ドライバーをテストします。Amazon EBS CSI ドライバーは、EBS ボリュームをオンデマンドでプロビジョニングします。
Amazon EFS CSI ドライバー
CSI ドライバーの IAM ロールを作成する
ワーカーノードを含むクラスターにおいて、次の手順を実行します。
-
AmazonEFSCSIDriverPolicy の使用方法については、「サービスアカウントで IAM ロールを使用する場合」を参照してください。次に、ステップ 7 に進みます。
または、次のコマンドを実行し、GitHub から IAM ポリシードキュメントをダウンロードします。curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json -
IAM ポリシーを作成するには、次の create-policy コマンドを実行します。
aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json -
OIDC プロバイダーの URL を確認するには、次の describe-cluster コマンドを実行します。
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text注: your_cluster_name を実際のクラスター名に置き換えてください。
-
次の IAM 信頼ポリシーを作成し、Kubernetes サービスアカウントに AssumeRoleWithWebIdentity アクションを許可します。
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/OIDC-ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] } EOF注: YOUR_AWS_ACCOUNT_ID をアカウント ID に、YOUR_AWS_REGION を使用するリージョンに、OIDC-ID をクラスターの OIDC プロバイダー ID に置き換えてください。
-
IAM ロールを作成するには、次の create-role コマンドを実行します。
aws iam create-role --role-name AmazonEKS_EFS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json" -
新しい IAM ポリシーをロールにアタッチするには、次の attach-role-policy コマンドを実行します。
aws iam attach-role-policy --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/AmazonEKS_EFS_CSI_Driver_Policy --role-name AmazonEKS_EFS_CSI_DriverRole注: YOUR_AWS_ACCOUNT_ID を実際のアカウント ID に置き換えてください。
-
マネージドアドオンを使用する場合は、「Amazon EFS CSI ドライバーのデプロイ」に進んでください。セルフマネージドドライバーをインストールするには、手順 7 ~ 10 を実行します。YAML ファイルに efs-service-account.yaml と名前をつけ、次の内容を保存します。
apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::AWS_ACCOUNT_ID:role/AmazonEKS_EFS_CSI_DriverRole注: YOUR_AWS_ACCOUNT_ID を実際のアカウント ID に置き換えてください。
-
クラスターに Kubernetes サービスアカウントを作成するには、次のコマンドを実行します。
kubectl apply -f efs-service-account.yaml注: Kubernetes サービスアカウント efs-csi-controller-sa には、作成した IAM ロールのアノテーションが含まれます。
-
パブリック Amazon Elastic Container Registry (Amazon ECR) レジストリからマニフェストをダウンロードするには、次のコマンドを実行します。
kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-VERSION" > public-ecr-driver.yaml注: VERSION をリリースバージョンの番号に置き換えてください。最新のリリースバージョンを使用することをおすすめします。アクティブなブランチのリストについては、GitHub のウェブサイトで「ブランチ」を参照してください。Kustomize の代わりに Helm を使用してもドライバをインストールできます。手順については、GitHub のウェブサイトで「ドライバーのデプロイ」を参照してください。
-
ダウンロードしたファイルを編集し、次の行を削除します。
apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system
注: サービスアカウントをステップ 7 で作成したため、上記の行は不要です。
Amazon EFS CSI ドライバーをデプロイする
マニフェストを適用するには、次のコマンドを実行します。
kubectl apply -f public-ecr-driver.yaml
クラスターにノードが含まれておらず、AWS Fargate ポッドのみが含まれている場合は、次のコマンドを実行してドライバーをすべてのリージョンにデプロイします。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml
EFS ファイルシステムを作成する
次の手順を実行します。
- Amazon EKS クラスターの仮想プライベートクラウド (VPC) ID を取得するには、次の describe-cluster コマンドを実行します。
注: your_cluster_name を実際のクラスター名に置き換えてください。aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text - VPC クラスターの CIDR 範囲を取得するには、次の describe-vpcs コマンドを実行します。
注: YOUR_VPC_ID を VPC ID に置き換えてください。aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text - Amazon EFS マウントポイントへの、内向きネットワークファイルシステム (NFS) トラフィックを許可するセキュリティグループを作成するには、次の create-security-group コマンドを実行します。
注: YOUR_VPC_ID を VPC ID に置き換えてください。出力の GroupId 値を書き留めておきます。aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID - VPC 内のリソースを EFS ファイルシステムと通信できるようにするには、次の authorize-security-group-ingress コマンドを実行して NFS のインバウンドルールを追加します。
注: YOUR_VPC_CIDR を VPC の CIDR に、sg-abc をセキュリティグループ ID に置き換えてください。aws ec2 authorize-security-group-ingress --group-id sg-abc --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR - Amazon EKS クラスター用の EFS ファイルシステムを作成するには、次の create-file-system コマンドを実行します。
注: FileSystemId を書き留めてください。aws efs create-file-system --creation-token eks-efs - Amazon EFS のマウントターゲットを作成するには、次の create-mount-target コマンドを実行します。
注: FileSystemId を EFS ファイルシステム ID に、sg-abc をセキュリティグループ ID に、SubnetID をワーカーノードのサブネット ID に置き換えてください。ワーカーノードを実行するすべてのアベイラビリティーゾーンで上記のコマンドを実行することが推奨されます。そうすることで、アベイラビリティーゾーン内のすべての Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでファイルシステムを使用できます。複数のサブネットにマウントターゲットを作成するには、各サブネット ID に対してコマンドを実行します。aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-abc
Amazon EFS CSI ドライバーをテストする
同じファイルに書き込む 2 つのポッドをデプロイする方法については、GitHub のウェブサイトで「Multiple Pods Read Write Many」を参照してください。
関連情報
クォータに関連するファイル操作エラーのトラブルシューティング
Amazon EFS CSI ドライバー (GitHub のウェブサイト)
Amazon EKS における、EBS ボリュームのマウントに関する問題をトラブルシューティングする方法を教えてください
Amazon EKS における、Amazon EFS ボリュームのマウントに関する問題をトラブルシューティングする方法を教えてください
- トピック
- Containers
- 言語
- 日本語

