<?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>Forem: Eran Bibi</title>
    <description>The latest articles on Forem by Eran Bibi (@erancloud).</description>
    <link>https://forem.com/erancloud</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%2F866049%2Fac3cccc5-2730-45cd-a8de-19b1389d9d0c.jpg</url>
      <title>Forem: Eran Bibi</title>
      <link>https://forem.com/erancloud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/erancloud"/>
    <language>en</language>
    <item>
      <title>Okta as Code - Identity Management in the Cloud Native Era</title>
      <dc:creator>Eran Bibi</dc:creator>
      <pubDate>Sun, 09 Apr 2023 07:39:21 +0000</pubDate>
      <link>https://forem.com/gofirefly/okta-as-code-identity-management-in-the-cloud-native-era-165e</link>
      <guid>https://forem.com/gofirefly/okta-as-code-identity-management-in-the-cloud-native-era-165e</guid>
      <description>&lt;p&gt;We have previously written posts on how to manage &lt;a href="https://www.gofirefly.io/blog/top-aws-unmanaged-resources-that-you-should-know-about"&gt;uncodified legacy apps&lt;/a&gt; on different platforms like AWS.  In this post, we’d like to take a look at the very popular Okta platform, which provides some of the largest companies in the world cloud-based identity and access management (IAM) for secure authentication and authorization for applications, devices, and users. &lt;/p&gt;

&lt;p&gt;‍Okta is likely the most popular choice for organizations that need to manage access to their digital resources across multiple applications and environments, as it provides a range of features that make it popular for authentication and authorization, such as:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Single sign-on (SSO)&lt;/li&gt;
    &lt;li&gt;Multi-factor authentication (MFA)&lt;/li&gt;
    &lt;li&gt;User management&lt;/li&gt;
    &lt;li&gt;Integration with a wide range of APIs and SDKs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;‍In this post we’d like to dive into why managing Okta configuration as code, like any other cloud application should be a best practice.  The diversity of challenges codifying your Okta will help you overcome, and how to get started migrating your manual config to as-code config in Okta.&lt;/p&gt;

&lt;h2&gt;Manually Configuring Okta Gone Wrong&lt;/h2&gt;

&lt;p&gt;Okta is a forward-thinking cloud-based IAM platform, and was built with extensible APIs to enable it to align with IaC best practices.  However, the teams that usually manage Okta implementations are largely from the IT domain, and less DevOps, and either are less familiar with this approach to configuring Okta, or don’t have the domain expertise to do so.&lt;/p&gt;

&lt;p&gt;Let’s get started with going through some of the challenges Okta-as-Code can help overcome, and good ways to get started with codifying your Okta operation.&lt;/p&gt;

&lt;h3&gt;Policy as Code for Okta - Misconfiguration Prevention&lt;/h3&gt;

&lt;p&gt;Like any other cloud assets, Okta too can be prone to human misconfigurations and errors––which is why the world of cloud and containers has endless amounts of tools to help identify and mitigate such errors before being deployed to production.  However, since Okta is oftentimes manually configured, there aren’t even the same safeguards for rollback, history tracking, revisions and more.&lt;/p&gt;

&lt;p&gt;‍By configuring Okta manually, and not as code––you lose the opportunity to apply CI/CD to your code, PR/MR workflows and gating, as well as the guardrails available in these processes for reviewing your code, ensuring its quality, and then deploying to production. There are countless horror stories on the internet of manual configurations gone wrong, with no ability to roll these back or recover the previous state when manually configured.  Even Okta, due to its high level of security, does not have any way to recover the accounts of admins who mistakenly deploy misconfigurations that cannot be reverted through git practices. &lt;/p&gt;

&lt;p&gt;‍Once you have defined policy best practices in your organization, it is important to apply these globally to your entire cloud and SaaS-based operation, whether its DevOps tools or IAM platforms.  This is where IaC can help level up your Okta operation. &lt;/p&gt;

&lt;p&gt;‍Leveraging IaC for your Okta configuration will enable you to gain the known benefits git makes possible, including history tracking, change management, revision approval workflows, and CI/CD gating for your Okta configurations.  In addition to this, you can take this one step further and apply the relevant policies to your code in your CI/CD pipelines, fail/pass build based on configuration checks and much more, before deploying to production.&lt;/p&gt;

