The Go Blog
Go Cloudでポータブルなクラウドプログラミング
はじめに
本日、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はブロブストレージ、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.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.Writer、io.Reader、*sql.DBなどの確立されたインターフェースを活用しています。
クラウドサービスにアクセスするために必要なセットアップコードは、パターンに従う傾向があります。より基本的な抽象化からより高い抽象化が構築されます。このコードは手で記述することもできますが、Go Cloudは、クラウド固有のセットアップコードを生成するツールであるWireを使用してこれを自動化します。Wireのドキュメントでは、ツールのインストール方法と使用方法が説明されており、GuestbookのサンプルではWireの動作が示されています。
どうすれば参加してさらに学ぶことができますか?
始めるには、チュートリアルに従うことをお勧めします。その後、自分でアプリケーションを構築してみてください。すでにAWSまたはGCPを使用している場合は、既存のアプリケーションの一部をGo Cloudを使用するように移行してみることができます。異なるクラウドプロバイダーまたはオンプレミスサービスを使用している場合は、ドライバインターフェース(driver.Bucketなど)を実装することで、Go Cloudを拡張してそれをサポートできます。
皆様の経験に関するあらゆるご意見を高く評価いたします。Go Cloudの開発はGitHubで行われています。プルリクエストを含むご貢献をお待ちしております。課題を提出して、改善点やプロジェクトが将来サポートすべきAPIについてお知らせください。プロジェクトの更新と議論については、プロジェクトのメーリングリストにご参加ください。
このプロジェクトでは、貢献者にGoプロジェクトと同じ貢献者ライセンス契約への署名を求めます。詳細については、貢献ガイドラインをお読みください。Go CloudはGoの行動規範の対象となることに注意してください。
Go Cloudについて学んでいただきありがとうございます。Goをポータブルなクラウドアプリケーションを構築する開発者にとって第一の選択肢となる言語にするために、皆様と協力できることを楽しみにしています。
次の記事: Go 1.11がリリースされました
前の記事: Goへの道のり:Goのガベージコレクタの旅
ブログインデックス