<?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: Daniel Hagen</title>
    <description>The latest articles on DEV Community by Daniel Hagen (@dbhagen).</description>
    <link>https://dev.to/dbhagen</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%2F335868%2F860d4d4f-775c-47d4-8263-7ac10cceb1bd.jpeg</url>
      <title>DEV Community: Daniel Hagen</title>
      <link>https://dev.to/dbhagen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dbhagen"/>
    <language>en</language>
    <item>
      <title>DevOops, We've Done It Again: The Continued Silos Between AppDev and Ops</title>
      <dc:creator>Daniel Hagen</dc:creator>
      <pubDate>Mon, 21 Apr 2025 14:38:38 +0000</pubDate>
      <link>https://dev.to/dbhagen/devoops-weve-done-it-again-the-continued-silos-between-appdev-and-ops-55hb</link>
      <guid>https://dev.to/dbhagen/devoops-weve-done-it-again-the-continued-silos-between-appdev-and-ops-55hb</guid>
      <description>&lt;p&gt;Remember when &lt;strong&gt;DevOps was supposed to break down walls&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;It was a movement, not just a methodology. A promise that developers and operations would finally work hand-in-hand, shipping value faster, safer, and smarter. No more throwing code “over the wall.” No more ops folks getting paged at 2AM for things they had no hand in building.&lt;/p&gt;

&lt;p&gt;Instead, we got a new title.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;“DevOps Engineer.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And just like that… the wall was back.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Original Vision
&lt;/h2&gt;

&lt;p&gt;DevOps was born out of frustration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers couldn’t ship without Operations.&lt;/li&gt;
&lt;li&gt;Operations couldn’t support what they didn’t understand.&lt;/li&gt;
&lt;li&gt;Releases were painful, manual, and filled with guesswork.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then came &lt;strong&gt;infrastructure as code&lt;/strong&gt;, &lt;strong&gt;pipelines&lt;/strong&gt;, and &lt;strong&gt;continuous delivery&lt;/strong&gt;. Suddenly, a single engineer could deliver a full slice of value—code, infrastructure, monitoring, tests—&lt;strong&gt;all the way to production&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a moment, we were living the dream:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cross-functional, empowered product teams&lt;/strong&gt; with shared ownership.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then Came the "DevOps Engineer"
&lt;/h2&gt;

&lt;p&gt;But instead of enabling developers to own more, we added a middleman.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Let’s hire a DevOps engineer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which usually meant:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;An Ops engineer in a new costume&lt;/strong&gt;, still the one holding the pager, managing the CI/CD pipeline, and maintaining the Terraform modules.&lt;/p&gt;

&lt;p&gt;Meanwhile, app devs kept shipping code and creating tickets.&lt;br&gt;&lt;br&gt;
We recreated the wall—just with shinier tools and cooler job titles.&lt;/p&gt;




&lt;h2&gt;
  
  
  DevOps ≠ Ops++
&lt;/h2&gt;

&lt;p&gt;Let’s be clear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;DevOps is not a team. It’s a cultural shift.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s about shared responsibility across development and operations. Not shifting the burden. Not offloading hard things.&lt;/p&gt;

&lt;p&gt;Yet here we are—again—with DevOps engineers doing Ops work, and app devs waiting for green pipelines. Silos have returned, just with new labels.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Platform Engineering
&lt;/h2&gt;

&lt;p&gt;And now we’re seeing the rise of &lt;strong&gt;Platform Engineering&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Done well, it’s a game-changer.&lt;br&gt;&lt;br&gt;
Done poorly, it’s &lt;strong&gt;DevOops 2.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea of an &lt;strong&gt;internal developer platform&lt;/strong&gt; is powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common paved paths&lt;/li&gt;
&lt;li&gt;Certified infrastructure modules&lt;/li&gt;
&lt;li&gt;Golden pipelines&lt;/li&gt;
&lt;li&gt;Reusable patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But let’s be careful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A platform is not a team that takes responsibility away.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It’s an internal product. A practice. A self-service toolbox built with empathy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Platform engineering should be &lt;strong&gt;inner-sourced&lt;/strong&gt;, not offloaded.&lt;br&gt;&lt;br&gt;
Built alongside the teams using it, not in a vacuum.&lt;/p&gt;

&lt;p&gt;Treat it like an &lt;strong&gt;internal cloud&lt;/strong&gt; with APIs, docs, support, and SLAs.&lt;br&gt;&lt;br&gt;
Not like a vending machine where developers throw a ticket and wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embracing the Cognitive Load
&lt;/h2&gt;