&lt;p&gt;‍One more critical inherent value made possible through IaC, is the ability to create a backup of your configuration in Git.  Aside from change management, this can also be a distributed, highly-available form of disaster recovery in the event of a ransomware attack or a hostile takeover of the admin account, which can reduce stress in a high-stress scenario.&lt;/p&gt;

&lt;h3&gt;ClickOps Doesn’t Scale - IaC to the Rescue&lt;/h3&gt;

&lt;p&gt;Once you choose to configure your Okta as code there are immediate benefits you derive in the form of automation, on top of the safety and guardrails these make possible.  As noted above Okta comes with out of the box SSO, MFA, user management and integration with third-party software.&lt;/p&gt;

&lt;p&gt;‍Let’s provide a quick overview of how this works.  &lt;/p&gt;

&lt;p&gt;‍For SSO, Okta enables users to authenticate themselves once and gain access to multiple applications without the need to enter separate credentials for each one. This reduces the risk of weak or reused passwords and simplifies the user experience.&lt;/p&gt;

&lt;p&gt;‍In addition, most large enterprises today require at the very least 2FA if not MFA for accessing company resources. Okta supports a range of MFA methods, including SMS, voice, and push notifications, as well as hardware tokens and biometric factors. This adds an extra layer of security to the authentication process, making it more difficult for attackers to gain access to sensitive resources.&lt;/p&gt;

&lt;p&gt;‍When it comes to user management, Okta allows administrators to manage user accounts and permissions across multiple applications and environments from a single console. This simplifies the process of provisioning and de-provisioning users, and helps ensure that access is granted and revoked in a timely manner.&lt;/p&gt;

&lt;p&gt;‍Finally, Okta provides a range of APIs and SDKs that make it easy to integrate with other applications and platforms. This allows organizations to leverage their existing technology investments while adding an additional layer of security to their authentication and authorization processes.&lt;/p&gt;

&lt;p&gt;‍As you can see, that is a very wide range of mission-critical capabilities that security-minded enterprises today require to be able to properly manage access and authorization at scale.  However, doing this manually for just tens of users sounds ludicrous, so let’s not talk about with hundreds, thousands, and even tens of thousands of employees.&lt;/p&gt;

&lt;p&gt;‍By codiyfing your Okta config, you can also apply automation to your processes around onboarding, revising, and removing users, changing their access to different applications, adding applications, removing OAuth access, just to name a few of the common activities constantly performed by administrators on a daily basis for organizational asset safekeeping.  Without automation this becomes a nearly impossible feat––and also loses the ability to track changes and history over time, or any other critical information with regards to managing critical company assets.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h3&gt;Okta Config as Code in Action&lt;/h3&gt;

&lt;p&gt;All of this is why the Okta Terraform provider has millions of all time downloads, and tens of thousands monthly.  In the example below we’ll demonstrate how you can quickly take your manual &lt;a href="https://info.gofirefly.io/okta-configuration" rel="noopener noreferrer"&gt;Okta config,&lt;/a&gt; and convert to Terraform code, to be able to have the power of git coupled with automation your cloud-based IAM requires.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;&lt;a href="https://info.gofirefly.io/okta-configuration"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hxoqadrl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lazel9jwv65fsmcj34h4.png" alt="Image description" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Treat Your Okta Like All Your Cloud Assets&lt;/h2&gt;

&lt;p&gt;Overall, Okta's popularity for authentication and authorization is driven by how it changed cloud-based IAM for the better––with its ease of use, flexibility and integration features for the diversity of applications used today, and robust security features. By helping organizations improve their security posture and streamline their access management processes, it has become the nearly de facto tool for any organization that needs to manage access to their digital resources. &lt;/p&gt;

&lt;p&gt;‍With such scale and adoption, Okta can benefit from applying the same as-code best practices from other disciplines and cloud worlds, which is possible due to its open APIs that are quite powerful.  Many organizations have learned to leverage Terraform to codify their Okta configurations, and those who have not yet, should most certainly get started with doing so.  Okta as code will enable greater safety, guardrails, recovery, tracking and change management, alongside greater scale and automation.  With today’s tooling, Terraform providers and more you can quickly migrate your existing configurations to code and provide your organization with greater confidence and security of your IAM operation.&lt;/p&gt;

</description>
      <category>iac</category>
      <category>infrastructureascode</category>
      <category>devops</category>
      <category>saas</category>
    </item>
    <item>
      <title>Doing DevOps Like Skynet with ChatGPT</title>
      <dc:creator>Eran Bibi</dc:creator>
      <pubDate>Fri, 09 Dec 2022 12:04:02 +0000</pubDate>
      <link>https://forem.com/gofirefly/doing-devops-like-skynet-with-chatgpt-2n6e</link>
      <guid>https://forem.com/gofirefly/doing-devops-like-skynet-with-chatgpt-2n6e</guid>
      <description>&lt;p&gt;If you've been anywhere on the interwebs in the last week, you have likely heard about &lt;a href="https://openai.com/blog/chatgpt/" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;. &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; announced the next generation of their natural language processing AI model, called ChatGPT–that you can chat with about basically any topic under the sun.&lt;/p&gt;

&lt;p&gt;People have been updating their avatars with AI generated avatars, based on ChatGPT-created prompts, and posting endless screenshots of their disbelief at the quality and breadth of ChatGPT's knowledge.&lt;/p&gt;

&lt;p&gt;Here are just a few examples of what ChatGPT is capable of:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1600623026730545153-370" src="https://platform.twitter.com/embed/Tweet.html?id=1600623026730545153"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1600623026730545153-370');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1600623026730545153&amp;amp;theme=dark"
  }



 &lt;/p&gt;

&lt;p&gt;One area that really has the tech industry taken by storm is ChatGPT's capability of writing code. Some have even claimed that it will replace Google and Stack Overflow. We found this intriguing and wanted to see how it holds up with infrastructure configuration. So we took ChatGPT on a test drive.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1600290313276645376-794" src="https://platform.twitter.com/embed/Tweet.html?id=1600290313276645376"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1600290313276645376-794');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1600290313276645376&amp;amp;theme=dark"
  }



 &lt;br&gt;
‍&lt;/p&gt;

&lt;p&gt;One of the greatest values that folks are excited about with this next-generation AI is really about how it handles repetitive and mundane tasks engineers hate to have to deal with. One such area is IaC templates - so our first attempt was to see how ChatGPT would deliver on creating an IaC template and modules.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;Let's take a look.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;
&lt;h3&gt;
  
  
  PROMPT #1: Create a Terraform template for a highly available EKS cluster
&lt;/h3&gt;

&lt;p&gt;And the results are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;
&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&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;"us-east-1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create an EKS cluster&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eks_cluster"&lt;/span&gt; &lt;span class="s2"&gt;"eks_cluster"&lt;/span&gt; &lt;span class="p"&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;"my-eks-cluster"&lt;/span&gt;
  &lt;span class="nx"&gt;role_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_cluster_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create an IAM role for the EKS cluster&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"eks_cluster_role"&lt;/span&gt; &lt;span class="p"&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;"eks-cluster-role"&lt;/span&gt;

  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;POLICY&lt;/span&gt;&lt;span class="sh"&gt;
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
&lt;/span&gt;&lt;span class="no"&gt;POLICY
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Attach the AmazonEKSClusterPolicy policy to the EKS cluster role&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role_policy_attachment"&lt;/span&gt; &lt;span class="s2"&gt;"eks_cluster_policy_attachment"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_cluster_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create an Amazon Elastic Block Store (EBS) volume for the Kubernetes etcd data&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ebs_volume"&lt;/span&gt; &lt;span class="s2"&gt;"eks_etcd_volume"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;availability_zone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_control_plane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;availability_zone&lt;/span&gt;
  &lt;span class="nx"&gt;size&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gp2"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create an Amazon Elastic Compute Cloud (EC2) instance for the Kubernetes control plane&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"eks_control_plane"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0ac019f4fcb7cb7e6"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.medium"&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_control_plane_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;iam_instance_profile&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_instance_profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_control_plane_instance_profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-ssh-key"&lt;/span&gt;

  &lt;span class="nx"&gt;root_block_device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;volume_type&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"gp2"&lt;/span&gt;
    &lt;span class="nx"&gt;volume_size&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
    &lt;span class="nx"&gt;delete_on_termination&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="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&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;"eks-control-plane"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create an IAM instance profile for the Kubernetes control plane EC2 instance&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_instance_profile"&lt;/span&gt; &lt;span class="s2"&gt;"eks_control_plane_instance_profile"&lt;/span&gt; &lt;span class="p"&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;"eks-control-plane-instance-profile"&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks_control_plane_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create an IAM role for the Kubernetes control plane EC2 instance&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"eks_control_plane_role"&lt;/span&gt; &lt;span class="p"&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;"eks-control-plane-role"&lt;/span&gt;

  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;POL&lt;/span&gt;&lt;span class="sh"&gt;

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

