PFCP チュートリアル: クラウドストレージのデータをクラスタに取り込む
このページでは、クラウドストレージにあるデータを PFCP に持ち込むための手順を解説します。
ここでは一例として、ユーザが管理する AWS S3 に保存されているデータを PFCP 上の Persistent Volume にコピーします。
事前準備
左カラム「クラスタに接続する」の手順を実行して下記を完了してください。
- PFCP ポータルにログインできている
- クラスタへの接続が構成できている
また、AWS アカウントと、データを同期させる対象の S3 バケットが必要です1。
パブリッククラウドと ID 連携を構成し、データをコピーする
AWS 側の設定
ここでは sr1-01 拠点を利用している場合の設定を説明します。他の拠点を利用している場合はドメイン名等を適宜読み替えてください。
-
アクセスしたい AWS アカウント内に OIDC プロバイダを作成します2。
- プロバイダー URL
- SR1-01 クラスタ:
https://token.sr1-01.kubernetes.pfcomputing.com
- SR1-01 クラスタ:
- 許可するオーディエンス:
sts.amazonaws.com
- プロバイダー URL
-
AWS へのアクセスに使用する IAM ロールを作成します。この IAM ロールは、ID 連携により Kubernetes ServiceAccount に紐づけて使用します。 ここでは
data-transfer-sr1-01
という IAM ロールを作成します。 -
ID 連携による紐づけを許可するために、IAM ロールを引き受けさせる Kubernetes ServiceAccount を指定して、以下のような信頼ポリシを構成します3。 ServiceAccount は、既存のものを指定するか、後ほど新たに作成します。ここでは
data-transfer-sa
という ServiceAccount を作成します。{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { // 前のステップで作成した oidc provider の ARN を指定します。 "Federated": "arn:aws:iam::{aws_account_id}:oidc-provider/token.sr1-01.kubernetes.pfcomputing.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { // このIAMロールを引き受けさせる Kubernetes ServiceAccount 名を指定します。 "token.sr1-01.kubernetes.pfcomputing.com:sub": "system:serviceaccount:<namespace>:data-transfer-sa" } } }] }
-
転送したいデータを含んだ S3 のバケットに、特定の IAM ロールからアクセス可能にするポリシを設定します4。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{aws_account_id}:role/data-transfer-sr1-01" }, "Action": [ "s3:ListBucket", "s3:GetObject", ], "Resource": [ "arn:aws:s3:::example-bucket", "arn:aws:s3:::example-bucket/*" ] } ] }
Kubernetes クラスタ側の操作
-
ServiceAccount を作成します。データコピーに利用する ServiceAccount の annotations に、S3 のバケットにアクセス可能な AWS IAM ロール
data-transfer-sr1-01
を指定します。apiVersion: v1 kind: ServiceAccount metadata: name: data-transfer-sa annotations: aws.id-federation.preferred.jp/role-arn: "arn:aws:iam::{aws_account_id}:role/data-transfer-sr1-01"
-
ID 連携が正常に動作していることを確認します。Pod を作成する際に、
spec.serviceAccountName
にこの ServiceAccount を指定します。 Pod には 1 時間が有効期限である AWS のセッショントークンが自動的に設定されます。有効期限が到来すると、AWS SDK は更新されたトークンを自動で読み込み直します。aws sts get-caller-identity
コマンドを実行し、セッショントークンが ServiceAccount に紐づいた AWS IAM Role へ AssumeRole できることを確認します。$ kubectl run --rm --overrides='{"spec":{"serviceAccountName": "data-transfer-sa"}}' id-federation-check --image=amazon/aws-cli -- sts get-caller-identity { "UserId": "***********************:botocore-session-1751604047", "Account": "{aws_account_id}", "Arn": "arn:aws:sts::{aws_account_id}:assumed-role/data-transfer-sr1-01/botocore-session-1751604047" }
-
データを格納するための永続ストレージ(Persistent Volume Claim、 PVC)を作成します5。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-transfer-pvc spec: resources: requests: storage: 10Gi storageClassName: standard-rwx-<組織名>
-
AWS CLI の
s3 sync
コマンドでデータをコピーする Job を作成します。 上記で作成した PVC をマウントし、template.spec.serviceAccountName
に、 AWS との ID 連携を有効にしたdata-transfer-sa
を指定します。<バケット名>
、<オブジェクト名>
は適切に変更してください。apiVersion: batch/v1 kind: Job metadata: name: data-transfer-job spec: template: spec: serviceAccountName: data-transfer-sa # ID 連携を構成した ServiceAccount を指定 containers: - name: transfer image: amazon/aws-cli command: ["aws"] args: ["s3", "sync", "s3://<バケット名>/<オブジェクト名>", "/mnt/data"] volumeMounts: - mountPath: "/mnt/data" name: my-volume volumes: - name: my-volume persistentVolumeClaim: claimName: data-transfer-pvc restartPolicy: OnFailure
kubectl logs job/data-transger-job
を実行し、コマンドが正常に終了していることを確認します。$ kubectl logs job/data-transger-job download: s3://<バケット名>/file1.txt to /mnt/data/file1.txt ... Completed 10 of 10 file(s), 100% done.
クリーンアップ
チュートリアルで作成したリソースをすべて削除します。
kubectl delete job/data-transfer-job
kubectl delete pvc/data-transfer-pvc
kubectl delete serviceaccount/data-transfer-sa
必要に応じて、 AWS 側のリソースも削除します。