ストレージ バケットの命名ガイドライン
バケット名は次の命名規則に準拠する必要があります。
- プロジェクト内で一意であること。プロジェクトはバケット名に一意の接頭辞を追加し、組織内で競合が発生しないようにします。組織間で接頭辞とバケット名が競合する可能性は低いですが、その場合はバケットの作成が失敗し、
bucket name in use
エラーが発生します。 - 1 文字以上 57 文字以下で指定します。
- 個人を特定できる情報(PII)は含めないでください。
- DNS に準拠している。
- 文字で始まり、文字、数字、ハイフンのみを含みます。
s3cmd ツール CLI をインストールする
s3cmd
ツールは、オブジェクト ストレージを管理するためのコマンドライン ツールです。
- ツールをダウンロードするには、GDC バンドルが抽出されたディレクトリに移動します。
次のコマンドを実行して、s3cmd イメージ
s3cmd.tar.tar.gz
を空の一時ディレクトリに抽出します。tmpdir=$(mktemp -d) gdcloud artifacts extract oci/ $tmpdir \ --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
scp
tar ファイルを、オブジェクト オペレーションにs3cmd
を使用するクライアント マシンにコピーし、イメージを解凍してインストールします。
次のいずれかのインストール方法を選択して、s3cmd
ツールをインストールします。
tar ファイルからインストールする
アーカイブを解凍して
s3cmd
パッケージをインストールするには、次のコマンドを実行します。パッケージをインストールするには、Pythondistutils
モジュールが必要です。このモジュールは、多くの場合、コア Python パッケージの一部です。パッケージ マネージャーを使用してインストールすることもできます。tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz cd /tmp/gpc-system-tar-files/s3cmd sudo python3 setup.py install
省略可: ダウンロードしたファイルをクリーンアップします。
rm /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz rm -r /tmp/gpc-system-tar-files/s3cmd
Docker イメージを使用してインストールする
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"
省略可: ダウンロードしたファイルをクリーンアップします。
rm s3cmd-docker.tar
クライアントの再起動後も保持されるように、エクスポートとエイリアスを
.bashrc
ファイルに追加します。
s3cmd ツールを構成する
オブジェクト ベースのオペレーションには s3cmd ツールを使用します。
s3cmd --configure
コマンドを実行し、次の項目を指定します。
- アクセスキー: アクセス認証情報の取得でシークレットから取得したアクセスキーを入力します。
- シークレット キー: アクセス認証情報の取得で取得したシークレットからシークレット キーを入力します。
- デフォルトの地域:
ENTER
を押します。 - S3 エンドポイント: インフラストラクチャ オペレーター(IO)が提供するエンドポイントを入力します。
- DNS スタイルのバケット名の場合は、「
s3://%(bucket)
」と入力します。 - (省略可)転送中のファイルを保護するための暗号化パスワードを入力します。
- [Path to GPG] に「
/usr/bin/gpg
」と入力します。 - HTTPS プロトコルを使用するには、
Yes
と入力します。 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 リファレンスをご覧ください。
ストレージ バケットを一覧表示する
特定のオブジェクト ストレージ テナントでアクセス可能なすべてのバケットを一覧表示する手順は次のとおりです。
次のコマンドを実行して、すべてのバケットを一覧表示します。
kubectl get buckets --all-namespaces kubectl get buckets --namespace NAMESPACE_NAME
ストレージ バケットの削除
ストレージ バケットは CLI を使用して削除できます。バケットを削除するには、最初にバケットを空にする必要があります。
[バケット構成を表示] セクションの
GET
コマンドまたはDESCRIBE
コマンドを使用して、バケットの完全修飾名を取得します。バケットが空でない場合は、バケットを空にします。
s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
空のバケットを削除します。
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 ドキュメントの ListObjectVersions
(https://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
の作成例です。
システムに 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 ```
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 にあります。
シークレット名を確認します。
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]
対応する 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==
アクセスキー ID とシークレットをデコードします。
echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \ && echo \ && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
次のような出力が表示されます。
0HX3O0YC2J722EJLPJEO Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
結果の情報を使用して、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 権限:
- 取得
- リスト
- モニタリング
S3 オブジェクト ストレージの権限:
GetObject
GetObjectAcl
GetObjectVersion
ListBucket
ListBucketVersions
ListBucketMultipartUploads
ListMultipartUploadParts
project-bucket-object-admin 権限
このロールは、バケット内のオブジェクト、オブジェクト バージョン、タグの追加と削除を行う権限を付与します。また、project-bucket-object-viewer
のすべての権限も付与します。
project-bucket-object-admin
ロールには、次のオブジェクト ストレージ権限が付与されています。
S3 オブジェクト ストレージの権限:
AbortMultipartUpload
DeleteObject
DeleteObjectVersion
PutObject
RestoreObject
project-bucket-admin 権限
このロールは、プロジェクトの名前空間で Bucket
リソースを作成、更新、削除する権限を付与します。また、project-bucket-object-admin
のすべての権限も付与します。
project-bucket-object-admin
ロールには次の権限が付与されています。
バケットの API 権限:
- 作成
- 更新
- 削除
WORM バケットを作成する
WORM バケットでは、オブジェクトが上書きされることはなく、最小期間保持されます。監査ロギングは、WORM バケットのユースケースの一例です。
WORM バケットを作成する手順は次のとおりです。
バケットの作成時に保持期間を設定します。たとえば、次のバケットの保持期間は 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
読み取り専用アクセスが必要なすべてのユーザーに
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
バケットにコンテンツを書き込む必要があるユーザーに
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
オブジェクト ストレージからブロック ストレージのファイル システムに復元する
永続ボリュームを割り当てる
オブジェクト ストレージ エンドポイントからファイルを復元する手順は次のとおりです。
復元でターゲットに永続ボリューム(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.
PVC のステータスを確認します。
kubectl get pvc restore-pvc -n restore-ns
PVC が
Bound
状態になると、再水和する Pod 内で使用できるようになります。Stateful
セットが最終的に PV を使用する場合は、レンダリングされた StatefulSet PVC を一致させる必要があります。StatefulSet
が生成する Pod は、ハイドレートされたボリュームを使用します。次の例は、ss
という名前の StatefulSet のボリューム クレーム テンプレートを示しています。volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: standard-rwo resources: requests: storage: 1Gi
ss-pvc-name-0
やss-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 は、ボリュームのマウントと同じ標準メカニズムを使用してデータを消費できます。