如何使AWS ECS任务定义使EC2实例可公开访问?

时间:2018-08-05 08:13:09

标签: amazon-web-services docker amazon-ecs

以下是我的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"
                }
            }

        }
    ]
}

1 个答案:

答案 0 :(得分:0)

我建议的方法是配置与您的任务关联的ECS服务,然后使用应用程序负载平衡器(ALB)将公共流量路由到该服务。

本指南应为您提供帮助:https://aws.amazon.com/blogs/compute/microservice-delivery-with-amazon-ecs-and-application-load-balancers/

另一个(便宜的)选项是使用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实用程序。 此外,您需要更改任务docker映像的ENTRYPOINT才能运行脚本,例如:

"entryPoint": [
                "./script_to_setup_SG.sh && ./entrypoint_deployment.sh"
            ],