出力を入力へ

プログラミングに関する自分が考えた事を中心にまとめます

GitHub Secretsの更新をgithub-secrets-writerで自動化する

GitHub Actionsでクレデンシャル情報を利用するためにGitHub Secretsを利用しているわけだけど, この値の設定や更新を自動化したい.

具体的には AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY の更新を自動化したい. また,現状は単一のbotユーザの権限で,複数リポジトリに同じアクセスキーを設定しているので アクセスキーを更新したら複数リポジトリをまとめて更新したい.

リポジトリが少ないうちは手動対応でもよかったけれど リポジトリ数が増えるにつれて設定忘れや更新もれが発生しそうなこと, そもそも面倒なので自動化する.

自動更新の仕組み

おおまかな手順としては以下の通り

  1. アクセスキーを更新してダウンロード
  2. cliツールを利用して特定リポジトリのsecretsを更新
  3. すべてのリポジトリに対して 2 を繰り返す

cliによるsecretesの更新

secretsの更新に githubの公式クライアントツールの cli を利用したい. ところが,cliはsecretsの更新APIには対応しておらず,要望は上がっているが まだすぐに実装されそうというものではない.

その代替としては, github-secrets-writer というのがあるのでこれを利用する. その名前の通り,github secretsの更新に特化したcliツールである.

github-secrets-writerを利用する

手順としてはREADMEにある通り.

GITHUB_TOKENはGitHub公式ヘルプなどを参考に作成する. 権限について,パブリックリポジトリのsecretesのみを更新するのであれば public_repo だけで, プライベートリポジトリのsecretsも更新するのであれば repo のフルコントロールが必要になる.

あとは更新するリポジトリとsecrets名および値を指定して実行するだけ. key=value 形式で設定値が記載されているファイルがあれば --from-file で簡単に指定できるが, 残念ながらAWSアクセスキーはcsv形式なので--from-fileで簡単に利用できる形式ではないので 諦めて --from-literal で直接指定して実行する.

出力が少しわかりにくく, secretName1: 204 No Content のように表示されていれば上手く更新されている. 新しくsecretsの項目を作った場合は secretName1: 201 Created のようになる. 一方で,権限不足等であれば以下のように表示される.

secretname3: GET https://api.github.com/repos/thaim/samplerepo/actions/secrets/public-key: 404 Not Found []
ERROR: encountered some failures, see above

github-secrets-writerによる自動更新を自動化する

アクセスキーの更新は90日で更新してねという推奨があるので, アクセスキーの発行や上記cliの操作自体も自動化したい.

アクセスキーを発行するAPI自体は存在するので lambdaでアクセスキーを発行してそのままsecretsを更新するような処理を実装して CloudWatchで定期的に呼び出してあげればよい.

が,そこそこ面倒なので止めた. まずは手元で自動化できればよさそう.

Organizationレベルで共通のSecrets

ここまで手順を整理したところで, GitHubが最近 SecretsをOrganizations レベルで共有できる Organizations Secretsを発表している ことに気が付いた.

これを設定・利用すればそもそも,リポジトリ毎のSecretsを更新してまわるなんて不要になる.