Linux VM에서 시작 스크립트 사용


시작 스크립트는 가상 머신(VM) 인스턴스의 시작 프로세스 동안 태스크를 수행하는 파일입니다. 시작 스크립트는 프로젝트의 모든 VM 또는 단일 VM에 적용될 수 있습니다. VM 수준의 메타데이터로 지정된 시작 스크립트는 프로젝트 수준의 메타데이터로 지정된 시작 스크립트를 재정의하며, 네트워크를 사용할 수 있을 때만 시작 스크립트가 실행됩니다. 이 문서에서는 Linux VM 인스턴스에서 시작 스크립트를 사용하는 방법에 대해 설명합니다. 프로젝트 수준의 시작 스크립트를 추가하는 방법은 gcloud compute project-info add-metadata를 참조하세요.

Linux 시작 스크립트의 경우 bash 또는 비bash 파일을 사용할 수 있습니다. 비bash 파일을 사용하려면 파일 상단에 #!를 추가하여 인터프리터를 지정합니다. 예를 들어 Python 3 시작 스크립트를 사용하려면 파일 상단에 #! /usr/bin/python3를 추가합니다.

이 문서의 절차 중 하나에 따라 시작 스크립트를 지정하면 Compute Engine이 다음을 수행합니다.

  1. 시작 스크립트를 VM에 복사

  2. 시작 스크립트에 대한 실행 권한 설정

  3. VM이 부팅될 때 시작 스크립트를 root 사용자로 실행

시작 스크립트와 관련된 여러 태스크 및 이러한 각 태스크를 수행해야 하는 경우에 대한 자세한 내용은 개요를 참조하세요.

시작하기 전에

  • 시작 스크립트 개요에 대해 알아보기
  • 메타데이터 서버에 대해 알아보기
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공하는 사용자 인증 정보를 사용합니다.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      자세한 내용은 Google Cloud 인증 문서의 REST 사용 인증을 참조하세요.

Linux 시작 스크립트의 메타데이터 키

시작 스크립트는 메타데이터 키로 지정된 위치에서 VM에 전달됩니다. 메타데이터 키는 시작 스크립트가 로컬로 저장되는지, Cloud Storage에 저장되는지, VM에 직접 전달되는지를 지정합니다. 사용하는 메타데이터 키는 시작 스크립트의 크기에 따라 달라질 수 있습니다.

다음 표에서는 Linux 시작 스크립트에 사용할 수 있는 메타데이터 키를 보여주고, 시작 스크립트의 스토리지 위치 및 크기를 기준으로 사용할 키에 대한 정보를 제공합니다.

메타데이터 키 용도
startup-script 로컬에 저장되거나 직접 추가된 최대 256KB의 bash 또는 비 bash 시작 스크립트 전달
startup-script-url Cloud Storage에 저장되고 크기가 256KB를 초과하는 bash 또는 비 bash 시작 스크립트 전달. 여기에 입력하는 문자열은 gcloud storage을 실행하는 데 사용됩니다. startup-script-url에 공백 문자가 포함되어 있는 경우 공백을 %20로 바꾸거나 startup-script-url 문자열에 큰따옴표("")를 추가하지 마세요.

Linux 시작 스크립트 실행 순서

여러 시작 스크립트를 사용할 수 있습니다. 로컬로 저장된 또는 직접 추가된 시작 스크립트는 Cloud Storage에 저장된 시작 스크립트 전에 실행됩니다. 다음 표에서는 메타데이터 키를 기준으로 Linux 시작 스크립트의 실행 순서를 보여줍니다.

메타데이터 키 실행 순서
startup-script 초기 부팅 후 부팅할 때마다 첫 번째
startup-script-url 초기 부팅 후 부팅할 때마다 두 번째

Linux 시작 스크립트 직접 전달

