Skip to content

Commit 5f4992a

Browse files
sumoanemajpipkin1amee-sumo
authored
Changes for full vnet integration of data collected through block blo… (#5841)
* Changes for full vnet integration of data collected through block blob arm template * Moving images and linking them in the doc * Some formatting issues. Moving and linking images to the doc * Updates from review * Update steps for multi storage account data collection and updating screenshot. Vnet integration is not associated with multi storage account - have made it a seperate step * Static IP are not given in the UI anymore and are not required for vnet integration. Thus removing the step to copy and paste static ip from vnet integration steps * Troubleshooting pointer addition - which occured recently with a customer * Fix spelling error * Update full-vnet-integration.md * minor edits * change id name * Update docs/send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/full-vnet-integration.md Co-authored-by: John Pipkin (Sumo Logic) <[email protected]> * Update full-vnet-integration.md * Adjust indenting * Fix broken anchor link --------- Co-authored-by: John Pipkin <[email protected]> Co-authored-by: Amee Lepcha <[email protected]>
1 parent 97ac28e commit 5f4992a

21 files changed

+122
-32
lines changed

docs/send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/collect-logs.md

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,7 @@ The following steps assume you have noted down the resource group name, storage
133133
:::
134134

135135
* [Step 1: Authorize App Service read from storage account](#step-1-authorize-app-service-to-read-from-storage-account) - Enables the Azure functions to read from the storage account.
136-
* [Step 2: Create an Event Grid Subscription](#step-2-create-an-event-grid-subscription) - Subscribes all blob creation events to the Event Hub created by ARM template in [Step 3](#step-3-enabling-vnet-integration-optional) above.
137-
* [Step 3. Enabling Vnet Integration(Optional)](#step-3-enabling-vnet-integration-optional)
136+
* [Step 2: Create an Event Grid Subscription](#step-2-create-an-event-grid-subscription) - Subscribes all blob creation events to the Event Hub created by ARM template in [Step 3](#step-3-configure-azure-resources-using-arm-template) above.
138137

139138
### Step 1: Authorize App Service to read from storage account
140139

@@ -157,61 +156,47 @@ To authorize the App Service to list the Storage Account key, do the following:
157156

158157
* **Subscription**: Choose Pay as you Go.
159158
* **Managed Identity**: Choose Function App.
160-
* **Select**: **Select SUMOBRDLQProcessor\<unique_prefix\>** and **SUMORTaskConsumer\<unique_prefix\>** app services which are created by the ARM template. Click **Select**.
159+
* **Select**: **Select SUMOBRDLQProcessor\<unique_prefix\>** and **SUMOBRTaskConsumer\<unique_prefix\>** app services which are created by the ARM template. Click **Select**.
161160
1. Click **Review + assign**
162161
1. Click **Save**.
163162

164163
### Step 2: Create an Event Grid Subscription
165164

166-
This section provides instructions for creating an event grid subscription, that subscribes all blob creation events to the Event Hub created by ARM template in [Step 3](#step-3-enabling-vnet-integration-optional) above.
165+
This section provides instructions for creating an event grid subscription, that subscribes all blob creation events to the Event Hub created by ARM template in [Step 3](#step-3-configure-azure-resources-using-arm-template) above.
167166

168167
To create an event grid subscription, do the following:
169168

170-
1. In the left pane of Azure portal click **All Services**, then search for and click **Event Grid Subscriptions**.
169+
1. Go to the storage account which needs to be monitored additionally. Go under Events blade in left pane.
171170

172-
![AzureBlob_EventGridSubscriptions.png](/img/send-data/AzureBlob_EventGridSubscriptions.png)
173-
174-
1. At the top of the **Event subscriptions** page, click **+Event Subscription**.
171+
1. At the top of the **Event subscriptions** tab, click **+Event Subscription** to create new event subscription.
175172

176173
![AzureBlob_EventSubscriptionsPage.png](/img/send-data/AzureBlob_EventSubscriptionsPage.png)
177174

178-
The Create Event Subscription dialog appears.
179-
180-
![AzureBlob_CreatEventSubscription_dialog.png](/img/send-data/AzureBlob_CreatEventSubscription_dialog.png)
181-
182175
1. Specify the following values for **Event Subscription Details**:
183176

184177
* **Name:** Fill the event subscription name.
185178
* **Event Schema:** Select **Event Grid Schema**.
186179

187180
1. Specify the following values for **Topic Details**:
188181

189-
* **Topic Type**. Select Storage Accounts.
190-
* **Subscription**. Select Pay As You Go
191-
* **Resource Group**. Select the Resource Group for the Storage Account to which your Azure service will export logs, from where you want to ingest logs.
192-
* **Resource**. Select the Storage Account you configured, from where you want to ingest logs.
193182
* **System Topic Name**. Provide the topic name, if the system topic already exists then it will automatically select the existing topic.
194-
:::note
195-
If you do not see your configured Storage Account in the dropdown menu, make sure you met the requirements in [Requirements](#requirements) section.
196-
:::
197-
183+
198184
1. Specify the following details for Event Types:
199185

200-
* Uncheck the **Subscribe to all event types** box.
201-
* Select **Blob Created** from the **Define Event Types** dropdown.
186+
* Select **Blob Created** from the **Filter to Event Types** dropdown.
202187

203188
1. Specify the following details for Endpoint Types:
204189

205190
* **Endpoint Type**. Select **Event Hubs** from the dropdown.
206-
* **Endpoint.** Click on **Select an endpoint.**
191+
* **Endpoint.** Click on **Configure an endpoint.**
207192

208193
The Select Event Hub dialog appears.
209194

210195
![AzureBlob_SelectEventHub-EventGrid.png](/img/send-data/AzureBlob_SelectEventHub-EventGrid.png)
211196

212197
1. Specify the following Select Event Hub parameters, then click **Confirm Selection.**
213198

214-
* **Resource Group**. Select the resource group you created [Step 3](#step-3-enabling-vnet-integration-optional) in which all the resources created by ARM template are present.
199+
* **Resource Group**. Select the resource group you created [Step 3](#step-3-configure-azure-resources-using-arm-template) in which all the resources created by ARM template are present.
215200
* **Event Hub Namespace**. Select **SUMOBREventHubNamespace\<*unique string*\\>**.
216201
* **Event Hub**. Select **blobreadereventhub** from the dropdown.
217202

@@ -226,9 +211,9 @@ To create an event grid subscription, do the following:
226211

227212
1. Verify the deployment was successful by checking **Notifications** in the top right corner of the Azure Portal.
228213

229-
### Step 3: Enabling VNet Integration (Optional)
214+
## Enabling VNet Integration (Optional)
230215

231-
Assuming you have used the modified template which uses standard/premium plan for BlobTaskConsumer and [DLQTaskConsumer](https://portal.azure.com/#blade/WebsitesExtension/FunctionMenuBlade/resourceId/%2Fsubscriptions%2Fc088dc46-d692-42ad-a4b6-9a542d28ad2a%2FresourceGroups%2Fleast%2Fproviders%2FMicrosoft.Web%2Fsites%2FSUMOBRDLQProcessorekbxzlepnhs4g%2Ffunctions%2FDLQTaskConsumer) functions. This assumes that your storage account access is enabled for selected networks.
216+
This assumes that your storage account access is not public and is enabled for selected networks i.e. your storage account is behind a virtual network. This requires you to used the modified template which uses standard/premium plan for BlobTaskConsumer and DLQTaskConsumer functions. In case you want the whole data pipeline sending logs to sumo logic, to be under a virtual network follow the instruction [here](/docs/send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/full-vnet-integration.md).
232217

233218
1. Create a subnet in a virtual network using the instructions in the [doc](https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-manage-subnet#add-a-subnet). If you have multiple accounts in the same region you can skip step 2 below and use the same subnet and add it to the storage account as mentioned in step 3.
234219
1. Perform below steps for both BlobTaskConsumer and [DLQTaskConsumer](https://portal.azure.com/#blade/WebsitesExtension/FunctionMenuBlade/resourceId/%2Fsubscriptions%2Fc088dc46-d692-42ad-a4b6-9a542d28ad2a%2FresourceGroups%2Fleast%2Fproviders%2FMicrosoft.Web%2Fsites%2FSUMOBRDLQProcessorekbxzlepnhs4g%2Ffunctions%2FDLQTaskConsumer) function apps.
@@ -242,15 +227,10 @@ Assuming you have used the modified template which uses standard/premium plan fo
242227

243228
![azureblob-vnet](/img/send-data/azureblob-vnet.png)
244229

245-
1. Also copy the outbound ip addresses you’ll need to add it in firewall configuration of your storage account.
246-
247-
![azureblob-outboundip](/img/send-data/azureblob-outboundip.png)
248-
249230
1. Go to your storage account from where you want to collect logs from. Go to Networking and add the same Vnet and subnet.
250231

251232
![azureblob-storageacct](/img/send-data/azureblob-storageacct.png)
252233

253-
1. Add the outbound ip addresses (copied in step 2.d) from both BlobTaskConsumer and [DLQTaskConsumer](https://portal.azure.com/#blade/WebsitesExtension/FunctionMenuBlade/resourceId/%2Fsubscriptions%2Fc088dc46-d692-42ad-a4b6-9a542d28ad2a%2FresourceGroups%2Fleast%2Fproviders%2FMicrosoft.Web%2Fsites%2FSUMOBRDLQProcessorekbxzlepnhs4g%2Ffunctions%2FDLQTaskConsumer) functions under Firewall with each ip in a single row of Address range column.
254234
1. Verify by going to the subnet. You should see Subnet delegation and service endpoints as shown in the screenshot below.
255235

256236
![azureblob-subnet](/img/send-data/azureblob-subnet.png)
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
---
2+
id: full-vnet-integration
3+
title: Collect logs from Azure Blob Storage with full Virtual Network (VNet) Integration
4+
sidebar_label: Collect block blob with full Virtual Network integration
5+
description: Configure a pipeline to ship logs from the Azure Blob Storage throughout the Virtual Network and then to an HTTP source on a hosted collector in Sumo Logic.
6+
---
7+
8+
import useBaseUrl from '@docusaurus/useBaseUrl';
9+
10+
The current solution for ingesting block blob data from an Azure Storage Account into Sumo Logic sets up a pipeline that assumes public access is enabled on the storage account being monitored.
11+
If you prefer to restrict access and keep your storage account behind a firewall, refer to the instructions [here](/docs/send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/collect-logs/). However, if your security requirements demand that all Azure resources deployed via the ARM template, including the Storage Account, Event Hub, Azure Functions, and Service Bus, are fully integrated with a Virtual Network, follow the steps outlined below.
12+
13+
1. Download the ARM template [https://github.com/SumoLogic/sumologic-azure-function/blob/azure\_premium\_template\_vnet\_integration/BlockBlobReader/src/blobreaderdeploywithPremiumPlan.json](https://github.com/SumoLogic/sumologic-azure-function/blob/azure_premium_template_vnet_integration/BlockBlobReader/src/blobreaderdeploywithPremiumPlan.json) that provisions the required resources, including a premium-tier Service Bus.
14+
2. Create the following networking resources:
15+
* Virtual Network. For example, `brvnet`.
16+
:::note
17+
Only the Storage service endpoint associated with the functions and storage accounts is needed for the subnet.
18+
:::
19+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-vnet-creation.png')} alt="Virtual Network creation with storage service endpoint" width="800" />
20+
* Subnet. For example, `brsubnet`.
21+
* Network Security Group (NSG). For example, `brnsg`.
22+
:::note
23+
NSG rules remain as default; no changes required.
24+
:::
25+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-NSG-rules.png')} alt="NSG rules configuration" width="800" />
26+
3. Enable the Virtual Network integration on each function app by navigating to **Function App** > **Networking** > **Outbound Traffic Configuration**.
27+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-task-consumer-with-vnet-integration-outbound.png')} alt="TaskConsumer VNet integration outbound configuration" width="800" />
28+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-vnet-in-task-consumer.png')} alt="VNet integration in TaskConsumer" width="800" />
29+
4. Follow the steps below to restrict access to the Storage Account storing NSG flow logs, so that only certain networks can access it:
30+
1. Navigate to **Storage Account** > **Networking** > **Firewalls and virtual networks**.
31+
2. Choose the selected networks.
32+
3. Select the same subnet that was configured for **SUMOBRTaskConsumer** and **SUMOBRDLQProcessor** during Virtual Networ integration.
33+
:::note
34+
No IP address whitelisting is needed.
35+
:::
36+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-sa-flow-logs-networking.png')} alt="Storage account flow logs networking configuration" width="800" />
37+
5. Follow the steps below to restrict access to the ARM-created storage account, so that only certain networks can access it:
38+
1. Navigate to **Storage Account** > **Networking**.
39+
2. Choose the selected networks and allow access from your subnet.
40+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-arm-template-sa-networking.png')} alt="ARM template storage account networking configuration" width="800" />
41+
6. Configure the inbound restrictions on all three Azure Functions:
42+
1. Navigate to **Function App** > **Networking** > **Inbound Traffic Configuration** > **Access Restrictions**.
43+
2. Allow only the subnet you created in Step 2.
44+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-task-consumer-with-vnet-integration-inbound.png')} alt="TaskConsumer VNet integration inbound configuration" width="800" />
45+
7. For each function app, enable the function access to the Storage Account created by the ARM template by following the steps below:
46+
1. Navigate to **Function App** > **Networking** > **VNet Integration** > **Configuration Routing**.
47+
2. Select **Content storage**.
48+
3. Select **Outbound internet traffic** under **Application routing**.
49+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-function-networking-config.png')} alt="Function networking configuration" width="800" />
50+
4. Set `WEBSITE_CONTENTOVERVNET` to `1` in environment variables for each function.
51+
<img src={useBaseUrl('/img/send-data/blockblob/block-setting-env-variable-function.png')} alt="Setting environment variable in function" width="800" />
52+
8. Restrict access to **Service Bus** and **Event Hub** by following the steps below, so that only certain networks can access them:
53+
1. Navigate to **Service** > **Networking**.
54+
2. Set access to **Selected networks**, and select the previously created subnet in step 1.
55+
3. Set **Allow trusted Microsoft services to bypass this firewall** to **Yes**.
56+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-event-hub-networking.png')} alt="Event Hub networking configuration" width="800" />
57+
9. Secure the Event Grid with managed identity to allow Event Grid to publish to Event Hub:
58+
1. Enable **System assigned** identity on the Event Grid Topic.
59+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-system-assigned-identity-topic.png')} alt="System-assigned identity for topic" width="800" />
60+
2. Assign the identity to the Azure Event Hubs Data Sender role on the Event Hub namespace under **Access Control (IAM)** > **Role Assignments**.
61+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-event-hub-namespace-add-identity.png')} alt="Adding identity to Event Hub namespace" width="800" />
62+
3. Configure the Event Grid subscription that uses an **Event Hub** as an endpoint and choose **System Assigned** identity for authentication.
63+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-event-hub-subscription-identity.png')} alt="Event Hub subscription identity configuration" width="800" />
64+
10. Ensure your Virtual Network has service endpoints enabled for:
65+
- Storage
66+
- Service Bus
67+
- Event Hub
68+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-service-endpoint-enabling-vnet.png')} alt="Enabling service endpoints in VNet" width="800" />
69+
11. To validate the function execution, navigate to **Function App** > **BlobTaskConsumer** > **Monitoring** > **Invocations**.
70+
:::note
71+
You should see the invocation logs if everything is correctly configured.
72+
:::
73+
<img src={useBaseUrl('/img/send-data/blockblob/block-blob-validation.png')} alt="Block blob validation logs" width="800" />
74+
12. Replace the standard Service Bus with a premium tier.
75+
:::note
76+
The Service Bus provisioned via the current ARM template is configured with the standard tier, which does not support Virtual Network integration. To enable Virtual Network integration, it is recommended to create a new Service Bus with the premium tier.
77+
:::
78+
Follow the steps below to create a new Service Bus on the premium tier:
79+
1. Create a new premium Service Bus namespace:
80+
1. Use the same resource group and location as the old Service Bus.
81+
2. Enable partitioning.
82+
3. Initially allow public access (can restrict later).
83+
2. Create a new queue named `blobrangetaskqueue` with the following parameters:
84+
1. Maximum queue size: 40 GB
85+
2. Maximum message size: 1024 KB
86+
3. Maximum delivery count: 3
87+
4. Time to live: 14 days
88+
5. Message lock duration: 5 minutes
89+
6. Enable the dead letter queue.
90+
3. Update the connection strings in all three functions (Producer, Consumer, DLQ):
91+
Under **Shared access policies**, select the [RootManageSharedAccessKey](https://portal.azure.com/#) and copy the primary key from the newly created Service Bus on the premium tier as the value of `shared_access_key_value`:
92+
`Endpoint=sb://<servicebus_namespace_name>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<shared_access_key_value>`
93+
4. Restrict Public Access:
94+
1. Navigate to **Service Bus** > **Networking**.
95+
2. Set **Public** network access to **Selected** networks.
96+
3. Choose the subnet created earlier.
97+
98+
### References
99+
100+
- [https://learn.microsoft.com/en-us/azure/event-hubs/event-hubs-service-endpoints](https://learn.microsoft.com/en-us/azure/event-hubs/event-hubs-service-endpoints)
101+
- [https://learn.microsoft.com/en-us/azure/azure-functions/configure-networking-how-to?tabs=portal\#3-enable-application-and-configuration-routing](https://learn.microsoft.com/en-us/azure/azure-functions/configure-networking-how-to?tabs=portal#3-enable-application-and-configuration-routing)
102+
- [https://learn.microsoft.com/en-us/azure/app-service/configure-vnet-integration-routing\#content-share](https://learn.microsoft.com/en-us/azure/app-service/configure-vnet-integration-routing#content-share)
103+
- [https://learn.microsoft.com/en-us/azure/azure-functions/functions-app-settings\#website\_contentovervnet](https://learn.microsoft.com/en-us/azure/azure-functions/functions-app-settings#website_contentovervnet)

docs/send-data/collect-from-other-data-sources/azure-monitoring/arm-integration-faq.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,4 +371,10 @@ To filter events by container name, do the following:
371371
]
372372
}
373373
```
374+
* Error in initiation of Azure functions created by ARM template with error message
375+
```System.Private.CoreLib: Access to the path 'C:\home\site\wwwroot' is denied```
376+
377+
This will also result unauthorized error in error logs for azure function.
378+
Every azure function always has a storage account associated with it for dumping logs, trigger event , metadata etc. Our arm template also creates 3 azure function and a single storage account (lets call it sumoBRlogs storage account). When this storage account access is restricted (not public) then this problem occurs.
374379

380+
The solution is to do a virtual network (vnet) integration of azure function and allow the access to this virtual network to the sumoBRlogs storage account. Follow these [steps](/docs/send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/collect-logs/#enabling-vnet-integration-optional) to do a vnet integration. And set [this environment variable](https://learn.microsoft.com/en-us/azure/azure-functions/functions-app-settings#website_contentovervnet) to 1, in all the three azure function created by ARM template - Producer, consumer and DLQ.

sidebars.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,8 @@ module.exports = {
714714
collapsed: true,
715715
link: { type: 'doc', id: 'send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/index' },
716716
items: [
717-
'send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/collect-logs'
717+
'send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/collect-logs',
718+
'send-data/collect-from-other-data-sources/azure-blob-storage/block-blob/full-vnet-integration',
718719
],
719720
},
720721
{
244 KB
Loading
88.1 KB
Loading
412 KB
Loading
1.33 MB
Loading
769 KB
Loading
1.06 MB
Loading

0 commit comments

Comments
 (0)