Как избежать опции fleet при создании точечных экземпляров?

#amazon-cloudformation

#aws-cloudformation

Вопрос:

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

https://github.com/shantanuo/cloudformation/blob/master/updated/linux_training.tpl.txt

Единственное изменение, которое я хотел бы внести, это удалить часть «Fleet» из приведенного здесь типа…

 Type: 'AWS::EC2::SpotFleet
  

Причина: когда я пытаюсь остановить экземпляр, я получаю сообщение, в котором говорится, что «Экземпляры Fleet не могут быть остановлены».

Как мне приобрести спотовые инстансы, используя «обычный» вариант или вариант по умолчанию?

Мастер (пользовательский интерфейс AWS) позволяет мне создавать точечные экземпляры, которые можно останавливать и запускать по мере необходимости. Ищете ту же функциональность из шаблона cloudformation.


Как было предложено в комментариях, я изменил шаблон, чтобы он выглядел следующим образом. Это работает так, как ожидалось. Но это создаст только «шаблон». Мне все равно нужно будет войти в консоль, чтобы инициировать новый экземпляр с использованием шаблона. Мне нужно автоматизировать сквозной процесс.

 Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-arm64-ebs
  OksoftSG:
    Type: 'AWS::EC2::SecurityGroup::Id'
  KeyName:
    Type: 'AWS::EC2::KeyPair::KeyName'
  MyInstanceType:
    Type: String
    Default: r6g.medium
    AllowedValues:
      - r6g.medium
      - r6g.4xlarge
      - r6g.12xlarge
  MyIpAddress:
    Type: String
 
Resources:
  MySpotInstance:
    Type: 'AWS::EC2::LaunchTemplate'
    Properties:
      LaunchTemplateData:
        ImageId: !Ref LatestAmiId
        KeyName: !Ref KeyName
        SecurityGroupIds: 
          - !Ref OksoftSG
        InstanceType: !Ref MyInstanceType

        BlockDeviceMappings:
          - DeviceName: /dev/xvda
            Ebs:
              DeleteOnTermination: true
              VolumeType: standard
              VolumeSize: 400

        InstanceMarketOptions: 
          MarketType: spot
          SpotOptions:
            InstanceInterruptionBehavior: stop
            SpotInstanceType: persistent

  MyInstance:
    Type: 'AWS::EC2::Instance'
    Properties:
      "LaunchTemplate" : 
        LaunchTemplateId: !Ref MySpotInstance
        Version: !GetAtt MySpotInstance.LatestVersionNumber
  

Когда я удаляю шаблон cloudformation, он не удаляет созданный им запрос spot.


Обновить:

Код, упомянутый в ответе, работает только для сервера Linux. Когда я пытаюсь запустить Windows Server, я получаю сообщение об ошибке:

 Property validation failure: [Value of property {/LaunchTemplateData} does not match type {Object}]
  

Я использовал этот шаблон:

 Parameters:
  1InstanceType:
    Type: String
    Default: t2.small
    AllowedValues:
      - t2.small
      - m3.medium
      - m3.xlarge
      - i3.xlarge
  2SecurityGroup:
    Type: 'AWS::EC2::SecurityGroup::Id'
  3KeyName:
    Type: 'AWS::EC2::KeyPair::KeyName'
  4LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: /aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base

Resources:
  Ec2LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: WindowsDesktop
      LaunchTemplateData:
      - ImageId: !Ref 4LatestAmiId
        InstanceType: !Ref 1InstanceType
        SecurityGroups:
          - GroupId: !Ref 2SecurityGroup
        KeyName: !Ref 3KeyName
        InstanceMarketOptions:
          MarketType: spot
          SpotOptions:
            SpotInstanceType: persistent
            InstanceInterruptionBehavior: stop

  

Комментарии:

1. Соответствующая ссылка: aws.amazon.com/about-aws/whats-new/2020/01 /…

Ответ №1:

Вот рабочий пример создания LaunchTemplate с постоянным точечным запросом, который создает экземпляр на основе шаблона. Инстансы, запущенные по постоянному точечному запросу, могут быть остановлены, но не завершены (замена будет запущена, как только появится место для размещения):

 Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: /aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-ebs
  OksoftSG:
    Type: 'AWS::EC2::SecurityGroup::Id'
  KeyName:
    Type: 'AWS::EC2::KeyPair::KeyName'
  MyInstanceType:
    Type: String
    Default: m3.medium
    AllowedValues:
      - t2.small
      - m3.medium
      - m3.xlarge
      - m3.2xlarge
      - i3.xlarge
  MyIpAddress:
    Type: String    
 
