オブジェクト ストレージを管理する

ストレージ バケットの命名ガイドライン

バケット名は次の命名規則に準拠する必要があります。

  • プロジェクト内で一意であること。プロジェクトはバケット名に一意の接頭辞を追加し、組織内で競合が発生しないようにします。組織間で接頭辞とバケット名が競合する可能性は低いですが、その場合はバケットの作成が失敗し、bucket name in use エラーが発生します。
  • 1 文字以上 57 文字以下で指定します。
  • 個人を特定できる情報(PII)は含めないでください。
  • DNS に準拠している。
  • 文字で始まり、文字、数字、ハイフンのみを含みます。

s3cmd ツール CLI をインストールする

s3cmd ツールは、オブジェクト ストレージを管理するためのコマンドライン ツールです。

  1. ツールをダウンロードするには、GDC バンドルが抽出されたディレクトリに移動します。
  2. 次のコマンドを実行して、s3cmd イメージ s3cmd.tar.tar.gz を空の一時ディレクトリに抽出します。

    tmpdir=$(mktemp -d)
    
    gdcloud artifacts extract oci/ $tmpdir \
      --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
    
  3. scp tar ファイルを、オブジェクト オペレーションに s3cmd を使用するクライアント マシンにコピーし、イメージを解凍してインストールします。

次のいずれかのインストール方法を選択して、s3cmd ツールをインストールします。

tar ファイルからインストールする

  1. アーカイブを解凍して s3cmd パッケージをインストールするには、次のコマンドを実行します。パッケージをインストールするには、Python distutils モジュールが必要です。このモジュールは、多くの場合、コア Python パッケージの一部です。パッケージ マネージャーを使用してインストールすることもできます。

    tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    cd /tmp/gpc-system-tar-files/s3cmd
    sudo python3 setup.py install
    
  2. 省略可: ダウンロードしたファイルをクリーンアップします。

    rm /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    rm -r /tmp/gpc-system-tar-files/s3cmd
    

Docker イメージを使用してインストールする

  1. s3cmd イメージをインストールするには、次のコマンドを実行します。

    docker load --input s3cmd-docker.tar
    export S3CFG=/EMPTY_FOLDER_PATH/
    alias s3cmd="docker run -it --net=host --mount=type=bind,source=/$S3CFG/,target=/g/
    s3cmd-docker:latest -c /g/s3cfg"
    
  2. 省略可: ダウンロードしたファイルをクリーンアップします。

    rm s3cmd-docker.tar
    
  3. クライアントの再起動後も保持されるように、エクスポートとエイリアスを .bashrc ファイルに追加します。

s3cmd ツールを構成する

オブジェクト ベースのオペレーションには s3cmd ツールを使用します。

s3cmd --configure コマンドを実行し、次の項目を指定します。

  1. アクセスキー: アクセス認証情報の取得でシークレットから取得したアクセスキーを入力します。
  2. シークレット キー: アクセス認証情報の取得で取得したシークレットからシークレット キーを入力します。
  3. デフォルトの地域: ENTER を押します。
  4. S3 エンドポイント: インフラストラクチャ オペレーター(IO)が提供するエンドポイントを入力します。
  5. DNS スタイルのバケット名の場合は、「s3://%(bucket)」と入力します。
  6. (省略可)転送中のファイルを保護するための暗号化パスワードを入力します。
  7. [Path to GPG] に「/usr/bin/gpg」と入力します。
  8. HTTPS プロトコルを使用するには、Yes と入力します。
  9. Enter キーを押して、プロキシ サーバー名の入力をスキップします。

ストレージ バケットの作成

始める前に

プロジェクト Namespace は、ルート管理クラスタ内のバケット リソースを管理します。バケットを作成するには、プロジェクトが必要です。新しいプロジェクトを作成するには、プロジェクトを作成するをご覧ください。次のオペレーションを行うには、適切なバケット権限が必要です。バケット アクセス権の付与をご覧ください。

バケットの作成

バケットを作成するには、バケット仕様をプロジェクトの Namespace に適用します。

    kubectl apply -f bucket.yaml

