<?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: Oluwagbenga Balogun</title>
    <description>The latest articles on DEV Community by Oluwagbenga Balogun (@balop3e).</description>
    <link>https://dev.to/balop3e</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F915121%2F5823040c-9c9a-4b68-afee-74412300cc07.png</url>
      <title>DEV Community: Oluwagbenga Balogun</title>
      <link>https://dev.to/balop3e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/balop3e"/>
    <language>en</language>
    <item>
      <title>Agentic DevOps with GitHub Actions and Microsoft Foundry</title>
      <dc:creator>Oluwagbenga Balogun</dc:creator>
      <pubDate>Fri, 25 Sep 2026 11:38:13 +0000</pubDate>
      <link>https://dev.to/balop3e/agentic-devops-with-github-actions-and-microsoft-foundry-1f4h</link>
      <guid>https://dev.to/balop3e/agentic-devops-with-github-actions-and-microsoft-foundry-1f4h</guid>
      <description>&lt;p&gt;As AI agents become a bigger part of the conversation around software development, I started thinking about what they could mean for my own role as a DevOps engineer. Where could they help in a delivery pipeline? What decisions could they support? And where would I still want myself or someone else to firmly be in control?&lt;/p&gt;

&lt;p&gt;For sure we know DevOps already involves a great deal of automation. We build pipelines to test code, check for problems, and move changes between environments. But deciding whether a release should proceed requires context. Passing tests are useful evidence; but they do not answer every question about the risk of a change.&lt;/p&gt;

&lt;p&gt;That made release review an interesting place to experiment. Could an agent help explain the evidence, highlight concerns, and prepare better questions for the person approving a deployment? I mean I already interact with agents like they are colleagues and it's been real so far.&lt;/p&gt;

&lt;p&gt;I built a small proof of concept with GitHub Actions and Microsoft Foundry to explore that question. I wanted to understand the moving parts for myself, how evidence reaches a reviewer, how a recommendation affects the workflow, and how approval remains under human control.&lt;/p&gt;

&lt;p&gt;This article shares that experiment with other DevOps and platform engineers asking similar questions about their roles. It walks through what I built, what it demonstrates, and what would still need to change before using the approach in production.&lt;/p&gt;

&lt;p&gt;The implementation has two parts. GitHub Actions runs a &lt;strong&gt;deterministic release review&lt;/strong&gt; and demonstrates an environment approval gate. Separately, a Microsoft Foundry agent reviews the same sample evidence in the playground. The workflow does not yet call Foundry, and its staging and production jobs simulate deployment.&lt;/p&gt;

&lt;p&gt;That boundary matters. This is a practical foundation for an agent-assisted release process, with a clear path to integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/balop3e/agentic-devops-poc" rel="noopener noreferrer"&gt;balop3e/agentic-devops-poc&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this proof of concept demonstrates
&lt;/h2&gt;

&lt;p&gt;The question I wanted to explore was straightforward, how can an AI recommendation fit into a release process without becoming the authority that approves production?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;What happens in this demo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;Runs tests, generates sample evidence, executes the review, and sequences the jobs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python review script&lt;/td&gt;
&lt;td&gt;Applies fixed rules to produce a risk score and recommendation. It does not call an AI model.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Foundry agent&lt;/td&gt;
&lt;td&gt;Reviews the same evidence through a separate, manual playground interaction.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub production environment&lt;/td&gt;
&lt;td&gt;Pauses the production job for a configured reviewer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment jobs&lt;/td&gt;
&lt;td&gt;Print demonstration messages; they do not deploy an application.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The actual unit tests run before evidence generation. However, the release evidence uses preset low-risk and high-risk scenarios. Its test counts, coverage changes, and vulnerability counts are predefined inputs for exercising the review logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the components connect
&lt;/h2&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzetzpmuv7wmintavdt40.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzetzpmuv7wmintavdt40.png" alt="Architecture showing a deterministic GitHub Actions review and a separate manual Foundry review of the same sample evidence" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. The implemented workflow and the separate Foundry experiment. The AI response does not feed back into the workflow in this version.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A push to &lt;code&gt;main&lt;/code&gt; or a manual workflow run starts the build and test job. When that job succeeds, the workflow generates a JSON evidence file and stores it as an artifact. The review job reads that artifact and publishes a Markdown report.&lt;/p&gt;

&lt;p&gt;The staging simulation runs when the review exposes a &lt;code&gt;proceed&lt;/code&gt; decision. The production simulation additionally requires a manual run with &lt;code&gt;deploy_production=true&lt;/code&gt;, successful staging, and satisfaction of the production environment's protection rules.&lt;/p&gt;

&lt;p&gt;Alongside this flow, I pasted the evidence into Foundry to explore the quality of an AI-generated explanation. This kept the workflow demonstration repeatable while letting me inspect the model's response separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with structured release evidence
&lt;/h2&gt;

&lt;p&gt;An AI reviewer needs a defined input. Asking whether a release is safe without supplying evidence encourages assumptions.&lt;/p&gt;

&lt;p&gt;The demo uses fields for the commit, workflow run, target environment, tests, change size, coverage, vulnerabilities, database migrations, and dependency changes. Here is an illustrative low-risk input, with placeholder identifiers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commit_sha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example-commit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workflow_run"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example-run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deployment_target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_tests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"failed_tests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"changed_files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"coverage_delta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"high_vulnerabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"critical_vulnerabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"database_migration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"external_dependency_change"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that these numbers are sample data, not measured results. The schema defines &lt;code&gt;coverage_delta&lt;/code&gt; as a percentage-point change, a fall from 80% to 78.9% is a change of -1.1 percentage points. The original demo report displays a percent sign, which is less precise.&lt;/p&gt;

