<?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: Paul</title>
    <description>The latest articles on DEV Community by Paul (@pauld).</description>
    <link>https://dev.to/pauld</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%2F152883%2F8058f3d8-f70a-42e3-8bc3-ea00d9d6da16.jpg</url>
      <title>DEV Community: Paul</title>
      <link>https://dev.to/pauld</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pauld"/>
    <language>en</language>
    <item>
      <title>Blue Team Conference</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Fri, 16 Sep 2022 18:27:40 +0000</pubDate>
      <link>https://dev.to/pauld/blue-team-conference-dn8</link>
      <guid>https://dev.to/pauld/blue-team-conference-dn8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzrhl4cehz9gk5f9jky7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzrhl4cehz9gk5f9jky7.png" alt=" " width="240" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey all! It's been a minute, to say the least. As I took on a new role as a Cloud security engineer during the pandemic, was such a blessing to have this opportunity!!! &lt;/p&gt;

&lt;p&gt;Ok....ok...ok. Enough of me&lt;/p&gt;

&lt;p&gt;I like to start by bridging the stop gaps between software developers/software engineers and cybersecurity practitioners. Believe in living in a world where teams, departments, groups, and divisions can all co-exist. &lt;/p&gt;

&lt;p&gt;This is what Blue Team Conference in Chicago, IL is all about. What happens weeks before Blue Team Conference?? Well, there's a hacker summer camp in Las Vegas, both DefCon and BlackHat conventions. Defcon is going on 30+ years in the making. Wow!! and I haven't may a trip to one yet (looking to next year possible) Defcon is for the techy geek. &lt;br&gt;
Blackhat has been around for the same amount of time but mainly for a businesses. If you want more information listen to the podcast CISO tradecraft as G Mark Hardy is a well-known individual and shares his experience.&lt;/p&gt;

&lt;p&gt;BlueTeam Conference was hosted about a year ago and the community is great. I attended last week's BTC, the community was friendly. (Side note: this is my first security conference) Vendors were well knowledgeable than your usual sale representative, I mean wow these guys at Trimarc and SentinelOne, knew the company inside and out.&lt;br&gt;
Now I wasn't able to make all the speakers but the lineup was great, anywhere from becoming the threat to how to make a CTF. The combination of the speaker lineup was a mix of business solutions consists of team leadership and developing a relationship, collaborating with other teams, and helping them to solve their day-to-day problems, how to hack the board, to cybersec optimizing best practices with working with metrics, logging, auditing, threat response, cloud security best practices, how to abstract cybersec metrics to convey those security measures to leadership and board members. &lt;/p&gt;

&lt;p&gt;So what have I learned from attending Blue Team Conference (BTC). Well for starters, Trimarc had hosted their CTF and BTC also had a CTF village. There's hack4kids village where kids of all ages can learn hardware hacking to software hacking. Also, for parents, there's optional daycare for kids too.&lt;/p&gt;

&lt;p&gt;Amazing talks about how to convey alerts, metrics, and the decrease of vulnerabilities, reporting graphs to directors, leaderships. Collab with other team members and building a working relationship and giving them  a helping hand which gives you a view of their world. Building security fortress by implementing a security zero trust model with security best practices. &lt;/p&gt;

&lt;p&gt;Most importantly is about networking and meeting new people. By striking up a conversation I meet some awesome people and I'm looking forward to next year and the continuation of BTC!!!&lt;/p&gt;

&lt;p&gt;You can head here to BTC &lt;a href="https://blueteamcon.com/con-history/2022/schedule/" rel="noopener noreferrer"&gt;schedule&lt;/a&gt; &lt;/p&gt;

</description>
      <category>blueteam</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>My Top playlist to listen to while working</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Wed, 26 May 2021 15:47:42 +0000</pubDate>
      <link>https://dev.to/pauld/my-top-playlist-to-listen-to-while-working-5ghp</link>
      <guid>https://dev.to/pauld/my-top-playlist-to-listen-to-while-working-5ghp</guid>
      <description>&lt;p&gt;In this post, I have curated my top playlist to listen to no matter what I'm doing. Some project, work, etc. I have list that range from all over the place and like to share for those searching for new music. Some are instrumental and some have lyrics. Please share other resources in the comments!  &lt;/p&gt;

&lt;p&gt;So I have discovered Code Focus playlist on Spotify. Ones I have picked that I like are below &lt;/p&gt;

&lt;h2&gt;
  
  
  spotify
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="100%" height="380px" src="https://open.spotify.com/embed/playlist/0q2TOW21imzfgAmvXYuLwc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="100%" height="380px" src="https://open.spotify.com/embed/playlist/3vXUEGi4ip1EhI9OtdgdCy"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="100%" height="380px" src="https://open.spotify.com/embed/playlist/0kZeMpCEp3Mhc0Y7SnfPRL"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="100%" height="380px" src="https://open.spotify.com/embed/playlist/6adhFheL5VliYaZFp87Nke"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="100%" height="380px" src="https://open.spotify.com/embed/playlist/0ugHEZezr4vZZ9yNfpIe4z"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  YOUTUBE (at this time you can not add youtube playlist)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://youtube.com/playlist?list=PLX5issW1RvEQ7VRinbkhvkwBPSZA5BvFR"&gt;https://youtube.com/playlist?list=PLX5issW1RvEQ7VRinbkhvkwBPSZA5BvFR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/playlist?list=PLhXK2sumhMUfqyXPPxOHLDcrb5ooeIXyF"&gt;https://youtube.com/playlist?list=PLhXK2sumhMUfqyXPPxOHLDcrb5ooeIXyF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/G4VKQE0TXQM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;another good channel is Mind Amend and has pretty cool graphic videos &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jgjHUUiq5EM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8nx0RGYfdFk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Twitch
&lt;/h2&gt;

&lt;p&gt;I usually go with music live &lt;/p&gt;

</description>
      <category>music</category>
      <category>productivity</category>
      <category>playlist</category>
    </item>
    <item>
      <title>Automate Terraform CLI</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Wed, 03 Mar 2021 17:55:09 +0000</pubDate>
      <link>https://dev.to/pauld/automate-terraform-cli-2f8c</link>
      <guid>https://dev.to/pauld/automate-terraform-cli-2f8c</guid>
      <description>&lt;p&gt;TL:DR&lt;br&gt;
