S3 を Git リポジトリとして使う方法
モチベーション
- やんごとなき理由で GitHub など Git サービスが使えないケースがある
- ローカルなメモとか Git で管理したいものはあり、バックアップを考慮するとリモート Git リポジトリが欲しい
- そこでプライベートな Git リポジトリとして S3 を使いたい
どう解決するか
- AWS が公開している awslabs/git-remote-s3 を使う
- これは git remote helper を利用した S3 を Git Server として扱うツール
前提条件
- 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 アーカイブも作成される
- S3 オブジェクトとして git bundle ファイルが保存される感じになる
- 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