2014-02-24 3 views
2

Предположим, я хочу создать экземпляры EC2 по одному на каждый экземпляр InstanceType, и в противном случае они будут одинаковыми.В AWS CloudFormation можно создать несколько экземпляров EC2 со значениями из сопоставлений без группы AutoScaling?

Так что я бы создать Mapping так:

"Mappings" : { 
    "MyAWSInstanceTypes" : [ 
     "t1.micro", 
     "m1.small", 
     "m1.medium", 
     "m1.large", 
     "m1.xlarge", 
     "m3.xlarge", 
     "m3.2xlarge", 
     "m2.xlarge", 
     "m2.2xlarge", 
     "m2.4xlarge", 
     "c1.medium", 
     "c1.xlarge", 
     "cc1.4xlarge", 
     "cc2.8xlarge", 
     "cg1.4xlarge", 
     "hi1.4xlarge", 
     "hs1.8xlarge" 
    ], 

и позже я хотел бы иметь

"Resources" : { 
    "MyEc2Instances" : {  
      "Type" : 
       "AWS::EC2::Instance", 

, где я бы волшебно получить все мои типы экземпляров, созданные в соответствии с сопоставлением.

Возможно ли это без использования AutoScaling?

+0

Спасибо за ваш ответ. Я вижу, как это может автоматизировать копирование. Я надеялся полностью устранить это. – user1249170

ответ

0

Нет, это невозможно, нет итерации, которую вы можете указать в шаблоне. Однако вы можете создать ресурс экземпляра для каждого типа экземпляра. Это вопрос копирования и вставки. Чтобы было проще указать CloudFormation, какие экземпляры для запуска при создании стека, вы можете указать functions и conditions в шаблоне. Например, вы можете создать параметр или параметры, указывающие, какие типы экземпляров запускать, и использовать условия для запуска только тех, которые вы указали.

+0

Спасибо за подсказку. Функции и условия, безусловно, являются хорошими функциями, о которых я не знал, но, к сожалению, это не исключало бы копирование в моем случае. – user1249170

5

Похоже, вы хотите прокрутить каждый тип экземпляра, создавая один из них. Это невозможно в шаблоне CloudFormation.

Вы можете программно сгенерировать шаблон. Библиотека troposphere Python обеспечивает отличную абстракцию для создания шаблонов. Например:

import json 
from troposphere import Template, ec2 


types = [ 
    "t1.micro", 
    "m1.small", 
    "m1.medium", 
    "m1.large", 
    "m1.xlarge", 
    "m3.xlarge", 
    "m3.2xlarge", 
    "m2.xlarge", 
    "m2.2xlarge", 
    "m2.4xlarge", 
    "c1.medium", 
    "c1.xlarge", 
    "cc1.4xlarge", 
    "cc2.8xlarge", 
    "cg1.4xlarge", 
    "hi1.4xlarge", 
    "hs1.8xlarge"] 
ami = "ami-12345678" 
t = Template() 

for type in types: 
    t.add_resource(ec2.Instance(
     type.replace('.', ''), #resource names must be alphanumeric 
     ImageId=ami, 
     InstanceType=type, 
     )) 

print t.to_json() 
0

Мы также столкнулись с таким же претендентом после работы с несколькими шаблонами облачности для клиента. По сути, мы хотели бы перебрать тип экземпляра списка для создания конфигурации запуска spotfleet, но мы не хотим дублировать этот код вручную в нашем шаблоне.

Мы попробовали тропосферу как @Ben Whaley, но это было не слишком подходящим для нашего сценария, так как нам нужно переписать существующий шаблон облачности с помощью python.

После некоторого расследования мы решили использовать шаблон EJS с ejs-cli для создания шаблона информационной среды, который позволяет нам интерполировать переменные и включать в себя фрагмент в целевой ЦФТ.

  • управления Фрагмент

    Resources: <% include ./partials/resources.yml %> ...

  • Variable интерполяция

    apiTaskDefinition: Type: AWS::ECS::TaskDefinition DependsOn: ECSTaskRole Properties: ContainerDefinitions: - Name: api Essential: true Image: <%= container_path %>/api Memory: <%= container.api.memory %>

  • цикл по списку

    Properties: SpotFleetRequestConfigData: IamFleetRole: !GetAtt iamFleetRole.Arn SpotPrice: !Ref 'ECSSpotPrice' TargetCapacity: !Ref 'DesiredCapacity' TerminateInstancesWithExpiration: false AllocationStrategy: lowestPrice LaunchSpecifications: <% for(var i in instancesTypes) {%> <% include ./partials/instance-launch-specification.yml %> <% } %>

Вы можете найти демонстрационную source code здесь и наш blog post.

Смежные вопросы