If you want to know more about the mechanisms at hand, head DOWNLOAD &amp;gt; &lt;a href="https://www.terraform.io/downloads.html" rel="noopener noreferrer"&gt;TerraformCLI&lt;/a&gt; and CHECKSUM &amp;gt; &lt;a href="https://www.hashicorp.com/security" rel="noopener noreferrer"&gt;Terraformchksm&lt;/a&gt;&lt;br&gt;
First, create the PGP key and name it hashicorp.asc and save it in the same directory as the Terraform CLI will be installed at. (Click CHECKSUM &lt;a href="https://www.hashicorp.com/security" rel="noopener noreferrer"&gt;https://www.hashicorp.com/security&lt;/a&gt; to copy the PGP key)&lt;br&gt;
Second, I stored the Terraform CLI in the dir that I'm working in, save it at /usr/bin if you're using macOS or Linux. &lt;br&gt;
To start the script, I have created three arguments that will simplify the version and the file version that Hashicorp keeps updating. (for good reasons, I assume the developers want more features in Terraform I'm all for that)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
# Update Terraform version bash script automation
#Arguments
version=$1 #version# 0.2.28
tfver=$2 # terraform_0_2_28_darwin_amd64.zip
tfsha=$3 # terraform_0.2.28_SHA256SUMS
tfshasig=$4 #terraform_0.2.28_SHA256SUMS.sig
cd $HOME/Path/to/TerraformCLI
wget https://releases.hashicorp.com/terraform/$version/$tfver
gpg  --import hashicorp.asc
curl -Os https://releases.hashicorp.com/terraform/$version/$tfsha
curl -Os https://releases.hashicorp.com/terraform/$version/$tfshasig
gpg  --verify $tfshasig $tfsha
shasum -a 256 -c $tfsha
unzip $tfver
rm $tfver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above image is showing four variables version number, file with version, SHA256SUMS with version, and SHA256SUMS.sig with version. &lt;br&gt;
Copy and paste the bash script and chmod +x automateTFCLI.sh, then execute the script with this command&lt;br&gt;
./automateTFCLI.sh 0.12.28 terraform_0.12.28_darwin_amd64.zip terraform_0.12.28_SHA256SUMS terraform_0.12.28_SHA256SUMS.sig&lt;br&gt;
The script takes care of downloading, checking the integrity of the file and then, unzipping and deleting. &lt;br&gt;
Leaving the Terraform CLI inflation (meaning in use)&lt;br&gt;
Next run Terraform - version to output version and confirm you have the working Terraform. &lt;br&gt;
(side note, I was tired of typing long cli commands so I put an alias in bash_profile to shorten it i.e alias tf="terraform" and also &lt;br&gt;
tfplan="terraform init &amp;amp;&amp;amp; terraform plan")&lt;/p&gt;

&lt;p&gt;Hashicorp Terraform has made this much simpler by adding Terraform CLI from the repo using APT. &lt;a href="https://learn.hashicorp.com/tutorials/terraform/install-cli?in=terraform/aws-get-started" rel="noopener noreferrer"&gt;SetupTFCLIAPT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you found this article to be useful please consider buying me a cup of coffee&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>iac</category>
    </item>
    <item>
      <title>TerraForm IaC on Google Cloud Platform provisioning CloudRun and CloudEndpoints </title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Mon, 28 Sep 2020 06:06:40 +0000</pubDate>
      <link>https://dev.to/pauld/terraform-iac-on-google-cloud-platform-provisioning-cloudrun-and-cloudendpoints-2f2f</link>
      <guid>https://dev.to/pauld/terraform-iac-on-google-cloud-platform-provisioning-cloudrun-and-cloudendpoints-2f2f</guid>
      <description>&lt;p&gt;Side note: I'm an intermediate Sys admin and have been building my skills to be proficient. If there's a mistake, please let me know. &lt;/p&gt;

&lt;h3&gt;
  
  
  Warning: Using Terraform v0.13
&lt;/h3&gt;

&lt;p&gt;What is cloud run? Cloud run is a fully self-service managed infrastructure that is capable of automated scaling. &lt;br&gt;
&lt;a href="https://cloud.google.com/run/docs" rel="noopener noreferrer"&gt;cloudrun&lt;/a&gt;&lt;br&gt;
What is TerraForm? Terraform is a multi-cloud infrastructure as code that is open-source. This eliminates human error and reduces time. &lt;br&gt;
&lt;a href="https://www.terraform.io/intro/index.html" rel="noopener noreferrer"&gt;TerraForm&lt;/a&gt;&lt;br&gt;
In this how-to article, I'll show you how to deploy your own API on Cloud Endpoints and use the cloud run service for both Application and API gateway ESPv2 image with Terraform and cloud build. &lt;br&gt;
I followed this tutorial and replicated it through CI/CD pipeline GettingStarted &lt;a href="https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-run#deploy_configuration" rel="noopener noreferrer"&gt;CloudEndpoints&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prerequisites&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Google Cloud Project and account &lt;a href="https://dev.toFresh%20project%20will%20need%20API's%20and%20billing%20enabled"&gt;GCPProject&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Create Github Account and new repository on Github&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Cloud Build app in Github Repo.  and  create cloud build triggers &lt;a href="https://cloud.google.com/cloud-build/docs/automating-builds/create-github-app-triggers" rel="noopener noreferrer"&gt;CloudbuildTr&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create Cloud run GO application, simple hello world CloudrunApp&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Google container registry GCR&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's start with CI/CD pipeline through, my environment has TerraForm in version control (GitHub) with Cloud build triggers app on Github and on Google Cloud Platform. &lt;/p&gt;

&lt;p&gt;I have another write-up. For senior or advance practitioners move to here &lt;/p&gt;

&lt;p&gt;Configuring terraform and google cloud platform will be up to you to decide what is best for your environment but I would highly recommend best practices for both TerraForm and GCP with security in mind. Securing Cloud Run services &lt;a href="https://cloud.google.com/run/docs/tutorials/secure-services#run_secure_invoker-python" rel="noopener noreferrer"&gt;HERE&lt;/a&gt; Also, permissions are important and necessary in order to deploy TerraForm configuration for use of least privilege permissions. I like to keep TerraForm DRY with reusable infrastructure as code so that I can reuse modules. Another key part in this is the template version which I have set to version = "2.1.2".  &lt;br&gt;
I have Cloud Build Triggers app within GitHub repo for dev, staging, and prod. This will create changes that I have made using "VScode" and commit to Github. Cloud Build triggers will be notified by branch name of the commit and running either dockerfile, cloudbuild.yaml. &lt;br&gt;
Cloudbuild.yaml configs, I've set the build time to 7200s just to make sure cloud build gives ample time to finish deploying TerraForm configuration. I grab these simple and customizable steps from this tutorial &lt;a href="https://cloud.google.com/solutions/managing-infrastructure-as-code" rel="noopener noreferrer"&gt;HERE&lt;/a&gt; Basic fundamentals of using TerraForm and GCP Cloud Build.&lt;br&gt;
Versions used in this tutorial &lt;br&gt;
~Google provider 3.35.0&lt;br&gt;
~TerraForm v.0.13.0&lt;br&gt;
Once everything is configured, let's start deploying some TerraForm GCP resources &lt;/p&gt;
&lt;h3&gt;
  
  
  Let's Start
&lt;/h3&gt;

&lt;p&gt;Start by creating a dev folder structure. Here's what's going on, backend.tf is saving remote state to cloud storage bucket. Steps to setup remote state is in the above tutorial, Managing Infrastructure as code. Main.tf is Terraform root dir config, which holds the modules and google provider. Outputs.tf file will pass the output URL from the cloud run modules. Versions.tf is important to keep every TerraForm in sync. &lt;/p&gt;

&lt;p&gt;├── README.md&lt;br&gt;
├── cloudbuild.yaml&lt;br&gt;
├── gcloud_build_image&lt;br&gt;
├── environments&lt;br&gt;
│   └── dev&lt;br&gt;
│       ├── backend.tf&lt;br&gt;
│       ├── main.tf&lt;br&gt;
│       ├── outputs.tf&lt;br&gt;
│       └── versions.tf&lt;br&gt;
│   ├── staging&lt;br&gt;
│   ├── prod&lt;br&gt;
├── modules&lt;br&gt;
│   └── services&lt;br&gt;
│       ├── CloudRun&lt;br&gt;
│       │   ├── cloudrun.tf&lt;br&gt;
│       │   ├── outputs.tf&lt;br&gt;
│       │   └── variables.tf&lt;br&gt;
│       ├── cloudEndpoints&lt;br&gt;
│       │   ├── endpoints.tf&lt;br&gt;
│       │   ├── openapi_spec.yml&lt;br&gt;
│       │   └── variables.tf&lt;/p&gt;

&lt;p&gt;In the Root dir. we have cloudbuild.yaml and gcloud_build_image, also do a readme.md to explain what the repo and how-to so that other team members can get started. &lt;br&gt;
We have modules/services/ TerraForm resources configurations of cloud run and cloud endpoints. For the sake of this tutorial, I have used hello world with a simple cloud endpoint that are used for the hello GO app. You may need to check configuration for security and if needed use CORS and set IAM permission to the cloud run services.  &lt;/p&gt;

&lt;p&gt;Moving on to the cloud run module configs I will start with cloud run services. Here we will use the default of cloud run with IAM policy "no-auth" and created variables for the name, location, and a docker image.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;# GCP cloud run application &lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"google_cloud_run_service"&lt;/span&gt; &lt;span class="s2"&gt;"default"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;spec&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;     &lt;span class="nx"&gt;containers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;       &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dockerimg&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;traffic&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;percent&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;latest_revision&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;autogenerate_revision_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"google_iam_policy"&lt;/span&gt; &lt;span class="s2"&gt;"noauth"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;binding&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"roles/run.invoker"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;members&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;     &lt;span class="s2"&gt;"allUsers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"google_cloud_run_service_iam_policy"&lt;/span&gt; &lt;span class="s2"&gt;"noauth"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_cloud_run_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;project&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_cloud_run_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_cloud_run_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;policy_data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;google_iam_policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;noauth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;policy_data&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;#  variables for Cloud Run                                                              &lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"variable name for cloud run"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"location"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"setting location of service"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-central1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"project"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;" setting project name"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"dockerimg"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"docker img to be used"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;#  outputs for Cloud Run                                                              &lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_cloud_run_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="nx"&gt;urlesp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;trimprefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;google_cloud_run_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"https://"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Next, we have cloud endpoints module configs. I've used the data template file to import openapi_spec.yaml into the cloud endpoint config, I also have it in the cloud endpoint module dir. A couple of things going on here, I've created variables for data openapi.yaml config. This will pass in variables from the TerraForm root config into the cloud endpoint module.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# # ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;# # Cloud endpoints&lt;/span&gt;
&lt;span class="c1"&gt;# # ------------------------------------------------------------------------------&lt;/span&gt;

&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"template_file"&lt;/span&gt; &lt;span class="s2"&gt;"openapi_spec"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;module}&lt;/span&gt;&lt;span class="s2"&gt;/openapi_spec.yml"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vars&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;CloudRunES&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CloudRunESurl&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;HelloAPI&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ClRnSrvapp&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"google_endpoints_service"&lt;/span&gt; &lt;span class="s2"&gt;"api-service"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;service_name&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CloudRunES2url&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;project&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;openapi_config&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;template_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;openapi_spec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rendered&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt; swagger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2.0'&lt;/span&gt;
&lt;span class="na"&gt;  info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;    title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cloud Endpoints + Cloud Run&lt;/span&gt;
&lt;span class="na"&gt;    description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sample API on Cloud Endpoints with a Cloud Run backend&lt;/span&gt;
&lt;span class="na"&gt;    version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;  host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${CloudRunES}&lt;/span&gt;
&lt;span class="na"&gt;  schemes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;    - https&lt;/span&gt;
&lt;span class="na"&gt;  produces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;    - application/json&lt;/span&gt;
&lt;span class="na"&gt;  x-google-backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;    address:${HelloAPI}&lt;/span&gt;
&lt;span class="na"&gt;    protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;h2&lt;/span&gt;
&lt;span class="na"&gt;  paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;    /hello&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;      get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;        summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Greet a user&lt;/span&gt;
&lt;span class="na"&gt;        operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hello&lt;/span&gt;
&lt;span class="na"&gt;        responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;          '200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;            description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;A successful response&lt;/span&gt;
&lt;span class="na"&gt;            schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;              type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"project"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"name of project"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"CloudRunESurl"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"ClRnSrvapp"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ok so now that we have the module services configured we can jump back to the staging folder and configure the Terraform root config (main.tf) &lt;br&gt;
Cloud Run ESPv2 service will be created at the same time as Cloud Run GO application.&lt;br&gt;
Further guide is at this &lt;a href="https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-run#deploy_configuration" rel="noopener noreferrer"&gt;doc&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# # ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;# # Terraform provider&lt;/span&gt;
&lt;span class="c1"&gt;# # --------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="nx"&gt;google&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Project_ID"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"var.region"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"template"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2.1.2"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;#  cloud run and cloud endpoints&lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"HelloAPI"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../../modules/services/CloudRun"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hellotest"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-central1"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Project_ID"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="nx"&gt;dockerimg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gcr.io/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Project_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/cloud-run-hello:v2"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"CloudApiESP"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../../modules/services/CloudRun"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cloudrunesp"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-central1"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Project_ID"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;dockerimg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gcr.io/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Project_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/endpoints-runtime-serverless:cloudapiesp-qutnc7nuq-uc.a.run.app-2020-08-017r0"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;#  variables for Cloud endpoints                                                       &lt;/span&gt;
&lt;span class="c1"&gt;# ------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"cloudEndpoints"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../../modules/services/cloudEndpoints"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Project_ID"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;  &lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;CloudRunESurl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CloudApiESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;urlesp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;   &lt;span class="nx"&gt;ClRnSrvapp&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HelloAPI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above config is calling module services cloud run and in that module we are creating name, location, project, and inputting docker image, which is from Google Container Registry. Cloud Run only runs images from GCR.  Next, in cloud endpoints module we are creating cloud endpoint and the only configuration we are doing is passing in env variables. What this means is passing the output urls from cloud run module to main config as an output and then to cloud endpoints module env. vars. This is the only way to pass environment variables to main config and then to other module service. &lt;br&gt;
Finally, we're going to create the cloud build yaml config for Continuous deployment. What this does is that cloud build will run steps to create a alpine busy box per say and install Terraform and allows for cloud build to cd into the root folder and modules configurations and be provisioned and deployed. I've also typed in TF_LOG=TRACE which will display TerraForm execution in the background through the cloud build, build log. &lt;br&gt;
Cloudbuild.yaml&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="c1"&gt;# Copyright 2019 Google LLC&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Licensed under the Apache License, Version 2.0 (the "License");&lt;/span&gt;
&lt;span class="c1"&gt;# you may not use this file except in compliance with the License.&lt;/span&gt;
&lt;span class="c1"&gt;# You may obtain a copy of the License at&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;#     https://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Unless required by applicable law or agreed to in writing, software&lt;/span&gt;
&lt;span class="c1"&gt;# distributed under the License is distributed on an "AS IS" BASIS,&lt;/span&gt;
&lt;span class="c1"&gt;# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;
&lt;span class="c1"&gt;# See the License for the specific language governing permissions and&lt;/span&gt;
&lt;span class="c1"&gt;# limitations under the License.&lt;/span&gt;
&lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;7200s&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="c1"&gt;# - name: gcr.io/cloud-builders/gcloud&lt;/span&gt;
&lt;span class="c1"&gt;#   entrypoint: 'bash'&lt;/span&gt;
&lt;span class="c1"&gt;#   args: &lt;/span&gt;
&lt;span class="c1"&gt;#     - '-c'&lt;/span&gt;
&lt;span class="c1"&gt;#     - |-&lt;/span&gt;
&lt;span class="c1"&gt;#       chmod +x gcloud_build_image &lt;/span&gt;
&lt;span class="c1"&gt;#       ./gcloud_build_image -s ${cloudrun-esp}-${cloudrun-hash}-uc.a.run.app -c ${config-id} -p ${project-id}&lt;/span&gt;
&lt;span class="s"&gt; &lt;/span&gt;
&lt;span class="s"&gt;  &lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;branch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name'&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;alpine'&lt;/span&gt;
&lt;span class="na"&gt;  entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt; &lt;span class="s"&gt; &lt;/span&gt;
&lt;span class="s"&gt;  args: &lt;/span&gt;
&lt;span class="s"&gt;  - '-c'&lt;/span&gt;
&lt;span class="s"&gt;  - | &lt;/span&gt;
&lt;span class="s"&gt;      echo "***********************"&lt;/span&gt;
&lt;span class="s"&gt;      echo "$BRANCH_NAME"&lt;/span&gt;
&lt;span class="s"&gt;      echo "***********************"&lt;/span&gt;
&lt;span class="s"&gt; &lt;/span&gt; &lt;span class="c1"&gt;#[start tf-init]&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;init'&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;hashicorp/terraform:0.13.0'&lt;/span&gt;
&lt;span class="na"&gt;  entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;
&lt;span class="s"&gt;  args: &lt;/span&gt;
&lt;span class="s"&gt;  - '-c'&lt;/span&gt;
&lt;span class="s"&gt;  - |&lt;/span&gt;
&lt;span class="s"&gt;      if [ -d "environments/$BRANCH_NAME/" ]; then&lt;/span&gt;
&lt;span class="s"&gt;        cd environments/$BRANCH_NAME&lt;/span&gt;
&lt;span class="s"&gt;        terraform init&lt;/span&gt;
&lt;span class="s"&gt;      else&lt;/span&gt;
&lt;span class="s"&gt;        for dir in environments/*/&lt;/span&gt;
&lt;span class="s"&gt;        do &lt;/span&gt;
&lt;span class="s"&gt;          cd ${dir}   &lt;/span&gt;
&lt;span class="s"&gt;          env=${dir%*/}&lt;/span&gt;
&lt;span class="s"&gt;          env=${env*/}&lt;/span&gt;
&lt;span class="s"&gt;          echo ""&lt;/span&gt;
&lt;span class="s"&gt;          echo "*************** TERRAFORM INIT ******************"&lt;/span&gt;
&lt;span class="s"&gt;          echo "******* At environment&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${env} ********"&lt;/span&gt;
&lt;span class="s"&gt;          echo "*************************************************"&lt;/span&gt;
&lt;span class="s"&gt;          terraform init || exit &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="s"&gt;          cd ../../&lt;/span&gt;
&lt;span class="s"&gt;        done&lt;/span&gt;
&lt;span class="s"&gt;      fi &lt;/span&gt;
&lt;span class="s"&gt;  &lt;/span&gt;
&lt;span class="c1"&gt;# [START tf-plan]&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;plan'&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;hashicorp/terraform:0.13.0'&lt;/span&gt;
&lt;span class="na"&gt;  entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;
&lt;span class="s"&gt;  args: &lt;/span&gt;
&lt;span class="s"&gt;  - '-c'&lt;/span&gt;
&lt;span class="s"&gt;  - | &lt;/span&gt;
&lt;span class="s"&gt;      if [ -d "environments/$BRANCH_NAME/" ]; then&lt;/span&gt;
&lt;span class="s"&gt;        cd environments/$BRANCH_NAME&lt;/span&gt;
&lt;span class="s"&gt;        terraform plan&lt;/span&gt;
&lt;span class="s"&gt;        &lt;/span&gt;
&lt;span class="s"&gt;      else&lt;/span&gt;
&lt;span class="s"&gt;        for dir in environments/*/&lt;/span&gt;
&lt;span class="s"&gt;        do &lt;/span&gt;
&lt;span class="s"&gt;          cd ${dir}   &lt;/span&gt;
&lt;span class="s"&gt;          env=${dir%*/}&lt;/span&gt;
&lt;span class="s"&gt;          env=${env*/}  &lt;/span&gt;
&lt;span class="s"&gt;          echo ""&lt;/span&gt;
&lt;span class="s"&gt;          echo "*************** TERRAFOM PLAN ******************"&lt;/span&gt;
&lt;span class="s"&gt;          echo "******* At environment&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${env} ********"&lt;/span&gt;
&lt;span class="s"&gt;          echo "*************************************************"&lt;/span&gt;
&lt;span class="s"&gt;          terraform plan  || exit &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="s"&gt;          cd ../../&lt;/span&gt;
&lt;span class="s"&gt;          cat crash.log &lt;/span&gt;
&lt;span class="s"&gt;        done&lt;/span&gt;
&lt;span class="s"&gt;      fi &lt;/span&gt;
&lt;span class="s"&gt;  &lt;/span&gt;
&lt;span class="s"&gt; # [END tf-plan]&lt;/span&gt;
&lt;span class="c1"&gt;#[START tf-apply]&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;apply'&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;hashicorp/terraform:0.13.0'&lt;/span&gt;
&lt;span class="na"&gt;  entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sh'&lt;/span&gt;
&lt;span class="s"&gt;  args: &lt;/span&gt;
&lt;span class="s"&gt;  - '-c'&lt;/span&gt;
&lt;span class="s"&gt;  - | &lt;/span&gt;
&lt;span class="s"&gt;      if [ -d "environments/$BRANCH_NAME/" ]; then&lt;/span&gt;
&lt;span class="s"&gt;        cd environments/$BRANCH_NAME      &lt;/span&gt;
&lt;span class="s"&gt;        export TF_LOG=TRACE&lt;/span&gt;
&lt;span class="s"&gt;        terraform apply -auto-approve &lt;/span&gt;
&lt;span class="s"&gt;      else&lt;/span&gt;
&lt;span class="s"&gt;        echo "***************************** SKIPPING APPLYING *******************************"&lt;/span&gt;
&lt;span class="s"&gt;        echo "Branch '$BRANCH_NAME' does not represent an oficial environment."&lt;/span&gt;
&lt;span class="s"&gt;        echo "*******************************************************************************"&lt;/span&gt;
&lt;span class="s"&gt;      fi&lt;/span&gt;