&lt;p&gt;In a real pipeline, I would populate these fields from the test runner, coverage report, vulnerability scanners, and deployment metadata. I would also include evidence timestamps and an artifact digest so the review can be tied to the exact release candidate.&lt;/p&gt;

&lt;p&gt;The repository includes &lt;code&gt;schemas/release-evidence.schema.json&lt;/code&gt;. Having that file does not enforce the contract automatically, the current review script loads JSON into a Python dataclass without invoking a JSON Schema validator. Runtime schema validation and consistency checks, such as ensuring failed tests cannot exceed total tests, are next steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate policy from explanation
&lt;/h2&gt;

&lt;p&gt;The Python review applies fixed scoring rules. Failed tests or critical vulnerabilities produce a &lt;code&gt;block&lt;/code&gt; recommendation regardless of the final risk label. Other signals add points, including high-severity findings, larger changes, coverage drops, migrations, and dependency changes.&lt;/p&gt;

&lt;p&gt;The low-risk fixture produces &lt;code&gt;proceed&lt;/code&gt;, a low risk level, and a score of zero. These are outputs of an illustrative scoring model. A zero score is not a guarantee that a release is safe, and the score is not a probability of failure.&lt;/p&gt;

&lt;p&gt;One implementation detail deserves attention, &lt;code&gt;assess_release()&lt;/code&gt; can return &lt;code&gt;proceed_with_extra_review&lt;/code&gt;, but &lt;code&gt;write_github_output()&lt;/code&gt; maps every non-blocking recommendation to &lt;code&gt;proceed&lt;/code&gt;. The production approval gate still applies, but the workflow does not enforce a separate extra-review process for that middle state.&lt;/p&gt;

&lt;p&gt;Before extending this pattern, I would preserve that state explicitly and define the additional review it requires. More generally, policy should make mandatory decisions in code; the model should explain the evidence and surface questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put approval in the deployment platform
&lt;/h2&gt;

&lt;p&gt;Writing “human approval required” in a prompt or report does not enforce approval. The relevant control in this demo is the GitHub environment configuration.&lt;/p&gt;

&lt;p&gt;The workflow's production job references &lt;code&gt;production&lt;/code&gt;. A required-reviewer rule configured on that environment makes the job wait. The following simplified excerpt illustrates that relationship; it is not a complete workflow:&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;deploy_production&lt;/span&gt;&lt;span class="pi"&gt;:&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;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;agent_review&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;deploy_staging&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
    &lt;span class="s"&gt;github.event_name == 'workflow_dispatch' &amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="s"&gt;github.event.inputs.deploy_production == 'true' &amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="s"&gt;needs.agent_review.outputs.decision == 'proceed'&lt;/span&gt;
  &lt;span class="na"&gt;environment&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;production&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Simulate deployment&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "Protected job released to run."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The YAML reference alone does not create a reviewer requirement.&lt;/strong&gt; I still need to configure the environment protection rule separately. For independent review, I enabled prevention of self-review and select another eligible reviewer. Also review administrator bypass settings and restrict permitted deployment branches or tags. GitHub's current documentation says required reviewers on Free, Pro, and Team plans are available only for public repositories. See &lt;a href="https://docs.github.com/en/actions/reference/workflows-and-actions/deployments-and-environments" rel="noopener noreferrer"&gt;deployment protection rules&lt;/a&gt;.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ppxxom7pvq7xsmh7hjh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ppxxom7pvq7xsmh7hjh.png" alt="GitHub Actions run paused at the production environment while earlier jobs have completed" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. The production simulation waits for environment review after the deterministic review and staging simulation finish.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the demonstration, the workflow waited at this gate and then completed after approval. This shows the gate operating in that run, but does not establish independent approval by a second person or prove that bypass was disabled. A printed log message saying a human approved is not, by itself, evidence that a gate was enforced.&lt;/p&gt;

&lt;p&gt;For a production implementation, protect workflow changes and deployment credentials too. A job that omits the protected environment must not have another route to the same production permissions.&lt;/p&gt;

&lt;p&gt;Azure Pipelines supports a related pattern through &lt;a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/process/approvals?view=azure-devops" rel="noopener noreferrer"&gt;approvals and checks&lt;/a&gt; on resources such as environments. That offers another way to keep the approval control outside the AI response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore the AI reviewer in Microsoft Foundry
&lt;/h2&gt;

&lt;p&gt;The Foundry portion gives the reviewer a specific job, interpret the supplied release evidence and prepare useful context for an approver.&lt;/p&gt;

&lt;p&gt;The main concepts are a Foundry resource, a project, a model deployment, and an agent. The resource provides the service boundary; the project organises the work; the model deployment supplies inference; and the agent adds instructions and, when configured, tools. The playground provides an interactive place to test the behaviour. Microsoft describes the platform in its &lt;a href="https://learn.microsoft.com/en-us/azure/foundry/what-is-foundry" rel="noopener noreferrer"&gt;Foundry overview&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For this experiment I used &lt;code&gt;gpt-4o-mini&lt;/code&gt; and an agent called &lt;code&gt;devops-release-review-agent&lt;/code&gt;. That records the demo configuration, rather than recommending a particular model for every release process.&lt;/p&gt;

