Я использую следующий шаблон для предоставления ресурсов:

      Resources:
        PrimaryADC:
          Type: 'AWS::EC2::Instance'
          Properties:
            ImageId:  "{{ ami_id }}"
            InstanceType:  "{{ instance_type }}"
            NetworkInterfaces:
              - AssociatePublicIpAddress: true
                DeleteOnTermination: true
                Description: "Mgmt interface"
                SubnetId:  "{{ mgmt_subnet_id }}"
                DeviceIndex: 0

        PrimaryADCClientNic:
          Type: 'AWS::EC2::NetworkInterface'
          Properties:
            Description: "Client interface"
            SubnetId: "{{ client_subnet_id }}"
          DependsOn: PrimaryADC
        PrimaryADCServerNic:
          Type: 'AWS::EC2::NetworkInterface'
          Properties:
            Description: "Server interface"
            SubnetId: "{{ server_subnet_id }}"
          DependsOn: PrimaryADC
        ClinetNetworkInterfaceAttachment:
          Type: AWS::EC2::NetworkInterfaceAttachment
          Properties:
              DeleteOnTermination: true
              InstanceId:
                Ref: PrimaryADC
              NetworkInterfaceId:
                Ref: PrimaryADCClientNic
              DeviceIndex: 1
        ServerNetworkInterfaceAttachment:
          Type: AWS::EC2::NetworkInterfaceAttachment
          Properties:
              DeleteOnTermination: true
              InstanceId:
                Ref: PrimaryADC
              NetworkInterfaceId:
                Ref: PrimaryADCServerNic
              DeviceIndex: 2
      Outputs:
        instanceid:
          Value: 
            Ref: PrimaryADC

Когда я удаляю стек, он всегда пытается сначала удалить два лишних сетевых интерфейса. Это вызывает ошибку, потому что они все равно будут прикреплены к экземпляру. Я попытался указать DependsOn для интерфейсов, но это не сработало. Как я могу убедиться, что экземпляр удален, прежде чем пытаться удалить любой из подключенных сетевых интерфейсов (клиент и сервер).

Я использую boto3 для создания стека. И удаление через GUI.

Файл json из развертывания стека:

{
   "Resources":{
      "PrimaryADC":{
         "Properties":{
            "InstanceType":"c5.xlarge",
            "NetworkInterfaces":[
               {
                  "AssociatePublicIpAddress":True,
                  "SubnetId":"**********",
                  "Description":"Mgmt interface",
                  "DeviceIndex":0,
                  "DeleteOnTermination":True
               }
            ],
            "ImageId":"*************"
         },
         "Type":"AWS::EC2::Instance"
      },
      "PrimaryADCServerNic":{
         "Properties":{
            "SubnetId":"******************",
            "Description":"Server interface"
         },
         "Type":"AWS::EC2::NetworkInterface",
         "DependsOn":"PrimaryADC"
      },
      "ServerNetworkInterfaceAttachment":{
         "Properties":{
            "InstanceId":{
               "Ref":"PrimaryADC"
            },
            "NetworkInterfaceId":{
               "Ref":"PrimaryADCServerNic"
            },
            "DeviceIndex":2,
            "DeleteOnTermination":True
         },
         "Type":"AWS::EC2::NetworkInterfaceAttachment"
      },
      "ClinetNetworkInterfaceAttachment":{
         "Properties":{
            "InstanceId":{
               "Ref":"PrimaryADC"
            },
            "NetworkInterfaceId":{
               "Ref":"PrimaryADCClientNic"
            },
            "DeviceIndex":1,
            "DeleteOnTermination":True
         },
         "Type":"AWS::EC2::NetworkInterfaceAttachment"
      },
      "PrimaryADCClientNic":{
         "Properties":{
            "SubnetId":"*************",
            "Description":"Client interface"
         },
         "Type":"AWS::EC2::NetworkInterface",
         "DependsOn":"PrimaryADC"
      }
   },
   "Outputs":{
      "instanceid":{
         "Value":{
            "Ref":"PrimaryADC"
         }
      }
   }
}
1
code_monk_666 8 Окт 2020 в 14:08

1 ответ

Лучший ответ

Я попытался воспроизвести проблему, но в моих тестах все работает должным образом . Вот шаблон, который я использовал, так как ваш неполный:

Parameters:

  amiid:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  mgmtsubnetid:
    Type: AWS::EC2::Subnet::Id

  clientsubnetid:
    Type: AWS::EC2::Subnet::Id

  serversubnetid:
    Type: AWS::EC2::Subnet::Id    

Resources:

  PrimaryADC:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId:  !Ref amiid
      InstanceType:  t3.medium
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeleteOnTermination: true
          Description: "Mgmt interface"
          SubnetId:  !Ref mgmtsubnetid
          DeviceIndex: 0

  PrimaryADCClientNic:
    Type: 'AWS::EC2::NetworkInterface'
    Properties:
      Description: "Client interface"
      SubnetId: !Ref clientsubnetid
    DependsOn: PrimaryADC

  PrimaryADCServerNic:
    Type: 'AWS::EC2::NetworkInterface'
    Properties:
      Description: "Server interface"
      SubnetId: !Ref serversubnetid
    DependsOn: PrimaryADC

  ClinetNetworkInterfaceAttachment:
    Type: AWS::EC2::NetworkInterfaceAttachment
    Properties:
        DeleteOnTermination: true
        InstanceId:
          Ref: PrimaryADC
        NetworkInterfaceId:
          Ref: PrimaryADCClientNic
        DeviceIndex: 1

  ServerNetworkInterfaceAttachment:
    Type: AWS::EC2::NetworkInterfaceAttachment
    Properties:
        DeleteOnTermination: true
        InstanceId:
          Ref: PrimaryADC
        NetworkInterfaceId:
          Ref: PrimaryADCServerNic
        DeviceIndex: 2
Outputs:
  instanceid:
    Value: 
      Ref: PrimaryADC
0
Marcin 8 Окт 2020 в 12:04