バケット仕様の例を次に示します。

    apiVersion: object.gdc.goog/v1alpha1
    kind: Bucket
    metadata:
      name: BUCKET_NAME
      namespace: NAMESPACE_NAME
    spec:
      description: DESCRIPTION
      storageClass: standard-rwo
      bucketPolicy :
        lockingPolicy :
          defaultObjectRetentionDays: RETENTION_DAY_COUNT

詳細については、バケット API リファレンスをご覧ください。

ストレージ バケットを一覧表示する

特定のオブジェクト ストレージ テナントでアクセス可能なすべてのバケットを一覧表示する手順は次のとおりです。

  1. 次のコマンドを実行して、すべてのバケットを一覧表示します。

    kubectl get buckets --all-namespaces
    kubectl get buckets --namespace NAMESPACE_NAME
    

ストレージ バケットの削除

ストレージ バケットは CLI を使用して削除できます。バケットを削除するには、最初にバケットを空にする必要があります。

  1. [バケット構成を表示] セクションの GET コマンドまたは DESCRIBE コマンドを使用して、バケットの完全修飾名を取得します。

  2. バケットが空でない場合は、バケットを空にします。

    s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
    
  3. 空のバケットを削除します。

    kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    

バケット構成を表示する

次のいずれかのコマンドを使用して、バケットの構成の詳細を表示します。

    kubectl describe buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    kubectl get buckets/BUCKET_NAME --namespace NAMESPACE_NAME -o yaml

オブジェクトの保持期間を設定する

デフォルトでは、オブジェクトはいつでも削除できます。保持期間を指定してオブジェクト ロックを有効にすると、バケット内のすべてのオブジェクトが指定された日数削除されなくなります。保持期間後にすべてのオブジェクトを削除するまで、バケットを削除することはできません。

バケットの作成時にオブジェクト ロックを有効にする必要があります。バケットの作成後にオブジェクト ロックを有効または無効にすることはできません。ただし、デフォルトのオブジェクト保持期間は変更できます。

オブジェクト ロックを有効にするかどうかに関係なく、バケットを作成できます。オブジェクト ロックを有効にしている場合、デフォルトの保持期間の指定は省略可能です。

保持期間を変更するには、バケット リソースBucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays フィールドを更新します。

次に、バケット リソースのフィールドを更新する例を示します。

apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This bucket has a default retention period specified."
  storageClass: standard-rwo
  bucketPolicy :
    lockingPolicy :
      defaultObjectRetentionDays: RETENTION_DAY_COUNT
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This would enable object locking but not specify a default retention period."
  storageClass: standard-rwo
  bucketPolicy :
    lockingPolicy :
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This bucket does not have locking or retention enabled."
  storageClass: standard-rwo

保持期間の更新は、更新後にバケットに作成されたオブジェクトに適用されます。既存のオブジェクトの場合、保持期間は変更されません。

オブジェクトのロックを有効にしている場合、オブジェクトを上書きしようとすると、オブジェクトの新しいバージョンが追加されます。両方のオブジェクト バージョンを取得できます。オブジェクト バージョンを一覧表示する方法の詳細については、Amazon Web Services ドキュメントの ListObjectVersionshttps://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html)をご覧ください。

WORM(1 回限りの書き込みと複数回の読み取り)バケットを作成するには、WORM バケットのセクションをご覧ください。

バケットへのアクセス権を付与する

事前定義ロールで RoleBindings を作成して適用することで、他のユーザーまたはサービス アカウントにバケット アクセス権を付与できます。

事前定義ロール

  • project-bucket-object-viewer: このロールにより、ユーザーはプロジェクト内のすべてのバケットを一覧表示し、それらのバケット内のオブジェクトを一覧表示し、オブジェクトとオブジェクトのメタデータを読み取ることができます。このロールでは、アップロード、上書き、削除などのオブジェクトに対する書き込みオペレーションは実行できません。

  • project-bucket-object-admin: このロールにより、ユーザーはプロジェクト内のすべてのバケットを一覧表示し、オブジェクトに対する書き込みオペレーションと読み取りオペレーション(アップロード、上書き、削除など)を実行できます。

  • project-bucket-admin: このロールを使用すると、ユーザーは指定された Namespace 内のすべてのバケットと、それらのバケット内のすべてのオブジェクトを管理できます。