&lt;p&gt;The instructions asked for a risk level, recommendation, reasons, questions for the human reviewer, and a concise approval summary. They also told the agent not to claim production was approved and to recommend blocking when tests failed or critical vulnerabilities were present.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flxkg82plj5nkqp2kl3oj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flxkg82plj5nkqp2kl3oj.png" alt="Foundry playground showing sample release evidence and the agent's separate response" width="799" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3. The Foundry agent reviews evidence pasted into the playground. This is separate from the GitHub Actions execution.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For the supplied low-risk evidence, the response recommended proceeding and raised questions for the approver. This is a useful example of explanation, but one favourable response does not establish reliability. The experiment does not demonstrate autonomous remediation, deployment tools, or a multi-agent system.&lt;/p&gt;

&lt;p&gt;Prompts describe intended behaviour, they are not access controls. A release-review agent should have no permission to approve its own deployment or alter the approval configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand the permissions before connecting the pipeline
&lt;/h2&gt;

&lt;p&gt;During setup, I encountered an important distinction between managing an Azure resource and using the AI service inside it.&lt;/p&gt;

&lt;p&gt;The Azure &lt;strong&gt;control plane&lt;/strong&gt; covers management tasks such as creating resources and assigning roles. The &lt;strong&gt;data plane&lt;/strong&gt; covers service operations such as invoking models and working with agents. Subscription Owner does not itself grant all Foundry data-plane permissions, portal setup can add separate role assignments.&lt;/p&gt;

&lt;p&gt;Check the specific operations and scope your identity needs in the &lt;a href="https://learn.microsoft.com/en-us/azure/foundry/concepts/rbac-foundry" rel="noopener noreferrer"&gt;Foundry RBAC documentation&lt;/a&gt;. Current documentation uses names such as Foundry User and Foundry Agent Consumer, older interfaces may still show Azure AI role names. An identity that only invokes an agent should not receive broad management privileges unnecessarily.&lt;/p&gt;

&lt;p&gt;For a future GitHub-to-Foundry integration, I would use &lt;a href="https://docs.github.com/en/actions/how-tos/secure-your-work/security-harden-deployments/oidc-in-azure" rel="noopener noreferrer"&gt;OpenID Connect with Azure&lt;/a&gt; and Microsoft Entra workload identity federation instead of a stored long-lived client secret. The workflow needs &lt;code&gt;id-token: write&lt;/code&gt; to request an OIDC token, Azure role assignments determine what the resulting identity can do. Its trust configuration must match the intended repository and workflow context.&lt;/p&gt;

&lt;p&gt;The agent-review identity and production deployment identity should have separate responsibilities and permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reuse the pattern across teams
&lt;/h2&gt;

&lt;p&gt;The repository contains a reusable review workflow and a &lt;code&gt;Team Scaling Demo&lt;/code&gt; caller. Two illustrative teams invoke the same implementation with different evidence profiles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caller&lt;/th&gt;
&lt;th&gt;Evidence profile&lt;/th&gt;
&lt;th&gt;Expected review outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Payments team&lt;/td&gt;
&lt;td&gt;Low risk&lt;/td&gt;
&lt;td&gt;Proceed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity team&lt;/td&gt;
&lt;td&gt;High risk&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4bsingyc0xlk6y7qx24b.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4bsingyc0xlk6y7qx24b.png" alt="Two illustrative team jobs using the shared release review workflow" width="799" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 4. Team-specific jobs reuse the same review implementation within the demo repository.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A successful review job means the analysis completed. It does not necessarily mean deployment is permitted the script can successfully produce a &lt;code&gt;block&lt;/code&gt; decision. A caller must consume that output in its deployment conditions. The scaling demonstration itself has no deployment jobs.&lt;/p&gt;

&lt;p&gt;This shows reuse within one repository. Extending it to separate repositories needs additional work. In particular, &lt;code&gt;actions/checkout&lt;/code&gt; inside a called workflow normally checks out the caller's repository. The shared review code must be distributed deliberately, for example as a versioned action or package, rather than assuming its scripts exist in every caller. GitHub documents the execution context in &lt;a href="https://docs.github.com/en/actions/concepts/workflows-and-actions/reusing-workflow-configurations" rel="noopener noreferrer"&gt;reusing workflows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would make the platform team responsible for the evidence contract, review implementation, prompt versions, and evaluation cases. Product teams would supply release evidence and retain ownership of their deployment and approval configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would add before production use
&lt;/h2&gt;

&lt;p&gt;The next iteration should address several concrete gaps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collect and validate real evidence.&lt;/strong&gt; Parse actual reports, reject missing or inconsistent fields, and bind every review to the commit and deployable artifact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate Foundry explicitly.&lt;/strong&gt; Call the selected agent API from the review job and validate the response against an output schema. Preserve a clear distinction between deterministic policy and AI advice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define failure behaviour.&lt;/strong&gt; A timeout, unavailable model, or malformed response must never silently become an approval. Pause for review or follow a documented fallback policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat release text as untrusted input.&lt;/strong&gt; Commit messages, pull-request descriptions, and logs can contain instructions aimed at the model. Keep them separate from trusted instructions and prevent the reviewer from changing policy or gaining deployment permissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate difficult cases.&lt;/strong&gt; Include missing evidence, contradictory signals, failed tests, critical vulnerabilities, migrations, and attempts to override instructions. Recheck behaviour when the prompt or model changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record decisions and outcomes.&lt;/strong&gt; Retain evidence, policy results, AI output, prompt and model versions, reviewer decisions, and deployment outcomes. Measure review usefulness, latency, and cost before claiming an improvement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are proposed enhancements, not capabilities already demonstrated by this repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;It was very important for me to be able to prove or have a first hand experience on how infusing agents into the process will be. This allows me prepare for governance requirements not only for carrying out my work but also when it comes to making business decisions. The most useful result was a clearer separation of responsibilities. GitHub Actions executes the workflow. Deterministic rules evaluate explicit policy. Foundry can help explain the evidence. Environment protection rules control when the protected job may run.&lt;/p&gt;