&lt;/div&gt;



&lt;p&gt;Very cool! Should I be looking for a job? Probably not yet… but It's incredible to see how accurate ChatGPT is and its capabilities of writing infrastructure code with limited prompts. &lt;/p&gt;

&lt;p&gt;However, all due respect, let’s see if it’s up to the challenge of an imperative IaC like Pulumi.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt #2: Create a Golang Pulumi that will create an S3 bucket with SNS topic notification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/pulumi/pulumi-aws/sdk/v2/go/aws/s3"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/pulumi/pulumi-aws/sdk/v2/go/aws/sns"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/pulumi/pulumi/sdk/v2/go/pulumi"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pulumi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pulumi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Create an S3 bucket.&lt;/span&gt;
        &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewBucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"my-bucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BucketArgs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// Add other bucket configuration options here.&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// Create an SNS topic for notifications.&lt;/span&gt;
        &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewTopic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"my-topic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TopicArgs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// Add other topic configuration options here.&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// Add an SNS topic subscription for the bucket.&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewBucketNotification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"bucket-notification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BucketNotificationArgs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Bucket&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;TopicConfigurations&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BucketNotificationTopicConfigurationArray&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BucketNotificationTopicConfigurationArgs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;TopicArn&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Arn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="c"&gt;// Add other topic configuration options here.&lt;/span&gt;
                &lt;span class="p"&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;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;What you can see in this code, is that it uses the AWS Go SDK and the Pulumi AWS package to create an S3 bucket and an SNS topic. It then adds a subscription to the SNS topic using the &lt;code&gt;s3.NewBucketNotification&lt;/code&gt; function.  An added step that is important and wasn’t directly requested.  Impressive.&lt;/p&gt;

&lt;p&gt;Let’s dig even deeper.  It would be interesting to see how ChatGPT manages repetitive but multi-step configuration workflows, such as CI/CD pipelines. although, I will be more specific with my ask this time.&lt;/p&gt;

&lt;p&gt;‍‍&lt;br&gt;
‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt #3: Create a Jenkins pipeline that will clone the code, scan it using Trivy, run Infracost and plan and apply infrastructure using Terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="o"&gt;{&lt;/span&gt;
stage&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Clone repository"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
git url: &lt;span class="s2"&gt;"https://github.com/&amp;lt;username&amp;gt;/&amp;lt;repository&amp;gt;.git"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
stage&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Scan code with trivy"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
sh &lt;span class="s2"&gt;"trivy --exit-code 1 --severity CRITICAL &amp;lt;repository&amp;gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
stage&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Run infracost"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
sh &lt;span class="s2"&gt;"infracost --no-color"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
stage&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Plan infrastructure with terraform"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
sh &lt;span class="s2"&gt;"terraform plan"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
stage&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Apply infrastructure with terraform"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
sh &lt;span class="s2"&gt;"terraform apply"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now trying with GitHub Actions pipeline.&lt;/p&gt;

&lt;p&gt;‍‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt #4: Create a Github Action that applies terraform code and sends me a Slack notification once done
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Terraform&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;terraform&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;Apply Terraform&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&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;Apply Terraform&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hashicorp/terraform-github-actions@v0.12.x&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;tf_actions_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.12.29&lt;/span&gt;
        &lt;span class="na"&gt;tf_actions_subcommand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apply&lt;/span&gt;
        &lt;span class="na"&gt;tf_actions_working_dir&lt;/span&gt;&lt;span class="pi"&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;Send Slack notification&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shivammathur/slack-notify-action@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;slack_webhook_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SLACK_WEBHOOK_URL }}&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Terraform apply complete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aside from the fact that ChatGPT uses an outdated version of Terraform (0.12.29), which is easily fixable with a small minor edit, the pipeline is what I was expecting. It put an outdated version probably because it has limited knowledge of the world and events after 2021, I assume that one day ChatGPT will know that Terraform already released v1.x .&lt;/p&gt;