&lt;span class="s"&gt; &lt;/span&gt;
&lt;span class="s"&gt; &lt;/span&gt;
&lt;span class="c1"&gt;#[START tf-destroy]&lt;/span&gt;
&lt;span class="c1"&gt;# - id: 'tf destroy'&lt;/span&gt;
&lt;span class="c1"&gt;#   name: 'hashicorp/terraform:0.13.0'&lt;/span&gt;
&lt;span class="c1"&gt;#   entrypoint: 'sh'&lt;/span&gt;
&lt;span class="c1"&gt;#   args: &lt;/span&gt;
&lt;span class="c1"&gt;#   - '-c'&lt;/span&gt;
&lt;span class="c1"&gt;#   - | &lt;/span&gt;
&lt;span class="c1"&gt;#       if [ -d "environments/$BRANCH_NAME/" ]; then&lt;/span&gt;
&lt;span class="c1"&gt;#         cd environments/$BRANCH_NAME      &lt;/span&gt;
&lt;span class="c1"&gt;#         export TF_LOG=TRACE&lt;/span&gt;
&lt;span class="c1"&gt;#         terraform destroy -auto-approve &lt;/span&gt;
&lt;span class="c1"&gt;#       else&lt;/span&gt;
&lt;span class="c1"&gt;#         echo "***************************** SKIPPING APPLYING *******************************"&lt;/span&gt;
&lt;span class="c1"&gt;#         echo "Branch '$BRANCH_NAME' does not represent an oficial environment."&lt;/span&gt;
&lt;span class="c1"&gt;#         echo "*******************************************************************************"&lt;/span&gt;
&lt;span class="c1"&gt;#       fi&lt;/span&gt;
&lt;span class="s"&gt; &lt;/span&gt; &lt;span class="c1"&gt;#[end tf-destroy]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once all has been configured, we can then commit to GitHub branch to deploy. We will have two Cloud Run services and one Cloud Endpoints. &lt;br&gt;
Next, we will need to redeploy Cloud Run ESPv2 by rebuilding it, using the gcloud_build_image script provided at the bottom of this tutorial &lt;a href="https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-run" rel="noopener noreferrer"&gt;GcloudBuildImage&lt;/a&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="c1"&gt;# - name: gcr.io/cloud-builders/gcloud&lt;/span&gt;
&lt;span class="c1"&gt;#   entrypoint: 'bash'&lt;/span&gt;
&lt;span class="c1"&gt;#   args: &lt;/span&gt;
&lt;span class="c1"&gt;#     - '-c'&lt;/span&gt;
&lt;span class="c1"&gt;#     - |-&lt;/span&gt;
&lt;span class="c1"&gt;#       chmod +x gcloud_build_image &lt;/span&gt;
&lt;span class="c1"&gt;#       ./gcloud_build_image -s ${cloudrun-esp}-${cloudrun-hash}-uc.a.run.app -c ${config-id} -p ${project-id}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will need to copy Google Container Registry image name so that we can enter that in the Cloud Run ESPv2 Cloud Run service to be redeployed. All we need to do is copy the ESPv2 image name and paste it in the dockimg= ESPv2 image name in the Cloud Run ESPv2 module of TerrForm main.tf. &lt;br&gt;
We should be able to go to the Cloud Endpoint URL is a form of Cloud Run ESPv2 URL /hello.&lt;/p&gt;

