如何使用 AWS Elastic Beanstalk 多 docker 容器?
How to use AWS Elastic Beanstalk multi docker containers?
我正在尝试在 Elastic Beanstalk 中创建一个包含两个容器(后端和前端)的环境。
docker-compose.yml
version: '3.0'
services:
my_api:
image: "850977987151.dkr.ecr.sa-east-1.amazonaws.com/my-api:latest"
environment:
ASPNETCORE_ENVIRONMENT: Staging
ports:
- "9901:80"
volumes:
- "./Logs:/app/Data/Logs"
my_app:
image: "850977987151.dkr.ecr.sa-east-1.amazonaws.com/my-app:latest"
ports:
- "80:80"
发布工作正常,但我的前端 (angular) 应用程序无法使用端口 9901 上的 api。
错误:
localhost:9901/UserConfiguration/GetAll:1 Failed to load resource:
net::ERR_CONNECTION_REFUSED
如果我访问我的 EC2 实例并且 运行:
curl http://localhost:9901/UserConfiguration/GetAll
正常工作!
appsettings.json 上的 CorsOrigins 配置:
"ServerRootAddress": "http://localhost:9901",
"ClientRootAddress": "http://myappqa-env.eba-xasnmn7n.sa-east-1.elasticbeanstalk.com",
"CorsOrigins": "http://myappqa-env.eba-xasnmn7n.sa-east-1.elasticbeanstalk.com,http://localhost"
}
Angular appconfig.json:
"remoteServiceBaseUrl": "http://localhost:9901"
我做错了什么?
编辑
即使我在我的 API 中允许任何来源,如下面的代码,我仍然有同样的错误。
services.AddCors(
options => options.AddPolicy(
_defaultCorsPolicyName,
builder => builder
//.WithOrigins(
// // App:CorsOrigins in appsettings.json can contain more than one address separated by comma.
// _appConfiguration["App:CorsOrigins"]
// .Split(",", StringSplitOptions.RemoveEmptyEntries)
// .Select(o => o.RemovePostFix("/"))
// .ToArray()
//)
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
)
);
由于服务 运行 在 docker 网络中,因此您应该使用服务名称和容器端口从一个服务连接到另一个服务,例如“my_api:80” .端口 9901 是容器主机(EC2 实例)上的端口。服务本身 运行 在不同的网络中,即 docker 网络。
我有一个用于测试的应用程序,它具有类似的架构(Angular UI + 应用程序服务器)here. I have a compose file,可以很好地与 Beanstalk 配合使用。我不清楚的一件事是...调用 localhost 的 angular/JS 代码是什么?如果是这种情况,如果它是 运行 客户端,它怎么能工作(这可以解释为什么如果你 ssh 进入实例并且 运行 curl 针对本地主机它工作)。
可能完全不相关,但为了完整起见,它在我的应用程序中的工作方式是客户端代码连接到 window.location.href
(代表下载客户端代码的 URL)。我的 nginx 服务于 JS 代码而不是代理对 API 服务器的 API 调用。见图:.
我正在尝试在 Elastic Beanstalk 中创建一个包含两个容器(后端和前端)的环境。
docker-compose.yml
version: '3.0'
services:
my_api:
image: "850977987151.dkr.ecr.sa-east-1.amazonaws.com/my-api:latest"
environment:
ASPNETCORE_ENVIRONMENT: Staging
ports:
- "9901:80"
volumes:
- "./Logs:/app/Data/Logs"
my_app:
image: "850977987151.dkr.ecr.sa-east-1.amazonaws.com/my-app:latest"
ports:
- "80:80"
发布工作正常,但我的前端 (angular) 应用程序无法使用端口 9901 上的 api。
错误:
localhost:9901/UserConfiguration/GetAll:1 Failed to load resource: net::ERR_CONNECTION_REFUSED
如果我访问我的 EC2 实例并且 运行:
curl http://localhost:9901/UserConfiguration/GetAll
正常工作!
appsettings.json 上的 CorsOrigins 配置:
"ServerRootAddress": "http://localhost:9901",
"ClientRootAddress": "http://myappqa-env.eba-xasnmn7n.sa-east-1.elasticbeanstalk.com",
"CorsOrigins": "http://myappqa-env.eba-xasnmn7n.sa-east-1.elasticbeanstalk.com,http://localhost"
}
Angular appconfig.json:
"remoteServiceBaseUrl": "http://localhost:9901"
我做错了什么?
编辑
即使我在我的 API 中允许任何来源,如下面的代码,我仍然有同样的错误。
services.AddCors(
options => options.AddPolicy(
_defaultCorsPolicyName,
builder => builder
//.WithOrigins(
// // App:CorsOrigins in appsettings.json can contain more than one address separated by comma.
// _appConfiguration["App:CorsOrigins"]
// .Split(",", StringSplitOptions.RemoveEmptyEntries)
// .Select(o => o.RemovePostFix("/"))
// .ToArray()
//)
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
)
);
由于服务 运行 在 docker 网络中,因此您应该使用服务名称和容器端口从一个服务连接到另一个服务,例如“my_api:80” .端口 9901 是容器主机(EC2 实例)上的端口。服务本身 运行 在不同的网络中,即 docker 网络。
我有一个用于测试的应用程序,它具有类似的架构(Angular UI + 应用程序服务器)here. I have a compose file,可以很好地与 Beanstalk 配合使用。我不清楚的一件事是...调用 localhost 的 angular/JS 代码是什么?如果是这种情况,如果它是 运行 客户端,它怎么能工作(这可以解释为什么如果你 ssh 进入实例并且 运行 curl 针对本地主机它工作)。
可能完全不相关,但为了完整起见,它在我的应用程序中的工作方式是客户端代码连接到 window.location.href
(代表下载客户端代码的 URL)。我的 nginx 服务于 JS 代码而不是代理对 API 服务器的 API 调用。见图: