The Go Blog

Go Cloudによるポータブルクラウドプログラミング

Eno ComptonとCassandra Salisbury
2018年7月24日

はじめに

本日、GoogleのGoチームは、Go Cloudという新しいオープンソースプロジェクトをリリースします。これは、オープン クラウドで開発するためのライブラリとツールです。このプロジェクトにより、ポータブルなクラウドアプリケーションを構築する開発者にとってGoが最適な言語になることを目指しています。

この記事では、このプロジェクトを開始した理由、Go Cloudの仕組みの詳細、そして参加方法について説明します。

なぜポータブルクラウドプログラミングなのか? なぜ今なのか?

現在、世界中に100万人以上のGo開発者がいると推定しています。Goは、Kubernetes、Istio、Dockerなど、最も重要なクラウドインフラストラクチャプロジェクトの多くを支えています。Lyft、Capital One、Netflixなどの企業、そしてその他多くの企業が本番環境でGoに依存しています。長年にわたり、開発者はGoの効率性、生産性、組み込みの並行性、低レイテンシのために、クラウド開発にGoを愛用していることがわかりました。

Goの急速な成長をサポートする取り組みの一環として、Goを使用しているチームにインタビューを行い、言語の使用方法やGoエコシステムをさらに改善する方法について理解を深めてきました。多くの組織に共通するテーマの1つは、クラウドプロバイダー間の移植性です。これらのチームは、マルチクラウドおよびハイブリッドクラウド環境に堅牢なアプリケーションをデプロイし、コードに大きな変更を加えることなく、クラウドプロバイダー間でワークロードを移行したいと考えています。

これを達成するために、一部のチームは、よりシンプルで移植性の高いコードを作成するために、アプリケーションをプロバイダー固有のAPIから分離しようとします。しかし、機能を提供するという短期的なプレッシャーにより、チームは移植性に向けた長期的な努力を犠牲にすることがよくあります。その結果、クラウドで実行されているほとんどのGoアプリケーションは、最初のクラウドプロバイダーと密接に結びついています。

代替手段として、チームはオープンな汎用クラウドAPIのセットであるGo Cloudを使用して、よりシンプルで移植性の高いクラウドアプリケーションを作成できます。Go Cloudはまた、これらの汎用APIの上に構築されるポータブルクラウドライブラリのエコシステムの基盤を築きます。Go Cloudを使用すると、チームは機能開発の目標を達成しながら、マルチクラウドおよびハイブリッドクラウドアーキテクチャの長期的な柔軟性を維持できます。また、Go Cloudアプリケーションは、ニーズに最適なクラウドプロバイダーに移行することもできます。

Go Cloudとは何ですか?

クラウドアプリケーションで使用される一般的なサービスを特定し、クラウドプロバイダー間で動作する汎用APIを作成しました。本日、Go Cloudは、BLOBストレージ、MySQLデータベースアクセス、ランタイム構成、およびリクエストロギング、トレース、ヘルスチェックで構成されたHTTPサーバーのサポートを開始します。Go Cloudは、Google Cloud Platform(GCP)とAmazon Web Services(AWS)をサポートしています。まもなく、クラウド業界のパートナーやGoコミュニティと協力して、他のクラウドプロバイダーのサポートを追加する予定です。

Go Cloudは、クラウドプロバイダー全体で最もよく使用されるサービスのベンダーに依存しない汎用APIを開発することを目指しており、別のクラウドにGoアプリケーションをデプロイすることをシンプルかつ容易にします。また、Go Cloudは、他のオープンソースプロジェクトがプロバイダー間で動作するクラウドライブラリを作成するための基盤を築きます。あらゆるレベルのあらゆるタイプの開発者からのコミュニティからのフィードバックは、Go Cloudの将来のAPIの優先順位付けに役立ちます.

どのように動作しますか?

Go Cloudの中核となるのは、ポータブルクラウドプログラミングのための汎用APIのコレクションです。BLOBストレージを使用する例を見てみましょう。汎用タイプ*blob.Bucketを使用して、ファイルをローカルディスクからクラウドプロバイダーにコピーできます。付属のs3blobパッケージを使用してS3バケットを開くことから始めましょう。

// setupBucket opens an AWS bucket.
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
    // Obtain AWS credentials.
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-2"),
    })
    if err != nil {
        return nil, err
    }
    // Open a handle to s3://go-cloud-bucket.
    return s3blob.OpenBucket(ctx, sess, "go-cloud-bucket")
}

プログラムに*blob.Bucketがあれば、io.Writerを実装する*blob.Writerを作成できます。そこから、プログラムは*blob.Writerを使用してバケットにデータを書き込み、Closeがエラーを報告しないことを確認できます。

ctx := context.Background()
b, err := setupBucket(ctx)
if err != nil {
    log.Fatalf("Failed to open bucket: %v", err)
}
data, err := ioutil.ReadFile("gopher.png")
if err != nil {
    log.Fatalf("Failed to read file: %v", err)
}
w, err := b.NewWriter(ctx, "gopher.png", nil)
if err != nil {
    log.Fatalf("Failed to obtain writer: %v", err)
}
_, err = w.Write(data)
if err != nil {
    log.Fatalf("Failed to write to bucket: %v", err)
}
if err := w.Close(); err != nil {
    log.Fatalf("Failed to close: %v", err)
}

バケットを使用するロジックがAWS S3を参照していないことに注目してください。Go Cloudでは、*blob.Bucketを開くために使用される関数を変更することで、クラウドストレージを交換できます。代わりに、アプリケーションはgcsblob.OpenBucketを使用して*blob.Bucketを構築することで、ファイルをコピーするコードを変更せずにGoogle Cloud Storageを使用できます。

// setupBucket opens a GCS bucket.
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
    // Open GCS bucket.
    creds, err := gcp.DefaultCredentials(ctx)
    if err != nil {
        return nil, err
    }
    c, err := gcp.NewHTTPClient(gcp.DefaultTransport(), gcp.CredentialsTokenSource(creds))
    if err != nil {
        return nil, err
    }
    // Open a handle to gs://go-cloud-bucket.
    return gcsblob.OpenBucket(ctx, "go-cloud-bucket", c)
}

異なるクラウドプロバイダーのバケットにアクセスするには異なる手順が必要ですが、アプリケーションで使用される結果のタイプは同じです:*blob.Bucket。これは、アプリケーションコードをクラウド固有のコードから分離します。既存のGoライブラリとの相互運用性を高めるために、Go Cloudはio.Writerio.Reader*sql.DBなどの確立されたインターフェースを活用しています。

クラウドサービスにアクセスするために必要なセットアップコードは、パターンに従う傾向があります。より高い抽象化は、より基本的な抽象化から構築されます。このコードを手書きすることもできますが、Go Cloudはクラウド固有のセットアップコードを生成するツールである**Wire**でこれを自動化します。Wireのドキュメントでは、ツールのインストール方法と使用方法について説明しており、ゲストブックのサンプルでは、Wireの動作を確認できます。

どのように参加して詳細を学ぶことができますか?

開始するには、チュートリアルに従って、自分でアプリケーションを構築してみることをお勧めします。すでにAWSまたはGCPを使用している場合は、既存のアプリケーションの一部をGo Cloudを使用するように移行してみてください。別のクラウドプロバイダーまたはオンプレミスサービスを使用している場合は、driver.Bucketなどのドライバインターフェースを実装することで、Go Cloudを拡張してサポートできます。

私たちはあなたの経験についてのご意見を歓迎します。Go Cloudの開発はGitHubで行われています。プルリクエストを含むコントリビューションをお待ちしております。 issueを提出して、改善点やプロジェクトがサポートする必要がある将来のAPIについてお知らせください。プロジェクトの更新とディスカッションについては、プロジェクトのメーリングリストに参加してください。

このプロジェクトでは、コントリビューターはGoプロジェクトと同じコントリビューターライセンス契約に署名する必要があります。詳細については、コントリビューションガイドラインをお読みください。Go CloudはGoの行動規範の対象となります。

Go Cloudについてお時間をいただき、ありがとうございました。ポータブルクラウドアプリケーションを構築する開発者にとってGoが最適な言語になるよう、皆様と協力できることを嬉しく思います。

次の記事:Go 1.11がリリースされました
前の記事:Goを使いこなす:Goのガベージコレクターの旅
ブログインデックス