42
Deploy Node.js + Express on Amazon ECS Fargate with AWS Copilot
Learn how to deploy Node.js Express to Amazon ECS Fargate using AWS Copilot.
AWS CLI and Copilot CLI are already installed and configured, and Docker Desktop for Mac is used for local testing.
- AWS CLI
$ aws --version
aws-cli/2.2.35 Python/3.8.0 Darwin/20.5.0 source/x86_64 prompt/off
- Copilot CLI
$ copilot --version
Copilot version: v1.13.0
- Docker Engine
$ docker --version
Docker version 20.10.11, build dea9396
- maOS 11.4
Create a working directory and set up Express to work with TypeScript.
$ mkdir copilot-express && cd copilot-express
$ npm init -y
$ npm install -D typescript ts-node @types/node @types/node @types/express
$ npm install express
$ npx tsc --init
$ touch index.ts
In the created index.ts
, we will start Express and define a GET request handler for /
.
import express from 'express';
import { Request, Response } from 'express';
const app = express();
const port = 3000;
app.get('/', (req: Request, res: Response) => res.send('Express app works!'));
app.listen(port, () => console.info(`Express listening on port ${port}!`));
Add "start": "ts-node index.ts"
to scripts in package.json.
{
"scripts": {
"start": "ts-node index.ts"
}
}
$ touch Dockerfile
FROM node:16
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
$ docker build -t copilot-express .
$ docker images | grep copilot-express
$ docker run -p 3000:3000 -d copilot-express
Access to http://localhost:3000 and if you see Express app works!
you're ready to go.
Copilot has three main concepts: Service, Environment, and Application.
"Service" is the application that runs in the container. In this case, we will create a Service named "api".
"Environment" is an environment such as test/staging/production. In this case, we will create an Environment named "test".
"Application" is a concept that combines Service and Environment. In this case, we will create an Application with the name "copilot-express".
In this case, we will have one Service, one Environment, and one Application.
Run copilot init
to initialize & deploy.
You will be asked several questions to answer.
$ copilot init
Note: It's best to run this command in the root of your Git repository.
Welcome to the Copilot CLI! We're going to walk you through some questions
To help you get set up with a containerized application on AWS. An application is a collection of
An application is a collection of containerized services that operate together.
What would you like to name your application? for help] copilot-express
Which workload type best represents your architecture? for more help].
Request-Driven Web Service (App Runner)
> Load Balanced Web Service (Internet to ECS on Fargate)
Backend Service (ECS on Fargate)
Worker Service (Events to SQS to ECS on Fargate)
Scheduled Job (Scheduled event to State Machine to Fargate)
What do you want to name this service? for help] api
Which Dockerfile would you like to use for api? [Use arrows to move, type to filter, ? for more help]
> ./Dockerfile
Enter custom path for your Dockerfile
Use an existing image instead
All right, you're all set for local development.
Would you like to deploy a test environment? for help] (y/N) y
After answering the questions, it will start to build the environment with IAM Role, Subnet, VPC, etc. Wait for a while.
After the environment is built, the Docker image will be pushed to ECR and deployment to ECS will start.
✔ Linked account AWS_ACCOUNT_ID and region ap-northeast-1 to application copilot-express..
✔ Proposing infrastructure changes for the copilot-express-test environment.
✔ Created environment test in region ap-northeast-1 under application copilot-express.
✔ Deployed service api.
Recommended follow-up action:
- You can access your service at http://xxxxx.ap-northeast-1.elb.amazonaws.com over the internet.
Access the URL displayed and if you see Express app works!
as you did locally, deployment is complete!
After confirming the operation and the status of the application actually being deployed to ECS.
Delete the Application created this time.
$ copilot app delete
Once I learned the concept of Copilot (similar to Beanstalk) and the steps, I found it to be a great way to deploy containers to ECS!
In actual production, Copilot will also include CI/CD and Sidecar pattern, so I'll be experimenting with that as well.
42