バックアップと復元の監査ログを作成する

このページでは、バックアップを作成するために必要なコンポーネントをインストールして構成する手順について説明します。また、バックアップから過去の監査ログへのアクセスを復元して復旧する方法についても説明します。

リモート バケットにバックアップを設定する

このセクションでは、S3 互換バケットに監査ログのバックアップを作成する手順について説明します。

始める前に

監査ログのバックアップを作成するには、次のリソースにアクセスできる必要があります。

  • エンドポイント、シークレット アクセスキー、アクセスキー ID を持つリモート S3 バケット。
  • ストレージ システムの認証局(CA)証明書。
  • 動作中のクラスタ。

ソースバケットにアクセスするための認証情報を取得する

次の手順に沿って、監査ログを含むバケットの認証情報を確認します。

  1. ルート管理クラスタで、プロジェクトの名前空間にあるバケットを一覧表示します。

    kubectl get bucket -n PROJECT_NAMESPACE
    

    出力は次の例のようになります。監査ロギング バケットに名前とエンドポイントが表示されます。

    NAME                          BUCKET NAME                   DESCRIPTION                                                         STORAGE CLASS   FULLY-QUALIFIED-BUCKET-NAME         ENDPOINT                                       REGION   BUCKETREADY   REASON                    MESSAGE
    audit-logs-loki-all           audit-logs-loki-all           Bucket for storing audit-logs-loki-all logs                         Standard        wwq2y-audit-logs-loki-all           https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    cortex-metrics-alertmanager   cortex-metrics-alertmanager   storage bucket for cortex metrics alertmanager configuration data   Standard        wwq2y-cortex-metrics-alertmanager   https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    cortex-metrics-blocks         cortex-metrics-blocks         storage bucket for cortex metrics data                              Standard        wwq2y-cortex-metrics-blocks         https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    cortex-metrics-ruler          cortex-metrics-ruler          storage bucket for cortex metrics rules data                        Standard        wwq2y-cortex-metrics-ruler          https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    ops-logs-loki-all             ops-logs-loki-all             Bucket for storing ops-logs-loki-all logs                           Standard        wwq2y-ops-logs-loki-all             https://appliance-objectstorage.zone1.google.gdch.test```
    
  2. 取得した出力の情報を使用して、転送用に次の環境変数を設定します。

    SRC_BUCKET= BUCKET_NAME
    SRC_ENDPOINT = ENDPOINT
    SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
    

    次のように置き換えます。

    • BUCKET_NAME: バックアップを作成する監査ログを含むバケットの名前。この値は、出力の BUCKET NAME フィールドにあります。
    • ENDPOINT: バックアップを作成する監査ログを含むバケットのエンドポイント。この値は、出力の ENDPOINT フィールドにあります。
    • FULLY_QUALIFIED_BUCKET_NAME: バックアップを作成する監査ログを含むバケットの完全修飾名。この値は、出力の FULLY-QUALIFIED-BUCKET-NAME フィールドにあります。
  3. 前の手順で選択したバケットのシークレットを取得します。

    kubectl get secret -n PROJECT_NAMESPACE -o json| jq --arg jq_src $SRC_BUCKET '.items[].metadata|select(.annotations."object.gdc.goog/subject"==$jq_src)|.name'
    

    出力は次の例のようになります。ここで、バケットのシークレット名が表示されます。

    "object-storage-key-sysstd-sa-olxv4dnwrwul4bshu37ikebgovrnvl773owaw3arx225rfi56swa"
    
  4. 取得した出力のシークレット名を使用して、次の環境変数を設定します。

    SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
    

    SECRET_NAME は、前の出力で取得したシークレット名に置き換えます。

  5. ストレージ システムの CA 証明書の Secret を作成します。

    kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \
    --from-literal=ca.crt=CERTIFICATE
    

    CERTIFICATE は、ストレージ システムの CA 証明書に置き換えます。

  6. 次の環境変数を設定します。

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

リモート バケットにアクセスするための認証情報を取得する

