wasabiは、NTTPCコミュニケーションズが提供するクラウドをベースとするストレージサービスです。このwasabiは、S3と互換があるので、awsが提供するSDKを使って、一部ポイントのみ注意することで簡単に利用することができるので、紹介します。

Wasabiって何?

Wasabiは、AmazonS3互換なオブジェクトストレージです。
のwebarenavpsを利用しているが、[AmazonS3互換かつ低価格な、Wasabiオブジェクトストレージ]の無料キャンペーンがあったので、Wasabiを使ってみた。

  • S3互換である。
  • ブラウザを利用してファイルのアップロード・削除等の操作が可能である。
  • No Fees for Egressである。(出ていくときの料金がかからない)

S3互換であるということは

aws s3と互換があるということは、aws s3向けに行った開発コードを利用できるということです。awsを利用してシステム開発を行ったことがある人は、よく理解していると思いますが、S3は頻繁に利用します。aws s3に保存していて、そのコストがかかっている場合は、その部分だけでも気軽に置き換えることができます。

サンプルコード

まずは、AWSでS3にある”xxxx.json”というファイルを表すオブジェクトを取得し、その中身を表示するサンプルコードから紹介します。言語は、golangを利用します。

package main

import (
	"fmt"
	"io/ioutil"
	"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"
)

var (
	awsAccessKey = os.Getenv("ACCESS_KEY")
	awsSecretKey = os.Getenv("SECRET_KEY")
	region = os.Getenv("REGION")
	buecktName = os.Getenv("BUCKET_NAME")
)

func main() {
	log.Printf("%v", region)
	bucket := aws.String(buecktName)
	key := aws.String("xxxx.json")

	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String(region),
		Credentials: credentials.NewStaticCredentials(
			awsAccessKey, awsSecretKey, "",
		),
	}))
	s3Client := s3.New(sess)

	// Get Object
	obj, err := s3Client.GetObject(&s3.GetObjectInput{ Bucket: bucket, Key: key, })
	if err != nil {
		fmt.Println("Failed to download file", err)
		return
	}

	resp := obj.Body
	defer resp.Close()

	b, err := ioutil.ReadAll(resp)
	if err != nil {
		fmt.Println("failed %v", err)
		return
	}
	fmt.Printf("%v", string(b))
}

簡単に行っている処理は、下記の通りです。 

  1. アクセスキー、シークレットキー、リージョンを使って、S3へアクセスするための、セッションを作成します。 
  2. セッションを引数にして、S3操作用のクライアントを生成します。
  3. GetObject()をコールして、対象となるキー(“xxxx.json”)のオブジェクトを取得します。

次にwasabiが提供するバケットへアクセスするコードです。
こちらのバケットは、リージョンが”ap-northeast-1″を想定したコードになっています。

package main

import (
	"fmt"
	"io/ioutil"
	"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"
)

var (
	wasabiAccessKey = os.Getenv("WASABI_ACCESS_KEY")
	wasabiSecretKey = os.Getenv("WASABI_SECRET_KEY")
	region = os.Getenv("REGION")
	buecktName = os.Getenv("BUCKET_NAME")
)


func main() {
	log.Printf("%v", region)
	bucket := aws.String(buecktName)
	key := aws.String("index.html")

	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String(region),
		Credentials: credentials.NewStaticCredentials(
			wasabiAccessKey, wasabiSecretKey, "",
		),
		Endpoint: aws.String("https://s3.ap-northeast-1.wasabisys.com"),
	}))
	s3Client := s3.New(sess)

	// Get Object
	obj, err := s3Client.GetObject(&s3.GetObjectInput{ Bucket: bucket, Key: key, })
	if err != nil {
		fmt.Println("Failed to download file", err)
		return
	}

	resp := obj.Body
	defer resp.Close()

	b, err := ioutil.ReadAll(resp)
	if err != nil {
		fmt.Println("failed %v", err)
		return
	}
	fmt.Printf("%v", string(b))
}

違いは、ほとんどありません。1.のアクセスキー、シークレット、リージョンを指定する際にEndpointを追加する程度です。それ以外は、そのまま利用できます。非常に使いやすいです。

各エンドポイントについて、こちらを参照して下さい。

まとめ

今回は、S3互換であるwasabiをAWS SDK For goで利用する方法について、紹介しました。S3互換であることがうたわれているだけあって、AWS SDKによるプログラミングになれている方にとっては、触りやすい?ほぼ違いを感じない印象を感じました。ストレージのコストは馬鹿にならないことが多いので、今後はもっと利用機会が増えると思います。お疲れ様でした。