&lt;p&gt;Yes, understanding &lt;strong&gt;application development&lt;/strong&gt; &lt;em&gt;and&lt;/em&gt; &lt;strong&gt;infrastructure&lt;/strong&gt; is hard.&lt;br&gt;&lt;br&gt;
And yes, &lt;strong&gt;cognitive load is a real problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But here’s the thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Avoiding it doesn’t solve the problem—it just shifts responsibility.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When developers sidestep infrastructure and delivery concerns, that burden doesn’t disappear.&lt;br&gt;&lt;br&gt;
It lands on someone else’s plate—usually a DevOps or Platform engineer—who may have less context about the app, its dependencies, or its business logic.&lt;/p&gt;

&lt;p&gt;We shouldn’t run from the hard stuff.&lt;br&gt;&lt;br&gt;
We should &lt;strong&gt;build shared muscle around it&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Owning infra doesn’t mean being on-call 24/7.&lt;/li&gt;
&lt;li&gt;Writing pipelines doesn’t mean reinventing Jenkins from scratch.&lt;/li&gt;
&lt;li&gt;Understanding how your code hits production doesn’t require mastery—just participation.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We don’t need every developer to know everything. But we do need every developer to care.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And caring means being willing to &lt;strong&gt;engage with the system holistically&lt;/strong&gt;—from pull request to production, from cloud resource to customer value.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Last Excuse: Gone
&lt;/h2&gt;

&lt;p&gt;Let’s be honest—part of what sustained the silos was the belief that &lt;strong&gt;no one could possibly do it all&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I’m not an infra person."&lt;/li&gt;
&lt;li&gt;"Pipelines aren’t my thing."&lt;/li&gt;
&lt;li&gt;"I just want to write frontend code."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But now?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI has leveled the playing field.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; filling in code scaffolding,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; guiding development in real time, and&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic tools like Windsurf&lt;/strong&gt; orchestrating complex workflows…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…we no longer have the excuse that &lt;strong&gt;one person can’t manage the full stack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AI isn’t replacing engineers. It’s &lt;strong&gt;amplifying them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A single engineer, with the right mindset and tooling, can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build infrastructure as code&lt;/li&gt;
&lt;li&gt;Deploy a service with observability baked in&lt;/li&gt;
&lt;li&gt;Write tests, pipelines, and documentation&lt;/li&gt;
&lt;li&gt;Ship product faster than a team of siloed specialists ever could&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We’ve never been more empowered to deliver end-to-end.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now is the time to lean into &lt;strong&gt;true ownership&lt;/strong&gt;—with AI as our co-pilot, not our crutch.&lt;/p&gt;




&lt;h2&gt;
  
  
  The DevOps We Were Promised
&lt;/h2&gt;

&lt;p&gt;It wasn’t just about YAML, Terraform, or CI/CD.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It was about &lt;strong&gt;empowered teams&lt;/strong&gt; delivering value with autonomy, confidence, and shared accountability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We’ve come too far to go back to throwing things over the wall.&lt;br&gt;&lt;br&gt;
Let’s stop saying DevOps and doing Ops.&lt;/p&gt;

&lt;p&gt;Let’s build the future we signed up for.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What’s your experience been like? Are you building platforms that enable—or isolate? Have you seen the cognitive load turn into a team’s superpower? I’d love to hear how others are navigating this.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  DevOps #PlatformEngineering #FullStack #InfrastructureAsCode #AIEngineering #TeamCulture #DeveloperExperience
&lt;/h1&gt;

</description>
      <category>devops</category>
      <category>platformengineering</category>
      <category>ai</category>
      <category>teamculture</category>
    </item>
    <item>
      <title>AWS Amplify, Secured DevOps - Part 2, Regenerate</title>
      <dc:creator>Daniel Hagen</dc:creator>
      <pubDate>Wed, 08 Dec 2021 04:37:16 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-amplify-secured-devops-part-2-1mja</link>
      <guid>https://dev.to/aws-builders/aws-amplify-secured-devops-part-2-1mja</guid>
      <description>&lt;p&gt;Ok, so if you've read &lt;a href="https://dev.to/aws-builders/aws-amplify-secured-devops-part-1-25oo"&gt;Part 1&lt;/a&gt;, you know that you should protect the &lt;code&gt;aws-exports.js&lt;/code&gt; file. The first method I will show is using only AWS Amplify tools.&lt;/p&gt;

