From 1950078dbe2b933ce45ff369c882059132ff3e63 Mon Sep 17 00:00:00 2001 From: Mikhail Shilkov Date: Fri, 21 Feb 2020 16:35:00 +0100 Subject: [PATCH] Example with docker and ACI for C# and F# (#482) * Example with docker and ACI for C# and F# * Fix build errrors * EOL --- Examples.sln | 6 + azure-cs-botservice/Program.cs | 2 +- .../Azure.CosmosAppComponent.csproj | 3 +- azure-cs-cosmosapp-component/Containers.cs | 105 ++++++ azure-cs-cosmosapp-component/CosmosApp.cs | 24 +- azure-cs-cosmosapp-component/Program.cs | 2 + .../container/.dockerignore | 2 + .../container/Dockerfile | 6 + .../container/app/index.html | 33 ++ .../container/app/index.js | 37 ++ .../container/app/package.json | 13 + azure-fs-aci/.gitignore | 353 ++++++++++++++++++ azure-fs-aci/Azure.Aci.fsproj | 18 + azure-fs-aci/Program.fs | 61 +++ azure-fs-aci/Pulumi.yaml | 3 + azure-fs-aci/README.md | 72 ++++ azure-fs-aci/app/Dockerfile | 2 + azure-fs-aci/app/content/favicon.png | Bin 0 -> 13731 bytes azure-fs-aci/app/content/index.html | 7 + 19 files changed, 732 insertions(+), 17 deletions(-) create mode 100644 azure-cs-cosmosapp-component/Containers.cs create mode 100644 azure-cs-cosmosapp-component/container/.dockerignore create mode 100644 azure-cs-cosmosapp-component/container/Dockerfile create mode 100644 azure-cs-cosmosapp-component/container/app/index.html create mode 100644 azure-cs-cosmosapp-component/container/app/index.js create mode 100644 azure-cs-cosmosapp-component/container/app/package.json create mode 100644 azure-fs-aci/.gitignore create mode 100644 azure-fs-aci/Azure.Aci.fsproj create mode 100644 azure-fs-aci/Program.fs create mode 100644 azure-fs-aci/Pulumi.yaml create mode 100644 azure-fs-aci/README.md create mode 100644 azure-fs-aci/app/Dockerfile create mode 100644 azure-fs-aci/app/content/favicon.png create mode 100644 azure-fs-aci/app/content/index.html diff --git a/Examples.sln b/Examples.sln index 837f53dc2..362b26053 100644 --- a/Examples.sln +++ b/Examples.sln @@ -27,6 +27,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Digitalocean.LoadbalancedDr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Digitalocean.K8s", "digitalocean-cs-k8s\Digitalocean.K8s.csproj", "{CA1DB6A6-4B5D-41D7-AED6-43C096F5C7F4}" EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Azure.Aci", "azure-fs-aci\Azure.Aci.fsproj", "{9F646ECF-9CD3-4686-8C4C-FE6AAAD29FEC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -81,6 +83,10 @@ Global {CA1DB6A6-4B5D-41D7-AED6-43C096F5C7F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {CA1DB6A6-4B5D-41D7-AED6-43C096F5C7F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA1DB6A6-4B5D-41D7-AED6-43C096F5C7F4}.Release|Any CPU.Build.0 = Release|Any CPU + {9F646ECF-9CD3-4686-8C4C-FE6AAAD29FEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F646ECF-9CD3-4686-8C4C-FE6AAAD29FEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F646ECF-9CD3-4686-8C4C-FE6AAAD29FEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F646ECF-9CD3-4686-8C4C-FE6AAAD29FEC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/azure-cs-botservice/Program.cs b/azure-cs-botservice/Program.cs index 2544066c3..eae0fd624 100644 --- a/azure-cs-botservice/Program.cs +++ b/azure-cs-botservice/Program.cs @@ -57,7 +57,7 @@ static Task Main() Content = new FileArchive("bot/publish") }); - var codeBlobUrl = SharedAccessSignature.SignedBlobReadUrl(blob, storageAccount); + var codeBlobUrl = Storage.SharedAccessSignature.SignedBlobReadUrl(blob, storageAccount); var appInsights = new Insights("ai", new InsightsArgs { diff --git a/azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj b/azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj index 9415118b1..82bff69ec 100644 --- a/azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj +++ b/azure-cs-cosmosapp-component/Azure.CosmosAppComponent.csproj @@ -7,7 +7,8 @@ - + + diff --git a/azure-cs-cosmosapp-component/Containers.cs b/azure-cs-cosmosapp-component/Containers.cs new file mode 100644 index 000000000..725e556e4 --- /dev/null +++ b/azure-cs-cosmosapp-component/Containers.cs @@ -0,0 +1,105 @@ +// Copyright 2016-2018, Pulumi Corporation. All rights reserved. + +using System.Collections.Generic; + +using Pulumi; +using Pulumi.Azure.ContainerService; +using Pulumi.Azure.ContainerService.Inputs; +using Pulumi.Azure.Core; +using Pulumi.Docker; + +public static class Containers +{ + public static IDictionary Run() + { + // Read a list of target locations from the config file: + // Expecting a comma-separated list, e.g., "westus,eastus,westeurope" + var locations = new Pulumi.Config().Require("locations").Split(","); + + var resourceGroup = new ResourceGroup("cosmosaci-rg", new ResourceGroupArgs { Location = locations[0] }); + + var app = new CosmosApp("aci", new CosmosAppArgs + { + ResourceGroup = resourceGroup, + Locations = locations, + DatabaseName = "pricedb", + ContainerName = "prices", + Factory = global => + { + var registry = new Registry("global", new RegistryArgs + { + ResourceGroupName = resourceGroup.Name, + AdminEnabled = true, + Sku = "Premium", + }, global.Options); + + var dockerImage = new Image("node-app", new ImageArgs + { + ImageName = Output.Format($"{registry.LoginServer}/mynodeapp:v1.0.0"), + Build = "./container", + Registry = new ImageRegistry + { + Server = registry.LoginServer, + Username = registry.AdminUsername, + Password = registry.AdminPassword, + }, + }, new ComponentResourceOptions { Parent = registry }); + + return region => + { + var connectionString = global.CosmosAccount.ConnectionStrings.Apply(cs => cs[0]); + var group = new Group($"aci-{region.Location}", new GroupArgs + { + ResourceGroupName = resourceGroup.Name, + Location = region.Location, + ImageRegistryCredentials = + { + new GroupImageRegistryCredentialsArgs + { + Server = registry.LoginServer, + Username = registry.AdminUsername, + Password = registry.AdminPassword, + } + }, + OsType = "Linux", + Containers = + { + new GroupContainersArgs + { + Cpu = 0.5, + Image = dockerImage.ImageName, + Memory = 1.5, + Name = "hello-world", + Ports = + { + new GroupContainersPortsArgs + { + Port = 80, + Protocol = "TCP", + } + }, + EnvironmentVariables = + { + { "ENDPOINT", global.CosmosAccount.Endpoint }, + { "MASTER_KEY", global.CosmosAccount.PrimaryMasterKey }, + { "DATABASE", global.Database.Name }, + { "COLLECTION", global.Container.Name }, + { "LOCATION", region.Location }, + }, + }, + }, + IpAddressType = "public", + DnsNameLabel = $"acishop-{region.Location}", + }, global.Options); + + return new ExternalEndpoint(group.Fqdn); + }; + } + }); + + return new Dictionary + { + { "containersEndpoint", Output.Format($"{app.Endpoint}/cosmos") } + }; + } +} diff --git a/azure-cs-cosmosapp-component/CosmosApp.cs b/azure-cs-cosmosapp-component/CosmosApp.cs index 47383005e..d8a173921 100644 --- a/azure-cs-cosmosapp-component/CosmosApp.cs +++ b/azure-cs-cosmosapp-component/CosmosApp.cs @@ -137,24 +137,18 @@ public CosmosApp(string name, CosmosAppArgs args, ComponentResourceOptions? opti { ResourceGroupName = resourceGroup.Name, TrafficRoutingMethod = "Performance", - DnsConfigs = + DnsConfig = new TrafficManagerProfileDnsConfigArgs { - new TrafficManagerProfileDnsConfigsArgs - { - // Subdomain must be globally unique, so we default it with the full resource group name - RelativeName = Output.Format($"{name}{resourceGroup.Name}"), - Ttl = 60, - } + // Subdomain must be globally unique, so we default it with the full resource group name + RelativeName = Output.Format($"{name}{resourceGroup.Name}"), + Ttl = 60, }, - MonitorConfigs = + MonitorConfig = new TrafficManagerProfileMonitorConfigArgs { - new TrafficManagerProfileMonitorConfigsArgs - { - Protocol = "HTTP", - Port = 80, - Path = "/api/ping", - } - }, + Protocol = "HTTP", + Port = 80, + Path = "/api/ping", + } }, parentOptions); diff --git a/azure-cs-cosmosapp-component/Program.cs b/azure-cs-cosmosapp-component/Program.cs index 44e44281a..f1e428ea5 100644 --- a/azure-cs-cosmosapp-component/Program.cs +++ b/azure-cs-cosmosapp-component/Program.cs @@ -12,10 +12,12 @@ static Task Main() return Deployment.RunAsync(() => { var functions = Functions.Run(); + var containers = Containers.Run(); var vmss = VmScaleSets.Run(); return new Dictionary { { "functionsEndpoint", functions["functionsEndpoint"] }, + { "containersEndpoint", containers["containersEndpoint"] }, { "vmssEndpoint", vmss["vmssEndpoint"] }, }; }); diff --git a/azure-cs-cosmosapp-component/container/.dockerignore b/azure-cs-cosmosapp-component/container/.dockerignore new file mode 100644 index 000000000..93f136199 --- /dev/null +++ b/azure-cs-cosmosapp-component/container/.dockerignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log diff --git a/azure-cs-cosmosapp-component/container/Dockerfile b/azure-cs-cosmosapp-component/container/Dockerfile new file mode 100644 index 000000000..53bbea666 --- /dev/null +++ b/azure-cs-cosmosapp-component/container/Dockerfile @@ -0,0 +1,6 @@ +FROM node:8.9.3-alpine +RUN mkdir -p /usr/src/app +COPY ./app/* /usr/src/app/ +WORKDIR /usr/src/app +RUN npm install +CMD node /usr/src/app/index.js diff --git a/azure-cs-cosmosapp-component/container/app/index.html b/azure-cs-cosmosapp-component/container/app/index.html new file mode 100644 index 000000000..d0327a673 --- /dev/null +++ b/azure-cs-cosmosapp-component/container/app/index.html @@ -0,0 +1,33 @@ + + + YEAH Welcome to Azure Container Instances! + + + + + +
+