VM을 만들 때 시작 스크립트의 콘텐츠를 VM에 직접 추가할 수 있습니다. 다음 절차에서는 Apache를 설치하고 기본 웹페이지를 만드는 시작 스크립트로 VM을 만드는 방법을 보여줍니다.

콘솔

Linux 시작 스크립트를 새 VM에 직접 전달

  1. Google Cloud 콘솔에서 인스턴스 만들기 페이지로 이동합니다.

    인스턴스 만들기로 이동

  2. 부팅 디스크에서 변경을 선택하고 Linux 운영체제를 선택합니다.

  3. 고급 옵션 섹션을 펼친 후 다음을 수행합니다.

    1. 관리 섹션을 펼칩니다.
    2. 자동화 섹션에서 다음 시작 스크립트를 추가합니다.

       #! /bin/bash
       apt update
       apt -y install apache2
       cat <<EOF > /var/www/html/index.html
       <html><body><p>Linux startup script added directly.</p></body></html>
       EOF
      
  4. 만들기를 클릭합니다.

Linux 시작 스크립트를 기존 VM에 직접 전달

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. VM의 이름을 클릭합니다.

  3. 수정을 클릭합니다.

  4. 자동화에서 시작 스크립트의 콘텐츠를 추가합니다.

시작 스크립트 확인

VM이 시작되면 웹 브라우저에서 외부 IP를 확인하여 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

gcloud

Linux 시작 스크립트를 새 VM에 직접 전달

다음 gcloud compute instances create 명령어를 실행하여 VM을 만들 때 시작 스크립트 콘텐츠를 VM에 직접 전달합니다.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata=startup-script='#! /bin/bash
  apt update
  apt -y install apache2
  cat <<EOF > /var/www/html/index.html
  <html><body><p>Linux startup script added directly.</p></body></html>
  EOF'

VM_NAME을 VM의 이름으로 바꿉니다.

Linux 시작 스크립트를 기존 VM에 직접 전달

다음 gcloud compute instances add-metadata 명령어를 사용하여 시작 스크립트를 기존 VM에 직접 추가합니다.

gcloud compute instances add-metadata VM_NAME \
    --zone=ZONE \
    --metadata=startup-script='#! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script added directly.</p></body></html>
    EOF'

다음을 바꿉니다.

  • VM_NAME: VM의 이름

  • ZONE: VM의 영역

시작 스크립트 확인

VM이 시작되면 웹 브라우저에서 외부 IP를 확인하여 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

REST

Linux 시작 스크립트를 새 VM에 직접 전달

다음 instances.insert 메서드를 실행하여 VM을 만들 때 시작 스크립트 콘텐츠를 VM에 직접 전달합니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF"
      }
    ]
  },
  ...
}

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID

  • ZONE: VM을 만들 영역

Linux 시작 스크립트를 기존 VM에 직접 전달

  1. instances.get 메서드를 사용하여 VM의 tags.fingerprint 값을 가져옵니다.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID

    • ZONE: VM의 영역

    • VM_NAME: VM의 영역

  2. instances.setMetadata 메서드 호출에 fingerprint 값을 사용하여 시작 스크립트의 메타데이터 키와 값과 함께 시작 스크립트를 전달합니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
          "key": "startup-script",
          "value": "#! /bin/bash\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><p>Linux startup script added directly.</p></body></html>\nEOF"
        }
      ],
      ...
    }
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID

    • ZONE: VM의 영역

    • VM_NAME: VM의 영역

    • FINGERPRINT: instances.get 메서드를 사용하여 가져온 tags.fingerprint 값입니다.

시작 스크립트 확인

VM이 시작되면 웹 브라우저에서 외부 IP를 확인하여 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

로컬 파일에서 Linux 시작 스크립트 전달

시작 스크립트를 워크스테이션의 로컬 파일에 저장하고 로컬 파일을 만들 때 VM에 로컬 파일을 메타데이터로 전달할 수 있습니다. VM에 저장된 파일을 시작 스크립트로 사용할 수 없습니다.

