Skip to content

Commit fdf47d0

Browse files
committed
Updated pipeline to use service principal with federated credential to authenticate with Azure in order to deploy the static web app instead of using the deprecated approach
1 parent 988bebd commit fdf47d0

File tree

12 files changed

+136
-282
lines changed

12 files changed

+136
-282
lines changed

.github/workflows/deploy_to_azure.yml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88

99
env:
1010
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.'
11-
PYTHON_VERSION: '3.10'
11+
PYTHON_VERSION: '3.11'
1212
STORAGE_ACCOUNT_NAME: 'hvalfangststorageaccount'
1313

1414
jobs:
@@ -57,10 +57,12 @@ jobs:
5757
- name: Unzip artifact for deployment
5858
run: unzip release.zip
5959

60-
- name: Login to Azure using Service Principal
61-
uses: azure/login@v1
60+
- name: Login to Azure with OIDC
61+
uses: azure/login@v2
6262
with:
63-
creds: ${{ secrets.AZURE_CREDENTIALS }}
63+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
64+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
65+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
6466

6567
- name: Deploy to Azure Functions
6668
uses: Azure/functions-action@v1
@@ -103,6 +105,9 @@ jobs:
103105
deploy-react:
104106
runs-on: ubuntu-latest
105107
needs: build-react
108+
permissions:
109+
id-token: write
110+
contents: read
106111
steps:
107112
- name: Download React build artifact
108113
uses: actions/download-artifact@v4
@@ -112,10 +117,12 @@ jobs:
112117
- name: Unzip React build
113118
run: unzip build.zip
114119

115-
- name: Login to Azure using service principal
116-
uses: azure/login@v1
120+
- name: Login to Azure with OIDC
121+
uses: azure/login@v2
117122
with:
118-
creds: ${{ secrets.AZURE_CREDENTIALS }}
123+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
124+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
125+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
119126

120127

121128
- name: Deploy React build to Azure Static Website

README.md

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
# Static web app invoking Azure functions
22

3-
Static web app built with the React framework. The [application](client/src/App.js) allows users to upload CSV files to a storage blob via an HTTP-triggered function.
4-
The uploaded files are then processed by a blob-triggered function, which stores the results in a separate container. Aforementioned functions
5-
are present in the [function_app.py](hvalfangst_function/function_app.py) python script - which is the main entrypoint of our Azure Function App instance.
3+
The aim of this repository is to demonstrate how to deploy a [static website](client/src/App.js) written in React to a [Storage Blob](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blob-static-website). The
4+
hosted SPA allows users to upload CSV files containing demographic and financial data about individuals. The files are uploaded to a storage blob by calling an HTTP-triggered Azure Function with the appropriate output bindings.
5+
Once the CSV has been uploaded to the storage blob, another, blob-triggered Azure Function calculates correlations between various variables, such as experience, state, gender, and income.
6+
The computed statistics are then stored in a new blob container, which is used to serve the results to the user.
7+
These two functions are defined in the python script [function_app.py](hvalfangst_function/function_app.py) - which is the main entrypoint of our Azure Function App instance.
68

7-
A pipeline has been set up to deploy the function app and the static web app to Azure using GitHub Actions. The pipeline is triggered by a push to the main branch or by manually running the workflow.
9+
The associated Azure infrastructure is deployed with a script (more on that below).
810

11+
A branch-triggered pipeline has been set up to deploy our code to the respective Azure resources using a GitHub Actions Workflows [script](.github/workflows/deploy_to_azure.yml).
12+
The two functions are deployed using the Function App's associated **publish profile**, whereas the static web app is deployed using a service principal configured with a federated credential.
13+
Note that the static web app is actually hosted directly on a storage blob, which is configured to serve static websites. Thus, deploying the web app is simply a matter of uploading the files to the designated blob container.
914

1015

1116
## Requirements
@@ -18,8 +23,8 @@ A pipeline has been set up to deploy the function app and the static web app to
1823

1924
## Allocate resources
2025

21-
The shell script [allocate_resources](infra/allocate_resources.sh) creates Azure resources specified in a
22-
[Bicep](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep) template [file](infra/main.bicep).
26+
The shell script [allocate_resources](infra/allocate_resources.sh) creates Azure resources using the Azure CLI and a
27+
[Bicep](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep) template [file](infra/main.bicep).
2328

2429
It will create the following hierarchy of resources:
2530

@@ -41,20 +46,13 @@ graph TD
4146
B -->|Contains| F
4247
```
4348

44-
## Deallocate resources
45-
46-
The shell script [deallocate_resources](infra/deallocate_resources.sh) deletes our Azure resources.
47-
48-
# CI/CD
49-
50-
A CI/CD pipeline for deploying our [Function App](hvalfangst_function/function_app.py) to Azure has been set up using a GitHub Actions workflows [script](.github/workflows/deploy_to_azure.yml). The pipeline is either triggered by a push to the main branch or by manually running the workflow.
51-
In order for the pipeline to work, the following secrets must be set in the repository settings:
52-
53-
![img.png](img.png)
54-
55-
The associated values of the aforementioned secret can be retrieved from the Azure portal, under our deployed Function App.
56-
Click on the **Get publish profile** button and copy/paste the file content into the secret value field.
57-
58-
![img_1.png](img_1.png)
49+
## GitHub secrets
50+
Four secrets are required in order for the GitHub Actions Workflow script to deploy the code to the Azure resources.
51+
As may be observed in the [script](.github/workflows/deploy_to_azure.yml), these are:
5952

53+
- **AZURE_CLIENT_ID**: Used to authenticate the service principal in order to deploy the static web app
54+
- **AZURE_SUBSCRIPTION_ID**: Used to authenticate the service principal in order to deploy the static web app
55+
- **AZURE_TENANT_ID**: Used to authenticate the service principal in order to deploy the static web app
56+
- **PUBLISH_PROFILE**: Used to deploy our two functions to the Azure Function App
6057

58+
![img_1.png](images/img_1.png)

client/package-lock.json

Lines changed: 12 additions & 233 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)