編集:最初の質問は、「Fargateを使用してAWS ECSのタスク定義内のコンテナーをリンクする方法」でした。しかし、私は最初から間違っているかもしれないので、質問を変更して以下の内容を保持します:
ECS経由でAWSにシンプルなLaravelベースのアプリをデプロイしようとしています。私のサービスはdocker-compose-ymlファイルを使用してローカルで期待どおりに機能します。
しかしAWSでは次のようになります:"nginx: [emerg] Host not found in upstream "app" in /etc/nginx/conf.d/default.conf:12"
Webコンテナーログから。
ここに私のサービスのコンテナー:web(nginx)、app(Laravel)、データベース(MySQL)、キャッシュ(redis)。
タスクの説明のすべてのコンテナーが同じ名前空間を共有しているため、コンテナーをリンクする必要がないことを理解しています(とにかく、Fargateでリンク属性を使用することはできません)。
ここで問題を見つけるのを手伝ってもらえますか?わたしは目が見えない。
ここで私の作業中のローカルdocker-compose.ymlファイル:
version: '2'
services:
# The Application
app:
image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ALi-
maison/tribe-migrate
volumes:
- /var/www/storage
env_file: '.env'
environment:
- "DB_Host=database"
- "REDIS_Host=cache"
# The Web Server
web:
image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ALi-maison/laravel-web
ports:
- 80:80
# The Database
database:
image: mysql:5.6
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=Homestead"
- "MYSQL_USER=Homestead"
- "MYSQL_PASSWORD=secret"
- "MYSQL_ROOT_PASSWORD=secret"
# redis
cache:
image: redis:3.0-Alpine
volumes:
dbdata:
ここに私のWebコンテナDockerfile:
FROM nginx:1.10
ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
そして私のvhost.conf:
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
解決策は次のとおりです。
2番目の部分については上記で説明しましたが、両方のコンテナーが同じタスクである必要があるとは明確に言われていませんでした。
ここで見つけることができる詳細情報: https://github.com/aws-samples/Amazon-ecs-fargate-aspnetcore/blob/master/README.md
Vhost.confから:
fastcgi_pass app:9000;
ホスト名「app」はdocker-composeで機能します。これは、docker-compose.ymlでサービスに名前を付けたためです。 docker-composeは、管理する必要のあるコンテナーの新しいネットワークを作成します。そのネットワークにより、コンテナーはホスト名で相互に参照でき、それ以上の構成は必要ありません。
Fargateにはこの機能がないため、「アプリ」は解決されません。
Fargateが現在使用できる唯一のネットワークモードは、 awsvpc と呼ばれる特別なAWSモードです。 Fargateで実行されている各タスクは独自のElastic Network Interface(ENI)を取得します。つまり、各タスクは独自のプライベートIPアドレスを取得します。さらに、EC2インスタンスのENIと同様に、パブリックIPアドレスを持つようにENIを構成することもできます。
nginxコンテナーからアプリコンテナーを解決する方法
Fargateで、アプリサーバーの実行中のタスク定義にドリルダウンします([クラスター]> [タスク]タブ>アプリサーバーの[タスク]列でコンテナーIDをクリックします)。 NetworkセクションにはプライベートIPが含まれます。
Conf内のホスト名「app」をこのIPに置き換えます。
fastcgi_pass <private_ip>:9000;
これに遭遇する可能性のある他の人にとって、aws ecs fargateで同じタスクで実行されている2つのコンテナーを接続する同じ問題があり、vhost.confで 'app'を 'localhost'に置き換える必要があることがわかりました。 (これは別の回答のコメントの一部で言及されています)したがって、vhost.confは次のようになります。
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
また、ポート9000がマッピングされ、アプリコンテナーに公開されていることも確認しました(不要な場合があります)。
# The Application
app:
image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ALi-maison/tribe-migrate
volumes:
- /var/www/storage
env_file: '.env'
environment:
- "DB_Host=database"
- "REDIS_Host=cache"
ports:
- 9000:9000