Skip to main content

Search the Dev Center

Search tutorials, templates, examples, and more.

Routes in API Gateway

Demonstration of API Gateway routes

This example lives in the pulumi/examples repository. Check out just this directory to use it:

Get started with this example
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examples
git -C pulumi-examples sparse-checkout set aws-apigateway-go-routes
cd pulumi-examples/aws-apigateway-go-routes

This example creates an API Gateway which responds to requests using different sources:

  1. Static files from a directory
  2. Lambda Function
  3. HTTP Proxy

When you’re finished, you’ll be familiar with how to configure routes in API Gateway using the RestAPI.

Prerequisites#

  1. Install Pulumi
  2. Configure AWS credentials
  3. Install Go

Deploying the example#

  1. Create a new stack:

    Terminal window
    pulumi stack init
  2. Set the AWS region to deploy into:

    Terminal window
    pulumi config set aws:region us-east-2
  3. Install dependencies:

    Terminal window
    go mod download
  4. Build the Lambda handlers:

    Terminal window
    make
  5. Deploy the stack:

    Terminal window
    pulumi up

Test your API#

Use the example CURL commands to test the API responses.

Terminal window
curl -w '\n' "$(pulumi stack output url)static"
<h1>Hello Pulumi!</h1>
curl -w '\n' "$(pulumi stack output url)lambda"
Hello, API Gateway!
python3 -m webbrowser "$(pulumi stack output url)proxy"
# Opens a page looking like Google in your browser
curl -w '\n' "$(pulumi stack output url)swagger"
{
"uuid": ...
}
curl -w '\n' -H "Authorization: HEADER.PAYLOAD.SIGNATURE" "$(pulumi stack output url)cognito-authorized"
{"message":"Unauthorized"}
curl -w '\n' -H "Authorization: goodToken" "$(pulumi stack output url)lambda-authorized"
Hello, API Gateway!
curl -w '\n' -H "Authorization: badToken" "$(pulumi stack output url)lambda-authorized"
{"message": "404 Not found" }
curl -w '\n' "$(pulumi stack output url)lambda-authorized" # No token
{"message":"Unauthorized"}
curl -w '\n' "$(pulumi stack output swagger-url)"
{
"uuid": ...
}
curl -w '\n' -H "x-api-key: $(pulumi stack output apiKeyValue --show-secrets)" "$(pulumi stack output url)key-authorized"
Hello, API Gateway!

Testing a valid Cognito token is a little more involved.

  1. Create a random password

    Terminal window
    PASSWORD=$(curl -s https://www.passwordrandom.com/query?command=password&scheme=Llnn%23rrrrrrrrrr)
  2. Create a user

    Terminal window
    aws cognito-idp sign-up --region $(pulumi config get aws:region) --client-id $(pulumi stack output user-pool-client-id) --username "test@domain.example" --password "$PASSWORD"
  3. Confirm the user’s account

    Terminal window
    aws cognito-idp admin-confirm-sign-up --region $(pulumi config get aws:region) --user-pool-id $(pulumi stack output user-pool-id) --username "test@domain.example"
  4. Authenticate to create a new session:

    Terminal window
    TOKEN=$(aws cognito-idp admin-initiate-auth --region $(pulumi config get aws:region) --user-pool-id $(pulumi stack output user-pool-id) --client-id $(pulumi stack output user-pool-client-id) --auth-flow ADMIN_NO_SRP_AUTH --auth-parameters "{\"USERNAME\":\"test@domain.example\",\"PASSWORD\":\"$PASSWORD\"}")
  5. Perform authenticated request

    Terminal window
    curl -w '\n' -H "Authorization: $(echo $TOKEN | jq '.AuthenticationResult.IdToken' -r)" "$(pulumi stack output url)cognito-authorized"
    Hello, API Gateway!

Fetch and review the logs from the Lambda executions:

Terminal window
pulumi logs

Set up a custom domain#

Before you can set up a custom domain you must register a domain name with Route 53.

Configure the stack with your custom DNS information:

Terminal window
pulumi config set domain subdomain.acmecorp.example
pulumi config set dns-zone acmecorp.example

Deploy your stack:

Terminal window
pulumi up
...
Type Name Plan
pulumi:pulumi:Stack aws-apigateway-ts-routes-dev
+ ├─ pulumi:providers:aws usEast1 create
+ ├─ aws:acm:Certificate ssl-cert create
+ ├─ aws:route53:Record ssl-cert-validation-dns-record create
+ ├─ aws:acm:CertificateValidation ssl-cert-validation create
+ ├─ aws:apigateway:DomainName api-domain-name create
+ ├─ aws:route53:Record api-dns create
+ └─ aws:apigateway:BasePathMapping api-domain-mapping create

Test your API is now available on your custom domain:

Terminal window
curl -w '\n' "$(pulumi stack output customUrl)static"

Cleaning up#

Once you’re finished experimenting, you can destroy your stack and remove it to avoid incurring any additional cost:

Terminal window
pulumi destroy
pulumi stack rm

Summary#

In this tutorial, you deployed an API with different route configurations. Now you can use these patterns to build real APIs which connect to other services.

Related

The infrastructure as code platform for any cloud.