Closed5
【golang】minioをVirtual Hosted Styleで利用する

s3と同じ様にVirtual Hosted Styleをminioでも利用したい
以下参考にさせて下さい

s3では
path style
path_style
package main
import (
"fmt"
"io"
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
// AWS リージョンを設定
region := "ap-northeast-1" // 適切なリージョンに変更してください
// パススタイルを使用するためのセッション設定
sess, err := session.NewSession(&aws.Config{
Region: aws.String(region),
S3ForcePathStyle: aws.Bool(true), // パススタイルを強制
})
if err != nil {
log.Fatalf("Failed to create session: %v", err)
}
// S3クライアントを作成
svc := s3.New(sess)
// S3のバケット名とオブジェクトキー
bucketName := "golang-s3-test"
objectKey := "test.png"
// オブジェクトを取得
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
})
if err != nil {
log.Fatalf("Failed to get object: %v", err)
}
defer resp.Body.Close()
// ローカルにファイルを保存
outFile, err := os.Create("path_style_test.png")
if err != nil {
log.Fatalf("Failed to create file: %v", err)
}
defer outFile.Close()
// S3オブジェクトの内容をファイルにコピー
bytesWritten, err := io.Copy(outFile, resp.Body)
if err != nil {
log.Fatalf("Failed to write file: %v", err)
}
fmt.Printf("Downloaded %d bytes using path-style access\n", bytesWritten)
// 使用したURLの形式を表示
endpoint := fmt.Sprintf("https://s3.%s.amazonaws.com/%s/%s", region, bucketName, objectKey)
fmt.Printf("Path-style URL format: %s\n", endpoint)
}
virtualhost style
virtualhost
package main
import (
"fmt"
"io"
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
// AWS リージョンを設定
region := "ap-northeast-1" // 適切なリージョンに変更してください
// 仮想ホストスタイルを使用するためのセッション設定
sess, err := session.NewSession(&aws.Config{
Region: aws.String(region),
S3ForcePathStyle: aws.Bool(false), // 仮想ホストスタイルを使用(デフォルト)
})
if err != nil {
log.Fatalf("Failed to create session: %v", err)
}
// S3クライアントを作成
svc := s3.New(sess)
// S3のバケット名とオブジェクトキー
bucketName := "golang-s3-test"
objectKey := "test.png"
// オブジェクトを取得
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
})
if err != nil {
log.Fatalf("Failed to get object: %v", err)
}
defer resp.Body.Close()
// ローカルにファイルを保存
outFile, err := os.Create("virtual_host_style_test.png")
if err != nil {
log.Fatalf("Failed to create file: %v", err)
}
defer outFile.Close()
// S3オブジェクトの内容をファイルにコピー
bytesWritten, err := io.Copy(outFile, resp.Body)
if err != nil {
log.Fatalf("Failed to write file: %v", err)
}
fmt.Printf("Downloaded %d bytes using virtual host-style access\n", bytesWritten)
// 使用したURLの形式を表示
endpoint := fmt.Sprintf("https://%s.s3.%s.amazonaws.com/%s", bucketName, region, objectKey)
fmt.Printf("Virtual host-style URL format: %s\n", endpoint)
}

minioでは
path style
path
package main
import (
"fmt"
"io"
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
// MinIOのエンドポイントとアクセス情報を設定
endpoint := "http://localhost:9000"
accessKeyID := "minio"
secretAccessKey := "minio123"
// パススタイルを使用するためのセッション設定
sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String(endpoint),
Region: aws.String("us-east-1"), // MinIOではリージョンは重要ではない
Credentials: credentials.NewStaticCredentials(accessKeyID, secretAccessKey, ""),
DisableSSL: aws.Bool(true), // HTTPを使用するため
S3ForcePathStyle: aws.Bool(true), // パススタイルを強制
})
if err != nil {
log.Fatalf("Failed to create session: %v", err)
}
// S3クライアントを作成
svc := s3.New(sess)
// S3のバケット名とオブジェクトキー
bucketName := "golang-s3-test"
objectKey := "test.png"
// オブジェクトを取得
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
})
if err != nil {
log.Fatalf("Failed to get object: %v", err)
}
defer resp.Body.Close()
// ローカルにファイルを保存
outFile, err := os.Create("path_style_test.png")
if err != nil {
log.Fatalf("Failed to create file: %v", err)
}
defer outFile.Close()
// S3オブジェクトの内容をファイルにコピー
bytesWritten, err := io.Copy(outFile, resp.Body)
if err != nil {
log.Fatalf("Failed to write file: %v", err)
}
fmt.Printf("Downloaded %d bytes using path-style access\n", bytesWritten)
// 使用したURLの形式を表示
urlFormat := fmt.Sprintf("%s/%s/%s", endpoint, bucketName, objectKey)
fmt.Printf("Path-style URL format: %s\n", urlFormat)
}
$ go run path_style.go
Downloaded 1003 bytes using path-style access
Path-style URL format: http://localhost:9000/golang-s3-test/test.png

nip.ioを使ってvirtualhost style
minio virtualhost
docker-compose.yaml
golang
minio:
environment:
+ MINIO_DOMAIN: minio.127.0.0.1.nip.io
host_style.go
package main
import (
"fmt"
"io"
"log"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func main() {
// MinIOのエンドポイントとアクセス情報を設定
endpoint := "http://minio.127.0.0.1.nip.io:9000"
accessKeyID := "minio"
secretAccessKey := "minio123"
// 仮想ホストスタイルを使用するためのセッション設定
sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String(endpoint),
Region: aws.String("us-east-1"), // MinIOではリージョンは重要ではない
Credentials: credentials.NewStaticCredentials(accessKeyID, secretAccessKey, ""),
DisableSSL: aws.Bool(true), // HTTPを使用するため
S3ForcePathStyle: aws.Bool(false), // 仮想ホストスタイルを使用
})
if err != nil {
log.Fatalf("Failed to create session: %v", err)
}
// S3クライアントを作成
svc := s3.New(sess)
// S3のバケット名とオブジェクトキー
bucketName := "golang-s3-test"
objectKey := "test.png"
// オブジェクトを取得
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
})
if err != nil {
log.Fatalf("Failed to get object: %v", err)
}
defer resp.Body.Close()
// ローカルにファイルを保存
outFile, err := os.Create("virtual_host_style_test.png")
if err != nil {
log.Fatalf("Failed to create file: %v", err)
}
defer outFile.Close()
// S3オブジェクトの内容をファイルにコピー
bytesWritten, err := io.Copy(outFile, resp.Body)
if err != nil {
log.Fatalf("Failed to write file: %v", err)
}
fmt.Printf("Downloaded %d bytes using virtual host-style access\n", bytesWritten)
// 使用したURLの形式を表示
urlFormat := fmt.Sprintf("http://%s.localhost:9000/%s", bucketName, objectKey)
fmt.Printf("Virtual host-style URL format: %s\n", urlFormat)
}

動かす
うまくいった
$ go run host_style.go
Downloaded 1003 bytes using virtual host-style access
Virtual host-style URL format: http://golang-s3-test.localhost:9000/test.png
docker-compoes.yamlでMINIO_DOMAINを指定しない場合
バケット名を取得出来ない
$ go run host_style.go
2025/04/28 08:09:06 Failed to get object: NoSuchBucket: The specified bucket does not exist
status code: 404, request id: 183A6D15D2FE59DB, host id: dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8
exit status 1
このスクラップは4ヶ月前にクローズされました