시작 스크립트 실행


Compute Engine을 사용하면 가상 머신(VM) 인스턴스에서 자체 시작 스크립트를 만들고 실행하여 인스턴스가 부팅될 때마다 자동화된 작업을 수행할 수 있습니다. 시작 스크립트로 소프트웨어 설치, 업데이트 수행, 서비스 사용 설정, 스크립트에 정의된 그 밖의 작업이 가능합니다.

다음은 Apache 서버를 설치하고 시작하는 시작 스크립트의 예시입니다.

#! /bin/bash
apt update
apt -y install apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello World</h1>
<p>This page was created from a startup script.</p>
</body></html>
EOF

시작 스크립트를 지정하려면 메타데이터 서버에 시작 스크립트 메타데이터 키를 사용합니다. Google Cloud Console, gcloud 명령줄 도구 또는 Compute Engine API를 사용하여 시작 스크립트를 제공할 수 있습니다.

시작하기 전에

이 작업에 필요한 권한

이 작업을 수행하려면 다음과 같은 권한이 있어야 합니다.

시작 스크립트 실행

네트워크를 사용할 수 있게 되면 인스턴스는 항상 시작 스크립트를 루트로 실행합니다.

시작 스크립트에는 파일 형식의 제한이 없습니다. 시작 스크립트가 있는 경우 Compute Engine은 다음을 수행합니다.

  1. 시작 스크립트를 인스턴스의 로컬 파일에 복사합니다.
  2. 파일에 실행 권한을 설정합니다.
  3. 파일을 실행합니다.

예를 들어 bash 스크립트 대신 Python 스크립트를 제공할 수 있습니다. Compute Engine에서는 스크립트 유형에 상관없이 스크립트를 그대로 실행합니다.