バックアップを作成するバケットの認証情報を確認する手順は次のとおりです。

  1. 次の環境変数を設定します。

    DST_ACCESS_KEY_ID= ACCESS_KEY
    DST_SECRET_ACCESS_KEY= ACCESS_SECRET
    DST_ENDPOINT= REMOTE_ENDPOINT
    DST_PATH= REMOTE_BUCKET_NAME
    

    次のように置き換えます。

    • ACCESS_KEY: 宛先リモート バケットのアクセスキー。
    • ACCESS_SECRET: 宛先リモート バケットのアクセス シークレット。
    • REMOTE_ENDPOINT: 宛先リモート バケットのエンドポイント。
    • REMOTE_BUCKET_NAME: コピー先のリモート バケットの名前。
  2. リモート バケットの Secret を作成します。

    kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-credentials \
      --from-literal=access-key-id=$DST_ACCESS_KEY_ID \
      --from-literal=secret-access-key=$DST_SECRET_ACCESS_KEY
    
  3. シークレットの場所を使用して、次の環境変数を設定します。

    DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
    
  4. 宛先バケットで CA 証明書の設定が必要な場合は、バケットの CA 証明書を使用してシークレットを作成します。

    kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \
    --from-literal=ca.crt=REMOTE_CERTIFICATE
    

    REMOTE_CERTIFICATE は、宛先リモート バケットの CA 証明書に置き換えます。

  5. 証明書の場所を使用して、次の環境変数を設定します。

    DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
    

監査ログの転送を設定する

次の手順に沿って、バックアップ用に監査ログをソースバケットから宛先バケットに転送するように構成します。

  1. 監査ログ転送ジョブのサービス アカウントを作成します。プロジェクト Namespace のソースバケットとシークレットを読み取るために、サービス アカウントへのアクセス権を付与する必要があります。

    kubectl apply -f - <<EOF
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: audit-log-transfer-sa
      namespace: PROJECT_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: read-secrets-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-secrets-rolebinding
      namespace: PROJECT_NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: audit-log-transfer-sa
      namespace: PROJECT_NAMESPACE
    roleRef:
      kind: Role
      name: read-secrets-role
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: audit-log-read-bucket-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups:
      - object.gdc.goog
      resourceNames:
      - $SRC_BUCKET # Source bucket name
      resources:
      - buckets
      verbs:
      - read-object
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: audit-log-transfer-role-binding
      namespace: PROJECT_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: audit-log-read-bucket-role
    subjects:
    - kind: ServiceAccount
      name: audit-log-transfer-sa
      namespace: PROJECT_NAMESPACE
    ---
    EOF
    
  2. ログをリモート バケットにエクスポートする転送ジョブを作成します。

    kubectl apply -f - <<EOF
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: audit-log-transfer-job
      namespace: PROJECT_NAMESPACE
    spec:
      template:
        spec:
          serviceAccountName: audit-log-transfer-sa
          containers:
            - name: storage-transfer-pod
              image: gcr.io/private-cloud-staging/storage-transfer:latest
              imagePullPolicy: Always
              command:
                - /storage-transfer
              args:
                - '--src_endpoint=$SRC_ENDPOINT
                - '--dst_endpoint=$DST_ENDPOINT
                - '--src_path=\$SRC_PATH
                - '--dst_path=\$DST_PATH
                - '--src_credentials=$SRC_CREDENTIALS
                - '--dst_credentials=$DST_CREDENTIALS
                - '--dst_ca_certificate_reference=$DST_CA_CERTIFICATE # Optional. Based on destination type.
                - '--src_ca_certificate_reference=$SRC_CA_CERTIFICATE
                - '--src_type=s3'
                - '--dst_type=s3'
                - '--bandwidth_limit=100M' # Optional of the form '10K', '100M', '1G' bytes per second
          restartPolicy: OnFailure # Will restart on failure.
    ---
    EOF
    

ジョブのスケジュールを設定したら、ジョブ名を audit-log-transfer-job として、プロジェクト Namespace を指定して、データ転送をモニタリングできます。

すべてのデータが宛先バケットに転送されると、ジョブは終了します。

バックアップから監査ログを復元する

このセクションでは、バックアップから監査ログを復元する手順について説明します。

始める前に

監査ログを復元するには、次のリソースへのアクセス権が必要です。

  • エンドポイント、シークレット アクセスキー、アクセスキー ID を含む監査ログ バックアップ バケット。
  • ストレージ システムの認証局(CA)証明書。
  • 動作中のクラスタ。

監査ログを復元するバケットを作成する

次の手順に沿って、復元された監査ログを保存するバケットを作成します。

  1. バケット リソースとサービス アカウントを作成します。

    kubectl apply -f - <<EOF
    ---
    apiVersion: object.gdc.goog/v1
    kind: Bucket
    metadata:
      annotations:
        object.gdc.goog/audit-logs: IO
      labels:
        logging.private.gdch.goog/loggingpipeline-name: default
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    spec:
      bucketPolicy:
        lockingPolicy:
          defaultObjectRetentionDays: 1
      description: Bucket for storing audit-logs-loki logs restore
      storageClass: Standard
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: audit-logs-loki-restore-buckets-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups:
      - object.gdc.goog
      resourceNames:
      - audit-logs-loki-restore
      resources:
      - buckets
      verbs:
      - read-object
      - write-object
    ---
    apiVersion: v1
    automountServiceAccountToken: false
    kind: ServiceAccount
    metadata:
      labels:
        logging.private.gdch.goog/loggingpipeline-name: default
      name: audit-logs-loki-restore-sa
      namespace: PROJECT_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: audit-logs-loki-restore-buckets-role
    subjects:
    - kind: ServiceAccount
      name: audit-logs-loki-restore-sa
      namespace: PROJECT_NAMESPACE
    EOF
    

    バケットとシークレットが作成されます。

  2. 作成したバケットを表示します。

    kubectl get bucket audit-logs-loki-restore -n PROJECT_NAMESPACE
    

    出力は次の例のようになります。バケットの作成には数分かかることがあります。

    NAME                      BUCKET NAME               DESCRIPTION                                       STORAGE CLASS   FULLY-QUALIFIED-BUCKET-NAME     ENDPOINT                                       REGION   BUCKETREADY   REASON                    MESSAGE
    audit-logs-loki-restore   audit-logs-loki-restore   Bucket for storing audit-logs-loki logs restore   Standard        dzbl6-audit-logs-loki-restore   https://objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    

    出力には、作成したバケットが表示されます。バケットの作成には数分かかることがあります。

  3. 取得した出力の情報を使用して、次の環境変数を設定します。

    DST_BUCKET= RESTORE_BUCKET_NAME
    DST_ENDPOINT = RESTORE_ENDPOINT
    DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
    

    次のように置き換えます。

    • RESTORE_BUCKET_NAME: 監査ログの復元に使用するバケットの名前。この値は、出力の BUCKET NAME フィールドにあります。
    • RESTORE_ENDPOINT: 監査ログの復元に使用するバケットのエンドポイント。この値は、出力の ENDPOINT フィールドにあります。
    • RESTORE_FULLY_QUALIFIED_BUCKET_NAME: 監査ログの復元に使用するバケットの完全修飾名。この値は、出力の FULLY-QUALIFIED-BUCKET-NAME フィールドにあります。
  4. 作成したバケットのシークレットを取得します。

    kubectl get secret -n PROJECT_NAMESPACE -o json| jq --arg jq_src $DST_BUCKET '.items[].metadata|select(.annotations."object.gdc.goog/subject"==$jq_src)|.name'
    

    出力は次の例のようになります。ここで、バケットのシークレット名が表示されます。

    "object-storage-key-sysstd-sa-olxv4dnwrwul4bshu37ikebgovrnvl773owaw3arx225rfi56swa"
    
  5. 取得した出力のシークレット名を使用して、次の環境変数を設定します。

    DST_SECRET_NAME=RESTORE_SECRET_NAME
    DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
    

    RESTORE_SECRET_NAME は、前の出力で取得したシークレット名に置き換えます。

  6. ストレージ システムの CA 証明書の Secret を作成します。

    kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \
    --from-literal=ca.crt=CERTIFICATE
    

    CERTIFICATE は、ストレージ システムの CA 証明書に置き換えます。

  7. 証明書の場所の環境変数を設定します。

    DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
    

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

