适用于AWS ECS的ASP.NET Core需要VIRTUAL_HOST

时间:2017-07-28 13:27:33

标签: amazon-web-services docker asp.net-core amazon-ecs

我将ASP.NET Core Web API应用程序作为docker镜像部署到AWS ECS,因此请使用任务定义文件。

事实证明,只有当我使用我的EC2实例的公共DNS指定环境变量VIRTUAL_HOST时,该应用才有效(如此处突出显示:http://docs.servicestack.net/deploy-netcore-docker-aws-ecs),请参阅下面的taskdef.json

{ "family": "...", "networkMode": "bridge", "containerDefinitions": [ { "image": "...", "name": "...", "cpu": 128, "memory": 256, "essential": true, "portMappings": [ { "containerPort": 80, "hostPort": 0, "protocol": "http" } ], "environment": [ { "name": "VIRTUAL_HOST", "value": "ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com" } ] } ] }

将应用程序部署到AWS ECS后,我点击了端点 - 例如http://ec2-xx-xxx-xxx-xxx.compute-1.amazonaws.com/v1/ping

  • VIRTUAL_HOST中使用我的EC2实例的实际公共DNS一切正常
  • 没有env变量我得到" 503服务暂时不可用"来自nginx / 1.13.0
  • 如果我将一个空字符串添加到VIRTUAL_HOST我会得到一个" 502 Bad Gateway"来自nginx / 1.13.0。

现在,我想避免在taskdef文件中指定虚拟主机 - 这可能吗?我的问题是ASP.NET核心相关还是nginx相关?

1 个答案:

答案 0 :(得分:0)

Amazon ECS拥有使用Amazon S3的秘密管理系统。您必须在ECS界面中创建一个秘密,然后您将能够在配置中将其作为环境变量引用。

{
    "family": "...",
    "networkMode": "bridge",
    "containerDefinitions": [
        {
            "image": "...",
            "name": "...",
            "cpu": 128,
            "memory": 256,
            "essential": true,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 0,
                    "protocol": "http"
                }
            ],
            "environment": [
                {
                    "name": "VIRTUAL_HOST",
                    "value": "SECRET_S3_VIRTUAL_HOST"
                }
            ]
        }
    ]
}
  

在Amazon S3上存储机密,并使用AWS Identity and Access Management(IAM)角色授予对ECS中存储的机密的访问权。

Full blog post

你也可以制作自己的NGinx Docker镜像,它已经包含了环境变量。

FROM nginx
LABEL maintainer YOUR_EMAIL

ENV "VIRTUAL_HOST" "ec2-xx-xxx-xxxxxx.compute1.amazonaws.com"

你只需要构建它,私下发送它然后用它来配置。