Resources:

  SpotPersistantLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:  
      LaunchTemplateData:
        InstanceType: !Ref MyInstanceType
        ImageId: !Ref LatestAmiId
        SecurityGroupIds:
          - !Ref OksoftSG
        KeyName: !Ref KeyName
        InstanceMarketOptions: 
          MarketType: spot
          SpotOptions:           
            InstanceInterruptionBehavior: stop
            SpotInstanceType: persistent
        BlockDeviceMappings:
          - DeviceName: /dev/xvda
            Ebs:
              DeleteOnTermination: true
              VolumeType: standard
              VolumeSize: 400                  
        UserData: !Base64 
          'Fn::Join':
            - ''
            - - |
                #!/bin/bash -xe
              - >
                yum install -y docker mysql git python-pip >
                /tmp/line1_succ.txt 2> /tmp/line1_err.txt
              - >
                service docker start > /tmp/line2_succ.txt 2>
                /tmp/line2_err.txt 
              - >
                echo 'india' | passwd ec2-user --stdin >
                /tmp/line4a_succ.txt 2> /tmp/line4a_err.txt 
              - >
                sed -i 's|[#]*PasswordAuthentication
                no|PasswordAuthentication yes|g' /etc/ssh/sshd_config >
                /tmp/line4b_succ.txt 2> /tmp/line4b_err.txt 
              - >
                /etc/init.d/sshd restart > /tmp/line4c_succ.txt 2>
                /tmp/line4c_err.txt 
              - >
                docker run -d -p 8887:8888 -v /tmp:/tmp shantanuo/notebook >
                /tmp/line3_succ.txt 2> /tmp/line3_err.txt 
              - >-
                pip install aws-ec2-assign-elastic-ip > /tmp/line4_succ.txt
                2> /tmp/line4_err.txt 
                 
              - 'sudo sh -c "echo '
              - !ImportValue secretKey
              - |2
                 >> /home/ec2-user/mysecret.txt" 
              - 'sudo sh -c "echo '
              - !ImportValue accessKey
              - |2
                 >> /home/ec2-user/myaccesskey.txt" 
              - >-
                /usr/local/bin/aws-ec2-assign-elastic-ip --access-key ''`cat
                /home/ec2-user/myaccesskey.txt`''  --secret-key ''`cat
                /home/ec2-user/mysecret.txt`'' --valid-ips '
              - !Ref MyIpAddress
              - |
                '                

  MyPersistantSpotInstance:
    Type: AWS::EC2::Instance    
    Properties:
      LaunchTemplate:
        LaunchTemplateId: !Ref SpotPersistantLaunchTemplate
        Version: 1

  

Комментарии:

1. Спасибо за решение. Но после удаления шаблона cloudformation запрос spot не удаляется. Постоянный точечный запрос создаст новый экземпляр. Если я забуду удалить запрос spot после удаления шаблона, сама цель будет проигнорирована. Поддержано, но будет ждать вознаграждения 🙂

2. @shantanuo Спасибо. Для этой новой проблемы (удаление стека) необходимо разработать пользовательский ресурс . Это должен быть lambda, который будет реагировать на сигнал УДАЛЕНИЯ из CloudFormation. Когда лямбда-код вызывается при удалении, он будет использовать AWS SDK для «ручной» отмены запроса spot.

3. Код работает должным образом при запуске Linux server. Но сбой с Windows Server.

4. @shantanuo Ну, это ожидаемо, потому что Windows — это не Linux, и код был разработан для Linux.

5. Обновлен вопрос. Я предполагаю, что экземпляр Windows spot (или шаблон) с запросом сохранения не может быть создан с использованием cloudformation.

Ответ №2:

Точечный парк — это способ запроса определенного объема вычислительных ресурсов (ОЗУ, ЦП), который будет «продолжать работать», даже если некоторые точечные экземпляры будут удалены. Вот почему вы не можете запросить остановку экземпляра — потому что он будет автоматически заменен.

Обычно запрос на точечный экземпляр может быть указан в RunInstances() команде. Однако мне не удалось найти эту опцию в AWS::EC2::Instance .

Самое близкое, что я смог найти, это использовать AWS::EC2::Instance и указать AWS::EC2::LaunchTemplate , который содержит SpotOptions для указания точечных экземпляров.

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

Комментарии:

1. Можете ли вы привести пример того, как указать LaunchTemplate, который содержит SpotOptions?

2. Похоже, что AWS::EC2::LaunchTemplate содержит InstanceMarketOptions значение, которое должно быть установлено в MarketType: Spot .

3. Спасибо за подсказку. Но это создаст только шаблон, а не экземпляр. Обновлен вопрос.

4. Да, но вы можете указать это LaunchTemplate при запуске экземпляра через AWS::EC2::Instance .

5. Когда я удаляю шаблон cloudformation, он удаляет экземпляр, но не удаляет созданный им запрос spot! Новый экземпляр запускается после удаления шаблона CNF. Обновлен вопрос.