&lt;p&gt;This PoC demonstrates those pieces without claiming a complete AI-operated delivery platform. Connecting the agent is the next technical step; validating its usefulness and keeping the approval boundary intact are the next engineering responsibilities.&lt;/p&gt;

&lt;p&gt;If you are exploring this approach, start with a release decision your team already makes. Define the evidence, make the policy explicit, and then test whether an AI reviewer helps people understand that decision better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source code and documentation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc" rel="noopener noreferrer"&gt;Demo repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc/blob/main/.github/workflows/agentic-devops.yml" rel="noopener noreferrer"&gt;Main workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc/blob/main/scripts/create_release_evidence.py" rel="noopener noreferrer"&gt;Evidence generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc/blob/main/src/agentic_devops_poc/release_policy.py" rel="noopener noreferrer"&gt;Release policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc/blob/main/scripts/agentic_release_review.py" rel="noopener noreferrer"&gt;Review script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc/blob/main/docs/foundry-agent-instructions.md" rel="noopener noreferrer"&gt;Foundry agent instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/balop3e/agentic-devops-poc/blob/main/.github/workflows/reusable-agentic-release-review.yml" rel="noopener noreferrer"&gt;Reusable review workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Implementation and documentation reviewed on 25 September 2026. Screenshots show the original demonstration; product interfaces and access requirements can change.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>azure</category>
      <category>ai</category>
    </item>
    <item>
      <title>HOSTING A STATIC WEBSITE ON AZURE STORAGE WITH AZURE CDN</title>
      <dc:creator>Oluwagbenga Balogun</dc:creator>
      <pubDate>Wed, 16 Nov 2022 03:16:46 +0000</pubDate>
      <link>https://dev.to/balop3e/hosting-a-static-website-on-azure-storage-with-azure-cdn-3788</link>
      <guid>https://dev.to/balop3e/hosting-a-static-website-on-azure-storage-with-azure-cdn-3788</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;br&gt;
A colleague reached out to me some time ago and wanted to host a static website on Azure storage. We haven’t had time to go through the steps and achieve his goal which is to host a static website on Azure.&lt;br&gt;
Now I made this demo for those who would like to host a static website on Azure cloud, specifically into an Azure Storage Account using the Azure portal. I would make this demo a step by step walk through so even you that are new to the cloud can easily host your static website on Azure Storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT ARE THE BENEFITS OF HOSTING YOUR STATIC WEBSITE ON AZURE?&lt;/strong&gt;&lt;br&gt;
Okay so why should you host your static website on Azure? there are good reasons for wanting to do this as I have highlighted below;&lt;br&gt;
• Simplicity: All you have to do is upload your web folders and files to a container.&lt;br&gt;
• Saving on hosting cost: Cheaper compared to buying hosting fee from a web hosting company.&lt;br&gt;
• Better Performance: Azure CDN can be configured to get a better performance delivering contents to your end users around the world.&lt;br&gt;
Combining Azure CDN with blob storage provides a low-cost and highly reliable static website hosting solution. These static sites have only CSS, HTML, JS files, fonts, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PREREQUISITES&lt;/strong&gt;&lt;br&gt;
There are some prerequisites we have to put in place before we proceed with this demo:&lt;br&gt;
• Create a Microsoft Azure account, if you currently don’t have you can create one &lt;a href="https://azure.microsoft.com/en-us/" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;br&gt;
• Create a subscription&lt;br&gt;
• Have a registered domain&lt;/p&gt;

&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%2F5ht7cs1l0i4am7ijccle.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%2F5ht7cs1l0i4am7ijccle.png" alt=" " width="750" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; To those that are new to the Azure platform, when you create a free account, you get a $200 free Azure credit to create resources for 30 days and a subscription is automatically created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OUTLINE OF WORKFLOW&lt;/strong&gt;&lt;br&gt;
Below is the workflow of what we would be doing in this demo,&lt;/p&gt;

&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%2Fton0mowa1hv5iu09u3im.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%2Fton0mowa1hv5iu09u3im.png" alt=" " width="700" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our static website would have a custom domain with which our end users would be able to access our website from the public web.&lt;/p&gt;

&lt;p&gt;After all prerequisites has been put in place, let’s get started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• CREATE A RESOURCE GROUP&lt;/strong&gt;&lt;br&gt;
A resource group is a container where all related resources reside in. Now let’s proceed and create a resource group. See below images for visual guide.&lt;/p&gt;

