我希望在使用AWS API的EC2实例中运行一个docker,我有Dockerrun.aws.json这样的:
{
"AWSEBDockerrunVersion": "1",
"Authentication": {
"Bucket": "<BUCKET>",
"Key": ".dockercfg"
},
"Image": {
"Name": "<NAME>:<TAG>",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
},
{
"ContainerPort": "443"
}
]
}
就像你可以看到的那样,我有多个端口要暴露,但弹性beanstalk只暴露它们中的第一个。
我在文档中找到了这句话:您可以指定多个容器端口,但AWS Elastic Beanstalk仅使用第一个容器端口将容器连接到主机的反向代理并从公共Internet路由请求。
我的问题是为什么?
我有一个使用Oauth2协议的身份验证,出于明显的安全原因,我必须使用HTTPS协议。 有了这个限制,我只能选择HTTP或HTTPS,因为我只能暴露端口80或443。
我尝试修改ebextensions以使用EC2实例级别的端口进行nginx重定向,但是我已经失败了。 我该怎么办?
此stackoverflow用户遇到同样的问题。 Exposing multiple ports from Docker within Elastic Beanstalk
提前感谢你
答案 0 :(得分:11)
我联系了亚马逊支持中心,我选择向您展示答案。
你好K ...,
使用Dockerrun.aws.json,Elastic Beanstalk钩子脚本只会读取 来自JSON文件的第一个端口。
这是因为在/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh中:
if [
echo $EB_CONFIG_DOCKER_PORT | wc -w
-gt 1];然后 EB_CONFIG_DOCKER_PORT =echo $EB_CONFIG_DOCKER_PORT | awk '{print $1}'
警告&#34;只允许一个EXPOSE指令,使用第一个: $ EB_CONFIG_DOCKER_PORT&#34;网络钩子脚本必须指定反向的随机端口 代理转发到,然后转发到您的Docker容器 港口。目前只能设置一个端口映射。
关于nginx配置,实现最快的方法 端口443监听您的环境是创建一个单独的服务器 /etc/nginx/conf.d/中的部分,例如custom-ssl.conf,用于处理 与客户端进行HTTPS握手。这意味着你必须这样做 将您的SSL证书放在实例上,以便nginx可以 执行SSL握手。我稍后会回复你的样本 nginx中的HTTPS配置。
否则,如果您的环境是负载平衡的,您可以简单地 在ELB上设置HTTPS侦听器,让ELB处理SSL 终止。
同时,如果您有其他问题,请不要犹豫!
致以最诚挚的问候,
悉尼支持中心
*
你好再见K ...,
正如我在之前的信件中提到的那样,请找到 附上了一个样本.ebextensions配置文件,它将设置一个https nginx上的服务器,在单个实例Docker环境中。你没有 让我知道你在询问哪个环境,所以 附加的.ebextensions仅适用于单实例环境。
此.ebextensions配置文件执行以下操作:
将nginx的https服务器配置文件添加为/etc/nginx/sites-enabled/https.conf,反向代理 传入https会话到Docker容器的http。
将SSL密钥/证书组合文件添加到上述HTTPS服务器所需的/etc/pki/tls/certs/my_ssl.crt中。
向Beanstalk环境的EC2安全组添加额外的入口规则,以允许传入的TCP:443连接到实例
请随时修改.ebextensions配置文件以适合您的 用例,并将其放在.ebextensions /目录中 要在Elastic Beanstalk中部署的应用程序的根级别。如果 目录不在那里,请创建它。
有关.ebextensions配置文件的更多信息,请参阅:
如果您处于负载均衡的环境中,那么您将需要 通过AWS CLI将您的SSL证书上传到IAM,并配置您的 Beanstalk环境的ELB启用其HTTPS侦听器。该 说明将与上述说明不同:
请告诉我你如何使用.ebextensions配置文件,以及 如果您需要进一步的帮助,请告诉我们!
致以最诚挚的问候,
悉尼支持中心
他给了我一个附件的例子。 01-nginx的-ssl.config
files:
"/etc/nginx/sites-enabled/https.conf":
mode: "000644"
owner: root
group: root
content: |
server {
listen 443 ssl;
ssl_certificate_key /etc/pki/tls/certs/my_ssl.crt;
ssl_certificate /etc/pki/tls/certs/my_ssl.crt;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://docker;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
"/etc/pki/tls/certs/my_ssl.crt":
mode: "000400"
owner: root
group: root
content: |
<Your key/cert pair goes here>
Resources:
AllowSSL:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: {Ref : AWSEBSecurityGroup}
IpProtocol: tcp
ToPort: 443
FromPort: 443
CidrIp: 0.0.0.0/0