LazyStack

Building the PetStore Solution

In this lesson step we will build the initial PetStore solution using the .NET LazyStack tool configured as a Visual Studio Tool.

This tutorial assumes you are using the Mac Visual Studio IDE.

2.1 Create PetStore solution

  1. Configure your developer workstation with Visual Studio IDE for Mac.
  2. Launch Visual Studio.
  3. Click on New project. The "Choose a template for your new project" dialog appears.
  4. Click on "Web and Console → App.
  5. Select API under the ASP.NET Core and click the Next button. The first "Configure your new API" page appears.
  6. Select .NET6 for the target framework, No Authentication and Configure for HTTPS.
  7. Click the Next button. The next "Configure your new API" page appears.
  8. Enter "PetStore" as the Project Name.
  9. Keep "PetStore" as the Solution Name.
  10. Edit the Location to point to the LazyStackTutorial folder.
  11. Check the checkbox "Create a project directory within the solution directory."
  12. Click on the Create button. A solution with your PetStore WebApi project is created.
  13. Open the project file and replace its content with the following:
    To edit a project file, right click on the project name in the solution explorer and select "Edit Project File" from the context menu.
    
    <Project Sdk="Microsoft.NET.Sdk.Web">
        <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Product>LazyStackWebApi Template</Product>
        <Description>A WebApi template compatible with LazyStack for local debugging of lambda functions</Description>
        </PropertyGroup>
        <ItemGroup>
        <PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.2" />
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
        </ItemGroup>
    </Project>
  14. Download ConfigureSvcs.cs and place it into the PetStore project folder.
  15. Edit the WebApi project to use ConfigureSvcs.cs.
      Edit PetStore\Startup.cs and replace it's content with the following: Note line number 29 - which we add to the standard startup to "hook" in service registrations generated by LazyStack.
      using Microsoft.AspNetCore.Builder;
      using Microsoft.AspNetCore.Hosting;
      using Microsoft.AspNetCore.Http;
      using Microsoft.Extensions.Configuration;
      using Microsoft.Extensions.DependencyInjection;
      using Microsoft.Extensions.Hosting;
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Threading.Tasks;
      
      namespace PetStore
      {
          public partial class Startup
          {
      
              public Startup(IConfiguration configuration)
              {
                  Configuration = configuration;
              }
      
              public IConfiguration Configuration { get; }
      
      
              // This method gets called by the runtime. Use this method to add services to the container.
              // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
              public void ConfigureServices(IServiceCollection services)
              {
                  ConfigureSvcs(services);
                  services.AddControllers();
                  services.AddSwaggerGen(c =>
                  {
                      c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "PetStoreAPI", Version = "v1" });
                  });
              }
      
              // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
              public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
              {
                  if (env.IsDevelopment())
                  {
                      app.UseDeveloperExceptionPage();
                  }
      
                  app.UseRouting();
      
                  app.UseEndpoints(endpoints =>
                  {
                      endpoints.MapControllers();
                  });
      
                  app.UseSwagger();
                  app.UseSwaggerUI(c =>
                  {
                      c.SwaggerEndpoint("/swagger/v1/swagger.json", "PetStore V1");
                  });
      
                  app.Run(async (context) => await Task.Run(() => context.Response.Redirect("/swagger")));
      
              }
          }
      }
      
    • Delete the PetStore project Controllers folder.
    • Delete the WeatherForecast.cs file.
    • Select Visual Studio menuitem Build → Rebuild All. The solution compiles successfully.

2.2 Add External LazyStack Projects

  1. Add External LazyStackAuth project
    1. Right Click on the 'PetStore' solution, top of the screen, in the Solution Explorer pane. The context menu appears.
    2. Select "Add → Exiting Project ..". The Add Exiting Project dialog appears.
    3. Select LazyStackTutorial\LazyStack\LazyStackAuth\LazyStackAuth.csproj. The project is added to your solution.
  2. Add External LazyStackDynamoDBRepo project
    1. Right Click on "Solution 'PetStore' in the Solution Explorer pane. The context menu appears."
    2. Select "Add → Exiting Project ..". The Add Exiting Project dialog appears.
    3. Select LazyStackTutorial\LazyStack\LazyStackDynamoDBRepo\LazyStackDynamoDBRepo.csproj. The project is added to your solution.

Note: In a production application you may choose to use the corresponding NuGet packages instead of using these projects directly. In this tutorial it is useful to be able to debug into these projects to understand how their features are implemented.

