NGINX on AWS ECS Fargate using Go IaC
This example shows authoring Infrastructure as Code in the Go programming language. It provisions a full Amazon Elastic Container Service (ECS) “Fargate” cluster and related infrastructure, building a docker image, pushing it to ECR, and using it to run a web server accessible over the Internet on port 80. This example is inspired by Docker’s Getting Started Tutorial.
- Install Pulumi
- Configure Pulumi to Use AWS (if your AWS CLI is configured, no further changes are required)
- Install Go
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:
$ pulumi stack init dev
Set your desired AWS region:
$ 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!
$ pulumi up
After 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-go-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 created Outputs: url: "web-lb-651d804-400248986.us-west-2.elb.amazonaws.com" Resources: + 11 created Duration: 3m41s Permalink: https://app.pulumi.com/acmecorp/aws-go-fargate/dev/updates/1
Notice 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:
$ curl http://$(pulumi stack output url) 42 $ curl http://$(pulumi stack output url) 19 $ curl http://$(pulumi stack output url) 88
Try making some changes, rebuilding, and rerunning
pulumi up. For example, let’s scale up to 5 instances:
- DesiredCount: pulumi.Int(3), + DesiredCount: pulumi.Int(5),
pulumi upwill show you the delta and then, after confirming, will deploy just those changes:
$ pulumi up
pulumi upredeploys just the parts of the application/infrastructure that you’ve edited.
Updating (dev): Type Name Status Info pulumi:pulumi:Stack aws-go-fargate-dev ~ └─ aws:ecs:Service app-svc updated [diff: ~desiredCount] Outputs: url: "web-lb-651d804-400248986.us-west-2.elb.amazonaws.com" Resources: ~ 1 updated 9 unchanged Duration: 5s Permalink: https://app.pulumi.com/acmecorp/aws-go-fargate/dev/updates/2
Once you are done, you can destroy all of the resources, and the stack:
$ pulumi destroy $ pulumi stack rm