&lt;p&gt;i.e https://${cloudapiesp-url}-CloudRun-hash.a.run.app/hello&lt;/p&gt;

&lt;p&gt;Next, we will change some code on the Cloud Run GO application for continuous integration while rebuilding Cloud Run service. I have a separate GitHub repo. for my Cloud Run application. &lt;br&gt;
Inside of that separate Cloud Run application GitHub Repo. I have a cloudbuild.yaml that is configured with Cloud Build Triggers to that GitHub repo. So everytime I make a commit, I can then run the Continous integration everytime I commit.&lt;br&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="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/cloudrun-hello'&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="na"&gt;-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gcr.io/cloudbuilders/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/cloudrun-hello'&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/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="nv"&gt; "run"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;
&lt;span class="nv"&gt;"deploy"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hellotest"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt; - image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gcr.io/project_id/cloudrun-hello"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt; - region"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-central1"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt; - platform"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;managed"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt; - allow-unauthenticated"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You could also build the Cloud Run hello application with a new tag then, update the cloud run on the TerraForm config to deploy with the new tag. Cloud Run is not aware of any application update and doesn't automatically pull the latest image from GCR. In the above gcloud cloud build config, you can run a build of docker container image with the new tag&lt;br&gt;
i.e&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;args: [ 'build', '-t', 'gcr.io/project_id/cloudrun-hello:v2', '.'] 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of running the docker push command and gcloud deploy command. &lt;br&gt;
Eliminating overhead and complexity. &lt;/p&gt;