次の手順に沿って、監査ログのバックアップを含むバケットの認証情報を確認します。

  1. 次の環境変数を設定します。

    SRC_ACCESS_KEY_ID= ACCESS_KEY
    SRC_SECRET_ACCESS_KEY= ACCESS_SECRET
    SRC_ENDPOINT= REMOTE_ENDPOINT
    SRC_PATH= REMOTE_BUCKET_NAME
    

    次のように置き換えます。

    • ACCESS_KEY: バックアップ バケットのアクセスキー。
    • ACCESS_SECRET: バックアップ バケットのアクセス シークレット。
    • REMOTE_ENDPOINT: バックアップ バケットのエンドポイント。
    • REMOTE_BUCKET_NAME: バックアップ バケットの名前。
  2. バックアップ バケットの Secret を作成します。

    kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-credentials \
      --from-literal=access-key-id=$SRC_ACCESS_KEY_ID \
      --from-literal=secret-access-key=$SRC_SECRET_ACCESS_KEY
    
  3. シークレットの場所を使用して、次の環境変数を設定します。

    SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
    
  4. バケットの CA 証明書を使用してシークレットを作成します。

    kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \
    --from-literal=ca.crt=BACKUP_CERTIFICATE
    

    BACKUP_CERTIFICATE は、バックアップ バケットの CA 証明書に置き換えます。

  5. 証明書の場所を使用して、次の環境変数を設定します。

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
    

監査ログの復元を設定する

次の手順に沿って、バックアップ バケットから復元バケットへの監査ログの転送を構成します。

  1. 監査ログ転送ジョブのサービス アカウントを作成します。プロジェクト Namespace のバケットとシークレットから読み取りと書き込みを行うためのアクセス権をサービス アカウントに付与する必要があります。

    kubectl apply -f - <<EOF
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: audit-log-restore-sa
      namespace: PROJECT_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: read-secrets-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-secrets-rolebinding-restore
      namespace: PROJECT_NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: audit-log-restore-sa
      namespace: PROJECT_NAMESPACE
    roleRef:
      kind: Role
      name: read-secrets-role
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: audit-log-restore-bucket-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups:
      - object.gdc.goog
      resourceNames:
      - $DST_BUCKET # Source bucket name
      resources:
      - buckets
      verbs:
      - read-object
      - write-object
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: audit-log-restore-role-binding
      namespace: PROJECT_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: audit-log-restore-bucket-role
    subjects:
    - kind: ServiceAccount
      name: audit-log-restore-sa
      namespace: PROJECT_NAMESPACE
    ---
    EOF
    
  2. リモート バックアップ バケットからログを復元する転送ジョブを作成します。

    kubectl apply -f - <<EOF
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: audit-log-restore-job
      namespace: PROJECT_NAMESPACE
    spec:
      template:
        spec:
          serviceAccountName: audit-log-restore-sa
          containers:
            - name: storage-transfer-pod
              image: gcr.io/private-cloud-staging/storage-transfer:latest
              imagePullPolicy: Always
              command:
                - /storage-transfer
              args:
                - '--src_endpoint=$SRC_ENDPOINT
                - '--dst_endpoint=$DST_ENDPOINT
                - '--src_path=\$SRC_PATH
                - '--dst_path=\$DST_PATH
                - '--src_credentials=$SRC_CREDENTIALS
                - '--dst_credentials=$DST_CREDENTIALS
                - '--dst_ca_certificate_reference=$DST_CA_CERTIFICATE
                - '--src_ca_certificate_reference=$SRC_CA_CERTIFICATE # Optional. Based on destination type
                - '--src_type=s3'
                - '--dst_type=s3'
                - '--bandwidth_limit=100M' # Optional of the form '10K', '100M', '1G' bytes per second
          restartPolicy: OnFailure # Will restart on failure.
    ---
    EOF
    

ジョブのスケジュールを設定したら、ジョブ名を audit-log-restore-job として、プロジェクト Namespace を指定して、データ転送をモニタリングできます。

