AWS Fargate에서 GitLab CI 자동 스케일링

Tier: Free, Premium, Ultimate Offering: GitLab.com, 자체 관리

GitLab의 사용자 지정 실행기AWS Fargate 을 위한 드라이버로, Amazon Elastic Container Service (ECS)에서 각 GitLab CI 작업을 실행하기 위해 컨테이너를 자동으로 시작합니다.

이 문서의 작업을 완료하면 실행기가 GitLab에서 시작된 작업을 실행할 수 있습니다. GitLab에서 커밋이 발생할 때마다, GitLab 인스턴스는 새 작업이 사용 가능하다고 실행기에 통지합니다. 이후 실행기는 AWS ECS에서 구성한 작업 정의에 기반하여 대상 ECS 클러스터에서 새 작업을 시작합니다. AWS ECS 작업 정의를 구성하여 Docker 이미지를 사용하도록 할 수 있으므로, AWS Fargate에서 실행할 수 있는 빌드의 유형에 대해 완전한 유연성을 가질 수 있습니다.

GitLab Runner Fargate Driver Architecture

본 문서는 구현에 대한 초기 이해를 제공하기 위한 예시이며, 실제 운영에는 추가 보안이 필요합니다. 예를 들어, 두 개의 AWS 보안 그룹을 원할 수 있습니다:

  • 하나는 GitLab Runner를 호스팅하는 EC2 인스턴스에서 사용되며, 제한된 외부 IP 범위에서의 SSH 연결만 허용합니다 (관리용).
  • 하나는 Fargate 작업에 적용되며, EC2 인스턴스에서만 SSH 트래픽을 허용합니다.

또한, ECS 작업은 IAM 권한이 필요하거나, ECR 이외의 비공개 컨테이너 레지스트리의 경우 작업에 대한 개인 레지스트리 인증이 필요합니다.

AWS 인프라의 프로비저닝 및 설정을 자동화하려면 CloudFormation 또는 Terraform을 사용할 수 있습니다.

경고: CI/CD 작업은 .gitlab-ci.yml 파일의 image: 키워드 값 대신 ECS 작업에 정의된 이미지를 사용합니다. 이 구성은 여러 인스턴스의 실행기 관리자 또는 크기가 큰 빌드 컨테이너를 초래할 수 있습니다. AWS는 이 문제를 인지하고 GitLab은 해결 방법을 추적하고 있습니다. 공식 AWS EKS Blueprints를 따라 EKS 클러스터를 생성하는 것을 고려해 볼 수 있습니다.

경고: Fargate는 컨테이너 호스트를 추상화하여 컨테이너 호스트 속성에 대한 구성 가능성을 제한합니다. 이는 Fargate에서 고 IO(입출력)가 필요한 실행기 워크로드에 영향을 미치며, 이러한 속성은 Fargate에서 제한적이거나 구성 가능하지 않습니다. Fargate에서 GitLab Runner를 사용하기 전에, CPU, 메모리, 디스크 IO 또는 네트워크 IO에 대한 높거나 극단적인 컴퓨팅 특성을 가진 실행기 워크로드가 Fargate에 적합한지 확인하세요.

전제 조건

시작하기 전에 다음 사항을 갖추고 있어야 합니다:

  • AWS IAM 사용자의 EC2, ECS 및 ECR 리소스를 생성하고 구성할 수 있는 권한이 있는 사용자.
  • AWS VPC 및 서브넷.
  • 하나 이상의 AWS 보안 그룹.

단계 1: AWS Fargate 작업을 위해 컨테이너 이미지 준비

컨테이너 이미지를 준비하십시오. 이 이미지는 GitLab 작업 실행 시 사용할 레지스트리에 업로드되어 컨테이너를 생성하는 데 사용됩니다.

  1. 이미지에 CI 작업을 빌드하는 데 필요한 도구가 포함되어 있는지 확인하십시오. 예를 들어, Java 프로젝트의 경우 Java JDK와 Maven 또는 Gradle과 같은 빌드 도구가 필요합니다. Node.js 프로젝트의 경우 nodenpm이 필요합니다.
  2. 실행기의 아티팩트와 캐싱을 처리하는 GitLab Runner가 이미지에 포함되어 있는지 확인하십시오. 자세한 정보는 사용자 정의 실행기 문서Run 단계 섹션을 참조하십시오.
  3. 컨테이너 이미지가 공개 키 인증을 통한 SSH 연결을 수락할 수 있는지 확인하십시오. 이 연결은 실행기가 .gitlab-ci.yml 파일에 정의된 빌드 명령을 AWS Fargate의 컨테이너로 보내기 위해 사용됩니다. SSH 키는 Fargate 드라이버에 의해 자동으로 관리됩니다. 컨테이너는 SSH_PUBLIC_KEY 환경 변수에서 키를 수락할 수 있어야 합니다.

Debian 예제를 확인하여 GitLab Runner와 SSH 구성이 포함된 이미지를 확인하세요. Node.js 예제를 확인하세요.

단계 2: 컨테이너 이미지를 레지스트리에 푸시

이미지를 만든 후, ECS 작업 정의에서 사용할 수 있도록 이미지를 컨테이너 레지스트리에 게시하세요.

  • ECR에 리포지토리를 생성하고 이미지를 푸시하려면 Amazon ECR Repositories 문서를 참조하세요.
  • AWS CLI를 사용하여 이미지를 ECR에 푸시하려면 AWS CLI 사용 시작 문서를 참조하세요.
  • GitLab 컨테이너 레지스트리를 사용하려면 Debian 또는 NodeJS 예제를 사용할 수 있습니다. Debian 이미지는 registry.gitlab.com/tmaczukin-test-projects/fargate-driver-debian:latest에 게시되었습니다. Node.js 예제 이미지는 registry.gitlab.com/aws-fargate-driver-demo/docker-nodejs-gitlab-ci-fargate:latest에 게시되었습니다.

단계 3: GitLab Runner를 위한 AWS EC2 인스턴스 생성

지금 AWS EC2 인스턴스를 만들어보겠습니다. 다음 단계에서 GitLab Runner를 설치할 것입니다.

  1. https://console.aws.amazon.com/ec2/v2/home#LaunchInstanceWizard로 이동하세요.
  2. 인스턴스에서 Ubuntu Server 18.04 LTS AMI를 선택하세요. 지역에 따라 이름이 다를 수 있습니다.
  3. 인스턴스 유형은 t2.micro를 선택하세요. 다음: 인스턴스 구성을 클릭하세요.
  4. 인스턴스 수에 대한 기본값을 유지하세요.
  5. 네트워크에서 VPC를 선택하세요.
  6. 퍼블릭 IP 자동 할당사용으로 설정하세요.
  7. IAM 역할에서 새 IAM 역할 만들기를 클릭하세요. 이 역할은 테스트 용도로 사용되며 안전하지 않습니다.
    1. 역할 만들기를 클릭하세요.
    2. AWS 서비스를 선택하고, 일반적인 사용 사례 아래에서 EC2를 클릭하세요. 그런 다음 다음: 권한을 클릭하세요.
    3. AmazonECS_FullAccess 정책에 대한 확인란을 선택하세요. 다음: 태그를 클릭하세요.
    4. 다음: 검토를 클릭하세요.
    5. IAM 역할의 이름을 입력하고(fargate-test-instance와 같은) 역할 만들기를 클릭하세요.
  8. 인스턴스를 만드는 브라우저 탭으로 돌아가세요.
  9. 새 IAM 역할 만들기 왼쪽에 새 IAM 역할 만들기 버튼을 클릭하고 fargate-test-instance 역할을 선택하세요. 다음: 스토리지 추가를 클릭하세요.
  10. 다음: 태그 추가를 클릭하세요.
  11. 다음: 보안 그룹 구성을 클릭하세요.
  12. 새 보안 그룹 생성을 선택하고 fargate-test로 이름을 지정하고, SSH에 대한 규칙이 정의되었는지 확인하세요 (유형: SSH, 프로토콜: TCP, 포트 범위: 22). 내부 및 외부 규칙의 IP 범위를 지정해야 합니다.
  13. 검토 및 시작을 클릭하세요.
  14. 시작을 클릭하세요.
  15. 선택 사항. 새 키 페어 생성을 선택하고 fargate-runner-manager로 이름을 지정하고 키 페어 다운로드 버튼을 클릭하세요. SSH용 개인 키가 컴퓨터에 다운로드됩니다(브라우저에서 구성된 디렉토리를 확인하세요).
  16. 인스턴스 시작을 클릭하세요.
  17. 인스턴스 보기를 클릭하세요.
  18. 인스턴스가 실행될 때까지 기다리세요. IPv4 공개 IP 주소를 확인하세요.

단계 4: EC2 인스턴스에 GitLab Runner 설치 및 구성

이제 Ubuntu 인스턴스에 GitLab Runner를 설치하세요.

  1. GitLab 프로젝트의 설정 > CI/CD로 이동하여 Runners 섹션을 확장하세요. 특정 Runner 수동 설정 아래에서 등록 토큰을 확인하세요.
  2. 키 파일이 올바른 권한을 갖도록 다음 명령을 실행하여 확인하세요: chmod 400 path/to/downloaded/key/file.
  3. 다음 SSH 명령을 사용하여 생성한 EC2 인스턴스에 연결하세요:

    ssh ubuntu@[ip_address] -i path/to/downloaded/key/file
    
  4. 성공적으로 연결되면 다음 명령을 실행하세요:

    sudo mkdir -p /opt/gitlab-runner/{metadata,builds,cache}
    curl -s "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
    sudo apt install gitlab-runner
    
  5. 다음 명령을 실행하여 등록 단계에서 확인한 GitLab URL 및 등록 토큰과 함께 실행하세요:

    sudo gitlab-runner register --url "https://gitlab.com/" --registration-token TOKEN_HERE --name fargate-test-runner --run-untagged --executor custom -n
    
  6. sudo vim /etc/gitlab-runner/config.toml을 실행하고 다음 내용을 추가하세요:

    concurrent = 1
    check_interval = 0
    
    [session_server]
      session_timeout = 1800
    
    [[runners]]
      name = "fargate-test"
      url = "https://gitlab.com/"
      token = "__REDACTED__"
      executor = "custom"
      builds_dir = "/opt/gitlab-runner/builds"
      cache_dir = "/opt/gitlab-runner/cache"
      [runners.custom]
        volumes = ["/cache", "/path/to-ca-cert-dir/ca.crt:/etc/gitlab-runner/certs/ca.crt:ro"]
        config_exec = "/opt/gitlab-runner/fargate"
        config_args = ["--config", "/etc/gitlab-runner/fargate.toml", "custom", "config"]
        prepare_exec = "/opt/gitlab-runner/fargate"
        prepare_args = ["--config", "/etc/gitlab-runner/fargate.toml", "custom", "prepare"]
        run_exec = "/opt/gitlab-runner/fargate"
        run_args = ["--config", "/etc/gitlab-runner/fargate.toml", "custom", "run"]
        cleanup_exec = "/opt/gitlab-runner/fargate"
        cleanup_args = ["--config", "/etc/gitlab-runner/fargate.toml", "custom", "cleanup"]
    
  7. 사설 CA를 사용하는 자체 관리 인스턴스가 있는 경우 다음 라인을 추가하세요:

        volumes = ["/cache", "/path/to-ca-cert-dir/ca.crt:/etc/gitlab-runner/certs/ca.crt:ro"]
    

    인증서 신뢰에 대해 자세히 알아보기.

    아래의 config.toml 파일 섹션은 등록 명령에 의해 생성됩니다. 수정하지 마세요.

    concurrent = 1
    check_interval = 0
    
    [session_server]
      session_timeout = 1800
    
    name = "fargate-test"
    url = "https://gitlab.com/"
    token = "__REDACTED__"
    executor = "custom"
    
  8. sudo vim /etc/gitlab-runner/fargate.toml을 실행하고 다음 내용을 추가하세요:

    LogLevel = "info"
    LogFormat = "text"
    
    [Fargate]
      Cluster = "test-cluster"
      Region = "us-east-2"
      Subnet = "subnet-xxxxxx"
      SecurityGroup = "sg-xxxxxxxxxxxxx"
      TaskDefinition = "test-task:1"
      EnablePublicIP = true
    
    [TaskMetadata]
      Directory = "/opt/gitlab-runner/metadata"
    
    [SSH]
      Username = "root"
      Port = 22
    
    • Cluster 값을 및 TaskDefinition의 이름을 확인하세요. 이 예제는 test-task를 보여주며 :1은 리비전 번호입니다. 리비전 번호가 지정되지 않으면 최신 active 리비전이 사용됩니다.
    • 지역을 선택하세요. Subnet 값을 실행자 관리자 인스턴스에서 가져옵니다.
    • 보안 그룹 ID를 찾으려면:
      1. AWS에서 인스턴스 목록에서 생성한 EC2 인스턴스를 선택하세요. 세부정보가 표시됩니다.
      2. 보안 그룹 아래에서 만든 그룹 이름을 클릭하세요.
      3. 보안 그룹 ID를 복사하세요.

      프로덕션 환경에서는 AWS 지침에 따라 보안 그룹의 설정 및 사용을 진행하세요.

    • EnablePublicIP을 true로 설정하면 작업 컨테이너의 공용 IP가 수집되어 SSH 연걸을 수행합니다.
    • EnablePublicIP이 false로 설정된 경우:
      • Fargate 드라이버는 작업 컨테이너의 개인 IP를 사용합니다. false로 설정할 때 연결을 설정하려면 VPC의 보안 그룹은 22번 포트 (SSH)에 대한 들어오는 규칙을 가져야 합니다.
      • 외부 종속성을 가져오려면 프로비저닝된 AWS Fargate 컨테이너가 공용 인터넷에 액세스해야 합니다. AWS Fargate 컨테이너의 공용 인터넷 액세스를 제공하려면 VPC에 NAT 게이트웨이를 사용할 수 있습니다.
    • SSH 서버의 포트 번호는 선택 사항입니다. 생략하면 기본 SSH 포트(22)가 사용됩니다.
    • 섹션 설정에 대한 자세한 정보는 Fargate 드라이버 문서를 참조하세요.
  9. Fargate 드라이버를 설치하세요:

    sudo curl -Lo /opt/gitlab-runner/fargate "https://gitlab-runner-custom-fargate-downloads.s3.amazonaws.com/latest/fargate-linux-amd64"
    sudo chmod +x /opt/gitlab-runner/fargate
    

단계 5: ECS Fargate 클러스터 생성

Amazon ECS 클러스터는 ECS 컨테이너 인스턴스의 그룹화입니다.

  1. https://console.aws.amazon.com/ecs/home#/clusters로 이동합니다.
  2. 클러스터 생성을 클릭합니다.
  3. Networking only 유형을 선택합니다. 다음 단계를 클릭합니다.
  4. fargate.toml에 지정된 것과 같이 test-cluster이름을 지정합니다.
  5. 생성을 클릭합니다.
  6. 클러스터 보기를 클릭합니다. Cluster ARN 값에서 지역 및 계정 ID 부분을 참고합니다.
  7. 클러스터 업데이트 버튼을 클릭합니다.
  8. 기본 수용 공급자 전략 옆에 다른 공급자 추가를 클릭하고 FARGATE를 선택합니다. 업데이트를 클릭합니다.

ECS Fargate에서 클러스터를 설정하고 작업하는 방법에 대한 자세한 지침은 AWS 문서를 참조하세요.

단계 6: ECS 작업 정의 생성

이 단계에서는 CI 빌드에 사용할 컨테이너 이미지를 참조하는 Fargate 유형의 작업 정의를 생성합니다.

  1. https://console.aws.amazon.com/ecs/home#/taskDefinitions로 이동합니다.
  2. 새 작업 정의 작성을 클릭합니다.
  3. FARGATE를 선택하고 다음 단계를 클릭합니다.
  4. test-task로 이름을 지정합니다. (참고: 이름은 fargate.toml 파일에 정의된 이름이지만 :1은 제외합니다).
  5. 작업 메모리 (GB)작업 CPU (vCPU)의 값을 선택합니다.
  6. 컨테이너 추가를 클릭합니다. 그런 다음:
    1. ci-coordinator로 이름을 지정하여 Fargate 드라이버가 SSH_PUBLIC_KEY 환경 변수를 삽입할 수 있도록합니다.
    2. 이미지를 정의합니다 (예: registry.gitlab.com/tmaczukin-test-projects/fargate-driver-debian:latest).
    3. 22/TCP의 포트 매핑을 정의합니다.
    4. 추가를 클릭합니다.
  7. 생성을 클릭합니다.
  8. 작업 정의 보기를 클릭합니다.

경고: 단일 Fargate 작업은 하나 이상의 컨테이너를 시작할 수 있습니다. Fargate 드라이버는 ci-coordinator 이름을 가진 컨테이너에만 SSH_PUBLIC_KEY 환경 변수를 삽입합니다. Fargate 드라이버에서 사용하는 모든 작업 정의에이 이름을 가진 컨테이너가 있어야 합니다. 이 이름을 가진 컨테이너는 앞에서 설명한대로 SSH 서버와 모든 GitLab Runner 요구 사항이 설치된 컨테이너여야 합니다.

작업 정의 설정 및 작업에 대해 자세히 알아보려면 AWS 문서를 참조하세요.

AWS ECR에서 이미지를 시작하는 데 필요한 ECS 서비스 권한에 대한 정보는 AWS 문서 Amazon ECS 작업 실행 IAM 역할을 참조하세요.

