Portable Cloud Programming with Go Cloud
24 Jul 2018

Eno Compton

Cassandra Salisbury

* Introduction

Today, the Go team at Google is releasing a new open source project, [[https://github.com/google/go-cloud][Go Cloud]], a library and tools for developing on the [[https://cloud.google.com/open-cloud/][open cloud]]. With this project, we aim to make Go the language of choice for developers building portable cloud applications.

This post explains why we started this project, the details of how Go Cloud works, and how to get involved.

* Why portable cloud programming? Why now?

We estimate there are now [[https://research.swtch.com/gophercount][over one million]] Go developers worldwide. Go powers many of the most critical cloud infrastructure projects, including Kubernetes, Istio, and Docker. Companies like Lyft, Capital One, Netflix and [[https://github.com/golang/go/wiki/GoUsers][many more]] are depending on Go in production. Over the years, we've found that developers love Go for cloud development because of its efficiency, productivity, built-in concurrency, and low latency.

As part of our work to support Go's rapid growth, we have been interviewing teams who work with Go to understand how they use the language and how the Go ecosystem can improve further. One common theme with many organizations is the need for portability across cloud providers. These teams want to deploy robust applications in [[https://en.wikipedia.org/wiki/Cloud_computing#Multicloud][multi-cloud]] and [[https://en.wikipedia.org/wiki/Cloud_computing#Hybrid_cloud][hybrid-cloud]] environments, and migrate their workloads between cloud providers without significant changes to their code.

To achieve this, some teams attempt to decouple their applications from provider-specific APIs in order to produce simpler and more portable code. However the short-term pressure to ship features means teams often sacrifice longer-term efforts toward portability. As a result, most Go applications running in the cloud are tightly coupled to their initial cloud provider.

As an alternative, teams can use Go Cloud, a set of open generic cloud APIs, to write simpler and more portable cloud applications. Go Cloud also sets the foundation for an ecosystem of portable cloud libraries to be built on top of these generic APIs. Go Cloud makes it possible for teams to meet their feature development goals while also preserving the long-term flexibility for multi-cloud and hybrid-cloud architectures. Go Cloud applications can also migrate to the cloud providers that best meet their needs.

* What is Go Cloud?

We have identified common services used by cloud applications and have created generic APIs to work across cloud providers. Today, Go Cloud is launching with blob storage, MySQL database access, runtime configuration, and an HTTP server configured with request logging, tracing, and health checking. Go Cloud offers support for Google Cloud Platform (GCP) and Amazon Web Services (AWS). We plan to work with cloud industry partners and the Go community to add support for additional cloud providers very soon.

Go Cloud aims to develop vendor-neutral generic APIs for the most-used services across cloud providers such that deploying a Go application on another cloud is simple and easy. Go Cloud also lays the foundation for other open source projects to write cloud libraries that work across providers. Community feedback, from all types of developers at all levels, will inform the priority of future APIs in Go Cloud.

* How does it work?

At the core of Go Cloud is a collection of generic APIs for portable cloud programming. Let's look at an example of using blob storage. You can use the generic type [[https://godoc.org/github.com/google/go-cloud/blob#Bucket][`*blob.Bucket`]] to copy a file from a local disk to a cloud provider. Let's start by opening an S3 bucket using the included [[https://godoc.org/github.com/google/go-cloud/blob/s3blob][s3blob package]]:

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

Once a program has a `*blob.Bucket`, it can create a `*blob.Writer`, which implements `io.Writer`. From there, the program can use the `*blob.Writer` to write data to the bucket, checking that `Close` does not report an error.

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

Notice how the logic of using the bucket does not refer to AWS S3. Go Cloud makes swapping out cloud storage a matter of changing the function used to open the `*blob.Bucket`. The application could instead use Google Cloud Storage by constructing a `*blob.Bucket` using [[https://godoc.org/github.com/google/go-cloud/blob/gcsblob#OpenBucket][`gcsblob.OpenBucket`]] without changing the code that copies the file:

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

While different steps are needed to access buckets on different cloud providers, the resulting type used by your application is the same: `*blob.Bucket`. This isolates application code from cloud-specific code. To increase interoperability with existing Go libraries, Go Cloud leverages established interfaces like `io.Writer`, `io.Reader`, and `*sql.DB`.

The setup code needed to access cloud services tends to follow a pattern: higher abstractions are constructed from more basic abstractions. While you could write this code by hand, Go Cloud automates this with *Wire*, a tool that generates cloud-specific setup code for you. The [[https://github.com/google/go-cloud/tree/master/wire][Wire documentation]] explains how to install and use the tool and the [[https://github.com/google/go-cloud/tree/master/samples/guestbook][Guestbook sample]] shows Wire in action.

* How can I get involved and learn more?

To get started, we recommend following [[https://github.com/google/go-cloud/tree/master/samples/tutorial][the tutorial]] and then trying to build an application yourself. If you're already using AWS or GCP, you can try migrating parts of your existing application to use Go Cloud. If you're using a different cloud provider or an on-premise service, you can extend Go Cloud to support it by implementing the driver interfaces (like [[https://godoc.org/github.com/google/go-cloud/blob/driver#Bucket][`driver.Bucket`]]).

We appreciate any and all input you have about your experience. [[https://github.com/google/go-cloud][Go Cloud's]] development is conducted on GitHub. We are looking forward to contributions, including pull requests. [[https://github.com/google/go-cloud/issues/new][File an issue]] to tell us what could be better or what future APIs the project should support. For updates and discussion about the project, join [[https://groups.google.com/forum/#!forum/go-cloud][the project's mailing list]].

The project requires contributors to sign the same Contributor License Agreement as that of the Go project. Read the [[https://github.com/google/go-cloud/blob/master/CONTRIBUTING.md][contribution guidelines]] for more details. Please note, Go Cloud is covered by the Go [[https://github.com/google/go-cloud/blob/master/CODE_OF_CONDUCT.md][Code of Conduct]].

Thank you for taking the time to learn about Go Cloud. We are excited to work with you to make Go the language of choice for developers building portable cloud applications.
