S3 を Git リポジトリとして使う方法


モチベーション

  • やんごとなき理由で GitHub など Git サービスが使えないケースがある
  • ローカルなメモとか Git で管理したいものはあり、バックアップを考慮するとリモート Git リポジトリが欲しい
  • そこでプライベートな Git リポジトリとして S3 を使いたい

どう解決するか

前提条件

  • AWS CLI と S3 操作に必要な IAM 権限をセットアップしておく
  • 良さげな権限設定をした S3 バケットを作成しておく
  • 細かい権限が気になる場合 README を参照する

git-remote-s3 をインストール

pipx install git-remote-s3
  • 大抵の環境では pip, pip3 を使えばよいが、自分の環境だと pipx が楽だった

Git リポジトリをセットアップ

mkdir my-repo
cd my-repo
git init
git branch -m master main
git remote add origin s3://mybucket/mypath

push する

echo "Hello" > hello.txt
git add .
git commit -m "hello"
git push origin main

clone する

git clone s3://mybucket/mypath

ghq 使っている場合でも、普通に get できる

ghq get s3://mybucket/mypath 

Pros/Cons

Pros

  • GitHub などのサービスを使わずに、 S3 のみでマネージドな Git リポジトリを用意できる
    • 詳しく検証していないが、 AWS CLI のプロファイルを設定することで S3 互換ストレージも使えるかも?
  • 動作もシンプル
    • S3 オブジェクトとして git bundle ファイルが保存される感じになる
      • 詳細については README に記載がある
    • そのため最悪 git-remote-s3 がインストールできない環境であれば bundle ファイルをコピーしてきて、そこから展開して内容を見る・・・みたいなことも可能
    • そもそもプレフィックスとして s3+zip:// を使うと zip アーカイブも作成される
  • git remote helper として動作するので ghq など git を扱う外部ツールでも大体正常に動いてくれる
  • GitHub は許されていないが S3 は許されている環境で、個人のプロジェクトやメモを git で管理したいようなユースケースでオススメ

Cons

  • あくまで plain な Git リポジトリなので GitHub の Issue や Pull Request に相当する機能は無い
    • 複数人で開発するようなユースケースは不向き
      • 過去の diff とか見たい場合は CLI で頑張ったり GitWeb とか使うと良い
    • CodePipeline の S3 ソースアクションを使用して git push されたことにトリガーしてなんかするという構成は可能そう
    • S3 バケットを使う場合、イベント通知から SNS, SQS, Lambda 関数などを起動する構成も可能そう
    • が、そのあたりの周辺環境の構築をそんなに頑張るメリットはあまり無さそう
      • むしろ頑張りすぎるとメンテナンスが大変になりそう
  • S3 の料金は発生する
    • 大抵の場合 EC2 + EBS よりは安く済むと思う
  • S3 バケットの中身を見られる可能性がある
    • AWS アカウントを複数人で共有している場合、アクセス制御設定によっては S3 バケットの中身が見られてしまうので注意
    • 見れられないようアクセス制御を見直す、見れられても良い内容を扱うなどを検討すること!

my env

% sw_vers
ProductName:            macOS
ProductVersion:         15.2
BuildVersion:           24C101
% git -v
git version 2.47.0
% python3 -V
Python 3.13.0
% pipx --version
1.7.1