AWS로 호스팅된 GitLab 인스턴스를 포함한 개인 레지스트리에 ECS가 인증하는 방법에 대한 정보는 AWS 문서 작업용 개인 레지스트리 인증를 참조하세요.

이 시점에서 러너 관리자 및 Fargate Driver가 구성되어 AWS Fargate에서 작업을 실행할 준비가되었습니다.

단계 7: 구성 테스트

이제 구성을 사용할 준비가되어 있어야 합니다.

  1. GitLab 프로젝트에서 간단한 .gitlab-ci.yml 파일을 생성합니다.

    test:
      script:
        - echo "It works!"
        - for i in $(seq 1 30); do echo "."; sleep 1; done
    
  2. 프로젝트의 CI/CD > 파이프라인으로 이동합니다.
  3. 파이프라인 실행을 클릭합니다.
  4. 브랜치 및 변수를 업데이트하고 파이프라인 실행을 클릭합니다.

참고: .gitlab-ci.yml 파일의 imageservice 키워드는 무시됩니다. 러너는 작업 정의에서 지정된 값만 사용합니다.

정리

AWS Fargate로 사용자 정의 실행기를 테스트한 후 정리하려면 다음 객체를 제거합니다:

  • 단계 3에서 생성된 EC2 인스턴스, 키페어, IAM 역할 및 보안 그룹.
  • 단계 5에서 생성된 ECS Fargate 클러스터.
  • 단계 6에서 생성된 ECS 작업 정의.

개인 AWS Fargate 작업 구성

보안 수준을 유지하려면 개인 AWS Fargate 작업을 구성합니다. 이 구성에서 실행기는 내부 AWS IP 주소만 사용하고 AWS에서만 외부 트래픽을 허용하여 CI 작업을 개인 AWS Fargate 인스턴스에서 실행합니다.

개인 AWS Fargate 작업을 구성하려면 다음 단계를 완료하여 AWS를 구성하고 개인 서브넷에서 AWS Fargate 작업을 실행합니다:

  1. 기존 공용 서브넷이 VPC 주소 범위에서 모든 IP 주소를 예약하지 않았는지 확인합니다. VPC 및 서브넷의 CIRD 주소 범위를 검사합니다. 서브넷 CIRD 주소 범위가 VPC의 CIRD 주소 범위의 하위 집합인 경우 단계 2 및 4를 건너뜁니다. 그렇지 않으면 VPC에 빈 주소 범위가 없으므로 VPC와 공용 서브넷을 삭제하고 다시 만들어야 합니다:
    1. 기존 서브넷과 VPC를 삭제합니다.
    2. 삭제한 VPC와 동일한 구성으로 VPC를 생성하고 CIRD 주소를 업데이트합니다. 예: 10.0.0.0/23.
    3. 삭제한 서브넷과 동일한 구성으로 공용 서브넷을 생성합니다. VPC 주소 범위의 하위 집합인 CIRD 주소를 사용합니다. 예: 10.0.0.0/24.
  2. 공용 서브넷과 동일한 구성으로 개인 서브넷을 생성합니다. 공용 서브넷 범위와 겹치지 않는 CIRD 주소 범위를 사용합니다. 예: 10.0.1.0/24.
  3. NAT 게이트웨이를 생성하고 공용 서브넷에 배치합니다.
  4. 개인 서브넷 라우팅 테이블을 수정하여 대상 0.0.0.0/0이 NAT 게이트웨이를 가리키도록합니다.
  5. farget.toml 구성을 업데이트합니다:

    Subnet = "private-subnet-id"
    EnablePublicIP = false
    UsePublicIP = false
    
  6. fargate 작업과 연결된 IAM 역할에 다음 인라인 정책을 추가합니다 (fargate 작업에 연결된 IAM 역할은 일반적으로 ecsTaskExecutionRole이라는 이름을 가지며 이미 있어야 합니다.)

    {
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:GetSecretValue",
                    "kms:Decrypt",
                    "ssm:GetParameters"
                ],
                "Resource": [
                    "arn:aws:secretsmanager:*:<account-id>:secret:*",
                    "arn:aws:kms:*:<account-id>:key/*"
                ]
            }
        ]
    }
    
  7. 보안 그룹의 “수신 규칙”을 보안 그룹 자체를 참조하도록 변경합니다. AWS 구성 대화상자에서:
    • 유형ssh로 설정합니다.
    • 출발지사용자 정의로 설정합니다.
    • 보안 그룹을 선택합니다.
    • 모든 호스트에서 SSH 액세스를 허용하는 기존 수신 규칙을 제거합니다.