&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%2F2hl2nx48z5hj0211rlj1.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%2F2hl2nx48z5hj0211rlj1.png" alt=" " width="799" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fpfujfl2x7wnzrtwm673o.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%2Fpfujfl2x7wnzrtwm673o.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fl2aq7vnuo4or56ekvrho.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%2Fl2aq7vnuo4or56ekvrho.png" alt=" " width="799" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F06yo09119zlchxywm93x.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%2F06yo09119zlchxywm93x.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• CREATING A STORAGE ACCOUNT&lt;/strong&gt;&lt;br&gt;
After creating the resource group static-website-demo-rg for this demo, the next step is to create a storage account inside the static-website-demo-rg RG. See images below,&lt;/p&gt;

&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%2F81qxnw98n4lhizqx7ccz.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%2F81qxnw98n4lhizqx7ccz.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fww30uyoh6uffscxxyx1v.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%2Fww30uyoh6uffscxxyx1v.png" alt=" " width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fdjioql111uooe1pk1s5c.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%2Fdjioql111uooe1pk1s5c.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Ff3y5xmtyfnbsahokwj5e.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%2Ff3y5xmtyfnbsahokwj5e.png" alt=" " width="799" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fytmqa6om7md64mzjnpo9.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%2Fytmqa6om7md64mzjnpo9.png" alt=" " width="799" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Goto the newly created storage account resource which is staticwebsitehosting1 for this demo. This is where most of the task would take place. As shown in image below, this is the interface you should see when you goto the storage account.&lt;/p&gt;

&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%2Fie66rs9cm8cg9lqe0qkr.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%2Fie66rs9cm8cg9lqe0qkr.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on capabilities and you see that the storage account at the moment is not configured for static website hosting and Azure CDN is also not configured as shown in the image above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ENABLING STATIC WEBSITE ON STORAGE ACCOUNT&lt;/strong&gt;&lt;br&gt;
Now click on static website and enable the storage account to host static content webpages. &lt;br&gt;
Enter the &lt;strong&gt;index.html&lt;/strong&gt; inside the index document block, you can also specify a root file for 404 error but we are not interested in that for this demo. Save and when it is enabled a primary endpoint &lt;strong&gt;&lt;a href="https://staticwebsitehosting1.z13.web.core.windows.net" rel="noopener noreferrer"&gt;https://staticwebsitehosting1.z13.web.core.windows.net&lt;/a&gt;&lt;/strong&gt; is created automatically this is just a generic URL for your end users to access your website contents.&lt;br&gt;
See images below&lt;/p&gt;

&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%2Fps6lmgx274f8y6y7ha9x.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%2Fps6lmgx274f8y6y7ha9x.png" alt=" " width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F7j7ojup0y95rh0dvhcrd.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%2F7j7ojup0y95rh0dvhcrd.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, after enabling static website a container &lt;strong&gt;$web&lt;/strong&gt; is automatically created, this container would hold your web content files and folders.&lt;/p&gt;

&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%2F60p4p1ummkh1z62689tt.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%2F60p4p1ummkh1z62689tt.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we check capabilities under the storage account overview, we see that static website has been configured.&lt;/p&gt;

&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%2F1t93jq5he4ajx2glpxid.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%2F1t93jq5he4ajx2glpxid.png" alt=" " width="799" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPLOADING WEB CONTENTS TO CONTAINER&lt;/strong&gt;&lt;br&gt;
Now it's time to upload our website contents to the container &lt;strong&gt;$web&lt;/strong&gt;. You might be thinking uploading the web content to the container from the portal should be easy by just clicking the upload button and upload the web folders and files to the container. Unfortunately, you cannot upload folders to the container from the portal directly except for files.&lt;br&gt;
Here is our web content below,&lt;/p&gt;

&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%2Ft8gb1fpwrvbuzw3xnftv.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%2Ft8gb1fpwrvbuzw3xnftv.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;see below image you can only upload files to the container. For our web contents only &lt;em&gt;index.html&lt;/em&gt; and &lt;em&gt;README.txt&lt;/em&gt; can be uploaded which does not work for us because all folders and files has to be uploaded&lt;/p&gt;

&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%2Fohg31ia407mz06dmfwqs.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%2Fohg31ia407mz06dmfwqs.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• DOWNLOADING AZCOPY&lt;/strong&gt;&lt;br&gt;
To upload our web contents to the container we would make use of a tool called AzCopy. AzCopy is a CLI (command-line) tool that moves data into and out of an Azure Storage. &lt;br&gt;
Next step is to download the AzCopy tool that best fits your environment here -&amp;gt; &lt;a href="https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy&lt;/a&gt;.&lt;br&gt;
Unzip the AzCopy file, for this demo I have the AzCopy unzipped folder copied to a folder "&lt;em&gt;azmove&lt;/em&gt;" in my C:\ drive root. You can add the directory location of the AzCopy executable to your system environment variable path for ease of use, but for this I will navigate to the folder where we have the AzCopy executable and copy the file full path somewhere like a notepad. See Image below&lt;/p&gt;

