<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muhamad Aji Pandean Mertayasa</title>
    <description>The latest articles on DEV Community by Muhamad Aji Pandean Mertayasa (@ajipandean).</description>
    <link>https://dev.to/ajipandean</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F407939%2Fa1205a6e-85bb-4ebe-9fb5-557ab67245b5.jpg</url>
      <title>DEV Community: Muhamad Aji Pandean Mertayasa</title>
      <link>https://dev.to/ajipandean</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajipandean"/>
    <language>en</language>
    <item>
      <title>Deploying NestJS API to Cloud Run using Cloud Build</title>
      <dc:creator>Muhamad Aji Pandean Mertayasa</dc:creator>
      <pubDate>Mon, 02 Aug 2021 04:34:23 +0000</pubDate>
      <link>https://dev.to/ajipandean/deploy-nestjs-api-to-cloud-run-using-cloud-build-66a</link>
      <guid>https://dev.to/ajipandean/deploy-nestjs-api-to-cloud-run-using-cloud-build-66a</guid>
      <description>&lt;p&gt;NestJS is a NodeJS framework and deploying NodeJS API sometimes can be so challenging. Let's say for example you have VPS ready to be the place for your API to live. When you want to deploy your API to that VPS there are a lot of works to do. Starts from setting up environment for developing the API, then developing the actual API, configuring process manager like PM2, configuring web server like nginx and etc, etc. After a lot of works, finally your app is ready to serve.&lt;/p&gt;

&lt;p&gt;Well, maybe some of you already get used to it, so it doesn't seems that complicated. But what about the beginner programmer? They definitely got intimidated by those steps to do (just like me in the past) :D. So if you feel the same like me in the past, then you in the right place.&lt;/p&gt;

&lt;p&gt;Fortunately, at Google Cloud Next 2019, Google announced a serverless service where you can deploy your NodeJS API easily without worrying about ton of steps above. This service called Cloud Run.&lt;/p&gt;

&lt;p&gt;Cloud Run basically is a fully-managed and highly scalable platform for deploying containerized app. Where "fully-managed" here means that Google takes care of the server for you, so you don't have to worry about managing and maintaining the server, and "highly scalable" here means that your service will be either increased or decreased dynamically based on the traffic to that service.&lt;/p&gt;

&lt;p&gt;In this article, I will show you how to deploy your NodeJS API using NestJS to Google Cloud Run. We will use Docker for containerizing our application. So I assume that you have a bit knowledge of what Docker is or at least you have heard about it.&lt;/p&gt;

&lt;p&gt;So, let's get started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create NestJS API
&lt;/h2&gt;

&lt;p&gt;So first of all, let's create our brand new NestJS app by simply run the command below on your Terminal or Command Prompt for Windows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @nestjs/cli
&lt;span class="nv"&gt;$ &lt;/span&gt;nest new &amp;lt;your-app-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After it finished, as you can see, there are a bunch of files generated automatically by NestJS. We are not going to touch any of these files. Instead, we want to test the API by simply running the command below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yarn start:dev &lt;span class="c"&gt;# if you choose yarn&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;npm run start:dev &lt;span class="c"&gt;# if you choose npm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can visit &lt;code&gt;[http://localhost:3000](http://localhost:3000)&lt;/code&gt; on your favorite browser and your should see &lt;code&gt;Hello, world&lt;/code&gt; showing up on the screen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Containerize NestJS API
&lt;/h2&gt;

&lt;p&gt;As I mentioned before, Cloud Run is a service for deploying containerized app. It means that we should bundle our API into container by using Docker — it can be anything actually, but Docker is the most popular one — and then deploy that container to Cloud Run. &lt;/p&gt;

&lt;p&gt;So in case you don't know what the container is, basically container just bundle our API along with its dependencies and environments, so the API that runs on Cloud Run has the same dependencies and environments with the API that runs on our local machine.&lt;/p&gt;

&lt;p&gt;Okay enough theory, let's containerize our API.&lt;/p&gt;

&lt;p&gt;So the first thing that we have to do for containerizing our API is creating a file called &lt;code&gt;Dockerfile&lt;/code&gt; in the root of our project directory. Then just copy and paste code below into &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:erbium-alpine3.14&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;yarn

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;yarn build

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; [ "yarn", "start:prod" ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's take a look of what we just did here.&lt;/p&gt;

&lt;p&gt;We just created a &lt;code&gt;Dockerfile&lt;/code&gt; which is required by Docker to build image from an instructions that we wrote in that file.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;Dockerfile&lt;/code&gt; we have a lot of stuff going on, let's cover them one by one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;FROM node:erbium-alpine3.14&lt;/code&gt; tells Docker that we are going to use node:erbium-alpine3.14 as our base image. So here, we don't have to install &amp;amp; configure NodeJS manually by ourselves.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /app&lt;/code&gt; tells Docker to create a directory called &lt;code&gt;/app&lt;/code&gt; and redirect us to that directory. It basically quite similar to &lt;code&gt;mkdir /app &amp;amp;&amp;amp; cd /app&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY package.json .&lt;/code&gt; tells Docker to copy package.json file from our project on local computer to &lt;code&gt;/app&lt;/code&gt; directory inside our container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN yarn&lt;/code&gt; tells Docker to install all dependencies needed for our API.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY . .&lt;/code&gt; tells Docker to copy all files from our project on local computer to &lt;code&gt;/app&lt;/code&gt; directory inside our container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN yarn build&lt;/code&gt; tells Docker to build our API.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EXPOSE 3000&lt;/code&gt; tells Docker to open port 3000 for external access.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CMD [ "yarn", "start:prod" ]&lt;/code&gt; tells Docker to execute this command whenever we run our image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Okay, we've created our &lt;code&gt;Dockerfile&lt;/code&gt; but we still don't have image yet. Before we do that, since we are building NestJS app which is literally NodeJS, we have to ignore &lt;code&gt;node_modules&lt;/code&gt; from being copied during building. Because, the size of &lt;code&gt;node_modules&lt;/code&gt; is quite big and can slow down the performance of building an image.&lt;/p&gt;

&lt;p&gt;In order to ignore some files or folders, we have to create another file called &lt;code&gt;.dockerignore&lt;/code&gt; in the root of our project folder. After that, just copy and paste code below into &lt;code&gt;.dockerignore&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node_modules/
.git/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we're ready to build our image, in order to build Docker image, we just have to run command below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;image_name:tag&amp;gt; &lt;span class="nb"&gt;.&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's cover above command one by one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;docker build&lt;/code&gt; tells Docker to build our image based on Dockerfile.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t &amp;lt;image_name:tag&amp;gt;&lt;/code&gt; parameter used to specifies the name of the image and also tag (for versioning purpose) for our image.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.&lt;/code&gt; this 'dot' sign refers to current directory where the Docker will look for Dockerfile to build an image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you can test your image by running &lt;code&gt;docker run&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &amp;lt;image-name:tag&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can visit &lt;code&gt;[http://localhost:3000](http://localhost:3000)&lt;/code&gt; and you should see the same result as before. But now your app runs on Docker container.&lt;/p&gt;

&lt;p&gt;To stop the running container, just hit &lt;code&gt;Ctrl + c&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Host our code to GitHub
&lt;/h2&gt;

&lt;p&gt;Before we deploy our code to Cloud Run, let's host our code first to Github so that we can clone this code to Google Cloud Shell to perform deployment. You can do it by yourself, but in case you don't know how, just copy and paste bellow commands and run on your terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git init
&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"my api project, finished"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git remote add origin &amp;lt;your-repository-url&amp;gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git branch &lt;span class="nt"&gt;-M&lt;/span&gt; main
&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Deploy to Cloud Run
&lt;/h2&gt;

&lt;p&gt;Alright, now we have all the requirements we need.&lt;/p&gt;

&lt;p&gt;We've created our API and also containerized it with the help of Docker. Now, we're ready to deploy our API to Cloud Run.&lt;/p&gt;

&lt;p&gt;Well, it quite simple I think cause we just have to do few steps to complete it :D&lt;/p&gt;

&lt;p&gt;Okay let's deploy.&lt;/p&gt;

&lt;p&gt;In order to deploy our API to Cloud Run, we'll use Google Cloud service called Cloud Build. This service will automate our deployment to Cloud Run.&lt;/p&gt;

&lt;p&gt;First of all, create new project on GCP Console. Then copy the ID of your project.&lt;/p&gt;

&lt;p&gt;Then to use Cloud Build, we have to create another file in our root project directory called &lt;code&gt;cloudbuild.yaml&lt;/code&gt;. Then copy and paste following code to your &lt;code&gt;cloudbuild.yaml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;# Build the container image&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/cloud-builders/docker'&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;build'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-t'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/PROJECT_ID/IMAGE'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Push the container image to Container Registry&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/cloud-builders/docker'&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;push'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/PROJECT_ID/IMAGE'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Deploy container image to Cloud Run&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/google.com/cloudsdktool/cloud-sdk'&lt;/span&gt;
  &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gcloud&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;run'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;deploy'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SERVICE-NAME'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--image'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gcr.io/PROJECT_ID/IMAGE'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--region'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;REGION'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--platform'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;managed'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--port'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3000'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcr.io/PROJECT_ID/IMAGE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That just template, customize to fit your case. Don't forget to add &lt;code&gt;--port 3000&lt;/code&gt; after &lt;code&gt;--platform managed&lt;/code&gt;, since our app listen on port 3000.&lt;/p&gt;

&lt;p&gt;The template code is available on Google Cloud Build documentation &lt;a href="https://cloud.google.com/build/docs/deploying-builds/deploy-cloud-run" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Just head on to there, scroll until you find "Building and deploying a container" title and read it what the meaning of the above code.&lt;/p&gt;

&lt;p&gt;Now push your &lt;code&gt;cloudbuild.yaml&lt;/code&gt; to GitHub.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"added cloudbuild.yaml file"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Back to your GCP Console, open Cloud Shell. Then make directory called whatever you want. I'll name it "projects" for now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;projects
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;projects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone your code from GitHub that we just created earlier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone &amp;lt;your-repository-url&amp;gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;your-project-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then finally run below command to deploy your API to Cloud Run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gcloud builds submit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you got permission "run.service.get" error during &lt;code&gt;gcloud builds submit&lt;/code&gt; you can go &lt;a href="https://cloud.google.com/build/docs/deploying-builds/deploy-cloud-run#required_iam_permissions" rel="noopener noreferrer"&gt;here&lt;/a&gt; and then enabled "Cloud Run Admin". After that, run again &lt;code&gt;gcloud builds submit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After it finished, go to Cloud Run dashboard, and click on the service that you just created.&lt;/p&gt;

&lt;p&gt;Click "Permissions" tab and then click "+ Add".&lt;/p&gt;

&lt;p&gt;For "New members" field, type &lt;code&gt;allUsers&lt;/code&gt; and for "Role" field, select &lt;strong&gt;Cloud Run Invoker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt;, then &lt;strong&gt;Allow Public Access&lt;/strong&gt; and re-run &lt;code&gt;gcloud builds submit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We're done.&lt;/p&gt;




&lt;p&gt;Alright, I think that's all for Deploy NestJS API to Cloud Run episode.&lt;/p&gt;

&lt;p&gt;Well, this is my first article of my life. I know it's not perfect yet, I feel that :D but don't worry, I'll keep improving my writing skill.&lt;/p&gt;

&lt;p&gt;Hopefully, you can get something new from this tutorial. Thanks for reading.&lt;/p&gt;

&lt;p&gt;See you on the next article :D&lt;/p&gt;

</description>
      <category>node</category>
      <category>nestjs</category>
      <category>cloudrun</category>
      <category>api</category>
    </item>
  </channel>
</rss>