경고: 기존 수신 규칙을 제거하면 Amazon Elastic Compute Cloud 인스턴스에 SSH를 사용하여 연결할 수 없게됩니다.

추가 정보는 다음 AWS 문서를 참조하세요:

문제 해결

구성 테스트 시 클러스터에서 Container Instance가 찾을 수 없음 오류

error="starting new Fargate task: running new task on Fargate: error starting AWS Fargate Task: InvalidParameterException: No Container Instances were found in your cluster."

AWS Fargate 드라이버는 ECS 클러스터가 기본 용량 제공자 전략로 구성되어 있어야 합니다.

자세한 내용은 다음을 참조하세요:

  • 각 Amazon ECS 클러스터에는 기본 용량 제공자 전략이 연결되어 있습니다. 다른 용량 제공자 전략이나 실행 유형이 지정되지 않은 경우 클러스터는 작업을 실행하거나 서비스를 생성할 때 이 전략을 사용합니다.
  • 만일 capacityProviderStrategy가 지정된 경우 launchType 매개변수는 생략해야 합니다. 만일 capacityProviderStrategy 또는 launchType이 지정되지 않은 경우 클러스터의 defaultCapacityProviderStrategy가 사용됩니다.

작업 실행 시 메타데이터 파일이 존재하지 않음 오류

Application execution failed PID=xxxxx error="obtaining information about the running task: trying to access file \"/opt/gitlab-runner/metadata/<runner_token>-xxxxx.json\": file does not exist" cleanup_std=err job=xxxxx project=xx runner=<runner_token>

IAM 역할 정책이 올바르게 구성되어 있고 /opt/gitlab-runner/metadata/에 메타데이터 JSON 파일을 생성할 수 있는 권한이 있는지 확인하세요. 비 프로덕션 환경에서 테스트하려면 AmazonECS_FullAccess 정책을 사용하세요. 조직의 보안 요건에 따라 IAM 역할 정책을 검토하세요.

작업 실행 시 연결 시간 초과 오류

Application execution failed PID=xxxx error="executing the script on the remote host: executing script on container with IP \"172.x.x.x\": connecting to server: connecting to server \"172.x.x.x:22\" as user \"root\": dial tcp 172.x.x.x:22: connect: connection timed out"

만약 EnablePublicIPfalse로 구성되어 있다면 VPC 보안 그룹이 SSH 연결을 허용하는 인바운드 규칙을 가져야 합니다. AWS Fargate 태스크 컨테이너는 GitLab Runner EC2 인스턴스에서 SSH 트래픽을 수락할 수 있어야 합니다.

작업 실행 시 연결이 거부됨 오류

Application execution failed PID=xxxx error="executing the script on the remote host: executing script on container with IP \"10.x.x.x\": connecting to server: connecting to server \"10.x.x.x:22\" as user \"root\": dial tcp 10.x.x.x:22: connect: connection refused"

태스크 컨테이너가 포트 22를 노출하고 포트 매핑이 단계 6: ECS 태스크 정의 생성의 지침에 따라 구성되어 있는지 확인하세요. 포트가 노출되어 있고 컨테이너가 구성되어 있는 경우:

  1. Amazon ECS > 클러스터 > 태스크에서 컨테이너의 오류를 확인하세요.
  2. Stopped 상태의 태스크를 확인하고 가장 최근에 실패한 태스크를 확인하세요. 로그 탭에 컨테이너 실패에 대한 더 많은 정보가 있습니다.

또는 도커 컨테이너를 로컬에서 실행할 수 있는지 확인하세요.

작업 실행 시 ssh: 핸드셰이크 실패: ssh: 인증할 수 없음, 시도된 방법 [none publickey], 지원되는 방법이 없음 오류

이 오류는 AWS Fargate 드라이버의 이전 버전으로 인해 지원되지 않는 키 유형이 사용되어 발생합니다.

Application execution failed PID=xxxx error="executing the script on the remote host: executing script on container with IP \"172.x.x.x\": connecting to server: connecting to server \"172.x.x.x:22\" as user \"root\": ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain"

이 문제를 해결하려면 GitLab Runner EC2 인스턴스에 최신 AWS Fargate 드라이버를 설치하세요:

sudo curl -Lo /opt/gitlab-runner/fargate "https://gitlab-runner-custom-fargate-downloads.s3.amazonaws.com/latest/fargate-linux-amd64"
sudo chmod +x /opt/gitlab-runner/fargate