Amazon Elastic Container Service(ECS) là một service quản lý container có tính mở rộng cao và nhanh. Dễ dàng run, stop, hay quản lý docker container ở trong một cluster. Bạn có thể host một serverless infrastructure bằng cách chạy service hay task sử dụng Fragate launch type.
Tạo 1 ECS chạy laravel project, để làm được việc này bạn cần đọc thêm docker compose và cài đặt AWS CLI. Để tạo 1 ecs chạy 1 project laravel chúng t sẽ cần làm lần lượt các bước sau
Để đẩy được image lên ECR chúng ta cần cài đặt AWS CLI. Sau đó đăng nhập ECR với AWS CLI
# Login AWS ECR sử dụng profile
aws ecr get-login-password --region [region] --profile [profile] | docker login --username AWS --password-stdin [account-id].dkr.ecr.[region].amazonaws.com
# Login AWS ECR không sử dụng profile
aws ecr get-login-password --region [region] | docker login --username AWS --password-stdin [account-id].dkr.ecr.[region].amazonaws.com
# Login success
➜ ~ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 056663857946.dkr.ecr.us-east-1.amazonaws.com
Login Succeeded
Tạo ECR bằng AWL CLI sử dụng command sau.
// Create image laravel fpm
aws ecr create-repository --repository-name laravel-fpm --region us-east-1
{
"repository": {
"repositoryArn": "arn:aws:ecr:us-east-1:056663857946:repository/laravel-fpm",
"registryId": "056663857946",
"repositoryName": "laravel-fpm",
"repositoryUri": "056663857946.dkr.ecr.us-east-1.amazonaws.com/laravel-fpm",
"createdAt": "2022-09-15T21:32:46+07:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}
// Create image nginx
aws ecr create-repository --repository-name laravel-nginx --region us-east-1
{
"repository": {
"repositoryArn": "arn:aws:ecr:us-east-1:056663857946:repository/laravel-nginx",
"registryId": "056663857946",
"repositoryName": "laravel-nginx",
"repositoryUri": "056663857946.dkr.ecr.us-east-1.amazonaws.com/laravel-nginx",
"createdAt": "2022-09-15T21:34:16+07:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}
Hoặc tạo ECR bằng cách đăng nhập AWS console.
Kiểm tra ECR được tạo bằng cách đăng nhập aws console
Chú ý: URI của image được dùng để push image lên ECR repo, khai báo image trong task definitions
Build docker image để đẩy lên ecr, khai báo image:[repositoryUri]
vào trong file docker-compose.yml
version: '3.4'
networks:
backend:
driver: bridge
services:
nginx:
image: 056663857946.dkr.ecr.us-east-1.amazonaws.com/laravel-nginx
build:
context: .
dockerfile: docker/app/Dockerfile.nginx
args:
PHP_FPM_SERVER: app
PHP_FPM_PORT: 9000
ports:
- 80:80
- 443:443
volumes:
- ./docker/nginx/conf.d:/etc/nginx/conf.d
- .:/var/www/
links:
- app
depends_on:
- app
networks:
- backend
app:
image: 056663857946.dkr.ecr.us-east-1.amazonaws.com/laravel-fpm
build:
context: .
dockerfile: docker/app/Dockerfile
volumes:
- .:/var/www/
networks:
- backend
volumes:
db-data:
Build image với docker-compose
# Build Laravel-fpm
docker-compose build app
# Push image lên ECR
ocker-compose push app
# Build nginx
docker-compose build nginx
# Push image lên ECR
ocker-compose push nginx
# Build, push image with docker
docker build -t laravel-nginx -f docker/app/Dockerfile.nginx .
docker tag laravel-nginx:latest [account-id].dkr.ecr.[region].amazonaws.com/laravel-nginx:latest
docker push [account-id].dkr.ecr.[region].amazonaws.com/laravel-nginx:latest
Như vậy là chúng ta đã tạo và push được image lên ECR.
Tạo Task Definitions khai báo các container sẽ sử dụng, mình sẽ thiết lập 2 container là laravel-fpm và laravel-nginx.
Tạo task definitions, ở ví dụ demo này mình chọn launch type compatibility là EC2.
Thêm laravel-fpm vào task definition
Định nghĩa tên container, image là repo uri trong ECR, thiết lập memory, mapping post giữa host và container, dùng php-fpm nên post là 9000.
Thêm laravel-nginx vào task definition
Thiết lập container name, image, memory, mapping post cho nginx là 80, setting thêm networking giữa laravel-nginx container và laravel-fpm(container:service_name).
Thiết lập CloudWatch Logs
Như vậy là đã thiết lập xong task definition, ấn create để tạo.
Tiếp theo cần create clusters
Chọn cluster type là EC2
Thiết lập cluster, chọn instance type là t2.micro, bỏ qua load balancer, auto scale, để giảm chi phí
Create cluster success, các service aws trong hình bên dưới cũng được thiết lập.
Tạo service chạy task definition
Thiết lập service
Kiểm tra service có chạy thành công không? Khi service chạy thành công tất cả các aws service liên quan sẽ được tạo.
Kiểm tra instance được tạo. Nếu bạn muốn access vào ec2 check các container run, cần thêm security group cho phép access qua post 22 từ bên ngoài, tham khảo bài viết về Aws ec2
Kiêm tra laravel project chạy thành công
Như vậy là chúng ta đang deploy 1 project laravel thành công sử dụng ecs.
Để xoá ECS vừa tạo, chúng ta cần xoá bỏ service, cluster, task definition. Khi ecs được xoá, tất cả các aws service liên quan cũng được xoá.
Remove cluster
Remove task definition
Như vậy chúng ta đã deploy được project laravel sử dụng aws ecs. Ngoài ra để tìm hiểu thêm về aws ecs chúng ta sẽ đọc document của aws ecs trên aws.