Рубрики
Uncategorized

Github Самоустановленные бегуны на AWS — часть 2 — EC2

«Действия GitHub позволяют легко автоматизировать все ваши рабочие процессы вашего программного обеспечения, теперь с CI / CD World-Class». … Помечено с AWS, EC2, Github, CICD.

» Действия GitHub позволяют легко автоматизировать все ваши рабочие процессы вашего программного обеспечения, теперь с CI/CD World-Class ».

Вот как GitHub описывает их встроенную инструмент CI/CD. Я должен сказать, что мне очень нравится это И это то, что Github отсутствует раньше. Многие из Git как поставщики услуг, GitLab, BitBucket, Azure DEVOPS, имели комплектную запись CI/CD. С GitHub вам всегда нужно использовать внешний инструмент.

Это часть вторая в серии о том, как создавать и настроить свой собственный самоуверенный бегун в AWS.

Все используемые код можно найти в моем Github repo

Часть один, короткая рекомендация

Частично я попробовал и показал, как бежать самих прослушиваемых бегунов, используя Фаргат. Заключение было то, что это не хорошее совпадение. Если вы пропустили его, вы можете найти это здесь

Часть два, EC2

Вместо этого в этой части я покажу, как использовать группы EC2 и Auto Cleaning, чтобы запустить и размещать бегунов. Как всегда, нам нужно начать с настройки VPC. Я запускаю все в простых 2 публичных подсети VPC. Используемый шаблон Cloudfationation находится на Github

Автоматически добавлять и зарегистрировать бегун

Создать группу автоматической масштабирования

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

  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AutoScalingGroupName: github-runners-asg
      Cooldown: 300
      DesiredCapacity: 1
      MaxSize: 5
      MinSize: 0
      HealthCheckGracePeriod: 300
      HealthCheckType: EC2
      LaunchConfigurationName: !Ref LaunchConfiguration
      VPCZoneIdentifier:
        - Fn::ImportValue: !Sub ${VpcStackName}:PublicSubnet1
        - Fn::ImportValue: !Sub ${VpcStackName}:PublicSubnet2

Мы устанавливаем желаемую емкость в один случай с возможностью масштабирования до пяти случаев.

Создать шаблон запуска

Для экземпляра EC2 для установки и настройки все при запуске из группы автоматического масштабирования мы создаем шаблон запуска. Мы используем пользовательскую часть данных запуска шаблона для установки и регистрации бегуна. Таким образом, каждый раз, когда новый экземпляр создан группа AWS Auto Scaling Group (ASG), экземпляр будет зарегистрироваться в GitHub.

  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId: !Ref EC2ImageId
      InstanceType: t3.micro
      IamInstanceProfile: !GetAtt EC2InstanceProfile.Arn
      KeyName: !Ref SSHKeyName
      SecurityGroups:
        - !Ref SecurityGroup
      UserData:
        Fn::Base64:
          Fn::Sub: |
            #!/bin/bash -xe
            yum update -y
            yum install docker -y
            yum install git -y
            yum install jq -y 
            sudo usermod -a -G docker ec2-user
            sudo systemctl start docker
            sudo systemctl enable docker
            export RUNNER_ALLOW_RUNASROOT=true
            mkdir actions-runner
            cd actions-runner
            curl -O -L https://github.com/actions/runner/releases/download/v2.262.1/actions-runner-linux-x64-2.262.1.tar.gz
            tar xzf ./actions-runner-linux-x64-2.262.1.tar.gz
            PAT=
            token=$(curl -s -XPOST \
                -H "authorization: token $PAT" \
                https://api.github.com/repos///actions/runners/registration-token |\
                jq -r .token)
            sudo chown ec2-user -R /actions-runner
            ./config.sh --url https://github.com// --token $token --name "my-runner-$(hostname)" --work _work
            sudo ./svc.sh install
            sudo ./svc.sh start
            sudo chown ec2-user -R /actions-runner

Еще раз нам нужно установить Runner_ale_runasroot true, так как пользовательский скрипт работает как root. Когда экземпляр запущен и зарегистрирован с GitHub, он готов начать обслуживание строить рабочие места.

Автоматически удалить бегун

Автоматически регистрация и запуск рабочих мест — это только одна часть в цепочке. Если экземпляр удаляется группой автоматической масштабирования, мы также хотим, чтобы она его удалила от бассейна бегунов в Github. Для этого мы связываем пару особенностей и услуг вместе.

Крючки жизненного цикла

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

  TerminateLifecycleHook:
    Type: AWS::AutoScaling::LifecycleHook
    Properties:
      AutoScalingGroupName: !Ref AutoScalingGroup
      LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING

AWS Systems Manager