&lt;p&gt;Then, head back to the module HelloAPI and change the docker image to the version that you set above in the cloudbuild step config.&lt;/p&gt;

&lt;p&gt;Let me know of feedback&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>terraform</category>
      <category>openapi</category>
    </item>
    <item>
      <title>Automate start and stop of Google Cloud Compute Engine</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Sat, 11 Jul 2020 18:03:27 +0000</pubDate>
      <link>https://dev.to/pauld/automate-start-and-stop-of-google-cloud-compute-engine-22a8</link>
      <guid>https://dev.to/pauld/automate-start-and-stop-of-google-cloud-compute-engine-22a8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgkueypom4ulw23yot4eg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgkueypom4ulw23yot4eg.jpg" alt="Alt Text" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@lucabravo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Luca Bravo&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/bash-script?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Start and stop Google Compute Engine for developing (keeps cost and resources down)
&lt;/h1&gt;

&lt;p&gt;This script will start/stop Google Compute Engine vm instance, script starts a vm instance for anyone to use and test in a dev environment. &lt;br&gt;
Once task are done simply exit out of ssh and the script will automatically turn off the vm instances. &lt;/p&gt;

&lt;p&gt;You will need the &lt;a href="https://cloud.google.com/sdk/install" rel="noopener noreferrer"&gt;GCLOUDSDK&lt;/a&gt; and setup ssh keys or os login for the vm instance. &lt;/p&gt;

