F# Blob Bindings with Azure Functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"bindings": [ | |
{ | |
"name": "inputBlob", | |
"type": "blobTrigger", | |
"direction": "in", | |
"path": "samples-workitems/input/{name}", | |
"connection": "AzureWebJobsDashboard" | |
}, | |
{ | |
"type": "blob", | |
"name": "output1", | |
"path": "samples-workitems/output1/{name}", | |
"connection": "AzureWebJobsDashboard", | |
"direction": "out" | |
}, | |
{ | |
"type": "blob", | |
"name": "output2", | |
"path": "samples-workitems/output2/{name}", | |
"connection": "AzureWebJobsDashboard", | |
"direction": "out" | |
}, | |
{ | |
"type": "blob", | |
"name": "output3", | |
"path": "samples-workitems/output3/{name}", | |
"connection": "AzureWebJobsDashboard", | |
"direction": "out" | |
}, | |
{ | |
"type": "blob", | |
"name": "output4", | |
"path": "samples-workitems/output4/{name}", | |
"connection": "AzureWebJobsDashboard", | |
"direction": "inout" | |
}, | |
{ | |
"type": "blob", | |
"name": "$return", | |
"path": "samples-workitems/output5/{name}", | |
"connection": "AzureWebJobsDashboard", | |
"direction": "out" | |
} | |
], | |
"disabled": false | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#r "Microsoft.WindowsAzure.Storage" | |
open System | |
open System.Configuration | |
open System.Text | |
open Microsoft.WindowsAzure.Storage | |
open Microsoft.WindowsAzure.Storage.Blob | |
// Note: Can't bind Blobs to pocos (in or out) at the moment Trigger to type 'Run+Person | |
// https://github.com/Azure/azure-webjobs-sdk/issues/901 | |
[<CLIMutable>] | |
type Person = { First:string; Last:string } | |
let GetBlob (storageAcc:string) containerName blobName = | |
let connString = ConfigurationManager.AppSettings.[storageAcc] | |
let storageAccount = CloudStorageAccount.Parse(connString) | |
let blobClient = storageAccount.CreateCloudBlobClient() | |
let container = blobClient.GetContainerReference(containerName) | |
container.GetBlockBlobReference(blobName) | |
let Run(inputBlob: Stream, | |
name: string, | |
log: TraceWriter, | |
output1: byref<string>, | |
output2: TextWriter, | |
output3: Stream, | |
output4: ICloudBlob) = | |
let message = sprintf "Got blob \n FileName: %s \n Length: %d " name inputBlob.Length | |
log.Verbose(message) | |
// output1: string | |
output1 <- message | |
// output2: TextWriter | |
output2.WriteLine("Hello") | |
output2.WriteLine("World") | |
// output3: Stream | |
let bytes = Encoding.UTF8.GetBytes("Using CloudBlockBlob directly") | |
output3.Write(bytes, 0, bytes.Length) | |
// output4: binding to ICloudBlob (could also be CloudBlockBlob) | |
// have to edit function.json and set direction to "inout" for it to work | |
output4.Metadata.["From"] <- "Mark Heath" | |
output4.SetMetadata(); | |
let bytes = Encoding.UTF8.GetBytes("inout binding to ICloudBlob") | |
output4.UploadFromByteArrayAsync(bytes, 0, bytes.Length).Wait() | |
// write directly with blob storage without using an output binding | |
let cloudBlockBlob = GetBlob "AzureWebJobsDashboard" "samples-workitems" "outputdirect/test.txt" | |
let bytes2 = Encoding.UTF8.GetBytes("Using CloudBlockBlob directly") | |
log.Verbose("uploading text...") | |
cloudBlockBlob.UploadFromByteArrayAsync(bytes2, 0, bytes2.Length).Wait() | |
log.Verbose("text uploaded") | |
cloudBlockBlob.Metadata.["From"] <- "Mark Heath" | |
cloudBlockBlob.SetMetadata(); | |
log.Verbose("metadata set") | |
// output5 is $return, so let's return a string | |
"Returning via $return" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment