亚马逊点实例部署反模式

时间:2015-10-13 04:18:13

标签: amazon-web-services ssh bigdata analytics devops

我很确定我做错了事,我想知道正确的方法。

我面临的问题是:

  • 我有分布式批处理作业
  • 我使用AWS spot实例来实现它
  • 总是一次性请求(所以我在简单的解决方案之后)
  • 实例需要一些配置和设置,并且需要将任务发送到

我通常会这样解决:

  • 培养一名员工并对其进行配置
  • 保存图片
  • 然后调出所有其他实例
  • 然后我会做一个大的,烦人的复制粘贴工作,基本上创建一个这样的shell脚本: $HOST=123.123.123.1 $TASK=task1 ssh ubuntu@$HOST task_runner $TASK & $HOST=123.123.123.2 $TASK=task2 ssh ubuntu@$HOST task_runner $TASK & $HOST=123.123.123.3 $TASK=task3 ssh ubuntu@$HOST task_runner $TASK & ...

我希望更好地做到这一点,所以我想方设法让它变得更容易:

  1. 设置AWS实例。有时需要运行启动时代码,这意味着更多大任务,如上面的那个
  2. 获取实例列表。没有更多的复制粘贴!
  3. 在所有实例上运行所有任务。
  4. 我完成后关闭它们
  5. 理想情况下,我想覆盖整个生命周期,端到端。

    最后,我想要一些非常简单的东西。因为它是一次性的任务,所以我真的不想处理大量的配置选项和布线。

2 个答案:

答案 0 :(得分:3)

您可以使用Ansible来合理地执行此操作。

你的Ansible剧本看起来像是:

- name: Stage instance(s)
  hosts: local
  connection: local
  gather_facts: false

  vars:
      keypair: mykeypair
      instance_type: m1.small
      security_group: sg-123456abc
      image: ami-123456abc
      vpc_subnet_id: subnet-123456abc
      count: 5

  tasks:
    - name: Create spot instance
      ec2:
        spot_price: 0.24
        spot_wait_timeout: 600
        keypair: {{ keypair }}
        group_id: {{ security_group }}
        instance_type: {{ instance_type }}
        image: {{ image }}
        vpc_subnet_id: {{ vpc_subnet_id }}
        assign_public_ip: no
        count: {{ count }}
        wait: yes
      register: ec2

    - name: Add new instances to host group
      add_host: hostname={{item.private_ip}} groupname=task_minions
      with_items: ec2.instances

    - name: Wait for the instances to boot by checking the ssh port
      wait_for: host={{item.private_dns_name}} port=22 delay=60 timeout=320 state=started
      with_items: ec2.instances

- name: Configure instance(s)
  hosts: task_minions
  remote_user: ec2-user
  tasks:
    - name: Some configuration
      yum:
        ...

- name: Run tasks
  hosts: task_minions
  remote_user: ec2-user
  tasks:
    - name: Run all tasks on all task_minions
      command:
        task_runner {{ item }}
      with_items:
        - task_1
        - task_2
        ...

- name: Terminate instance(s)
  hosts: localhost
  connection: local
  tasks:
    - name: Terminate instances that were previously launched
      ec2:
        state: 'absent'
        instance_ids: '{{ ec2.instance_ids }}'

我对其他配置管理工具的经验较少,但我相信它们也可以使用。

答案 1 :(得分:1)

要尝试/思考的几件事:

1)你应该考虑从图像+运行启动时间代码的钩子构建一个AMI,其中包含你需要的一切。这应该允许您使用此AMI启动图像,而不必担心构建它

2)使用SQS队列来分派任务。通过这种方式,工作人员可以从该队列中拔出,您可以很容易地告诉他们什么时候完成。 (队列变为0,没有消息在飞行中)。

3)额外的超棒。将SQS调度与自动调整相结合:http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-using-sqs-queue.html这样,只要有工作,您就可以自动调整旋转/旋转实例。你唯一需要做的就是将事情推向队列。

4)对于超级巨大的超级棒。完成上面的所有操作+将所有内容放入CloudFormation模板并启动Cloudformation堆栈。如果您需要修改设置(更改图像,队列,配置等),您只需调整模板并重新部署。

希望这有帮助。