From 8aa2f71129b88fdf09ffb5e8a7a8fedc9d5b82b5 Mon Sep 17 00:00:00 2001 From: hvalfangst Date: Thu, 4 Jan 2024 18:21:57 +0100 Subject: [PATCH] Extended Terraform script with Application Insights and optimized zip step of CI/CD pipeline --- ...lfangstlinuxfunctionapp.yml => deploy.yml} | 144 +++++++++--------- down.sh | 2 +- host.json | 8 + terraform.tf => infra/terraform.tf | 19 ++- up.sh | 6 +- 5 files changed, 99 insertions(+), 80 deletions(-) rename .github/workflows/{main_hvalfangstlinuxfunctionapp.yml => deploy.yml} (65%) rename terraform.tf => infra/terraform.tf (63%) diff --git a/.github/workflows/main_hvalfangstlinuxfunctionapp.yml b/.github/workflows/deploy.yml similarity index 65% rename from .github/workflows/main_hvalfangstlinuxfunctionapp.yml rename to .github/workflows/deploy.yml index 6ba21f9..8bb9240 100644 --- a/.github/workflows/main_hvalfangstlinuxfunctionapp.yml +++ b/.github/workflows/deploy.yml @@ -1,75 +1,69 @@ -# Docs for the Azure Web Apps Deploy action: https://github.com/azure/functions-action -# More GitHub Actions for Azure: https://github.com/Azure/actions -# More info on Python, GitHub Actions, and Azure Functions: https://aka.ms/python-webapps-actions - -name: Build and deploy Python project to Azure Function App - hvalfangstlinuxfunctionapp - -on: - push: - branches: - - main - workflow_dispatch: - -env: - AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your web app project, defaults to the repository root - PYTHON_VERSION: '3.10' # set this to the python version to use (supports 3.6, 3.7, 3.8) - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Python version - uses: actions/setup-python@v1 - with: - python-version: ${{ env.PYTHON_VERSION }} - - - name: Create and start virtual environment - run: | - python -m venv venv - source venv/bin/activate - - - name: Install dependencies - run: pip install -r requirements.txt - - # Optional: Add step to run tests here - - - name: Zip artifact for deployment - run: zip release.zip ./* -r - - - name: Upload artifact for deployment job - uses: actions/upload-artifact@v3 - with: - name: python-app - path: | - release.zip - !venv/ - - deploy: - runs-on: ubuntu-latest - needs: build - environment: - name: 'Production' - url: ${{ steps.deploy-to-function.outputs.webapp-url }} - - steps: - - name: Download artifact from build job - uses: actions/download-artifact@v3 - with: - name: python-app - - - name: Unzip artifact for deployment - run: unzip release.zip - - - name: 'Deploy to Azure Functions' - uses: Azure/functions-action@v1 - id: deploy-to-function - with: - app-name: 'hvalfangstlinuxfunctionapp' - slot-name: 'Production' - package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }} - scm-do-build-during-deployment: true - enable-oryx-build: true - publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_D07B4CD95A574A438600A5F0A9A78160 }} \ No newline at end of file +name: CI/CD + +on: + push: + branches: + - main + workflow_dispatch: + +env: + AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' + PYTHON_VERSION: '3.10' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python version + uses: actions/setup-python@v1 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Create and start virtual environment + run: | + python -m venv venv + source venv/bin/activate + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Zip artifact for deployment + run: zip -r release.zip host.json requirements.txt wsgi_middleware/* flask_api/* + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v3 + with: + name: python-app + path: | + release.zip + !venv/ + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: 'Production' + url: ${{ steps.deploy-to-function.outputs.webapp-url }} + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v3 + with: + name: python-app + + - name: Unzip artifact for deployment + run: unzip release.zip + + - name: 'Deploy to Azure Functions' + uses: Azure/functions-action@v1 + id: deploy-to-function + with: + app-name: 'hvalfangstlinuxfunctionapp' + slot-name: 'Production' + package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }} + scm-do-build-during-deployment: true + enable-oryx-build: true + publish-profile: ${{ secrets.PUBLISH_PROFILE }} \ No newline at end of file diff --git a/down.sh b/down.sh index 1774be5..faf3418 100644 --- a/down.sh +++ b/down.sh @@ -4,4 +4,4 @@ set -e echo "Deleting Azure resources..." -terraform destroy; \ No newline at end of file +terraform -chdir=infra destroy; \ No newline at end of file diff --git a/host.json b/host.json index 83ef024..d01cbad 100644 --- a/host.json +++ b/host.json @@ -3,6 +3,14 @@ "extensions": { "http": { "routePrefix": "" + }, + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + } + } } } } \ No newline at end of file diff --git a/terraform.tf b/infra/terraform.tf similarity index 63% rename from terraform.tf rename to infra/terraform.tf index de9d937..4a5430e 100644 --- a/terraform.tf +++ b/infra/terraform.tf @@ -32,7 +32,15 @@ resource "azurerm_service_plan" "hvalfangst" { sku_name = "Y1" } -resource "azurerm_linux_function_app" "example" { +resource "azurerm_application_insights" "hvalfangst" { + name = "hvalfangstapplicationinsights" + resource_group_name = azurerm_resource_group.hvalfangst.name + location = azurerm_resource_group.hvalfangst.location + application_type = "other" +} + + +resource "azurerm_linux_function_app" "hvalfangst" { name = "hvalfangstlinuxfunctionapp" resource_group_name = azurerm_resource_group.hvalfangst.name location = azurerm_resource_group.hvalfangst.location @@ -40,8 +48,17 @@ resource "azurerm_linux_function_app" "example" { storage_account_access_key = azurerm_storage_account.hvalfangst.primary_access_key service_plan_id = azurerm_service_plan.hvalfangst.id site_config { + application_insights_key = azurerm_application_insights.hvalfangst.instrumentation_key + application_insights_connection_string = azurerm_application_insights.hvalfangst.connection_string + cors { + allowed_origins = ["https://portal.azure.com"] + } application_stack{ python_version = "3.10" } } + app_settings = { + "APPINSIGHTS_INSTRUMENTATIONKEY" = azurerm_application_insights.hvalfangst.instrumentation_key + "FUNCTIONS_EXTENSION_VERSION" = "~3" + } } \ No newline at end of file diff --git a/up.sh b/up.sh index 73c919e..bf7a3fe 100644 --- a/up.sh +++ b/up.sh @@ -4,10 +4,10 @@ set -e echo "Initializing Terraform..." -terraform init; +terraform -chdir=infra init; echo "Planning Azure resource provisioning..." -terraform plan; +terraform -chdir=infra plan; echo "Applying planned Azure resource provisioning..." -terraform apply; \ No newline at end of file +terraform -chdir=infra apply; \ No newline at end of file