Generate Signed S3 URL in F#
If you have a single page application, you may be wanting to upload files directly to S3 from the browser rather than using your own server side application as a middle man between the two.
In F# this can be done with the Amazon S3 package
Via dotnet cli:
dotnet add package AWSSDK.S3 --version CURRENT_VERSION
paket add AWSSDK.S3 --version CURRENT_VERSION
Once the library is installed, we can make a function that handles generating the presigned URL. This function needs access to your AWS public and private keys for credentials, your bucket and region, as well as the key of your object being uploaded. All of the variables should be environment variables, except the object key, which the function takes as an argument.
let generateS3PresignedUrl key = let credentials = BasicAWSCredentials(awsAccessKey, awsSecretKey) let client = new AmazonS3Client(credentials, awsRegion) let request = GetPreSignedUrlRequest() request.BucketName <- bucketName request.Key <- key |> string request.ContentType <- "content/type/here" request.Expires <- DateTime.Now.AddMinutes 1 request.Parameters[ "cache-control" ] <- System.Web.HttpUtility.UrlEncode "max-age=MAX_AGE_HERE;" request.Parameters[ "amz-acl" ] <- "ACL HERE" request.Verb <- HttpVerb.PUT client.GetPreSignedURL(request)