PowerShell не выполняет AWS CloudFormation

#amazon-web-services #powershell #yaml #amazon-cloudformation

#amazon-веб-сервисы #powershell #yaml #aws-cloudformation

Вопрос:

Вот в чем проблема: я работаю над сценарием формирования облака .yaml для AWS, цель состоит в том, чтобы развернуть сервер Windows 2016 / 2019 и выполнить некоторые команды в PowerShell, но ни одна из команд не выполняется.

Вот полный сценарий:

 AWSTemplateFormatVersion: 2010-09-09

Description: |
  Plantilla para desplegar una instancia EC2 de Windows Server en eu-west-1.

Parameters:
  vpcId:
    Description: VPC sobre la que se desplegara el servidor
    Type: AWS::EC2::VPC::Id

  subnetId:
    Description: Listado de subredes disponibles
    Type: AWS::EC2::Subnet::Id

  apserSecurityGroupId:
    Description: Debe llamarse SG-Apser y existir en la VPC seleccionada
    Type: AWS::EC2::SecurityGroup::Id

  serverType:
    Description: Imagen (AMI) del servidor
    Type: String
    Default: 'WindowsServer2019'
    AllowedValues: [WindowsServer2016, WindowsServer2019]

  instanceSize:
    Description: Tamano de la instancia EC2
    Type: String
    Default: 't3.large'
    AllowedValues: [t3.large, t3.xlarge, t3.2xlarge, m5.large, m5.xlarge, m5.2xlarge]

  volumeSize:
    Description: Tamano (GiB) del volumen de la instancia
    Type: Number
    Default: 30
    MinValue: 30
    MaxValue: 1000

  adminPassword:
    Description: Contrasena para la cuenta de Administrador
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 20

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
    -
      Label:
        default: "Configuracion de Red"
      Parameters:
        - vpcId
        - subnetId
        - apserSecurityGroupId
    -
      Label:
        default: "Configuracion del servidor"
      Parameters:
        - serverType
        - instanceSize
        - volumeSize
        - adminPassword
    ParameterLabels:
      vpcId:
        default: "VPC para despliegue"
      subnetId:
        default: "Subnet para despliegue"
      apserSecurityGroupId:
        default: "SecurityGroup de Apser"
      serverType:
        default: "Tipo de servidor (S.O.)"
      instanceSize:
        default: "Tamano de la instancia"
      volumeSize:
        default: "Tamano del volumen"
      adminPassword:
        default: "Contrasena de Administrador"

Mappings:
  serverAMI:
    WindowsServer2016:
      value: "ami-059cafee566b7248c"
    WindowsServer2019:
      value: "ami-01925800085c95bea"

Resources:
  server:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: !Ref instanceSize
      ImageId: !FindInMap
        - serverAMI
        - !Ref serverType
        - value
      SubnetId: !Ref subnetId
      BlockDeviceMappings:
        - DeviceName: /dev/sda1
          Ebs:
            VolumeSize: !Ref volumeSize
            Encrypted: true
      CreditSpecification:
        CPUCredits: standard
      DisableApiTermination: false # DEBE SER SIEMPRE TRUE!
      SecurityGroupIds:
        - !GetAtt securityGroup.GroupId
        - !Ref apserSecurityGroupId
      IamInstanceProfile: apser-multirole
      UserData:
        'Fn::Base64': !Sub |
          <powershell>
          Rename-Computer -NewName ${AWS::StackName}
          net user administrador ${adminPassword}
          netsh advfirewall set allprofiles state off
          Set-TimeZone -Id "Romance Standard Time" -PassThru
          Invoke-WebRequest "https://apserbucket.s3-eu-west-1.amazonaws.com/Recursos/ESET-Windows.zip" -OutFile "C:UsersAdministradorDesktopESET.zip"
          Expand-Archive -Path C:UsersAdministradorDesktopESET.zip -DestinationPath C:UsersAdministradorDesktop -Force
          C:UsersAdministradorDesktopESMCAgentInstaller.bat
          Get-ChildItem C:UsersAdministradorDesktop -File -Recurse | Foreach-Object {Remove-Item $_.FullName}
          Restart-Computer -Force
          </powershell>
      Tags:
        - Key: Name
          Value: !Ref 'AWS::StackName'
        - Key: Backup
          Value: true

  securityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Join
      - ''
      - - SG-
        - !Ref 'AWS::StackName'
      GroupDescription: 'Reglas especificas para este servidor'
      VpcId:
        Ref: vpcId
      Tags:
        - Key: Name
          Value: !Join
            - ''
            - - SG-
              - !Ref 'AWS::StackName'

  elasticIP:
    Type: 'AWS::EC2::EIP'
    Properties:
      InstanceId: !Ref server
      Tags:
        - Key: Name
          Value: !Join
            - ''
            - - EIP-
              - !Ref 'AWS::StackName'
  

Самое смешное, что этот скрипт работал отлично не так давно.

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

1. Можете ли вы войти в инстанс и проверить файлы журналов?

2. Дело в том, что, поскольку сценарий PowerShell не выполняется (или в какой-то момент завершается сбоем), я не могу войти в систему с помощью диспетчера сеансов и каким-то образом (даже с открытым портом 3389) Я не могу выполнить RDP в экземпляре. Другими словами, я слепой. Кроме того, если создать сервер без начальной загрузки и скопировать-вставить команды в power shell, они работают просто отлично.

3. Вы можете просмотреть системный журнал через консоль AWS, а также получить снимок экрана экземпляра (щелкните правой кнопкой мыши на экземпляре в консоли EC2 и перейдите в настройки экземпляра). Может быть, это помогает?

Ответ №1:

В конце концов, я не смог выяснить, почему сценарий PowerShell не выполнялся из пользовательских данных. Решение состояло в том, чтобы загрузить этот скрипт в корзину S3 и загрузить его, а затем запустить из пользовательских данных.

Прошло два года, но я надеюсь, что это кому-то поможет.