&lt;p&gt;‍‍&lt;/p&gt;

&lt;h2&gt;
  
  
  So What's the Verdict?
&lt;/h2&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;ChatGPT is pretty amazing.  While the haters will talk about its shortcomings, have whatever opinions you may about Elon Musk, others see this as a new (and possibly scary) future:&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
&lt;a href="https://media.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%2Fze7g1ggbaw4qxsu2y8s6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fze7g1ggbaw4qxsu2y8s6.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I, for one, welcome the machine overlords to manage the machines that manage us and our time today.&lt;/p&gt;

&lt;p&gt;I, for one, welcome the machine overlords to manage the machines that manage us and our time today.&lt;/p&gt;

&lt;p&gt;‍Think this is cool? We took this one step further and actually created and AI IaC generating tool - you guessed it, called &lt;a href="https://aiac.dev/" rel="noopener noreferrer"&gt;AIaC&lt;/a&gt;.  Check it out here, and start leveraging the power of machines to configure your machines.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>chatgpt</category>
      <category>ai</category>
      <category>iac</category>
    </item>
    <item>
      <title>Codify your SaaS Apps: The Answer to the Unmanaged SaaS Jungle</title>
      <dc:creator>Eran Bibi</dc:creator>
      <pubDate>Mon, 23 May 2022 15:00:34 +0000</pubDate>
      <link>https://forem.com/gofirefly/codify-your-saas-apps-the-answer-to-the-unmanaged-saas-jungle-3lm5</link>
      <guid>https://forem.com/gofirefly/codify-your-saas-apps-the-answer-to-the-unmanaged-saas-jungle-3lm5</guid>
      <description>&lt;p&gt;Infrastructure drift, unmanaged resources, ghost assets, these are all well-known “silent killers” in our clouds.  Whether AWS, GCP, Kubernetes, Azure or anything else, when deploying our services to multiple clouds, we know that a unified inventory and management of our cloud resources is complicated, and there are many great tools out there that are looking to help solve this growing complexity.&lt;/p&gt;

&lt;p&gt;One thing that is often overlooked though is where our SaaS tooling comes into the mix.  When we adopt SaaS tools, we tend to see them as just that–tools, and not what they eventually actually are: additional siloed, unmanaged clouds with their own proprietary inventory of services, objects and resources.&lt;/p&gt;

&lt;p&gt;A phenomenon we have encountered often, when helping companies overcome drift, is a common neglect of cloud infrastructure tooling, such as CloudFlare, Okta, Mongo Atlas, Datadog, Git and many other popular SaaS platforms and tools that are part of our core operations.  How can we make these SaaS clouds immutable, versioned, scalable and monitored if these extensions aren't codified?  Is state drift in Okta less troubling than drift in your IAM roles, for example? How can we guarantee proper monitoring if our Datadog dashboards make it possible for anyone to cause drifts?&lt;/p&gt;

&lt;p&gt;‍These are just some of the questions that come to mind when we see this recurring anti-pattern in cloud operations today. But you may ask, why does this matter?&lt;/p&gt;

&lt;p&gt;‍If a growing understanding is dawning on DevOps engineers that it is much safer and less error prone to codify cloud resources, including the inherent benefits of managing these resources like all other code––whether the git history, peer reviews, PR automation and policy enforcement, it seems that SaaS service have not yet undergone a similar evolution and epiphany.  If clickops for cloud configuration has mostly been abandoned for IaC practices, SaaS tooling is predominantly still configured manually via the UI with minimal codification. Not surprisingly this leads to many similar problems you’d find in your cloud operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting the Git in GitOps
&lt;/h2&gt;

&lt;p&gt;When it comes to Kubernetes and cloud native systems, that are so commonly associated with GitOps practices, which is considered the best practice and modern way for managing complex Kubernetes operations––the git part of gitops is all but neglected when it comes to managing these systems.  I’ll explain.&lt;br&gt;
‍&lt;/p&gt;

&lt;p&gt;If we look at the top downloaded Terraform providers for SaaS applications that are not clouds, the list and data is extremely compelling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DataDog/datadog 32.4M+&lt;/li&gt;
&lt;li&gt;integrations/github 16.9M+&lt;/li&gt;
&lt;li&gt;cloudflare/cloudflare 16.8M+&lt;/li&gt;
&lt;li&gt;newrelic/newrelic 12.5M+&lt;/li&gt;
&lt;li&gt;hashicorp/consul 9.7M+&lt;/li&gt;
&lt;li&gt;PagerDuty/pagerduty 8.6M+&lt;/li&gt;
&lt;li&gt;grafana/grafana 5.4M+&lt;/li&gt;
&lt;li&gt;gitlabhq/gitlab 4.8M+&lt;/li&gt;
&lt;li&gt;mongodb/mongodbatlas 4.2M+&lt;/li&gt;
&lt;li&gt;okta/okta 4M+&lt;/li&gt;
&lt;li&gt;elastic/ec 3.2M+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;‍&lt;br&gt;
While there is an increasing trend towards codifying these resources through Terraform providers, if we take the number of downloads of the AWS Terraform provider or the next most popular cloud Azure, these are 750M+ and 127M+ respectively, placing the next most popular non-cloud provider at about 5% adoption (and ultimately codification).&lt;/p&gt;

&lt;p&gt;‍This is because not only would this codification need to be done for each SaaS tool individually, once these tools are configured through clickops, just translating this to IaC is an extremely complex undertaking (particularly in large organizations with multiple dashboards, clouds, services and other dependencies and resources).&lt;/p&gt;

&lt;p&gt;‍If we come back to thinking about how we convert our git operations to be GitOps native, we’d likely need to follow a post similar to this one that walks you through the process of &lt;a href="https://www.mineiros.io/blog/how-to-manage-your-github-organization-with-terraform"&gt;managing your Github organization with Terraform&lt;/a&gt;.  And this is just one tool of many in a huge stack of SaaS tooling that would need to undergo a similar transformation, this is another example of a post that walks you through &lt;a href="https://medium.com/hackernoon/managing-datadog-with-terraform-89abe0eb62f5"&gt;a similar transition for Datadog&lt;/a&gt;.  And the list goes on.  Now imagine having 10s of tools, in large organizations––multiple teams and clouds.  The task is daunting just to think about.  Until now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codifying Your SaaS
&lt;/h2&gt;

&lt;p&gt;When thinking about the critical aspects of codifying your SaaS, there are a few angles it was important for &lt;a href="https://gofirefly.io"&gt;Firefly&lt;/a&gt; to focus on to make this transition truly valuable for all DevOps teams.  The first layer of value is in the unified inventory of both cloud assets and SaaS assets in a single place. Just this alone enables DevOps teams to search, understand, and classify assets across all clouds––the operational ones or the tooling clouds.  Something that wasn’t possible before from a single dashboard or tool.&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
The next aspect is actually getting all of these tools and assets managed as code.  If this has become the cloud standard, it’s not clear why this hasn’t happened for SaaS apps too.  We’ve spoken about the benefits of managing everything as code, but eventually once managed as code with the relevant guidelines and internal engineering practices applied, these can then be automated as part of CI/CD processes and the relevant gating &amp;amp; guardrails applied here too.&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
Doing so manually would require engineers to translate all of their manual configurations (that are not always found in a single place in the UI, across the many layers of their application) into the relevant code configurations, and usually many times over if there are multiple applications, dashboards or tools.  This is now possible at the click of a single button, for all SaaS tools, in one place.&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
If we take a look at a typical Firefly dashboard, we can see that typical SaaS tools have as low as 20%+ of codified resources, vs. 50% in cloud service providers.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5zv6nDTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://uploads-ssl.webflow.com/6166f5ce8dcfdbe35a9143b6/62862df5e24dbfc343d67223_Screen%2520Recording%25202022-05-15%2520at%252015.22.28%2520%282%29.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5zv6nDTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://uploads-ssl.webflow.com/6166f5ce8dcfdbe35a9143b6/62862df5e24dbfc343d67223_Screen%2520Recording%25202022-05-15%2520at%252015.22.28%2520%282%29.gif" alt="Image description" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The companies that have flipped this number and codified these resources, were able to enjoy the IaC advantages of faster deployment cycles and standby configuration templates for disaster recovery scenarios.  &lt;/p&gt;

&lt;p&gt;We hope you found this useful - feel free to drop any questions you may have in the comments.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