로컬 파일에서 VM으로 VM 시작 스크립트를 전달하려면 먼저 다음을 수행합니다.

  1. 시작 스크립트를 저장할 로컬 파일을 만듭니다.

  2. gcloud CLI에서 시작 스크립트까지의 상대 경로를 확인합니다.

  3. 다음 시작 스크립트를 파일에 추가합니다.

    #! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script from a local file.</p></body></html>
    EOF
    

gcloud

로컬 파일에서 새 VM으로 Linux 시작 스크립트 전달

--metadata-from-file 플래그와 함께 gcloud compute instances create 명령어를 사용하여 VM을 만들고 시작 스크립트로 사용할 로컬 파일의 콘텐츠를 전달합니다.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata-from-file=startup-script=FILE_PATH

다음을 바꿉니다.

  • VM_NAME: VM의 이름

  • FILE_PATH: 시작 스크립트 파일의 상대 경로

Linux 시작 스크립트를 로컬 파일에서 기존 VM으로 전달

다음 gcloud compute instances add-metadata 명령어를 사용하여 시작 스크립트를 로컬 파일에서 기존 VM에 전달합니다.

gcloud compute instances add-metadata VM_NAME \
  --zone=ZONE \
  --metadata-from-file startup-script=FILE_PATH

다음을 바꿉니다.

  • VM_NAME: VM의 이름

  • ZONE: VM의 영역

  • FILE_PATH: 시작 스크립트 파일의 상대 경로

시작 스크립트 확인

웹브라우저에서 외부 IP를 보고 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

Cloud Storage에서 Linux 시작 스크립트 전달

시작 스크립트를 Cloud Storage에 저장하고 VM을 만들 때 이를 VM에 전달할 수 있습니다. Cloud Storage에 시작 스크립트를 추가하면 VM을 만들 때 시작 스크립트를 참조하는 데 사용할 수 있는 URL이 있습니다.

Cloud Storage 버킷에서 시작 스크립트를 추가하려면 먼저 다음을 수행합니다.

  1. 시작 스크립트를 저장할 파일을 만듭니다. 이 예시에서는 bash(.sh) 파일이 사용됩니다.

  2. 다음을 bash 파일에 추가합니다. 그러면 Apache가 설치되고 간단한 웹페이지가 생성됩니다.

    #! /bin/bash
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Linux startup script from Cloud Storage.</p></body></html>
    EOF
    
  3. Cloud Storage 버킷 생성

  4. Cloud Storage 버킷에 파일을 추가합니다.

보안에 미치는 영향

  • 기본적으로 이를 허용하지 않는 명시적인 액세스 제어가 없는 한, 프로젝트 소유자와 프로젝트 편집자는 동일한 프로젝트의 Cloud Storage 파일에 액세스할 수 있습니다.

  • Cloud Storage 버킷 또는 객체가 메타데이터보다 안전하지 않은 경우 시작 스크립트가 수정되고 VM이 재부팅되면 권한 에스컬레이션이 발생할 위험이 있습니다. VM이 재부팅되면 시작 스크립트가 root로 실행된 다음 연결된 서비스 계정의 권한을 사용하여 다른 리소스에 액세스할 수 있기 때문입니다.

제한사항

콘솔

