S3
A storage/driver/s3 a production driver: egy S3-kompatibilis Driver, minio-go-ra építve. Ez egy külön Go modul, nem a gyökér storage modul alcsomagja: saját go.mod-ja és saját verziója van, mert behúzza a minio-go-t mint valódi függőséget, és ezt a súlyt csak azoknak a projekteknek kell viselniük, amelyek ténylegesen S3-mal beszélnek. A storage minden más része (Disk, Manager, a dekorátorok, storage/memory, storage/local) nem is tud erről a modulról.
Telepítés
go get github.com/gp-system/storage/driver/s3@latest
Ez a gyökér github.com/gp-system/storage-tól függetlenül verziózott: a gyökér modul emelése nem igényli ennek emelését, és fordítva sem. Mindkettő kell a go.mod-ba, mivel a driver a gyökér modul típusait importálja (Driver, FileInfo és társaik).
Konfiguráció
import "github.com/gp-system/storage/driver/s3"
cfg := s3.Config{ /* ... */ }
driver, err := s3.New(cfg)
disk := storage.NewDisk(driver, storage.WithName("s3"))
Az s3.Config-ot S3_ prefixszel komponálod a projekt configjába, ugyanúgy, ahogy bármely gpsystem modul configja komponálódik:
type Config struct {
// ...
Storage s3.Config `envPrefix:"S3_"`
}
| Változó | Default | Jelentés |
|---|---|---|
S3_ENDPOINT | kötelező | a szolgáltatás címe (s3.amazonaws.com, egy MinIO host, ...) |
S3_REGION | us-east-1 | |
S3_BUCKET | kötelező | |
S3_ACCESS_KEY / S3_SECRET_KEY | üres | hitelesítő adatok az endpointhoz |
S3_USE_PATH_STYLE | false | true a legtöbb self-hosted S3-hoz (/bucket/key címzés a virtual-host-stílus helyett) |
S3_PUBLIC_BASE_URL | üres | a Disk.URL alapja (egy CDN, vagy a bucket saját publikus endpointja) |
A teljes lista a konfiguráció-referenciában.
Nem csak AWS
Mivel a driver minio-go-ra épül, nem az AWS SDK-ra, bármilyen az S3 API-t implementáló szolgáltatással beszél, nem csak magával az AWS-szel: az AWS S3, a MinIO, a RustFS, a Cloudflare R2 és a Backblaze B2 mind működik ugyanaz az s3.Config mögött, jellemzően csak az S3_ENDPOINT és az S3_USE_PATH_STYLE megfelelő beállításával. Egy new project-tel generált projekt már eleve futtat egy self-hosted, S3-kompatibilis rustfs service-t a dev compose.yml-jében, így a helyi fejlesztéshez sosem kellenek valódi AWS-hitelesítő adatok.
// a Client egy escape hatch mindenhez, amit a Driver interfész nem tesz elérhetővé
client := driver.Client() // *minio.Client
bucket := driver.Bucket() // a konfigurált bucket neve
Az s3.New opciókat is elfogad; a WithTransport(http.RoundTripper) lehetővé teszi az alatta lévő HTTP transport cseréjét, hasznos egyedi TLS-konfigurációhoz vagy saját OTel-instrumentált transport injektálásához.
Presigned URL-ek
A TemporaryURL és a TemporaryUploadURL a minio-go natív presigningjével implementált (PresignedGetObject/PresignedPutObject): a visszaadott URL közvetlenül az S3-kompatibilis endpointra mutat, így a kliens úgy tölt le vagy fel, hogy a kérés egyáltalán nem megy át a service-eden. Ez ugyanaz a Driver szerződés, amit minden más driver implementál, így a disk.TemporaryURL(...)-t hívó kód nem tudja és nem is érdekli, hogy S3-mal beszél, nem a helyi driver HMAC-aláírt linkjeivel.
Önálló példa
package main
import (
"context"
"log"
"strings"
"time"
"github.com/gp-system/storage"
"github.com/gp-system/storage/driver/s3"
)
func main() {
driver, err := s3.New(s3.Config{
Endpoint: "localhost:9000",
Region: "us-east-1",
Bucket: "uploads",
AccessKey: "minioadmin",
SecretKey: "minioadmin",
UsePathStyle: true,
PublicBaseURL: "http://localhost:9000/uploads",
})
if err != nil {
log.Fatal(err)
}
disk := storage.NewDisk(driver, storage.WithName("s3"))
ctx := context.Background()
if err := disk.Put(ctx, "hello.txt", strings.NewReader("hello, s3"), storage.PutOptions{}); err != nil {
log.Fatal(err)
}
signed, err := disk.TemporaryURL(ctx, "hello.txt", storage.TemporaryURLOptions{TTL: 15 * time.Minute})
if err != nil {
log.Fatal(err)
}
log.Println("presigned link:", signed)
}
Kapcsolódó oldalak
- Áttekintés: a Driver/Disk/Manager modell, amibe ez a driver illeszkedik.
- Disk API: a metódusok, amiket a
Diskbármilyen driveren, így ezen is elérhetővé tesz. - Memória és helyi lemez: a driverek teszthez és egy-node-os telepítéshez.
- Tesztelés: futtasd a konformancia-suite-ot a saját S3-kompatibilis endpointod ellen.
- Külső függőségek: a minio-go verzió, amit ez a driver pinel.