How to build a Good Vibes generator for Microsoft Teams

Published Mar 27 2022 01:31 PM 1,751 Views

Good Vibes Generator overviewGood Vibes Generator overview

Idea

 

A Microsoft Teams bot

We want Good Vibes. The world is a tough place to be and we all can use some positive affirmations and a little pep talk. Wouldn't it be awesome if these get straight into Microsoft Teams?

 

Good Vibes Generator in TeamsGood Vibes Generator in Teams

 

So what we need is a nice pile of messages to send, but that would get pretty boring very soon if there is not a lot of variety. So we decided to split our messages into four pieces:

The general construct of a Good Vibe is made up of 4 phrases put together. This roughly equates to:

  • Phrase 1 - Greeting e.g. "Hey!" or "Listen Up:"
  • Phrase 2 - Address a personal trait or object e.g. "your hair" or "your personality"
  • Phrase 3 - Compliment e.g. "is awesome,", "absolutely rules the world,". Typically this phrase ends with a comma to help the vibe flow better
  • Phrase 4 - End the vibe e.g. "and that's a fact." or "for reals."

and then create a Good Vibe by randomly stitching these parts together. This means, that we can have a way more unique messages and no two people see the same message at the same time.

 

Key design goals

Before we started, we had some clear design goals to keep in mind:

  • Secret-less - Where possible, do not use secrets. Secrets are a pain to manage (expiry, rotation) and something you need to keep safe
  • Server-less - We wanted to build an application that scales (cost wise) with usage. If you don't use it often, it doesn't cost you much
  • Open source - We believe in open source solutions and wanted to provide something that can be updated, improved and loved by the community

Let's build it in Azure

 

Managed Identities

We love Azure Managed Identities ❤. They are the state-of-the-art way to handle authentication for Azure resources. Managed Identities give your app an identity, which means that you don't need to register an application in Azure Active Directory (or other authentication methods) and then have hassle with managing/rotating secrets or signing certificates. Managed Identities come in two flavours:

  • System-assigned Managed Identity, which is tied to the lifecycle of another Azure resource and can't be used for any other resource
  • User-assigned Managed Identity, which is an Azure resource just on its own and can be used with several other resources

In our solution, we unfortunately need both, as there is some inconsistencies with which resources support which Managed Identity type.

 

Key Vault

Although our aim is to be secret-less with Managed Identities for authentication, we still need to hold some information that we would prefer not stored in plain text. For example, the Cosmos DB URI. This is where Key Vault comes in to store these. However, we are also using a Managed Identity to access Key Vault, which satisfies our goal of being secret-less.

 

Cosmos DB

We use Cosmos DB to store all phrases and conversation references so that they can be picked up by the Azure Function and know what to say to whom. This was a logical choice, as Cosmos is cheap, serverless, schema-less and easy to use.

 

Azure Functions

Azure Functions are used to run the application logic. There are 6 function that make up the app:

  • messages - A listener for the bot. It responds to someone messaging the bot with a Good Vibe and also a welcome message on first run
  • sendGoodVibes - A timer based trigger function that starts the goodVibesOrchestrator function
  • goodVibesOrchestrator - An orchestrator function that handles the sending of good vibes to users
  • getConversations - An activity function that retrieves all previous conversation references with the bot
  • getGoodVibe - An activity function that generates a Good Vibe for each conversation reference
  • sendGoodVibeToConversation - An activity function that sends a Good Vibe to an individual conversation reference

A conversation reference is a description of a conversation between a Teams user and a bot. It is used for sending a message to a user pro-actively

 

Storage Account

A Storage Account is required to allow the (durable) Azure Functions to run correctly. In addition, the zipped function app package that the Azure Functions runs from is stored in the Storage Account.

 

Bot

A Bot handles the connection between Teams and Azure Functions. When a user messages the Bot, it forwards this on to our Azure functions.

 

Adaptive Cards

