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

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

Clock Icon2024.11.25

まえがき

CodeCommit が終了してしまい GitHub などに移行したりしているのではないでしょうか?

S3 を一応 Git リポジトリとして使えなくはないので、何かのときに使えるかもしれません。

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

Gitから直接S3は参照できないので、Rcloneを通じてS3をレポジトリとして使えるようにします。

Rclone は、クラウド間のデータ転送や同期を行うための CLI ツールです.

Rclone is a command-line program to manage files on cloud storage. It is a feature-rich alternative to cloud vendors' web storage interfaces. Over 70 cloud storage products support rclone including S3 object stores, business & consumer file storage services, as well as standard transfer protocols.

S3 とローカル同期は Rclone を使って行います。git コマンドから Rclone 使えるようにします。

1.Rclone をインストールする

ご自身の環境に合わせてインストールをする

$ brew install rclone

2. git で Rclone が使えるようにする

$ pip3 install git-remote-rclone-reds

3.S3 の Bucket を作り、ローカルにサンプルアプリを作成

今回はサンプルでblog-test-sample-1125という S3 バケットをプライベートで作りました。

サンプルアプリで README.md だけあるファイルを作っておきます。

4 以降の手順は sample-app ディレクトリにいる状態で行っています。

$ mkdir sample-app
$ cd sample-app
$ touch README.md
$ echo "Hello" > README.md
$ git add .
$ git commit -am 'new project'

4.Rclone の config を行う

同期するクラウドサービスなどの接続情報などをのセットアップをします

私は sts による一時的なクレデンシャルを用いているため、シークレットなどの情報いれていませんが、使用することは可能です。

rclone config

n) New remote

n を選択(n のキーを押す)

Enter name for new remote.

適当な名前をつける(blog-sample)

Type of storage to configure.

番号でもよいが s3 を入力するのが早そう。

Option provider.
Choose your S3 provider.

1 (AWS)を選択

Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).

sts などを使う予定なので、 2 (true)

access_key_id, scret_key は私は使わないので未入力にしてエンターをした。

あとはすべてデフォルト(未入力でエンター)。

q で終了する

設定を確認してみます。

$ cat ~/.config/rclone/rclone.conf
[blog-sample]
type = s3
provider = AWS
env_auth = true

意図通り設定されています。

sts により発行された一時的なクレデンシャルが環境変数に設定されている bash が起動します。

5 s3 の path を git の remote に追加

$ git init
$ git remote add origin rclone://blog-sample/blog-test-sample-1125/sample-app

remote で登録する規則は以下の通り
rclone://[Rclone の config で作った name]/[S3 バケット名]/[S3 バケットのパス]

6.一時的なクレデンシャルを発行

Rclone で access_key_id, scret_key を直接使わないので、sts から IAM ロールの一時的なクレデンシャルを作ってそれを使います。

参考: STS で一時クレデンシャルを発行する | DevelopersIO

直接 aws cli はつかわず、簡単にラップされたツールを使っています。私は swrole を使っています。他にもたくさんと思います。

参考:

以降は、.aws/config に profile と .aws/credentials に access key や scret key などが設定されている前提で行きます。

今回は blog という profile が設定されている前提にします。

Swrole でスイッチロールし、push します。

$ swrole blog
$ git push origin main

無事に push できました。pull なども同様にできますが、以降は割愛します。

CloudShell のデフォルトだけで使う

1. S3 からダウンロードし、解凍する

S3 からダウンロードします。gz で圧縮された状態になっているので解凍します。

$ aws s3 sync s3://blog-test-sample-1125 repository
$ cd repository/sample-app
$ tar -zxvf repo-xxxxx.tar.gz

2. git の remote に追加

先ほどダウンロードした repository を、絶対パス、相対パスどちらでも OK です。

$ mkdir sample-app
$ cd sample-app
$ git clone repositoy/sample-app/repo sample-app

まとめ

s3 を git のレポジトリとして使いました。ただ PR とかできないので、本当にファイルの置き場としてだけ用途で Code Commit の代わりには難しいですが、何かの時に使う機会があるかもしれない。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.