ROSAでEFSを利用する際のバックアップ・リストア戦略

# 概要
[前回の記事](https://qiita.com/naras/items/36f0b2494a34d8941677)ではROSAでEFSを利用する方法とその際の考慮点をご紹介しましたが、本記事ではEFSをバックアップ・リストアする際の方法についてご紹介します。

# 本記事で紹介するユースケース
- ROSAのPVとしてEFSを利用する際のバックアップ(AWS Backup一択)
- EFSをPVとしてリストアする際のパターン

# バックアップ
## どの層でバックアップを行うか
OpenShift/Kubernetesクラスタにおいてストレージのバックアップを取得する際、どのレイヤーで取得するかを考える必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662709/76521f2f-3fa9-960a-42a2-26ecda6585bb.png)

OpenShiftクラスタのツールを利用してバックアップ・リストアを行う場合は、データが保存されているストレージ本体だけでなく、それに関連するKubernetesリソース(PV,PVC,Pod,Deployment)までバックアップを取得することが可能です。

AWSのサービスを利用してバックアップ・リストアを行う場合はAWSリソースとしてのバックアップになりますので、Kubernetesリソースについては別途バックアップを行う必要があります。また、リストアする際にはPV・PVC等を再度作成し直す必要があります。

こう記載すると、前者の方が楽じゃないか、と思われるかもしれません。
ですが、実際の運用で利用することを考えると、運用としてAWSリソースだけをリストアして別のKubernetesリソースとして定義し直したいケースは往々にしてありますので、後者の方が実情にあっている場合もありうると思っています。

## サービス/ツールの選定
結論としては、EFSのバックアップのためにはAWS Backupを使うことになります。
それはOpenShiftのバックアップツールである**O**penShift **A**PI for **D**ata **P**rotection(**OADP**)がEFSに対応していないためです。


OpenShift/ROSAではバックアップツール/サービスとしてOADPが提供されています。

https://docs.openshift.com/container-platform/4.12/backup_and_restore/application_backup_and_restore/oadp-intro.html

OADPはKubernetesクラスタのリソースのバックアップ・リストアに利用出来るOSSであるVeleroをベースとしたツールです。
VeleroではResticとのIntegrationによりファイルストレージのバックアップも可能です。

https://velero.io/

https://restic.net/


しかし、残念ながらOADPではEFSのバックアップにresticを利用することが出来ません。
`OADP currently does not support backup and restore of AWS EFS volumes using restic in Velero (OADP-778).`  

https://access.redhat.com/documentation/en-us/openshift_container_platform/4.13/html/backup_and_restore/oadp-application-backup-and-restore

したがって、EFSを利用する際はOpenShift上のツールではなくAWS Backupを利用してEFSのバックアップを取得することになります。

もちろん、これ以外の方法として独自のバックアップを実装することも出来ます。
例えば、バックアップ用のPodを作成し、バックアップ対象ストレージ・バックアップ保管用ストレージをマウントして定期的にデータをコピーすることでバックアップを行うことも可能ですが、手間のかかる運用となりますので可能な限りAWSのサービスを利用すべきと思います。

# リストア
前述の通り、EFSのバックアップはAWS Backup一択となるため、リストアもAWS Backupの機能で行います。
そして、AWSのサービスでバックアップ・リストアを行う際にはKubernetesのリソースはリストアされませんので別途再作成が必要となります。

## EFSのリストア
EFSをリストアする際のオプションは`Restore type`・`Restore location`の2つです。
|Restore type | |
|:-:|:-:|
|Full restore|全フォルダ・ファイルをリストアします。|
|Item-level restore| 特定のフォルダ・ファイルをリストアします。|
  
 
|Restore location | |
| --- | --- |
| Restore to directory in source file system | 同一EFSリソースにリストア対象をリストアします。|
| Restore to a new file system | 別EFSリソースを作成し、そこにリストア対象をリストアします。 |

![EFS_backup_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662709/3d4453da-44ff-dcbc-d51a-898c57d71de6.png)

`Restore location`で`Restore to directory in source file system`を選択してリストアを行うと、同一EFSリソースのルートボリュームにフォルダが作成され、リストアしたフォルダ・ファイルが格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662709/0cf0f1b9-6a03-02d7-19bc-4f1a4c071092.png)


## Kubernetesリソースの新規作成
### PV/PVCの作成
リストアしたディレクトリ(フォルダ)をKubernetes上のPodから扱えるようにするため、PV・PVCとして定義します。
[前回の記事](https://qiita.com/naras/items/36f0b2494a34d8941677)の通り、この環境では動的プロビジョニング(Dynamic Provisoning)を採用しており、PVC作成時に自動でPVが作成されるので、普段はPVの存在をあまり意識する必要はないのですが、ここでは既存のディレクトリをPV化する静的プロビジョニングを行いますので、PVを意識する必要があります。

↓動的プロビジョニングの場合はpvc作成時にpvも自動作成されますが、リストアの場合は静的プロビジョニングのため手動で作成する必要があります。
また、`volumeHandle`ではEFS内でリストアされたディレクトリを指定する必要があります。
(`storageClassName`は動的プロビジョニングと同様でも良いですし、異なる名称でも構いません。)
```
kind: PersistentVolume
apiVersion: v1
metadata:
  name: <pv-name>
spec:
  capacity:
    storage: 1Gi                  
  csi:
    driver: efs.csi.aws.com
    volumeHandle: 'fs-xxxxxx:/aws-backup-restore_yyyy-mm-ddThh-mm-ss-xxxxxxxxZ/<restore_dir>
    volumeAttributes:
      encryptInTransit: 'true'
  accessModes:
    - ReadWriteMany    
  persistentVolumeReclaimPolicy: Delete
  storageClassName: <storage_class_name>
  volumeMode: Filesystem
```

PV・PVCが作成出来たら、次はこのPVをPodにマウントします。

### リストアパターン
ここでのリストアシナリオとして、2つのパターンが考えられます。
#### パターン①：元のPodで特定時刻の状態にデータを戻したい
このパターンとして、リストアしたフォルダ・ファイルの一部を戻したい場合が考えられます。例えば、誤ってファイルを削除したケースなどです。
この場合は元のPodにリストアしたPVを一時的にマウントし、ファイルのコピーを行うことでこれを実現することが出来ます。

#### パターン②：別Podで特定時刻の状態にデータを戻したい
このパターンとして、バックアップ時点でのPodの状態を再現したい場合が考えられます。
このパターンとして、アプリケーションが動かなくなり、過去時点での稼働を確認したい場合が考えられます。
この場合はアプリケーションのPodも別のPodとして作成し直した上でリストアしたPVをマウントすることで実現が可能です。（場合によってはService・Ingress・Routeなどのリソースも用意する必要があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662709/0eed1e52-7851-d444-d1b1-8c94f28a16d4.png)

# まとめ
本記事ではEFSとROSAを組み合わせた際のEFSのバックアップ・リストア戦略についてご紹介しました。
EFS自体のバックアップ・リストアについてはAWS Backupを利用したバックアップ・リストア一択となりますが、リストアオプションやKubernetesリソースとしての取り扱い方については求められる要件や運用方式によって異なるかと思いますので、適切な方法を選択することが重要です。
本記事の内容が皆様の役に立ちましたら幸いです。