📌

【S3rver】ローカルでモックS3を起動する

3 min read

前書き

開発用のローカル環境から本番環境のS3は参照したくない。
検証環境のS3を用意すれば良さそうだが、費用をケチりたいので試しに下記パッケージを使ってモックS3を立ち上げてみた。

https://www.npmjs.com/package/s3rver

パッケージのインストール

$ yarn add -D s3rver
もしくは
$ npm install --save-dev s3rver

モックS3をマウントするディレクトリを作成し、サーバ起動

$ mkdir s3rver

$ npx s3rver -d ./s3rver

S3rver listening on 127.0.0.1:4568

# 4568ポートで立ち上がっている

AWS CLIをインストール

$ brew install aws-cli

profileを作成

# Access Key ID, Secret Access Keyともに"S3RVER"を指定
# 最後2行は未入力でリターン
$ aws configure --profile mock-s3
AWS Access Key ID [None]: S3RVER
AWS Secret Access Key [None]: S3RVER
Default region name [None]: 
Default output format [None]: 

# 設定が効いてるか確認
$ aws configure list --profile mock-s3
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  mock-s3           manual    --profile
access_key     ****************RVER shared-credentials-file    
secret_key     ****************RVER shared-credentials-file    
    region                <not set>             None    None

エンドポイントの指定 & バケット作成

# エンドポイントをlocalhostのポート4568に設定
# create-bucket で任意の名前でバケット作成
# --profileオプションで先ほど作ったプロファイルを指定
$ aws --endpoint-url http://localhost:4568 s3api create-bucket --bucket test-bucket-desu --profile mock-s3
{
    "Location": "/test-bucket-desu"
}

# 作成したバケットを確認
$ aws --endpoint http://localhost:4568 s3api list-buckets --profile mock-s3
{
    "Buckets": [
        {
            "Name": "test-bucket-desu",
            "CreationDate": "2021-09-03T10:40:00.953000+00:00"
        }
    ],
    "Owner": {
        "DisplayName": "S3rver",
        "ID": "123456789000"
    }
}

使ってみる

# 同期するためのサンプルディレクトリとデータを作る
$ mkdir directory-for-sync
$ touch directory-for-sync/test1.csv
$ touch directory-for-sync/test2.csv
# directory-for-syncとtest-bucket-desu を同期する
$ aws --endpoint http://localhost:4568 --profile mock-s3 s3 sync ./directory-for-sync/ s3://test-bucket-desu/
ls -la s3rver/test-bucket-desu 
total 48
drwxr-xr-x  8 anpanman  staff  256  9  3 20:00 .
drwxr-xr-x  3 anpanman  staff   96  9  3 19:59 ..
-rw-r--r--  1 anpanman  staff   32  9  3 20:00 test1.csv._S3rver_metadata.json
-rw-r--r--  1 anpanman  staff    7  9  3 20:00 test1.csv._S3rver_object
-rw-r--r--  1 anpanman  staff   32  9  3 20:00 test1.csv._S3rver_object.md5
-rw-r--r--  1 anpanman  staff   32  9  3 20:00 test2.csv._S3rver_metadata.json
-rw-r--r--  1 anpanman  staff    8  9  3 20:00 test2.csv._S3rver_object
-rw-r--r--  1 anpanman  staff   32  9  3 20:00 test2.csv._S3rver_object.md5

# 同期できてる!

S3オブジェクトのURIにアクセスしてみる

Image from Gyazo

まとめ

Node.jsがインストールされている環境であれば気軽に立ち上げることができて便利ですね。
サンドボックスとして使えそうです。

参考文献

https://www.npmjs.com/package/s3rver
https://qiita.com/monamu/items/bbebd6e42a8a0cb8fbf7
GitHubで編集を提案

Discussion

ログインするとコメントできます