如何使用 boto3 在集群中启动 EC2 实例

Posted

技术标签:

【中文标题】如何使用 boto3 在集群中启动 EC2 实例【英文标题】:How to start EC2 instance in cluster with boto3 【发布时间】:2019-02-25 23:39:43 【问题描述】:

我想在我的集群中的一个实例上启动一个任务定义(不是在默认实例中)。所以像:

    创建集群 使用 docker 映像创建任务定义(我有一个 docker 映像 已经推送到 ecs) 在集群中运行任务定义 我想为 ec2 实例添加一个密钥对以进行 ssh 访问

我已经尝试使用 boto3 (ec2, ecs) 形式的这些函数

create_cluster run_task register_container_instance register_task_definition run_instances

我设法用run_instances 运行了一个实例,它运行良好,但我想在我的集群中运行一个实例。这是我的代码:

    def run_instances():
        response = ec2.run_instances(
            BlockDeviceMappings=[
            
                'DeviceName': '/dev/xvda',
                'Ebs': 
                     'DeleteOnTermination': True,
                     'VolumeSize': 8,
                     'VolumeType': 'gp2'
                ,
            ,
        ],
        ImageId='ami-06df494fbd695b854',
        InstanceType='m3.medium',
        MaxCount=1,
        MinCount=1,
        Monitoring=
            'Enabled': False
        )
        return response

ec2 控制台上有一个正在运行的实例,但它没有出现在 ecs 控制台中的任何集群中(我尝试使用 ecs 优化的 ami 和普通的 ami)。

我还尝试按照以下步骤让我的系统在集群中启动并运行,但没有成功: https://github.com/spulec/moto/blob/master/tests/test_ecs/test_ecs_boto3.py

你能帮我找出我错过了什么吗?除了调用这些 SDK 函数,还有其他的设置吗?

谢谢!

【问题讨论】:

您在寻找什么? EC2还是ECS? - 启动 ec2 实例使用run_instances 我设法使用run_instances 运行实例,它运行良好,但我想在我的集群中运行一个实例。请用代码查看我更新的问题。 【参考方案1】:

您需要运行一个使用 ECS Optimized AMI 的实例,因为这些 AMI 上预装了 ECS 代理,否则您需要自己安装 ECS 代理并烘焙自定义 AMI。

默认情况下,您的 ECS 优化实例会启动到您的默认集群中,但您可以在 run_instances 函数的 UserData 属性中指定备用集群名称

#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config

可用的 ECS AMI 列表可用here

【讨论】:

太棒了。奇迹般有效。注意:我必须按照here 的描述将具有 AmazonEC2ContainerServiceforEC2Role 策略的角色附加到正在运行的实例。操作方法如下:CLIaws console

以上是关于如何使用 boto3 在集群中启动 EC2 实例的主要内容,如果未能解决你的问题,请参考以下文章

在 Boto3 中获取具有特定标签和值的 EC2 实例列表

如何在Python AWS boto API中获取EC2实例ID的容器实例列表

boto3如何获取单个ec2实例的所有标签并附加新标签

我们如何使用 python boto3 获取挂载到 EC2 实例的所有文件系统(EFS)的列表?

如何使用 boto3 在 EC2 中 SSH 和运行命令?

如何使用 boto3 指定 core-os ec2 实例的根卷大小?