public static Output <string> SignedBlobReadUrl(ZipBlob blob, Account account) { return(Output .All <string>(account.Name, account.PrimaryConnectionString, blob.StorageContainerName, blob.Name) .Apply(async values => { var sas = await DataSource.GetAccountBlobContainerSAS( new GetAccountBlobContainerSASArgs { ConnectionString = values[1], ContainerName = values[2], Start = "2019-01-01", Expiry = "2100-01-01", Permissions = new GetAccountBlobContainerSASPermissions { Read = true, Write = false, Delete = false, List = false, Add = false, Create = false, }, } ); return $"https://{values[0]}.blob.core.windows.net/{values[2]}/{values[3]}{sas}"; })); }
public MyStack() { var resourceGroup = new Azure.Core.ResourceGroup(Settings.ResourceGroupName); var storageAccount = new Azure.Storage.Account(Settings.StorageAccountName, new Azure.Storage.AccountArgs { ResourceGroupName = resourceGroup.Name, AccountReplicationType = "LRS", AccountTier = "Standard" }); var plan = new Azure.AppService.Plan(Settings.ConsumptionPlanName, new Azure.AppService.PlanArgs { ResourceGroupName = resourceGroup.Name, Kind = "FunctionApp", Sku = new Azure.AppService.Inputs.PlanSkuArgs { Tier = "Dynamic", Size = "Y1" } }); var container = new Azure.Storage.Container(Settings.ZipsContainerName, new Azure.Storage.ContainerArgs { StorageAccountName = storageAccount.Name, ContainerAccessType = "private" }); var blob = new Azure.Storage.ZipBlob(Settings.ZipBlobName, new Azure.Storage.ZipBlobArgs { StorageAccountName = storageAccount.Name, StorageContainerName = container.Name, Type = "block", Content = new FileArchive("./functions") }); var codeBlobUrl = Azure.Storage.SharedAccessSignature.SignedBlobReadUrl(blob, storageAccount); var app = new Azure.AppService.FunctionApp(Settings.FunctionAppName, new Azure.AppService.FunctionAppArgs { ResourceGroupName = resourceGroup.Name, AppServicePlanId = plan.Id, StorageConnectionString = storageAccount.PrimaryConnectionString, Version = "~2", AppSettings = { { "FUNCTIONS_WORKER_RUNTIME", "node" }, { "WEBSITE_NODE_DEFAULT_VERSION", "10.14.1" }, { "WEBSITE_RUN_FROM_PACKAGE", codeBlobUrl } } }); this.Endpoint = Output.Format($"https://{app.DefaultHostname}/api/hello"); }
static Task <int> Main(string[] args) { return(Deployment.RunAsync(() => { var config = new Config(); var botName = config.Require("botName"); var resourceGroup = new ResourceGroup("botservice-rg"); var storageAccount = new Storage.Account("sa", new Storage.AccountArgs { ResourceGroupName = resourceGroup.Name, AccountReplicationType = "LRS", AccountTier = "Standard" }); var appServicePlan = new Plan("asp", new PlanArgs { ResourceGroupName = resourceGroup.Name, Kind = "App", Sku = new PlanSkuArgs { Tier = "Basic", Size = "B1" }, }); var container = new Storage.Container("zips", new Storage.ContainerArgs { StorageAccountName = storageAccount.Name, ContainerAccessType = "private", }); var blob = new Storage.ZipBlob("zip", new Storage.ZipBlobArgs { StorageAccountName = storageAccount.Name, StorageContainerName = container.Name, Type = "block", Content = new FileArchive("bot/publish") }); var codeBlobUrl = SharedAccessSignature.SignedBlobReadUrl(blob, storageAccount); var appInsights = new Insights("ai", new InsightsArgs { ApplicationType = "web", ResourceGroupName = resourceGroup.Name }); var appInsightApiKey = new ApiKey("ai", new ApiKeyArgs { ApplicationInsightsId = appInsights.Id, ReadPermissions = "api", }); var luis = new Cognitive.Account("cs", new Cognitive.AccountArgs { Kind = "CognitiveServices", // includes LUIS ResourceGroupName = resourceGroup.Name, Sku = new AccountSkuArgs { Name = "S0", Tier = "Standard" } }); var msa = new Application("msapp", new ApplicationArgs { Oauth2AllowImplicitFlow = false, AvailableToOtherTenants = true, PublicClient = true }); var pwd = new RandomPassword("password", new RandomPasswordArgs { Length = 16, MinNumeric = 1, MinSpecial = 1, MinUpper = 1, MinLower = 1 }); var msaSecret = new ApplicationPassword("msasecret", new ApplicationPasswordArgs { ApplicationObjectId = msa.ObjectId, EndDateRelative = "8640h", Value = pwd.Result }); var app = new AppService("app", new AppServiceArgs { ResourceGroupName = resourceGroup.Name, AppServicePlanId = appServicePlan.Id, AppSettings = { { "WEBSITE_RUN_FROM_PACKAGE", codeBlobUrl }, { "MicrosoftAppId", msa.ApplicationId }, { "MicrosoftAppPassword", msaSecret.Value }, { "LuisApiKey", luis.PrimaryAccessKey }, }, HttpsOnly = true }); var bot = new WebApp(botName, new WebAppArgs { DisplayName = botName, MicrosoftAppId = msa.ApplicationId, ResourceGroupName = resourceGroup.Name, Sku = "F0", Location = "global", Endpoint = Output.Format($"https://{app.DefaultSiteHostname}/api/messages"), DeveloperAppInsightsApiKey = appInsightApiKey.Key, DeveloperAppInsightsApplicationId = appInsights.AppId, DeveloperAppInsightsKey = appInsights.InstrumentationKey }); return new Dictionary <string, object> { { "Bot Endpoint", bot.Endpoint }, { "MicrosoftAppId", msa.ApplicationId }, { "MicrosoftAppPassword", msaSecret.Value } }; })); }