すべてのデータが宛先バケットに転送されると、ジョブは終了します。

監査ログ インスタンスをデプロイしてログにアクセスする

復元されたログにアクセスするには、Loki インスタンス(監査ログ インスタンスとも呼ばれます)をデプロイする必要があります。

監査ログ インスタンスを設定するには、復元ジョブ用に作成した audit-log-restore-sa サービス アカウントを使用します。次の手順に沿ってインスタンスをデプロイします。

  1. インスタンスの構成用の ConfigMap オブジェクトを作成します。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    data:
      loki.yaml: |-
        auth_enabled: true
        common:
          ring:
            kvstore:
              store: inmemory
        chunk_store_config:
          max_look_back_period: 0s
        compactor:
          shared_store: s3
          working_directory: /data/loki/boltdb-shipper-compactor
          compaction_interval: 10m
          retention_enabled: true
          retention_delete_delay: 2h
          retention_delete_worker_count: 150
        ingester:
          chunk_target_size: 1572864
          chunk_encoding: snappy
          max_chunk_age: 2h
          chunk_idle_period: 90m
          chunk_retain_period: 30s
          autoforget_unhealthy: true
          lifecycler:
            ring:
              kvstore:
                store: inmemory
              replication_factor: 1
              heartbeat_timeout: 10m
          max_transfer_retries: 0
          wal:
            enabled: true
            flush_on_shutdown: true
            dir: /wal
            checkpoint_duration: 1m
            replay_memory_ceiling: 20GB
        limits_config:
          retention_period: 48h
          enforce_metric_name: false
          reject_old_samples: false
          ingestion_rate_mb: 256
          ingestion_burst_size_mb: 256
          max_streams_per_user: 20000
          max_global_streams_per_user: 20000
          per_stream_rate_limit: 256MB
          per_stream_rate_limit_burst: 256MB
          shard_streams:
            enabled: false
            desired_rate: 3MB
        schema_config:
          configs:
          - from: "2020-10-24"
            index:
              period: 24h
              prefix: index_
            object_store: s3
            schema: v11
            store: boltdb-shipper
        server:
          http_listen_port: 3100
          grpc_server_max_recv_msg_size: 104857600
          grpc_server_max_send_msg_size: 104857600
        analytics:
          reporting_enabled: false
        storage_config:
          boltdb_shipper:
            active_index_directory: /data/loki/boltdb-shipper-active
            cache_location: /data/loki/boltdb-shipper-cache
            cache_ttl: 24h
            shared_store: s3
          aws:
            endpoint: $DST_ENDPOINT
            bucketnames: $DST_PATH
            access_key_id: ${S3_ACCESS_KEY_ID}
            secret_access_key: ${S3_SECRET_ACCESS_KEY}
            s3forcepathstyle: true
    EOF
    
  2. 復元バケットからログにアクセスするためのサービスを使用してインスタンスをデプロイします。

    kubectl apply -f - <<EOF
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app: audit-logs-loki-restore
        logging.private.gdch.goog/loggingpipeline-name: default
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    spec:
      persistentVolumeClaimRetentionPolicy:
        whenDeleted: Retain
        whenScaled: Retain
      podManagementPolicy: OrderedReady
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: audit-logs-loki-restore
      serviceName: audit-logs-loki-restore
      template:
        metadata:
          labels:
            app: audit-logs-loki-restore
            app.kubernetes.io/part-of: audit-logs-loki-restore
            egress.networking.gke.io/enabled: "true"
            istio.io/rev: default
            logging.private.gdch.goog/log-type: audit
        spec:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - preference:
                  matchExpressions:
                  - key: node-role.kubernetes.io/control-plane
                    operator: DoesNotExist
                  - key: node-role.kubernetes.io/master
                    operator: DoesNotExist
                weight: 1
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - audit-logs-loki-restore
                  topologyKey: kubernetes.io/hostname
                weight: 100
          containers:
          - args:
            - -config.file=/etc/loki/loki.yaml
            - -config.expand-env=true
            - -target=all
            env:
            - name: S3_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  key: access-key-id
                  name: $DST_SECRET_NAME
                  optional: false
            - name: S3_SECRET_ACCESS_KEY
              valueFrom:
                  secretKeyRef:
                    key: secret-access-key
                    name: $DST_SECRET_NAME
                    optional: false
            image: gcr.io/private-cloud-staging/loki:v2.8.4-gke.2
            imagePullPolicy: Always
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /ready
                port: http-metrics
                scheme: HTTP
              initialDelaySeconds: 330
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            name: audit-logs-loki-restore
            ports:
            - containerPort: 3100
              name: http-metrics
              protocol: TCP
            - containerPort: 7946
              name: gossip-ring
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /ready
                port: http-metrics
                scheme: HTTP
              initialDelaySeconds: 45
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            resources:
              limits:
                ephemeral-storage: 2000Mi
                memory: 8000Mi
              requests:
                cpu: 300m
                ephemeral-storage: 2000Mi
                memory: 1000Mi
            securityContext:
              readOnlyRootFilesystem: true
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /etc/loki
              name: config
            - mountPath: /data
              name: loki-storage
            - mountPath: /tmp
              name: temp
            - mountPath: /tmp/loki/rules-temp
              name: tmprulepath
            - mountPath: /etc/ssl/certs/storage-cert.crt
              name: storage-cert
              subPath: ca.crt
            - mountPath: /wal
              name: loki-storage
          dnsPolicy: ClusterFirst
          priorityClassName: audit-logs-loki-priority
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext:
            fsGroup: 10001
            runAsGroup: 10001
            runAsUser: 10001
          serviceAccount: audit-logs-loki-restore-sa
          serviceAccountName: audit-logs-loki-restore-sa
          terminationGracePeriodSeconds: 4800
          volumes:
          - emptyDir: {}
            name: temp
          - configMap:
              defaultMode: 420
              name: audit-logs-loki-restore
            name: config
          - emptyDir: {}
            name: tmprulepath
          - name: storage-cert
            secret:
              defaultMode: 420
              secretName: web-tls
      updateStrategy:
        type: RollingUpdate
      volumeClaimTemplates:
      - apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          creationTimestamp: null
          name: loki-storage
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 50Gi
          storageClassName: standard-rwo
          volumeMode: Filesystem
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    spec:
      internalTrafficPolicy: Cluster
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - name: http-metrics
        port: 3100
        protocol: TCP
        targetPort: http-metrics
      selector:
        app: audit-logs-loki-restore
      sessionAffinity: None
      type: ClusterIP
    ---
    EOF
    

