- nginx + expressをfargateに詰め込む
- unix socket を使って繋ぐ
- expressは4プロセス立ち上げる
- node clusterは使わないパターン、socketが競合してしまったので。
- 共通ボリュームにapi1.sock - api4.sockを設定して、nginxからupstreamする
api
共通ボリュームをVolumeにしておく
VOLUME /usr/src/tmp
sockのパスを環境変数で指定させる
main.js
const sock = process.env.SOCK_PATH;
app.listen(sock, () => {
fs.chmodSync(sock, '666');
console.log(`Server running on ${sock} with pid ` + process.pid);
});
nginx
api1.sock - api4.sockへupstreamする
nginx.conf
upstream api {
server unix:///usr/src/tmp/api_1.sock;
server unix:///usr/src/tmp/api_2.sock;
server unix:///usr/src/tmp/api_3.sock;
server unix:///usr/src/tmp/api_4.sock;
}
server {
listen 80 default;
listen [::]:80;
location / {
proxy_pass http://api;
break;
}
}
タスク定義
ECSタスク定義で、繋ぐ
task-define.json
{
"containerDefinitions": [
{
"name": "nginx",
"portMappings": [
{ "hostPort": 80, "protocol": "tcp", "containerPort": 80 }
],
"mountPoints": [
{
"readOnly": true,
"containerPath": "/usr/src/tmp",
"sourceVolume": "etc"
}
]
},
{
"name": "api1",
"mountPoints": [
{ "containerPath": "/usr/src/tmp", "sourceVolume": "etc" }
],
"environment": [
{ "name": "SOCK_PATH", "value": "/usr/src/tmp/api_1.sock" }
]
},
{
"name": "api2",
"mountPoints": [
{ "containerPath": "/usr/src/tmp", "sourceVolume": "etc" }
],
"environment": [
{ "name": "SOCK_PATH", "value": "/usr/src/tmp/api_2.sock" }
]
},
{
"name": "api3",
"mountPoints": [
{ "containerPath": "/usr/src/tmp", "sourceVolume": "etc" }
],
"environment": [
{ "name": "SOCK_PATH", "value": "/usr/src/tmp/api_3.sock" }
]
},
{
"name": "api4",
"mountPoints": [
{ "containerPath": "/usr/src/tmp", "sourceVolume": "etc" }
],
"environment": [
{ "name": "SOCK_PATH", "value": "/usr/src/tmp/api_4.sock" }
]
}
],
"volumes": [{ "name": "etc" }],
}