&lt;p&gt;Download to dir and chmod +x startopvm.sh (or whatever name you want to call it) and then enter the input of which vm instances you are using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./startopvm.sh project_name vm_instance zone 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#! /bin/bash

gcloud info 

gcloud projects list

# arguments

Project=$1   #project id that you'll be working on 

vminsta=$2  #vm instances name that you are starting within that project id 

zone=$3    # zone of vm instance that is running in, this format will be in i.e  --zone=us-central1-a 

gcloud config set project $Project 

gcloud compute instances list 


gcloud compute instances start $vminsta $zone

gcloud compute ssh $vminsta $zone



# An error exit function

error_exit()
{
    echo "$1" 1&amp;gt;&amp;amp;2
    exit 1
}

# Using error_exit

if gcloud compute instances list --filter="status=running"; then

  echo "Instance name: $instances"

else
    error_exit "Cannot start!  Aborting."
fi 
  if echo "logout"; then 
  gcloud compute instances stop $vminsta $zone 

  echo "gcloud compute instances stopping"  

else

  error_exit "cannot stop" 
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you're done developing or testing simply enter exit in the ssh vm instance and the script will shutdown the vm instance. &lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>automation</category>
      <category>bash</category>
      <category>scripting</category>
    </item>
    <item>
      <title>Deploy RoR on GAE and Codeship CI/CD pipeline</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Fri, 19 Jul 2019 19:21:31 +0000</pubDate>
      <link>https://dev.to/pauld/deploy-ror-on-gae-and-codeship-ci-cd-pipeline-21k4</link>
      <guid>https://dev.to/pauld/deploy-ror-on-gae-and-codeship-ci-cd-pipeline-21k4</guid>
      <description>&lt;h2&gt;
  
  
  A continuous integration and continuous deployment to Google App Engine with Ruby on Rails
&lt;/h2&gt;

&lt;p&gt;I have the time to gain knowledge in deploying a Ruby on Rails app to Google Cloud Platform. Creating a CI/CD pipeline with CloudBees Codeship to Google App Engine (GAE). GAE is a very simplistic way of deploying services that. More information on GAE can be found here. &lt;a href="https://cloud.google.com/appengine/" rel="noopener noreferrer"&gt;GAE Docs&lt;/a&gt;&lt;br&gt;
GAE is very easy to do a blue/green canary upgrade and many other features. There's quite a bit of working gears per say in this deployment but once done, any changes to the code will be simplistically. Only down side I have to this is that the cloudbuild takes forever to build and if you had to change one line of code, you'll be waiting for at least two hours.&lt;/p&gt;

