[Oracle Cloud]GitLabのバックアップをObject Storageにとる

# 概要
OCI Object StorageのS3互換APIを利用して、GitLabのバックアップをObject Storageに取得します。
Object StorageはOCIが展開するストレージサービスで、AWSにおけるS3、AzureにおけるBlob Storageに相当します。
Object StorageをS3のように利用するための互換APIが利用できるため、本記事ではこれを利用してGitLabのバックアップを取得します。

# 構成
### 構成図
以下のような構成で実施しています。
GitLabサーバやObject Storageなどの下図に記載のリソースは作成済みという前提で、赤い部分を実現する方法を本記事では記載しています。
![スクリーンショット 2021-01-24 13.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245430/a9b523f0-fbe6-adef-45eb-d80678a50298.png)


### パッケージ一覧
| 項目 | 値 |
|---|---|
|OS | Oracle Linux 8.3 |
|GitLab | 13.8.0 |

# 手順

## 手順一覧
1. IAM設定
2. シークレット作成
3. Object Storageネームスペースの確認
2. gitlab.rbの設定
3. GitLab再起動
4. バックアップ取得&確認
5. 定期バックアップ取得の設定

### IAM設定
S3互換APIを利用するためにはシークレットキーが必要となるため、シークレットキー発行用のユーザを発行して権限を割り当てます。
権限分離のために専用ユーザを作成するのが良いと思います。
ここでは以下の名前で作成していますが、お好きな名前で問題ありません。

| 分類 | 名前 | 内容 |
|---|---|---|
| ユーザ | gitlab-user | - |
| グループ | gitlab-group | - |
| ポリシー | gitlab-policy | Allow group gitlab-group to manage buckets in tenancy<br>Allow group gitlab-group to manage objects in tenancy |

gitlab-userはシークレットキーを保持させる以外に用途はないので、他の権限は除いておきましょう。

![スクリーンショット 2021-01-24 12.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245430/f89fe026-a97d-af92-bd39-204cf3f2fb17.png)

### シークレット作成
ユーザ詳細画面のCustomer Secret KeysからGenerate Secret Keyをクリックしてシークレットキーを作成します。

![スクリーンショット 2021-01-24 12.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245430/2d0e02ce-9123-bfdb-f37d-f87a80304d14.png)

このとき**シークレットキーが表示されるので手元にメモ**しておきましょう。
（画面をクローズすると二度と表示できません）
![スクリーンショット 2021-01-24 12.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245430/50ba2b09-8f1a-719c-1265-c82d57182bd9.png)

作成が完了すると一覧にシークレットキーが表示されます。
**Access Keyの値もメモ**しておきます。後ほどキーIDとして利用します。

### gitlab.rbの設定
gitlab.rbのバックアップに関する項目を以下のように設定します。
[]の部分は環境に合わせて入力してください。

```
gitlab_rails['backup_upload_connection'] = {
  'provider' => 'AWS',
  'region' => '[region]',
  'aws_access_key_id' => '[your_key_id]',
  'aws_secret_access_key' => '[your_secret_key]',
  'host' => '[namespace].compat.objectstorage.[region].oraclecloud.com',
  'path_style' => 'true',
  'enable_signature_v4_streaming' => false
}
gitlab_rails['backup_upload_remote_directory'] = '[bucket_name]'
```

ポイントはenable_signature_v4_streamingとpath_styleの設定です。
enable_signature_v4_streamingについては、S3互換APIではSTREAMING-AWS4-HMAC-SHA256-PAYLOADがサポートされてないため無効化しておく必要があります。
path_styleについては、これを有効にすることで「host/bucket_name/object」形式のパスを利用することができるのですが、S3互換APIではこちらの形式にする必要があります。

| 項目 | 値 | 例 |
|---|---|---|
| region | バックアップ先のリージョン名 | ap-tokyo-1 |
| your_key_id | シークレット作成時にメモしたキーID | - |
| your_secret_key | シークレット作成時にメモしたシークレットキー | - |
| namespace | Object Storageのネームスペース（テナンシー固有） | - |
| bucket_name | バックアップ先のバケット名 | gitlab-backup |

### GitLab再起動
バックアップ設定を反映させるためにGitLabを再起動します。

```shell
$ sudo gitlab-ctl reconfigure
```

### バックアップ取得&確認
バックアップを取得コマンドを実行します。

```shell
$ sudo gitlab-backup create

(略)
Backup task is done.
```

Object Storageにバックアップが出力されているか確認します。
正常にバックアップが取れていれば、下図のようにバックアップファイルが生成されます。
![スクリーンショット 2021-01-24 12.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245430/4a393cd8-7587-788d-3f8f-92b0b224f0ab.png)

### 定期バックアップ取得の設定
定期的にバックアップを取れるようにOSにCronの設定をします。
ここでは毎日2:00AMにバックアップを取得するように設定します。

```shell
sudo su -
crontab -e
```

```
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
```

注意点としては、ローカルにバックアップを取る場合はgitlab_rails['backup_keep_time']の値を設定することで自動的に古いバックアップを削除できますが、Object Storageにバックアップを取得する場合は自動削除設定が効かないようです。
自動削除をしたい場合は、Object StorageのLifecycle Policyを利用して削除する運用にしてください。

# まとめ
OCI Object StorageのS3互換APIを利用して、GitLabのバックアップをObject Storageに取得しました。
GitLabとOCIを連携してTerrafromコードを実行する機能もあるので、OCI上でGitLabを利用したいという機会はあるかなと思います。
こちらの記事が役に立てば幸いです。

# 参考
* [OCI Object Storage S3互換API](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
* [GitLabバックアップ S3互換設定](https://docs.gitlab.com/ee/administration/object_storage.html#openstack-compatible-connection-settings)