Dockerized ASP.NET App on AWS ECS Fargate
An ASP.NET application running in AWS ECS Fargate, using C# infrastructure as code
This example lives in the pulumi/examples repository. Check out just this directory to use it:
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examplesgit -C pulumi-examples sparse-checkout set aws-cs-fargatecd pulumi-examples/aws-cs-fargateThis example defines a basic ASP.NET application and all of the infrastructure required to run it in AWS in C#.
This infrastructure includes everything needed to:
- Build and publish the ASP.NET application as a Docker container image
- Store images in a private Amazon Elastic Container Registry (ECR) repository
- Scale out 3 load-balanced replicas using Amazon Elastic Container Service (ECS) “Fargate”
- Accept Internet traffic on port 80 using Amazon Elastic Application Load Balancer (ELB)
This example is inspired by Docker’s and
ASP.NET’s Getting Started
tutorials. The result is a simple development experience and yet an end result that uses modern, production-ready AWS
infrastructure. ./Infra/Program.cs defines the project’s infrastructure.
Prerequisites#
- Install Pulumi
- Configure Pulumi to Use AWS (if your AWS CLI is configured, no further changes are required)
- Install .NET Core 3
- Install Docker
Running the Example#
Clone this repo and cd into it.
Next, to deploy the application and its infrastructure, follow these steps:
-
Create a new stack, which is an isolated deployment target for this example:
Terminal window pulumi stack init dev -
Set your desired AWS region:
Terminal window pulumi config set aws:region us-east-1 # any valid AWS region will work -
Deploy everything with a single
pulumi upcommand. This will show you a preview of changes first, which includes all of the required AWS resources (clusters, services, and the like). Don’t worry if it’s more than you expected — this is one of the benefits of Pulumi, it configures everything so that so you don’t need to!Terminal window pulumi upAfter being prompted and selecting “yes”, your deployment will begin. It’ll complete in a few minutes:
Updating (dev):Type Name Status+ pulumi:pulumi:Stack aws-cs-fargate-dev created+ ├─ aws:ec2:SecurityGroup web-sg created+ ├─ aws:ecs:Cluster app-cluster created+ ├─ aws:iam:Role task-exec-role created+ ├─ aws:elasticloadbalancingv2:TargetGroup web-tg created+ ├─ aws:ecr:Repository app-repo created+ ├─ docker:image:Image app-img created+ ├─ aws:iam:RolePolicyAttachment task-exec-policy created+ ├─ aws:ecs:TaskDefinition app-task created+ ├─ aws:elasticloadbalancingv2:LoadBalancer web-lb created+ └─ aws:ecs:Service app-svc createdOutputs:url: "http://web-lb-23139b7-1806442625.us-east-1.elb.amazonaws.com"Resources:+ 11 createdDuration: 3m41sPermalink: https://app.pulumi.com/acmecorp/aws-cs-fargate/dev/updates/1Notice that the automatically assigned load-balancer URL is printed as a stack output.
-
At this point, your app is running — let’s curl it. The CLI makes it easy to grab the URL:
Terminal window curl $(pulumi stack output url)Hello World! -
Try making some changes and rerunning
pulumi up.If you just change the application code, and deploy the results, for example, only the Docker image will be updated and rolled out. Try changing
"Hello World!"inside ofApp/Startup.csto"Hello Pulumi!":Terminal window pulumi upUpdating (dev):Type Name Plan Infopulumi:pulumi:Stack aws-cs-fargate-dev+- ├─ aws:ecs:TaskDefinition app-task replaced [diff: ~containerDefinitions]~ ├─ aws:ecs:Service app-svc updated [diff: ~taskDefinition]└─ docker:image:Image app-imgResources:~ 1 updated+-1 replaced2 changes. 9 unchangedNotice that
pulumi upredeploys just the parts of the application/infrastructure that you’ve edited.Now the endpoint will run the newly updated application code:
Terminal window curl $(pulumi stack output Url)Hello Pulumi! -
Once you are done, you can destroy all of the resources, and the stack:
Terminal window pulumi destroypulumi stack rm