GitHub AppsのRepository accessの設定変更をしてレポジトリの個別許可設定を消してしまったら

この記事は [mediba Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mediba) 11日目の記事です。

みなさん、こんにちは。
medibaでSREをしています、[Mary](https://twitter.com/mary_tuba)です。

みなさん、GitHub Apps、使ってますでしょうか？
先日GitHub AppsのRepository accessの設定変更を行なった際、レポジトリごとの許可設定の設定を飛ばしてしまいました。
その際の復旧方法とバックアップについてまとめました。

（復旧方法とバックアップ方法だけ確認したい人は、[復旧](https://qiita.com/mary_tuba/items/689a169f9b821fd9c252#%E5%BE%A9%E6%97%A7)の項目までスキップ！）


# GitHub Appsとは
>GitHub Apps は GitHub の中でも主役級の存在です。 GitHub App は独自で動作し、独自の ID を使用して API 経由で直接アクションを実行します。つまり、ボットやサービスアカウントを別途維持する必要がありません。
>GitHub Apps は、Organization や個人アカウントに直接インストールでき、特定のリポジトリへのアクセス権を付与できます。 精細なアクセス権限が付いており、webhook が組み込まれています。 GitHub App をセットアップする際、アクセスさせるリポジトリを選択できます。 たとえば、リポジトリに問題を書き込み、リポジトリMyGitHubのみにoctocat書 き込むアプリをoctocat設定できます。 GitHub App をインストールするには、Organization のオーナーであるか、リポジトリで管理者権限を持っている必要があります。

[GitHub Apps について](https://docs.github.com/ja/developers/apps/getting-started-with-apps/about-apps#github-apps-について)より



公式にも記載がありますが、GitHubが提供している独自で動作するアプリケーションです。
GitHubと連携すると便利なアプリケーションが公式でGitHub Appsを公開しています。
[GitHub Marketplace](https://github.com/marketplace?category=&query=&type=apps&verification=)にて、インストールができます。一般的に利用されているSaaSは大体公開されている印象があるので、一度GitHubとSaaSを繋げたい場合は一度Marketplaceの検索をお勧めします。
もちろん、自分達で独自のGitHub Appsを作ることも可能です。
（弊社でGitHub Appsを使ってGitHub Actions利用時にPAT（Personal access tokens）の利用を撤廃した話もありますが、近いうちにブログ化したいと思います。）


# Repository access
GitHub Appsですが、まず、organizationに対して、インストールを行います。その後、Repository accessにてどのレポジトリに対してインストールを行うかという設定を行うことで、利用を行うことができるようになります。

Repository accessの設定には、
- All repositories 
- Only select repositories 
の２種類があります。

![スクリーンショット 2022-12-11 21.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86974/cf83d541-ad6d-6ebb-4edf-b26a0d103950.png)

## All repositories 
インストールしたorganizationに所属しているすべてのレポジトリにインストールされます。
organization全体に対して、同じ設定をインストールしたい場合に使うと良いと思います。

## Only select repositories
インストールしたorganizationの中で、どのレポジトリに対してインストールさせるかを細かく制御できます。

# Repository accessの設定を Only select repositories　→ All repositories に変更したら・・・

結論から言います。

**レポジトリの個別許可設定が全部飛びます😇😇😇**

## 何が起きたか
弊社の運用の場合、基本的にGitHub Appsのインストールに関しては、個別に許可を行い、インストールを行なっています。
ですが、とあるGitHub Appsの設定だけ、一時的に全体的に適用を行ったらいいんじゃないか。と思ったのです。

そこで、Only select repositories　→　All repositoriesへ設定を変更し、SAVEを押しました。

ですが、やっぱり全体適用はやめようという判断になり、All repositories　→ Only select repositoriesに設定を戻しました。

すると、Only select repositoriesの設定が全部無くなっていたのです。

# 復旧

先に結論を言うと、この先に記載するバックアップがない場合は、サポートに問い合わせるしかありません。

復旧手段が全く思いつかなかった私。慌てて[GitHub Support](https://support.github.com/)に問い合わせました。
すると、GitHub内部で持っている監査ログを精査していただき、設定を変えてしまった段階でのリストを出していただけました。
GitHub内部で持っている監査ログは私たちは見ることができないとのこと。
ログの監査まで行ってくださった、サポートには頭が上がりません。

ですが、毎回GitHub Supportに聞いてログを見ていただくわけにはいきません。そこでどうやって設定をバックアップしたらいいの？と聞いてみました。

# バックアップ
サポートの方がとても丁寧に教えてくださいました。

>[List repositories accessible to the user access token](https://docs.github.com/ja/rest/apps/installations?apiVersion=2022-11-28#list-repositories-accessible-to-the-user-access-token)を使用することで、そのインストール済みアプリに許可されたリポジトリが取得できます。このとき、インストール済みアプリの設定ページにアクセスした際のURL末尾の数字(ID)で{installation_id}を置き換えてください。

以下のようにコマンドを叩くことで、現在インストール中のレポジトリの設定をバックアップすることができました。

```
$ curl -sH 'Authorization: token TOKEN' https://api.github.com/user/installations/99999999/repositories | jq '.repositories[].name'
```
出力結果
```
"test1"
"test2"
```

# 結論
GitHub AppsのRepository accessの設定を修正する前には、API叩いてバックアップ取ろうね！


# 余談
今年はこちらのツイートでかなりバズりまして。
（2022/12/11 21:15時点　10682RT 386引用RT 71308いいね）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">このノベルティ、近年で一番笑ったのよね <a href="https://t.co/z5af5mwCw2">pic.twitter.com/z5af5mwCw2</a></p>&mdash; Mary (@mary_tuba) <a href="https://twitter.com/mary_tuba/status/1578033606081249290?ref_src=twsrc%5Etfw">October 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

私自身、サウナや温泉などの温浴施設が大好きなので、来年以降タオルノベルティが増えるといいなぁと思っています。

# 宣伝
mediba大絶賛採用募集中！
medibaの[募集求人ページ](https://hrmos.co/pages/mediba/jobs/1100000001)から応募され入社が決定すると、お祝い金として30万円をプレゼントするキャンペーンを実施中です！！使途は完全自由。リモート環境充実させるもよし、美味しいもの食べに行くのもよし。

カジュアル面談もお気軽に。個人的にTwitterのDMで連絡していただいても良いですし、[こちら](https://hrmos.co/pages/mediba/jobs/1100000001)にて公式的にご連絡いただいてもOKです！
皆様のご連絡をお待ちしております！

※お祝い金は、試用期間（3か月）を経て、雇用が継続した場合に支給させて頂きます。また、お祝い金は予告なく終了する場合があります。