&lt;p&gt;Why store it when it gets generated every time, right? In part 1, I mentioned that &lt;code&gt;amplify init&lt;/code&gt;, &lt;code&gt;amplify pull&lt;/code&gt;, and any &lt;code&gt;amplify add &amp;lt;feature&amp;gt;&lt;/code&gt; or &lt;code&gt;amplify remove &amp;lt;feature&amp;gt;&lt;/code&gt; will cause the &lt;code&gt;aws-exports.js&lt;/code&gt; file to be recreated.&lt;/p&gt;

&lt;p&gt;I've committed the source tree on several projects with dependencies on &lt;code&gt;src/aws-exports.js&lt;/code&gt;, which will more than break the build if it doesn't exist.&lt;/p&gt;

&lt;p&gt;So let's say that you're on your laptop. You've successfully &lt;code&gt;amplify init&lt;/code&gt; to create your environment or used the AWS Amplify Studio UI to set up your environment and then run &lt;code&gt;amplify pull --appId &amp;lt;snip&amp;gt; --envName dev&lt;/code&gt;. You've got your &lt;code&gt;src/aws-exports.js&lt;/code&gt; setup, and you're building locally. You commit your code in and move over to your desktop, and pull your code down. But running dev breaks, &lt;code&gt;src/aws-exports.js&lt;/code&gt; doesn't exist.&lt;/p&gt;

&lt;p&gt;It's pretty straightforward. We're going to run &lt;code&gt;amplify pull --appId &amp;lt;snip&amp;gt; --envName dev&lt;/code&gt; again to have it pull down all the backend settings and generate your &lt;code&gt;src/aws-exports.js&lt;/code&gt; for you.&lt;/p&gt;

&lt;p&gt;A quick note there, if you added a feature on your desktop, let's say new storage (S3) for the application, the next time you commit and switch to your laptop, you'll perform another &lt;code&gt;amplify pull&lt;/code&gt; to get back in sync. You can always run &lt;code&gt;amplify status&lt;/code&gt; to see if you are up to date against the deployed version.&lt;/p&gt;




&lt;p&gt;Now let's talk builds and CI/CD. One of the most fantastic features that you get pretty much out of the box in Amplify is a complete CI/CD pipeline. I'll look at doing a dedicated post for that feature, but I'm going to leave the details out of scope for now. The big thing that I want to point out is how it to can generate the &lt;code&gt;src/aws-exports.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each build is executed inside a container in the AWS build environment; it inherits the IAM role provided, which allows it to authenticate to the Amplify framework and pull down the settings. This permission configuration happens by default with the default build settings. In Part 3, I'll show you how to override or specify these settings using Environment Variables.&lt;/p&gt;

&lt;p&gt;The key to this, though, is to think of it as doing a &lt;code&gt;amplify pull&lt;/code&gt; at the beginning of every build. If you're modifying your &lt;code&gt;aws-exports.js&lt;/code&gt; file (you never should), those modifications will not make it in this build. If the backend had changed and you didn't &lt;code&gt;amplify pull&lt;/code&gt; before developing, validating, and committing, your backend references may be out of sync.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>amplify</category>
      <category>fullstack</category>
      <category>cicd</category>
    </item>
    <item>
      <title>AWS Amplify, Secured DevOps - Part 1, Why It Matters</title>
      <dc:creator>Daniel Hagen</dc:creator>
      <pubDate>Mon, 06 Dec 2021 17:57:56 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-amplify-secured-devops-part-1-25oo</link>
      <guid>https://dev.to/aws-builders/aws-amplify-secured-devops-part-1-25oo</guid>
      <description>&lt;p&gt;Well, fresh off an awesome AWS re:Invent, I wanted to put out a short series of posts about a common issue I run into talking with people about CI/CD. These posts center around the &lt;code&gt;aws-exports.js&lt;/code&gt; that the CLI will generate when initializing or pulling from the Admin/Studio UI. If you're unfamiliar with this, I'd recommend starting at the &lt;a href="https://docs.amplify.aws/start/?sc_icampaign=start&amp;amp;sc_ichannel=docs-home" rel="noopener noreferrer"&gt;Getting Started section of the AWS Amplify Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What is inside the &lt;code&gt;aws-exports.js&lt;/code&gt; file that makes it such a big deal, and why do we exclude it in the first place?&lt;/p&gt;

