Менеджер систем AWS Как добавить задержку между шагами по автоматизации

У меня есть шаблон автоматизации AMI, который я использую для создания своего пользовательского AMI.

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

Ниже мой шаблон и мне нужна задержка между шагами DoStep1 а также stopInstance:

AWSTemplateFormatVersion: "2010-09-09"
Description: "SSM Automation Document for creating a new AMI"
Parameters:
  SubnetId:
    Description: "ID of subnet to use for launching EC2 instance"
    Type: "AWS::EC2::Subnet::Id"
  SecurityGroupIds:
    Description: "The IDs of security groups that are permitted access to EC2 instance"
    Type: "List<AWS::EC2::SecurityGroup::Id>"
Outputs:
  AmiAutomationDocumentName:
    Value: !Ref "AmiAutomationDoc"
Resources:
  AutomationRole:
    Type: "AWS::IAM::Role"
    Properties:
      Path: "/"
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - "sts:AssumeRole"
            Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
                - "ssm.amazonaws.com"
        Version: "2012-10-17"
      Policies:
        - PolicyName: "PassRole"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "iam:PassRole"
                Effect: "Allow"
                Resource: "*"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole"
  InstanceProfileRole:
    Type: "AWS::IAM::Role"
    Properties:
      Path: "/"
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - "sts:AssumeRole"
            Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
                - "ssm.amazonaws.com"
        Version: "2012-10-17"
      Policies:
        - PolicyName: "PassRole"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "iam:PassRole"
                Effect: "Allow"
                Resource: "*"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
  InstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Path: "/"
      Roles:
        - !Ref "InstanceProfileRole"
  AmiAutomationDoc:
    Type: "AWS::SSM::Document"
    Properties:
      DocumentType: "Automation"
      Content: 
        schemaVersion: "0.3"
        description: "Create a new AMI"
        parameters:
          SourceAmiId:
            type: "String"
            description: "AMI to patch"
          TargetAmiName:
            type: "String"
            description: "Name of new AMI"
        assumeRole: !GetAtt "AutomationRole.Arn"
        mainSteps:
          - name: "startInstance"
            action: "aws:runInstances"
            timeoutSeconds: 360
            maxAttempts: 1
            onFailure: "Abort"
            inputs:
              ImageId: "{{ SourceAmiId }}"
              InstanceType: "m4.large"
          - name: "DoStep1"
            action: "aws:runCommand"
            timeoutSeconds: 360
            maxAttempts: 1
            onFailure: "Abort"
            inputs:
              ImageId: "{{ SourceAmiId }}"
              InstanceType: "m4.large"
          - name: "stopInstance"
            action: "aws:changeInstanceState"
            maxAttempts: 1
            onFailure: "Continue"
            inputs:
              InstanceIds:
                - "{{ startInstance.InstanceIds }}"
              DesiredState: "stopped"
          - name: "createImage"
            action: "aws:createImage"
            maxAttempts: 1
            onFailure: "Continue"
            inputs:
              InstanceId: "{{ startInstance.InstanceIds }}"
              ImageName: "{{ TargetAmiName }}"
              ImageDescription: "AMI based on base image {{ SourceAmiId }}"
          - name: "terminateInstance"
            action: "aws:changeInstanceState"
            maxAttempts: 1
            onFailure: "Continue"
            inputs:
              InstanceIds:
                - "{{ startInstance.InstanceIds }}"
              DesiredState: "terminated"
        outputs:
          - createImage.ImageId
          - startInstance.InstanceIds
  DoStep1:
    Type: "AWS::SSM::Document"
    Properties:
      DocumentType: "Command"
      Content: 
        schemaVersion: "1.2"
        description: "Schedule scripts"
        runtimeConfig:
          aws:runPowerShellScript:
            properties:
              - runCommand:
                  - myScript.ps1

1 ответ

Решение

AWS: сон

Недавно AWS выпустила новые действия по автоматизации диспетчера систем Amazon EC2. Один из них является aws:sleep,

aws:sleep задерживает выполнение автоматизации на указанное количество времени.

Используйте это действие, чтобы вставить задержку в ваш рабочий процесс. Вы можете установить задержку на определенную продолжительность или до достижения определенного времени. Допустим, у вас есть несколько шагов типа Run Command типа aws:runCommand что вы запускаете для настройки экземпляра, и вы хотели бы обеспечить паузу между ними. С помощью aws:sleepВы можете вставить задержку.

В следующих примерах показано, как определить интервал ожидания, используя либо длительность, либо временную метку - оба формата отформатированы в соответствии с ISO 8601.

Использование JSON

{  
   "name":"sleep",
   "action":"aws:sleep",
   "inputs":{  
      "Duration":"PT10M"
   }
}

Длительность передается в качестве параметра:

{  
   "name":"sleep",
   "action":"aws:sleep",
   "inputs":{  
      "Duration":"PT{{delayInMinutes}}M"
   }
}

Использование временной метки для завершения интервала сна:

{  
   "name":"sleep",
   "action":"aws:sleep",
   "inputs":{  
      "Timestamp":"2017-05-30T01:00:00Z"
   }
}

Использование YAML

- name: "sleep"
  action: "aws:sleep"
  inputs:
    Duration: "PT10M"

Длительность передается в качестве параметра:

- name: "sleep"
  action: "aws:sleep"
  inputs:
    Duration: "PT{{ delayInMinutes }}M"

Использование временной метки для завершения интервала сна:

- name: "sleep"
  action: "aws:sleep"
  inputs:
    Timestamp: "2017-05-30T01:00:00Z"
Другие вопросы по тегам