bash가 아닌 스크립트를 실행하려면 파일 맨 위에 shebang(#!으로 시작하는 줄)을 추가합니다. 이렇게 하면 사용할 인터프리터를 운영체제가 알 수 있습니다. 예를 들어 Python 스크립트를 사용하는 경우 다음 shebang 줄을 추가할 수 있습니다.

#! /usr/bin/python

로컬 시작 스크립트 사용

로컬 시작 스크립트는 로컬 컴퓨터에 있는 스크립트입니다. 로컬 시작 스크립트를 사용하려면 로컬 시작 스크립트 파일을 인스턴스에 전달하거나 시작 스크립트의 콘텐츠를 메타데이터 서버에 직접 제공하세요. 다음 하위 섹션의 예시는 로컬 파일에서 또는 직접 입력을 통해 시작 스크립트 메타데이터를 추가하는 방법을 보여줍니다.

로컬 시작 스크립트의 메타데이터 값 길이에는 256KB의 제한이 적용됩니다. 이 제한을 초과하는 시작 스크립트는 로컬로 로드할 수 없습니다. 대신 인스턴스를 생성하는 동안 Cloud Storage에 파일을 저장하고 스크립트 URL을 지정합니다. 자세한 내용은 Cloud Storage에 저장된 시작 스크립트 제공을 참조하세요.

시작 스크립트 파일 제공

로컬 시작 스크립트 파일은 gcloud 명령줄 도구를 사용해서만 전달할 수 있습니다. --metadata-from-file 플래그 다음에 메타데이터 키 쌍인 startup-script=PATH_TO_FILE을 포함하고 PATH_TO_FILE을 시작 스크립트의 상대 경로로 바꿉니다.

gcloud compute instances create example-instance \
  --metadata-from-file startup-script=examples/scripts/install.sh

시작 스크립트 콘텐츠의 직접 제공

또는 Google Cloud Console, gcloud 명령줄 도구 또는 Compute Engine API를 사용하여 시작 스크립트의 콘텐츠를 직접 입력하거나 붙여넣을 수 있습니다.

Console

Cloud Console의 시작 스크립트 섹션에서 직접 시작 스크립트를 지정합니다.

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

    VM 인스턴스로 이동

  2. 인스턴스 만들기를 클릭합니다.
  3. 새 인스턴스 만들기 페이지에서 인스턴스의 속성을 입력합니다. 고급 구성 옵션은 관리, 보안, 디스크, 네트워킹, 단독 테넌시 섹션을 참조하세요.
  4. 자동화 섹션의 시작 스크립트에서 시작 스크립트의 콘텐츠를 제공합니다.

    Cloud Console에서 시작 스크립트 설정

  5. 만들기를 클릭하여 인스턴스를 만듭니다.

gcloud

gcloud 명령줄 도구에서 --metadata 플래그를 사용하여 startup-script=contents 키-값 쌍으로 시작 스크립트의 콘텐츠를 제공하고 contents를 시작 스크립트의 콘텐츠로 바꿉니다.

예를 들어 다음 명령어는 시작할 때 일부 시스템 업데이트를 수행하고, Apache를 설치하고, 단일 웹페이지를 시작하는 인스턴스를 만듭니다. 이 명령어를 실행한 다음 인스턴스의 외부 IP 주소를 방문하여 index.html 페이지의 콘텐츠를 볼 수 있습니다.

Linux 데스크톱에서는 다음과 같은 명령어를 실행합니다.

gcloud compute instances create example-instance --tags http-server \
  --metadata startup-script='#! /bin/bash
# Installs apache and a custom homepage
  sudo su -
  apt update
  apt -y install apache2
  cat <<EOF > /var/www/html/index.html
  <html><body><h1>Hello World</h1>
  <p>This page was created from a start up script.</p>
  </body></html>
  EOF'

Windows 데스크톱인 경우 cmd 터미널에서 이 명령어를 실행하면 됩니다.

gcloud compute instances create example-instance --tags http-server \
  --metadata startup-script="
  apt update;
  apt -y install apache2;
  echo \"This page was created from a start up script.\" ^> /var/www/html/index.html"

마찬가지로 PowerShell을 사용하는 경우 파싱 중지 특수문자(--%)를 사용하여 정확한 명령어를 gcloud 도구에 전달하는 방법으로 이 명령어를 실행할 수 있습니다.

gcloud --% compute instances create example-instance --tags http-server \
  --metadata startup-script="
  apt update;
  apt -y install apache2;
  echo \"This page was created from a start up script.\" ^> /var/www/html/index.html"

API

메타데이터 키로 startup-script를 사용하여 API에서 요청에 메타데이터 속성의 일부로 시작 스크립트를 제공합니다.

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances

{
  ...
  "metadata": {
    "items": [
      {
       "key": "startup-script",
       "value": "#! /bin/bash\n\n# Installs apache and a custom homepage\napt update\napt -y install apache2\ncat <<EOF > /var/www/html/index.html\n<html><body><h1>Hello World</h1>\n<p>This page was created from a start up script.</p>\n</body></html>"
      }
    ]
  }
  ...
}

Windows 인스턴스의 시작 스크립트 제공

고유한 Windows 전용 메타데이터 키를 사용하면 Windows 인스턴스에서 시작 스크립트를 실행할 수 있습니다. 다음 표에 나열된 특수 메타데이터 키 중에서 선택하세요. 각 메타데이터 키는 실행하려는 스크립트 유형과 일치해야 합니다. 인스턴스에 서로 다른 메타데이터 키를 전달하여 여러 스크립트를 지정할 수도 있습니다. 각 메타데이터 키는 VM 인스턴스마다 한 번만 지정할 수 있습니다.

VM 인스턴스가 시작된 후 VM 인스턴스에서 시작 스크립트를 수동으로 실행해야 하는 경우 관리자는 다음 명령어를 사용하면 됩니다.

C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd

다음 표는 지원되는 시작 스크립트 유형, 실행 시기, 스크립트 지정에 사용할 메타데이터 키를 보여줍니다. 메타데이터 키 사용 방법에 대한 자세한 내용은 로컬 시작 스크립트 사용을 참조하세요. 이 스크립트는 GCESysprep 명령어를 사용하여 이미지를 준비하는 경우에만 실행됩니다.

스크립트 유형 실행:
  • GCESysprep2
  • 부팅하기 전에
실행:
  • GCESysprep2 완료 후
  • 후속 부팅 때마다
url 시작 스크립트 메타데이터 키:
sysprep-specialize-script-url
메타데이터 키:
windows-startup-script-url
cmd 시작 스크립트 메타데이터 키:
sysprep-specialize-script-cmd
메타데이터 키:
windows-startup-script-cmd
bat 시작 스크립트 메타데이터 키:
sysprep-specialize-script-bat
메타데이터 키:
windows-startup-script-bat
ps11 시작 스크립트 메타데이터 키:
sysprep-specialize-script-ps1
메타데이터 키:
windows-startup-script-ps1

Cloud Storage에 저장된 시작 스크립트 제공

Cloud Storage에 스크립트를 저장하고 인스턴스를 만들 때 스크립트에 URL을 제공할 수 있습니다. 그러면 어디서나 시작 스크립트에 액세스할 수 있고 메타데이터 서버 제한도 우회할 수 있습니다.

스크립트에 대한 액세스 권한 설정

Cloud Storage의 시작 스크립트를 사용하려면 스크립트에 액세스할 권한이 있어야 합니다. 버킷 및 파일의 액세스 제어 설정에서 권한이 있는지 확인하세요.

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

시작 스크립트 제공

  1. 버킷을 만듭니다. 버킷을 만들거나 기존 버킷을 사용할 수 있습니다. 버킷 만들기에 대한 자세한 내용은 Google Cloud Console에서 버킷 만들기 또는 gsutil에서 버킷 만들기를 참조하세요.
  2. 파일을 버킷에 업로드합니다. 안내에 따라 gsutil 또는 Cloud Console을 사용하여 객체를 업로드합니다.
  3. 인스턴스를 만들 때 시작 스크립트 파일의 URL을 제공합니다.

    Console

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

      VM 인스턴스 페이지로 이동

    2. 인스턴스 만들기를 클릭합니다.

    3. 새 인스턴스 만들기 페이지에서 인스턴스의 속성을 입력합니다.

    4. ID 및 API 액세스 섹션에서 Cloud Storage의 시작 스크립트 파일을 읽을 액세스 권한이 있는 서비스 계정을 선택합니다. 예를 들어 서비스 계정에는 스토리지 객체 뷰어 역할의 권한이 있어야 합니다.

    5. 관리, 보안, 디스크, 네트워킹, 단독 테넌시 섹션을 펼칩니다.

    6. 메타데이터 섹션에서 startup-script-url을 메타데이터 키로 제공합니다.

    7. 상자에 시작 스크립트 파일의 URL을 gs://BUCKET/FILE 또는 https://storage.googleapis.com/BUCKET/FILE 형식으로 제공합니다.

    8. 만들기를 클릭하여 인스턴스를 만듭니다.

    gcloud

    gcloud 명령줄 도구로 --scopes--metadata 플래그를 사용해 인스턴스를 만들고 startup-script-url 키를 지정합니다. --scopes 플래그는 Cloud Storage에 액세스하여 시작 스크립트를 다운로드할 수 있는 액세스 권한을 VM에 제공합니다. gs://BUCKET/FILE 또는 https://storage.googleapis.com/BUCKET/FILE 형식으로 스크립트에 Cloud Storage URL을 제공할 수 있습니다.

    gcloud compute instances create example-instance --scopes storage-ro \
      --metadata startup-script-url=gs://BUCKET/FILE.sh
    

    API

    메타데이터 키로 startup-script-url를 사용하여 API에서 요청에 메타데이터 속성의 일부로 시작 스크립트를 제공합니다. 또한 VM이 시작 스크립트 파일에 액세스할 수 있도록 Cloud Storage 범위가 포함된 scopes 목록을 제공합니다.

    POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
    
    {
      ...
      "serviceAccounts": [
        {
          "email": "default",
          "scopes": [
            "https://www.googleapis.com/auth/devstorage.read_only"
          ]
        }
      ],
      "metadata": {
        "items": [
          {
           "key": "startup-script-url",
           "value": "gs://BUCKET/FILE"
          }
        ]
      },
      "tags": {
        "items": []
      },
      "machineType": "zones/us-central1-a/machineTypes/e2-medium",
      "name": "example-instance"
    }
    

    Windows

    gcloud 명령줄 도구에서 --scopes--metadata 플래그를 사용하여 인스턴스를 만들고 windows-startup-script-url 키를 지정합니다. --scopes 플래그는 Cloud Storage에 액세스하여 시작 스크립트를 다운로드할 수 있는 액세스 권한을 VM에 제공합니다. gs://BUCKET/FILE 또는 https://storage.googleapis.com/BUCKET/FILE 형식으로 스크립트에 Cloud Storage URL을 제공할 수 있습니다.

    gcloud compute instances create example-windows-instance --scopes storage-ro \
      --metadata windows-startup-script-url=gs://BUCKET/FILE.ps1
    

실행 중인 인스턴스에 시작 스크립트 적용

실행 중인 인스턴스가 있는 경우 해당 인스턴스에 시작 스크립트를 추가한 후 인스턴스를 다시 시작하면 시작 스크립트가 실행됩니다. 시작 스크립트는 이후의 모든 재부팅에서도 실행됩니다.

다음 안내에 따라 실행 중인 인스턴스에 시작 스크립트를 설정합니다.

Console

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

    VM 인스턴스 페이지로 이동

  2. 시작 스크립트를 추가할 인스턴스를 클릭합니다.

  3. 인스턴스 세부정보 페이지에서 다음 단계를 완료합니다.

    1. 수정 버튼을 클릭합니다.
    2. 커스텀 메타데이터에서 항목 추가를 클릭합니다.
    3. 다음 키 중 하나를 사용해 시작 스크립트를 추가합니다.

      • startup-script: 이 키를 사용하여 시작 스크립트 콘텐츠를 직접 제공합니다.
      • startup-script-url: 이 키를 사용하여 시작 스크립트 파일에 Cloud Storage URL을 제공합니다.

gcloud

gcloud 명령줄 도구에서 instances add-metadata 명령어를 사용하여 인스턴스에 메타데이터를 추가합니다. 사용 가능한 시작 스크립트 키 중 하나를 사용합니다.

  • --metadata startup-script=CONTENTS: 이 키를 사용하여 시작 스크립트 콘텐츠를 직접 제공합니다.
  • --metadata startup-script-url=URL: 이 키를 사용하여 시작 스크립트 파일에 Cloud Storage URL을 제공합니다.
  • --metadata-from-file startup-script=FILE: 로컬에 저장된 시작 스크립트 파일을 제공합니다.

예를 들면 다음과 같습니다.

gcloud compute instances add-metadata EXAMPLE_INSTANCE \
  --metadata-from-file startup-script=PATH_TO_FILE
gcloud compute instances add-metadata EXAMPLE_INSTANCE \
  --metadata startup-script-url=gs://BUCKET/FILE

API

API에서 instances().setMetadata 메서드로 요청을 전송해 새로운 메타데이터와 fingerprint 값을 제공합니다.

디지털 지문은 낙관적 잠금을 수행하는 데 사용되는 임의의 문자열로서 Compute Engine에서 생성됩니다. 요청을 수행하기 위해서는 일치하는 디지털 지문 값을 제공해야 합니다. 디지털 지문은 요청 시마다 변경되며 일치하지 않는 디지털 지문이 제공되면 요청이 거부됩니다. 이러한 방식으로 한 번에 업데이트 하나만 실행할 수 있어 충돌이 방지됩니다.

인스턴스의 현재 디지털 지문을 가져오려면 instances().get 요청을 수행합니다.

GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance

디지털 지문 값을 복사합니다.

{

 ...
 "name": "example-instance",
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "zhma6O1w2l8="
 },
 "...
}

그러고 나서 다음 메타데이터 키 중 하나와 디지털 지문 값을 사용해 instances().setMetadata 메서드에 요청을 전송합니다.

  • startup-script: 이 키를 사용하여 시작 스크립트 콘텐츠를 직접 제공합니다.
  • startup-script-url: 이 키를 사용하여 시작 스크립트 파일에 Cloud Storage URL을 제공합니다.

예를 들면 다음과 같습니다.

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances/example-instance/setMetadata

    {
     "fingerprint": "zhma6O1w2l8=",
     "items": [
      {
       "key": "startup-script-url",
       "value": "gs://BUCKET/FILE"
      }
     ]
    }

시작 스크립트 재실행

VM 인스턴스에 연결하고 다음 명령어 중 하나를 실행하여 시작 스크립트를 VM 인스턴스에서 다시 실행할 수 있습니다.

Debian, CentOS, RHEL 이미지

sudo google_metadata_script_runner startup

GCEMetadataScripts: Starting startup scripts (version YYMMDD.NN).
GCEMetadataScripts: Found startup-script in metadata.
GCEMetadataScripts: startup-script exit status 0
GCEMetadataScripts: Finished running startup scripts.

Container-Optimized OS, Ubuntu, SLES 이미지

sudo google_metadata_script_runner --script-type startup --debug

시작 스크립트 로그 보기

시작 스크립트 출력은 다음 로그 파일에 기록됩니다.

  • CentOS 및 RHEL: /var/log/messages
  • Debian: /var/log/daemon.log
  • Ubuntu: /var/log/syslog
  • SLES: /var/log/messages

journalctl 명령어를 사용하여 시작 스크립트 출력을 볼 수도 있습니다.

sudo journalctl -u google-startup-scripts.service

시작 스크립트의 커스텀 값 설정

여러 인스턴스에서 시작 스크립트를 실행하는 경우 시작 스크립트에 커스텀 값을 사용해야 하는 상황이 있을 수 있습니다. 예를 들어 서로 다른 인스턴스에서 시작 스크립트를 실행하고 각 인스턴스가 커스텀 메시지를 인쇄하도록 해야 하는 경우가 있습니다.

커스텀 값을 인스턴스 생성 시간에 커스텀 메타데이터 키-값 쌍으로 지정하고 시작 스크립트에서 참조할 수 있습니다. 커스텀 메타데이터 키 만들기에 대한 자세한 내용은 커스텀 메타데이터 설정을 참조하세요.

커스텀 메타데이터 키 쌍을 설정하고 나면 시작 스크립트를 수정해 새 메타데이터를 쿼리할 수 있습니다. 예를 들어 위의 동일 스크립트를 다음과 같이 수정할 수 있습니다.

#! /bin/bash
VALUE_OF_FOO=$(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><h1>Hello World</h1>
<p>The value of foo: $VALUE_OF_FOO</p>
</body></html>
EOF

다음 단계