We created two Adaptive Cards:

  • WelcomeCard, which is sent on first run to greet the user and introduce what the Good Vibes generator is about
  • GoodVibeCard, which contains a Good Vibe

which are both sent via the sendGoodVibesToConversation Azure function.

Adaptive Cards make it super easy to have a nice looking message in Teams while we don't need to worry about the UI at all. They just render beautifully and fully adapt the look and feel of Teams, theme included.

 

Make it deployable

As we believe, that really everyone deserves Good Vibes, this is an open-source project - which you can deploy into your tenant. If interested, head over to our Deployment Guide. We provide you with instructions and all files you need. It's super easy to get started!

 

ARM template, but as :flexed_biceps:

We don't want you to give you a lengthy README file which guides you to click your way through the Azure portal to rebuild what we built, which is why we created deployment files for you. And as we wanted to use what the kool kids do, we used .bicep :flexed_biceps: as our language to describe the infrastructure that needs to be created.

 

Zip file

Once the deployment in Azure has completed, the other step is to upload the zipped function app package in to Azure Functions. The zipped function app package is a pre-built package with the code transpiled and all dependencies installed. This helps speed up cold start times in Azure Functions.

 

Deployment script

The included PowerShell script will prompt you to provide your preferred Azure region, your subscription ID and a resource prefix name. It will then deploy the bicep file and zipped function app package into your tenant. We've written the script for it to be run from Azure Cloud Shell, so no modules on your local machine are required.

 

Teams app package

We have provided a Teams app package template allowing you to install the app as a personal app in Teams.

 

Conclusion

So, there you have it. A Teams app for your users in your organisation to receive positive (and sometimes funny) messages. We can't wait to see what Good Vibes you get sent!

 

Resources

