amazon-web-services - 如何使 AWS ECS 任务定义使 EC2 实例可公开访问?
问题描述
下面是我对 ECS 的 AWS 任务定义。
我需要这个任务的每个 EC2 实例让世界可以公开访问端口 3026。我怎样才能修改这个 JSON 来做到这一点?
目前,在服务运行此任务后,我手动查找 EC2 实例,然后手动添加一个安全组,允许从该端口的 0.0.0.0/0 进入。
但我真的很想知道如何让这个 JSON 做到这一点,所以我不再需要手动去做。
{
"family": "myproj",
"requiresCompatibilities": [
"EC2"
],
"containerDefinitions": [
{
"memory": 500,
"memoryReservation": 350,
"name": "myproj",
"image": "blah.dkr.ecr.us-east-1.amazonaws.com/myproj:latest",
"essential": true,
"portMappings": [
{
"hostPort": 3026,
"containerPort": 8000,
"protocol": "tcp"
}
],
"entryPoint": [
"./entrypoint_deployment.sh"
],
"environment" : [
{ "name" : "DB_HOST", "value" : "blah.blah.us-east-1.rds.amazonaws.com" }
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/myproj",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}
解决方案
我建议的方法是配置与您的任务关联的 ECS 服务,然后使用 Application Load Balancer (ALB) 将公共流量路由到该服务。
另一个(更便宜的)选项是使用 Amazon 提供的 EC2 实例元数据 API,从该 API 读取 instance_id 值,并在容器启动时使用“aws-cli”实用程序更新安全组。像这样的脚本应该可以工作(在容器内运行):
export SECURITY_GROUP=sg-12345678
export INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
aws ec2 modify-instance-attribute --instance-id INSTANCE_ID --groups $SECURITY_GROUP
您需要SECURITY_GROUP
相应地设置并在您正在运行的任务的 docker 映像中安装 aws ec2 实用程序。此外,您需要更改ENTRYPOINT
任务 docker 映像以运行脚本,例如:
"entryPoint": [
"./script_to_setup_SG.sh && ./entrypoint_deployment.sh"
],
推荐阅读
- c# - 将来自 TextContext.Error.WriteLine() 的数据放在 NUnit 默认结果写入器的输出开头
- javascript - 是否有通过端点提供完全包含的 Web 组件的名称?
- reactjs - 异步/等待内部承诺
- vb.net - 创建前景插件
- mod-pagespeed - nginx 小写重写 mod_pagespeed 破坏图像
- java - 在 node.js 中编译多个 java 文件
- python-3.x - 时间范围之间的意外输出写入列表时隙
- angular - 在angular 4项目中导入fabric js组件
- dictionary - 必应地图聚类
- sql - Postgres中的Regclass