Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PFCP チュートリアル: クラウドストレージのデータをクラスタに取り込む

このページでは、クラウドストレージにあるデータを PFCP に持ち込むための手順を解説します。

ここでは一例として、ユーザが管理する AWS S3 に保存されているデータを PFCP 上の Persistent Volume にコピーします。

事前準備

左カラム「クラスタに接続する」の手順を実行して下記を完了してください。

  1. PFCP ポータルにログインできている
  2. クラスタへの接続が構成できている

また、AWS アカウントと、データを同期させる対象の S3 バケットが必要です1

パブリッククラウドと ID 連携を構成し、データをコピーする

AWS 側の設定

ここでは sr1-01 拠点を利用している場合の設定を説明します。他の拠点を利用している場合はドメイン名等を適宜読み替えてください。

  1. アクセスしたい AWS アカウント内に OIDC プロバイダを作成します2

    • プロバイダー URL
      • SR1-01 クラスタ: https://token.sr1-01.kubernetes.pfcomputing.com
    • 許可するオーディエンス: sts.amazonaws.com
  2. AWS へのアクセスに使用する IAM ロールを作成します。この IAM ロールは、ID 連携により Kubernetes ServiceAccount に紐づけて使用します。 ここでは data-transfer-sr1-01 という IAM ロールを作成します。

  3. 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"
                }
            }
        }]
    }
    
  4. 転送したいデータを含んだ 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 クラスタ側の操作

  1. 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"
    
  2. 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"
      }
    
  3. データを格納するための永続ストレージ(Persistent Volume Claim、 PVC)を作成します5

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: data-transfer-pvc
    spec:
      resources:
        requests:
          storage: 10Gi
      storageClassName: standard-rwx-<組織名>
    
  4. 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 側のリソースも削除します。


  1. Amazon S3 の開始方法

  2. IAM で OpenID Connect (OIDC) ID プロバイダーを作成する - AWS Identity and Access Management

  3. OpenID Connect フェデレーション用のロールを作成する

  4. Amazon S3 のポリシーとアクセス許可

  5. ファイルストレージを使用する