如何使用 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 调用。见图:.