비공개 풀이 있는 비공개 JFrog Artifactory의 리소스에 액세스


이 페이지에서는 Cloud Build 비공개 풀을 사용하여 비공개 Virtual Private Cloud 네트워크에서 리소스에 액세스하는 방법을 설명합니다.

이 튜토리얼에서는 비공개 VPC 네트워크에서 호스팅되는 Compute Engine에 JFrog Artifactory를 만든 후 비공개 풀에서 실행되는 빌드를 구성하여 해당 Artifactory의 데이터에 액세스합니다. Jfrog Artifactory는 오픈소스 바이너리 저장소 관리자입니다.

목표

  • Compute Engine에서 Jfrog Artifactory 설정
  • Artifactory에 파일 업로드
  • 비공개 풀 만들기
  • 비공개 풀을 호스팅하는 서비스 프로듀서 네트워크를 Artifactory의 Virtual Private Cloud 네트워크에 피어링
  • 빌드 구성 파일을 작성하여 Artifactory의 데이터에 액세스

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine
  • Cloud Build

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine, Cloud Build, Service Networking APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine, Cloud Build, Service Networking APIs.

    Enable the APIs

옵션 A: Cloud Shell 사용

이 튜토리얼에 사용되는 Google Cloud CLI가 사전 설치된 Cloud Shell을 사용하여 이 튜토리얼을 따르면 됩니다. Cloud Shell을 사용하는 경우 이러한 명령줄 도구를 워크스테이션에 설치할 필요가 없습니다.

Cloud Shell을 사용하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔

  2. Google Cloud 콘솔 창 상단의 Cloud Shell 활성화 셸 활성화 버튼 버튼을 클릭합니다.

    Google Cloud 콘솔 하단에 있는 새 프레임 내에 Cloud Shell 세션이 열리면서 명령줄 프롬프트가 표시됩니다.

    Cloud Shell 세션

옵션 B: 로컬에서 명령줄 도구 사용

워크스테이션에서 이 튜토리얼을 따라하려면 다음 단계를 따라 필요한 도구를 설치합니다.

  1. Google Cloud CLI 설치