Welcome to Azure Container Instances!

+ + + ContainerInstances_rgb_UI + + + + + + + + + + +
+ + + diff --git a/azure-cs-cosmosapp-component/container/app/index.js b/azure-cs-cosmosapp-component/container/app/index.js new file mode 100644 index 000000000..974313416 --- /dev/null +++ b/azure-cs-cosmosapp-component/container/app/index.js @@ -0,0 +1,37 @@ +const express = require('express'); +const morgan = require('morgan'); +const cosmos = require('@azure/cosmos'); + +const app = express(); +app.use(morgan('combined')); + + +app.get('/', (req, res) => { + res.sendFile(__dirname + '/index.html') +}); + +app.get('/cosmos', async (req, res) => { + const endpoint = process.env.ENDPOINT; + const key = process.env.MASTER_KEY; + const database = process.env.DATABASE; + const collection = process.env.COLLECTION; + const location = process.env.LOCATION; + + const client = new cosmos.CosmosClient({ endpoint, key, connectionPolicy: { preferredLocations: [location] } }); + const container = client.database(database).container(collection); + const response = await container.item("test", undefined).read(); + + if (response.resource && response.resource.url) { + res.send(response.resource.url); + } else { + res.status(404).end(); + } +}); + +app.get('/api/ping', (req, res) => { + res.send('Ack') +}); + +var listener = app.listen(process.env.PORT || 80, function() { + console.log('listening on port ' + listener.address().port); +}); diff --git a/azure-cs-cosmosapp-component/container/app/package.json b/azure-cs-cosmosapp-component/container/app/package.json new file mode 100644 index 000000000..98393f65a --- /dev/null +++ b/azure-cs-cosmosapp-component/container/app/package.json @@ -0,0 +1,13 @@ +{ + "name": "aci-helloworld", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "@azure/cosmos": "^3.1.1", + "express": "^4.14.0", + "morgan": "^1.8.2" + }, + "devDependencies": {}, + "author": "" +} diff --git a/azure-fs-aci/.gitignore b/azure-fs-aci/.gitignore new file mode 100644 index 000000000..e64527066 --- /dev/null +++ b/azure-fs-aci/.gitignore @@ -0,0 +1,353 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ diff --git a/azure-fs-aci/Azure.Aci.fsproj b/azure-fs-aci/Azure.Aci.fsproj new file mode 100644 index 000000000..60ad319ce --- /dev/null +++ b/azure-fs-aci/Azure.Aci.fsproj @@ -0,0 +1,18 @@ + + + + Exe + netcoreapp3.0 + + + + + + + + + + + + + diff --git a/azure-fs-aci/Program.fs b/azure-fs-aci/Program.fs new file mode 100644 index 000000000..c00767fd6 --- /dev/null +++ b/azure-fs-aci/Program.fs @@ -0,0 +1,61 @@ +module Program + +open Pulumi +open Pulumi.FSharp +open Pulumi.Azure.ContainerService +open Pulumi.Azure.ContainerService.Inputs +open Pulumi.Azure.Core +open Pulumi.Docker + +[] +module Helpers = + let inputLeft<'a, 'b>(v: 'a) : InputUnion<'a, 'b> = InputUnion.op_Implicit v + +let infra () = + let resourceGroup = ResourceGroup "aci-rg" + + let registry = + Registry("registry", + RegistryArgs + (ResourceGroupName = io resourceGroup.Name, + AdminEnabled = input true, + Sku = input "Premium")) + + let imageName = registry.LoginServer |> Outputs.apply(fun v -> v + "/mynodeapp:v1.0.0") |> io + let dockerImage = + Image("node-app", + ImageArgs + (ImageName = imageName, + Build = inputLeft "./app", + Registry = input( + ImageRegistry + (Server = io registry.LoginServer, + Username = io registry.AdminUsername, + Password = io registry.AdminPassword)))) + + let group = + Group("aci", + GroupArgs + (ResourceGroupName = io resourceGroup.Name, + ImageRegistryCredentials = inputList [input + (GroupImageRegistryCredentialsArgs + (Server = io registry.LoginServer, + Username = io registry.AdminUsername, + Password = io registry.AdminPassword))], + OsType = input "Linux", + Containers = inputList [input + (GroupContainersArgs + (Cpu = input 0.5, + Image = io dockerImage.ImageName, + Memory = input 1.5, + Name = input "hello-world", + Ports = inputList [input (GroupContainersPortsArgs(Port = input 80, Protocol = input "TCP"))] + ))], + IpAddressType = input "public", + DnsNameLabel = input "acifsharp")) + + dict [("endpoint", group.Fqdn :> obj)] + +[] +let main _ = + Deployment.run infra diff --git a/azure-fs-aci/Pulumi.yaml b/azure-fs-aci/Pulumi.yaml new file mode 100644 index 000000000..04aff9767 --- /dev/null +++ b/azure-fs-aci/Pulumi.yaml @@ -0,0 +1,3 @@ +name: azure-fs-aci +description: Deploys a docker container to Azure Container Instances +runtime: dotnet diff --git a/azure-fs-aci/README.md b/azure-fs-aci/README.md new file mode 100644 index 000000000..87b2529ac --- /dev/null +++ b/azure-fs-aci/README.md @@ -0,0 +1,72 @@ +[![Deploy](https://get.pulumi.com/new/button.svg)](https://app.pulumi.com/new) + +# Custom Docker Image running in Azure Container Instances + +Starting point for building web application hosted in Azure Container Instances. + +## Deploying the App + +To deploy your infrastructure, follow the below steps. + +### Prerequisites + +1. [Install Pulumi](https://www.pulumi.com/docs/get-started/install/) +2. [Install .NET Core 3.0+](https://dotnet.microsoft.com/download) + +### Steps + +1. Create a new stack: + + ``` + $ pulumi stack init dev + ``` + +1. Login to Azure CLI (you will be prompted to do this during deployment if you forget this step): + + ``` + $ az login + ``` + +1. Configure the location to deploy the resources to: + + ``` + $ pulumi config set azure:location + ``` + +1. Run `pulumi up` to preview and deploy changes: + + ``` + $ pulumi up + Previewing changes: + ... + + Performing changes: + ... + info: 55 changes performed: + + 10 resources created + Update duration: 1m56s + ``` + +1. Check the deployed container endpoint: + + ``` + $ pulumi stack output endpoint + https://acifsharp.westeurope.azurecontainer.io + $ curl "$(pulumi stack output endpoint)" + + + Hello, Pulumi! + +

Hello, containers!

+

Made with ❤️ with Pulumi

+ + ``` + +6. From there, feel free to experiment. Simply making edits and running `pulumi up` will incrementally update your stack. + +7. Once you've finished experimenting, tear down your stack's resources by destroying and removing it: + + ```bash + $ pulumi destroy --yes + $ pulumi stack rm --yes + ``` diff --git a/azure-fs-aci/app/Dockerfile b/azure-fs-aci/app/Dockerfile new file mode 100644 index 000000000..4f9d60fb7 --- /dev/null +++ b/azure-fs-aci/app/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx +COPY content /usr/share/nginx/html diff --git a/azure-fs-aci/app/content/favicon.png b/azure-fs-aci/app/content/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4baeb6fd3df3a99e06099e7a94b2715eaad419 GIT binary patch literal 13731 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 literal 0 HcmV?d00001 diff --git a/azure-fs-aci/app/content/index.html b/azure-fs-aci/app/content/index.html new file mode 100644 index 000000000..15bfc0d4f --- /dev/null +++ b/azure-fs-aci/app/content/index.html @@ -0,0 +1,7 @@ + + + Hello, Pulumi! + +

Hello, containers!

+

Made with ❤️ with Pulumi

+