Когда экземпляр входит в завершение: состояние ожидания нам нравится управлять сценарием на экземпляре. Для этого мы используем документы AWS Systems Manager, а затем отправьте команду для агента SSM для запуска документа.

  RemoveDocument:
    Type: AWS::SSM::Document
    Properties:
      DocumentType: Command
      Tags:
        - Key: Name
          Value: github-actions-install-register-runner
      Content:
        schemaVersion: "2.2"
        description: Command Document de-register GitHub Actions Runner
        mainSteps:
          - action: "aws:runShellScript"
            name: "deregister"
            inputs:
              runCommand:
                - "cd /actions-runner"
                - "sudo ./svc.sh stop"
                - "sudo ./svc.sh uninstall"
                - "PAT="
                - 'token=$(curl -s -XPOST -H "authorization: token $PAT" https://api.github.com/repos///actions/runners/remove-token | jq -r .token)'
                - 'su ec2-user -c "./config.sh remove --token $token"'

Документ будет запущен скрипт оболочки. Мы останавливаемся и удалите службу Runner Github. Получить токен удалить и удаляет бегун от GitHub. Документ будет запущен как root, и поскольку команда удаления игнорирует Runner_ale_runasroot Флаг Мы уверены, что мы запускаем как пользователь EC2. Это действительно важно. Удалить не будет работать иначе. Вот почему мы предоставляем полный доступ пользователя EC2-пользователя к папке бегунов, когда мы устанавливаем и запускаем службу в конфигурации запуска.

Eventbridge

Чтобы получить уведомление, когда событие жизненного цикла происходит, можно использовать SNS. Однако я решил использовать EventBridge вместо многих причин. В первую очередь из-за EventBridge поддерживает больше конечных точек. Поэтому я настроил события:: ПРАВИЛЬНОЕ, чтобы обнаружить изменение и запустить функцию лямбда, которая запускает документ SSM.

  TerminatingRule:
    Type: AWS::Events::Rule
    Properties:
      EventPattern: !Sub |
        {
          "source": [
            "aws.autoscaling"
          ],
          "detail-type": [
            "EC2 Instance-terminate Lifecycle Action"
          ]
        }
      Targets:
        - Arn: !GetAtt LifeCycleHookTerminatingFunction.Arn
          Id: target

Лямбда

Когда крючок жизненного цикла обнаруживается EventBridge, будет запущена функция лямбда. Функция Lambda позвонит SSM RunCommand API для запуска документа SSM. Как уже обсуждалось ранее, документ будет запустить скрипт, который позвонит GitHub и удалит бегун. Когда документ выполнен работает, нам нужно уведомить ASG, чтобы продолжать прекращать экземпляр.

  LifeCycleHookTerminatingFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: github-runners-asg-lifecycle-hook-terminate
      Runtime: python3.6
      MemorySize: 256
      Timeout: 30
      CodeUri: ./lambdas
      Handler: terminate.handler
      Role: !GetAtt LifeCycleHookTerminatingFunctionRole.Arn
      Environment:
        Variables:
          SSM_DOCUMENT_NAME: !Ref RemoveDocument

Как сказано, что нам нужно позвонить в API SSM RunCommand и вызовите ASG API для продолжения прекращения.

def handler(event, context):
    message = event['detail']
    if LIFECYCLE_KEY in message and ASG_KEY in message:
        life_cycle_hook = message[LIFECYCLE_KEY]
        auto_scaling_group = message[ASG_KEY]
        instance_id = message[EC2_KEY]
        ssm_document = os.environ[SSM_DOCUMENT_KEY]
        success = run_ssm_command(ssm_document, instance_id)
        result = 'CONTINUE'
        if not success:
            result = 'ABANDON'
        notify_lifecycle(life_cycle_hook, auto_scaling_group,
                         instance_id, result)
    return {}

def run_ssm_command(ssm_document, instance_id):
    ssm_client = boto3.client('ssm')
    try:
        instances = [str(instance_id)]
        response = ssm_client.send_command(DocumentName=ssm_document,
                                           InstanceIds=instances,
                                           Comment='Remove GitHub Runner',
                                           TimeoutSeconds=1200)
    except Exception as e:
        return False
    return True

def notify_lifecycle(life_cycle_hook, auto_scaling_group, instance_id, result):
    asg_client = boto3.client('autoscaling')
    try:
        asg_client.complete_lifecycle_action(
            LifecycleHookName=life_cycle_hook,
            AutoScalingGroupName=auto_scaling_group,
            LifecycleActionResult=result,
            InstanceId=instance_id
        )
    except Exception as e:
        logger.error(
            "Lifecycle hook notified could not be executed: %s", str(e))
        raise e

Вывод

Запуск самоуверенных бегунов GitHub на экземплярах EC2 в группе автоматической масштабирования с жизненным циклом крючков для удаления работает очень хорошо. Теперь мы можем добавить и удалять экземпляры в ASG и у них зарегистрироваться и удалите их. Но я все еще не счастлив. Что если мы получим всплеск в количестве рабочих мест, и очередь расти? Хотя мы бегаем в ASG, мы все еще не автоматически масштабируем.

Время бросить автоматическое масштабирование в горшок …. Оставайтесь настроиться на часть 3.

Код

Все код в этом блоге можно найти на Гадость

Оригинал: «https://dev.to/jimmydqv/github-self-hosted-runners-on-aws-part-2-ec2-3jhj»