비공개 Artifactory 만들기

  1. 컨테이너에서 Compute Engine 인스턴스를 만듭니다.

    gcloud compute instances create-with-container jfrog \
    --container-image docker.bintray.io/jfrog/artifactory-jcr:latest \
    --zone us-central1-a
    
  2. SSH로 인스턴스에 연결합니다. 컨테이너가 초기화되려면 데 몇 분 정도 걸릴 수 있습니다.

    gcloud compute ssh --zone us-central1-a jfrog
    
  3. 다음 명령어를 실행하여 연결을 테스트합니다. 컨테이너가 준비되면 200 HTTP 코드, HTML 페이지 순으로 응답합니다.

    curl -i http://localhost:8081
    
  4. Artifactory에서 저장소를 만들려면 JFrog EULA(최종 사용자 라이선스 계약)에 서명해야 합니다.

    curl -XPOST -vu admin:password http://localhost:8081/artifactory/ui/jcr/eula/accept
    

    다음과 비슷한 출력이 표시됩니다.

        *   Trying 127.0.0.1:8081...
        * Connected to localhost (127.0.0.1) port 8081 (#0)
        * Server auth using Basic with user 'admin'
        > POST /artifactory/ui/jcr/eula/accept HTTP/1.1
        > Host: localhost:8081
        > Authorization: Basic ….
        > User-Agent: curl/7.74.0
        > Accept: */*
        >
        * Mark bundle as not supporting multiuse
        < HTTP/1.1 200 OK
        < X-JFrog-Version: Artifactory/7.19.9 71909900
        < X-Artifactory-Id: ….
        < X-Artifactory-Node-Id: jfrog2
        < SessionValid: false
        < Content-Length: 0
        < Date: Fri, 25 Jun 2021 19:08:10 GMT
    
        * Connection #0 to host localhost left intact
    

Artifactory에 파일 업로드

  1. Artifactory에 업로드할 txt 파일을 만듭니다.

    echo "Hello world" >> helloworld.txt
    
  2. JFrog에는 기본 예시 저장소가 제공됩니다. 기본 사용자 인증 정보를 사용하여 저장소에 업로드합니다.

    curl -u admin:password -X PUT \
    "http://localhost:8081/artifactory/example-repo-local/helloworld.txt" \
    -T helloworld.txt
    

    이는 다음을 반환해야 합니다.

        {
        "repo" : "example-repo-local",
        "path" : "/helloworld.txt",
        "created" : "2021-06-25T19:08:24.176Z",
        "createdBy" : "admin",
        "downloadUri" : "http://localhost:8081/artifactory/example-repo-local/helloworld.txt",
        "mimeType" : "text/plain",
        "size" : "12",
        "checksums" : {
          "sha1" : "...",
          "md5" : "...",
          "sha256" : "..."
        },
        "originalChecksums" : {
          "sha256" : "..."
        },
        "uri" : "http://localhost:8081/artifactory/example-repo-local/helloworld.txt"
        }
    
  3. exit을 입력하여 SSH 세션을 종료합니다.

  4. 비공개 내부 소스에서만 Artifactory에 액세스할 수 있도록 외부 IP 주소를 삭제합니다.

    gcloud compute instances delete-access-config --zone us-central1-a jfrog
    

Artifactory에서 데이터에 액세스해 보기

  1. 프로젝트 ID와 프로젝트 번호를 저장할 환경 변수를 설정합니다.

    PROJECT_ID=$(gcloud config list --format='value(core.project)')
    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
  2. JFrog 인스턴스의 내부 IP 주소를 볼 수 있도록 빌드에 사용 중인 서비스 계정에 Compute Engine 뷰어 역할을 부여합니다.

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:SERVICE_ACCOUNT \
        --role=roles/compute.viewer
    

    여기서 SERVICE_ACCOUNT는 서비스 계정 이메일입니다.

  3. Artifactory에서 읽을 다음 코드를 포함하는 cloudbuild.yaml이라는 파일을 만듭니다. 이 파일은 빌드 구성 파일입니다.

    첫 번째 단계에서는 생성된 Artifactory에서 내부 IP 주소를 가져옵니다. 두 번째 단계에서는 해당 주소로 요청을 보내 사용자가 만든 helloworld.txt 파일을 읽습니다. 권한과 네트워킹 오류를 더 쉽게 격리할 수 있도록 단계가 구분됩니다. 첫 번째 단계가 실패하면 이 오류는 권한 오류로 인한 것이며, 이전 단계에 표시된 것처럼 빌드 서비스 계정에 Compute Engine 리소스에 대한 액세스 권한이 있는지 확인해야 합니다. 두 번째 단계가 실패하면 네트워킹 오류가 발생합니다. 이 튜토리얼의 나머지 부분에서는 네트워크 구성을 설명합니다.

    steps:
      - id: Get Private Artifactory Address
        name: gcr.io/cloud-builders/gcloud
        entrypoint: /bin/bash
        args: 
          - -c
          - |
            gcloud compute instances describe jfrog \
            --zone us-central1-a \
            --format="value(networkInterfaces.networkIP)" >> _INTERNAL_IP_ADDRESS
    
      - id: Pull from Private Artifactory
        name: gcr.io/cloud-builders/curl
        entrypoint: /bin/bash
        args:
          - -c
          - |
            curl -u admin:password --connect-timeout 10.00 \
            http://$(cat _INTERNAL_IP_ADDRESS):8081/artifactory/example-repo-local/helloworld.txt
  4. 빌드 구성 파일을 사용하여 빌드를 시작합니다.

    기본적으로 Cloud Build에서 빌드를 실행하면 빌드가 공개 인터넷에 액세스하는 안전한 호스팅 환경에서 실행됩니다. 각 빌드는 자체 작업자에서 실행되며 다른 워크로드로부터 격리됩니다. 기본 풀에는 비공개 네트워크 액세스와 관련하여 환경을 맞춤설정할 수 있는 정도에 대한 제한이 있습니다. 이 예시에서는 공개 작업자에서 비공개 네트워크에 액세스하려고 합니다.

    다음 명령어를 사용하여 cloudbuild.yaml을 실행하면 실패합니다.

    gcloud builds submit --no-source
    

    출력은 다음과 같습니다.

    BUILD
    Starting Step #0 - "Get Private Artifactory Address"
    Step #0 - "Get Private Artifactory Address": Already have image (with digest): gcr.io/cloud-builders/gcloud
    Finished Step #0 - "Get Private Artifactory Address"
    Starting Step #1 - "Pull from Private Artifactory"
    Step #1 - "Pull from Private Artifactory": Already have image (with digest): gcr.io/cloud-builders/curl
    Step #1 - "Pull from Private Artifactory":   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
    Step #1 - "Pull from Private Artifactory":                                  Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:--  0:02:09 --:--:--     0curl: (7) Failed to connect to 10.128.0.2 port 8081: Connection timed out
    Finished Step #1 - "Pull from Private Artifactory"
    ERROR
    ERROR: build step 1 "gcr.io/cloud-builders/curl" failed: step exited with non-zero status: 7
    

    연결 시간 초과로 Cloud Build에서 내부 IP 주소에 연결할 수 없음을 확인할 수 있습니다. 이 비공개 리소스에 액세스하려면 Cloud Build 비공개 풀을 사용해야 합니다.

Artifactory의 VPC 네트워크와 서비스 프로듀서 네트워크 간에 비공개 연결 만들기

  1. 먼저 VPC 네트워크에서 인그레스가 허용되는지 확인합니다. jfrog 인스턴스가 있는 네트워크에 인바운드 내부 트래픽을 허용하는 방화벽 규칙을 만듭니다. 10.0.0.0/16 범위는 비공개 주소 공간에 있으며 아래 단계에서 Cloud Build 비공개 풀에 사용합니다.

    gcloud compute firewall-rules create allow-private-pools --direction=INGRESS \
    --priority=1000 --network=default --action=ALLOW --rules=all --source-ranges=10.0.0.0/16
    
  2. Cloud Build 비공개 풀에 작업자에 활용할 예약된 범위를 만듭니다. 예약된 범위는 Artifactory가 있는 네트워크에 있어야 합니다. 이 경우 default 컴퓨팅 네트워크입니다.

    예약된 범위를 설정할 때 두 가지 옵션이 있습니다. --addresses--prefix-length를 제공하여 범위를 명시적으로 지정하거나 Google Cloud에서 제공된 prefix-length를 기준으로 사용 가능한 범위를 프로비저닝하도록 허용할 수 있습니다.

    아래 예시에서는 만든 방화벽 규칙과 일치하도록 주소를 명시적으로 설정합니다. 비공개 풀은 이 주소 공간을 사용하며 인바운드 트래픽은 차단되지 않습니다.

    gcloud compute addresses create jfrog-ranges --global --purpose=VPC_PEERING \
    --addresses=10.0.0.0 --prefix-length=16 --network=default
    
  3. Service Networking API를 사용하여 VPC 네트워크를 피어링합니다.

    Cloud Build 비공개 풀은 Service Networking API를 사용하여 작업자를 실행합니다. Service Networking API는 내부 IP 주소에서 관리형 서비스를 제공할 수 있도록 해줍니다. 이를 위해서는 Cloud Build 비공개 풀 작업자를 실행하는 Google 관리 VPC를 자체 VPC와 피어링하면 됩니다. 완료되는 데 몇 분 정도 걸릴 수 있습니다.

    gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com \
    --ranges=jfrog-ranges --network=default
    

비공개 풀 만들기

  1. 이제 default VPC 네트워크를 Cloud Build 비공개 풀에서 사용할 수 있습니다. 비공개 풀을 만들고 VPC 네트워크와 피어링합니다.

     gcloud builds worker-pools create jfrog-pool --region us-central1 \
     --peered-network=projects/${PROJECT_ID}/global/networks/default
    
  2. 새 비공개 풀에서 빌드를 실행하려면 gcloud 명령어를 사용하여 --worker-pool 플래그를 전달하거나 cloudbuild.yaml 구성을 업데이트하여 항상 비공개 풀을 사용하도록 할 수 있습니다. 이 튜토리얼에서는 다음 옵션을 추가하여 cloudbuild.yaml을 업데이트합니다.

    options:
      pool:
        name: 'projects/${PROJECT_ID}/locations/us-central1/workerPools/jfrog-pool'
  3. 전체 파일은 다음과 같습니다.

    steps:
      - id: Get Private Artifactory Address
        name: gcr.io/cloud-builders/gcloud
        entrypoint: /bin/bash
        args: 
          - -c
          - |
            gcloud compute instances describe jfrog \
            --zone us-central1-a \
            --format="value(networkInterfaces.networkIP)" >> _INTERNAL_IP_ADDRESS
    
      - id: Pull from Private Artifactory
        name: gcr.io/cloud-builders/curl
        entrypoint: /bin/bash
        args:
          - -c
          - |
            curl -u admin:password --connect-timeout 10.00 \
            http://$(cat _INTERNAL_IP_ADDRESS):8081/artifactory/example-repo-local/helloworld.txt
    
    options:
      pool:
        name: 'projects/${PROJECT_ID}/locations/us-central1/workerPools/jfrog-pool'
  4. 빌드 시작:

     gcloud builds submit --no-source
    
  5. 빌드는 VPC 네트워크와 피어링된 새 비공개 풀을 사용하여 Artifactory의 내부 IP 주소에 액세스할 수 있습니다. 출력이 성공하고 Step #1가 'Hello world'를 출력해야 합니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하려면 다음 안내를 따르세요.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

튜토리얼 리소스 삭제

  1. 이 튜토리얼에서 배포된 Compute Engine 서비스를 삭제합니다.

     gcloud compute instances delete jfrog
    
  2. 방화벽 규칙을 삭제합니다.

     gcloud compute firewall-rules delete allow-private-pools --network=default
    
  3. 예약된 범위를 삭제합니다.

     gcloud compute addresses delete jfrog-ranges --global
    
  4. Cloud Build 비공개 풀을 삭제합니다.

     gcloud builds worker-pools delete jfrog-pool
    

다음 단계