これらのロールに付与される権限の完全なリストについては、プリセット ロールの権限をご覧ください。

プロジェクト ロール バインディングの作成に必要な権限を取得するには、プロジェクト IAM 管理者にプロジェクト IAM 管理者(project-iam-admin)ロールの付与を依頼します。

次の例は、ユーザーとサービス アカウントにアクセス権を付与する RoleBinding の作成例です。

  1. システムに YAML ファイル(rolebinding-object-admin-all-buckets.yaml など)を作成します。

     apiVersion: rbac.authorization.k8s.io/v1
     kind: RoleBinding
     metadata:
       namespace: NAMESPACE_NAME
       name: readwrite-all-buckets
     roleRef:
       kind: Role
       name: project-bucket-object-admin
       apiGroup: rbac.authorization.k8s.io
     subjects:
     - kind: ServiceAccount
       namespace: NAMESPACE_NAME
       name: SA_NAME
     - kind: User
       namespace: NAMESPACE_NAME
       name: bob@example.com  # Could be bob or bob@example.com based on your organization settings.
       apiGroup: rbac.authorization.k8s.io
     ```
    
  2. YAML ファイルを適用します。

    kubectl apply \
    -f rolebinding-object-admin-all-buckets.yaml
    

バケットのアクセス認証情報を取得する

バケットへのアクセス権を付与すると、アクセス認証情報が Secret に作成されます。

シークレット名の形式は object-storage-key-SUBJECT_TYPE-SUBJECT_HASH です。

  • SUBJECT_TYPE の値は次のとおりです。
    • user: ユーザー。
    • sa: ServiceAccount
  • SUBJECT_HASH は、サブジェクト名の base32 でエンコードされた SHA256 ハッシュです。

たとえば、ユーザー bob@foo.com には次の名前の Secret があります。

object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

ユーザー シークレットにアクセスする

ユーザー サブジェクトの場合、Secret はルート管理クラスタの object-storage-access-keys Namespace にあります。

  1. シークレット名を確認します。

    kubectl auth can-i --list --namespace object-storage-access-keys | grep object-storage-key-
    

    次のような出力が表示されます。

    secrets        []        [object-storage-key-nl-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. 対応する Secret の内容を取得して、バケットにアクセスします。

    kubectl get -o yaml --namespace object-storage-access-keys secret
    object-storage-key-rm-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
    

    次のような出力が表示されます。

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. アクセスキー ID とシークレットをデコードします。

    echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \
        && echo \
        && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
    

    次のような出力が表示されます。

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. 結果の情報を使用して、s3cmd を構成するセクションの手順に沿って操作します。

サービス アカウントのシークレットにアクセスする

サービス アカウント(SA)サブジェクトの場合、Secret はバケットと同じ Namespace にあります。名前を確認するには、次のコマンドを実行します。

  kubectl get --namespace NAMESPACE_NAME secrets -o=jsonpath=
  '{.items[?(@.metadata.annotations.object\.gdc\.goog/subject=="SA_NAME")].metadata.name}'

次のような出力が表示されます。

  object-storage-key-rm-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Pod で Secret を環境変数(https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables)またはファイル(https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod)として参照できます。

プリセット ロールの権限

project-bucket-object-viewer 権限

このロールは、バケット内のオブジェクトとオブジェクトのメタデータを取得して一覧表示する権限を付与します。

project-bucket-object-viewer ロールには次の権限が付与されています。

  • バケットの API 権限:

    1. 取得
    2. リスト
    3. モニタリング
  • S3 オブジェクト ストレージの権限:

    1. GetObject
    2. GetObjectAcl
    3. GetObjectVersion
    4. ListBucket
    5. ListBucketVersions
    6. ListBucketMultipartUploads
    7. ListMultipartUploadParts

project-bucket-object-admin 権限

このロールは、バケット内のオブジェクト、オブジェクト バージョン、タグの追加と削除を行う権限を付与します。また、project-bucket-object-viewer のすべての権限も付与します。

project-bucket-object-admin ロールには、次のオブジェクト ストレージ権限が付与されています。

  • S3 オブジェクト ストレージの権限:

    1. AbortMultipartUpload
    2. DeleteObject
    3. DeleteObjectVersion
    4. PutObject
    5. RestoreObject

project-bucket-admin 権限

このロールは、プロジェクトの名前空間で Bucket リソースを作成、更新、削除する権限を付与します。また、project-bucket-object-admin のすべての権限も付与します。

project-bucket-object-admin ロールには次の権限が付与されています。

  • バケットの API 権限:

    1. 作成
    2. 更新
    3. 削除

WORM バケットを作成する

WORM バケットでは、オブジェクトが上書きされることはなく、最小期間保持されます。監査ロギングは、WORM バケットのユースケースの一例です。

WORM バケットを作成する手順は次のとおりです。

  1. バケットの作成時に保持期間を設定します。たとえば、次のバケットの保持期間は 365 日間です。

    apiVersion: object.gdc.goog/v1alpha1
    kind: Bucket
    metadata:
      name: foo logging-bucket
      namespace: foo-service
    spec:
      description: "Audit logs for foo"
      storageClass: standard-rwo
      bucketPolicy :
        lockingPolicy :
          defaultObjectRetentionDays: 365
    
  2. 読み取り専用アクセスが必要なすべてのユーザーに project-bucket-object-viewer ロールを付与します。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: foo-service
      name: object-readonly-access
    roleRef:
      kind: Role
      name: project-bucket-object-viewer
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: foo-service
      name: foo-log-processor
    - kind: User
      name: bob@example.com
      apiGroup: rbac.authorization.k8s.io
    
  3. バケットにコンテンツを書き込む必要があるユーザーに project-bucket-object-admin ロールを付与します。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: foo-service
      name: object-write-access
    roleRef:
      kind: Role
      name: project-bucket-object-viewer
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: foo-service
      name: foo-service-account
    

オブジェクト ストレージからブロック ストレージのファイル システムに復元する

永続ボリュームを割り当てる

オブジェクト ストレージ エンドポイントからファイルを復元する手順は次のとおりです。

  1. 復元でターゲットに永続ボリューム(PV)を割り当てます。次の例に示すように、永続ボリューム クレーム(PVC)を使用してボリュームを割り当てます。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restore-pvc
      namespace: restore-ns
    spec:
      storageClassName: standard-rwo
      accessModes:
    ReadWriteOnce
      resources:
        requests:
          storage: 1Gi # Need sufficient capacity for full restoration.
    
  2. PVC のステータスを確認します。

    kubectl get pvc restore-pvc -n restore-ns
    

    PVC が Bound 状態になると、再水和する Pod 内で使用できるようになります。

  3. Stateful セットが最終的に PV を使用する場合は、レンダリングされた StatefulSet PVC を一致させる必要があります。StatefulSet が生成する Pod は、ハイドレートされたボリュームを使用します。次の例は、ss という名前の StatefulSet のボリューム クレーム テンプレートを示しています。

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: standard-rwo
          resources:
            requests:
              storage: 1Gi
    
  4. ss-pvc-name-0ss-pvc-name-1 などの名前で PVC を事前割り当てて、結果の Pod が事前割り当てされたボリュームを使用するようにします。

Persistent Volume(PV)をハイドレートする

PVC が PV にバインドされたら、Job を起動して PV にデータを入力します。

apiVersion: batch/v1
kind: Job
metadata:
  name: transfer-job
  namespace: transfer
spec:
  template:
    spec:
      serviceAccountName: data-transfer-sa
      volumes:
      - name: data-transfer-restore-volume
        persistentVolumeClaim:
          claimName: restore-pvc
      containers:
      - name: storage-transfer-pod
        image: gcr.io/private-cloud-staging/storage-transfer:latest
        command: /storage-transfer
        args:
        - --src_endpoint=https://your-src-endpoint.com
        - --src_path=/your-src-bucket
        - --src_credentials=transfer/src-secret
        - --dst_path=/restore-pv-mnt-path
        - --src_type=s3
        - --dst_type=local
      volumeMounts:
      - mountPath: /restore-pv-mnt-path
        name: data-transfer-restore-volume

Job の実行が完了すると、オブジェクト ストレージ バケットのデータがボリュームに格納されます。別の Pod は、ボリュームのマウントと同じ標準メカニズムを使用してデータを消費できます。