Amazon cloudformation 如何在生成spot实例时避免震源组选项?

Amazon cloudformation 如何在生成spot实例时避免震源组选项?,amazon-cloudformation,Amazon Cloudformation,我正在使用这个cloudformation模板创建spot实例,它正在按预期工作 唯一的变化,我想是删除“舰队”的一部分,从类型在这里 Type: 'AWS::EC2::SpotFleet 原因:当我试图停止一个实例时,我会收到一条消息,上面写着“无法停止舰队实例” 如何使用“普通”或默认选项购买现货实例 (AWS用户界面)向导允许我生成spot实例,这些实例可以在需要时停止和启动。正在从cloudformation模板中查找相同的功能 正如评论中所建议的,我已经修改了模板,使其看起来像这

我正在使用这个cloudformation模板创建spot实例,它正在按预期工作

唯一的变化,我想是删除“舰队”的一部分,从类型在这里

Type: 'AWS::EC2::SpotFleet
原因:当我试图停止一个实例时,我会收到一条消息,上面写着“无法停止舰队实例”

如何使用“普通”或默认选项购买现货实例

(AWS用户界面)向导允许我生成spot实例,这些实例可以在需要时停止和启动。正在从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
参数:
LatestAmiId:
类型:“AWS::SSM::Parameter::Value”
默认值:/aws/service/ami亚马逊linux最新版本/amzn2-ami-minimal-hvm-arm64-ebs
OksoftSG:
类型:“AWS::EC2::SecurityGroup::Id”
关键字名称:
类型:“AWS::EC2::KeyPair::KeyName”
MyInstanceType:
类型:字符串
默认值:r6g.medium
允许值:
-r6g.中等
-r6g.4XL
-r6g.12xlarge
MyIP地址:
类型:字符串
资源:
MySpot实例:
类型:“AWS::EC2::LaunchTemplate”
特性:
LaunchTemplateData:
图像ID:!参考LatestAmiId
关键字:!参考键名
SecurityGroupId:
- !参考OksoftSG
实例类型:!参考MyInstanceType
块设备应用程序:
-设备名称:/dev/xvda
Ebs:
DeleteOnTermination:true
卷类型:标准
体积:400
实例标记选项:
市场类型:现货
选择:
InstanceInterruptionBehavior:停止
SpotInstanceType:持久性
MyInstance:
类型:“AWS::EC2::实例”
特性:
“启动模板”:
LaunchTemplateId:!引用MySpotInstance
版本:!GetAtt MySpotInstance.LatestVersionNumber

当我删除cloudformation模板时,它不会删除它创建的spot请求。

spot Fleet是一种请求一定数量的计算资源(RAM、CPU)的方法,即使删除了一些spot实例,这些资源也会“继续运行”。这就是为什么您不能请求停止实例——因为它将被自动替换

通常,可以在
RunInstances()
命令中指定对Spot实例的请求。但是,我在
AWS::EC2::Instance
中找不到这个选项

我能找到的最接近的方法是使用
AWS::EC2::Instance
并指定
AWS::EC2::LaunchTemplate
,其中包含用于指定Spot实例的
SpotOptions


坦率地说,我认为使用CloudFormation模板来启动Spot实例是非常不寻常的。这是因为CloudFormation通常用于以可靠、一致的方式启动资源。相反,Spot实例可以在很少注意的情况下消失。因此,Spot实例通常通过特定的API请求启动,而不是通过CloudFormation模板启动。

这里是使用持久Spot请求创建LaunchTemplate的工作示例,它基于模板创建实例。在持久性spot请求上运行的实例可以停止,但不能终止(一旦有spot位置,将立即启动替换):

参数:
LatestAmiId:
类型:“AWS::SSM::Parameter::Value”
默认值:/aws/service/ami亚马逊linux最新版本/amzn-ami-hvm-x86_64-ebs
OksoftSG:
类型:“AWS::EC2::SecurityGroup::Id”
关键字名称:
类型:“AWS::EC2::KeyPair::KeyName”
MyInstanceType:
类型:字符串
默认值:m3.medium
允许值:
-t2.小
-m3.中等
-m3.xlarge
-m3.2xL
-i3.xlarge
MyIP地址:
类型:字符串
资源:
SpotPersistantLaunchTemplate:
类型:AWS::EC2::LaunchTemplate
特性:
LaunchTemplateData:
实例类型:!参考MyInstanceType
图像ID:!参考LatestAmiId
SecurityGroupId:
- !参考OksoftSG
关键字:!参考键名
实例标记选项:
市场类型:现货
选择:
InstanceInterruptionBehavior:停止
SpotInstanceType:持久性
块设备应用程序:
-设备名称:/dev/xvda
Ebs:
DeleteOnTermination:true
卷类型:标准
体积:400
用户数据:!Base64
'Fn::Join':
- ''
- - |
#!/bin/bash-xe
- >
yum安装-y docker mysql git python pip>
/tmp/line1_such.txt 2>/tmp/line1_err.txt
- >
服务docker start>/tmp/line2_such.txt 2>
/tmp/line2_err.txt
- >
echo“india”| passwd ec2用户--stdin>
/tmp/line4a_such.txt 2>/tmp/line4a_err.txt
- >
sed-i的|[#]*密码验证
否|密码验证是| g'/etc/ssh/sshd_config>
/tmp/line4b_such.txt 2>/tmp/line4b_err.txt
- >
/etc/init.d/sshd restart>/tmp/line4c_such.txt 2>
/tmp/line4c_err.txt
- >
docker run-d-p 8887:8888-v/tmp:/tmp shantanuo/notebook>
/tmp/line3_such.txt 2>/tmp/line3_err.txt
- >-
pip安装aws-ec2-assign-elastic-ip>/tmp/line4_such.txt
2> /tmp/line4_err.txt
-"sudo sh-c"echo"
-!ImportValue secretKey
- |2
>>
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