<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>How To on Atamel.Dev</title><link>https://atamel.dev/tags/how-to/</link><description>Recent content in How To on Atamel.Dev</description><generator>Hugo</generator><language>en</language><managingEditor>atamel@gmail.com (Mete Atamel)</managingEditor><webMaster>atamel@gmail.com (Mete Atamel)</webMaster><lastBuildDate>Fri, 21 Nov 2025 11:03:22 +0000</lastBuildDate><atom:link href="https://atamel.dev/tags/how-to/index.xml" rel="self" type="application/rss+xml"/><item><title>AsyncAPI gets a new version 3.0 and new operations</title><link>https://atamel.dev/posts/2024/05-13_asyncapi_30_send_receive/</link><pubDate>Mon, 13 May 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/05-13_asyncapi_30_send_receive/</guid><description>&lt;p&gt;Almost one year ago, I talked about &lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt; &lt;code&gt;2.6&lt;/code&gt; and
how confusing its &lt;code&gt;publish&lt;/code&gt; and &lt;code&gt;subscribe&lt;/code&gt; operations can be in my &lt;a href="https://atamel.dev/posts/2023/05-18_asyncapi_publishsubscribe_refactor"&gt;Understanding
AsyncAPI&amp;rsquo;s publish &amp;amp; subscribe semantics with an
example&lt;/a&gt; post.&lt;/p&gt;
&lt;p&gt;Since then, a new &lt;code&gt;3.0&lt;/code&gt; version of AsyncAPI has been released with breaking changes
and a totally new &lt;code&gt;send&lt;/code&gt; and &lt;code&gt;receive&lt;/code&gt; operations.&lt;/p&gt;
&lt;p&gt;In this blog post, I want to revisit the example from last year and show how to
rewrite it for AsyncAPI &lt;code&gt;3.0&lt;/code&gt; with the new &lt;code&gt;send&lt;/code&gt; and &lt;code&gt;receive&lt;/code&gt; operations.&lt;/p&gt;</description></item><item><title>Making API calls exactly once when using Workflows</title><link>https://atamel.dev/posts/2024/05-03_using-single-execution-calls-with-workflows/</link><pubDate>Fri, 03 May 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/05-03_using-single-execution-calls-with-workflows/</guid><description>&lt;p&gt;One challenge with any distributed system, including Workflows, is ensuring that requests sent from one service to another are processed exactly once, when needed; for example, when placing a customer order in a shipping queue, withdrawing funds from a bank account, or processing a payment.&lt;/p&gt;
&lt;p&gt;In this blog post, we’ll provide an example of a website invoking Workflows, and Workflows in turn invoking a Cloud Function. We’ll show how to make sure both Workflows and the Cloud Function logic only runs once. We’ll also talk about how to invoke Workflows exactly once when using HTTP callbacks, Pub/Sub messages, or Cloud Tasks.&lt;/p&gt;</description></item><item><title>Orchestrate Vertex AI’s PaLM and Gemini APIs with Workflows</title><link>https://atamel.dev/posts/2024/02-22_vertex-ai-palm-and-gemini-apis-using-workflows/</link><pubDate>Thu, 22 Feb 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/02-22_vertex-ai-palm-and-gemini-apis-using-workflows/</guid><description>&lt;p&gt;Everyone is excited about generative AI (gen AI) nowadays and rightfully so. You might be generating text with PaLM 2 or Gemini Pro, generating images with ImageGen 2, translating code from language to another with Codey, or describing images and videos with Gemini Pro Vision.&lt;/p&gt;
&lt;p&gt;No matter how you’re using gen AI, at the end of the day, you’re calling an endpoint either with an SDK or a library or via a REST API. Workflows, my go-to service to orchestrate and automate other services, is more relevant than ever when it comes to gen AI.&lt;/p&gt;</description></item><item><title>Announcing Workflows execution steps history</title><link>https://atamel.dev/posts/2024/01-20_announcing-workflows-execution-steps-history/</link><pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2024/01-20_announcing-workflows-execution-steps-history/</guid><description>&lt;p&gt;As you orchestrate more services with Workflows, the workflow gets more complicated with more steps, jumps, iterations, parallel branches. When the workflow execution inevitably fails at some point, you need to debug and figure out which step failed and why. So far, you only had an execution summary with inputs/outputs and logs to rely on in your execution debugging. While this was good enough for basic workflows, it didn&amp;rsquo;t provide step level debugging information.&lt;/p&gt;</description></item><item><title>Deploy and manage Kubernetes applications with Workflows</title><link>https://atamel.dev/posts/2023/12-01_use-workflows-to-deploy-and-manage-kubernetes/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/12-01_use-workflows-to-deploy-and-manage-kubernetes/</guid><description>&lt;p&gt;Workflows is a versatile service in orchestrating and automating a wide range of use cases: microservices, business processes, Data and ML pipelines, IT operations, and more. It can also be used to automate deployment of containerized applications on Kubernetes Engine (GKE) and this got even easier with the newly released (in preview) Kubernetes API Connector.&lt;/p&gt;
&lt;p&gt;The new Kubernetes API connector enables access to GKE services from Workflows and this in turn enables Kubernetes based resource management or orchestration, scheduled Kubernetes jobs, and more.&lt;/p&gt;</description></item><item><title>Introducing a new Eventarc destination - internal HTTP endpoint in a VPC network</title><link>https://atamel.dev/posts/2023/11-13_introduce_eventarc_internal_http_endpoint/</link><pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/11-13_introduce_eventarc_internal_http_endpoint/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/eventarc/docs"&gt;Eventarc&lt;/a&gt; helps users build
event-driven architectures without having to implement, customize, or maintain
the underlying infrastructure.&lt;/p&gt;
&lt;p&gt;Eventarc has added support (in public preview) for delivering events to internal
HTTP endpoints in a Virtual Private Cloud (VPC) network. Customers, especially
large enterprises, often run compute (typically GKE or GCE) on VPC-private IPs,
often behind internal load balancers. This launch will enable these services to
consume Eventarc events.&lt;/p&gt;
&lt;p&gt;Internal HTTP endpoints can be an &lt;a href="https://cloud.google.com/vpc/docs/ip-addresses"&gt;internal IP
address&lt;/a&gt; or &lt;a href="https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names"&gt;fully qualified DNS
name
(FQDN)&lt;/a&gt;
for any HTTP endpoint in the VPC network. Examples of destinations that can be
targeted via the internal HTTP endpoints include &lt;a href="https://cloud.google.com/compute/docs/ip-addresses"&gt;Compute Engine
VMs&lt;/a&gt; with internal IPs,
services fronted by an &lt;a href="https://cloud.google.com/load-balancing/docs/dns-names"&gt;L7 Internal Load
Balancer&lt;/a&gt;, &lt;a href="https://cloud.google.com/vpc/docs/configure-private-service-connect-services#list-endpoints"&gt;Private
Service Connect
endpoints&lt;/a&gt;,
&lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress#validate"&gt;Google Kubernetes Engine
Ingress&lt;/a&gt;,
&lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/service"&gt;Google Kubernetes Engine
Services&lt;/a&gt;,
&lt;a href="https://cloud.google.com/load-balancing/docs/l7-internal/setting-up-l7-internal-serverless"&gt;Cloud Run behind an internal Application Load
Balancer&lt;/a&gt;
and any destinations registered with Cloud DNS via &lt;a href="https://cloud.google.com/dns/docs/records-overview"&gt;DNS
record&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>What languages are supported in WebAssembly outside the browser?</title><link>https://atamel.dev/posts/2023/09-07_language_support_wasm/</link><pubDate>Thu, 07 Sep 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/09-07_language_support_wasm/</guid><description>&lt;p&gt;&lt;strong&gt;What languages are supported in WebAssembly running outside the browser?&lt;/strong&gt;
This is a question I often hear people ask. It’s has a complicated answer
because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;WebAssembly outside the browser needs &lt;a href="https://wasi.dev/"&gt;WASI&lt;/a&gt; and not all
languages have WASI support in their toolchain.&lt;/li&gt;
&lt;li&gt;Even if WASI is supported well in a language, WASI has its own limitations
that you need to take into account.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In short, you can’t take any code written in any language and expect to compile
and run it as a Wasm+Wasi module right now. Documentation on what’s supported
is patchy or misleading at times. Unfortunately, you often need to try things
out before knowing what works and what doesn’t.&lt;/p&gt;</description></item><item><title>Adding HTTP around Wasm with Wagi</title><link>https://atamel.dev/posts/2023/07-18_add_http_around_wasm_with_wagi/</link><pubDate>Tue, 18 Jul 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/07-18_add_http_around_wasm_with_wagi/</guid><description>&lt;p&gt;In my previous posts, I talked about how you can &lt;a href="https://atamel.dev/posts/2023/06-20_explore_wasm_outside_browser/"&gt;run WebAssembly (Wasm) outside
the browser with Wasi
&lt;/a&gt;and &lt;a href="https://atamel.dev/posts/2023/06-29_run_wasm_in_docker/"&gt;run it
in a Docker container with
runwasi&lt;/a&gt;. The
&lt;a href="https://wasi.dev/"&gt;Wasi&lt;/a&gt; specification allows Wasm modules access to things
like the filesystem and environment variables (and I showed how in &lt;a href="https://atamel.dev/posts/2023/06-26_compile_rust_go_wasm_wasi/"&gt;this blog
post&lt;/a&gt;) but
networking and threading are not implemented yet. This is severely limiting if
you want to run HTTP based microservices on Wasm for example.&lt;/p&gt;</description></item><item><title>Buffer workflow executions with a Cloud Tasks queue</title><link>https://atamel.dev/posts/2023/07-12_buffer-workflow-executions-with-a-cloud-tasks-queue/</link><pubDate>Wed, 12 Jul 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/07-12_buffer-workflow-executions-with-a-cloud-tasks-queue/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In my &lt;a href="https://cloud.google.com/blog/products/application-development/setup-parallel-task-execution-with-parent-and-child-workflows"&gt;previous
post&lt;/a&gt;,
I talked about how you can use a parent workflow to execute child workflows in
parallel for faster overall processing time and easier detection of errors.
Another useful pattern is to use a Cloud Tasks queue to create Workflows
executions and that&amp;rsquo;s the topic of this post.&lt;/p&gt;
&lt;p&gt;When your application experiences a sudden surge of traffic, it&amp;rsquo;s natural to
want to handle the increased load by creating a high number of concurrent
workflow executions. However, Google
Cloud&amp;rsquo;s &lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt; enforces &lt;a href="https://cloud.google.com/workflows/quotas"&gt;quotas&lt;/a&gt; to
prevent abuse and ensure fair resource allocation. These quotas limit the
maximum number of concurrent workflow executions per region, per project, for
example, Workflows currently enforces a maximum of 2000 concurrent executions by
default. Once this limit is reached, any new executions beyond the quota will
fail with an HTTP 429 error.&lt;/p&gt;</description></item><item><title>Workflows executing other parallel workflows: A practical guide</title><link>https://atamel.dev/posts/2023/07-08_setup-parallel-task-execution-with-parent-and-child-workflows/</link><pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/07-08_setup-parallel-task-execution-with-parent-and-child-workflows/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;There are numerous scenarios where you might want to execute tasks in parallel.
One common use case involves dividing data into batches, processing each batch
in parallel, and combining the results in the end. This approach not only
enhances the speed of the overall processing but it also allows for easier error
detection in smaller tasks.&lt;/p&gt;
&lt;p&gt;On the other hand, setting up parallel tasks, monitoring them, handling errors
in each task, and combining the results in the end is not trivial. Thankfully,
Google Cloud&amp;rsquo;s &lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt; can help. In this
post, we will explore how you can use a parent workflow to set up and execute
parallel child workflows.&lt;/p&gt;</description></item><item><title>Running Wasm in a container</title><link>https://atamel.dev/posts/2023/06-29_run_wasm_in_docker/</link><pubDate>Thu, 29 Jun 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/06-29_run_wasm_in_docker/</guid><description>&lt;p&gt;Docker recently announced experimental support for running Wasm modules (see
&lt;a href="https://www.docker.com/blog/announcing-dockerwasm-technical-preview-2/"&gt;Announcing Docker+Wasm Technical Preview
2&lt;/a&gt;). In
this blog post, I explain what this means and how to run a Wasm module in
Docker.&lt;/p&gt;
&lt;h2 id="why-run-wasm-in-a-container"&gt;Why run Wasm in a container?&lt;/h2&gt;
&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2023/06-20_explore_wasm_outside_browser/"&gt;Exploring WebAssembly outside the
browser&lt;/a&gt;
post, I mentioned how Wasm is faster, smaller, more secure, and more portable
than a container. You might be wondering: &lt;strong&gt;Why take something faster, smaller,
more secure, and more portable and run it in a container?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Compile Rust &amp; Go to a Wasm+Wasi module and run in a Wasm runtime</title><link>https://atamel.dev/posts/2023/06-26_compile_rust_go_wasm_wasi/</link><pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/06-26_compile_rust_go_wasm_wasi/</guid><description>&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2023/06-20_explore_wasm_outside_browser/"&gt;Exploring WebAssembly outside the
browser&lt;/a&gt;
post, I talked about how WebAssembly System Interface
(&lt;a href="https://wasi.dev/"&gt;WASI&lt;/a&gt;) enables Wasm modules to run outside the browser and
interact with the host in a limited set of use cases that Wasi supports (see
&lt;a href="https://github.com/WebAssembly/WASI/blob/main/Proposals.md"&gt;Wasi proposals&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2023/runtime_wasi_host.png" alt="WASI" title="WASI" /&gt;
 
 &lt;figcaption&gt;WASI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In this blog post, let’s look into details of how to compile code to a Wasm+Wasi
module and then run it in a Wasm runtime. Notice that I use Wasm+Wasi module
deliberately (instead of just Wasm) because some languages have Wasm support and
can run perfectly fine in the browser but they have no or limited Wasi support
to run outside the browser.&lt;/p&gt;</description></item><item><title>New Batch connector for Workflows</title><link>https://atamel.dev/posts/2023/05-30_workflows_batch_connector/</link><pubDate>Tue, 30 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-30_workflows_batch_connector/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2023/batch-workflows.png" alt="Batch and Workflows" /&gt;
 
 &lt;figcaption&gt;Batch and Workflows&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt; just released a new
&lt;a href="https://cloud.google.com/workflows/docs/reference/googleapis/batch/Overview"&gt;connector&lt;/a&gt;
for &lt;a href="https://cloud.google.com/batch"&gt;Batch&lt;/a&gt; that greatly simplifies how to
create and run Batch jobs from Workflows. Let&amp;rsquo;s take a look how you can use the
new Batch connector of Workflows.&lt;/p&gt;
&lt;h2 id="recap-batch-and-workflows"&gt;Recap: Batch and Workflows&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/batch"&gt;Batch&lt;/a&gt; is a fully managed service to schedule,
queue, and execute batch jobs on Google&amp;rsquo;s infrastructure. These batch jobs run
on Compute Engine VM instances but they are managed by Batch service, so you don&amp;rsquo;t
have to provision and manage VM instances yourself.&lt;/p&gt;</description></item><item><title>Google Cloud Pub/Sub + AsyncAPI</title><link>https://atamel.dev/posts/2023/05-25_asyncapi_googlepubsub/</link><pubDate>Thu, 25 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-25_asyncapi_googlepubsub/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2023/pubsub_asyncapi.png" alt="Cloud Pub/Sub and AsyncAPI" /&gt;
 
 &lt;figcaption&gt;Cloud Pub/Sub and AsyncAPI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been covering different aspects of &lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt;
in my recent blog posts. In this final post of my AsyncAPI blog post series, I
want to talk about how to document Google Cloud&amp;rsquo;s Pub/Sub using AsyncAPI.&lt;/p&gt;
&lt;p&gt;AsyncAPI has pretty good support for Google Pub/Sub, thanks to contributions
from &lt;a href="https://twitter.com/whitlockjc"&gt;Jeremy Whitlock&lt;/a&gt;, an engineer from Google,
and the flexibility baked in AsyncAPI spec. Jeremy also has a nice &lt;a href="https://discuss.thiswith.me/posts/documenting-cloud-pubsub-using-asyncapi/#server-object"&gt;blog
post&lt;/a&gt;
on this topic that you can read for more details.&lt;/p&gt;</description></item><item><title>CloudEvents + AsyncAPI</title><link>https://atamel.dev/posts/2023/05-23_asyncapi_cloudevents/</link><pubDate>Tue, 23 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-23_asyncapi_cloudevents/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2023/cloudevents_asyncapi.png" alt="CloudEvents and AsyncAPI" /&gt;
 
 &lt;figcaption&gt;CloudEvents and AsyncAPI&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been recently talking about &lt;a href="https://cloudevents.io/"&gt;CloudEvents&lt;/a&gt; and
&lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt;,two of my favorite open-source
specifications for event-driven architectures. In this blog post, I want to talk
about how you can use CloudEvents and AsyncAPI together. More specifically, I&amp;rsquo;ll
show you how to document CloudEvents enabled services using AsyncAPI, thanks to
the flexibility and openness of both projects.&lt;/p&gt;
&lt;h2 id="recap-cloudevents-and-asyncapi"&gt;Recap: CloudEvents and AsyncAPI&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s first do a quick recap CloudEvents and AsyncAPI.&lt;/p&gt;</description></item><item><title>Understanding AsyncAPI's publish &amp; subscribe semantics with an example</title><link>https://atamel.dev/posts/2023/05-18_asyncapi_publishsubscribe_refactor/</link><pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-18_asyncapi_publishsubscribe_refactor/</guid><description>&lt;p&gt;In &lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt;, a channel can have a &lt;code&gt;publish&lt;/code&gt; and
&lt;code&gt;subscribe&lt;/code&gt; operation. This can be confusing, depending on which perspective
you&amp;rsquo;re considering (server vs. user) and what you&amp;rsquo;re comparing against (eg.
WebSocket).&lt;/p&gt;
&lt;p&gt;In this blog post, I want to go through an example to show you how to construct
your AsyncAPI file with the right &lt;code&gt;publish&lt;/code&gt; and &lt;code&gt;subscribe&lt;/code&gt; semantics. As a
bonus, I also show you how to refactor your AsyncAPI files with common
configuration.&lt;/p&gt;</description></item><item><title>AsyncAPI Tools</title><link>https://atamel.dev/posts/2023/05-16_asyncapi_tools/</link><pubDate>Tue, 16 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-16_asyncapi_tools/</guid><description>&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2023/05-12_asyncapi_basics/"&gt;previous post&lt;/a&gt;, I
talked about basic of &lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt;. In this post, I
want to get into more details on some tools around AsyncAPI.&lt;/p&gt;
&lt;p&gt;More specially, we&amp;rsquo;ll install AsyncAPI CLI and Generator, generate a sample AsyncAPI
definition, visualize it in AsyncAPI Studio, and generate code from it. You&amp;rsquo;ll see
how useful AsyncAPI can be in documenting and maintaining your event-driven architectures.&lt;/p&gt;
&lt;h2 id="install-asyncapi-tools"&gt;Install AsyncAPI tools&lt;/h2&gt;
&lt;p&gt;First, let&amp;rsquo;s install some of the AsyncAPI tools.&lt;/p&gt;</description></item><item><title>AsyncAPI Basics</title><link>https://atamel.dev/posts/2023/05-12_asyncapi_basics/</link><pubDate>Fri, 12 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-12_asyncapi_basics/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://avatars.githubusercontent.com/u/16401334?s=200&amp;amp;v=4" alt="AsyncAPI Logo" /&gt;
 
 &lt;figcaption&gt;AsyncAPI Logo&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Recently, I’ve been looking into &lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt;, an
open-source specification and tools to document and maintain event-driven
architectures (EDAs).&lt;/p&gt;
&lt;p&gt;In this blog post, I want summarize the basics of AsyncAPI and point to some
useful links to learn more. In future blog posts, I&amp;rsquo;ll get into more details of
AsyncAPI.&lt;/p&gt;
&lt;h2 id="asyncapi-why-what"&gt;AsyncAPI: Why? What?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.asyncapi.com/"&gt;AsyncAPI&lt;/a&gt; is an open source initiative with the goal
of making event-driven APIs as easy as REST APIs. Fundamentally, it is a
&lt;strong&gt;specification&lt;/strong&gt; to define asynchronous APIs, similar to what
&lt;a href="https://www.openapis.org/"&gt;OpenAPI&lt;/a&gt; (aka Swagger) does for REST APIs.&lt;/p&gt;</description></item><item><title>Buffer HTTP requests with Cloud Tasks</title><link>https://atamel.dev/posts/2023/05-03_buffer_http_requests_cloudtasks/</link><pubDate>Thu, 04 May 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/05-03_buffer_http_requests_cloudtasks/</guid><description>&lt;p&gt;&lt;a href="https://cloud.google.com/tasks"&gt;Cloud Tasks&lt;/a&gt; is a fully-managed service that manages the execution, dispatch, and asynchronous delivery of a large number of tasks to App Engine or any arbitrary HTTP endpoint. You can also use a Cloud Tasks queue to buffer requests between services for more robust intra-service communication.  &lt;/p&gt;
&lt;p&gt;Cloud Tasks introduces two new features, the new queue-level routing
configuration and BufferTask API. Together, they enable creating HTTP tasks and
adding to a queue without needing the tasks client library.&lt;/p&gt;</description></item><item><title>Workflows gets an updated JSON Schema</title><link>https://atamel.dev/posts/2023/04-11_workflows_json_schema/</link><pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/04-11_workflows_json_schema/</guid><description>&lt;p&gt;If you use &lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt;, you&amp;rsquo;ve been crafting your Workflows definitions in YAML (or JSON). You&amp;rsquo;re probably painfully aware of the limited support you get in your IDE with syntax validation or auto-completion with these YAML definitions. This was due to Workflow&amp;rsquo;s schema being out of date, as I covered in &lt;a href="https://medium.com/google-cloud/auto-completion-for-workflows-json-and-yaml-on-visual-studio-code-875a5e878d5e"&gt;my previous post&lt;/a&gt; last year.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m happy to report that our team recently updated the Workflows schema with the latest syntax. With a new schema, you get a much improved syntax validation and auto-completion of Workflows definition files in your favorite IDE. &lt;/p&gt;</description></item><item><title>Extending Cloud Code with custom templates</title><link>https://atamel.dev/posts/2023/03-18_extending_cloudcode_with_custom_templates/</link><pubDate>Sat, 18 Mar 2023 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2023/03-18_extending_cloudcode_with_custom_templates/</guid><description>&lt;p&gt;&lt;a href="https://cloud.google.com/code"&gt;Cloud Code&lt;/a&gt; is a set of IDE plugins for popular IDEs that make it easier to create, deploy and integrate applications with Google Cloud. Cloud Code provides an excellent extension mechanism through custom templates. In this post, I show you how you can create and use your own custom templates to add some features beyond those supported natively in Cloud Code, such as .NET functions, event triggered functions and more. &lt;/p&gt;</description></item><item><title>How to use Google Cloud Serverless tech to iterate quickly in a startup environment</title><link>https://atamel.dev/posts/2022/12-15_use-serverless-tech-to-iterate-quickly-in-a-startup-environment/</link><pubDate>Thu, 15 Dec 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/12-15_use-serverless-tech-to-iterate-quickly-in-a-startup-environment/</guid><description>&lt;p&gt;In a startup, you need to get to the MVP fast, gather feedback from early
adopters, and iterate in a quick cycle. Anything that takes time away from
developing and iterating on features delays the launch and that’s a serious
problem when time-to-market is crucial.&lt;/p&gt;
&lt;p&gt;Google Cloud offers products that can help you to build and run your backend
services on a fully managed serverless platform, saving time and freeing you
from the burden of provisioning and managing infrastructure needed to run those
services. Less time on infrastructure means more time implementing and iterating
on your services. Additionally, most serverless products have a pay-as-you-go
pricing model with little upfront cost at the beginning. Pricing increases in
line with the scale of your services and your startup, so you only pay for what
you need, when you need it&lt;/p&gt;</description></item><item><title>Introducing Cloud Functions support in Cloud Code</title><link>https://atamel.dev/posts/2022/12-12_introduce_functions_in_cloud_code/</link><pubDate>Mon, 12 Dec 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/12-12_introduce_functions_in_cloud_code/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2022/cloudfunctionsincloudcode.png" alt="Cloud Code now supports Cloud Functions" /&gt;
 
 &lt;figcaption&gt;Cloud Code now supports Cloud Functions&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/code"&gt;Cloud Code&lt;/a&gt; has been providing IDE support for
the development cycle of Kubernetes and Cloud Run applications for a while now.
&lt;strong&gt;I’m happy to
&lt;a href="https://github.com/GoogleCloudPlatform/cloud-code-vscode/blob/master/CHANGELOG.md#version-1210-dec-2022"&gt;report&lt;/a&gt;
that the Dec 2022 version (1.21.0) of Cloud Code now supports Cloud Functions!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this first release of Cloud Functions support, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the Cloud Functions Explorer to view your project&amp;rsquo;s Cloud Functions
properties and source code.&lt;/li&gt;
&lt;li&gt;Download your Cloud Functions to edit your code locally, then configure your
local workspace to deploy those changes directly from Cloud Code.&lt;/li&gt;
&lt;li&gt;Invoke your HTTP-triggered functions from VS Code.&lt;/li&gt;
&lt;li&gt;Use the Cloud Code Logs Viewer to view logs from your Cloud Functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s take a closer look.&lt;/p&gt;</description></item><item><title>Workflows patterns and best practices - Part 3</title><link>https://atamel.dev/posts/2022/12-07_workflows-patterns-and-best-practices-part-3/</link><pubDate>Mon, 05 Dec 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/12-07_workflows-patterns-and-best-practices-part-3/</guid><description>&lt;p&gt;This is a three-part series of posts, in which we summarize Workflows and
service orchestration patterns. In this third and final post, we talk about
managing workflow life cycles and the benefits of using Firestore with
Workflows.&lt;/p&gt;
&lt;p&gt;If you’re not careful, the workflow definitions you create with YAML or JSON can get out of hand pretty quickly. While it is possible to use subworkflows to define snippets of a workflow that can be reused from multiple workflows, Workflows does not support importing these subworkflows. Thankfully, there are other tools, such as Terraform, that can help.&lt;/p&gt;</description></item><item><title>Workflows patterns and best practices - Part 2</title><link>https://atamel.dev/posts/2022/11-28_workflows-patterns-and-best-practices-part-2/</link><pubDate>Mon, 28 Nov 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/11-28_workflows-patterns-and-best-practices-part-2/</guid><description>&lt;p&gt;This is part 2 of a three-part series of posts, in which we summarize Workflows and service orchestration patterns. You can apply these patterns to better take advantage of Workflows and service orchestration on Google Cloud.&lt;/p&gt;
&lt;p&gt;In the first post, we introduced some general tips and tricks, as well as patterns for event-driven orchestrations, parallel steps, and connectors. This second post covers more advanced patterns.&lt;/p&gt;
&lt;p&gt;Let’s dive in!&lt;/p&gt;
&lt;p&gt;Design for resiliency with retries and the saga pattern
It’s easy to put together a workflow that chains a series of services, especially if you assume that those services will never fail. This is a common distributed systems fallacy, however, because of course a service will fail at some point. The workflow step calling that service will fail, and then the whole workflow will fail. This is not what you want to see in a resilient architecture. Thankfully, Workflows has building blocks to handle both transient and permanent service failures.&lt;/p&gt;</description></item><item><title>Workflows patterns and best practices - Part 1</title><link>https://atamel.dev/posts/2022/11-22_workflows-patterns-and-best-practices-part-1/</link><pubDate>Tue, 22 Nov 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/11-22_workflows-patterns-and-best-practices-part-1/</guid><description>&lt;p&gt;For the last couple of years, we’ve been using Workflows, Google Cloud’s service orchestrator, to bring order to our serverless microservices architectures. As we used and gained more experience with Workflows and service orchestration, we shared what he had learned in conference talks, blog posts, samples, and tutorials. Along the way, some common patterns and best practices emerged.&lt;/p&gt;
&lt;p&gt;To help you take better advantage of Workflows and service orchestration on Google Cloud, we’ve summarized these proven patterns and best practices in a three-part series of blog posts.&lt;/p&gt;</description></item><item><title>.NET 7 on Cloud Run</title><link>https://atamel.dev/posts/2022/11-11_dotnet7_cloud_run/</link><pubDate>Fri, 11 Nov 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/11-11_dotnet7_cloud_run/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2022/dotnet7oncloudrun.png" alt=".NET 7 on Cloud Run" /&gt;
 
 &lt;figcaption&gt;.NET 7 on Cloud Run&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;.NET 7 was
&lt;a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/"&gt;released&lt;/a&gt; a few
days ago with new features and performance improvements and it&amp;rsquo;s already
supported on Cloud Run on Google Cloud!&lt;/p&gt;
&lt;p&gt;In this short blog post, I show you how to deploy a .NET 7 web app to Cloud Run.&lt;/p&gt;
&lt;h2 id="create-a-net-7-web-app"&gt;Create a .NET 7 web app&lt;/h2&gt;
&lt;p&gt;First, make sure you&amp;rsquo;re on .NET 7:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7.0.100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a simple web app:&lt;/p&gt;</description></item><item><title>Executing commands (gcloud, kubectl) from Workflows</title><link>https://atamel.dev/posts/2022/10-17_executing_commands_from_workflows/</link><pubDate>Mon, 17 Oct 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/10-17_executing_commands_from_workflows/</guid><description>&lt;p&gt;In a &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/introducing-new-connectors-workflows"&gt;previous
post&lt;/a&gt;,
I showed how to manage the lifecycle of a virtual machine using Workflows and
the Compute Engine connector. This works well when there’s a connector for the
resource you’re trying to manage. When there is no connector, you can try to use
the API of the resource from Workflows, if there’s one. Alternatively, you can
also use my favorite command line tool to manage the resource: &lt;code&gt;gcloud&lt;/code&gt;. Or if
you’re managing a Kubernetes cluster, maybe you want to call &lt;code&gt;kubectl&lt;/code&gt; instead.&lt;/p&gt;</description></item><item><title>Workflows that pause and wait for human approvals from Google Sheets</title><link>https://atamel.dev/posts/2022/10-10_workflows_wait_approvals_sheets/</link><pubDate>Mon, 10 Oct 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/10-10_workflows_wait_approvals_sheets/</guid><description>&lt;p&gt;I’ve been writing a series of posts to showcase &lt;a href="https://workspace.google.com/"&gt;Google
Workspace&lt;/a&gt; and Google Cloud
&lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt; integration.&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://atamel.dev/posts/2022/09-09_trigger_workflows_from_sheets/"&gt;first
post&lt;/a&gt;, I
showed an IT automation use case in which a Google Sheets spreadsheet triggers a
workflow to create virtual machines in Google Cloud. In the &lt;a href="https://atamel.dev/posts/2022/09-26_writing_google_sheets_from_workflows/"&gt;second
post&lt;/a&gt;,
I showed how to feed a Google Sheets spreadsheet with data from BigQuery using a
workflow.&lt;/p&gt;
&lt;p&gt;In this third and final post of the series, I show how to design a workflow that
pauses and waits for human approvals from Google Sheets.&lt;/p&gt;</description></item><item><title>.NET 6 on Cloud Functions (2nd gen)</title><link>https://atamel.dev/posts/2022/10-03_dotnet6_cloud_functions/</link><pubDate>Mon, 03 Oct 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/10-03_dotnet6_cloud_functions/</guid><description>&lt;p&gt;Back in August, we
&lt;a href="https://cloud.google.com/blog/products/serverless/cloud-functions-2nd-generation-now-generally-available"&gt;announced&lt;/a&gt;
the 2nd generation of Cloud Functions with longer request processing times,
larger instances, new event sources with Eventarc, and more.&lt;/p&gt;
&lt;p&gt;A few weeks ago, .NET 6 support (public preview) was silently added to Cloud
Functions.&lt;/p&gt;
&lt;p&gt;Let’s see how to deploy some .NET 6 functions to Cloud Functions 2nd gen.&lt;/p&gt;
&lt;h2 id="functions-framework-for-net"&gt;Functions Framework for .NET&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/GoogleCloudPlatform/functions-framework-dotnet"&gt;Functions Framework for
.NET&lt;/a&gt; is the
easiest way to create .NET functions for consuming HTTP or CloudEvent requests.&lt;/p&gt;</description></item><item><title>Writing to Google Sheets from Workflows</title><link>https://atamel.dev/posts/2022/09-26_writing_google_sheets_from_workflows/</link><pubDate>Mon, 26 Sep 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/09-26_writing_google_sheets_from_workflows/</guid><description>&lt;p&gt;In my previous
&lt;a href="https://atamel.dev/posts/2022/09-09_trigger_workflows_from_sheets/"&gt;post&lt;/a&gt;, I
showed how to trigger a workflow in Google Cloud from a Google Sheets
spreadsheet using Apps Script. In this post, I show how to do the reverse: write
to Google Sheets from a workflow in Google Cloud.&lt;/p&gt;
&lt;h2 id="use-case"&gt;Use case&lt;/h2&gt;
&lt;p&gt;Imagine you have some dataset in BigQuery. Periodically, you want to query and
extract a subset of the dataset and save it to a Google Sheets spreadsheet. You
can implement such a process with Workflows quite easily.&lt;/p&gt;</description></item><item><title>Multi-environment service orchestrations</title><link>https://atamel.dev/posts/2022/09-20_multi-environment-service-orchestrations/</link><pubDate>Tue, 20 Sep 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/09-20_multi-environment-service-orchestrations/</guid><description>&lt;p&gt;In a previous post, I showed how to use a GitOps approach to manage the deployment lifecycle of a service orchestration. This approach makes it easy to deploy changes to a workflow in a staging environment, run tests against it, and gradually roll out these changes to the production environment.&lt;/p&gt;
&lt;p&gt;While GitOps helps to manage the deployment lifecycle, it’s not enough. Sometimes, you need to make changes to the workflow before deploying to different environments. You need to design workflows with multiple environments in mind.&lt;/p&gt;</description></item><item><title>GitOps your service orchestrations</title><link>https://atamel.dev/posts/2022/09-16_gitsops-service-orchestration/</link><pubDate>Fri, 16 Sep 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/09-16_gitsops-service-orchestration/</guid><description>&lt;p&gt;GitOps takes DevOps best practices used for application development (such as version control and CI/CD) and applies them to infrastructure automation. In GitOps, the Git repository serves as the source of truth and the CD pipeline is responsible for building, testing, and deploying the application code and the underlying infrastructure.&lt;/p&gt;
&lt;p&gt;Nowadays, an application is not just code running on infrastructure that you own and operate. It is usually a set of first-party and third-party microservices working together in an event-driven architecture or with a central service orchestrator such as Workflows.&lt;/p&gt;</description></item><item><title>Triggering Workflows from Google Sheets</title><link>https://atamel.dev/posts/2022/09-09_trigger_workflows_from_sheets/</link><pubDate>Fri, 09 Sep 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/09-09_trigger_workflows_from_sheets/</guid><description>&lt;p&gt;Is it possible to integrate &lt;a href="https://workspace.google.com/"&gt;Google Workspace&lt;/a&gt;
tools such as Calendar, Sheets, and Forms with
&lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt;? For example, can you trigger a
workflow from a Google Form or a Sheet? Turns out, this is not only possible but
also easier than you might think. Let me show you how with a sample use case.&lt;/p&gt;
&lt;h2 id="use-case"&gt;Use case&lt;/h2&gt;
&lt;p&gt;Imagine you are an administrator in charge of allocating virtual machines (VM)
in your cloud infrastructure to users. You want to capture user requests with
the specifications for the VMs, have an approval step for the request, and then
create the VM with an automated process.&lt;/p&gt;</description></item><item><title>Route Datadog monitoring alerts to Google Cloud with Eventarc</title><link>https://atamel.dev/posts/2022/08-24_route-datadog-monitoring-alerts-google-cloud-eventarc/</link><pubDate>Wed, 24 Aug 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/08-24_route-datadog-monitoring-alerts-google-cloud-eventarc/</guid><description>&lt;p&gt;A few weeks ago, we announced third-party event sources for Eventarc, with the first cohort of third-party providers by our ecosystem partners. This blog post describes how to listen for events from one of those third-party providers, Datadog, and route them to a service in Google Cloud via Eventarc.&lt;/p&gt;
&lt;p&gt;Datadog is a monitoring platform for cloud applications. It brings together end-to-end traces, metrics, and logs to make your applications and infrastructure observable. In Datadog, you can create monitors that track metrics, events, logs, integration availability, and network endpoints, and you can set alert thresholds on those monitors. Once these thresholds are reached, Datadog notifies your teams or services via email, Slack, and now a Google Cloud service via Eventarc.&lt;/p&gt;</description></item><item><title>Creating Workflows that pause and wait for events</title><link>https://atamel.dev/posts/2022/08-05_workflows_that_pause_for_events/</link><pubDate>Fri, 05 Aug 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/08-05_workflows_that_pause_for_events/</guid><description>&lt;p&gt;In &lt;a href="https://cloud.google.com/workflows"&gt;Workflows&lt;/a&gt;, it’s easy to chain various
services together into an automated workflow. For some use cases, you might need
to pause workflow execution and wait for some input. This input could be a human
approval or an external service calling back with data needed to complete the
workflow.&lt;/p&gt;
&lt;p&gt;​​With Workflows
&lt;a href="https://cloud.google.com/workflows/docs/creating-callback-endpoints"&gt;callbacks&lt;/a&gt;,
a workflow can create an HTTP endpoint and pause execution until it receives an
HTTP callback to that endpoint. This is very useful for creating
human-in-the-middle type workflows. In a previous &lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/introducing-workflows-callbacks"&gt;blog
post&lt;/a&gt;,
&lt;a href="https://twitter.com/glaforge"&gt;Guillaume Laforge&lt;/a&gt; showed how to build an
automated translation workflow with human validation using callbacks.&lt;/p&gt;</description></item><item><title>Taking screenshots of web pages with Cloud Run jobs, Workflows, and Eventarc</title><link>https://atamel.dev/posts/2022/06-16_taking-screenshots-web-pages-cloud-run-jobs-workflows-and-eventarc/</link><pubDate>Thu, 16 Jun 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/06-16_taking-screenshots-web-pages-cloud-run-jobs-workflows-and-eventarc/</guid><description>&lt;p&gt;At Google Cloud I/O, we announced the public preview of Cloud Run jobs. Unlike Cloud Run services that run continuously to respond to web requests or events, Cloud Run jobs run code that performs some work and quits when the work is done. Cloud Run jobs are a good fit for administrative tasks such as database migration, scheduled work like nightly reports, or doing batch data transformation.&lt;/p&gt;
&lt;p&gt;In this post, I show you a fully serverless, event-driven application to take screenshots of web pages, powered by Cloud Run jobs, Workflows, and Eventarc.&lt;/p&gt;</description></item><item><title>Worklows state management with Firestore</title><link>https://atamel.dev/posts/2022/04-08_workflows_state_firestore/</link><pubDate>Fri, 08 Apr 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/04-08_workflows_state_firestore/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2022/workflows-firestore.png" alt="Workflows Firestore" /&gt;
 
 &lt;figcaption&gt;Workflows Firestore&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In Workflows, sometimes, you need to store some state, a key/value pair, in a
step in one execution and later read that state in another step in another
execution. There&amp;rsquo;s no intrinsic key/value store in Workflows. However, you can
use Firestore as a key/value store and that&amp;rsquo;s what I want to show you here.&lt;/p&gt;
&lt;p&gt;If you want to skip to see some samples, check out
&lt;a href="https://github.com/GoogleCloudPlatform/workflows-demos/blob/master/state-management-firestore/workflow.yaml"&gt;workflow.yaml&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Introducing Eventarc triggers for Workflows</title><link>https://atamel.dev/posts/2022/04-01_introducing-eventarc-triggers-workflows/</link><pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/04-01_introducing-eventarc-triggers-workflows/</guid><description>&lt;p&gt;We’re happy to announce that you can now create Eventarc triggers to directly target Workflows destinations. Available as a preview feature, it simplifies event-driven orchestrations by enabling you to route Eventarc events to Workflows without having an intermediary service.&lt;/p&gt;
&lt;p&gt;Integrating Eventarc and Workflows
In a previous post, we talked about how to integrate Eventarc and Workflows. Since there was no direct integration between the two services, we had to deploy an intermediary Cloud Run service to receive events from Eventarc and then use the Workflows API to kick off a Workflows execution. Let’s take a look at a concrete example on how this worked.&lt;/p&gt;</description></item><item><title>Creating Eventarc triggers with Terraform</title><link>https://atamel.dev/posts/2022/03-18_creating-eventarc-triggers-terraform/</link><pubDate>Fri, 18 Mar 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/03-18_creating-eventarc-triggers-terraform/</guid><description>&lt;p&gt;Terraform is increasingly the preferred tool for building, changing, and versioning infrastructure in Google Cloud and across clouds. In an earlier post, I showed how to create Eventarc triggers using Google Cloud Console or via the command line with gcloud. In this post, I show how to create the same triggers with the google_eventarc_trigger Terraform resource.&lt;/p&gt;
&lt;p&gt;See eventarc-samples/terraform on GitHub for the prerequisites and main.tf for
full Terraform configuration.&lt;/p&gt;
&lt;p&gt;Define a Cloud Run service as an event sink
Before you can create a trigger, you need to create a Cloud Run service as an event sink for the trigger. You can use Terraform’s google_cloud_run_service resource to define a Cloud Run service:&lt;/p&gt;</description></item><item><title>Applying a path pattern when filtering in Eventarc</title><link>https://atamel.dev/posts/2022/03-02_path_patterns_eventarc/</link><pubDate>Wed, 02 Mar 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/03-02_path_patterns_eventarc/</guid><description>&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2022/Eventarc-128-color.png" alt="Eventarc" /&gt;
 
 &lt;figcaption&gt;Eventarc&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You can now apply a &lt;a href="https://cloud.google.com/eventarc/docs/path-patterns"&gt;path
pattern&lt;/a&gt; when filtering in
Eventarc. This is especially useful when you need to filter on &lt;a href="https://cloud.google.com/apis/design/resource_names"&gt;resource
names&lt;/a&gt; beyond exact match.
Path pattern syntax allows you to define a regex-like expression that matches
events as broadly as you like.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a look at a concrete example.&lt;/p&gt;
&lt;h2 id="without-path-patterns"&gt;Without path patterns&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say you want to listen for new file creations in a Cloud Storage bucket
with an AuditLog trigger.&lt;/p&gt;</description></item><item><title>Building APIs with Cloud Functions and API Gateway</title><link>https://atamel.dev/posts/2022/02-10_cloud_functions_api_gateway/</link><pubDate>Thu, 10 Feb 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/02-10_cloud_functions_api_gateway/</guid><description>&lt;h2 id="building-apis-with-cloud-run"&gt;Building APIs with Cloud Run&lt;/h2&gt;
&lt;p&gt;If I want to build an API, I usually use Cloud Run. In Cloud Run, you run a
container and in that container, you run a web server that handles a base URL in
this format:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://&amp;lt;service-name&amp;gt;-&amp;lt;hash&amp;gt;-&amp;lt;region&amp;gt;.a.run.app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can then have the web server handle any path under that base URL such as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://&amp;lt;service-name&amp;gt;-&amp;lt;hash&amp;gt;-&amp;lt;region&amp;gt;.a.run.app/hello
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://&amp;lt;service-name&amp;gt;-&amp;lt;hash&amp;gt;-&amp;lt;region&amp;gt;.a.run.app/bye
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="building-apis-with-cloud-functions"&gt;Building APIs with Cloud Functions&lt;/h2&gt;
&lt;p&gt;In Cloud Functions, you only have access to a function (no web server) and that
function can only handle the base path:&lt;/p&gt;</description></item><item><title>Long-running containers with Workflows and Compute Engine</title><link>https://atamel.dev/posts/2022/02-09_long-running-containers-workflows-and-compute-engine/</link><pubDate>Wed, 09 Feb 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/02-09_long-running-containers-workflows-and-compute-engine/</guid><description>&lt;p&gt;Sometimes, you need to run a piece of code for hours, days, or even weeks. Cloud Functions and Cloud Run are my default choices to run code. However, they both have limitations on how long a function or container can run. This rules out the idea of executing long-running code in a serverless way.&lt;/p&gt;
&lt;p&gt;Thanks to Workflows and Compute Engine, you can have an almost serverless experience with long running code.&lt;/p&gt;</description></item><item><title>Implementing the saga pattern in Workflows</title><link>https://atamel.dev/posts/2022/02-05_implementing-saga-pattern-workflows/</link><pubDate>Sat, 05 Feb 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/02-05_implementing-saga-pattern-workflows/</guid><description>&lt;p&gt;It’s common to have a separate database for each service in microservices-based architectures. This pattern ensures that the independently designed and deployed microservices remain independent in the data layer as well. But it also introduces a new problem: How do you implement transactions (single units of work, usually made up of multiple operations) that span multiple microservices each with their own local database?&lt;/p&gt;
&lt;p&gt;In a traditional monolith architecture, you can rely on ACID transactions (atomicity, consistency, isolation, durability) against a single database. In a microservices architecture, ensuring data consistency across multiple service-specific databases becomes more challenging. You cannot simply rely on local transactions. You need a cross-service transaction strategy. That’s where the saga pattern comes into play.&lt;/p&gt;</description></item><item><title>.NET 6 support in Google Cloud Buildpacks and Cloud Run</title><link>https://atamel.dev/posts/2022/02-04_dotnet6_buildpacks_cloudrun/</link><pubDate>Fri, 04 Feb 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/02-04_dotnet6_buildpacks_cloudrun/</guid><description>&lt;p&gt;I really like the idea of containers, a reproducible context that our apps can
rely on. However, I really dislike having to create a &lt;code&gt;Dockerfile&lt;/code&gt; to define my
container images. I always need to copy &amp;amp; paste it from somewhere and it takes me
some time to get it right.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why I like using &lt;a href="https://github.com/GoogleCloudPlatform/buildpacks"&gt;Google Cloud
Buildpacks&lt;/a&gt; to build
containers without having to worry about a &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m happy to announce that, as of yesterday, Google Cloud Buildpacks now
supports .NET 6 (the latest LTS version) apps as well!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Auto-completion for Workflows JSON and YAML on Visual Studio Code</title><link>https://atamel.dev/posts/2022/01-28_auto_complete_workflows_vscode/</link><pubDate>Fri, 28 Jan 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/01-28_auto_complete_workflows_vscode/</guid><description>&lt;p&gt;If you&amp;rsquo;re like me, you probably use VS Code to author your Workflows JSON or
YAML. You also probably expect some kind syntax validation or auto-completion as
you work on your workflow. Unfortunately, there&amp;rsquo;s no VS Code extension for
Workflows and &lt;a href="https://cloud.google.com/code/docs/vscode"&gt;Cloud Code for VS
Code&lt;/a&gt; does not support Workflows.&lt;/p&gt;
&lt;p&gt;However, there&amp;rsquo;s a way to get &lt;strong&gt;partial&lt;/strong&gt; auto-completion for Workflows in VS Code.&lt;/p&gt;
&lt;h2 id="vs-code-and-json-schema"&gt;VS Code and JSON Schema&lt;/h2&gt;
&lt;p&gt;VS Code has the ability to display auto-complete suggestions for JSON and YAML
files out of the box. It uses &lt;a href="https://www.schemastore.org/json/"&gt;JSON Schema Store&lt;/a&gt;
which hosts &lt;a href="https://json-schema.org/"&gt;JSON Schemas&lt;/a&gt; for popular configuration
files in JSON and YAML.&lt;/p&gt;</description></item><item><title>Introducing the new Eventarc UI, Cloud Run for Anthos destinations</title><link>https://atamel.dev/posts/2022/01-15_introducing-new-eventarc-ui-cloud-run-anthos-destinations/</link><pubDate>Sat, 15 Jan 2022 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2022/01-15_introducing-new-eventarc-ui-cloud-run-anthos-destinations/</guid><description>&lt;p&gt;December was a busy month for the Eventarc team, who landed a number of features at the end of the year. Let’s take a closer look at some of these new capabilities.&lt;/p&gt;
&lt;p&gt;Cloud Storage trigger is GA
Back in September, we announced the public preview of Cloud Storage triggers as the preferred way of routing Cloud Storage events to Cloud Run targets. They are now generally available. For more details, see the documentation on how to create a Cloud Storage trigger and check out my previous blog post on Cloud Storage triggers.&lt;/p&gt;</description></item><item><title>Cross-region and cross-project event routing with Eventarc and Pub/Sub</title><link>https://atamel.dev/posts/2021/12-09_cross-region-and-cross-project-event-routing-eventarc-and-pubsub/</link><pubDate>Thu, 09 Dec 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/12-09_cross-region-and-cross-project-event-routing-eventarc-and-pubsub/</guid><description>&lt;p&gt;With event-driven architectures, it’s quite common to read events from a source in one region or project and route them to a destination in another region or another project. Let’s take a look at how you can implement cross-region and cross-project event routing in Google Cloud.&lt;/p&gt;
&lt;p&gt;Cross-region event routing is straightforward in Google Cloud, whether you’re using Pub/Sub directly or Eventarc. Pub/Sub routes messages globally. When applications hosted in any region publish messages to a topic, subscribers from any region can pull from that topic. Eventarc enables you to route events across regions by creating a trigger in the region of the event’s source and specifying a destination in a different region. For more details, take a look at my previous blog post on Eventarc locations.&lt;/p&gt;</description></item><item><title>A closer look at locations in Eventarc</title><link>https://atamel.dev/posts/2021/10-26_closer-look-locations-eventarc/</link><pubDate>Tue, 26 Oct 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/10-26_closer-look-locations-eventarc/</guid><description>&lt;p&gt;New locations in Eventarc
Back in August, we announced more Eventarc locations (17 new regions, as well as 6 new dual-region and multi-region locations to be precise). This takes the total number of locations in Eventarc to more than 30. You can see the full list in the Eventarc locations page or by running gcloud eventarc locations list .&lt;/p&gt;
&lt;p&gt;What does location mean in Eventarc?
An Eventarc location usually refers to the single region that the Eventarc trigger gets created in. However, depending on the trigger type, the location can be more than a single region:&lt;/p&gt;</description></item><item><title>Trying out source-based deployment in Cloud Run</title><link>https://atamel.dev/posts/2021/10-19_trying-out-source-based-deployment-cloud-run/</link><pubDate>Tue, 19 Oct 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/10-19_trying-out-source-based-deployment-cloud-run/</guid><description>&lt;p&gt;Until recently, this is how you deployed code to Cloud Run:&lt;/p&gt;
&lt;p&gt;Define your container-based app with a Dockerfile.
Build the container image and push it to the Container Registry (typically with Cloud Build).
Deploy the container image to Cloud Run.
Back in December, we announced the beta release of source-based deployments for Cloud Run. This combines steps 2 and 3 above into a single command. Perhaps more importantly, it also eliminates the need for a Dockerfile for supported language versions.&lt;/p&gt;</description></item><item><title>Analyzing Twitter sentiment with new Workflows processing capabilities</title><link>https://atamel.dev/posts/2021/10-09_analyzing-twitter-sentiment-new-workflows-processing-capabilities/</link><pubDate>Sat, 09 Oct 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/10-09_analyzing-twitter-sentiment-new-workflows-processing-capabilities/</guid><description>&lt;p&gt;The Workflows team recently announced the general availability of iteration syntax and connectors!&lt;/p&gt;
&lt;p&gt;Iteration syntax supports easier creation and better readability of workflows that process many items. You can use a for loop to iterate through a collection of data in a list or map, and keep track of the current index. If you have a specific range of numeric values to iterate through, you can also use range-based iteration.&lt;/p&gt;</description></item><item><title>Introducing the new Cloud Storage trigger in Eventarc</title><link>https://atamel.dev/posts/2021/09-21_introducing-new-cloud-storage-trigger-eventarc/</link><pubDate>Tue, 21 Sep 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/09-21_introducing-new-cloud-storage-trigger-eventarc/</guid><description>&lt;p&gt;Eventarc now supports a new Cloud Storage trigger to receive events from Cloud Storage buckets!&lt;/p&gt;
&lt;p&gt;Wait a minute. Didn’t Eventarc already support receiving Cloud Storage events? You’re absolutely right! Eventarc has long supported Cloud Storage events via the Cloud Audit Logs trigger. However, the new Cloud Storage trigger has a number of advantages and it’s now the preferred way of receiving Cloud Storage events. Let’s take a look at the details.&lt;/p&gt;</description></item><item><title>Get notified when an expensive BigQuery job executes using Eventarc and SendGrid</title><link>https://atamel.dev/posts/2021/06-08_bigquery-jobs-notifier/</link><pubDate>Tue, 08 Jun 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/06-08_bigquery-jobs-notifier/</guid><description>&lt;h2 id="events-supported-by-eventarc"&gt;Events supported by Eventarc&lt;/h2&gt;
&lt;p&gt;Last week, I put together a &lt;a href="https://github.com/GoogleCloudPlatform/eventarc-samples/tree/main/eventarc-events"&gt;list of
events&lt;/a&gt;
supported by Eventarc in our
&lt;a href="https://github.com/GoogleCloudPlatform/eventarc-samples"&gt;eventarc-samples&lt;/a&gt;
repo. Thanks to our docs team, this list is now part of our official docs under
&lt;a href="https://cloud.google.com/eventarc/docs/reference/supported-events"&gt;reference
section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After looking at the full list, I started thinking about some use cases enabled by
these events. I want to talk about one of those use cases today: &lt;strong&gt;How to get
notified when an expensive BigQuery job executes?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Deploying multi-YAML Workflows definitions with Terraform</title><link>https://atamel.dev/posts/2021/05-13_deploying-multi-yaml-workflows-definitions-terraform/</link><pubDate>Thu, 13 May 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/05-13_deploying-multi-yaml-workflows-definitions-terraform/</guid><description>&lt;p&gt;I’m a big fan of using Workflows to orchestrate and automate services running on Google Cloud and beyond. In Workflows, you can define a workflow in a YAML or JSON file and deploy it using gcloud or using Google Cloud Console. These approaches work but a more declarative and arguably better approach is to use Terraform.&lt;/p&gt;
&lt;p&gt;Let’s see how to use Terraform to define and deploy workflows and explore options for keeping Terraform configuration files more manageable.&lt;/p&gt;</description></item><item><title>Introducing new connectors for Workflows</title><link>https://atamel.dev/posts/2021/04-27_introducing-new-connectors-workflows/</link><pubDate>Tue, 27 Apr 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/04-27_introducing-new-connectors-workflows/</guid><description>&lt;p&gt;Workflows is a service to orchestrate not only Google Cloud services, such as Cloud Functions, Cloud Run, or machine learning APIs, but also external services. As you might expect from an orchestrator, Workflows allows you to define the flow of your business logic, as steps, in a YAML or JSON definition language, and provides an execution API and UI to trigger workflow executions. You can read more about the benefits of Workflows in our previous article.&lt;/p&gt;</description></item><item><title>Choosing the right orchestrator in Google Cloud</title><link>https://atamel.dev/posts/2021/04-22_choosing-right-orchestrator-google-cloud/</link><pubDate>Thu, 22 Apr 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/04-22_choosing-right-orchestrator-google-cloud/</guid><description>&lt;p&gt;What is orchestration?
Orchestration often refers to the automated configuration, coordination, and management of computer systems and services.&lt;/p&gt;
&lt;p&gt;In the context of service-oriented architectures, orchestration can range from simply executing a single service at a specific time and day, to a more sophisticated approach of automating and monitoring multiple services over longer periods of time, with the ability to react and handle failures as they crop up.&lt;/p&gt;
&lt;p&gt;In the data engineering context, orchestration is central to coordinating the services and workflows that prepare, ingest, and transform data. It can go beyond data processing and also involve a workflow to train a machine learning (ML) model from the data.&lt;/p&gt;</description></item><item><title>Three ways of receiving events in Cloud Run</title><link>https://atamel.dev/posts/2021/03-12_three-ways-receiving-events-cloud-run/</link><pubDate>Fri, 12 Mar 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/03-12_three-ways-receiving-events-cloud-run/</guid><description>&lt;p&gt;Cloud Run and Eventarc is a great combination for building event-driven services with different event routing options. There are two trigger types (Audit Logs and Pub/Sub) to choose from in Eventarc. Eventarc uses Pub/Sub as its underlying transport layer and provides convenience and standardization on top of it. If you wanted to, you could skip Eventarc and read messages directly from Pub/Sub in Cloud Run.&lt;/p&gt;
&lt;p&gt;This blog post details three ways of receiving events in Cloud Run and provides a decision framework on how to choose.&lt;/p&gt;</description></item><item><title>Demystifying event filters in Eventarc</title><link>https://atamel.dev/posts/2021/03-02_demystifying-event-filters-eventarc/</link><pubDate>Tue, 02 Mar 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/03-02_demystifying-event-filters-eventarc/</guid><description>&lt;p&gt;Eventarc enables you to read events from Google Cloud sources (via its Audit Logs integration) and custom sources (via its Pub/Sub integration) and then route them to Cloud Run services.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/eventarc-architecture.max-2000x2000.png"&gt;https://storage.googleapis.com/gweb-cloudblog-publish/images/eventarc-architecture.max-2000x2000.png&lt;/a&gt;
The event routing rules are defined with a trigger. In a trigger, you specify the right event filters such as service name, method name, resource (which effectively defines the event source) and the target of the events (which can only be a Cloud Run service as of today).&lt;/p&gt;</description></item><item><title>Orchestrating the Pic-a-Daily serverless app with Workflows</title><link>https://atamel.dev/posts/2021/02-13_orchestrating-pic-daily-serverless-app-workflows/</link><pubDate>Sat, 13 Feb 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/02-13_orchestrating-pic-daily-serverless-app-workflows/</guid><description>&lt;p&gt;Over the past year, we (Mete and Guillaume) have developed a picture sharing application, named Pic-a-Daily, to showcase Google Cloud serverless technologies such as Cloud Functions, App Engine, and Cloud Run. Into the mix, we’ve thrown a pinch of Pub/Sub for interservice communication, a zest of Firestore for storing picture metadata, and a touch of machine learning for a little bit of magic.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/1_Shqfx7L.max-1400x1400.png"&gt;https://storage.googleapis.com/gweb-cloudblog-publish/images/1_Shqfx7L.max-1400x1400.png&lt;/a&gt;
We also created a hands-on workshop to build the application, and slides with explanations of the technologies used. The workshop consists of codelabs that you can complete at your own pace. All the code is open source and available in a GitHub repository.&lt;/p&gt;</description></item><item><title>Eventarc brings eventing to Cloud Run and is now GA</title><link>https://atamel.dev/posts/2021/01-29_eventarc-is-ga/</link><pubDate>Fri, 29 Jan 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/01-29_eventarc-is-ga/</guid><description>&lt;p&gt;Back in October, we announced the public preview of Eventarc, as new eventing functionality that lets developers route events to Cloud Run services. In a previous post, we outlined more benefits of Eventarc: a unified eventing experience in Google Cloud, centralized event routing, consistency with eventing format, libraries and an ambitious long term vision.&lt;/p&gt;
&lt;p&gt;Today, we&amp;rsquo;re happy to announce that Eventarc is now generally available. Developers can focus on writing code to handle events, while Eventarc takes care of the details of event ingestion, delivery, security, observability, and error handling.&lt;/p&gt;</description></item><item><title>Eventarc - A unified eventing experience in Google Cloud</title><link>https://atamel.dev/posts/2021/01-16_eventarc-unified-eventing-experience-google-cloud/</link><pubDate>Sat, 16 Jan 2021 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2021/01-16_eventarc-unified-eventing-experience-google-cloud/</guid><description>&lt;p&gt;I recently talked about orchestration versus choreography in connecting microservices and introduced Workflows for use cases that can benefit from a central orchestrator. I also mentioned Eventarc and Pub/Sub in the choreography camp for more loosely coupled event-driven architectures.&lt;/p&gt;
&lt;p&gt;In this blog post, I talk more about the unified eventing experience by Eventarc.&lt;/p&gt;
&lt;p&gt;What is Eventarc?
We announced Eventarc back in October as a new eventing functionality that enables you to send events to Cloud Run from more than 60 Google Cloud sources. It works by reading Audit Logs from various sources and sending them to Cloud Run services as events in CloudEvents format. It can also read events from Pub/Sub topics for custom applications.&lt;/p&gt;</description></item><item><title>Better service orchestration with Workflows</title><link>https://atamel.dev/posts/2020/12-02_better-service-orchestration-workflows/</link><pubDate>Wed, 02 Dec 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/12-02_better-service-orchestration-workflows/</guid><description>&lt;p&gt;Going from a single monolithic application to a set of small, independent microservices has clear benefits. Microservices enable reusability, make it easier to change and scale apps on demand. At the same time, they introduce new challenges. No longer is there a single monolith with all the business logic neatly contained and services communicating with simple method calls. In the microservices world, communication has to go over the wire with REST or some kind of eventing mechanism and you need to find a way to get independent microservices to work toward a common goal.&lt;/p&gt;</description></item><item><title>Introducing Eventarc in Pic-a-Daily Serverless Workshop</title><link>https://atamel.dev/posts/2020/11-30_eventarc-serverless-workshop/</link><pubDate>Mon, 30 Nov 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/11-30_eventarc-serverless-workshop/</guid><description>&lt;h2 id="pic-a-daily-serverless-workshop"&gt;Pic-a-Daily Serverless Workshop&lt;/h2&gt;
&lt;p&gt;As you might know, &lt;a href="https://twitter.com/glaforge"&gt;Guillaume Larforge&lt;/a&gt; and I have a
&lt;a href="https://codelabs.developers.google.com/serverless-workshop/"&gt;Pic-a-Daily Serverless
Workshop&lt;/a&gt;. In this
workshop, we build a picture sharing application using Google Cloud serverless
technologies such as Cloud Functions, App Engine, Cloud Run and more.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
 &lt;img src="https://atamel.dev/img/2020/picadaily-serverless-workshop.png" alt="Pic-a-Daily Serverless Workshop" /&gt;
 
 &lt;figcaption&gt;Pic-a-Daily Serverless Workshop&lt;/figcaption&gt;
 
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We recently added a new service to the workshop. In this blog post, I want to
talk about the new service. I also want to talk about
&lt;a href="https://cloud.google.com/blog/products/serverless/build-event-driven-applications-in-cloud-run"&gt;Eventarc&lt;/a&gt;
and how it helped us to get events to the new service.&lt;/p&gt;</description></item><item><title>.NET 5.0 on Google Cloud</title><link>https://atamel.dev/posts/2020/11-20_net-50-google-cloud/</link><pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/11-20_net-50-google-cloud/</guid><description>&lt;p&gt;.NET 5.0 was released just a few days ago with many new features, improvements, C# 9 support, F# 5 support, and more. .NET 5.0 is the first release of the unified .NET vision that was announced last year. Going forward, there will be just one .NET targeting Windows, Linux, macOS, and more.&lt;/p&gt;
&lt;p&gt;Google Cloud already has support for different versions of .NET. You can run traditional Windows based .NET apps on Windows Servers in Compute Engine or on Windows Containers in Google Kubernetes Engine (GKE). For modern Linux based containerized .NET apps, there’s more choice with App Engine (Flex), GKE and my favorite Cloud Run. Not to mention, the .NET Core 3.1 support in Cloud Functions is currently in preview for serverless .NET functions.&lt;/p&gt;</description></item><item><title>Knative v0.18.0 update</title><link>https://atamel.dev/posts/2020/10-12_knative-v0180-update/</link><pubDate>Mon, 12 Oct 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/10-12_knative-v0180-update/</guid><description>&lt;p&gt;I got around to updating my &lt;a href="https://github.com/meteatamel/knative-tutorial"&gt;Knative
Tutorial&lt;/a&gt; from Knative &lt;code&gt;v0.16.0&lt;/code&gt;
to the latest Knative Serving &lt;code&gt;v0.18.0&lt;/code&gt;
&lt;a href="https://github.com/knative/serving/releases/tag/v0.18.0"&gt;release&lt;/a&gt; and Knative
Eventing &lt;code&gt;v0.18.1&lt;/code&gt;
&lt;a href="https://github.com/knative/eventing/releases/tag/v0.18.1"&gt;release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this short blog post, I want to outline a couple of minor issues I encountered during
my upgrade. Note that I skipped &lt;code&gt;v0.17&lt;/code&gt; altogether, some of these changes might
have happened in that release.&lt;/p&gt;
&lt;h2 id="istio-installation"&gt;Istio Installation&lt;/h2&gt;
&lt;p&gt;The biggest change I encountered is how Istio is installed for Knative. In
previous releases, I simply pointed to the yaml files in the latest Istio
version in &lt;code&gt;third_party&lt;/code&gt; folder of Knative Serving.&lt;/p&gt;</description></item><item><title>Events for Cloud Run for Anthos &gt;= Knative Eventing on Kubernetes</title><link>https://atamel.dev/posts/2020/10-09_events_cloud_run_anthos_knative_eventing/</link><pubDate>Thu, 08 Oct 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/10-09_events_cloud_run_anthos_knative_eventing/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;We recently
&lt;a href="https://cloud.google.com/blog/products/serverless/cloud-run-for-anthos-adds-events"&gt;announced&lt;/a&gt;
a new feature, &lt;em&gt;Events for Cloud Run for Anthos&lt;/em&gt;, to build event driven systems on
Google Kubernetes Engine (GKE). In the announcement, we also stated that the
solution is based on open-source &lt;a href="https://knative.dev/"&gt;Knative&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this blog post, I want to further explain the relationship between this new
feature and Knative. I also want to convince you that our solution is an easier
way to deploy Knative compliant event consuming services on Google Cloud.&lt;/p&gt;</description></item><item><title>Cloud Run for Anthos brings eventing to your Kubernetes microservices</title><link>https://atamel.dev/posts/2020/09-24_cloud-run-for-anthos-adds-events/</link><pubDate>Thu, 24 Sep 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/09-24_cloud-run-for-anthos-adds-events/</guid><description>&lt;p&gt;Building microservices on Google Kubernetes Engine (GKE) provides you with maximum flexibility to build your applications, while still benefiting from the scale and toolset that Google Cloud has to offer. But with great flexibility comes great responsibility. Orchestrating microservices can be difficult, requiring non-trivial implementation, customization, and maintenance of messaging systems.&lt;/p&gt;
&lt;p&gt;Cloud Run for Anthos now includes an events feature that allows you to easily build event-driven systems on Google Cloud. Now in beta, Cloud Run for Anthos’ event feature assumes responsibility for the implementation and management of eventing infrastructure, so you don’t have to.&lt;/p&gt;</description></item><item><title>A first look at serverless orchestration with Workflows</title><link>https://atamel.dev/posts/2020/09-08_first_look_at_workflows/</link><pubDate>Tue, 08 Sep 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/09-08_first_look_at_workflows/</guid><description>&lt;h2 id="challenges-in-connecting-services"&gt;Challenges in connecting services&lt;/h2&gt;
&lt;p&gt;When I think about my recent projects, I probably spent half of my time coding
new services and the other half in connecting services. Service A calling
Service B, or Service C calling an external service and using the result to feed
into another Service D.&lt;/p&gt;
&lt;p&gt;Connecting services is one of those things that &amp;lsquo;should be easy&amp;rsquo; but in reality,
it takes a lot of time and effort. You need to figure out a common
connection format for services to use, make the connection, parse the results,
and pass the results on. I&amp;rsquo;m not even mentioning error handling, retries and
all those production readiness type features that you ultimately need to do.&lt;/p&gt;</description></item><item><title>Scheduled serverless dbt + BigQuery service</title><link>https://atamel.dev/posts/2020/07-29_scheduled_serverless_dbt_with_bigquery/</link><pubDate>Wed, 29 Jul 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/07-29_scheduled_serverless_dbt_with_bigquery/</guid><description>&lt;p&gt;My colleague &lt;a href="https://twitter.com/felipehoffa"&gt;Felipe Hoffa&lt;/a&gt; recently published a
blog post titled &lt;a href="https://medium.com/@hoffa/get-started-with-bigquery-and-dbt-the-easy-way-36b9d9735e35"&gt;Get started with BigQuery and dbt, the easy
way&lt;/a&gt;.
More specifically, he showed how to install &lt;a href="https://getdbt.com/"&gt;dbt&lt;/a&gt; in Google
Cloud Shell, configure it and manually run it to create a temporary dataset in
BigQuery. This is great for testing dbt + BigQuery but how do you run this
kind of setup in production?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.getdbt.com/docs/running-a-dbt-project/running-dbt-in-production/"&gt;dbt
documentation&lt;/a&gt;
states that &lt;strong&gt;Running dbt in production simply means setting up a system to run a
dbt job on a schedule, rather than running dbt commands manually from the
command line.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Knative v0.16.0 update</title><link>https://atamel.dev/posts/2020/07-22_knative-v0-16-0-update/</link><pubDate>Wed, 22 Jul 2020 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/07-22_knative-v0-16-0-update/</guid><description>&lt;p&gt;I finally got around to updating my &lt;a href="https://github.com/meteatamel/knative-tutorial"&gt;Knative
Tutorial&lt;/a&gt; from Knative &lt;code&gt;v0.14.0&lt;/code&gt;
to the latest Knative
&lt;code&gt;v0.16.0&lt;/code&gt; &lt;a href="https://github.com/knative/serving/releases/tag/v0.16.0"&gt;release&lt;/a&gt;. Since I
skipped &lt;code&gt;v0.15.0&lt;/code&gt;, I&amp;rsquo;m not sure which changes are due to &lt;code&gt;v0.15.0&lt;/code&gt; vs.
&lt;code&gt;v0.16.0&lt;/code&gt;. Regardless, there have been some notable changes that I want to
outline in this blog post. This is not meant to be an exhaustive list. Feel free
to let me know in the comments if there are other notable changes that I should
be aware of.&lt;/p&gt;</description></item><item><title>Knative v0.12.0 update</title><link>https://atamel.dev/posts/2020/01-27_knative-v0-12-0-update/</link><pubDate>Mon, 27 Jan 2020 15:07:35 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/01-27_knative-v0-12-0-update/</guid><description>&lt;p&gt;It’s hard to keep with Knative releases with a release every 6 weeks. I finally managed to update my &lt;a href="https://github.com/meteatamel/knative-tutorial"&gt;Knative Tutorial&lt;/a&gt; for the latest Knative v0.12.0. In this blog post, I want to outline some of the differences I’ve observed.&lt;/p&gt;
&lt;h4 id="knative-serving"&gt;Knative Serving&lt;/h4&gt;
&lt;p&gt;Knative Serving has been pretty stable in the recent releases and &lt;a href="https://github.com/knative/serving/releases/tag/v0.12.0"&gt;Knative Serving v0.12.0&lt;/a&gt; is no exception. I didn’t need to update my tutorial specifically for this release.&lt;/p&gt;
&lt;h4 id="knative-eventing"&gt;Knative Eventing&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/knative/eventing/releases/tag/v0.12.0"&gt;Knative Eventing v0.12.0&lt;/a&gt; changed the default yaml for Knative Eventing bundles. Now, they are under &lt;code&gt;eventing.yaml&lt;/code&gt; (previously, it was &lt;code&gt;release.yaml&lt;/code&gt;) and this is the yaml you need to point to install eventing. This makes sense as it’s more consistent with Knative Serving and its &lt;code&gt;serving.yaml&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>How to properly install Knative on GKE</title><link>https://atamel.dev/posts/2020/01-13_how-to-properly-install-knative-on-gke/</link><pubDate>Mon, 13 Jan 2020 16:50:06 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2020/01-13_how-to-properly-install-knative-on-gke/</guid><description>&lt;p&gt;The default Knative Installation &lt;a href="https://knative.dev/docs/install/knative-with-gke/"&gt;instructions&lt;/a&gt; for Google Kubernete Engine (GKE) is problematic (see bug &lt;a href="https://github.com/knative/eventing/issues/2266"&gt;2266&lt;/a&gt;). In this post, I want to outline what the problem is, tell you what I do, and also provide you the scripts that work for me until a proper solution is implemented either in gcloud or Knative.&lt;/p&gt;
&lt;h3 id="the-problem"&gt;The problem&lt;/h3&gt;
&lt;p&gt;The default Knative Installation instructions tell you to create a GKE cluster as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcloud beta container clusters create &lt;span class="nv"&gt;$CLUSTER_NAME&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --addons&lt;span class="o"&gt;=&lt;/span&gt;HorizontalPodAutoscaling,HttpLoadBalancing,Istio &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --machine-type&lt;span class="o"&gt;=&lt;/span&gt;n1-standard-4 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --cluster-version&lt;span class="o"&gt;=&lt;/span&gt;latest --zone&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CLUSTER_ZONE&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --enable-stackdriver-kubernetes --enable-ip-alias &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --enable-autoscaling --min-nodes&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; --max-nodes&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --enable-autorepair &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --scopes cloud-platform
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice the Istio add-on. This command creates a Kubernetes cluster with Istio already installed. This is good because Istio is a dependency of Knative but keep reading.&lt;/p&gt;</description></item><item><title>How to deploy a Windows container on Google Kubernetes Engine</title><link>https://atamel.dev/posts/2019/09-28_how-to-deploy-a-windows-container-on-google-kubernetes-engine/</link><pubDate>Sat, 28 Sep 2019 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2019/09-28_how-to-deploy-a-windows-container-on-google-kubernetes-engine/</guid><description>&lt;p&gt;Many people who run Windows containers want to use a container management platform like Kubernetes for resiliency and scalability. In a previous post, we showed you how to run an IIS site inside a Windows container deployed to Windows Server 2019 running on Compute Engine. That’s a good start, but you can now also run Windows containers on Google Kubernetes Engine (GKE).&lt;/p&gt;
&lt;p&gt;Support for Windows containers in Kubernetes was announced earlier in the year with version 1.14, followed by GKE announcement on the same. You can sign up for early access and start testing out Windows containers on GKE.&lt;/p&gt;</description></item><item><title>How to deploy a Windows container on Google Compute Engine</title><link>https://atamel.dev/posts/2019/09-21_how-to-deploy-a-windows-container-on-google-compute-engine/</link><pubDate>Sat, 21 Sep 2019 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2019/09-21_how-to-deploy-a-windows-container-on-google-compute-engine/</guid><description>&lt;p&gt;Last year, we published a blog post and demonstrated how to deploy a Windows container running Windows Server 2016 on Google Compute Engine. Since then, there have been a number of important developments. First, Microsoft announced the availability of Windows Server 2019. Second, Kubernetes 1.14 was released with support for Windows nodes and Windows containers.&lt;/p&gt;
&lt;p&gt;Supporting Windows workloads and helping you modernize your apps using containers and Kubernetes is one of our top priorities at Google Cloud. Soon after the Microsoft and Kubernetes announcements, we added support for Windows Server 2019 in Compute Engine and Windows containers in Google Kubernetes Engine (GKE).&lt;/p&gt;</description></item><item><title>Google Home meets .NET containers using Dialogflow</title><link>https://atamel.dev/posts/2018/07-13_google-home-meets-net-containers-using-dialogflow/</link><pubDate>Fri, 13 Jul 2018 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2018/07-13_google-home-meets-net-containers-using-dialogflow/</guid><description>&lt;p&gt;I use my Google Home all the time to check the weather before leaving home, set up alarms, listen to music, but I never considered writing an app for it. What does it take to write an app for the Google Home assistant? And can we make it smarter by leveraging Google Cloud? Those were the questions that my colleague Chris Bacon, and I were thinking about when we decided to build a demo for a conference talk.&lt;/p&gt;</description></item><item><title>How to run Windows Containers on Compute Engine</title><link>https://atamel.dev/posts/2018/04-03_how-to-run-windows-containers-on-compute-engine/</link><pubDate>Tue, 03 Apr 2018 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2018/04-03_how-to-run-windows-containers-on-compute-engine/</guid><description>&lt;p&gt;Container virtualization is a rapidly evolving technology that can simplify how you deploy and manage distributed applications. When people discuss containers, they usually mean Linux-based containers. This makes sense, because native Linux kernel features like cgroups introduced the idea of resource isolation, eventually leading to containers as we know them today.&lt;/p&gt;
&lt;p&gt;For a long time, you could only containerize Linux processes, but Microsoft introduced support for Windows-based containers in Windows Server 2016 and Windows 10. With this, you can now take an existing Windows application, containerize it using Docker, and run it as an isolated container on Windows. Microsoft supports two flavors of Windows containers: Windows Server and Hyper-V. You can build Windows containers on either the microsoft/windowsservercore and microsoft/nanoserver base images. You can read more about Windows containers in the Microsoft Windows containers documentation.&lt;/p&gt;</description></item><item><title>Scheduling Dataflow pipelines using App Engine Cron Service or Cloud Functions</title><link>https://atamel.dev/posts/2016/04-12_scheduling-dataflow-pipelines-using-app-engine-cron-service-or-cloud-functions/</link><pubDate>Tue, 12 Apr 2016 00:00:00 +0000</pubDate><author>atamel@gmail.com (Mete Atamel)</author><guid>https://atamel.dev/posts/2016/04-12_scheduling-dataflow-pipelines-using-app-engine-cron-service-or-cloud-functions/</guid><description>&lt;p&gt;Google Cloud Dataflow provides a unified programming model for batch and stream data processing along with a managed service to execute parallel data processing pipelines on Google Cloud Platform.&lt;/p&gt;
&lt;p&gt;Once a Dataflow pipeline is created, it can be tested locally using DirectPipelineRunner, and if everything looks good, it can be manually executed as a job in Dataflow Service by triggering DataflowPipelineRunner or BlockingDataflowPipelineRunner with Apache Maven or Dataflow Eclipse Plugin. You can monitor the progress of your submitted job with Dataflow Monitoring Interface from Cloud Platform Console or Dataflow Command-line Interface from gcloud.&lt;/p&gt;</description></item></channel></rss>