AWS Fargate 部署 [1]

不知道為啥拿現成image都沒辦法成功部署上去…
只好自己build一個QQ

這邊先開好一個folder
然後建立好laravel專案

1
2
3
mkdir ecr-test
cd ecr-test
composer create-project laravel/laravel project--name --prefer-dist

然後建立nginx的config ecr.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
server {
listen 80;
root /var/www/html/public;
index index.php;
location / {
# 先 try_files 確認是否有靜態文件存在,若沒有則將請求重寫為 index.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;

# optionally set the value of the environment variables used in the application
# fastcgi_param APP_ENV prod;
# fastcgi_param APP_SECRET <app-secret-id>;
# fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name";
# for more information).
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/index.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ \.php$ {
return 404;
}
location ~ /\.ht {
deny all;
}
}


建立Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 這個 Docker image 的基礎映像
FROM ubuntu:latest
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y dialog apt-utils -y
RUN apt-get install -y tzdata
# 因為 php 需要設定時區,然而因為 docker 建構時無法輸入。
# 因此利用 tzdata 來幫我們完成這個設定時區。
RUN ln -fs /usr/share/zoneinfo/ROC /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata
# 安裝 nginx 以及 php-fpm 及其相關的 php-module。
RUN apt-get install -y nginx php7.2-fpm php-mysql php php7.2-redis composer php7.2-xml php7.2-dom php7.2-curl php7.2-mbstring php7.2-zip
# 將 ecr.conf 複製到 nginx config 文件的指定位置。
ADD ecr.conf /etc/nginx/sites-available/ecr.conf
# 將 ecr.conf 複製到 sites-enabled 文件夾,使這個配置文件能被讀取到。
RUN ln -s /etc/nginx/sites-available/ecr.conf /etc/nginx/sites-enabled/
# 將 default 的配置文件從 sites-enabled 中移除。
RUN unlink /etc/nginx/sites-enabled/default
# 關閉 nginx 的 daemon 模式。
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
# 關閉 php-fpm 的 daemon 模式
RUN sed -i -e "s/;\?daemonize\s*=\s*yes/daemonize = no/g" /etc/php/7.2/fpm/php-fpm.conf
# 將 php 的時區設定為 Asia/Taipei
RUN sed -i -e "s/;\?date.timezone\s*=\s*.*/date.timezone = Asia\/Taipei/g" /etc/php/7.2/fpm/php.ini
# 暴露 80 連接埠
EXPOSE 80
# 將 ecr 的 laravel 專案複製到 Docker 中並將工作目錄切至其中。
ADD laravel /var/www/html
WORKDIR /var/www/html
# 安裝 composer 套件
RUN composer install
# 更新網站資料夾的擁有者
RUN chown www-data:www-data -R /var/www/html
# 移除預設的 index.html
RUN rm /var/www/html/index.nginx-debian.html
# 設定容器啟動時的指令
ENTRYPOINT service php7.2-fpm start && nginx

執行建立docker image

1
2
docker build -t ecr-test .
docker run -d --name ecrtestnginx -p 8080:80 ecr-test

建立完之後連去 http://localhost:8080 查看一下有沒有成功

如果看到成功建立的話就可以準備推上ECR


推上ecr

這邊用ap-southeast-1區來示範

Create ECR repository

1
aws --region ap-southeast-1 ecr create-repository --repository-name ecr-test

打tag

1
docker tag ecr-test 123456789123.dkr.ecr.ap-southeast-1.amazonaws.com/ecr-test

登入ECR 並push image

1
2
3
eval $(aws --region ap-southeast-1 ecr get-login --no-include-email)

docker push 123456789123.dkr.ecr.ap-southeast-1.amazonaws.com/ecr-test


部署Fargate

建立Loadbalance 和Fargate app

1
2
3
fargate --region ap-southeast-1 lb create ecr-test-lb --port 80

fargate --region ap-southeast-1 service create ecr-test-app --lb ecr-test-lb --image 123456789123.dkr.ecr.ap-southeast-1.amazonaws.com/ecr-test --port 80 --num 1

部署後可以查詢狀態


fargate狀態查詢及刪除

狀態查詢

1
2
3
fargate --region ap-southeast-1 service list

fargate --region ap-southeast-1 service info ecr-test

刪除fargate app/Loadbalancer

1
2
3
4
5
fargate --region ap-southeast-1 service scale ecr-test-app 0

fargate --region ap-southeast-1 service destroy ecr-test-app

fargate --region ap-southeast-1 lb destroy ecr-test-lb

Reference

ECS on Fargate自動化部署(1) — 利用 docker 打包應用程式並發佈至 AWS ECR

Laravel with php7-apache