|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +# Copyright (c) Microsoft Corporation. |
| 4 | +# Licensed under the MIT license. |
| 5 | + |
| 6 | +set +x |
| 7 | +if [[ -z "$1" ]] |
| 8 | + then |
| 9 | + echo "Environment Code value not supplied" |
| 10 | + exit 1 |
| 11 | +fi |
| 12 | +ENVCODE=$1 |
| 13 | + |
| 14 | +create_synapase_managed_private_endpoint() { |
| 15 | + local tmpfile=$(mktemp) |
| 16 | + local synpaseWorkspace=$1 |
| 17 | + local peName=$2 |
| 18 | + local groupId=$3 |
| 19 | + local privateLinkResourceId=$4 |
| 20 | + |
| 21 | + echo "creating MPE if not exist for $peName" |
| 22 | + # check if peName exists |
| 23 | + local checkPeExists=$(az synapse managed-private-endpoints show \ |
| 24 | + --pe-name $peName -otsv --query "id" --workspace-name $synpaseWorkspace 2>/dev/null || echo '') |
| 25 | + |
| 26 | + if [[ -z $checkPeExists ]]; |
| 27 | + then |
| 28 | + jq -n -r \ |
| 29 | + --arg groupId "$groupId" \ |
| 30 | + --arg privateLinkResourceId "$privateLinkResourceId" \ |
| 31 | + '{groupId:$groupId, privateLinkResourceId:$privateLinkResourceId}' > $tmpfile |
| 32 | + |
| 33 | + az synapse managed-private-endpoints create \ |
| 34 | + --file @$tmpfile \ |
| 35 | + --pe-name $peName \ |
| 36 | + --workspace-name $1 |
| 37 | + |
| 38 | + sleep 60 |
| 39 | + local provisioningState=$(az synapse managed-private-endpoints show --pe-name $peName \ |
| 40 | + --workspace-name $synpaseWorkspace -o tsv --query "properties.provisioningState") |
| 41 | + while [[ $provisioningState != "Succeeded" ]]; |
| 42 | + do |
| 43 | + sleep 10 |
| 44 | + provisioningState=$(az synapse managed-private-endpoints show --pe-name $peName \ |
| 45 | + --workspace-name $synpaseWorkspace -o tsv --query "properties.provisioningState") |
| 46 | + echo "provisioningState of $peName: $provisioningState" |
| 47 | + done |
| 48 | + fi |
| 49 | +} |
| 50 | + |
| 51 | +approve_synapase_managed_private_endpoint() { |
| 52 | + local resourceGroup=$1 |
| 53 | + local resourceName=$2 |
| 54 | + local resourceType=$3 |
| 55 | + |
| 56 | + local PE_CONNECTION=$(az network private-endpoint-connection list -g $resourceGroup -n $resourceName \ |
| 57 | + --type $resourceType --query "[0]" -ojson 2>/dev/null || echo '') |
| 58 | + if [[ -n $PE_CONNECTION ]]; |
| 59 | + then |
| 60 | + local PE_CONNECTION_ID=$(echo $PE_CONNECTION | jq -r '.id') |
| 61 | + local PE_CONNECTION_APPROVAL_STATUS=$(echo $PE_CONNECTION | jq -r '.properties.privateLinkServiceConnectionState.status') |
| 62 | + |
| 63 | + if [[ $PE_CONNECTION_APPROVAL_STATUS != "Approved" ]]; |
| 64 | + then |
| 65 | + az network private-endpoint-connection approve \ |
| 66 | + --id $PE_CONNECTION_ID --description "Approved by script" |
| 67 | + echo "$PE_CONNECTION_ID got approved" |
| 68 | + fi |
| 69 | + fi |
| 70 | +} |
| 71 | + |
| 72 | +# wait for SYNAPSE_STORAGE_ACCT showing up in azcli and approve its managed private endpoint first. |
| 73 | +SYNAPSE_STORAGE_ACCT=$(az storage account list --query "[?tags.store && tags.store == 'synapse'].name" -o tsv -g $ENVCODE-pipeline-rg) |
| 74 | +while [[ -z $SYNAPSE_STORAGE_ACCT ]]; |
| 75 | +do |
| 76 | + sleep 30 |
| 77 | + SYNAPSE_STORAGE_ACCT=$(az storage account list --query "[?tags.store && tags.store == 'synapse'].name" -o tsv -g $ENVCODE-pipeline-rg) |
| 78 | +done |
| 79 | +approve_synapase_managed_private_endpoint $ENVCODE-pipeline-rg $SYNAPSE_STORAGE_ACCT "Microsoft.Storage/storageAccounts" |
| 80 | + |
| 81 | +# Create Managed Private Endpoints (PE) if not exist |
| 82 | +PIPELINE_KV=$(az keyvault list --query "[?tags.usage && tags.usage == 'linkedService']" -ojson -g $ENVCODE-pipeline-rg) |
| 83 | +while [[ $PIPELINE_KV == '[]' ]]; |
| 84 | +do |
| 85 | + sleep 30 |
| 86 | + PIPELINE_KV=$(az keyvault list --query "[?tags.usage && tags.usage == 'linkedService']" -ojson -g $ENVCODE-pipeline-rg) |
| 87 | +done |
| 88 | +PIPELINE_KV_NAME=$(echo $PIPELINE_KV | jq -r '.[0].name') |
| 89 | +PIPELINE_KV_ID=$(echo $PIPELINE_KV | jq -r '.[0].id') |
| 90 | +create_synapase_managed_private_endpoint "$ENVCODE-pipeline-syn-ws" "$ENVCODE-mpe-pipeline-kv" "vault" "$PIPELINE_KV_ID" |
| 91 | + |
| 92 | +DATA_STORAGE_ACCT=$(az storage account list --query "[?tags.store && tags.store == 'raw']" -ojson -g $ENVCODE-data-rg) |
| 93 | +while [[ $DATA_STORAGE_ACCT == '[]' ]] |
| 94 | +do |
| 95 | + sleep 30 |
| 96 | + DATA_STORAGE_ACCT=$(az storage account list --query "[?tags.store && tags.store == 'raw']" -ojson -g $ENVCODE-data-rg) |
| 97 | +done |
| 98 | +DATA_STORAGE_ACCT_NAME=$(echo $DATA_STORAGE_ACCT | jq -r '.[0].name') |
| 99 | +DATA_STORAGE_ACCT_ID=$(echo $DATA_STORAGE_ACCT | jq -r '.[0].id') |
| 100 | +create_synapase_managed_private_endpoint "$ENVCODE-pipeline-syn-ws" "$ENVCODE-mpe-data-raw" "dfs" "$DATA_STORAGE_ACCT_ID" |
| 101 | + |
| 102 | +DATA_KV=$(az keyvault list --query "[?tags.usage && tags.usage == 'general']" -ojson -g $ENVCODE-data-rg) |
| 103 | +while [[ $DATA_KV == '[]' ]]; |
| 104 | +do |
| 105 | + sleep 30 |
| 106 | + DATA_KV=$(az keyvault list --query "[?tags.usage && tags.usage == 'general']" -ojson -g $ENVCODE-data-rg) |
| 107 | +done |
| 108 | +DATA_KV_NAME=$(echo $DATA_KV | jq -r '.[0].name') |
| 109 | +DATA_KV_ID=$(echo $DATA_KV | jq -r '.[0].id') |
| 110 | +create_synapase_managed_private_endpoint "$ENVCODE-pipeline-syn-ws" "$ENVCODE-mpe-data-kv" "vault" "$DATA_KV_ID" |
| 111 | + |
| 112 | + |
| 113 | +# Approve remaining Managed Private Endpoints (PE) |
| 114 | +approve_synapase_managed_private_endpoint $ENVCODE-pipeline-rg $PIPELINE_KV_NAME "Microsoft.Keyvault/vaults" |
| 115 | +approve_synapase_managed_private_endpoint $ENVCODE-data-rg $DATA_STORAGE_ACCT_NAME "Microsoft.Storage/storageAccounts" |
| 116 | +approve_synapase_managed_private_endpoint $ENVCODE-data-rg $DATA_KV_NAME "Microsoft.Keyvault/vaults" |
0 commit comments