データソースのログを表示するようにモニタリング インスタンスを構成する

次の手順に沿って、監査ログ インスタンスから復元された監査ログを表示するように Grafana(モニタリング インスタンスとも呼ばれます)を構成します。

  1. プロジェクトのモニタリング インスタンスのエンドポイントに移動します。
  2. ユーザー インターフェース(UI)のナビゲーション メニューで、[管理] > [データソース] をクリックします。
  3. [新しいデータソースを追加] をクリックします。
  4. [データソースを追加] ページで、[Loki] を選択します。
  5. [設定] ページで、[名前] フィールドに値として Audit Logs - Restore を入力します。
  6. [HTTP] セクションの [URL] フィールドに次の値を入力します。

    http://audit-logs-loki-restore.PROJECT_NAMESPACE.svc:3100
    
  7. [カスタム HTTP ヘッダー] セクションで、対応するフィールドに次の値を入力します。

    • ヘッダー: X-Scope-OrgID
    • 値: infra-obs

図 1 では、モニタリング インスタンスの UI の [データソースを追加] ページに Loki がオプションとして表示されています。図 2 の [設定] ページには、データソースを設定するために記入する必要があるフィールドが表示されています。

Loki オプションが、UI の [データソースを追加] ページにデータソースとして表示されます。

図 1: モニタリング インスタンスの UI の [データソースを追加] ページ。

Loki をデータソースとして構成するための関連フィールドが [設定] ページに表示されます

図 2. モニタリング インスタンスの UI の [設定] ページ。

Audit Logs - Restore オプションが、ログ エクスプローラのデータソースとして使用できるようになりました。