[![Deploy](../.buttons/deploy-with-pulumi-dark.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/aws-apigateway-go-routes/README.md#gh-light-mode-only)
[![Deploy](../.buttons/deploy-with-pulumi-light.svg)](https://app.pulumi.com/new?template=https://github.com/pulumi/examples/blob/master/aws-apigateway-go-routes/README.md#gh-dark-mode-only)
# Routes in API Gateway
This example create 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](https://www.pulumi.com/docs/get-started/install/)
2. [Configure AWS Credentials](https://www.pulumi.com/docs/intro/cloud-providers/aws/setup/)
3. [Install Go](https://www.pulumi.com/docs/intro/languages/go/)
## Deploy the App
### Step 1: Create a directory and cd into it
For Pulumi examples, we typically start by creating a directory and changing into it. Then, we create a new Pulumi project from a template. For example, `azure-javascript`.
1. Install prerequisites:
```bash
go install
```
2. Make Lambda handlers:
```bash
make
```
3. Create a new Pulumi stack:
```bash
pulumi stack init
```
4. Configure the AWS region to deploy into:
```bash
pulumi config set aws:region us-east-2
```
5. Deploy the Pulumi stack:
```bash
pulumi up
```
### Step 2: Test your API
Use the example CURL commands to test the API responses.
```bash
$ curl -w '\n' "$(pulumi stack output url)static"
Hello Pulumi!
$ 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
```bash
PASSWORD=$(curl -s https://www.passwordrandom.com/query?command=password&scheme=Llnn%23rrrrrrrrrr)
```
2. Create a user
```bash
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
```bash
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:
```bash
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
```bash
$ 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:
```bash
pulumi logs
```
### Set Up Custom DNS
Before you can set up a custom domain you must [register a domain name with Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html).
Configure the stack with your custom DNS information:
```bash
pulumi config set domain subdomain.acmecorp.example
pulumi config set dns-zone acmecorp.example
```
Deploy your stack:
```bash
$ 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:
```bash
curl -w '\n' "$(pulumi stack output customUrl)static"
```
## Clean Up
Once you're finished experimenting, you can destroy your stack and remove it to avoid incurring any additional cost:
```bash
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.