%3CLINGO-SUB%20id%3D%22lingo-sub-3268169%22%20slang%3D%22en-US%22%3EHow%20to%20build%20a%20Good%20Vibes%20generator%20for%20Microsoft%20Teams%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3268169%22%20slang%3D%22en-US%22%3E%3CARTICLE%20class%3D%22markdown-body%20entry-content%20container-lg%22%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22Good%20Vibes%20Generator%20overview%22%20style%3D%22width%3A%20999px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F358873i8BA868E3FE196E6A%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22overview.drawio.png%22%20alt%3D%22Good%20Vibes%20Generator%20overview%22%20%2F%3E%3CSPAN%20class%3D%22lia-inline-image-caption%22%20onclick%3D%22event.preventDefault()%3B%22%3EGood%20Vibes%20Generator%20overview%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId-392950739%22%20id%3D%22toc-hId-418578748%22%3E%3CA%20id%3D%22user-content-idea%22%20class%3D%22anchor%22%20href%3D%22%23idea%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EIdea%3C%2FH2%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-1083512213%22%20id%3D%22toc-hId-1109140222%22%3E%3CA%20id%3D%22user-content-a-microsoft-teams-bot%22%20class%3D%22anchor%22%20href%3D%22%23a-microsoft-teams-bot%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EA%20Microsoft%20Teams%20bot%3C%2FH3%3E%0A%3CP%3EWe%20want%20Good%20Vibes.%20The%20world%20is%20a%20tough%20place%20to%20be%20and%20we%20all%20can%20use%20some%20positive%20affirmations%20and%20a%20little%20pep%20talk.%20Wouldn't%20it%20be%20awesome%20if%20these%20get%20straight%20into%20Microsoft%20Teams%3F%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22Good%20Vibes%20Generator%20in%20Teams%22%20style%3D%22width%3A%20999px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F358874iB15CDB40213D7D75%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22ExampleTeamsConversation.png%22%20alt%3D%22Good%20Vibes%20Generator%20in%20Teams%22%20%2F%3E%3CSPAN%20class%3D%22lia-inline-image-caption%22%20onclick%3D%22event.preventDefault()%3B%22%3EGood%20Vibes%20Generator%20in%20Teams%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3ESo%20what%20we%20need%20is%20a%20nice%20pile%20of%20messages%20to%20send%2C%20but%20that%20would%20get%20pretty%20boring%20very%20soon%20if%20there%20is%20not%20a%20lot%20of%20variety.%20So%20we%20decided%20to%20split%20our%20messages%20into%20four%20pieces%3A%3C%2FP%3E%0A%3CBLOCKQUOTE%3E%0A%3CP%3EThe%20general%20construct%20of%20a%20Good%20Vibe%20is%20made%20up%20of%204%20phrases%20put%20together.%20This%20roughly%20equates%20to%3A%3C%2FP%3E%0A%3CUL%20dir%3D%22auto%22%3E%0A%3CLI%3EPhrase%201%20-%20Greeting%20e.g.%20%22Hey!%22%20or%20%22Listen%20Up%3A%22%3C%2FLI%3E%0A%3CLI%3EPhrase%202%20-%20Address%20a%20personal%20trait%20or%20object%20e.g.%20%22your%20hair%22%20or%20%22your%20personality%22%3C%2FLI%3E%0A%3CLI%3EPhrase%203%20-%20Compliment%20e.g.%20%22is%20awesome%2C%22%2C%20%22absolutely%20rules%20the%20world%2C%22.%20Typically%20this%20phrase%20ends%20with%20a%20comma%20to%20help%20the%20vibe%20flow%20better%3C%2FLI%3E%0A%3CLI%3EPhrase%204%20-%20End%20the%20vibe%20e.g.%20%22and%20that's%20a%20fact.%22%20or%20%22for%20reals.%22%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3C%2FBLOCKQUOTE%3E%0A%3CP%3Eand%20then%20create%20a%20Good%20Vibe%20by%20randomly%20stitching%20these%20parts%20together.%20This%20means%2C%20that%20we%20can%20have%20a%20way%20more%20unique%20messages%20and%20no%20two%20people%20see%20the%20same%20message%20at%20the%20same%20time.%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--723942250%22%20id%3D%22toc-hId--698314241%22%3E%3CA%20id%3D%22user-content-key-design-goals%22%20class%3D%22anchor%22%20href%3D%22%23key-design-goals%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EKey%20design%20goals%3C%2FH3%3E%0A%3CP%3EBefore%20we%20started%2C%20we%20had%20some%20clear%20design%20goals%20to%20keep%20in%20mind%3A%3C%2FP%3E%0A%3CUL%20dir%3D%22auto%22%3E%0A%3CLI%3ESecret-less%20-%20Where%20possible%2C%20do%20not%20use%20secrets.%20Secrets%20are%20a%20pain%20to%20manage%20(expiry%2C%20rotation)%20and%20something%20you%20need%20to%20keep%20safe%3C%2FLI%3E%0A%3CLI%3EServer-less%20-%20We%20wanted%20to%20build%20an%20application%20that%20scales%20(cost%20wise)%20with%20usage.%20If%20you%20don't%20use%20it%20often%2C%20it%20doesn't%20cost%20you%20much%3C%2FLI%3E%0A%3CLI%3EOpen%20source%20-%20We%20believe%20in%20open%20source%20solutions%20and%20wanted%20to%20provide%20something%20that%20can%20be%20updated%2C%20improved%20and%20loved%20by%20the%20community%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId--734445354%22%20id%3D%22toc-hId--708817345%22%3E%3CA%20id%3D%22user-content-lets-build-it-in-azure%22%20class%3D%22anchor%22%20href%3D%22%23lets-build-it-in-azure%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3ELet's%20build%20it%20in%20Azure%3C%2FH2%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--43883880%22%20id%3D%22toc-hId--18255871%22%3E%3CA%20id%3D%22user-content-managed-identities%22%20class%3D%22anchor%22%20href%3D%22%23managed-identities%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EManaged%20Identities%3C%2FH3%3E%0A%3CP%3EWe%20love%20Azure%20Managed%20Identities%20%E2%9D%A4.%20They%20are%20the%20state-of-the-art%20way%20to%20handle%20authentication%20for%20Azure%20resources.%20Managed%20Identities%20give%20your%20app%20an%20identity%2C%20which%20means%20that%20you%20don't%20need%20to%20register%20an%20application%20in%20Azure%20Active%20Directory%20(or%20other%20authentication%20methods)%20and%20then%20have%20hassle%20with%20managing%2Frotating%20secrets%20or%20signing%20certificates.%20Managed%20Identities%20come%20in%20two%20flavours%3A%3C%2FP%3E%0A%3CUL%20dir%3D%22auto%22%3E%0A%3CLI%3ESystem-assigned%20Managed%20Identity%2C%20which%20is%20tied%20to%20the%20lifecycle%20of%20another%20Azure%20resource%20and%20can't%20be%20used%20for%20any%20other%20resource%3C%2FLI%3E%0A%3CLI%3EUser-assigned%20Managed%20Identity%2C%20which%20is%20an%20Azure%20resource%20just%20on%20its%20own%20and%20can%20be%20used%20with%20several%20other%20resources%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3EIn%20our%20solution%2C%20we%20unfortunately%20need%20both%2C%20as%20there%20is%20some%20inconsistencies%20with%20which%20resources%20support%20which%20Managed%20Identity%20type.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--1851338343%22%20id%3D%22toc-hId--1825710334%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-636174490%22%20id%3D%22toc-hId-661802499%22%3E%3CA%20id%3D%22user-content-key-vault%22%20class%3D%22anchor%22%20href%3D%22%23key-vault%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EKey%20Vault%3C%2FH3%3E%0A%3CP%3EAlthough%20our%20aim%20is%20to%20be%20secret-less%20with%20Managed%20Identities%20for%20authentication%2C%20we%20still%20need%20to%20hold%20some%20information%20that%20we%20would%20prefer%20not%20stored%20in%20plain%20text.%20For%20example%2C%20the%20Cosmos%20DB%20URI.%20This%20is%20where%20Key%20Vault%20comes%20in%20to%20store%20these.%20However%2C%20we%20are%20also%20using%20a%20Managed%20Identity%20to%20access%20Key%20Vault%2C%20which%20satisfies%20our%20goal%20of%20being%20secret-less.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--1171279973%22%20id%3D%22toc-hId--1145651964%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-1316232860%22%20id%3D%22toc-hId-1341860869%22%3E%3CA%20id%3D%22user-content-cosmos-db%22%20class%3D%22anchor%22%20href%3D%22%23cosmos-db%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3ECosmos%20DB%3C%2FH3%3E%0A%3CP%3EWe%20use%20Cosmos%20DB%20to%20store%20all%20phrases%20and%20conversation%20references%20so%20that%20they%20can%20be%20picked%20up%20by%20the%20Azure%20Function%20and%20know%20what%20to%20say%20to%20whom.%20This%20was%20a%20logical%20choice%2C%20as%20Cosmos%20is%20cheap%2C%20serverless%2C%20schema-less%20and%20easy%20to%20use.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--491221603%22%20id%3D%22toc-hId--465593594%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-1301127751%22%20id%3D%22toc-hId-1326755760%22%3E%3CA%20id%3D%22user-content-azure-functions%22%20class%3D%22anchor%22%20href%3D%22%23azure-functions%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EAzure%20Functions%3C%2FH3%3E%0A%3CP%3EAzure%20Functions%20are%20used%20to%20run%20the%20application%20logic.%20There%20are%206%20function%20that%20make%20up%20the%20app%3A%3C%2FP%3E%0A%3CUL%20dir%3D%22auto%22%3E%0A%3CLI%3Emessages%20-%20A%20listener%20for%20the%20bot.%20It%20responds%20to%20someone%20messaging%20the%20bot%20with%20a%20Good%20Vibe%20and%20also%20a%20welcome%20message%20on%20first%20run%3C%2FLI%3E%0A%3CLI%3EsendGoodVibes%20-%20A%20timer%20based%20trigger%20function%20that%20starts%20the%3CCODE%3EgoodVibesOrchestrator%3C%2FCODE%3Efunction%3C%2FLI%3E%0A%3CLI%3EgoodVibesOrchestrator%20-%20An%20orchestrator%20function%20that%20handles%20the%20sending%20of%20good%20vibes%20to%20users%3C%2FLI%3E%0A%3CLI%3EgetConversations%20-%20An%20activity%20function%20that%20retrieves%20all%20previous%20conversation%20references%20with%20the%20bot%3C%2FLI%3E%0A%3CLI%3EgetGoodVibe%20-%20An%20activity%20function%20that%20generates%20a%20Good%20Vibe%20for%20each%20conversation%20reference%3C%2FLI%3E%0A%3CLI%3EsendGoodVibeToConversation%20-%20An%20activity%20function%20that%20sends%20a%20Good%20Vibe%20to%20an%20individual%20conversation%20reference%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CBLOCKQUOTE%3E%0A%3CP%3EA%20conversation%20reference%20is%20a%20description%20of%20a%20conversation%20between%20a%20Teams%20user%20and%20a%20bot.%20It%20is%20used%20for%20sending%20a%20message%20to%20a%20user%20pro-actively%3C%2FP%3E%0A%3C%2FBLOCKQUOTE%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--506326712%22%20id%3D%22toc-hId--480698703%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-1981186121%22%20id%3D%22toc-hId-2006814130%22%3E%3CA%20id%3D%22user-content-storage-account%22%20class%3D%22anchor%22%20href%3D%22%23storage-account%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EStorage%20Account%3C%2FH3%3E%0A%3CP%3EA%20Storage%20Account%20is%20required%20to%20allow%20the%20(durable)%20Azure%20Functions%20to%20run%20correctly.%20In%20addition%2C%20the%20zipped%20function%20app%20package%20that%20the%20Azure%20Functions%20runs%20from%20is%20stored%20in%20the%20Storage%20Account.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-173731658%22%20id%3D%22toc-hId-199359667%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--1633722805%22%20id%3D%22toc-hId--1608094796%22%3E%3CA%20id%3D%22user-content-bot%22%20class%3D%22anchor%22%20href%3D%22%23bot%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EBot%3C%2FH3%3E%0A%3CP%3EA%20Bot%20handles%20the%20connection%20between%20Teams%20and%20Azure%20Functions.%20When%20a%20user%20messages%20the%20Bot%2C%20it%20forwards%20this%20on%20to%20our%20Azure%20functions.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-853790028%22%20id%3D%22toc-hId-879418037%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--953664435%22%20id%3D%22toc-hId--928036426%22%3E%3CA%20id%3D%22user-content-adaptive-cards%22%20class%3D%22anchor%22%20href%3D%22%23adaptive-cards%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EAdaptive%20Cards%3C%2FH3%3E%0A%3CP%3EWe%20created%20two%20Adaptive%20Cards%3A%3C%2FP%3E%0A%3CUL%20dir%3D%22auto%22%3E%0A%3CLI%3E%3CSTRONG%3EWelcomeCard%3C%2FSTRONG%3E%2C%20which%20is%20sent%20on%20first%20run%20to%20greet%20the%20user%20and%20introduce%20what%20the%20Good%20Vibes%20generator%20is%20about%3C%2FLI%3E%0A%3CLI%3E%3CSTRONG%3EGoodVibeCard%3C%2FSTRONG%3E%2C%20which%20contains%20a%20Good%20Vibe%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3Ewhich%20are%20both%20sent%20via%20the%3CCODE%3EsendGoodVibesToConversation%3C%2FCODE%3EAzure%20function.%3C%2FP%3E%0A%3CP%3EAdaptive%20Cards%20make%20it%20super%20easy%20to%20have%20a%20nice%20looking%20message%20in%20Teams%20while%20we%20don't%20need%20to%20worry%20about%20the%20UI%20at%20all.%20They%20just%20render%20beautifully%20and%20fully%20adapt%20the%20look%20and%20feel%20of%20Teams%2C%20theme%20included.%3C%2FP%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId-1404765679%22%20id%3D%22toc-hId-1430393688%22%3E%26nbsp%3B%3C%2FH2%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId--402688784%22%20id%3D%22toc-hId--377060775%22%3E%3CA%20id%3D%22user-content-make-it-deployable%22%20class%3D%22anchor%22%20href%3D%22%23make-it-deployable%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EMake%20it%20deployable%3C%2FH2%3E%0A%3CP%3EAs%20we%20believe%2C%20that%20really%20everyone%20deserves%20Good%20Vibes%2C%20this%20is%20an%20open-source%20project%20-%20which%20you%20can%20deploy%20into%20your%20tenant.%20If%20interested%2C%20head%20over%20to%20our%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fworking-on-it%2Fgood-vibes-generator%2Fdocs%2FdeploymentGuide.md%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EDeployment%20Guide%3C%2FA%3E.%20We%20provide%20you%20with%20instructions%20and%20all%20files%20you%20need.%20It's%20super%20easy%20to%20get%20started!%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--2081060528%22%20id%3D%22toc-hId--2055432519%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-1104614246%22%20id%3D%22toc-hId-1130242255%22%3E%3CA%20id%3D%22user-content-arm-template-but-as-%22%20class%3D%22anchor%22%20href%3D%22%23arm-template-but-as-%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EARM%20template%2C%20but%20as%20%3Aflexed_biceps%3A%3C%2FH3%3E%0A%3CP%3EWe%20don't%20want%20you%20to%20give%20you%20a%20lengthy%20README%20file%20which%20guides%20you%20to%20click%20your%20way%20through%20the%20Azure%20portal%20to%20rebuild%20what%20we%20built%2C%20which%20is%20why%20we%20created%20deployment%20files%20for%20you.%20And%20as%20we%20wanted%20to%20use%20what%20the%20kool%20kids%20do%2C%20we%20used%20.bicep%20%3Aflexed_biceps%3A%20as%20our%20language%20to%20describe%20the%20infrastructure%20that%20needs%20to%20be%20created.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--702840217%22%20id%3D%22toc-hId--677212208%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-1784672616%22%20id%3D%22toc-hId-1810300625%22%3E%3CA%20id%3D%22user-content-zip-file%22%20class%3D%22anchor%22%20href%3D%22%23zip-file%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EZip%20file%3C%2FH3%3E%0A%3CP%3EOnce%20the%20deployment%20in%20Azure%20has%20completed%2C%20the%20other%20step%20is%20to%20upload%20the%20zipped%20function%20app%20package%20in%20to%20Azure%20Functions.%20The%20zipped%20function%20app%20package%20is%20a%20pre-built%20package%20with%20the%20code%20transpiled%20and%20all%20dependencies%20installed.%20This%20helps%20speed%20up%20cold%20start%20times%20in%20Azure%20Functions.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--22781847%22%20id%3D%22toc-hId-2846162%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--1830236310%22%20id%3D%22toc-hId--1804608301%22%3E%3CA%20id%3D%22user-content-deployment-script%22%20class%3D%22anchor%22%20href%3D%22%23deployment-script%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EDeployment%20script%3C%2FH3%3E%0A%3CP%3EThe%20included%20PowerShell%20script%20will%20prompt%20you%20to%20provide%20your%20preferred%20Azure%20region%2C%20your%20subscription%20ID%20and%20a%20resource%20prefix%20name.%20It%20will%20then%20deploy%20the%20bicep%20file%20and%20zipped%20function%20app%20package%20into%20your%20tenant.%20We've%20written%20the%20script%20for%20it%20to%20be%20run%20from%20Azure%20Cloud%20Shell%2C%20so%20no%20modules%20on%20your%20local%20machine%20are%20required.%3C%2FP%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId-657276523%22%20id%3D%22toc-hId-682904532%22%3E%26nbsp%3B%3C%2FH3%3E%0A%3CH3%20dir%3D%22auto%22%20id%3D%22toc-hId--1150177940%22%20id%3D%22toc-hId--1124549931%22%3E%3CA%20id%3D%22user-content-teams-app-package%22%20class%3D%22anchor%22%20href%3D%22%23teams-app-package%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3ETeams%20app%20package%3C%2FH3%3E%0A%3CP%3EWe%20have%20provided%20a%20Teams%20app%20package%20template%20allowing%20you%20to%20install%20the%20app%20as%20a%20personal%20app%20in%20Teams.%3C%2FP%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId-1208252174%22%20id%3D%22toc-hId-1233880183%22%3E%26nbsp%3B%3C%2FH2%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId--599202289%22%20id%3D%22toc-hId--573574280%22%3E%3CA%20id%3D%22user-content-conclusion%22%20class%3D%22anchor%22%20href%3D%22%23conclusion%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EConclusion%3C%2FH2%3E%0A%3CP%3ESo%2C%20there%20you%20have%20it.%20A%20Teams%20app%20for%20your%20users%20in%20your%20organisation%20to%20receive%20positive%20(and%20sometimes%20funny)%20messages.%20We%20can't%20wait%20to%20see%20what%20Good%20Vibes%20you%20get%20sent!%3C%2FP%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId-1888310544%22%20id%3D%22toc-hId-1913938553%22%3E%26nbsp%3B%3C%2FH2%3E%0A%3CH2%20dir%3D%22auto%22%20id%3D%22toc-hId-779018022%22%20id%3D%22toc-hId-804646031%22%3E%3CA%20id%3D%22user-content-resources%22%20class%3D%22anchor%22%20href%3D%22%23resources%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%20aria-hidden%3D%22true%22%3E%3C%2FA%3EResources%3C%2FH2%3E%0A%3CUL%20dir%3D%22auto%22%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fworking-on-it%2Fgood-vibes-generator%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EGood%20Vibes%20generator%3C%2FA%3E%3C%2FLI%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fazure%2Fcosmos-db%2Fintroduction%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EWelcome%20to%20Azure%20Cosmos%20DB%3C%2FA%3E%3C%2FLI%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fadaptivecards.io%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3EAdaptive%20Cards%3C%2FA%3E%3C%2FLI%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fazure%2Factive-directory%2Fmanaged-identities-azure-resources%2Foverview%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EWhat%20are%20managed%20identities%20for%20Azure%20resources%3F%3C%2FA%3E%3C%2FLI%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fazure%2Fazure-resource-manager%2Fbicep%2Foverview%3Ftabs%3Dbicep%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EWhat%20is%20Bicep%3F%3C%2FA%3E%3C%2FLI%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fazure%2Fazure-functions%2Fcreate-first-function-cli-typescript%3Ftabs%3Dazure-cli%252Cbrowser%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EQuick%20Start%3A%20Create%20a%20TypeScript%20function%20in%20Azure%20from%20the%20command%20line%3C%2FA%3E%3C%2FLI%3E%0A%3CLI%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fcli%2Fazure%2Finstall-azure-cli%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EHow%20to%20install%20the%20Azure%20CLI%3C%2FA%3E%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3C%2FARTICLE%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-3268169%22%20slang%3D%22en-US%22%3E%3CP%3EWe%20want%20Good%20Vibes.%20The%20world%20is%20a%20tough%20place%20to%20be%20and%20we%20all%20can%20use%20some%20positive%20affirmations%20and%20a%20little%20pep%20talk.%20Wouldn't%20it%20be%20awesome%20if%20these%20get%20straight%20into%20Microsoft%20Teams%3F%3C%2FP%3E%3C%2FLINGO-TEASER%3E
Version history
Last update:
‎Mar 27 2022 01:31 PM
Updated by: