MinIO を使用してローカルに S3 環境を構築する

IT

はじめに

本記事では MinIO を使用してローカルに S3 環境を構築します。MinIO とは S3 互換性があるオブジェクトストレージです。
Docker イメージも公開されており、手軽に S3 環境を構築することが可能です。

環境

以下の環境で動作を確認しています。

$ docker compose version
Docker Compose version v2.2.3

手順

以下のファイルを準備します。MinIO の立ち上げ自体は docker-compose.yml だけで可能です。

$ tree
.
├── create_bucket.py
├── deploy_file.py
├── docker-compose.yml
├── setup.sh
└── test_data
    ├── test1.txt
    └── test2.txt
version: '3'
services:
  minio:
    image: minio/minio:latest
    container_name: minio
    environment:
        MINIO_ROOT_USER: localid
        MINIO_ROOT_PASSWORD: localpassword
    command: ['minio', 'server', '/data', '--console-address', ':8080']
    volumes:
        - ./minio_data:/export  # MinIOストレージの永続化
    ports:
        - '9000:9000'  # APIのエンドポイント
        - '8080:8080'  # GUI画面のポート

MinIO を立ち上げます。localhost の8080ポートにアクセスすることで GUI でストレージを確認することができます。
ログイン時の ID、パスワードは docker-compose.yml の環境変数(MINIO_ROOT_USERMINIO_ROOT_PASSWORD)で設定したものを使用します。

$ docker compose up -d

バケットを作成する Python プログラム(create_bucket.py)です。
boto3 を使用し、endpoint_url に localhost の9000 ポートを指定することで、立ち上げた MinIO に対してリクエストをすることが可能です。

import sys

import boto3

BUCKET_NAME = sys.argv[1]

s3 = boto3.resource(
    service_name='s3',
    endpoint_url='http://localhost:9000',
    aws_access_key_id='localid',
    aws_secret_access_key='localpassword',
    region_name='')
bucket = s3.Bucket(BUCKET_NAME)

def main():
    bucket.create()

if __name__ == '__main__':
   main()

ストレージ上にファイルを配置する Python プログラム(deploy_file.py)です。

import os
import sys

import boto3

BUCKET_NAME = sys.argv[1]

SOURCE_PATH = './test_data/'
TARGET_PATH = 'test'

s3 = boto3.resource(
    service_name='s3',
    endpoint_url='http://localhost:9000',
    aws_access_key_id='localid',
    aws_secret_access_key='localpassword',
    region_name='')
bucket = s3.Bucket(BUCKET_NAME)

def main():
    list_file_name =  os.listdir(SOURCE_PATH)
    for file in list_file_name:
        bucket.upload_file(f'{SOURCE_PATH}/{file}', f'{TARGET_PATH}/{file}')

if __name__ == '__main__':
   main()

上記のプログラムを実行すると、GUI 画面上でもバケットの作成、ファイルのアップロードを確認できます。

$ python3 create_bucket.py s3-local

$ python3 deploy_file.py s3-local

上記の手順をまとめたものが以下になります。

#!/bin/sh

BUCKET_NAME=s3-local

# MinIOの起動
docker compose down
docker compose up -d
echo "waiting for the start of MinIO"
sleep 3

# バケットの作成
python3 create_bucket.py $BUCKET_NAME

# ファイルの配置
python3 deploy_file.py $BUCKET_NAME

おわりに

本記事では MinIO を使用してローカルに S3 環境を構築する方法をまとめました。S3 と接続するプログラムも実際に AWS に繋ぐことなくテストできそうです。
この記事がどなたかの参考になれば幸いです。

参考

コメント