| # Portable Cloud Programming with Go Cloud | 
 | 24 Jul 2018 | 
 | Summary: Announcing Go Cloud, for portable cloud programming with Go. | 
 |  | 
 | Eno Compton | 
 |  | 
 | Cassandra Salisbury | 
 |  | 
 | ## Introduction | 
 |  | 
 | Today, the Go team at Google is releasing a new open source project, | 
 | [Go Cloud](https://github.com/google/go-cloud), | 
 | a library and tools for developing on the [open cloud](https://cloud.google.com/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 [over one million](https://research.swtch.com/gophercount) | 
 | 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 [many more](https://github.com/golang/go/wiki/GoUsers) | 
 | 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 [multi-cloud](https://en.wikipedia.org/wiki/Cloud_computing#Multicloud) | 
 | and [hybrid-cloud](https://en.wikipedia.org/wiki/Cloud_computing#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 [`*blob.Bucket`](https://godoc.org/github.com/google/go-cloud/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 [s3blob package](https://godoc.org/github.com/google/go-cloud/blob/s3blob): | 
 |  | 
 | 	// 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 [`gcsblob.OpenBucket`](https://godoc.org/github.com/google/go-cloud/blob/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 [Wire documentation](https://github.com/google/go-cloud/tree/master/wire) | 
 | explains how to install and use the tool and the [Guestbook sample](https://github.com/google/go-cloud/tree/master/samples/guestbook) | 
 | shows Wire in action. | 
 |  | 
 | ## How can I get involved and learn more? | 
 |  | 
 | To get started, we recommend following [the tutorial](https://github.com/google/go-cloud/tree/master/samples/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 [`driver.Bucket`](https://godoc.org/github.com/google/go-cloud/blob/driver#Bucket)). | 
 |  | 
 | We appreciate any and all input you have about your experience. | 
 | [Go Cloud's](https://github.com/google/go-cloud) development is conducted on GitHub. | 
 | We are looking forward to contributions, including pull requests. | 
 | [File an issue](https://github.com/google/go-cloud/issues/new) to tell | 
 | us what could be better or what future APIs the project should support. | 
 | For updates and discussion about the project, | 
 | join [the project's mailing list](https://groups.google.com/forum/#!forum/go-cloud). | 
 |  | 
 | The project requires contributors to sign the same Contributor License Agreement | 
 | as that of the Go project. | 
 | Read the [contribution guidelines](https://github.com/google/go-cloud/blob/master/CONTRIBUTING.md) for more details. | 
 | Please note, Go Cloud is covered by the Go [Code of Conduct](https://github.com/google/go-cloud/blob/master/CODE_OF_CONDUCT.md). | 
 |  | 
 | 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. |