2.3 Download PetStore.yaml and run LazyStack Generator

  1. Click to Download PetStore.yaml file
  2. Move PetStore.yaml from your Downloads folder to the PetStore Solution root folder.
  3. Select Visual Studio "Tools → LazyStack - Generate Projects". The following folders and projects are are created.
    • Controllers folder
      • OrderController project
      • PetController project
    • Lambdas folder
      • Order project
      • Pet project
    • "Solution Items" folder (files are in the solution's root folder)
      • LazyStack.yaml
      • LocalApis.json
      • PetStore.yaml
      • SAM_Review.yaml
    • Stacks folder
      • Dev folder
        • serverless.template
      • Test folder
        • serverless.template
      • Prod folder
        • serverless.template
    • PetStoreClientSDK project
    • PetStoreSchema project
  4. Add files in solution directory to Solution Items folder
    1. Right Click "PetStore" solution in solution explorer. The context menu appears.
    2. Select Add → Existing Files. The file picker dialog appears.
    3. In the PetStore solution directory, select newly added files:
      • Petstore.yaml
      • LazyStack.yaml
      • LocalApis.json
      • SAM_Review.yaml
    4. Click the Open button. A new solution explorer "Solution Items" folder is created containing the selected files.
  5. Add the serverless.template file and solution folders
    1. Right Click "PetStore" solution in the solution explorer. The context menu appears.
    2. Select "Add → Solution Folder". A folder called "New Folder" is inserted into the solution explorer.
    3. Edit the name of folder to "Stacks".
    4. Right Click on the "Stacks" folder. The context menu appears.
    5. Select "Add → Solution folder". A new folder called "New Folder" is inserted under the Stacks folder.
    6. Edit the name of the folder to "Dev"
    7. Right Click on the "Dev" folder. The context menu appears.
    8. Select "Add → Existing Files. The file picker window appears,.
    9. Select the "LazyStackTutorial/PetStore/Stacks/Dev/serverless.template" file.

2.4 Review the LazyStack.yaml file

The Generate Projects command created a default LazyStack.yaml file in your solution's root folder. The file is now visible in the "Solution Items" folder in the solution explorer. The top of the LazyStack.yaml file should look like this:


LazyStackDirectivesVersion: 1.1.0
Stacks:
  Dev:
    ProfileName: default
    RegionName: us-east-1
    StackName: PetStoreDev 
    Stage: Dev
    UriCodeTarget: Debug/net6.0
  Test:
    Stage: Test
    UriCodeTarget: Release/net6.0
  Prod:
    Stage: Prod
    UriCodeTarget: Release/net6.0
ProjectOptions: 
  NugetPackageVersions:
    Amazon.Lambda.AspNetCoreServer: 7.2.0
    AWSSDK.Extensions.NETCore.Setup: 3.7.2
    JsonSubTypes: 1.9.0
    LazyStackAuth: 3.0.0
    Newtonsoft.Json: 13.0.1
    Swashbuckle.AspNetCore: 6.4.0
    System.ComponentModel.Annotations: 5.0.0
    System.IdentityModel.Tokens.Jwt: 6.22.0
  ClientSDKProjects:
    PackageReferences:
      LazyStackAuth: ''
      System.ComponentModel.Annotations: ''
      JsonSubTypes: ''
      Newtonsoft.Json: ''
  SchemaProjects:
    PackageReferences:
      Newtonsoft.Json: ''
  LambdaProjects:
    Runtime: dotnet6
    PackageReferences:
      AWSSDK.Extensions.NETCore.Setup: ''
      Amazon.Lambda.AspNetCoreServer: ''
  WebApiProjects:
    PackageReferences:
      AWSSDK.Extensions.NETCore.Setup: ''
      Swashbuckle.AspNetCore: ''
  ControllerProjects:
    PackageReferences:
      System.IdentityModel.Tokens.Jwt: ''

2.5 Review the SAM_Review.yaml

The SAM_Review.yaml file was generated in the solution folder. This file contains the stack configuration without stack environment specific content inserted. Stack environments might include Dev, Test and Prod. Fully constituted templates are placed in the serverless.template files placed in the stack environment folder. For instance, the Stacks\Dev\serverless.template file is the template you will later use to publish the PetStoreDev stack to AWS.

You never edit the SAM_Review.yaml file directly.

  1. Open the Solution Items\SAM_Review.yaml file.
  2. Review contents. No need to understand all this content now.

The SAM_Review.yaml file will be updated with new content as we add and configure AWS stack resources during the tutorial. This file is regenerated each time you execute LazyStack -- Generate Projects.

2.6 Review serverless.template file

LazyStack Generate Projects process generates one serverless.template file for each environment. In this case, we are using the Stacks Environment called "Dev" and the serverless.template file generated in the Stacks\Dev folder.

You want to review the SAM template we will later publish to AWS. You never edit this file directly.

  1. Open the Stacks\Dev\serverless.template file.
  2. Review contents. No need to understand all this content now.

The serverless.template file will be updated with new content as we add and configure AWS stack resources during the tutorial. This file is regenerated each time you execute LazyStack -- Generate Projects.

Step Summary

In this lesson step we created a PetStore solution using the ASP.NET API project template, downloaded a OpenApi Specification called PetStore.yaml and then used the Tools → LazyStack - Generate Projects to generate projects and configuration files for our stack. We added solution folders to surface these configuration files in the Visual Studio solution explorer. We then updated the LazyStack.yaml file AWS ProfileName and RegionName.