&lt;p&gt;First, you have to understand why committing credentials into a source code repository is generally seen as a bad idea. For a good read on this, take a look at &lt;a href="https://withblue.ink/2021/05/07/storing-secrets-and-passwords-in-git-is-bad.html#:~:text=Most%20developers%20working%20on%20a,%2Dsecure%20ways%2C%20etc" rel="noopener noreferrer"&gt;Why storing secrets and passwords in Git is a bad idea&lt;/a&gt;. TL;DR: It's not a good idea, don't do it.&lt;/p&gt;

&lt;p&gt;So with that established, let's look at the aws-exports.js file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;awsmobile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;aws_project_region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_cognito_identity_pool_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-1:&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_cognito_region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_user_pools_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-1_&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_user_pools_web_client_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;oauth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws.cognito.signin.user.admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;redirectSignIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://&amp;lt;SNIP&amp;gt;,&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;redirectSignOut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://&amp;lt;SNIP&amp;gt;,&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;responseType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;federationTarget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;COGNITO_USER_POOLS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_cloud_logic_custom&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AdminQueries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://&amp;lt;SNIP&amp;gt;.execute-api.us-east-1.amazonaws.com/dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;aws_appsync_graphqlEndpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://&amp;lt;SNIP&amp;gt;.appsync-api.us-east-1.amazonaws.com/graphql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_appsync_region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_appsync_authenticationType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AMAZON_COGNITO_USER_POOLS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aws_appsync_apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;awsmobile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just look at all the places I removed information and put in &lt;code&gt;&amp;lt;SNIP&amp;gt;&lt;/code&gt;. If you wouldn't post it in a Dev.To blog post, here's a good rule of thumb, you probably shouldn't commit it.&lt;/p&gt;

&lt;p&gt;While SPA and some SSG apps might end up embedding some of these values, generally, these are keys and values that the end-user should not get ahold of, or they could start running attacks on your backend surfaces.&lt;/p&gt;

&lt;p&gt;Imagine someone getting the &lt;code&gt;aws_appsync_apiKey&lt;/code&gt; along with the &lt;code&gt;aws_appsync_graphqlEndpoint&lt;/code&gt; and just starting to DDoS or brute force their way past your auth. Or just overall knowing what the architecture for your application backend is. The less information the attacker has, the slower and more challenging it is to get in and do bad things.&lt;/p&gt;

&lt;p&gt;Now, let's talk about what generates &lt;code&gt;aws-exports.js&lt;/code&gt;. Like I mentioned at the beginning when you launch &lt;code&gt;amplify init&lt;/code&gt; or run &lt;code&gt;amplify pull&lt;/code&gt; with the variables given from the Admin/Studio UI. When you first run those commands, it will ask you where your source folder is (default is &lt;code&gt;/src&lt;/code&gt;), and it will generate this file in that folder. Every time you run &lt;code&gt;amplify pull&lt;/code&gt; from then on, it will regenerate the &lt;code&gt;aws-exports.js&lt;/code&gt; file with any changes on the backend. It will also regenerate if you use &lt;code&gt;amplify add &amp;lt;feature&amp;gt;&lt;/code&gt; with those features' security details.&lt;/p&gt;

&lt;p&gt;Amplify will, by default, exclude &lt;code&gt;aws-exports.js&lt;/code&gt; in the &lt;code&gt;.gitignore&lt;/code&gt; file. Here is an example of a &lt;code&gt;.gitignore&lt;/code&gt; file I had locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#amplify
amplify/\#current-cloud-backend
amplify/.config/local-*
amplify/mock-data
amplify/backend/amplify-meta.json
amplify/backend/awscloudformation
build/
dist/
node_modules/
aws-exports.js
awsconfiguration.json
amplifyconfiguration.json
amplify-gradle-config.json
amplifyxc.config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you didn't read the linked article earlier, you might be inclined to remove these lines and commit these files anyway. I hope you don't.&lt;/p&gt;

&lt;p&gt;Lastly, this &lt;code&gt;aws-exports.js&lt;/code&gt; file is what you're going to use to configure your &lt;code&gt;Amplify Libraries&lt;/code&gt; SDK in your project. Eventually, I'll add an "aws-modifications.js` tutorial for a simple trick I use for modifying that file in runtime.&lt;/p&gt;

&lt;p&gt;Hopefully, that gives you a little more idea of what is going on under the hood and why you don't want to break it. Next, I will show you a few real-world scenarios that I've used for dealing with these and other security values. Keep an eye out for Part 2.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>amplify</category>
      <category>fullstack</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
