AWS Classic

v4.30.0 published on Tuesday, Nov 30, 2021 by Pulumi

NGINX on AWS ECS Fargate using Go IaC

View Code Deploy

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.

Prerequisites

Running the Example

Clone this repo and cd into it.

Next, to deploy the application and its infrastructure, follow these steps:

  1. Create a new stack, which is an isolated deployment target for this example:

    $ pulumi stack init dev
    
  2. Set your desired AWS region:

    $ pulumi config set aws:region us-east-1 # any valid AWS region will work
    
  3. Deploy everything with a single pulumi up command. 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.

  4. 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
    
  5. 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),
    

    Running pulumi up will show you the delta and then, after confirming, will deploy just those changes:

    $ pulumi up
    

    Notice that pulumi up redeploys 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
    
  6. Once you are done, you can destroy all of the resources, and the stack:

    $ pulumi destroy
    $ pulumi stack rm