&lt;p&gt;To start we select GAE app engine flex. I ended up building my own Ruby image through Docker and pushed it to GCR (Google Container Registry). The current app engine flex was not compatible with our version of RoR. Other, services included GCP Sql (postgres) and GCP memorystore (redis). &lt;br&gt;
I also added sidekiq to create an instance to connect with cloud sql.(detailed below)&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="s"&gt;cloudsql sidekiq&lt;/span&gt;
&lt;span class="na"&gt;beta_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cloud_sql_instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GCP_Project_ID:us-central1:Name_CloudSql&lt;/span&gt;

&lt;span class="na"&gt;network&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="s"&gt;default&lt;/span&gt;

&lt;span class="na"&gt;skip_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.bundle&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.byebug_history&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.vscode/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.idea/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;storage/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;vendor/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;log/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tmp/&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use CloudBees Codeship services for a secure CI/CD pipeline and GCP KMS to encrypt credentials. &lt;/p&gt;

&lt;p&gt;With deploying to GAE you will need to add Dockerfile which is then built on cloudbuild. Let's get into the trenches and build something cool. &lt;br&gt;
(examples only)&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="s"&gt;FROM gcr.io/GCP_Project_Name/Name_of_Image&lt;/span&gt;

&lt;span class="s"&gt;EXPOSE &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;
&lt;span class="s"&gt;ARG ruby_version=2.5.3&lt;/span&gt;
&lt;span class="s"&gt;ARG bundler_version=1.17.1&lt;/span&gt;

&lt;span class="c1"&gt;# Ruby&lt;/span&gt;
&lt;span class="s"&gt;ENV DEFAULT_RUBY_VERSION=${ruby_version}&lt;/span&gt;

&lt;span class="c1"&gt;# Install Ruby, set default Ruby version, and install Bundler&lt;/span&gt;
&lt;span class="s"&gt;RUN rbenv global 2.5.3&lt;/span&gt;

&lt;span class="c1"&gt;# Workdir&lt;/span&gt;
&lt;span class="s"&gt;ADD . /workspace/&lt;/span&gt;
&lt;span class="s"&gt;WORKDIR /workspace/&lt;/span&gt;

&lt;span class="c1"&gt;# CloudSQL&lt;/span&gt;
&lt;span class="s"&gt;VOLUME /cloudsql&lt;/span&gt;

&lt;span class="c1"&gt;# Set up environment variables used in production&lt;/span&gt;
&lt;span class="s"&gt;ENV RACK_ENV=production \&lt;/span&gt;
&lt;span class="s"&gt;RAILS_ENV=production \&lt;/span&gt;
&lt;span class="s"&gt;RAILS_SERVE_STATIC_FILES=true&lt;/span&gt;

&lt;span class="c1"&gt;# Run bundle&lt;/span&gt;
&lt;span class="s"&gt;RUN gem install bundler&lt;/span&gt; 
&lt;span class="s"&gt;RUN rbenv exec gem install bundler&lt;/span&gt;
&lt;span class="s"&gt;RUN bundle install --deployment --without="development test"&lt;/span&gt;

&lt;span class="c1"&gt;#ARG for authentication docker image &lt;/span&gt;
&lt;span class="s"&gt;ARG DB_PASS&lt;/span&gt;
&lt;span class="s"&gt;ARG SECRET_B_KEY&lt;/span&gt; 


&lt;span class="c1"&gt;#env-variable for app-beta.yaml and worker-beta.yaml&lt;/span&gt;
&lt;span class="s"&gt;ENV SECRET_KEY_BASE=${SECRET_B_KEY}&lt;/span&gt;
&lt;span class="s"&gt;ENV RAILS_ENV="production"&lt;/span&gt;
&lt;span class="s"&gt;ENV RACK_ENV="production"&lt;/span&gt;
&lt;span class="s"&gt;ENV SERVICE_NAME="authentication"&lt;/span&gt;
&lt;span class="s"&gt;ENV REDIS_HOST="10.0.0.3"&lt;/span&gt;
&lt;span class="s"&gt;ENV REDIS_PORT=6379&lt;/span&gt;
&lt;span class="s"&gt;ENV DATABASE_USER="postgres"&lt;/span&gt;
&lt;span class="s"&gt;ENV DATABASE_PASS=${DB_PASS}&lt;/span&gt;
&lt;span class="s"&gt;ENV DATABASE_NAME="postgres"&lt;/span&gt;
&lt;span class="s"&gt;ENV DATABASE_HOST="/cloudsql/GCP-project:us-central1:nameofdb"&lt;/span&gt;
 &lt;span class="s"&gt;ENV RAILS_LOG_TO_STDOUT&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enabled&lt;/span&gt;
 &lt;span class="s"&gt;ENV RAILS_SERVE_STATIC_FILES&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enabled&lt;/span&gt;
 &lt;span class="s"&gt;ENV LANG&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en_US.UTF-8&lt;/span&gt;

&lt;span class="c1"&gt;# Entrypoint&lt;/span&gt;
&lt;span class="s"&gt;CMD bundle exec puma -p 8080 -e production &amp;amp;&amp;amp; bundle exec sidekiq -t 120 -C config/sidekiq.yml&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see the &lt;em&gt;ENV-Var&lt;/em&gt; are not what you expect. This is because I have encrypted them until they reach GAE where GCP KMS decrypts them automatically (More on this later) &lt;/p&gt;

&lt;p&gt;Creating own docker ruby image and pushing to Google Container Registery&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="c"&gt;# Use the base image provided by Google&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; gcr.io/gcp-runtimes/ruby/ubuntu16&lt;/span&gt;

&lt;span class="c"&gt;# Ruby 2.4.5&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; ruby_version=2.4.5&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; bundler_version=1.17.1&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;rbenv &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ruby_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv global &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ruby_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv rehash &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;bundle version &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="o"&gt;||&lt;/span&gt; gem &lt;span class="nb"&gt;install &lt;/span&gt;bundler &lt;span class="nt"&gt;--version&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bundler_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv rehash &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; gem cleanup

&lt;span class="c"&gt;# Ruby 2.5.3&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; ruby_version=2.5.3&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; bundler_version=1.17.1&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;rbenv &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ruby_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv global &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ruby_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv rehash &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;bundle version &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="o"&gt;||&lt;/span&gt; gem &lt;span class="nb"&gt;install &lt;/span&gt;bundler &lt;span class="nt"&gt;--version&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bundler_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv rehash &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; gem cleanup

&lt;span class="c"&gt;# Ruby 2.6.1&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; ruby_version=2.6.1&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; bundler_version=2.0.1&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;rbenv &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ruby_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv global &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ruby_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv rehash &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;bundle version &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1 &lt;span class="se"&gt;\
&lt;/span&gt;        &lt;span class="o"&gt;||&lt;/span&gt; gem &lt;span class="nb"&gt;install &lt;/span&gt;bundler &lt;span class="nt"&gt;--version&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;bundler_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rbenv rehash &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; gem cleanup

&lt;span class="c"&gt;# ENV&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; DEFAULT_RUBY_VERSION=${ruby_version}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also wanted to point out cloudsql is proxied already within sidekiq&lt;br&gt;
add the configuration within -config -database.yml and in the  Dockerfile ENV DATABASE_HOST=.&lt;/p&gt;
&lt;h2&gt;
  
  
  Now moving on to CloudBees CODESHIP
&lt;/h2&gt;

&lt;p&gt;CloudBees Codeship has a very simple and secure way for CI/CD pipeline. In order to do this you can get a free service or paid service. In the example below is by a pro subscription. &lt;a href="https://documentation.codeship.com/pro/continuous-deployment/google-cloud/" rel="noopener noreferrer"&gt;CloudBees Codeship GCP&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Arconapalus/GCP-example-solutions" rel="noopener noreferrer"&gt;my examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We need to authenticate CloudBees Codeship to GCP&lt;/em&gt; &lt;br&gt;
this will be done by going to projects and then projects setting and getting an aes key so that jet cli (which is run on docker) to encrypt the env_var of GCP project credentials. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Create service and steps for CloudBees Codeship to execute to GCP&lt;/em&gt; &lt;br&gt;
Codeship GCP service should look something like this&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;googleclouddeployment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;codeship/google-cloud-deployment&lt;/span&gt;
  &lt;span class="na"&gt;encrypted_env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;env_e.encrypted&lt;/span&gt;
  &lt;span class="na"&gt;add_docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;working_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/google-deploy.sh&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./:/deploy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;though depending if you are deploying on more than one GCP service such as GKE, then the service will be more detailed. &lt;/p&gt;

&lt;p&gt;Codeship GCP steps should look something like this&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="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="s"&gt;google-cloud-deployment&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;googleclouddeployment&lt;/span&gt;
  &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash /deploy/google-deploy.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and finally Codeship GCP google-deploy.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
#!/bin/bash
set -e
# Authenticate with the Google Services
codeship_google authenticate
echo "Setting default project $GOOGLE_PROJECT_ID"
gcloud config set project *Project_name

# switch to the directory containing your app.yml (or similar) configuration file
# note that your repository is mounted as a volume to the /deploy directory
cd /deploy/
# deploy the application
gcloud builds submit --config cloudbuild.yaml --verbosity debug

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CloudBuild.yaml which is doing to build the docker and push to GAE
&lt;/h2&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 Docker 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;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bash'&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;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-t&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gcr.io/$PROJECT_ID/_service_:latest&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--build-arg&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;DB_PASS=$$DATABASE_PASS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--build-arg&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SECRET_B_KEY=$$SECRET_KEY&lt;/span&gt;
&lt;span class="s"&gt;.'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;secretEnv&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;DATABASE_PASS'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SECRET_KEY'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Build Docker authentication-worker 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;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bash'&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="s"&gt;gcr.io/$PROJECT_ID/appengine/_Service_:latest --build-arg DB_PASS=$$DATABASE_PASS --build-arg SECRET_B_KEY=$$SECRET_KEY --build-arg  .']&lt;/span&gt;

  &lt;span class="s"&gt;args&lt;/span&gt;&lt;span class="err"&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;-c'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-t&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gcr.io/$PROJECT_ID/_Service_:latest&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--build-arg&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;DB_PASS=$$DATABASE_PASS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--build-arg&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SECRET_B_KEY=$$SECRET_KEY&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--build-arg&lt;/span&gt;&lt;span class="nv"&gt;  &lt;/span&gt;&lt;span class="s"&gt;.'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;secretEnv&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;DATABASE_PASS'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SECRET_KEY'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="c1"&gt;# Push it to GCR.&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/_Service_'&lt;/span&gt;&lt;span class="pi"&gt;]&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/_Service_'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  

&lt;span class="c1"&gt;# build to google app engine &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/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;app'&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;app.yaml'&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-url=gcr.io/$PROJECT_ID/_Service_'&lt;/span&gt;&lt;span class="pi"&gt;]&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/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;app'&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;worker.yaml'&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-url=gcr.io/$PROJECT_ID/_Service_'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1600s&lt;/span&gt;


&lt;span class="c1"&gt;#KMS secrets &lt;/span&gt;
&lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;             
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;kmsKeyName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;projects/_Project-name_/locations/global/keyRings/KR_NAME/cryptoKeys/CK_name&lt;/span&gt;
  &lt;span class="na"&gt;secretEnv&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;DATABASE_PASS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;KMS encyption base_64&lt;/span&gt;
      &lt;span class="na"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;KMS encyption base_64&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lot is going on here but I want to point out that the KMS is decrypted as soon as it hits GCP network, so simple for automation. &lt;/p&gt;

&lt;p&gt;The way I automated this was creating a script to convert this from plain text to encrypted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash


gcloud kms encrypt --plaintext-file=filename.txt --ciphertext-file=filename.enc.txt --location=global --keyring=KR_Name --key=CK_Name

base64 filename.enc.txt -i 0 &amp;gt; filename.enc64.txt

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(this is for macos bash terminal, the base64 will be different for other os. Also, gcloud sdk was installed) &lt;/p&gt;

&lt;p&gt;Here is the file structure &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvzozy4qkinohciu3lra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvzozy4qkinohciu3lra.png" alt="FileStructure" width="242" height="969"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>googlecloud</category>
      <category>googleappengine</category>
    </item>
  </channel>
</rss>