&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%2Fbdp4hbgofqalsseg6911.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%2Fbdp4hbgofqalsseg6911.png" alt=" " width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• AUTHORIZE AZCOPY TO ACCESS STORAGE ACCOUNT&lt;/strong&gt;&lt;br&gt;
We would need to authorize AzCopy to access the storage account so we can upload the web contents to the container. We would provide authorization credentials to AzCopy by using &lt;strong&gt;shared access signature (SAS) token&lt;/strong&gt; generated from the storage account. Click on the shared access signature on the left pane under "&lt;em&gt;security + networking&lt;/em&gt;".&lt;br&gt;
Explaining the key options&lt;br&gt;
&lt;strong&gt;Allowed service&lt;/strong&gt; - check &lt;em&gt;blob&lt;/em&gt; only because we want to take into consideration one of cloud best practices which is least privilege concept. This SAS token is only intended for the blob service and no access should be granted to your file, queue or table service using the generated SAS token.&lt;br&gt;
&lt;strong&gt;Allowed resource type&lt;/strong&gt; - check container as this is the only resource, we want the SAS token to access.&lt;br&gt;
&lt;strong&gt;Start and expiry date/time&lt;/strong&gt; - set the period you want this SAS token to be valid through. Put into consideration security best practices, expiry date shouldn't elapse the period SAS token is expected to be used.&lt;br&gt;
Leave other options as it is and proceed to click on generate SAS and connection string.&lt;br&gt;
See Images below,&lt;/p&gt;

&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%2Fjq3o38k62tptyomlcq72.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%2Fjq3o38k62tptyomlcq72.png" alt=" " width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fr2rnjlw49bgzevxntnri.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%2Fr2rnjlw49bgzevxntnri.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fztbpyrqtlza4u2m4jtdn.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%2Fztbpyrqtlza4u2m4jtdn.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SAS token is generated as you can see in the last image above.&lt;br&gt;
Copy the SAS token somewhere like a notepad, once you leave this page you cannot retrieve the token any longer. As you can see in the image below I have copied all important path, urls, token to one point.&lt;/p&gt;

&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%2Fiw0mrjfo2dueqn8hamie.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%2Fiw0mrjfo2dueqn8hamie.png" alt=" " width="799" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AzCopy script&lt;br&gt;
&lt;strong&gt;&lt;em&gt;.\azcopy copy "{path to the website folder on your local pc}" "{path to the container hosting the website}{SAS token}" --recursive&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Explaining the contents of AzCopy scripts&lt;br&gt;
&lt;strong&gt;.\azcopy copy&lt;/strong&gt; - This command copies source data to a destination location, be it from your local computer to a storage account or from a storage account to your local computer.&lt;br&gt;
&lt;strong&gt;--recursive&lt;/strong&gt; - This flag is necessary because we want to make sure it copies all sub-folders inside folders and files &lt;br&gt;
{&lt;strong&gt;path to the website folder on your local pc&lt;/strong&gt;} - This is the source destination of your web contents, to be uploaded to the container. See image below&lt;/p&gt;

&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%2Fl5pf4vsq1sxhqarck7p3.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%2Fl5pf4vsq1sxhqarck7p3.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;{path to the container hosting the website}&lt;/strong&gt; - This is the target destination which is your container. To get the URL/path to your container see the images below&lt;/p&gt;

&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%2Fymabp14wvjaapexo4jvi.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%2Fymabp14wvjaapexo4jvi.png" alt=" " width="799" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fxuvmqtsiaj2u3ozk86ml.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%2Fxuvmqtsiaj2u3ozk86ml.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if you remember we are making use of AzCopy because we cannot upload folders to the container using Azure portal, if we copy the source folder to the container, our web content would be nested inside another folder and this would not work. We need all folder and files of the web content to sit at the root of the&lt;br&gt;
container. I have created an AzCopy scripts for each folder and file to be run and pushed to the container. see image below&lt;/p&gt;

&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%2F94llrgpume6do9o0d2jm.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%2F94llrgpume6do9o0d2jm.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• RUNNING THE AZCOPY SCRIPT&lt;/strong&gt;&lt;br&gt;
On your local pc launch cmd or PowerShell to run the AzCopy script. For this demo I am making use of cmd.&lt;/p&gt;

&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%2Fhzyan9z95vdgh17709kv.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%2Fhzyan9z95vdgh17709kv.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change the current working directory to where you have the AzCopy executable file by running &lt;strong&gt;"cd {file path to where the azcopy exec file is}"&lt;/strong&gt; as shown below&lt;/p&gt;

&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%2Fjabmiod9x61mlx6i5kn3.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%2Fjabmiod9x61mlx6i5kn3.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the AzCopy script we coined together on notepad and past the script in cmd and run one after the other. &lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Do this for all the remaining scripts.&lt;/p&gt;

&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%2Fl1no86t3sd2ah5k1zhf8.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%2Fl1no86t3sd2ah5k1zhf8.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After successfully uploading the web contents, and you refresh your container you would get your web contents inside the $web container.&lt;/p&gt;

&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%2Fa9mxvq575vbgndorywex.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%2Fa9mxvq575vbgndorywex.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember the primary endpoint link &lt;a href="https://staticwebsitehosting1.z13.web.core.windows.net/" rel="noopener noreferrer"&gt;https://staticwebsitehosting1.z13.web.core.windows.net/&lt;/a&gt; that was generated when you enabled static website on your storage account? now that is the link for your end users to access your content on the public web. See image below&lt;/p&gt;

&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%2Fyfbsegwkr3lg1cpr1a0u.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%2Fyfbsegwkr3lg1cpr1a0u.png" alt=" " width="799" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONFIGURING AZURE CDN&lt;/strong&gt;&lt;br&gt;
Now it's time to configure Azure CDN, firstly let's try to understand what Azure CDN is and its benefits to our end users.&lt;br&gt;
Azure Content Delivery Network (CDN) is designed to send web contents such as audio, video, images, and other files faster and more reliably to your end users using servers that are closest to the end users. This helps to increase speed and availability, resulting in significant user experience improvements.&lt;br&gt;
Below image shows Azure CDN is not configured yet.&lt;/p&gt;

