Closed5

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

not75743not75743

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

not75743not75743

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
not75743not75743

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

not75743not75743

動かす

うまくいった

$ 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ヶ月前にクローズされました