The .NET on AWS Show, featuring David Fowler and Norm Johanson!
In this episode, we are joined by Distinguished Engineer @ Microsoft, David Fowler, and Principle Engineer @ AWS, Norm Johanson, to discuss the recent AWS updates to .NET Aspire!
Brandon Minnick
Amazon Employee
Published May 16, 2024
Continue to The .NET on AWS Show, featuring Nick Chapsas!
Loading...
Brandon Minnick 1:07
Hello, everybody, and welcome back to another episode of the dotnet on AWS Show. I'm your host, Brandon Minnick with me as always is the amazing Francoise, Francoise. How are you doing? I'm fine. Thank you, Miranda. Hello, everyone. I'm so excited by this episode. I can't wait to have our guests.
Francois Bouteruche 1:30
We have a special setup today because we are both in an hotel room because tomorrow we are at ticker Rama in Belgium on the developer conference.
But that's tomorrow. Today we we have an amazing show from for you.
Brandon Minnick 1:46
Absolutely. I agree. This might be my favorite episode so far with some of my favorite people in the dotnet world. But like Francoise said, we're both on hotel Wi Fi. So if we happen to drop out, the show must go on. It's okay. We've gotten amazing guests to carry us today. But without further ado, let's introduce them. You know, David Fowler as the distinguished engineer at Microsoft, the father of dotnet. Core. And we also have joining us as well from AWS, Norm Johansson, who I would consider the father of the dotnet SDKs at AWS. So huge, huge names. And I'm so happy you guys are able to join us. Norm David, how are you doing?
Norm Johanson 2:29
I feel old now you call this old fathers.
We didn't call the grandfather's.
David Fowler 2:40
Doing great. I'm actually here in the office because my house is being destroyed. I mean, built up right now. But yeah, when you guys
Brandon Minnick 2:49
read could have been a chance for your wife that goes out due to construction hours go to the hotel rooms, and we just have norm carrying on. But that's okay. Norm. So you've been on the show before. But for folks who haven't met you yet, who are you? What do you do?
Norm Johanson 3:09
Yeah, and so been at us for about 14 years. This is my 14th year this month. And I've been focusing on our dotnet tooling here. So starting with the SDK, we were just talking about when I started this, the gate was targeting dotnet framework 2.0. And, you know, seeing its growth through all of you know, all of the latest versions of dotnet. And I also reached out with any other service teams and others that who need dotnet support, try to help them out help build our lamda support or beanstalk support Visual Studio Toolkit. Just to get my hands dirty. And all that done at finance. We do it here. Amos.
Brandon Minnick 3:45
Love it. That's right. Yeah, if you've if you've ever used that that I need for us, you've definitely used some of norms code. And if you've ever used dotnet, in general, you've probably used some of David's code. But David Fowler, for folks who maybe haven't met you yet. Who are you? What do you do?
David Fowler 4:02
Good question. So I am a distinguished engineer on the dotnet team, sort of an architect where I oversee a lot of our cloud story. So I kind of start from ASP. NET Core, the web stack, or our ties into Azure services, etc. been at Microsoft for 15 years, and I actually interned on this team, like on dotnet for like, since doesn't six and seven I kind of joined full time and you know, eight and I've been on a team ever since working on things like signal our ASP. Net ASP. NET Core. When I started off my first let's see, dotnet version that I ever used in college was I learned ASP dotnet 1.1 And then 2.0 came on like the next week or something. So I've been using the stock for a long time. And when I joined I had the pleasure of working on dotnet four as my First kind of thing that I worked on at Microsoft itself. So, being on top for a long time working on a lot of things, having tons of fun, we're gonna inspire. Yeah.
Brandon Minnick 5:10
First, thank you for everything you've done. I'm a huge fan of dotnet. I've certainly built my career around it and love to see it getting better every year with dotnet. Eight seemed to be done at nine c sharp 12 C to B, C sharp 13. So thank you for everything you've done. But I'm curious, you mentioned you started out as an intern at Microsoft working on dotnet. Is Was that your first foray into dotnet? How did you get started?
David Fowler 5:36
Yes, good question. So my first four I used to use, I started off using PHP. So like to build. I started using Cubase. In general, and I, you know, my foray into coding was games. So I built games and Cubase eight, that was my first like understanding of coding and self taught to
Norm Johanson 5:55
make the snake game, everyone makes
David Fowler 5:59
you you open gorilla dot boss, and you read the file, and you're trying to figure out how to code that thing. I thought I went from Q basic to Pascal. And then I got into web programming, because I love the web. And then my first, the first language I learned for the web was php. So I was a PHP Apache on Windows style person for a while. And then somehow, I found a splinter net, I had a book I bought a book from a bookstore. Like we still have those back in the day, I got this, this ASP. Net 1.1 book, and I tried to learn my form. I thought it was like amazing and easy to use. And that kind of piqued my interest in the entire space began to learn C sharp began to this learn all the things this was in, in college. So like in 2005, six, I started to like play around with C sharp. And I spent it's funny at school, you learn Java, like most schools teach java in the states not t shirt. So I had been the one learning C sharp Oh, well, I was doing Java at at school. And then eventually, when I got the job at Microsoft, the internship, it kind of like, complete the cycle. It's funny. When I interview, they asked you what teams you want to work on. And I didn't really know what teams were at Microsoft. I just knew I want to work on done and because I thought it was cool. Alright, so I ended up getting an internship working on the ExtraNet team. That was a pretty awesome wait in lines on my first kind of foray into working on something working in a real company on something more that wasn't me making up stuff. And that was awesome.
Brandon Minnick 7:42
Super, super cool. I'd love to chat with you all day about all about this. But we are talking about dotnet Aspire today. And David, you've got some Yeah, let me pick up your screen. What Yep. What is dotnet Aspire?
David Fowler 7:59
So I'll give this this talk that kind of me and Damien Edwards give in Australia when we've been tweaking ever since just for different audiences, I figured I would give the audience a brief intro into Wasp virus and then norm can kind of like, show you the awesome demos and make you go well. So aspire, is, I would say, a build up over time of lots of ideas the team has had and has been building towards but aspire is the trance, wrap that entire experience up in a bow and give you something that makes the entire cloud of experience easier and better. If you if you read the blog, we we posted in November about aspire, it kind of had this word soup, no offense to anyone who made the word she made the word soup, like this is a lot of words to kind of suck in and figure out what it is. But what it really is like at the core of it is is this thought that we have to make cloud development easier. And I think it's been really tricky to kind of describe succinctly what it is because it kind of contains so much stuff. And to make cloud that easier. You kind of have to look at it from a zoom not zoomed out point of view to figure out which pieces do you want to tackle. So aspire, how well, I'll talk a bit about how we landed on a spire. It's been a journey since dotnet. Core three if you were with us for that whole time and doing dotnet core, which is about eight years old though. Since three, we started working on a lot of these what we call fundamentals to make cloud that easier. We added support for logging metrics activities, which I just worked for Alltel really early on before it was even, like, reasonably stable. We took a chance on that technology. Yeah, we had resources. I know right. It could have gone either way, right? Because before OTELO there was open census that didn't pan out so the So Elsa, yeah, we built Yark. So we kind of had all of these like features building up over time. And we knew dotnet was cloud native, but it didn't really have anything to wrap it, wrap it up into a bowl and go like, this is the real thing that you're going to use for like doing cloud Dev, it was just a dotnet. With good for club Dev. Alright, so we have been investing over time. In 2019, couple of us like kind of went off on a tangent and built this thing called tight. Tight came out of us going on this tangent. And the idea was, how do we make it easy for devs? That, you know, are not immersed in the cloud, native world and Kubernetes? in the K space? How do we get them up and running super fast, right? How do we make it so that you can you can kind of model cloud environments, but in your local Dev, and tie was the experiment that kind of, you know, fit into things like a spire that you know, help people get up and running, get a dashboard to see they're there. And applications? When you have more than one thing running? You immediately have this issue of like, how do I see my entire world right? Or, or at least a subset of my world that I'm currently running? It had this feature where you could deploy to Kubernetes, immediately from a from a local environment. So you would describe, you know, you have two apps on a container. And I want to get that running Kubernetes? Do I have to go learn Yamo and all the helm? And all these technologies? Or can I just like, take my current app description, and get into the cloud, so I can see it running. And then once it's running, then I can decide to kind of peel back the layers and figure out what what actually happened here, right? Like, how did you get Kubernetes? How did it map this thing to a container, etc. So tight was experiment. One thing we got from Ty was that we understood people love that that experience, people weren't really sure about the the being able to deploy. But this is more of more input into kind of like, the things we had to do to make that easier for cloud native. And then we had a couple of teams internally, I think a lot of teams internally, but one in particular, I had built up this set of what we called libraries for for scalable cloud services. And it was a layer on top of dotnet, core dotnet. That added a bunch of things. Some where it was trying to fill gaps for things we didn't have all like reduction, resiliency, etc. And then GUI libraries that were trying to take an existing SDK, configure some defaults and make it cloud ready. So retries timeouts configuration, one of the things we heard from service teams at Microsoft was one of the number one leading causes of like an outage in Azure may have been something like, you know, we misconfigured, the HP client settings. So the team kind of went on a mission to be able to say, okay, when you get a default HP client, in this cloud native library, we're gonna configure it this way, because we, from our experience, running running servers at scale, and the cloud, like you need these settings, right. So we, we took a lot of stuff. And if you look at the Microsoft extensions repository, and dotnet, we shipped a ton of libraries. And it came from from these these teams, but in these stuff internally, so one of the goals was to bring first party innovation from Microsoft to the masses. And that kind of helped us run the story out. So we got a couple of ingredients fundamentals, first party innovation on tight. So we had all these Lego pieces that were there, too, you know, you could take all these bits, and do this, and you would get a stack that worked pretty well together. But we wanted something a bit more curated, right and on on the rails, per se, Ruby on Rails. So we found more gaps, we figured you know, every application that needed to talk to other services, if you're building a service application, you need to discovery. So we, you know, filled the gap there, we added this new library. And then we wanted high quality client libraries. One of the things dotnet gets dinged for over Java is we don't have the vast ecosystem that Java has. So how do we how do we build a community around building high quality libraries for anything you want to talk to databases caches? A bus somewhere. So like, if you if you want to use Apache pulsar or Kafka or Redis, there should be a default library and there should be a way to configure it in a way that is observable, resilient, configurable and testable, right? Those are kind of some of the some of the principles I went into the thinking behind Aspire. And then we want templates to get you started in a place where, you know, you don't have to go learn 20 things. We can put you in a place where you know, we can figure opentelemetry in the right way by default. and you can change it if you want if your company has your own standards or or your on your own things, right? So we put all these things together. And guess what one more thing was missing a local orchestration, which we'll see in a minute. We couldn't be cloud native without supporting a cloud. So we want to make sure from the get go that, you know, Amazon, Google and Microsoft, you know, had first class support and on prem, right, first class support for this, this this type of rebuilding. Actually, we reached up the normally really early on before we had the first preview. And we said, Okay, we're doing this thing, we want you guys on board, this thing can't be an Azure only experience, it must work cross cloud, right? One of the funny things about working on Microsoft is that, you know, we have to make sure that our cloud works the best, obviously, like Azure, and aspire are gonna work well together. But
Norm Johanson 15:58
I don't know what was that thing.
David Fowler 16:02
But from a dotnet point of view, like dotnet is cross closed, cross platform, cross everything, right? So it works really well in Azure, I have to work well in other clubs as well. So that was a big deal for us. Some of the Halo principles, this dock is built for developers, we get a lot of questions about you know, especially when people see that we can do a deployment thing or do an agile thing. It's a lot of questions around like DevOps and platform engineering. This is for developers. And it's code centric and code first, intentionally like that, that is the our point of view is devs. First, right, we want to build on our existing stack. So we don't want to reinvent a spinet core or our GRP support, or Blaser or whatever else we will take will be built over the past eight years, and it will be used in the stack, right. And then features that are general purpose belong in the right layers. So for example, it starts at service discovery was built on it. And the name is Microsoft extensions, or discovery is not aspire dot whatever, intentionally because this package is usable, not only in the stock, but like anywhere else, right. So I think the fact that we kind of own the entire stack from bottom up, it lets us do this thing where Yeah, we could all put we could do a spring does. I'm call it spring, blah, and it will be in spring, right. But I think we have a more generic point of view of like, we have this super layer stack where you can use the pieces all together, and you get this experience. Or you can kind of grab each Lego piece on your own and build your own libraries, right. So the stack is, is not it works well when you put together, but it's not coupled, each piece can be used independently. And then more glue as abstractions is kind of a model for our client libraries. We did not want to wrap Cosmos, all the objects decays. The onslaught SDK is we don't want to build our own abstractions, we want to configure whatever the underlying client is in a way that makes it work best in cloud native environments. That means, you know, we're not going to introduce an AI DynamoDB cache, right interface is trying to on that, for every single client library on the planet would be a really tough task, I think we will end up with abstractions where it makes the most sense. So where there is ubiquity, where there is like a generic abstraction that kind of falls out of having this many implementations, it makes sense. But for the most part, all of our spar components, configure clients as they are. So you don't We don't we don't change the interface. We just turn on more more knobs, turn on opentelemetry Turn on all these things to make it more cloud friendly. Right? And then one, one thing that we want to do is we want to make sure the community like benefits from our work. So one thing we did was, let's say I think the rabbit MQ client is a good example. We have a package called Aspire rabbit MQ client. And one of the things we want to do is we want to have first class support for open telemetry. And there's a package you can install to kind of like I add support to it, but it was unofficial. So we there was a there was a pull request kind of in the rabbit MQ repository. And we kind of nudged a bit saying, you know, this would be really cool for a spire could be like, what what do you need for us to help move this forward? So we've been doing that for a bunch of libraries that we take dependencies on. And it's, it's good this not just for aspire, but it helps everyone else. Right? So that's a part of our things. So the Aspire stack has orchestration components, which are just packages, for discovery templates and a dashboard this this was the out kind of like taking all these ingredients, put it into the soup and like stirring it for a while. And then we got this out the other end. And a demo. Normally you want to show them or show like a super basic Hello World sample.
Norm Johanson 20:14
I feel like my demo probably ranks into the Hello World, just with a little bit of AWS sauce on there. Yeah,
David Fowler 20:21
perfect. So let's switch to norm to get the AWS hello world version of aspire, right?
Norm Johanson 20:29
Switch. Sounds good.
Brandon Minnick 20:31
Yeah, Mo Norris pulling that up. Yeah, I love what you've created with dotnet Aspire here, because you've, you've found the pain points, we've all been hitting as dotnet developers using the cloud. And totally could have been super, super selfish and said, if you're, if you're only using Azure, this is this is what you can use. But I love the dotnet community collaboration, the cross company collaboration, where all of us can participate. And to me, it truly just makes dotnet better for everybody, right? Because as we add features to our AWS support, or I should say, as normal adds features today to support, it'll get better and better. And maybe there'll be some things that we add that the Azure team hasn't added yet. And that'll force the Azure team to add it. And we'll just keep making each other better, and really just results in a better world for every dotnet developer. But I digress. I have a
David Fowler 21:30
super fun story. But actually So Norm, I was nudging norm the Senate to like get support for this like and because very
Norm Johanson 21:37
subtly. Yeah, of course.
David Fowler 21:41
There was a lot of feedback we got from our Dynacraft keynote, that was, you know, is this tied to Azure, because we showed a deployment. And I think the immediate reaction, which is like, rightfully so like this thing is tied to Azure vendor lock in your, you can't do anything anywhere else like and I was okay. The only way to fight this is to have support for AWS as soon as possible. So like, even if it was a merge showing the like, that there was interest was super important. So I was like, Norm, can we get something? I don't know what it is, you go figure it out. But like, let's just get something go there. So it's visible publicly. And people can see this isn't just about Azure, right? So norms has this massive PR, figured out some stuff. And then I read North pier, and I go, Holy crap, we should do the same thing for Asher. And it really, it changed in preview for we completely change how we built data support and because of North beer, so that
Norm Johanson 22:44
everyone knows me I
Brandon Minnick 22:51
amazing story. And we all we all know, oh, normal beer or coffee next time. Yeah. Well, normally your screens up. Okay, let's see the goodness that you added.
Norm Johanson 23:03
All right, and I'm fighting a cold. So forgive me whenever I cough and things like that. But I think I'm pretty good today. So this first demo here. And I have absolutely zero UI skills. This is the reason why I work in the low level developer tools, right. So this is a an application that's kind of simulating customer feedback, right. So I've got a website, it's a very exciting website, where customers say enter in their feedback. And so it's this is a blazer front end, you can see again, it's got form on it, it's clearly exciting. And we submitted our messages out there. And then we've got a back end processor, which is going to go do our AI Kosha. For the thing, we're going to do some AI to do some sentiment analysis to see whether the feedback is positive or good. So here we got, like these couple applications that we want to you know, be able to f5 debug and start stepping through the all these things. And and this is where spire can really help us, you know, how do I get all these things running? And how do I get all these things communicating with each other. Now, we also launched a new messaging library not too long ago. So we're also going to use this messaging library to basically post messages from our front end, and then have our back end, pull it in through so you can see here, and our front end. We've got our ad was messaging bus, and we're gonna go and send our sub a feedback submissions to our topics. And then back over here on our billing, we're gonna pull our SQS thing and then handle all of our submissions to this handler. So this is this new library. But again, we got to get all these things connected up together. And in the Aspire world, we have our app host and that's where, again, I don't have to do dog or compose all these other collections, I can just use the dotnet code to sort of define how all these things connect up here, right? So first is this is in. So this demo here represents what we've shipped out there in the current preview, you can go and try this out today. And I can go and define what is the SDK configuration I want to use? What profile do I want to use? You know, because we often have multiple profiles that we want to use in our, in our setup system, what at this region do I want to use. And this is one of the things we only right now support profiling region. But this is a thing that we could keep expanding where we could potentially have this say, Oh, and make sure this case configured for this number of retries. This is the timeouts like this is the error, we could do all of that extra configuration. Now, this project requires a SNS topic to send our messages to and that topic has a queue that subscribe to it. And so we need to have that been created as well. So what I want is when I f5 debug is I just wanted all this things just to magically work. So what we do in AWS here is we often wrap all that up in a CloudFormation stack defined by template. And that's what we've added now to aspire is, you can go and create a spire resource, which represents a CloudFormation. Stack, and sell which CloudFormation template to use. So when I launched this, it'll go in run, create this template, or excuse me use this template to create all of my application level resources.
Brandon Minnick 26:31
In North, we've got a question in the comments, can we still load the name, profile and region from the environment?
Norm Johanson 26:38
You mean, assuming they mean from the environment variable? Yeah, you don't know if you are, if you already just hit your dev machine setting up having the agents profile it between environment variables, SDK will still pick all those things up. This is just a way to basically override the area information, if that helps you. So again, Aspire here, we've got a couple of projects, here we are front end and our back end that they are both added up. And the processor. And I've talked too much, I'm going to just push f5. And we can see some magic here. And it'll probably pop to the wrong window, because that's what happens when you go on a show, right? Alright, so here's that Aspire dashboard, right? It's got our two projects that we got here. They're currently starting up. But they're starting, but they're currently waiting for that CloudFormation resource to be created. Because they got a dependency on there. Go look at that.
Brandon Minnick 27:37
Can you zoom in a little bit on the web browser there norm?
Norm Johanson 27:40
Yeah. How's that? Thank you. So here, we can see that, you know, it's going through that and creating all the things now this is the first time I launched this project. So it's gonna go and actually create the stack the next time. Next time I push f5, if I haven't changed the stack, it's gonna say no changes. And just be quick, no big deal. So you can still have a facet or boom, but if you change the template, then you'll wait a little longer for it to do all that provisioning. Now my snag.
Brandon Minnick 28:13
This is the same CloudFormation template we would use if or when we're publishing to AWS. Right. So yep, in theory, we can publish the same CloudFormation template, the same resources, we could be spun up in the cloud that dotnet aspires spinning up locally for us here. Yeah,
Norm Johanson 28:29
same template. In my example, here, I use the JSON template, it could be a Yamo template, it's you know, as CloudFormation supports either one of those. But yeah, we're not in this is where we were wanting to make sure that we didn't have to reinvent all of at birth and aspire. Because you know, at basics changes every day, every day, there's new stuff that comes out. We don't want to change the spire every day. But CloudFormation evolves on its own CloudFormation gets new features. And as soon as that does, you can add that to your template and then Aspire will then use that.
Brandon Minnick 29:01
Beautiful. So I see here, it's by the two resources. Oh, go ahead. Friends. One. Yeah.
Francois Bouteruche 29:05
Yeah, I just have a quick question. Quick question just to be sure to have this probably in my mind. So before I had the ability to create project reference in my Visual Studio solution, and here with this new app host project, I can create reference between my project and my CloudFormation template saying, Hey, you, you can't launch this project without the Bing, those resources. Yeah,
Norm Johanson 29:34
we had that with reference. So basically, these projects had that dependency on there. And that's what made that dashboard, make these projects wait and starting up until that resource was complete.
Francois Bouteruche 29:45
Okay, that's amazing. The
Norm Johanson 29:47
other part about this with reference, is you can see my stack had some output parameters. And those output parameters get assigned to those projects. And that's how those projects then can get access to Have those those IDs of those resources. So if I go back to my tablet here, if I go look, here, you know, Aspire works a lot with basically setting environment variables through its system. So scrolling through here, and you can see, here's all the other variables. But see, there's my queue and topic getting passed into my application. And then if we looked at my front end
you can see that's me just pulling out those resources and being able to do so that's how I'm able to pass in that configuration into the system.
Brandon Minnick 30:40
Super easy. That's, that's always been one of the biggest pain points I've had when because, yeah, you can publish stuff to the cloud. And especially when it's a greenfield app, you're you're making things for the first time. And so you're still kind of in dev mode, nothing's really live yet. You can play around with everything in the cloud, basically, in production. But once you switch over to production, you got to start building things are the same things locally. Things get weird, things get tough, because like you said, Here, normally you've got a messaging service, you maybe maybe you have a database you need to talk to you've got a website that all needs to communicate with each other. And so Okay, cool. It's all connected in the cloud. But now how do I spin that up locally? And how do I get everything talking to each other? And it feels like that's the superpower here of dotnet. aspires, it just orchestrates that does everything for you. Well,
Norm Johanson 31:29
I like getting everything hooked up to Visual Studio. So you like so let's go like she launched. And you can see this beautiful UI, I mean that I spent on that. Yeah, it was amazing. So let's give some feedback. I have a headphone addiction, I buy way too many headphones, my wife makes fun of me. The shoes are the most amazing headphones. Right? I submit that. And, you know, I push f5 on the app host. But I click here. And now I'm here and I'm debugging in my front end, right. So again, beautiful code here, right, and we're sending up to our message processing library. And then we have done with this and then we're going to straighten in our processor, right? So we're able to easily debug through all of our processes, right to visually see. So I only pushed f5 right there on that pose. But to get everything set up, and we can go see we're gonna go prove whether it's positive or not. So I think if we looked at the output of that a lot, because again, this is not a full demo here, you can see the feedback was positive. Yeah, David mentioned, you know, OTEL was a big part of this, right, you wanted to really get in I couldn't run on dev, it seems like a lot of people have been excited about the the tracing views in the dashboard. And we get all those set up here. And in this demo, I happen to configure and in that service defaults. That, you know, I wanted to also include instrumentation of both our SDK and our messaging library, as well, it also has. So that allows us to integrate in this dashboard, where if I go look at this trace, and granted, remember, I got a breakpoint. So this trace looks really long. But here, you know, we get to see that we started you know, from the front end, we got in our in our messaging library went out, we went into our service. And because our messaging library also takes care of connecting this between the different processes, because it's, you know, it actually connected back up to the processor. So we got all the way through the it's what our dashboard can show. All those pieces of that in.
David Fowler 33:38
This is amazing, holy crap. This is the first time I've seen it running. So one of the things I want to say that that the norm kind of touched on was, when a spire started off and people saw it, I think there's a lot of impression that this is like just a compose equivalent, right. But without Yamo I think initially, when you just run containers, that maybe is the case like is, you know, C sharp based experience for for that for the same things. But I think in a preview for we kind of hit this point where it was like, huh, we can model arbitrary resources. And it can be local can be remote, it can be executable, it could be anything really, and norm and the address support they this support, where you can kind of spin up a cloud resource, and have it shipped locally and dashboard without you having to worry about like, you know, having to go through the portal, configure things copy around keys into the wrong place, check in keys by mistake, like we were going to do all the things to automate that end to end for you. So you don't have to leave your contacts you are within the editor. You're in your IDE. You're like running your code and you don't have to, like change context to like copy things around. That was one of the things we were like, Oh man, we can automate this end to end without having to have devs like, leave right or change context.
Francois Bouteruche 35:00
And I can, I can certainly relate to the experience who you were mentioning David in the room, because I'm currently building a quite big demonstration on AWS with dotnet. And I'm all the time I'm like, Okay, I need one more resource. So I updated my CloudFormation template, or deploy. Okay, what is the URL of this resource? The Iran them? Okay, I must put this into my config file. Okay. Okay. It's good. I can continue to work locally. And it's a nightmare. And what you've just show there is like, okay, it can be completely streamlined with this, because I don't have to care anymore about Okay. It will just deploy for me just update my CloudFormation template file, and it will work so amazing.
Norm Johanson 35:54
David, I kind of glossed very over Do you want to, you know, the default file? Do you want to give more or the project? Do you want to give more of an explanation? Yeah, so
David Fowler 36:03
I think one thing that they'll be useful to do normally is is show your, your solution explorer. Okay, let me
Norm Johanson 36:11
let me kill projects do you have, you're gonna do some
David Fowler 36:19
windows key plus Windows key plus windows?
Norm Johanson 36:25
Come on, there we go. Alright, I should have
a different zoom.
I'm a pro at this.
David Fowler 36:38
So there's there are these four projects, right? Perfect. There's the the app post project, this is a new kind of project that aspira introduces it is your local orchestration project. So you could think of this as this is a thing that knows about all your other projects, and it will launch them, it handles networking and handles configuration between different services. It is it's funny, I think of it like a local cloud is not really a cloud, but it's like the local view of your application or your subset of a bigger application, right. And then there's this other project called service defaults. And this project is part of your codebase. It's not a library. And what it does is, is trying to get you to a starting point really fast. So that project is referenced by all of your service projects. So your front end, the back end there that that pulls stuff off the queue. And Its job is to configure the set of things that you know, every service needs. So every service needs telemetry, it needs discovery, it needs to be resilient. Maybe all of your services have open API. But the intent is to create a pattern that's more formal, that says, you know, all of my services need to do these baseline cross cutting concerns. And we give you a set, and you can add your own your own on top of that. So normally, if you were to kind of expand the service defaults, you could assume no, I think, okay.
Norm Johanson 38:14
Oh, no, you remember how to get rid of this thing I skipped.
David Fowler 38:19
So good at this, as a single father right extensions, and it doesn't do much. I think one thing I want to insist on the audience is, there's a lot less money than than you think there is very. So the thing that makes the entire end to end trace work is configured right here in your application. So the Add service defaults has not configured opentelemetry. That this is code, you could put in any application. Aspire is not special. In this point of view, we just configure it for you, right by default. So you could go into documentation and you could say, you know, I can learn how to wire up open telemetry with ASP. NET Core G RPC, AWS, and you know, you will get the same experience. The intent here is to kind of say, open Telemetry is a baseline for any Aspire app. So if you want this kind of like default end to end tracing, where you pull in a package and it kind of just lights up, we give you this like baseline of baseline configuration that makes that work. If you look at the Add open telemetry exporters, this is kind of the exporter is how you send data from your application to somewhere else in Amazon is called CloudWatch. I believe in the cloud watch and cloud Watch right x right. So X ray, so I know stuff. So I get plus one. So the one of the intents here and in Aspire is to you know use standards. So opentelemetry has a protocol called oath DLP and that protocol will eventually work. And every, you know, every tool that supports tracing and logging and metrics will support this protocol. And it's been, you know, catching on a lot recently. And by default, all of our projects are OTP enabled. In fact, the way the dashboard works today is the dashboard exposes an OTP endpoint, and it configures your app to talk to it. So in dev, you get this experience where you know, you get a dashboard, and you see that the tracing, and the intent is, and you deploy, you can set the same variable without code changes, and have your app just work as well. So we have this like principle where we are trying to minimize the code changes between local Dev and prod. And we use the app host as a bridge to pretend to be your cloud environment and local Dev. So that when you do deploy, you don't have to lay on a spire your applications like you can make it work by providing the right configuration on the deployment target, right.
Brandon Minnick 40:59
That's incredible. Just to catch up on some some feedback we're getting here in the chat, Steward blaming or sewer billing, says Aspire has been great for my team, we have a new project with two dotnet API's and web UI communicate with Kafka, Postgres SQL DB in the MCS migrations, of course, and having a host project where we can just press f5 is bliss plus, the dashboard is amazing. I agree Stuart, nice. Couldn't have said it better myself. And then question we've got a question from cube cloud. I think in this case, the app must be running with an im role with read permissions to cloud watch stacks. What if a scaffold or reads CloudWatch? And generates properties which are loaded in app from a config file? normal throw that one to you?
Norm Johanson 41:49
So I think that the question is, is like what if the basically what if the stack already exists, like, if someone's already created the resource as the Dev, I don't have the permissions to go and create these things. So for that, you would, basically we have the can't type R A, you can say builder dot add abs, and you can say I want to pull in an existing step. So my stack Mustachio. Yeah, pulling that stack. And then that'll then this, this will pull in all of the output parameters of that stack into things. So that's how I don't have permissions to create a stack or all those maybe they just only have read permissions things I can have, maybe my admin creates the stack with all my resources, and I pull those into my application in there. So that's how I'm interpreting that question.
Brandon Minnick 42:44
Super easy, same. And last question. See, are the templates going to have a commented out CloudWatch slash x ray section for applique? Like for Application Insights, or maybe an at best version of the templates?
Norm Johanson 43:04
I think we haven't figured that out yet. Yeah. So the short answer, though, tell him
David Fowler 43:09
norm, all your feedback. I think right now we have this experience built for for AWS, I think we want people to use it. And that will kind of help us decide do we invest in like, more app side stuff? More outpost stuff? But yeah, definitely send feedback to know about this stuff.
Norm Johanson 43:30
Yeah, and we have our this little everything we showed him today in this in this particular demo is out there in Preview six, is that the current latest version? Yeah. And then that's what I'm using here. And I it's marked as preview. And you know, this is where, you know, we're at ATBS really curious, what does the community want from us? And do they want us to do more investments here? Like we want to be part of this? But you know, also we're pragmatic of like, there's a million things to do. So if this is what you want us to do? Let us know. So we can put this in our priority backlog.
Brandon Minnick 44:01
Loving? Good, good question for the SEC. Give the people what they want, right? Nor, I mean, selfishly, I would, I would love a template, or I could just uncomment a line or two of code. bratty aggressive jump back into the demo.
Norm Johanson 44:16
All right. Um, let's see, we got 15 minutes left here. So. So again, this is everything that we've got out today, we have another PR that we've been working on, it's been so we have another guy Davis has been working on this stuff. His name is Vincent. He's been working on the idea of, you know, now that we've got CloudFormation. What if we use CDK on top of that, so keys were basically our cloud development kit, where you define everything in code in here. So this demo is not complete and not shipped, but I want to kind of give you again, this is where we want your feedback of, you know, is this where you would like us to go here. So in the previous demo, I had Add my JSON CloudFormation template in this CDK world, you can actually, here I want to add the CDK to the system. And we add a Cloud SDK stack. And we start using those CDK constructs straight inside the project itself, the app host here. So instead of having a separate file, I'm using dotnet here. To create my web tables, and all of that stuff that we do in there, we got our topics and buckets, we even create our Cognito user pools. So this is how I can get all the identity setup for this application. This demo, which again, it's not quite done yet, it's going to be a demo where you can create, you know, log on, create a photo, web website, and all those things. So and this is kind of an interesting one, too, is everything is very Dutton at Centrix. In this sample, this is showing where you're going to actually have the front end be a node app here. So he's adding an NPM app. So it is a node front end with a dotnet back end, and then plugging it. So again, this isn't a full working demo. But if I push f5, I think my f5 button, this duck or something. That's like the most important thing on your keyboard is your f5 button. And it's stuck. That's gonna be fun. Just
Brandon Minnick 46:25
writing too much code in Visual Studio lately.
Norm Johanson 46:27
For a new laptop.
Brandon Minnick 46:31
It's at the M four processors coming out, get a new MacBook windows, great ARM processor. Lots eat great Tyree.
Norm Johanson 46:41
Here in this dashboard here, we got there. And again, this is totally This is the we're trying to figure out what's the right experience here. So nothing is set in stone here, we got all of our construct showing up here, we've got a CloudFormation, stack, and CDK. And it's using those same underground functionalities where it's still going to use the the stuff that we've already built in there, where it's you know, using CDK, essentially compiled to a CloudFormation template, and then it runs that into there. And we get the same alpha parameters, and those get assigned on there. So, again, well, we have what I'd say what we've shipped today. And Aspire is sort of like the base level like this is the basic requirements, you can use CloudFormation, you can configure the SDK, but now we could start building other things on top of this, like, potentially adding CDK, which then creates this application, which here is we got our executable for NPM. And it's gonna allow me to go and do Simon. And again, I'm not gonna go through it right now. Because this, this demo works as far as it will actually, let me sign up and do the whole authentication stuff, which is pretty cool that it basically every dev on the team can just go and clone the repo, push f5, all these resources, including all of your identity. Set setup is done for your application, and you can start debugging in there.
David Fowler 47:51
That's impressive. Is that Cognito? Is that like, did it use? Did it Configure? Yeah, all?
Norm Johanson 47:58
Oh, so we got it's probably looking here, there might be some valuable secrets being put in there. So yeah, there's the the client ID, the user pool, all that's getting put in there. Again, I didn't write this demo, I'm just taking credit for it. That he sent me and I pushed on amazing holy cow. So it's work. So yeah, again, this is one that we haven't shipped yet in the preview. But you know, and this is where we really want to get that feedback, like, do you want us to add more of this support where you know, we can add CDK and things like that on there.
Brandon Minnick 48:34
I love it. And even in the comments who's fury drive mentioned that they love the CDK and AWS too. And in fact, Francoise just gave a talk on the CW K CW CDK. Just a couple of weeks ago, dotnet days, an amazing conference in Romania. But norm for anybody who's watching who maybe hasn't used the CDK yet, or doesn't even know what the acronym stands for, what what is the CDK? And why is this? So so cool.
Norm Johanson 49:03
So C K, and belief stands for cloud development kit, essentially, allows you to the idea of CDK is, hey, not everyone loves writing jet giant JSON and Yamo templates. I know David loves but it's actually taking the ability to use a like a programming language here. We got dotnet CDK, supports dotnet Java go Typescript and probably one that I'm forgetting. But you know, it's not that, you know, that's the important one, right? So allows us essentially, to use, you know, dotnet constructs to represent these entities resources in a stack. And normally with CDK, you would go and actually there's a nodes, you know, CLI that you would go and just runs the CDK. CLI to go and do all the provisioning and stuff like that. And it would synthesize that compiling CloudFormation to my resources. But that's what this P Are Here is doing is instead of having to even mess with the, you know, the node CLI or anything like that. It's just integrated straight into that f5 debugging experience. So we basically part of that f5, it's going to take this CloudFormation stack here from CDK. And again, this is following that, that that idea that we don't want, it's using the pure CDK constructs and nothing Aspire specific. So that, you know, CDK can, you know, evolve independently, we get new features, and we don't have to wait for a spire to update but it's getting integrated in there. So that this stack will essentially then be synthesized into a CloudFormation template that JSON yam will file and then get passed into all the same code that we just shipped before.
Brandon Minnick 50:44
Incredible. So basically, the CDK allows us to write dotnet code that gets turned into the CloudFormation template, which, like you said, could be JSON or Yamo. But if we don't want to touch those nasty languages, like who, who loves Yamo, right? I don't, we can, we can instead write it on C sharp. And then we still have this reproducible or shareable template for our back end that you know, somebody new joins the team, they can spin up their dev environment with a couple clicks of the mouse or if we need to update everything makes it easier for migration. So yeah, I know I'm, I'm really excited about this. And even for its while I was mentioned in, in the comments that, first of all, you're gonna put together a new demo on the CDK with AWS and as fire. Yeah,
Francois Bouteruche 51:32
yeah, definitely. I'm like, Okay, no, my my demo, I need to work one more week just to add dotnet spray on top of this, because it would make it so. So so much streamline with all the configuration. Yep, definitely. It's beautiful. It's,
Brandon Minnick 51:51
it's a good problem to have.
David Fowler 51:52
Oh, yeah. What wants to be important thing, I think, to save a lot about what norm just said is, these types are CDK types natively. All we're doing is bridging CDK types into the Aspire model, which is a really, which I think, which is something that we really wanted to make sure we design for. So Aspire is not just like this stuff, it's a platform for people to build on. And it's funny having you guys plug in, in a way that you don't have to actually change Aspire was a big goal for us, like Kimmy make it so that you can build this stuff without having to change the Aspire source code itself. And it helped us design more features and aspire to enable these scenarios to work in, in the posts, right. So that was a big, a big help watching these things evolve. So we can go, Huh, that's a cool pattern. That should be a thing that's first class in the actual support. So we can, you know, bridge more things on it, we got to a place now where like, you guys can build the support in without us having to add a ton of features to do like a very specific thing. And but now we have this generic platform. So you can kind of add resources for any any cloud you want to add to alright. It's really, really good.
Brandon Minnick 53:09
It's beautiful. I love it. There's there's no excuses. No excuses not to add more to dotnet is fire. Amazing. So I cut you off. We've got about seven minutes left. Before we have to wrap up. What else can we show off with AWS and aspire?
Norm Johanson 53:27
I think we can do it, we're going to try. And we got seven minutes, right? So let's see if we can, I want to show how you can actually use extend aspire to add custom resources here. I think Aspire is simple enough to do that. Well, we'll see if it's true. So here is another demo here. This is ZIP Code lookup thing. This is a demo I have created. I looked at I've got versions of this LED back from 2014. And every year, it's just seems to get a little easier to make it because I think it's using the same thing here we've got a web front end talking to a back end to look at us zip codes. And I got a CloudFormation template here. That is going to create my DynamoDB table that stores all my information. There's also a project here for loading up the data in here. So what I thought I'd do as an exercise is we have a product database called down and be local, which is a way to actually emulate data to be local, or DynamoDB without going to the cloud. And so what if we wanted to use that inside of SPIRE and so we weren't actually going to use CloudFormation so spinning along here, so no using CloudFormation because hey, we're not using the cloud we're going to actually use local so I'm going to create a DynamoDB local and so here we can just add containers right so dangly local is available as a container. So I'm gonna go to my handy dandy cheat sheet here because I can't go Don't remember the container name to be local. And now if I start pushing it five, it's going to actually add that container to my app host, I do need to expose an endpoint to it. So let's add an endpoint. See target port it there, it uses port 8000, inside the container, and we're using HTTP in there. And so now we're gonna have, we're gonna launch this container, and our application is going to have to be local in there. Did I put the bar in there? So
David Fowler 55:40
I do have a bar? Okay. Yeah,
Norm Johanson 55:44
the font is just so huge for me. So now we're not using these resources, we need to actually have our project know about it. So I'm going to add with environment, it needs to be able to find our container. So because we need to wait until this containers actually start up. We're going to do it with a context. Because at this point, when it gets this callback, the container start up and I can actually find the endpoint for it. So I get my endpoint. CPU local resources get input. There's only one I'm just gonna read the first one. Do you want Helmer? Oh yeah, what am I doing wrong?
David Fowler 56:24
Nothing. Is that keep going. Okay. And watching? Yeah.
Norm Johanson 56:30
No pressure, oh, no pressure. David Fowler is on the line, where did you tell me what I'm doing wrong. That's the case got a secret trick in there, if people don't know, you can actually tell the SDK for per service, which endpoint to use by an environment variable. So now I've basically said, SDK, use that endpoint whenever it's gonna go connect in there. And I also need to tell it what table to use. I'm gonna go and add that there. And I'm gonna get to add it up. And then you do it for both my data loader and my application. And so I know it's super super fast there. But really, that's all I needed to do to add a sidecar container. And in my view, there are a lot of products the last few years of like, Hey, we're product, let's just add another container out there another sidecar container. And it's aspire, it's actually really easy to just add these in are now in full clarity. This is something we should add extension methods on there to make this very seamless on there. But that's all it really took. And now if I go and launch if I can't do Mike stuck at five button, this is very upsetting to have a broken f5 button. Lunch that up there is
Brandon Minnick 57:46
listening along to the to the audio podcast. Basically all norms done is included pointed to a container that already exists. So pointing to the URL where Aspire can find the container and then added in a couple lines of code for the configuration of the resources that are running locally to also know about where this Dynamo DB running in a container is. And that's it it Yeah. Norm dotnet aspires just yeah, my
Norm Johanson 58:19
local endpoint and I can go and you can see another example of my beautiful UI here is amazing. For those not be able to see the screen you can see this is my zip code out here in Redmond. And yeah, we here I switched my whole system from using the real down to be to diamond be local. There wasn't even aspire constructs yet for it. But yet we were able to even to add it because this fire is releasable to add these containers and stuff on so super whirlwind tour there, but I did it I still have a minute to spare. So
Brandon Minnick 58:49
to cool to cool. Getting guys, David norm, thank you so much for joining us. Thank you for everything you do for the dotnet community. It's incredible being a dotnet developer myself and selfishly I love seeing it growing and it's everything my life gets easier every year. David, for folks who want to follow along where can they find you online?
David Fowler 59:10
Oh, I'm on Twitter slash x slash whatever you want to call it. As David fell Mastodon every single, every single site you could imagine it in with with a feed threads that same name. So amazingly on their norm,
Brandon Minnick 59:28
we can find on similar occasions as socket norm, is that correct?
Norm Johanson 59:33
Pretty much yeah. Mostly I am kind of lazy in Twitter is about as much effort as I can put into.
Brandon Minnick 59:42
That's okay. Well, thanks again so much for coming on, guys. And thank you for joining us. Thanks for watching. Don't forget to subscribe to the AWS Twitch channel so you never miss an episode. We're back here. The dotnet on AWS show airs every other Monday at 8am Pacific. We also released this as an odd Your podcasts so make sure to find the dotnet on AWS show and your favorite podcast app give us a like give us a review give us a recommendation there so more folks can find it and with that we'll see everybody in two weeks
Continue to The .NET on AWS Show, featuring Nick Chapsas!
Any opinions in this post are those of the individual author and may not reflect the opinions of AWS.