&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%2Fa38kd89kiin5ng566b7j.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%2Fa38kd89kiin5ng566b7j.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Azure CDN on the left pane under the &lt;em&gt;“security + networking”&lt;/em&gt; and create a new endpoint.&lt;br&gt;
Give it a CDN profile name, select the pricing tier &lt;em&gt;"select Microsoft CDN (classic)"&lt;/em&gt; give the CDN endpoint a name. &lt;br&gt;
Origin hostname - you have to select the origin server from which CDN endpoint pulls content from. I would be using my primary endpoint which is &lt;strong&gt;"staticwebsitehosting1.z13.web.core.windows.net"&lt;/strong&gt; now proceed to create the CDN. See image below,&lt;/p&gt;

&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%2F9v6vvew91dpo5nrtcmot.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%2F9v6vvew91dpo5nrtcmot.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fnuhzb0cygutm4i7vhz3c.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%2Fnuhzb0cygutm4i7vhz3c.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fe3elon4rxh5xdnw03mi6.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%2Fe3elon4rxh5xdnw03mi6.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last image above shows our CDN endpoint is ready and running.&lt;br&gt;
Click on the newly created CDN endpoint, you can see 2 URLs one is the CDN endpoint and the other is the origin hostname aka primary endpoint for our static website. See image below,&lt;/p&gt;

&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%2Fqpfjcbkx264gjk8vcpmc.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%2Fqpfjcbkx264gjk8vcpmc.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that Azure CDN has been successfully configured for our setup, we can proceed to load the URL of the CDN endpoint which is &lt;a href="https://swcdn.azureedge.net" rel="noopener noreferrer"&gt;https://swcdn.azureedge.net&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; It would take some time for Azure CDN to load your content you might get the blue screen error or &lt;em&gt;"the account being accessed does not support http"&lt;/em&gt; error. Just give it sometime and refresh after some minutes. See Images below&lt;/p&gt;

&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%2Feow2jntxwnlwrbx23v9l.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%2Feow2jntxwnlwrbx23v9l.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fsgamfgekh6ru6wyh2q4a.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%2Fsgamfgekh6ru6wyh2q4a.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONFIGURING A CUSTOM DOMAIN TO YOUR AZURE CDN ENDPOINT&lt;/strong&gt;&lt;br&gt;
Now can you imagine your end users accessing your webpage using the URL &lt;a href="https://swcdn.azureedge.net" rel="noopener noreferrer"&gt;https://swcdn.azureedge.net&lt;/a&gt; of course you wouldn’t want that, you would want them to access your webpage using your preferred domain name which can be an existing one for your business or a newly registered domain name.&lt;br&gt;
For this demo I would be using an existing domain I registered on Azure &lt;em&gt;"theproliproject.com"&lt;/em&gt; and another registered on Namecheap &lt;em&gt;“mast***.org”&lt;/em&gt;. I will be making 2 demonstrations for domain registered on Azure portal and domain registered by a different registrar.&lt;br&gt;
&lt;strong&gt;• Domain registered on Azure portal.&lt;/strong&gt;&lt;br&gt;
Goto App Service Domain and select the domain. See image below&lt;/p&gt;

&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%2F24o4my6s9hhct1yhr80o.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%2F24o4my6s9hhct1yhr80o.png" alt=" " width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What we want to do? we want to create a CNAME record with the DNS provider for &lt;em&gt;"theproliproject.com"&lt;/em&gt; that points to &lt;em&gt;"swcdn.azureedge.net"&lt;/em&gt; doing this we would be able to associate the domain to the CDN endpoint. After selecting the domain, click on manage &lt;em&gt;DNS&lt;/em&gt; records and click on &lt;em&gt;record&lt;/em&gt; set.&lt;/p&gt;

&lt;p&gt;For this demo I am making use of a sub domain &lt;strong&gt;staticweb.theproliproject.com&lt;/strong&gt;&lt;br&gt;
• Enter the name i.e. the subdomain name&lt;br&gt;
• Enter the type - you are creating a CNAME record, this is because you are mapping/pointing your host name to another name record which is &lt;em&gt;"swcdn.azureedge.net"&lt;/em&gt;&lt;br&gt;
• Leave Alias record set to No&lt;br&gt;
• TTL - leave at default&lt;br&gt;
• Alias - is the CDN endpoint &lt;em&gt;"swcdn.azureedge.net"&lt;/em&gt;&lt;br&gt;
Click ok after entering the appropriate information’s. See images below&lt;/p&gt;

&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%2Fysokhkxww1jzu3nnbyfx.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%2Fysokhkxww1jzu3nnbyfx.png" alt=" " width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F9y2xwq9bv2e1b2bm229y.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%2F9y2xwq9bv2e1b2bm229y.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F16rcdaee1a4escvw4wrh.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%2F16rcdaee1a4escvw4wrh.png" alt=" " width="799" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fatu4331w5l8vvpzkzexq.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%2Fatu4331w5l8vvpzkzexq.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After successfully creating the DNS record, we can proceed to Azure CDN and map our custom domain to Azure CDN. Goto the Azure CDN and click on custom domain&lt;br&gt;
Enter custom hostname - enter your subdomain here for this demo &lt;strong&gt;"staticweb.theproliproject.com"&lt;/strong&gt; click add&lt;/p&gt;

&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%2Fxrz97nfl0pb2ogtxq5wi.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%2Fxrz97nfl0pb2ogtxq5wi.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fdrdpokom492ccq2891lg.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%2Fdrdpokom492ccq2891lg.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you load the &lt;strong&gt;staticweb.theproliproject.com&lt;/strong&gt; in your web browser you would get the &lt;strong&gt;warning: potential security risk ahead&lt;/strong&gt; warning message. If you proceed to accept the risk and continue the website loads but with the SSL certificate missing as shown in image below&lt;/p&gt;

&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%2Fws0w3n31b4pb65xhca7b.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%2Fws0w3n31b4pb65xhca7b.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let us proceed to enable https which enables you to deliver your web contents to your end users securely over the public web.&lt;br&gt;
To enable https, click on the custom domain just created and toggle the enable https feature. &lt;br&gt;
See image below&lt;/p&gt;

&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%2Fuozzly6djzt7tz4s3eu8.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%2Fuozzly6djzt7tz4s3eu8.png" alt=" " width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After enabling https, Azure then undergoes the following processes;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submits your https request&lt;/li&gt;
&lt;li&gt;Validates your domain.&lt;/li&gt;
&lt;li&gt;Provision a certificate for your domain.
See image below,&lt;/li&gt;
&lt;/ul&gt;

&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%2Fzleu4vnbe9x6gv6ewrvz.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%2Fzleu4vnbe9x6gv6ewrvz.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fa39luzxh1d3co8lsmrga.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%2Fa39luzxh1d3co8lsmrga.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F996midcc1c2h98sch2r5.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%2F996midcc1c2h98sch2r5.png" alt=" " width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the process is completed, you can reload the URL in your browser and your website should be secured with a SSL certificate.&lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; it might take up to 5 minutes for this process to get completed.&lt;br&gt;
See image below&lt;/p&gt;

&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%2Fotqlq5wob0rwqtcnucpl.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%2Fotqlq5wob0rwqtcnucpl.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• Domain registered with another registrar&lt;/strong&gt;&lt;br&gt;
Login to your account dashboard of your registrar/host account and navigate to where you can manage your domain. &lt;br&gt;
Enter a CNAME record with the host name which is your preferred subdomain name e.g., for this demo &lt;em&gt;"staticweb"&lt;/em&gt; and the value which is the Azure CDN endpoint &lt;em&gt;"swcdn.azureedge.net"&lt;/em&gt;. See image below,&lt;/p&gt;

&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%2Fr3a3o0u0xf3nhasi7nqg.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%2Fr3a3o0u0xf3nhasi7nqg.png" alt=" " width="799" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fmv68i9g3krg8vdttbxug.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%2Fmv68i9g3krg8vdttbxug.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fse225tmmpa7j7jmqlgij.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%2Fse225tmmpa7j7jmqlgij.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fs1fq805vtjvou4aw920v.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%2Fs1fq805vtjvou4aw920v.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the CNAME record is successfully added, proceed to Azure portal and add the custom domain under the Azure CDN configuration as shown in the image below,&lt;/p&gt;

&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%2Fluibppso61ii8n713jmu.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%2Fluibppso61ii8n713jmu.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you proceed to load the website without enabling https you would get security warning error as shown in the image below&lt;/p&gt;

&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%2Fyocev099lf3i6fi13ecp.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%2Fyocev099lf3i6fi13ecp.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fjcmhy4mmnmsc1gs6ufy2.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%2Fjcmhy4mmnmsc1gs6ufy2.png" alt=" " width="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fw6za8szu2xpswbddsrt6.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%2Fw6za8szu2xpswbddsrt6.png" alt=" " width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Faenwv1euzk0x2jxmgrn6.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%2Faenwv1euzk0x2jxmgrn6.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now proceed to enable https&lt;/p&gt;

&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%2Fqtuqe887is2e8o5nmeuf.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%2Fqtuqe887is2e8o5nmeuf.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F4sddtx9w04p65p0h26sp.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%2F4sddtx9w04p65p0h26sp.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fihidnkflzk8uen57ekts.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%2Fihidnkflzk8uen57ekts.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F247pkmb4ia1exl40g96u.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%2F247pkmb4ia1exl40g96u.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now your website is secured proceed to reload the URL.&lt;/p&gt;

&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%2Fklzxvhp8fopmji040k12.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%2Fklzxvhp8fopmji040k12.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2F80aladmksernt5ms5iyj.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%2F80aladmksernt5ms5iyj.png" alt=" " width="749" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RESOURCES&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/balop3e/static-website-demo" rel="noopener noreferrer"&gt;https://github.com/balop3e/static-website-demo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://aka.ms/downloadazcopy-v10-windows" rel="noopener noreferrer"&gt;https://aka.ms/downloadazcopy-v10-windows&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mega.nz/file/YKdBXYIQ#nBlYomzljIKF9QXLmdvQwhA45iKLOw-lNXyuaJ6uPVU" rel="noopener noreferrer"&gt;https://mega.nz/file/YKdBXYIQ#nBlYomzljIKF9QXLmdvQwhA45iKLOw-lNXyuaJ6uPVU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;br&gt;
In this demo we just saw how to host a static website on Azure using the Azure portal. In future posts, I will be hosting this static website using Azure DevOps Pipelines, Git, GitHub and Terraform.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>staticwebapps</category>
      <category>tutorial</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
