クラウドストレージへのアクセスは、ブラウザやデスクトップアプリからだけではない。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クライアントライブラリからそのまま接続できる。

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));

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 で確認できる。