Cloud Storage에 저장된 시작 스크립트를 새 VM에 전달

  1. Google Cloud 콘솔에서 인스턴스 만들기 페이지로 이동합니다.

    인스턴스 만들기로 이동

  2. VM 세부정보를 지정합니다.

  3. 부팅 디스크에서 변경을 선택하고 Linux 운영체제를 선택합니다.

  4. ID 및 API 액세스 섹션에서 스토리지 객체 뷰어 역할(roles/storage.objectViewer)이 있는 서비스 계정을 선택합니다.

  5. 고급 옵션 섹션을 펼친 후 다음을 수행합니다.

    1. 관리 섹션을 펼칩니다.
    2. 메타데이터 섹션에서 다음 값을 추가합니다.

      • : 메타데이터 키입니다. startup-script-url로 설정하여 Cloud Storage의 시작 스크립트를 추가합니다.

      • : 메타데이터 값. 다음 형식 중 하나를 사용하여 시작 스크립트 파일의 Cloud Storage 위치로 설정합니다.

        • 인증된 URL: https://storage.googleapis.com/BUCKET/FILE
        • gcloud 스토리지 URI: gs://BUCKET/FILE

        다음을 바꿉니다.

        • BUCKET: 시작 스크립트 파일이 포함된 버킷의 이름
        • FILE: 시작 스크립트 파일 이름
  6. VM을 만들려면 만들기를 클릭합니다.

Cloud Storage에 저장된 시작 스크립트를 기존 VM에 전달

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. VM의 이름을 클릭합니다.

  3. 수정을 클릭합니다.

  4. 메타데이터에 다음 값을 추가합니다.

    • : startup-script-url

    • : 다음 형식 중 하나를 사용하는 시작 스크립트 파일의 Cloud Storage 위치입니다.

      • 인증된 URL: https://storage.googleapis.com/BUCKET/FILE
      • gcloud 스토리지 URI: gs://BUCKET/FILE

시작 스크립트 확인

웹브라우저에서 외부 IP를 보고 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

gcloud

Cloud Storage에 저장된 시작 스크립트를 새 VM에 전달

다음 gcloud compute instances create 명령어를 실행하여 VM을 만들 때 Cloud Storage에 저장된 시작 스크립트를 VM에 전달합니다. --scope 플래그 값에 대해 VM이 Cloud Storage에 액세스할 수 있도록 storage-ro를 사용합니다.

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --scopes=storage-ro \
  --metadata=startup-script-url=CLOUD_STORAGE_URL

다음을 바꿉니다.

  • VM_NAME: VM의 이름

  • CLOUD_STORAGE_URL: 메타데이터 값 다음 형식 중 하나를 사용하여 시작 스크립트 파일의 Cloud Storage 위치로 설정합니다.

    • 인증된 URL: https://storage.googleapis.com/BUCKET/FILE
    • gcloud 스토리지 URI: gs://BUCKET/FILE

Cloud Storage에 저장된 시작 스크립트를 기존 VM에 전달

다음 gcloud compute instances add-metadata 명령어를 사용하여 Cloud Storage에 저장된 시작 스크립트를 기존 VM에 전달합니다.

gcloud compute instances add-metadata VM_NAME \
    --zone=ZONE \
    --metadata startup-script-url=CLOUD_STORAGE_URL

다음을 바꿉니다.

  • VM_NAME: VM의 이름

  • ZONE: VM의 영역

  • CLOUD_STORAGE_URL: 메타데이터 값 다음 형식 중 하나를 사용하여 시작 스크립트 파일의 Cloud Storage 위치로 설정합니다.

    • 인증된 URL: https://storage.googleapis.com/BUCKET/FILE
    • gcloud 스토리지 URI: gs://BUCKET/FILE

시작 스크립트 확인

웹브라우저에서 외부 IP를 보고 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

REST

Cloud Storage에 저장된 시작 스크립트를 새 VM에 전달

다음 instances.insert 메서드를 사용하여 VM을 만들 때 Cloud Storage에 저장된 시작 스크립트를 VM에 전달합니다. VM이 Cloud Storage에 액세스할 수 있도록 scopes 필드에 https://www.googleapis.com/auth/devstorage.read_only를 추가합니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "serviceAccounts": [
    {
      "email": "default",
      "scopes": [
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "startup-script-url",
        "value": "CLOUD_STORAGE_URL"
      }
    ]
  },
  ...
}

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID

  • ZONE: 새 VM을 만들 영역

  • CLOUD_STORAGE_URL: 메타데이터 값입니다. 다음 형식 중 하나를 사용하여 시작 스크립트 파일의 Cloud Storage 위치로 설정합니다.

    • 인증된 URL: https://storage.googleapis.com/BUCKET/FILE
    • gcloud 스토리지 URI: gs://BUCKET/FILE

Cloud Storage에 저장된 시작 스크립트를 기존 VM에 전달

  1. instances.get 메서드를 사용하여 VM의 tags.fingerprint 값을 가져옵니다.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID

    • ZONE: VM의 영역

    • VM_NAME: VM의 영역

  2. instances.setMetadata 메서드 호출에 fingerprint 값을 사용하여 시작 스크립트의 메타데이터 키와 값과 함께 시작 스크립트를 전달합니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
            "key": "startup-script-url",
            "value": "CLOUD_STORAGE_URL"
        }
      ],
      ...
    }
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID

    • ZONE: VM의 영역

    • VM_NAME: VM의 영역

    • FINGERPRINT: instances.get 메서드를 사용하여 가져온 tags.fingerprint 값입니다.

    • CLOUD_STORAGE_URL: 메타데이터 값 다음 형식 중 하나를 사용하여 시작 스크립트 파일의 Cloud Storage 위치로 설정합니다.

      • 인증된 URL: https://storage.googleapis.com/BUCKET/FILE
      • gcloud 스토리지 URI: gs://BUCKET/FILE

시작 스크립트 확인

웹브라우저에서 외부 IP를 보고 시작 스크립트가 웹사이트를 만들었는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

Linux 시작 스크립트에서 메타데이터에 액세스

시작 스크립트에서 메타데이터 값에 액세스할 수 있습니다. 예를 들어 여러 VM에 대해 동일한 스크립트를 사용하고 각 VM에 서로 다른 메타데이터 값을 전달하여 각 스크립트를 개별적으로 매개변수화할 수 있습니다.

시작 스크립트에서 커스텀 메타데이터 값에 액세스하려면 다음을 수행합니다.

  1. 메타데이터 키의 값을 쿼리하는 시작 스크립트를 만듭니다. 예를 들어 다음 bash 파일(.sh) 시작 스크립트는 foo 메타데이터 키의 값을 쿼리합니다.

    #! /bin/bash
    METADATA_VALUE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo -H "Metadata-Flavor: Google")
    apt update
    apt -y install apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><p>Accessing metadata value of foo: $METADATA_VALUE</p></body></html>
    EOF
    
  2. 다음 gcloud compute instances create 명령어를 사용하여 VM을 만들 때 foo 메타데이터 키의 값을 설정합니다. 이 예시에서는 시작 스크립트가 로컬 파일에서 VM에 전달됩니다.

    gcloud

    gcloud compute instances create VM_NAME \
      --image-project=debian-cloud \
      --image-family=debian-10 \
      --metadata-from-file=startup-script=FILE_PATH \
      --metadata=foo=bar
    

    다음을 바꿉니다.

    • VM_NAME: VM의 이름

    • FILE_PATH: 시작 스크립트 파일의 상대 경로

    메타데이터 키-값 쌍을 지정하는 방법은 커스텀 메타데이터 설정을 참조하세요.

  3. 로컬 워크스테이션에서 웹브라우저의 외부 IP를 보고 시작 스크립트가 foo의 값을 출력하는지 확인합니다. 샘플 시작 스크립트가 완료될 때까지 1분 정도 기다려야 할 수도 있습니다.

Linux 시작 스크립트 재실행

다음을 수행하여 시작 스크립트를 재실행합니다.

  1. VM에 연결합니다.

  2. 다음 명령어를 실행합니다.

    sudo google_metadata_script_runner startup

Linux 시작 스크립트의 출력 보기

다음 중 하나를 수행하여 Linux 시작 스크립트의 출력을 볼 수 있습니다.

다음 단계