クラウドストレージへのアクセスは、ブラウザやデスクトップアプリからだけではない。S3互換APIを使えば、Python・Node.js・Go などのプログラムから直接ファイルを操作できる。定期バックアップ、画像処理パイプライン、ファイル管理の自動化といった用途に使える。

S3互換APIとは

Amazon S3(Simple Storage Service)は、AWSが提供するオブジェクトストレージサービスだ。そのAPIが事実上の業界標準として普及しており、AWS以外の多くのクラウドストレージサービスがS3と同じAPIエンドポイントとリクエスト形式を実装している。これを「S3互換API」と呼ぶ。

S3互換APIの特徴:

  • AWS SDKやサードパーティライブラリをそのまま使える
  • エンドポイントURLを変えるだけで接続先を切り替えられる
  • オブジェクトのアップロード・ダウンロード・削除・一覧取得が標準化されている
  • 署名付きURL(Presigned URL)でアクセス制御が可能

HStorageもS3互換APIを提供しており、AWS SDK v3やboto3、MinIO Clientなど既存のS3クライアントライブラリからそのまま接続できる。

S3互換APIでクラウドストレージをプログラムから操作する

HStorageの接続情報を確認する

プログラムから接続するには、以下の情報が必要だ。HStorageのダッシュボード → 「設定」→「API」から確認できる。

項目
エンドポイント https://s3.hstorage.io
アクセスキーID ダッシュボードで生成
シークレットアクセスキー ダッシュボードで生成
リージョン eu-central-1
バケット名 HStorageアカウントのバケット

アクセスキーはAPIキー管理画面で新規作成できる。権限は「読み取り専用」「読み書き」「管理者」から選択できるため、用途に合わせて必要最小限の権限を付与する。

Pythonからアクセスする(boto3)

PythonでS3を操作するならboto3が定番だ。インストールから始める。

pip install boto3

HStorageへの接続設定は、エンドポイントURLを指定するだけでよい。

import boto3
from botocore.config import Config

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.hstorage.io",
    aws_access_key_id="your-access-key-id",
    aws_secret_access_key="your-secret-access-key",
    region_name="eu-central-1",
    config=Config(signature_version="s3v4"),
)

ファイルをアップロードする

# ローカルファイルをアップロード
s3.upload_file(
    Filename="/path/to/local/file.jpg",
    Bucket="your-bucket",
    Key="photos/2026/file.jpg",
)
print("アップロード完了")

Keyはオブジェクトの保存パスだ。スラッシュで区切るとフォルダ階層に見えるが、S3の内部ではフラットなオブジェクトキーとして扱われる。

ファイルをダウンロードする

s3.download_file(
    Bucket="your-bucket",
    Key="photos/2026/file.jpg",
    Filename="/path/to/save/file.jpg",
)

バケット内のオブジェクト一覧を取得する

response = s3.list_objects_v2(
    Bucket="your-bucket",
    Prefix="photos/2026/",  # プレフィックスで絞り込み
)

for obj in response.get("Contents", []):
    print(obj["Key"], obj["Size"], obj["LastModified"])

Prefixを指定すると特定フォルダ配下のファイルだけを取得できる。

ファイルを削除する

s3.delete_object(
    Bucket="your-bucket",
    Key="photos/2026/file.jpg",
)

Node.jsからアクセスする(AWS SDK v3)

Node.jsではAWS SDK v3を使う。モジュール化されていてTreeShakingが効くため、必要なコマンドだけをインポートできる。

npm install @aws-sdk/client-s3

接続クライアントを作成する。

import { S3Client, PutObjectCommand, GetObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
import { createReadStream } from "fs";

const s3 = new S3Client({
  endpoint: "https://s3.hstorage.io",
  region: "eu-central-1",
  credentials: {
    accessKeyId: "your-access-key-id",
    secretAccessKey: "your-secret-access-key",
  },
  forcePathStyle: true, // S3互換サービスでは必須
});

forcePathStyle: trueはAWS以外のS3互換サービスに接続するときに必要な設定だ。

ファイルをアップロードする

const uploadFile = async (localPath, bucketKey) => {
  const fileStream = createReadStream(localPath);
  
  await s3.send(new PutObjectCommand({
    Bucket: "your-bucket",
    Key: bucketKey,
    Body: fileStream,
  }));
  
  console.log(`アップロード完了: ${bucketKey}`);
};

await uploadFile("./report.pdf", "reports/2026-04/report.pdf");

ファイル一覧を取得する

const listFiles = async (prefix = "") => {
  const response = await s3.send(new ListObjectsV2Command({
    Bucket: "your-bucket",
    Prefix: prefix,
  }));
  
  return response.Contents ?? [];
};

const files = await listFiles("reports/");
files.forEach(f => console.log(f.Key, f.Size));

S3 APIを使ったコードインテグレーション例

Goからアクセスする(AWS SDK v2)

GoではAWS SDK v2が標準的な選択肢だ。

go get github.com/aws/aws-sdk-go-v2
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/service/s3
package main

import (
    "context"
    "fmt"
    "os"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func newS3Client() *s3.Client {
    return s3.NewFromConfig(aws.Config{
        Region: "eu-central-1",
        Credentials: credentials.NewStaticCredentialsProvider(
            "your-access-key-id",
            "your-secret-access-key",
            "",
        ),
        BaseEndpoint: aws.String("https://s3.hstorage.io"),
    }, func(o *s3.Options) {
        o.UsePathStyle = true
    })
}

func uploadFile(ctx context.Context, client *s3.Client, localPath, key string) error {
    f, err := os.Open(localPath)
    if err != nil {
        return fmt.Errorf("ファイルオープン失敗: %w", err)
    }
    defer f.Close()

    _, err = client.PutObject(ctx, &s3.PutObjectInput{
        Bucket: aws.String("your-bucket"),
        Key:    aws.String(key),
        Body:   f,
    })
    return err
}

署名付きURL(Presigned URL)で一時的なアクセスを許可する

署名付きURLを使うと、認証なしで特定ファイルへの一時アクセスを許可できる。ファイルをメールやチャットで共有するときに便利だ。

Pythonの例:

from datetime import timedelta

# 1時間有効なダウンロードURLを生成
url = s3.generate_presigned_url(
    ClientMethod="get_object",
    Params={
        "Bucket": "your-bucket",
        "Key": "documents/report.pdf",
    },
    ExpiresIn=3600,  # 秒単位
)
print(url)

生成されたURLは、ブラウザやcurlで直接アクセスできる。有効期限が切れると403エラーになる。

実用的な活用パターン

夜間バッチでログファイルをアップロードする

サーバーのログを毎晩自動でクラウドに退避させる。

import boto3
import glob
from datetime import date

s3 = boto3.client("s3", endpoint_url="https://s3.hstorage.io", ...)

today = date.today().isoformat()
for log_file in glob.glob("/var/log/app/*.log"):
    filename = log_file.split("/")[-1]
    s3.upload_file(
        Filename=log_file,
        Bucket="your-bucket",
        Key=f"logs/{today}/{filename}",
    )

crontabに追加すれば毎日自動で実行される。

画像処理パイプラインと組み合わせる

Webアプリからアップロードされた画像をリサイズしてからクラウドに保存する。

from PIL import Image
import io

def process_and_upload(image_path, key):
    with Image.open(image_path) as img:
        img.thumbnail((1200, 1200))
        buffer = io.BytesIO()
        img.save(buffer, format="JPEG", quality=85)
        buffer.seek(0)
    
    s3.put_object(
        Bucket="your-bucket",
        Key=key,
        Body=buffer,
        ContentType="image/jpeg",
    )

マルチパートアップロードで大容量ファイルを転送する

boto3のupload_fileメソッドはデフォルトでマルチパートアップロードを使う。100MB以上のファイルは自動的に分割して並列転送される。閾値や並列数を変えたい場合はTransferConfigで調整できる。

from boto3.s3.transfer import TransferConfig

config = TransferConfig(
    multipart_threshold=50 * 1024 * 1024,  # 50MB以上でマルチパート
    max_concurrency=10,                      # 並列スレッド数
    multipart_chunksize=10 * 1024 * 1024,   # 10MBずつ分割
)

s3.upload_file(
    Filename="/path/to/large-file.zip",
    Bucket="your-bucket",
    Key="archives/large-file.zip",
    Config=config,
)

アクセスキーの管理について

プログラムにアクセスキーをハードコードしてはいけない。環境変数や設定ファイルで管理する。

import os

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.hstorage.io",
    aws_access_key_id=os.environ["HSTORAGE_ACCESS_KEY_ID"],
    aws_secret_access_key=os.environ["HSTORAGE_SECRET_ACCESS_KEY"],
)

.envファイルを使う場合はpython-dotenvライブラリが便利だ。GitHubなどにコードを公開するときに、誤ってキーを含めないよう.gitignore.envを追加しておく。

S3互換APIで広がる活用範囲

設定に必要なのはエンドポイントURLとアクセスキーだけだ。既存のAWS SDKやboto3がそのままHStorageに向けられる。

定期バックアップ、画像処理パイプライン、ログ収集など、手動では続けにくいファイル操作をプログラムに任せてほしい。

APIキー管理や料金プランの詳細は hstorage.io で確認できる。