deployment/Infrastructure/Import-APIMgmtPolicies.ps1 (132 lines of code) (raw):

 param ($product, $environment, $settingsKey) if ($null -eq $product) { $product = read-host -Prompt "Please enter the name of the product (e.g. epmcovi)" } if ($null -eq $environment) { $environment = read-host -Prompt "Please enter the name of the environment (e.g. dev1, tst1, mvp1, ...)" } if ($null -eq $settingsKey){ $settingsKey = "dev" } function Get-Settings($settingsKey) { $settingsFile = "./settings/$settingsKey.psd1" if (Test-Path $settingsFile) { return Import-PowerShellDataFile $settingsFile } else { throw "File '$settingsFile' not found." } } $settings = Get-Settings($settingsKey) $resourceGroupName = "rg-$($settings.region.key)-$environment-$product-01" Write-Host "Resource group name: $resourceGroupName" function DeployAPIManagement { [CmdletBinding()] param( [Parameter(Mandatory = $true)] $resourceGroupName, [Parameter(Mandatory = $true)] [ValidateSet('Public endpoints', 'Maintenance endpoints')] $apiVersionSetName ) $parentFolderPath = (Get-Item (Get-Location).ToString()).Parent.FullName switch ($apiVersionSetName) { 'Public endpoints' { $apiSpecificationPath = $parentFolderPath + "/open-api/public_endpoints.yaml" $apiAllOperationsPolicyPath = $parentFolderPath + "/apim-policies/All operations.xml" $apiPoliciesPath = $parentFolderPath + "/apim-policies" break; } 'Maintenance endpoints' { $apiSpecificationPath = $parentFolderPath + "/open-api/maintenance_endpoints.yaml" $apiAllOperationsPolicyPath = $parentFolderPath + "/apim-policies/All operations.xml" $apiPoliciesPath = $parentFolderPath + "/apim-policies" break; } } Write-Host "" Write-Host "Specification path: $apiSpecificationPath" Write-Host "All operations policy path: $apiAllOperationsPolicyPath" Write-Host "Policies path: $apiPoliciesPath" Write-Host "" #will work only if one API Management service in Resource group $apiServiceName = (Get-AzApiManagement -ResourceGroupName $resourceGroupName).Name $ApiMgmtContext = New-AzApiManagementContext -ResourceGroupName $resourceGroupName -ServiceName $apiServiceName #################################################################### # STEP 1. Creating an API Version Sets "Public endpoints" #################################################################### $apiVersionSet = Get-AzApiManagementApiVersionSet -Context $ApiMgmtContext | where { $_.DisplayName -eq $apiVersionSetName } if ($null -eq $apiVersionSet) { Write-Host "Creating an API Version Sets: $apiVersionSetName" $apiVersionSet = New-AzApiManagementApiVersionSet -Context $ApiMgmtContext -Name $apiVersionSetName -Scheme Segment } else { Write-Host "API Version Set '$apiVersionSetName' has already exist." Write-Host "If you want to update it, please remove manually and rerun the script." } #################################################################### # STEP 2. Importing an API specification from OpenApi #################################################################### $apiVersionSetId = $apiVersionSet.ApiVersionSetId $apiManagementAPI = Get-AzApiManagementApi -Context $ApiMgmtContext -Name $apiVersionSetName if ($null -eq $apiManagementAPI) { Write-Host "Importing an API specification from $apiSpecificationPath ..." -Foreground Green switch ($apiVersionSetName) { 'Public endpoints' { Import-AzApiManagementApi -Context $ApiMgmtContext ` -SpecificationFormat "OpenApi" ` -SpecificationPath $apiSpecificationPath ` -Path "" ` -ApiVersion "v1" ` -ApiVersionSetId $apiVersionSetId break; } 'Maintenance endpoints' { Import-AzApiManagementApi -Context $ApiMgmtContext ` -SpecificationFormat "OpenApi" ` -SpecificationPath $apiSpecificationPath ` -Path "utils" ` -ApiVersion "v1" ` -ApiVersionSetId $apiVersionSetId break; } } } else { Write-Host "API specification has alredy exist." Write-Host "If you want to update it, please remove manually and rerun the script." } #################################################################### # STEP 3. Importing an API policy for 'All operations' #################################################################### $apiManagementAPI = Get-AzApiManagementApi -Context $ApiMgmtContext -Name $apiVersionSetName Write-Host "Importing an API policy for 'All operations' from $apiAllOperationsPolicyPath" Set-AzApiManagementPolicy -Context $ApiMgmtContext -ApiId $apiManagementAPI.ApiId -PolicyFilePath $apiAllOperationsPolicyPath ` -Format "application/vnd.ms-azure-apim.policy.raw+xml" #################################################################### # STEP 4. Importing policies for API Management #################################################################### $operations = Get-AzApiManagementOperation -Context $ApiMgmtContext -ApiId $apiManagementAPI.ApiId foreach($op in $operations) { $fileName = "$apiPoliciesPath/" + $op.Name + "xml" if (Test-Path $fileName -PathType leaf) { Write-Host "Importing policy $fileName" $oId = $op.OperationId Set-AzApiManagementPolicy -Context $ApiMgmtContext -ApiId $apiManagementAPI.ApiId -OperationId $oId -PolicyFilePath $fileName ` -Format "application/vnd.ms-azure-apim.policy.raw+xml" } else { Write-Host "Policy '$fileName' does not exist" -Foreground Yellow } } #################################################################### # STEP 5. Remove 'Subscription required' parameter #################################################################### if ($apiManagementAPI.SubscriptionRequired -eq $true) { Write-Host "Removing 'Subscription required' parameter ..." $apiManagementAPI.SubscriptionRequired = $false Set-AzApiManagementApi -InputObject $apiManagementAPI -Name $apiManagementAPI.Name -ServiceUrl $apiManagementAPI.ServiceUrl -Protocols $apiManagementAPI.Protocols } } DeployAPIManagement -resourceGroupName $resourceGroupName -apiVersionSetName "Public endpoints" DeployAPIManagement -resourceGroupName $resourceGroupName -apiVersionSetName "Maintenance endpoints"